From 717891c728d540bd42f512f5ca554a6948fd5fc0 Mon Sep 17 00:00:00 2001 From: wittinobi Date: Mon, 10 Feb 2014 00:36:25 +0100 Subject: [PATCH] add games (thx bazi98) and many other updates and fixes --- Makefile | 24 +- ...rosstool-ng-1.16.0-newconfig-apollo-uclibc | 2 +- ...rosstool-ng-1.19.0-newconfig-apollo-uclibc | 2 +- archive-patches/djmount-0.71.diff | 102 + archive-patches/ushare1.1a.diff | 475 ++ archive-patches/xupnpd_cst.diff | 307 + archive-sources/c64emu/1541d64.cpp | 1020 ++++ archive-sources/c64emu/1541d64.h | 108 + archive-sources/c64emu/1541fs.cpp | 602 ++ archive-sources/c64emu/1541fs.h | 46 + archive-sources/c64emu/1541job.cpp | 448 ++ archive-sources/c64emu/1541job.h | 112 + archive-sources/c64emu/1541t64.cpp | 715 +++ archive-sources/c64emu/1541t64.h | 62 + archive-sources/c64emu/C64.cpp | 665 ++ archive-sources/c64emu/C64.h | 103 + archive-sources/c64emu/C64_x.i | 339 ++ archive-sources/c64emu/CIA.cpp | 556 ++ archive-sources/c64emu/CIA.h | 196 + archive-sources/c64emu/CPU1541.cpp | 772 +++ archive-sources/c64emu/CPU1541.h | 281 + archive-sources/c64emu/CPUC64.cpp | 852 +++ archive-sources/c64emu/CPUC64.h | 217 + archive-sources/c64emu/CPU_common.cpp | 83 + archive-sources/c64emu/CPU_common.h | 76 + archive-sources/c64emu/CPU_emulcycle.i | 1100 ++++ archive-sources/c64emu/CPU_emulline.i | 1398 +++++ archive-sources/c64emu/CmdPipe.cpp | 171 + archive-sources/c64emu/CmdPipe.h | 85 + archive-sources/c64emu/Display.cpp | 71 + archive-sources/c64emu/Display.h | 59 + archive-sources/c64emu/Display_dbox.i | 564 ++ archive-sources/c64emu/Display_x.i | 802 +++ archive-sources/c64emu/FixPoint.i | 415 ++ archive-sources/c64emu/IEC.cpp | 430 ++ archive-sources/c64emu/IEC.h | 146 + archive-sources/c64emu/Invisible.cur | Bin 0 -> 326 bytes archive-sources/c64emu/Prefs.cpp | 418 ++ archive-sources/c64emu/Prefs.h | 108 + archive-sources/c64emu/REU.cpp | 262 + archive-sources/c64emu/REU.h | 39 + archive-sources/c64emu/ROlib.h | 520 ++ archive-sources/c64emu/ROlib.s | 1152 ++++ archive-sources/c64emu/SAM.cpp | 2151 +++++++ archive-sources/c64emu/SAM.h | 15 + archive-sources/c64emu/SID.cpp | 1199 ++++ archive-sources/c64emu/SID.h | 147 + archive-sources/c64emu/SID_linux.i | 134 + archive-sources/c64emu/VIC.cpp | 1852 ++++++ archive-sources/c64emu/VIC.h | 274 + archive-sources/c64emu/Version.h | 15 + archive-sources/c64emu/c64emu.cfg | 9 + archive-sources/c64emu/fbemul.h | 36 + archive-sources/c64emu/joystick.h | 284 + archive-sources/c64emu/keyemul.c | 1028 ++++ archive-sources/c64emu/main.cpp | 88 + archive-sources/c64emu/main.h | 49 + archive-sources/c64emu/main_x.i | 109 + archive-sources/c64emu/ndir.c | 222 + archive-sources/c64emu/ndir.h | 69 + archive-sources/c64emu/readme-kbd | 97 + archive-sources/c64emu/readme-start | 23 + archive-sources/c64emu/sysconfig.h | 150 + archive-sources/c64emu/sysdeps.h | 167 + archive-sources/c64emu/vga.c | 289 + archive-sources/lemm/colors.h | 8 + archive-sources/lemm/double.c | 161 + archive-sources/lemm/lemm.c | 1673 ++++++ archive-sources/lemm/lemmings.cfg | 9 + archive-sources/lemm/pic.c | 296 + archive-sources/lemm/pics.h | 404 ++ archive-sources/lemm/somain.c | 179 + archive-sources/lemm/sound.c | 106 + archive-sources/lemm/sounds.h | 2024 +++++++ archive-sources/lemm/sprite.c | 152 + archive-sources/lemm/sprite.h | 55 + archive-sources/libfx2/draw.c | 2410 ++++++++ archive-sources/libfx2/draw.h | 51 + archive-sources/libfx2/fx2math.h | 6 + archive-sources/libfx2/math.c | 40 + archive-sources/libfx2/pig.c | 238 + archive-sources/libfx2/pig.h | 11 + archive-sources/libfx2/rcinput.c | 239 + archive-sources/libfx2/rcinput.h | 74 + archive-sources/master/board.c | 358 ++ archive-sources/master/board.h | 28 + archive-sources/master/colors.h | 34 + archive-sources/master/master.cfg | 6 + archive-sources/master/plugin.h | 46 + archive-sources/master/somain.c | 148 + archive-sources/mines/board.c | 391 ++ archive-sources/mines/board.h | 10 + archive-sources/mines/colors.h | 11 + archive-sources/mines/mines.cfg | 9 + archive-sources/mines/pics.h | 152 + archive-sources/mines/plugin.h | 46 + archive-sources/mines/somain.c | 117 + archive-sources/pac/colors.h | 7 + archive-sources/pac/level.h | 201 + archive-sources/pac/maze.c | 669 +++ archive-sources/pac/maze.h | 18 + archive-sources/pac/pacman.cfg | 8 + archive-sources/pac/pacman.png | Bin 0 -> 6816 bytes archive-sources/pac/pics.h | 424 ++ archive-sources/pac/somain.c | 157 + archive-sources/snake/colors.h | 8 + archive-sources/snake/pics.h | 29 + archive-sources/snake/snake.c | 288 + archive-sources/snake/snake.cfg | 7 + archive-sources/snake/snake.h | 10 + archive-sources/snake/somain.c | 118 + archive-sources/sokoban/1.xsb | 11 + archive-sources/sokoban/11.xsb | 15 + archive-sources/sokoban/7.xsb | 19 + archive-sources/sokoban/8.xsb | 12 + archive-sources/sokoban/albe-01.xsb | 15 + archive-sources/sokoban/albe-02.xsb | 14 + archive-sources/sokoban/albe-03.xsb | 17 + archive-sources/sokoban/albe-04.xsb | 12 + archive-sources/sokoban/albe-05.xsb | 16 + archive-sources/sokoban/albe-06.xsb | 18 + archive-sources/sokoban/albe-07.xsb | 18 + archive-sources/sokoban/albe-08.xsb | 18 + archive-sources/sokoban/albe-09.xsb | 16 + archive-sources/sokoban/albe-10.xsb | 18 + archive-sources/sokoban/albe-12.xsb | 18 + archive-sources/sokoban/albe-13.xsb | 18 + archive-sources/sokoban/board.c | 849 +++ archive-sources/sokoban/board.h | 12 + archive-sources/sokoban/colors.h | 6 + archive-sources/sokoban/pics.h | 252 + archive-sources/sokoban/soko.cfg | 9 + archive-sources/sokoban/somain.c | 340 ++ archive-sources/sol/colors.h | 16 + archive-sources/sol/pics.h | 188 + archive-sources/sol/sol.cfg | 10 + archive-sources/sol/solboard.c | 535 ++ archive-sources/sol/solboard.h | 9 + archive-sources/sol/somain.c | 156 + archive-sources/solitair/Block.cpp | 72 + archive-sources/solitair/Block.h | 23 + archive-sources/solitair/Buffer.cpp | 34 + archive-sources/solitair/Buffer.h | 21 + archive-sources/solitair/Card.cpp | 374 ++ archive-sources/solitair/Card.h | 53 + archive-sources/solitair/Foundation.cpp | 88 + archive-sources/solitair/Foundation.h | 21 + archive-sources/solitair/Hand.cpp | 70 + archive-sources/solitair/Hand.h | 29 + archive-sources/solitair/Slot.cpp | 256 + archive-sources/solitair/Slot.h | 46 + archive-sources/solitair/Table.cpp | 1319 ++++ archive-sources/solitair/Table.h | 56 + archive-sources/solitair/Tableau.cpp | 171 + archive-sources/solitair/Tableau.h | 23 + archive-sources/solitair/Wastepile.cpp | 76 + archive-sources/solitair/Wastepile.h | 23 + archive-sources/solitair/backbuffer.cpp | 38 + archive-sources/solitair/backbuffer.h | 21 + archive-sources/solitair/colors.h | 14 + archive-sources/solitair/pnm_file.cpp | 224 + archive-sources/solitair/pnm_file.h | 68 + archive-sources/solitair/pnm_res.cpp | 5347 +++++++++++++++++ archive-sources/solitair/rle.cpp | 301 + archive-sources/solitair/solitair.cfg | 9 + archive-sources/solitair/somain.cpp | 78 + archive-sources/sudoku/board.cpp | 773 +++ archive-sources/sudoku/board.h | 127 + archive-sources/sudoku/colors.h | 35 + archive-sources/sudoku/menu.cpp | 214 + archive-sources/sudoku/menu.h | 83 + archive-sources/sudoku/misc.cpp | 44 + archive-sources/sudoku/misc.h | 28 + archive-sources/sudoku/somain.cpp | 198 + archive-sources/sudoku/sudoku.cfg | 7 + archive-sources/sudoku/sudoku.cpp | 725 +++ archive-sources/sudoku/sudoku.h | 109 + archive-sources/tank/board.c | 532 ++ archive-sources/tank/board.h | 7 + archive-sources/tank/colors.h | 15 + archive-sources/tank/pics.h | 92 + archive-sources/tank/somain.c | 115 + archive-sources/tank/tank.cfg | 7 + archive-sources/tetris/board.c | 509 ++ archive-sources/tetris/board.h | 13 + archive-sources/tetris/colors.h | 9 + archive-sources/tetris/pics.h | 107 + archive-sources/tetris/somain.c | 661 ++ archive-sources/tetris/tetris.cfg | 11 + archive-sources/vierg/board.c | 451 ++ archive-sources/vierg/board.h | 8 + archive-sources/vierg/colors.h | 6 + archive-sources/vierg/pics.h | 273 + archive-sources/vierg/somain.c | 198 + archive-sources/vierg/vierg.cfg | 9 + archive-sources/yahtzee/colors.h | 8 + archive-sources/yahtzee/pics.h | 22 + archive-sources/yahtzee/somain.c | 108 + archive-sources/yahtzee/text.h | 94 + archive-sources/yahtzee/yahtzee.c | 758 +++ archive-sources/yahtzee/yahtzee.cfg | 8 + archive-sources/yahtzee/yahtzee.h | 8 + config | 5 + make/applications.mk | 76 + make/archives.mk | 15 + make/libraries.mk | 7 + make/neutrino.mk | 9 +- make/plugins.mk | 160 +- skel-root/etc/init.d/rcS.local | 15 + 209 files changed, 53884 insertions(+), 15 deletions(-) create mode 100644 archive-patches/djmount-0.71.diff create mode 100644 archive-patches/ushare1.1a.diff create mode 100644 archive-patches/xupnpd_cst.diff create mode 100644 archive-sources/c64emu/1541d64.cpp create mode 100644 archive-sources/c64emu/1541d64.h create mode 100644 archive-sources/c64emu/1541fs.cpp create mode 100644 archive-sources/c64emu/1541fs.h create mode 100644 archive-sources/c64emu/1541job.cpp create mode 100644 archive-sources/c64emu/1541job.h create mode 100644 archive-sources/c64emu/1541t64.cpp create mode 100644 archive-sources/c64emu/1541t64.h create mode 100644 archive-sources/c64emu/C64.cpp create mode 100644 archive-sources/c64emu/C64.h create mode 100644 archive-sources/c64emu/C64_x.i create mode 100644 archive-sources/c64emu/CIA.cpp create mode 100644 archive-sources/c64emu/CIA.h create mode 100644 archive-sources/c64emu/CPU1541.cpp create mode 100644 archive-sources/c64emu/CPU1541.h create mode 100644 archive-sources/c64emu/CPUC64.cpp create mode 100644 archive-sources/c64emu/CPUC64.h create mode 100644 archive-sources/c64emu/CPU_common.cpp create mode 100644 archive-sources/c64emu/CPU_common.h create mode 100644 archive-sources/c64emu/CPU_emulcycle.i create mode 100644 archive-sources/c64emu/CPU_emulline.i create mode 100644 archive-sources/c64emu/CmdPipe.cpp create mode 100644 archive-sources/c64emu/CmdPipe.h create mode 100644 archive-sources/c64emu/Display.cpp create mode 100644 archive-sources/c64emu/Display.h create mode 100644 archive-sources/c64emu/Display_dbox.i create mode 100644 archive-sources/c64emu/Display_x.i create mode 100644 archive-sources/c64emu/FixPoint.i create mode 100644 archive-sources/c64emu/IEC.cpp create mode 100644 archive-sources/c64emu/IEC.h create mode 100644 archive-sources/c64emu/Invisible.cur create mode 100644 archive-sources/c64emu/Prefs.cpp create mode 100644 archive-sources/c64emu/Prefs.h create mode 100644 archive-sources/c64emu/REU.cpp create mode 100644 archive-sources/c64emu/REU.h create mode 100644 archive-sources/c64emu/ROlib.h create mode 100644 archive-sources/c64emu/ROlib.s create mode 100644 archive-sources/c64emu/SAM.cpp create mode 100644 archive-sources/c64emu/SAM.h create mode 100644 archive-sources/c64emu/SID.cpp create mode 100644 archive-sources/c64emu/SID.h create mode 100644 archive-sources/c64emu/SID_linux.i create mode 100644 archive-sources/c64emu/VIC.cpp create mode 100644 archive-sources/c64emu/VIC.h create mode 100644 archive-sources/c64emu/Version.h create mode 100644 archive-sources/c64emu/c64emu.cfg create mode 100644 archive-sources/c64emu/fbemul.h create mode 100644 archive-sources/c64emu/joystick.h create mode 100644 archive-sources/c64emu/keyemul.c create mode 100644 archive-sources/c64emu/main.cpp create mode 100644 archive-sources/c64emu/main.h create mode 100644 archive-sources/c64emu/main_x.i create mode 100644 archive-sources/c64emu/ndir.c create mode 100644 archive-sources/c64emu/ndir.h create mode 100644 archive-sources/c64emu/readme-kbd create mode 100644 archive-sources/c64emu/readme-start create mode 100644 archive-sources/c64emu/sysconfig.h create mode 100644 archive-sources/c64emu/sysdeps.h create mode 100644 archive-sources/c64emu/vga.c create mode 100644 archive-sources/lemm/colors.h create mode 100644 archive-sources/lemm/double.c create mode 100644 archive-sources/lemm/lemm.c create mode 100644 archive-sources/lemm/lemmings.cfg create mode 100644 archive-sources/lemm/pic.c create mode 100644 archive-sources/lemm/pics.h create mode 100644 archive-sources/lemm/somain.c create mode 100644 archive-sources/lemm/sound.c create mode 100644 archive-sources/lemm/sounds.h create mode 100644 archive-sources/lemm/sprite.c create mode 100644 archive-sources/lemm/sprite.h create mode 100644 archive-sources/libfx2/draw.c create mode 100644 archive-sources/libfx2/draw.h create mode 100644 archive-sources/libfx2/fx2math.h create mode 100644 archive-sources/libfx2/math.c create mode 100644 archive-sources/libfx2/pig.c create mode 100644 archive-sources/libfx2/pig.h create mode 100644 archive-sources/libfx2/rcinput.c create mode 100644 archive-sources/libfx2/rcinput.h create mode 100644 archive-sources/master/board.c create mode 100644 archive-sources/master/board.h create mode 100644 archive-sources/master/colors.h create mode 100644 archive-sources/master/master.cfg create mode 100644 archive-sources/master/plugin.h create mode 100644 archive-sources/master/somain.c create mode 100644 archive-sources/mines/board.c create mode 100644 archive-sources/mines/board.h create mode 100644 archive-sources/mines/colors.h create mode 100644 archive-sources/mines/mines.cfg create mode 100644 archive-sources/mines/pics.h create mode 100644 archive-sources/mines/plugin.h create mode 100644 archive-sources/mines/somain.c create mode 100644 archive-sources/pac/colors.h create mode 100644 archive-sources/pac/level.h create mode 100644 archive-sources/pac/maze.c create mode 100644 archive-sources/pac/maze.h create mode 100644 archive-sources/pac/pacman.cfg create mode 100644 archive-sources/pac/pacman.png create mode 100644 archive-sources/pac/pics.h create mode 100644 archive-sources/pac/somain.c create mode 100644 archive-sources/snake/colors.h create mode 100644 archive-sources/snake/pics.h create mode 100644 archive-sources/snake/snake.c create mode 100644 archive-sources/snake/snake.cfg create mode 100644 archive-sources/snake/snake.h create mode 100644 archive-sources/snake/somain.c create mode 100644 archive-sources/sokoban/1.xsb create mode 100644 archive-sources/sokoban/11.xsb create mode 100644 archive-sources/sokoban/7.xsb create mode 100644 archive-sources/sokoban/8.xsb create mode 100644 archive-sources/sokoban/albe-01.xsb create mode 100644 archive-sources/sokoban/albe-02.xsb create mode 100644 archive-sources/sokoban/albe-03.xsb create mode 100644 archive-sources/sokoban/albe-04.xsb create mode 100644 archive-sources/sokoban/albe-05.xsb create mode 100644 archive-sources/sokoban/albe-06.xsb create mode 100644 archive-sources/sokoban/albe-07.xsb create mode 100644 archive-sources/sokoban/albe-08.xsb create mode 100644 archive-sources/sokoban/albe-09.xsb create mode 100644 archive-sources/sokoban/albe-10.xsb create mode 100644 archive-sources/sokoban/albe-12.xsb create mode 100644 archive-sources/sokoban/albe-13.xsb create mode 100644 archive-sources/sokoban/board.c create mode 100644 archive-sources/sokoban/board.h create mode 100644 archive-sources/sokoban/colors.h create mode 100644 archive-sources/sokoban/pics.h create mode 100644 archive-sources/sokoban/soko.cfg create mode 100644 archive-sources/sokoban/somain.c create mode 100644 archive-sources/sol/colors.h create mode 100644 archive-sources/sol/pics.h create mode 100644 archive-sources/sol/sol.cfg create mode 100644 archive-sources/sol/solboard.c create mode 100644 archive-sources/sol/solboard.h create mode 100644 archive-sources/sol/somain.c create mode 100644 archive-sources/solitair/Block.cpp create mode 100644 archive-sources/solitair/Block.h create mode 100644 archive-sources/solitair/Buffer.cpp create mode 100644 archive-sources/solitair/Buffer.h create mode 100644 archive-sources/solitair/Card.cpp create mode 100644 archive-sources/solitair/Card.h create mode 100644 archive-sources/solitair/Foundation.cpp create mode 100644 archive-sources/solitair/Foundation.h create mode 100644 archive-sources/solitair/Hand.cpp create mode 100644 archive-sources/solitair/Hand.h create mode 100644 archive-sources/solitair/Slot.cpp create mode 100644 archive-sources/solitair/Slot.h create mode 100644 archive-sources/solitair/Table.cpp create mode 100644 archive-sources/solitair/Table.h create mode 100644 archive-sources/solitair/Tableau.cpp create mode 100644 archive-sources/solitair/Tableau.h create mode 100644 archive-sources/solitair/Wastepile.cpp create mode 100644 archive-sources/solitair/Wastepile.h create mode 100644 archive-sources/solitair/backbuffer.cpp create mode 100644 archive-sources/solitair/backbuffer.h create mode 100644 archive-sources/solitair/colors.h create mode 100644 archive-sources/solitair/pnm_file.cpp create mode 100644 archive-sources/solitair/pnm_file.h create mode 100644 archive-sources/solitair/pnm_res.cpp create mode 100644 archive-sources/solitair/rle.cpp create mode 100644 archive-sources/solitair/solitair.cfg create mode 100644 archive-sources/solitair/somain.cpp create mode 100644 archive-sources/sudoku/board.cpp create mode 100644 archive-sources/sudoku/board.h create mode 100644 archive-sources/sudoku/colors.h create mode 100644 archive-sources/sudoku/menu.cpp create mode 100644 archive-sources/sudoku/menu.h create mode 100644 archive-sources/sudoku/misc.cpp create mode 100644 archive-sources/sudoku/misc.h create mode 100644 archive-sources/sudoku/somain.cpp create mode 100644 archive-sources/sudoku/sudoku.cfg create mode 100644 archive-sources/sudoku/sudoku.cpp create mode 100644 archive-sources/sudoku/sudoku.h create mode 100644 archive-sources/tank/board.c create mode 100644 archive-sources/tank/board.h create mode 100644 archive-sources/tank/colors.h create mode 100644 archive-sources/tank/pics.h create mode 100644 archive-sources/tank/somain.c create mode 100644 archive-sources/tank/tank.cfg create mode 100644 archive-sources/tetris/board.c create mode 100644 archive-sources/tetris/board.h create mode 100644 archive-sources/tetris/colors.h create mode 100644 archive-sources/tetris/pics.h create mode 100644 archive-sources/tetris/somain.c create mode 100644 archive-sources/tetris/tetris.cfg create mode 100644 archive-sources/vierg/board.c create mode 100644 archive-sources/vierg/board.h create mode 100644 archive-sources/vierg/colors.h create mode 100644 archive-sources/vierg/pics.h create mode 100644 archive-sources/vierg/somain.c create mode 100644 archive-sources/vierg/vierg.cfg create mode 100644 archive-sources/yahtzee/colors.h create mode 100644 archive-sources/yahtzee/pics.h create mode 100644 archive-sources/yahtzee/somain.c create mode 100644 archive-sources/yahtzee/text.h create mode 100644 archive-sources/yahtzee/yahtzee.c create mode 100644 archive-sources/yahtzee/yahtzee.cfg create mode 100644 archive-sources/yahtzee/yahtzee.h diff --git a/Makefile b/Makefile index 90128e3..0a08868 100755 --- a/Makefile +++ b/Makefile @@ -184,24 +184,30 @@ neutrino: else \ $(MAKE) $(D)/neutrino-hd-nevis; \ fi - -# libraries.mk -libraries: - $(MAKE) $(D)/libraries-int +neutrino-libs: + $(MAKE) $(D)/neutrino-hd-libs # applications.mk applications-all: if [ $(LCD4LINUX) = "yes" ]; then \ - $(MAKE) $(D)/procps $(D)/busybox $(D)/e2fsprogs $(D)/hotplug $(D)/fbshot $(D)/vsftpd $(D)/flashcp $(D)/inadyn $(D)/lcd4linux; \ + $(MAKE) $(D)/procps $(D)/busybox $(D)/e2fsprogs $(D)/hotplug $(D)/fbshot $(D)/vsftpd $(D)/flashcp $(D)/inadyn $(D)/djmount $(D)/xupnpd $(D)/lcd4linux; \ else \ - $(MAKE) $(D)/procps $(D)/busybox $(D)/e2fsprogs $(D)/hotplug $(D)/fbshot $(D)/vsftpd $(D)/flashcp $(D)/inadyn; \ + $(MAKE) $(D)/procps $(D)/busybox $(D)/e2fsprogs $(D)/hotplug $(D)/fbshot $(D)/vsftpd $(D)/flashcp $(D)/inadyn $(D)/djmount $(D)/xupnpd; \ fi # plugins.mk plugins: - $(MAKE) $(D)/links $(D)/tuxcom $(D)/tuxcal $(D)/tuxmail $(D)/tuxwetter $(D)/getrc $(D)/msgbox $(D)/input $(D)/shellexec $(D)/logomask $(D)/logoview $(D)/cooliTSclimax $(D)/rcsim $(D)/sdparm + if [ $(GAMES) = "yes" ]; then \ + $(MAKE) $(D)/links $(D)/tuxcom $(D)/tuxcal $(D)/tuxmail $(D)/tuxwetter $(D)/getrc $(D)/msgbox $(D)/input $(D)/shellexec $(D)/logomask $(D)/logoview $(D)/cooliTSclimax $(D)/rcsim $(D)/sdparm $(D)/libfx2 $(D)/snake $(D)/sol $(D)/pac $(D)/tank $(D)/mines $(D)/master $(D)/tetris $(D)/vierg; \ + else \ + $(MAKE) $(D)/links $(D)/tuxcom $(D)/tuxcal $(D)/tuxmail $(D)/tuxwetter $(D)/getrc $(D)/msgbox $(D)/input $(D)/shellexec $(D)/logomask $(D)/logoview $(D)/cooliTSclimax $(D)/rcsim $(D)/sdparm; \ + fi plugins-all: - $(MAKE) $(D)/links $(D)/tuxcom $(D)/tuxcal $(D)/tuxmail $(D)/tuxwetter $(D)/blockads $(D)/getrc $(D)/msgbox $(D)/input $(D)/shellexec $(D)/logomask $(D)/logoview $(D)/liga_nat $(D)/boerse $(D)/rssnews $(D)/tanken $(D)/wetter $(D)/formel1 $(D)/cooliTSclimax $(D)/rcsim $(D)/sdparm + if [ $(GAMES) = "yes" ]; then \ + $(MAKE) $(D)/links $(D)/tuxcom $(D)/tuxcal $(D)/tuxmail $(D)/tuxwetter $(D)/blockads $(D)/getrc $(D)/msgbox $(D)/input $(D)/shellexec $(D)/logomask $(D)/logoview $(D)/liga_nat $(D)/boerse $(D)/rssnews $(D)/tanken $(D)/wetter $(D)/formel1 $(D)/cooliTSclimax $(D)/rcsim $(D)/sdparm $(D)/libfx2 $(D)/snake $(D)/sol $(D)/pac $(D)/tank $(D)/mines $(D)/master $(D)/tetris $(D)/vierg; \ + else \ + $(MAKE) $(D)/links $(D)/tuxcom $(D)/tuxcal $(D)/tuxmail $(D)/tuxwetter $(D)/blockads $(D)/getrc $(D)/msgbox $(D)/input $(D)/shellexec $(D)/logomask $(D)/logoview $(D)/liga_nat $(D)/boerse $(D)/rssnews $(D)/tanken $(D)/wetter $(D)/formel1 $(D)/cooliTSclimax $(D)/rcsim $(D)/sdparm; \ + fi # multimedia.mk multimedia: @@ -260,7 +266,7 @@ PHONY += wittinobi-init wittinobi-neutrino wittinobi-neutrino-flash wittinobi-al PHONY += prerequisites download PHONY += bootstrap includes-and-libs modules PHONY += neutrino -PHONY += libraries +PHONY += neutrino-libs PHONY += applications-all PHONY += plugins plugins-all PHONY += multimedia diff --git a/archive-patches/crosstool-ng-1.16.0-newconfig-apollo-uclibc b/archive-patches/crosstool-ng-1.16.0-newconfig-apollo-uclibc index 2dda4e6..e4dc8bc 100644 --- a/archive-patches/crosstool-ng-1.16.0-newconfig-apollo-uclibc +++ b/archive-patches/crosstool-ng-1.16.0-newconfig-apollo-uclibc @@ -350,7 +350,7 @@ CT_CC_LANG_OTHERS="" CT_CC_ENABLE_CXX_FLAGS="" CT_CC_CORE_EXTRA_CONFIG_ARRAY="" CT_CC_EXTRA_CONFIG_ARRAY="" -# CT_CC_STATIC_LIBSTDCXX is not set +CT_CC_STATIC_LIBSTDCXX=y # CT_CC_GCC_SYSTEM_ZLIB is not set # diff --git a/archive-patches/crosstool-ng-1.19.0-newconfig-apollo-uclibc b/archive-patches/crosstool-ng-1.19.0-newconfig-apollo-uclibc index 7e917eb..70763ba 100644 --- a/archive-patches/crosstool-ng-1.19.0-newconfig-apollo-uclibc +++ b/archive-patches/crosstool-ng-1.19.0-newconfig-apollo-uclibc @@ -383,7 +383,7 @@ CT_CC_LANG_OTHERS="" CT_CC_ENABLE_CXX_FLAGS="" CT_CC_CORE_EXTRA_CONFIG_ARRAY="" CT_CC_EXTRA_CONFIG_ARRAY="" -# CT_CC_STATIC_LIBSTDCXX is not set +CT_CC_STATIC_LIBSTDCXX=y # CT_CC_GCC_SYSTEM_ZLIB is not set # diff --git a/archive-patches/djmount-0.71.diff b/archive-patches/djmount-0.71.diff new file mode 100644 index 0000000..ec61092 --- /dev/null +++ b/archive-patches/djmount-0.71.diff @@ -0,0 +1,102 @@ +diff -ur djmount-0.71-orig/djmount/file_buffer.c djmount-0.71/djmount/file_buffer.c +--- djmount-0.71-orig/djmount/file_buffer.c 2006-08-27 22:12:20.000000000 +0200 ++++ djmount-0.71/djmount/file_buffer.c 2012-12-01 18:40:29.892922733 +0100 +@@ -199,7 +199,7 @@ + int rc = UpnpOpenHttpGetEx (file->url, &handle, + &contentType, &contentLength, + &httpStatus, +- offset, offset + size, ++ offset, offset + size - 1, + HTTP_DEFAULT_TIMEOUT + ); + if (rc != UPNP_E_SUCCESS) +diff -ur djmount-0.71-orig/djmount/file_buffer.h djmount-0.71/djmount/file_buffer.h +--- djmount-0.71-orig/djmount/file_buffer.h 2006-08-27 22:12:20.000000000 +0200 ++++ djmount-0.71/djmount/file_buffer.h 2012-12-01 18:41:50.552927328 +0100 +@@ -60,7 +60,7 @@ + * + *****************************************************************************/ + +-#define FILE_BUFFER_MAX_CONTENT_LENGTH ((uintmax_t) INT_MAX) ++#define FILE_BUFFER_MAX_CONTENT_LENGTH ((uintmax_t) ~0ULL) + + + /***************************************************************************** +diff -ur djmount-0.71-orig/djmount/media_file.c djmount-0.71/djmount/media_file.c +--- djmount-0.71-orig/djmount/media_file.c 2006-08-27 22:12:20.000000000 +0200 ++++ djmount-0.71/djmount/media_file.c 2012-12-01 18:43:37.382921337 +0100 +@@ -282,7 +282,7 @@ + { + const char* const str = ixmlElement_getAttribute (file->res, "size"); + off_t res; +- STRING_TO_INT (str, res, -1); ++ STRING_TO_INT (str, res, 8ULL << 30); + return res; + } + +diff -ur djmount-0.71-orig/libupnp/upnp/inc/upnp.h djmount-0.71/libupnp/upnp/inc/upnp.h +--- djmount-0.71-orig/libupnp/upnp/inc/upnp.h 2006-08-27 22:12:30.000000000 +0200 ++++ djmount-0.71/libupnp/upnp/inc/upnp.h 2012-12-01 18:44:21.112924671 +0100 +@@ -2262,9 +2262,9 @@ + IN OUT int *httpStatus, /** The status returned on receiving a + response message from the remote + server. */ +- IN int lowRange, /** An integer value representing the low ++ IN unsigned long long lowRange, /** An integer value representing the low + end of a range to retrieve. */ +- IN int highRange, /** An integer value representing the high ++ IN unsigned long long highRange, /** An integer value representing the high + end of a range to retrieve. */ + IN int timeout /** A time out value sent with the request + during which a response is expected +diff -ur djmount-0.71-orig/libupnp/upnp/src/api/upnpapi.c djmount-0.71/libupnp/upnp/src/api/upnpapi.c +--- djmount-0.71-orig/libupnp/upnp/src/api/upnpapi.c 2006-08-27 22:12:26.000000000 +0200 ++++ djmount-0.71/libupnp/upnp/src/api/upnpapi.c 2012-12-01 18:45:03.452924224 +0100 +@@ -3117,8 +3117,8 @@ + IN OUT char **contentType, + OUT int *contentLength, + OUT int *httpStatus, +- IN int lowRange, +- IN int highRange, ++ IN unsigned long long lowRange, ++ IN unsigned long long highRange, + IN int timeout ) + { + return http_OpenHttpGetEx( url_str, +diff -ur djmount-0.71-orig/libupnp/upnp/src/genlib/net/http/httpreadwrite.c djmount-0.71/libupnp/upnp/src/genlib/net/http/httpreadwrite.c +--- djmount-0.71-orig/libupnp/upnp/src/genlib/net/http/httpreadwrite.c 2006-08-27 22:12:24.000000000 +0200 ++++ djmount-0.71/libupnp/upnp/src/genlib/net/http/httpreadwrite.c 2012-12-01 18:45:56.082928622 +0100 +@@ -2072,8 +2072,8 @@ + IN OUT char **contentType, + OUT int *contentLength, + OUT int *httpStatus, +- IN int lowRange, +- IN int highRange, ++ IN unsigned long long lowRange, ++ IN unsigned long long highRange, + IN int timeout ) + { + int http_error_code; +@@ -2107,7 +2107,7 @@ + } + + memset( &rangeBuf, 0, sizeof( rangeBuf ) ); +- sprintf( rangeBuf.RangeHeader, "Range: bytes=%d-%d\r\n", ++ sprintf( rangeBuf.RangeHeader, "Range: bytes=%llu-%llu\r\n", + lowRange, highRange ); + + membuffer_init( &request ); +diff -ur djmount-0.71-orig/libupnp/upnp/src/inc/httpreadwrite.h djmount-0.71/libupnp/upnp/src/inc/httpreadwrite.h +--- djmount-0.71-orig/libupnp/upnp/src/inc/httpreadwrite.h 2006-08-27 22:12:28.000000000 +0200 ++++ djmount-0.71/libupnp/upnp/src/inc/httpreadwrite.h 2012-12-01 18:46:22.362922742 +0100 +@@ -494,8 +494,8 @@ + IN OUT char **contentType, + OUT int *contentLength, + OUT int *httpStatus, +- IN int lowRange, +- IN int highRange, ++ IN unsigned long long lowRange, ++ IN unsigned long long highRange, + IN int timeout); + + /************************************************************************ \ No newline at end of file diff --git a/archive-patches/ushare1.1a.diff b/archive-patches/ushare1.1a.diff new file mode 100644 index 0000000..84f5f48 --- /dev/null +++ b/archive-patches/ushare1.1a.diff @@ -0,0 +1,475 @@ +diff -uNr ushare-1.1a/configure ushare-1.1b/configure +--- ushare-1.1a/configure 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1b/configure 2012-03-25 17:35:07.000000000 -0400 +@@ -42,6 +42,9 @@ + echo " --with-libdlna-dir=DIR check for libdlna installed in DIR" + echo "" + echo "Advanced options (experts only):" ++ echo " --disable-sysconf disable installation of init files" ++ echo " --enable-developer enable developer options" ++ echo " --disable-developer disable developer options" + echo " --enable-debug enable debugging symbols" + echo " --disable-debug disable debugging symbols" + echo " --disable-strip disable stripping of executables at installation" +@@ -164,6 +167,11 @@ + echo "#define $1 \"$2\"" >> $CONFIG_H + } + ++check_cmd_exists(){ ++ log check_cmd_exists "$@" ++ which "$@" >>$logfile 2>&1 ++} ++ + check_cmd(){ + log "$@" + "$@" >>$logfile 2>&1 +@@ -300,13 +308,15 @@ + strip="strip" + cpu=`uname -m` + optimize="yes" ++sysconf="yes" ++developer="no" + debug="no" + dostrip="yes" + extralibs="" + installstrip="-s" + cross_compile="no" + INSTALL="/usr/bin/install -c" +-VERSION="1.1a" ++VERSION="1.2.0" + system_name=`uname -s 2>&1` + + ################################################# +@@ -420,6 +430,12 @@ + ;; + --disable-dlna) dlna="no" + ;; ++ --disable-sysconf) sysconf="no" ++ ;; ++ --enable-developer) developer="yes" ++ ;; ++ --disable-developer) developer="no" ++ ;; + --enable-debug) debug="yes" + ;; + --disable-debug) debug="no" +@@ -584,6 +600,25 @@ + linux && add_cflags -D_GNU_SOURCE + + ################################################# ++# check for developer options ++################################################# ++if enabled developer; then ++ add_cflags -Werror ++ add_cflags -DHAVE_DEVELOPER ++ ++ have_ctags='no' ++ if check_cmd_exists 'ctags'; then ++ have_ctags='yes' ++ fi ++ ++ have_etags='no' ++ if check_cmd_exists 'etags'; then ++ have_etags='yes' ++ fi ++ ++fi ++ ++################################################# + # check for debug symbols + ################################################# + if enabled debug; then +@@ -684,6 +719,8 @@ + echolog " STRIP $strip" + echolog " make $make" + echolog " CPU $cpu ($tune)" ++echolog " install sysconf $sysconf" ++echolog " developer options $developer" + echolog " debug symbols $debug" + echolog " strip symbols $dostrip" + echolog " optimize $optimize" +@@ -724,6 +761,10 @@ + append_config "LDFLAGS=$LDFLAGS" + append_config "INSTALL=$INSTALL" + ++append_config "INSTALL_SYSCONF=$sysconf" ++append_config "DEVELOPER=$developer" ++append_config "HAVE_CTAGS=$have_ctags" ++append_config "HAVE_ETAGS=$have_etags" + append_config "DEBUG=$debug" + + +diff -uNr ushare-1.1a/scripts/Makefile ushare-1.1b/scripts/Makefile +--- ushare-1.1a/scripts/Makefile 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1b/scripts/Makefile 2012-03-25 17:35:07.000000000 -0400 +@@ -3,6 +3,11 @@ + endif + include ../config.mak + ++INSTALL_RULES = ++ifeq ($(INSTALL_SYSCONF),yes) ++ INSTALL_RULES += install-sysconf ++endif ++ + CONF_FILE = "ushare.conf" + INITD_FILE = "ushare" + +@@ -14,7 +19,9 @@ + + distclean: + +-install: ++install: $(INSTALL_RULES) ++ ++install-sysconf: + $(INSTALL) -d $(sysconfdir) + $(INSTALL) -m 644 $(CONF_FILE) $(sysconfdir) + $(INSTALL) -d $(sysconfdir)/init.d +diff -uNr ushare-1.1a/src/Makefile ushare-1.1b/src/Makefile +--- ushare-1.1a/src/Makefile 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1b/src/Makefile 2012-03-25 17:35:07.000000000 -0400 +@@ -3,6 +3,15 @@ + endif + include ../config.mak + ++ifeq ($(DEVELOPER),yes) ++ ifeq ($(HAVE_ETAGS),yes) ++ BUILD_RULES += TAGS ++ endif ++ ifeq ($(HAVE_CTAGS),yes) ++ BUILD_RULES += tags ++ endif ++endif ++ + PROG = ushare + + EXTRADIST = ushare.1 \ +@@ -50,7 +59,7 @@ + + .SUFFIXES: .c .o + +-all: depend $(PROG) ++all: depend $(BUILD_RULES) $(PROG) + + .c.o: + $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< +@@ -58,6 +67,14 @@ + $(PROG): $(OBJS) + $(CC) $(OBJS) $(LDFLAGS) $(EXTRALIBS) -o $@ + ++TAGS: ++ @rm -f $@; \ ++ ( find -name '*.[chS]' -print ) | xargs etags -a ++ ++tags: ++ @rm -f $@; \ ++ ( find -name '*.[chS]' -print ) | xargs ctags -a; ++ + clean: + -$(RM) -f *.o $(PROG) + -$(RM) -f .depend +diff --git a/src/ctrl_telnet.c b/src/ctrl_telnet.c +index 0849d80..b3e9e8d 100644 +--- a/src/ctrl_telnet.c ++++ b/src/ctrl_telnet.c +@@ -202,6 +202,7 @@ ctrl_telnet_start (int port) + void + ctrl_telnet_stop (void) + { ++ ssize_t tmp; + pthread_mutex_lock (&startstop_lock); + + if (!started) +@@ -211,7 +212,7 @@ ctrl_telnet_stop (void) + } + + /* yes is int, which is bigger then char, so this should be safe */ +- write (ttd.killer[1], &yes, sizeof (char)); ++ tmp = write (ttd.killer[1], &yes, sizeof (char)); + + pthread_mutex_unlock (&startstop_lock); + pthread_join (ttd.thread, NULL); +diff --git a/src/mime.c b/src/mime.c +index 66c48ab..bf0121b 100644 +--- a/src/mime.c ++++ b/src/mime.c +@@ -144,7 +144,8 @@ char *mime_get_protocol (struct mime_type_t *mime) + if (!mime) + return NULL; + +- sprintf (protocol, mime->mime_protocol); ++ //sprintf (protocol, mime->mime_protocol); ++ strcpy (protocol, mime->mime_protocol); + strcat (protocol, "*"); + return strdup (protocol); + } +diff --git a/src/mime.c b/src/mime.c +index bf0121b..f38deca 100644 +--- a/src/mime.c ++++ b/src/mime.c +@@ -53,6 +53,7 @@ const struct mime_type_t MIME_Type_List[] = { + { "mpeg2", UPNP_VIDEO, "http-get:*:video/mpeg2:"}, + { "m4v", UPNP_VIDEO, "http-get:*:video/mp4:"}, + { "m4p", UPNP_VIDEO, "http-get:*:video/mp4:"}, ++ { "mp4", UPNP_VIDEO, "http-get:*:video/mp4:"}, + { "mp4ps", UPNP_VIDEO, "http-get:*:video/x-nerodigital-ps:"}, + { "ts", UPNP_VIDEO, "http-get:*:video/mpeg2:"}, + { "ogm", UPNP_VIDEO, "http-get:*:video/mpeg:"}, +@@ -79,7 +80,6 @@ const struct mime_type_t MIME_Type_List[] = { + { "mp1", UPNP_AUDIO, "http-get:*:audio/mp1:"}, + { "mp2", UPNP_AUDIO, "http-get:*:audio/mp2:"}, + { "mp3", UPNP_AUDIO, "http-get:*:audio/mpeg:"}, +- { "mp4", UPNP_AUDIO, "http-get:*:audio/mp4:"}, + { "m4a", UPNP_AUDIO, "http-get:*:audio/mp4:"}, + { "ogg", UPNP_AUDIO, "http-get:*:audio/x-ogg:"}, + { "wav", UPNP_AUDIO, "http-get:*:audio/wav:"}, +diff -wbBur ushare-1.1a/src/http.c ushare-1.1a.my/src/http.c +--- ushare-1.1a/src/http.c 2007-12-09 13:03:36.000000000 +0000 ++++ ushare-1.1a.my/src/http.c 2010-10-29 11:13:07.000000000 +0000 +@@ -77,8 +77,7 @@ + info->content_type = ixmlCloneDOMString (content_type); + } + +-static int +-http_get_info (const char *filename, struct File_Info *info) ++int http_get_info (const char *filename, struct File_Info *info) + { + extern struct ushare_t *ut; + struct upnp_entry_t *entry = NULL; +@@ -197,8 +196,7 @@ + return ((UpnpWebFileHandle) file); + } + +-static UpnpWebFileHandle +-http_open (const char *filename, enum UpnpOpenFileMode mode) ++UpnpWebFileHandle http_open (const char *filename, enum UpnpOpenFileMode mode) + { + extern struct ushare_t *ut; + struct upnp_entry_t *entry = NULL; +@@ -251,8 +249,7 @@ + return ((UpnpWebFileHandle) file); + } + +-static int +-http_read (UpnpWebFileHandle fh, char *buf, size_t buflen) ++int http_read (UpnpWebFileHandle fh, char *buf, size_t buflen) + { + struct web_file_t *file = (struct web_file_t *) fh; + ssize_t len = -1; +@@ -286,8 +283,7 @@ + return len; + } + +-static int +-http_write (UpnpWebFileHandle fh __attribute__((unused)), ++int http_write (UpnpWebFileHandle fh __attribute__((unused)), + char *buf __attribute__((unused)), + size_t buflen __attribute__((unused))) + { +@@ -296,8 +292,7 @@ + return 0; + } + +-static int +-http_seek (UpnpWebFileHandle fh, off_t offset, int origin) ++int http_seek (UpnpWebFileHandle fh, off_t offset, int origin) + { + struct web_file_t *file = (struct web_file_t *) fh; + off_t newpos = -1; +@@ -371,8 +366,7 @@ + return 0; + } + +-static int +-http_close (UpnpWebFileHandle fh) ++int http_close (UpnpWebFileHandle fh) + { + struct web_file_t *file = (struct web_file_t *) fh; + +@@ -402,13 +396,3 @@ + + return 0; + } +- +-struct UpnpVirtualDirCallbacks virtual_dir_callbacks = +- { +- http_get_info, +- http_open, +- http_read, +- http_write, +- http_seek, +- http_close +- }; +diff -wbBur ushare-1.1a/src/http.h ushare-1.1a.my/src/http.h +--- ushare-1.1a/src/http.h 2007-12-09 13:03:36.000000000 +0000 ++++ ushare-1.1a.my/src/http.h 2010-10-29 11:13:11.000000000 +0000 +@@ -25,6 +25,13 @@ + #include + #include + +-struct UpnpVirtualDirCallbacks virtual_dir_callbacks; ++int http_close (UpnpWebFileHandle fh); ++int http_write (UpnpWebFileHandle fh __attribute__((unused)), ++ char *buf __attribute__((unused)), ++ size_t buflen __attribute__((unused))); ++int http_seek (UpnpWebFileHandle fh, off_t offset, int origin); ++UpnpWebFileHandle http_open (const char *filename, enum UpnpOpenFileMode mode); ++int http_read (UpnpWebFileHandle fh, char *buf, size_t buflen); ++int http_get_info (const char *filename, struct File_Info *info); + + #endif /* _HTTP_H_ */ +diff -wbBur ushare-1.1a/src/ushare.c ushare-1.1a.my/src/ushare.c +--- ushare-1.1a/src/ushare.c 2007-12-09 13:03:36.000000000 +0000 ++++ ushare-1.1a.my/src/ushare.c 2010-10-29 11:17:45.000000000 +0000 +@@ -188,7 +188,7 @@ + if (strcmp (request->DevUDN + 5, ut->udn)) + return; + +- ip = request->CtrlPtIPAddr.s_addr; ++ ip = (*(struct sockaddr_in*)&request->CtrlPtIPAddr).sin_addr.s_addr; + ip = ntohl (ip); + sprintf (val, "%d.%d.%d.%d", + (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF); +@@ -348,7 +348,47 @@ + + UpnpEnableWebserver (TRUE); + +- res = UpnpSetVirtualDirCallbacks (&virtual_dir_callbacks); ++ res = UpnpVirtualDir_set_WriteCallback(http_write); ++ if (res != UPNP_E_SUCCESS) ++ { ++ log_error (_("Cannot set virtual directory callbacks\n")); ++ free (description); ++ return -1; ++ } ++ ++ res = UpnpVirtualDir_set_GetInfoCallback(http_get_info); ++ if (res != UPNP_E_SUCCESS) ++ { ++ log_error (_("Cannot set virtual directory callbacks\n")); ++ free (description); ++ return -1; ++ } ++ ++ res = UpnpVirtualDir_set_ReadCallback(http_read); ++ if (res != UPNP_E_SUCCESS) ++ { ++ log_error (_("Cannot set virtual directory callbacks\n")); ++ free (description); ++ return -1; ++ } ++ ++ res = UpnpVirtualDir_set_OpenCallback(http_open); ++ if (res != UPNP_E_SUCCESS) ++ { ++ log_error (_("Cannot set virtual directory callbacks\n")); ++ free (description); ++ return -1; ++ } ++ ++ res = UpnpVirtualDir_set_SeekCallback(http_seek); ++ if (res != UPNP_E_SUCCESS) ++ { ++ log_error (_("Cannot set virtual directory callbacks\n")); ++ free (description); ++ return -1; ++ } ++ ++ res = UpnpVirtualDir_set_CloseCallback(http_close); + if (res != UPNP_E_SUCCESS) + { + log_error (_("Cannot set virtual directory callbacks\n")); +diff -uNr ushare-1.1a.a/src/cds.c ushare-1.1a.b/src/cds.c +--- ushare-1.1a.a/src/cds.c 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1a.b/src/cds.c 2012-05-27 11:28:42.000000000 -0400 +@@ -19,7 +19,9 @@ + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + ++#include + #include ++#include + #include + #include + +diff -uNr ushare-1.1a.a/src/cms.c ushare-1.1a.b/src/cms.c +--- ushare-1.1a.a/src/cms.c 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1a.b/src/cms.c 2012-05-27 11:25:03.000000000 -0400 +@@ -20,6 +20,7 @@ + */ + + #include ++#include + #include + #include + +diff -uNr ushare-1.1a.a/src/http.c ushare-1.1a.b/src/http.c +--- ushare-1.1a.a/src/http.c 2012-05-27 11:23:32.000000000 -0400 ++++ ushare-1.1a.b/src/http.c 2012-05-27 11:25:13.000000000 -0400 +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + +diff -uNr ushare-1.1a.a/src/presentation.c ushare-1.1a.b/src/presentation.c +--- ushare-1.1a.a/src/presentation.c 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1a.b/src/presentation.c 2012-05-27 11:30:08.000000000 -0400 +@@ -18,7 +18,9 @@ + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + ++#include + #include ++#include + + #if HAVE_LANGINFO_CODESET + # include +diff -uNr ushare-1.1a.a/src/services.c ushare-1.1a.b/src/services.c +--- ushare-1.1a.a/src/services.c 2007-12-09 08:03:36.000000000 -0500 ++++ ushare-1.1a.b/src/services.c 2012-05-27 11:25:26.000000000 -0400 +@@ -20,6 +20,7 @@ + */ + + #include ++#include + #include + #include + +diff -Naur ushare-1.1a/scripts/ushare.conf ushare-1.1a_/scripts/ushare.conf +--- ushare-1.1a/scripts/ushare.conf 2007-12-09 14:03:36.000000000 +0100 ++++ ushare-1.1a_/scripts/ushare.conf 2012-07-05 09:35:00.000000000 +0200 +@@ -2,11 +2,11 @@ + # Configuration file for uShare + + # uShare UPnP Friendly Name (default is 'uShare'). +-USHARE_NAME= ++USHARE_NAME=coolstream + + # Interface to listen to (default is eth0). + # Ex : USHARE_IFACE=eth1 +-USHARE_IFACE= ++USHARE_IFACE=eth0 + + # Port to listen to (default is random from IANA Dynamic Ports range) + # Ex : USHARE_PORT=49200 +@@ -18,7 +18,7 @@ + + # Directories to be shared (space or CSV list). + # Ex: USHARE_DIR=/dir1,/dir2 +-USHARE_DIR= ++USHARE_DIR=/media/sda1,media/sdb1 + + # Use to override what happens when iconv fails to parse a file name. + # The default uShare behaviour is to not add the entry in the media list +@@ -28,7 +28,7 @@ + # as is. (Umlauts for all!) + # + # Options are TRUE/YES/1 for override and anything else for default behaviour +-USHARE_OVERRIDE_ICONV_ERR= ++USHARE_OVERRIDE_ICONV_ERR=yes + + # Enable Web interface (yes/no) + ENABLE_WEB= diff --git a/archive-patches/xupnpd_cst.diff b/archive-patches/xupnpd_cst.diff new file mode 100644 index 0000000..267f4f1 --- /dev/null +++ b/archive-patches/xupnpd_cst.diff @@ -0,0 +1,307 @@ +diff -Naur src/Makefile src/Makefile +--- src/Makefile 2013-09-16 12:59:07.000000000 +0200 ++++ src/Makefile 2013-09-16 15:51:00.000000000 +0200 +@@ -56,15 +56,16 @@ + dreambox: + $(MAKE) embedded TARGET=mipsel_dreambox SDK=/opt/mipsel-unknown-linux-gnu/bin + ++CST: ++ $(MAKE) embedded + + embedded: +- export PATH +- export STAGING_DIR +- make -C $(LUA) CC=$(SDK)/gcc a MYCFLAGS='$(LUAMYCFLAGS)' +- $(SDK)/gcc -O2 -c -o md5.o md5c.c +- $(SDK)/gcc $(CFLAGS) -DWITH_URANDOM -o xupnpd-$(TARGET) $(SRC) md5.o -llua -lm -ldl +- $(SDK)/strip xupnpd-$(TARGET) +- ++# export PATH ++# export STAGING_DIR ++ make -C $(LUA) CC=arm-cx2450x-linux-gnueabi-gcc a MYCFLAGS='$(LUAMYCFLAGS)' ++ arm-cx2450x-linux-gnueabi-gcc -O2 -c -o md5.o md5c.c ++ arm-cx2450x-linux-gnueabi-gcc $(CFLAGS) -DWITH_URANDOM -o xupnpd $(SRC) md5.o -llua -lm -ldl ++ arm-cx2450x-linux-gnueabi-strip xupnpd + clean: + make -C $(LUA) clean + rm -f $(LUA)/liblua.a +diff -Naur src/plugins/xupnpd_coolstream.lua src/plugins/xupnpd_coolstream.lua +--- src/plugins/xupnpd_coolstream.lua 1970-01-01 01:00:00.000000000 +0100 ++++ src/plugins/xupnpd_coolstream.lua 2013-09-03 13:32:22.000000000 +0200 +@@ -0,0 +1,174 @@ ++-- Plugin for converting channels lists from coolstream receivers ++-- Author focus.cst@gmail.com ++-- License GPL v2 ++-- Copyright (C) 2013 CoolStream International Ltd ++ ++-- flag to test as plain script, without xupnpd - cfg not defined in this case ++local cst_test = false ++ ++if not cfg then ++cfg={} ++cfg.tmp_path='/tmp/' ++cfg.feeds_path='/tmp/' ++cfg.debug=1 ++cst_test = true ++end ++ ++function cst_debug(level, msg) ++ if cfg.debug>level then ++ print(msg) ++ end ++end ++ ++function cst_get_bouquets(file) ++ local btable={} ++ repeat ++ local string=file:read() ++ if string then ++ cst_debug(1, "########## bouquet="..string) ++ local num = string.match(string, "%d+"); ++ if num then ++ local len = string.len(num); ++ local name = string.sub(string, len+1); ++ btable[num] = name ++ cst_debug(1, "num="..num.." name="..btable[num]); ++ end ++ --break; -- one bouquet ++ end ++ until not string ++ return btable ++end ++ ++function cst_get_channels(file) ++ local ctable={} ++ repeat ++ local string=file:read() ++ idx = 1; ++ if string then ++ cst_debug(1, "########## channel="..string) ++ local num = string.match(string, "%d+"); ++ if num then ++ local len = string.len(num); ++ local rest = string.sub(string, len+1); ++ local id = string.match(rest, "%x+ "); ++ len = string.len(id); ++ local name = string.sub(rest, len+2); ++ cst_debug(1, "num="..num.." id="..id.." name="..name) ++ if id and name then ++ table.insert(ctable, {id, name}); ++ idx = idx + 1; ++ end ++ end ++ end ++ until not string ++ return ctable ++end ++ ++-- all bouquets ++-- local burl = "getbouquets" ++-- only favorites ++local burl = "getbouquets?fav=true" ++ ++-- without epg ++-- local curl = "getbouquet?bouquet=" ++-- with epg ++local curl = "getbouquet?epg=true&bouquet=" ++ ++function cst_updatefeed(feed,friendly_name) ++ local rc=false ++ local feedspath = cfg.feeds_path ++ if not friendly_name then ++ friendly_name = feed ++ end ++ local wget = "wget -q -O- " ++ local cst_url = 'http://'..feed..'/control/' ++ ++ cst_debug(0, wget..cst_url..burl) ++ local bouquetsfile = io.popen(wget..cst_url..burl) ++ local bouquets = cst_get_bouquets(bouquetsfile) ++ bouquetsfile:close() ++ ++ if not bouquets then ++ return rc ++ end ++ local bindex ++ local bouquett = {} ++ for bindex,bouquett in pairs(bouquets) do ++ local cindex ++ local channelt = {} ++ cst_debug(0,wget.."\""..cst_url..curl..bindex.."\"") ++ local xmlbouquetfile = io.popen(wget.."\""..cst_url..curl..bindex.."\"") ++ local bouquet = cst_get_channels(xmlbouquetfile) ++ xmlbouquetfile:close() ++ if bouquet then ++ local m3ufilename = cfg.tmp_path.."cst_"..friendly_name.."_bouquet_"..bindex..".m3u" ++ cst_debug(0, m3ufilename) ++ local m3ufile = io.open(m3ufilename,"w") ++ m3ufile:write("#EXTM3U name=\""..bouquett.." ("..friendly_name..")\" plugin=coolstream type=ts\n") ++ for cindex,channelt in pairs(bouquet) do ++ local id = channelt[1]; ++ local name = channelt[2]; ++ m3ufile:write("#EXTINF:0,"..name.."\n") ++ -- m3ufile:write(cst_url.."zapto?"..id.."\n") ++ m3ufile:write("http://"..feed..":31339/id="..id.."\n") ++ end ++ m3ufile:close() ++ os.execute(string.format('mv %s %s',m3ufilename,feedspath)) ++ rc=true ++ end ++ end ++ return rc ++end ++ ++function cst_read_url(url) ++ local wget = "wget -q -O- " ++ local turl = wget..url ++ cst_debug(0, turl) ++ local file = io.popen(turl) ++ local string = file:read() ++ file:close() ++ return string ++end ++ ++function cst_zapto(urlbase,id) ++ local zap = urlbase.."/control/zapto?"..id; ++ cst_read_url(zap) ++end ++ ++function cst_sendurl(cst_url,range) ++ local i,j,baseurl = string.find(cst_url,"(.+):.+") ++ cst_debug(0, "cst_sendurl: url="..cst_url.." baseurl="..baseurl) ++ ++ i,j,id = string.find(cst_url,".*id=(.+)") ++ local surl = baseurl.."/control/standby" ++ local standby = cst_read_url(surl) ++ ++ if standby then ++ cst_debug(0, "standby="..standby) ++ ++ -- wakeup from standby ++ if string.find(standby,"on") then ++ cst_read_url(surl.."?off") ++ end ++ end ++ -- zap to channel ++ cst_zapto(baseurl,id) ++ ++ if not cst_test then ++ plugin_sendurl(cst_url,cst_url,range) ++ end ++end ++ ++if cst_test then ++cst_updatefeed("172.16.1.20","tank") ++-- cst_updatefeed("172.16.1.10","tank") ++-- cst_sendurl("http://172.16.1.20:31339/id=c1f000010070277a", 0) ++end ++ ++if not cst_test then ++plugins['coolstream']={} ++plugins.coolstream.name="CoolStream" ++plugins.coolstream.desc="IP address (example: 192.168.0.1)" ++plugins.coolstream.updatefeed=cst_updatefeed ++plugins.coolstream.sendurl=cst_sendurl ++end +diff -Naur src/xupnpd.lua src/xupnpd.lua +--- src/xupnpd.lua 2013-09-16 12:59:07.000000000 +0200 ++++ src/xupnpd.lua 2013-09-03 13:39:17.000000000 +0200 +@@ -1,13 +1,13 @@ + cfg={} + + -- multicast interface for SSDP exchange, 'eth0', 'br0', 'br-lan' for example +-cfg.ssdp_interface='lo' ++cfg.ssdp_interface='any' + + -- 'cfg.ssdp_loop' enables multicast loop (if player and server in one host) + cfg.ssdp_loop=1 + + -- SSDP announcement interval +-cfg.ssdp_notify_interval=15 ++cfg.ssdp_notify_interval=5 + + -- SSDP announcement age + cfg.ssdp_max_age=1800 +@@ -19,10 +19,10 @@ + cfg.log_facility='local0' + + -- 'cfg.daemon' detach server from terminal +-cfg.daemon=false ++cfg.daemon=true + + -- silent mode - no logs, no pid file +-cfg.embedded=false ++cfg.embedded=true + + -- 'cfg.debug' enables SSDP debug output to stdout (if cfg.daemon=false) + -- 0-off, 1-basic, 2-messages +@@ -32,7 +32,7 @@ + --cfg.udpxy_url='http://192.168.1.1:4022' + + -- downstream interface for builtin multicast proxy (comment 'cfg.udpxy_url' for processing 'udp://@...' playlists) +-cfg.mcast_interface='eth1' ++cfg.mcast_interface='eth0' + + -- 'cfg.proxy' enables proxy for injection DLNA headers to stream + -- 0-off, 1-radio, 2-radio/TV +@@ -48,7 +48,7 @@ + cfg.dlna_notify=true + + -- group by 'group-title' +-cfg.group=true ++cfg.group=false + + -- sort files + cfg.sort_files=false +@@ -69,12 +70,14 @@ + cfg.default_mime_type='mpeg' + + -- feeds update interval (seconds, 0 - disabled) +-cfg.feeds_update_interval=0 ++cfg.feeds_update_interval=3600 + cfg.playlists_update_interval=0 + + -- playlist (m3u file path or path with alias + playlist= + { ++ { '/media/sda1/movies', 'Local Record Files' }, ++ { '/media/sda1/pic', 'Local Picture Files' }, + -- { './playlists/mozhay.m3u', 'Mozhay.tv' }, + -- { './localmedia', 'Local Media Files' } + -- { './private', 'Private Media Files', '127.0.0.1;192.168.1.1' } -- only for 127.0.0.1 and 192.168.1.1 +@@ -83,10 +86,10 @@ + -- feeds list (plugin, feed name, feed type) + feeds= + { +- { 'vimeo', 'channel/hd', 'Vimeo HD Channel' }, +- { 'vimeo', 'channel/hdxs', 'Vimeo Xtreme sports' }, +- { 'vimeo', 'channel/mtb', 'Vimeo MTB Channel' }, +- { 'youtube', 'channel/top_rated', 'YouTube Top Rated' }, ++-- { 'vimeo', 'channel/hd', 'Vimeo HD Channel' }, ++-- { 'vimeo', 'channel/hdxs', 'Vimeo Xtreme sports' }, ++-- { 'vimeo', 'channel/mtb', 'Vimeo MTB Channel' }, ++-- { 'youtube', 'channel/top_rated', 'YouTube Top Rated' }, + -- { 'youtube', 'Drift0r', 'Drift0r' }, + -- { 'youtube', 'XboxAhoy', 'XboxAhoy' }, + -- { 'ag', 'videos', 'AG - New' }, +@@ -94,6 +97,8 @@ + -- { 'gametrailers', 'ps3', 'GT - PS3' }, + -- { 'giantbomb', 'all', 'GiantBomb - All' }, + -- { 'dreambox', 'http://192.168.0.1:8001/','Dreambox1' }, ++ { 'coolstream', 'localhost', 'Tank' }, ++-- { 'coolstream', '172.16.1.10', 'NEO' }, + } + + -- log ident, pid file end www root +@@ -104,8 +109,9 @@ + cfg.tmp_path='/tmp/' + cfg.plugin_path='./plugins/' + cfg.config_path='./config/' +-cfg.playlists_path='./playlists/' +---cfg.feeds_path='/tmp/xupnpd-feeds/' ++cfg.playlists_path='/tmp/playlists/' ++--cfg.playlists_path='./playlists/' ++cfg.feeds_path='/tmp/xupnpd-feeds/' + cfg.ui_path='./ui/' + cfg.drive='' -- reload playlists only if drive state=active/idle, example: cfg.drive='/dev/sda' + cfg.profiles='./profiles/' -- device profiles feature diff --git a/archive-sources/c64emu/1541d64.cpp b/archive-sources/c64emu/1541d64.cpp new file mode 100644 index 0000000..43564a8 --- /dev/null +++ b/archive-sources/c64emu/1541d64.cpp @@ -0,0 +1,1020 @@ +/* + * 1541d64.cpp - 1541 emulation in .d64 file + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Incompatibilities: + * ------------------ + * + * - Only read accesses possible + * - Not all commands implemented + * - The .d64 error info is read, but unused + */ + +#include "sysdeps.h" + +#include "1541d64.h" +#include "IEC.h" +#include "Prefs.h" + + +// Channel modes (IRC users listen up :-) +enum { + CHMOD_FREE, // Channel free + CHMOD_COMMAND, // Command/error channel + CHMOD_DIRECTORY, // Reading directory + CHMOD_FILE, // Sequential file open + CHMOD_DIRECT // Direct buffer access ('#') +}; + +// Access modes +enum { + FMODE_READ, FMODE_WRITE, FMODE_APPEND +}; + +// File types +enum { + FTYPE_PRG, FTYPE_SEQ, FTYPE_USR, FTYPE_REL +}; + +// Number of tracks/sectors +const int NUM_TRACKS = 35; +const int NUM_SECTORS = 683; + +// Prototypes +static bool match(uint8 *p, uint8 *n); + + +/* + * Constructor: Prepare emulation, open .d64 file + */ + +D64Drive::D64Drive(IEC *iec, char *filepath) : Drive(iec) +{ + the_file = NULL; + ram = NULL; + + Ready = false; + strcpy(orig_d64_name, filepath); + for (int i=0; i<=14; i++) { + chan_mode[i] = CHMOD_FREE; + chan_buf[i] = NULL; + } + chan_mode[15] = CHMOD_COMMAND; + + // Open .d64 file + open_close_d64_file(filepath); + if (the_file != NULL) { + + // Allocate 1541 RAM + ram = new uint8[0x800]; + bam = (BAM *)(ram + 0x700); + + Reset(); + Ready = true; + } +} + + +/* + * Destructor + */ + +D64Drive::~D64Drive() +{ + // Close .d64 file + open_close_d64_file(""); + + delete[] ram; + Ready = false; +} + + +/* + * Open/close the .d64 file + */ + +void D64Drive::open_close_d64_file(char *d64name) +{ + long size; + uint8 magic[4]; + + // Close old .d64, if open + if (the_file != NULL) { + close_all_channels(); + fclose(the_file); + the_file = NULL; + } + + // Open new .d64 file + if (d64name[0]) { + if ((the_file = fopen(d64name, "rb")) != NULL) { + + // Check length + fseek(the_file, 0, SEEK_END); + if ((size = ftell(the_file)) < NUM_SECTORS * 256) { + fclose(the_file); + the_file = NULL; + return; + } + + // x64 image? + rewind(the_file); + fread(&magic, 4, 1, the_file); + if (magic[0] == 0x43 && magic[1] == 0x15 && magic[2] == 0x41 && magic[3] == 0x64) + image_header = 64; + else + image_header = 0; + + // Preset error info (all sectors no error) + memset(error_info, 1, NUM_SECTORS); + + // Load sector error info from .d64 file, if present + if (!image_header && size == NUM_SECTORS * 257) { + fseek(the_file, NUM_SECTORS * 256, SEEK_SET); + fread(&error_info, NUM_SECTORS, 1, the_file); + } + } + } +} + + +/* + * Open channel + */ + +uint8 D64Drive::Open(int channel, char *filename) +{ + set_error(ERR_OK); + + // Channel 15: execute file name as command + if (channel == 15) { + execute_command(filename); + return ST_OK; + } + + if (chan_mode[channel] != CHMOD_FREE) { + set_error(ERR_NOCHANNEL); + return ST_OK; + } + + if (filename[0] == '$') + if (channel) + return open_file_ts(channel, 18, 0); + else + return open_directory(filename+1); + + if (filename[0] == '#') + return open_direct(channel, filename); + + return open_file(channel, filename); +} + + +/* + * Open file + */ + +uint8 D64Drive::open_file(int channel, char *filename) +{ + char plainname[256]; + int filemode = FMODE_READ; + int filetype = FTYPE_PRG; + int track, sector; + + convert_filename(filename, plainname, &filemode, &filetype); + + // Channel 0 is READ PRG, channel 1 is WRITE PRG + if (!channel) { + filemode = FMODE_READ; + filetype = FTYPE_PRG; + } + if (channel == 1) { + filemode = FMODE_WRITE; + filetype = FTYPE_PRG; + } + + // Allow only read accesses + if (filemode != FMODE_READ) { + set_error(ERR_WRITEPROTECT); + return ST_OK; + } + + // Find file in directory and open it + if (find_file(plainname, &track, §or)) + return open_file_ts(channel, track, sector); + else + set_error(ERR_FILENOTFOUND); + + return ST_OK; +} + + +/* + * Analyze file name, get access mode and type + */ + +void D64Drive::convert_filename(char *srcname, char *destname, int *filemode, int *filetype) +{ + char *p; + + // Search for ':', p points to first character after ':' + if ((p = strchr(srcname, ':')) != NULL) + p++; + else + p = srcname; + + // Remaining string -> destname + strncpy(destname, p, NAMEBUF_LENGTH); + + // Search for ',' + p = destname; + while (*p && (*p != ',')) p++; + + // Look for mode parameters seperated by ',' + p = destname; + while ((p = strchr(p, ',')) != NULL) { + + // Cut string after the first ',' + *p++ = 0; + + switch (*p) { + case 'P': + *filetype = FTYPE_PRG; + break; + case 'S': + *filetype = FTYPE_SEQ; + break; + case 'U': + *filetype = FTYPE_USR; + break; + case 'L': + *filetype = FTYPE_REL; + break; + case 'R': + *filemode = FMODE_READ; + break; + case 'W': + *filemode = FMODE_WRITE; + break; + case 'A': + *filemode = FMODE_APPEND; + break; + } + } +} + + +/* + * Search file in directory, find first track and sector + * false: not found, true: found + */ + +bool D64Drive::find_file(char *filename, int *track, int *sector) +{ + int i, j; + uint8 *p, *q; + DirEntry *de; + + // Scan all directory blocks + dir.next_track = bam->dir_track; + dir.next_sector = bam->dir_sector; + + while (dir.next_track) { + if (!read_sector(dir.next_track, dir.next_sector, (uint8 *) &dir.next_track)) + return false; + + // Scan all 8 entries of a block + for (j=0; j<8; j++) { + de = &dir.entry[j]; + *track = de->track; + *sector = de->sector; + + if (de->type) { + p = (uint8 *)filename; + q = de->name; + for (i=0; i<16 && *p; i++, p++, q++) { + if (*p == '*') // Wildcard '*' matches all following characters + return true; + if (*p != *q) { + if (*p != '?') goto next_entry; // Wildcard '?' matches single character + if (*q == 0xa0) goto next_entry; + } + } + + if (i == 16 || *q == 0xa0) + return true; + } +next_entry: ; + } + } + + return false; +} + + +/* + * Open file given track/sector of first block + */ + +uint8 D64Drive::open_file_ts(int channel, int track, int sector) +{ + chan_buf[channel] = new uint8[256]; + chan_mode[channel] = CHMOD_FILE; + + // On the next call to Read, the first block will be read + chan_buf[channel][0] = track; + chan_buf[channel][1] = sector; + buf_len[channel] = 0; + + return ST_OK; +} + + +/* + * Prepare directory as BASIC program (channel 0) + */ + +const char type_char_1[] = "DSPUREERSELQGRL?"; +const char type_char_2[] = "EERSELQGRL??????"; +const char type_char_3[] = "LQGRL???????????"; + +// Return true if name 'n' matches pattern 'p' +static bool match(uint8 *p, uint8 *n) +{ + if (!*p) // Null pattern matches everything + return true; + + do { + if (*p == '*') // Wildcard '*' matches all following characters + return true; + if ((*p != *n) && (*p != '?')) // Wildcard '?' matches single character + return false; + p++; n++; + } while (*p); + + return *n == 0xa0; +} + +uint8 D64Drive::open_directory(char *pattern) +{ + int i, j, n, m; + uint8 *p, *q; + DirEntry *de; + uint8 c; + char *tmppat; + + // Special treatment for "$0" + if (pattern[0] == '0' && pattern[1] == 0) + pattern += 1; + + // Skip everything before the ':' in the pattern + if ((tmppat = strchr(pattern, ':')) != NULL) + pattern = tmppat + 1; + + p = buf_ptr[0] = chan_buf[0] = new uint8[8192]; + chan_mode[0] = CHMOD_DIRECTORY; + + // Create directory title + *p++ = 0x01; // Load address $0401 (from PET days :-) + *p++ = 0x04; + *p++ = 0x01; // Dummy line link + *p++ = 0x01; + *p++ = 0; // Drive number (0) as line number + *p++ = 0; + *p++ = 0x12; // RVS ON + *p++ = '\"'; + + q = bam->disk_name; + for (i=0; i<23; i++) { + if ((c = *q++) == 0xa0) + *p++ = ' '; // Replace 0xa0 by space + else + *p++ = c; + } + *(p-7) = '\"'; + *p++ = 0; + + // Scan all directory blocks + dir.next_track = bam->dir_track; + dir.next_sector = bam->dir_sector; + + while (dir.next_track) { + if (!read_sector(dir.next_track, dir.next_sector, (uint8 *) &dir.next_track)) + return ST_OK; + + // Scan all 8 entries of a block + for (j=0; j<8; j++) { + de = &dir.entry[j]; + + if (de->type && match((uint8 *)pattern, de->name)) { + *p++ = 0x01; // Dummy line link + *p++ = 0x01; + + *p++ = de->num_blocks_l; // Line number + *p++ = de->num_blocks_h; + + *p++ = ' '; + n = (de->num_blocks_h << 8) + de->num_blocks_l; + if (n<10) *p++ = ' '; + if (n<100) *p++ = ' '; + + *p++ = '\"'; + q = de->name; + m = 0; + for (i=0; i<16; i++) { + if ((c = *q++) == 0xa0) { + if (m) + *p++ = ' '; // Replace all 0xa0 by spaces + else + m = *p++ = '\"'; // But the first by a '"' + } else + *p++ = c; + } + if (m) + *p++ = ' '; + else + *p++ = '\"'; // No 0xa0, then append a space + + if (de->type & 0x80) + *p++ = ' '; + else + *p++ = '*'; + + *p++ = type_char_1[de->type & 0x0f]; + *p++ = type_char_2[de->type & 0x0f]; + *p++ = type_char_3[de->type & 0x0f]; + + if (de->type & 0x40) + *p++ = '<'; + else + *p++ = ' '; + + *p++ = ' '; + if (n >= 10) *p++ = ' '; + if (n >= 100) *p++ = ' '; + *p++ = 0; + } + } + } + + // Final line + q = p; + for (i=0; i<29; i++) + *q++ = ' '; + + n = 0; + for (i=0; i<35; i++) + n += bam->bitmap[i*4]; + + *p++ = 0x01; // Dummy line link + *p++ = 0x01; + *p++ = n & 0xff; // Number of free blocks as line number + *p++ = (n >> 8) & 0xff; + + *p++ = 'B'; + *p++ = 'L'; + *p++ = 'O'; + *p++ = 'C'; + *p++ = 'K'; + *p++ = 'S'; + *p++ = ' '; + *p++ = 'F'; + *p++ = 'R'; + *p++ = 'E'; + *p++ = 'E'; + *p++ = '.'; + + p = q; + *p++ = 0; + *p++ = 0; + *p++ = 0; + + buf_len[0] = p - chan_buf[0]; + + return ST_OK; +} + + +/* + * Open channel for direct buffer access + */ + +uint8 D64Drive::open_direct(int channel, char *filename) +{ + int buf = -1; + + if (filename[1] == 0) + buf = alloc_buffer(-1); + else + if ((filename[1] >= '0') && (filename[1] <= '3') && (filename[2] == 0)) + buf = alloc_buffer(filename[1] - '0'); + + if (buf == -1) { + set_error(ERR_NOCHANNEL); + return ST_OK; + } + + // The buffers are in the 1541 RAM at $300 and are 256 bytes each + chan_buf[channel] = buf_ptr[channel] = ram + 0x300 + (buf << 8); + chan_mode[channel] = CHMOD_DIRECT; + chan_buf_num[channel] = buf; + + // Store actual buffer number in buffer + *chan_buf[channel] = buf + '0'; + buf_len[channel] = 1; + + return ST_OK; +} + + +/* + * Close channel + */ + +uint8 D64Drive::Close(int channel) +{ + if (channel == 15) { + close_all_channels(); + return ST_OK; + } + + switch (chan_mode[channel]) { + case CHMOD_FREE: + break; + + case CHMOD_DIRECT: + free_buffer(chan_buf_num[channel]); + chan_buf[channel] = NULL; + chan_mode[channel] = CHMOD_FREE; + break; + + default: + delete[] chan_buf[channel]; + chan_buf[channel] = NULL; + chan_mode[channel] = CHMOD_FREE; + break; + } + + return ST_OK; +} + + +/* + * Close all channels + */ + +void D64Drive::close_all_channels() +{ + for (int i=0; i<15; i++) + Close(i); + + cmd_len = 0; +} + + +/* + * Read from channel + */ + +uint8 D64Drive::Read(int channel, uint8 *byte) +{ + switch (chan_mode[channel]) { + case CHMOD_COMMAND: + *byte = *error_ptr++; + if (--error_len) + return ST_OK; + else { + set_error(ERR_OK); + return ST_EOF; + } + break; + + case CHMOD_FILE: + // Read next block if necessary + if (chan_buf[channel][0] && !buf_len[channel]) { + if (!read_sector(chan_buf[channel][0], chan_buf[channel][1], chan_buf[channel])) + return ST_READ_TIMEOUT; + buf_ptr[channel] = chan_buf[channel] + 2; + + // Determine block length + buf_len[channel] = chan_buf[channel][0] ? 254 : (uint8)chan_buf[channel][1]-1; + } + + if (buf_len[channel] > 0) { + *byte = *buf_ptr[channel]++; + if (!--buf_len[channel] && !chan_buf[channel][0]) + return ST_EOF; + else + return ST_OK; + } else + return ST_READ_TIMEOUT; + break; + + case CHMOD_DIRECTORY: + case CHMOD_DIRECT: + if (buf_len[channel] > 0) { + *byte = *buf_ptr[channel]++; + if (--buf_len[channel]) + return ST_OK; + else + return ST_EOF; + } else + return ST_READ_TIMEOUT; + break; + } + return ST_READ_TIMEOUT; +} + + +/* + * Write byte to channel + */ + +uint8 D64Drive::Write(int channel, uint8 byte, bool eoi) +{ + switch (chan_mode[channel]) { + case CHMOD_FREE: + set_error(ERR_FILENOTOPEN); + break; + + case CHMOD_COMMAND: + // Collect characters and execute command on EOI + if (cmd_len >= 40) + return ST_TIMEOUT; + + cmd_buffer[cmd_len++] = byte; + + if (eoi) { + cmd_buffer[cmd_len++] = 0; + cmd_len = 0; + execute_command(cmd_buffer); + } + return ST_OK; + + case CHMOD_DIRECTORY: + set_error(ERR_WRITEFILEOPEN); + break; + } + return ST_TIMEOUT; +} + + +/* + * Execute command string + */ + +void D64Drive::execute_command(char *command) +{ + uint16 adr; + int len; + + switch (command[0]) { + case 'B': + if (command[1] != '-') + set_error(ERR_SYNTAX30); + else + switch (command[2]) { + case 'R': + block_read_cmd(&command[3]); + break; + + case 'P': + buffer_ptr_cmd(&command[3]); + break; + + case 'A': + case 'F': + case 'W': + set_error(ERR_WRITEPROTECT); + break; + + default: + set_error(ERR_SYNTAX30); + break; + } + break; + + case 'M': + if (command[1] != '-') + set_error(ERR_SYNTAX30); + else + switch (command[2]) { + case 'R': + adr = ((uint8)command[4] << 8) | ((uint8)command[3]); + error_ptr = (char *)(ram + (adr & 0x07ff)); + if (!(error_len = (uint8)command[5])) + error_len = 1; + break; + + case 'W': + adr = ((uint8)command[4] << 8) | ((uint8)command[3]); + len = (uint8)command[5]; + for (int i=0; i= 0x30 && *cmd < 0x40) { + i *= 10; + i += *cmd++ & 0x0f; + } + *arg1 = i & 0xff; + + while (*cmd == ' ' || *cmd == 0x1d || *cmd == 0x2c) cmd++; + if (!*cmd) return false; + + i = 0; + while (*cmd >= 0x30 && *cmd < 0x40) { + i *= 10; + i += *cmd++ & 0x0f; + } + *arg2 = i & 0xff; + + while (*cmd == ' ' || *cmd == 0x1d || *cmd == 0x2c) cmd++; + if (!*cmd) return false; + + i = 0; + while (*cmd >= 0x30 && *cmd < 0x40) { + i *= 10; + i += *cmd++ & 0x0f; + } + *arg3 = i & 0xff; + + while (*cmd == ' ' || *cmd == 0x1d || *cmd == 0x2c) cmd++; + if (!*cmd) return false; + + i = 0; + while (*cmd >= 0x30 && *cmd < 0x40) { + i *= 10; + i += *cmd++ & 0x0f; + } + *arg4 = i & 0xff; + + return true; +} + + +/* + * Execute 'G' command + */ + +void D64Drive::chd64_cmd(char *d64name) +{ + char str[NAMEBUF_LENGTH]; + char *p = str; + + // Convert .d64 file name + for (int i=0; i Desired buffer number or -1 + * <- Allocated buffer number or -1 + */ + +int D64Drive::alloc_buffer(int want) +{ + if (want == -1) { + for (want=3; want>=0; want--) + if (buf_free[want]) { + buf_free[want] = false; + return want; + } + return -1; + } + + if (want < 4) + if (buf_free[want]) { + buf_free[want] = false; + return want; + } else + return -1; + else + return -1; +} + + +/* + * Free floppy buffer + */ + +void D64Drive::free_buffer(int buf) +{ + buf_free[buf] = true; +} + + +/* + * Read sector (256 bytes) + * true: success, false: error + */ + +bool D64Drive::read_sector(int track, int sector, uint8 *buffer) +{ + int offset; + + // Convert track/sector to byte offset in file + if ((offset = offset_from_ts(track, sector)) < 0) { + set_error(ERR_ILLEGALTS); + return false; + } + + if (the_file == NULL) { + set_error(ERR_NOTREADY); + return false; + } + + fseek(the_file, offset + image_header, SEEK_SET); + fread(buffer, 256, 1, the_file); + return true; +} + + +/* + * Convert track/sector to offset + */ + +const int num_sectors[41] = { + 0, + 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, + 19,19,19,19,19,19,19, + 18,18,18,18,18,18, + 17,17,17,17,17, + 17,17,17,17,17 // Tracks 36..40 +}; + +const int sector_offset[41] = { + 0, + 0,21,42,63,84,105,126,147,168,189,210,231,252,273,294,315,336, + 357,376,395,414,433,452,471, + 490,508,526,544,562,580, + 598,615,632,649,666, + 683,700,717,734,751 // Tracks 36..40 +}; + +int D64Drive::offset_from_ts(int track, int sector) +{ + if ((track < 1) || (track > NUM_TRACKS) || + (sector < 0) || (sector >= num_sectors[track])) + return -1; + + return (sector_offset[track] + sector) << 8; +} + + +/* + * Conversion PETSCII->ASCII + */ + +uint8 D64Drive::conv_from_64(uint8 c, bool map_slash) +{ + if ((c >= 'A') && (c <= 'Z') || (c >= 'a') && (c <= 'z')) + return c ^ 0x20; + if ((c >= 0xc1) && (c <= 0xda)) + return c ^ 0x80; + if ((c == '/') && map_slash && ThePrefs.MapSlash) + return '\\'; + return c; +} diff --git a/archive-sources/c64emu/1541d64.h b/archive-sources/c64emu/1541d64.h new file mode 100644 index 0000000..f71f18f --- /dev/null +++ b/archive-sources/c64emu/1541d64.h @@ -0,0 +1,108 @@ +/* + * 1541d64.h - 1541 emulation in .d64 file + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _1541D64_H +#define _1541D64_H + +#include "IEC.h" + + +// BAM structure +typedef struct { + uint8 dir_track; // Track... + uint8 dir_sector; // ...and sector of first directory block + int8 fmt_type; // Format type + int8 pad0; + uint8 bitmap[4*35]; // Sector allocation + uint8 disk_name[18]; // Disk name + uint8 id[2]; // Disk ID + int8 pad1; + uint8 fmt_char[2]; // Format characters + int8 pad2[4]; + int8 pad3[85]; +} BAM; + +// Directory entry structure +typedef struct { + uint8 type; // File type + uint8 track; // Track... + uint8 sector; // ...and sector of first data block + uint8 name[16]; // File name + uint8 side_track; // Track... + uint8 side_sector; // ...and sector of first side sector + uint8 rec_len; // Record length + int8 pad0[4]; + uint8 ovr_track; // Track... + uint8 ovr_sector; // ...and sector on overwrite + uint8 num_blocks_l; // Number of blocks, LSB + uint8 num_blocks_h; // Number of blocks, MSB + int8 pad1[2]; +} DirEntry; + +// Directory block structure +typedef struct { + uint8 padding[2]; // Keep DirEntry word-aligned + uint8 next_track; + uint8 next_sector; + DirEntry entry[8]; +} Directory; + + +class D64Drive : public Drive { +public: + D64Drive(IEC *iec, char *filepath); + virtual ~D64Drive(); + virtual uint8 Open(int channel, char *filename); + virtual uint8 Close(int channel); + virtual uint8 Read(int channel, uint8 *byte); + virtual uint8 Write(int channel, uint8 byte, bool eoi); + virtual void Reset(void); + +private: + void open_close_d64_file(char *d64name); + uint8 open_file(int channel, char *filename); + void convert_filename(char *srcname, char *destname, int *filemode, int *filetype); + bool find_file(char *filename, int *track, int *sector); + uint8 open_file_ts(int channel, int track, int sector); + uint8 open_directory(char *pattern); + uint8 open_direct(int channel, char *filename); + void close_all_channels(); + void execute_command(char *command); + void block_read_cmd(char *command); + void buffer_ptr_cmd(char *command); + bool parse_bcmd(char *cmd, int *arg1, int *arg2, int *arg3, int *arg4); + void chd64_cmd(char *d64name); + int alloc_buffer(int want); + void free_buffer(int buf); + bool read_sector(int track, int sector, uint8 *buffer); + int offset_from_ts(int track, int sector); + uint8 conv_from_64(uint8 c, bool map_slash); + + char orig_d64_name[256]; // Original path of .d64 file + + FILE *the_file; // File pointer for .d64 file + + uint8 *ram; // 2KB 1541 RAM + BAM *bam; // Pointer to BAM + Directory dir; // Buffer for directory blocks + + int chan_mode[16]; // Channel mode + int chan_buf_num[16]; // Buffer number of channel (for direct access channels) + uint8 *chan_buf[16]; // Pointer to buffer + uint8 *buf_ptr[16]; // Pointer in buffer + int buf_len[16]; // Remaining bytes in buffer + + bool buf_free[4]; // Buffer 0..3 free? + + char cmd_buffer[44]; // Buffer for incoming command strings + int cmd_len; // Length of received command + + int image_header; // Length of .d64 file header + + uint8 error_info[683]; // Sector error information (1 byte/sector) +}; + +#endif diff --git a/archive-sources/c64emu/1541fs.cpp b/archive-sources/c64emu/1541fs.cpp new file mode 100644 index 0000000..c8a763b --- /dev/null +++ b/archive-sources/c64emu/1541fs.cpp @@ -0,0 +1,602 @@ +/* + * 1541fs.cpp - 1541 emulation in host file system + * + * Frodo (C) 1994-1997 Christian Bauer + + * + * Notes: + * ------ + * + * - If the directory is opened (file name "$"), a temporary file + * with the structure of a 1541 directory file is created and + * opened. It can then be accessed in the same way as all other + * files. + * + * Incompatibilities: + * ------------------ + * + * - No "raw" directory reading + * - No relative/sequential/user files + * - Only "I" and "UJ" commands implemented + */ + +#include "sysdeps.h" + +#include "1541fs.h" +#include "IEC.h" +#include "main.h" +#include "Prefs.h" + +// Access modes +enum { + FMODE_READ, FMODE_WRITE, FMODE_APPEND +}; + +// File types +enum { + FTYPE_PRG, FTYPE_SEQ +}; + +// Prototypes +static bool match(char *p, char *n); + + +/* + * Constructor: Prepare emulation + */ + +FSDrive::FSDrive(IEC *iec, char *path) : Drive(iec) +{ + strcpy(orig_dir_path, path); + dir_path[0] = 0; + + if (change_dir(orig_dir_path)) { + for (int i=0; i<16; i++) + file[i] = NULL; + + Reset(); + + Ready = true; + } +} + + +/* + * Destructor + */ + +FSDrive::~FSDrive() +{ + if (Ready) { + close_all_channels(); + Ready = false; + } +} + + +/* + * Change emulation directory + */ + +bool FSDrive::change_dir(char *dirpath) +{ + DIR *dir; + + if ((dir = opendir(dirpath)) != NULL) { + closedir(dir); + strcpy(dir_path, dirpath); + strncpy(dir_title, dir_path, 16); + return true; + } else + return false; +} + + +/* + * Open channel + */ + +uint8 FSDrive::Open(int channel, char *filename) +{ + set_error(ERR_OK); + + // Channel 15: Execute file name as command + if (channel == 15) { + execute_command(filename); + return ST_OK; + } + + // Close previous file if still open + if (file[channel]) { + fclose(file[channel]); + file[channel] = NULL; + } + + if (filename[0] == '$') + return open_directory(channel, filename+1); + + if (filename[0] == '#') { + set_error(ERR_NOCHANNEL); + return ST_OK; + } + + return open_file(channel, filename); +} + + +/* + * Open file + */ + +uint8 FSDrive::open_file(int channel, char *filename) +{ + char plainname[NAMEBUF_LENGTH]; + int filemode = FMODE_READ; + int filetype = FTYPE_PRG; + bool wildflag = false; + char *mode = "rb"; + + convert_filename(filename, plainname, &filemode, &filetype, &wildflag); + + // Channel 0 is READ PRG, channel 1 is WRITE PRG + if (!channel) { + filemode = FMODE_READ; + filetype = FTYPE_PRG; + } + if (channel == 1) { + filemode = FMODE_WRITE; + filetype = FTYPE_PRG; + } + + // Wildcards are only allowed on reading + if (wildflag) { + if (filemode != FMODE_READ) { + set_error(ERR_SYNTAX33); + return ST_OK; + } + find_first_file(plainname); + } + + // Select fopen() mode according to file mode + switch (filemode) { + case FMODE_READ: + mode = "rb"; + break; + case FMODE_WRITE: + mode = "wb"; + break; + case FMODE_APPEND: + mode = "ab"; + break; + } + + // Open file + if (chdir(dir_path)) + set_error(ERR_NOTREADY); + else if ((file[channel] = fopen(plainname, mode)) != NULL) { + if (filemode == FMODE_READ) // Read and buffer first byte + read_char[channel] = fgetc(file[channel]); + } else + set_error(ERR_FILENOTFOUND); + chdir(AppDirPath); + + return ST_OK; +} + + +/* + * Analyze file name, get access mode and type + */ + +void FSDrive::convert_filename(char *srcname, char *destname, int *filemode, int *filetype, bool *wildflag) +{ + char *p, *q; + int i; + + // Search for ':', p points to first character after ':' + if ((p = strchr(srcname, ':')) != NULL) + p++; + else + p = srcname; + + // Convert char set of the remaining string -> destname + q = destname; + for (i=0; id_name) || 0 == strcmp("..", de->d_name))) + de = readdir(dir); + + while (de) { + + // Match found? Then copy real file name + if (match(name, de->d_name)) { + strncpy(name, de->d_name, NAMEBUF_LENGTH); + closedir(dir); + return; + } + + // Get next directory entry + de = readdir(dir); + } + + closedir(dir); +} + + +/* + * Open directory, create temporary file + */ + +uint8 FSDrive::open_directory(int channel, char *filename) +{ + char buf[] = "\001\004\001\001\0\0\022\042 \042 00 2A"; + char str[NAMEBUF_LENGTH]; + char pattern[NAMEBUF_LENGTH]; + char *p, *q; + int i; + int filemode; + int filetype; + bool wildflag; + + DIR *dir; + struct dirent *de; + struct stat statbuf; + + // Special treatment for "$0" + if (filename[0] == '0' && filename[1] == 0) + filename += 1; + + // Convert filename ('$' already stripped), filemode/type are ignored + convert_filename(filename, pattern, &filemode, &filetype, &wildflag); + + // Open directory for reading and skip '.' and '..' + if ((dir = opendir(dir_path)) == NULL) { + set_error(ERR_NOTREADY); + return ST_OK; + } + de = readdir(dir); + while (de && (0 == strcmp(".", de->d_name) || 0 == strcmp("..", de->d_name))) + de = readdir(dir); + + // Create temporary file + if ((file[channel] = tmpfile()) == NULL) { + closedir(dir); + return ST_OK; + } + + // Create directory title + p = &buf[8]; + for (i=0; i<16 && dir_title[i]; i++) + *p++ = conv_to_64(dir_title[i], false); + fwrite(buf, 1, 32, file[channel]); + + // Create and write one line for every directory entry + while (de) { + + // Include only files matching the pattern + if (match(pattern, de->d_name)) { + + // Get file statistics + chdir(dir_path); + stat(de->d_name, &statbuf); + chdir(AppDirPath); + + // Clear line with spaces and terminate with null byte + memset(buf, ' ', 31); + buf[31] = 0; + + p = buf; + *p++ = 0x01; // Dummy line link + *p++ = 0x01; + + // Calculate size in blocks (254 bytes each) + i = (statbuf.st_size + 254) / 254; + *p++ = i & 0xff; + *p++ = (i >> 8) & 0xff; + + p++; + if (i < 10) p++; // Less than 10: add one space + if (i < 100) p++; // Less than 100: add another space + + // Convert and insert file name + strcpy(str, de->d_name); + *p++ = '\"'; + q = p; + for (i=0; i<16 && str[i]; i++) + *q++ = conv_to_64(str[i], true); + *q++ = '\"'; + p += 18; + + // File type + if (S_ISDIR(statbuf.st_mode)) { + *p++ = 'D'; + *p++ = 'I'; + *p++ = 'R'; + } else { + *p++ = 'P'; + *p++ = 'R'; + *p++ = 'G'; + } + + // Write line + fwrite(buf, 1, 32, file[channel]); + } + + // Get next directory entry + de = readdir(dir); + } + + // Final line + fwrite("\001\001\0\0BLOCKS FREE. \0\0", 1, 32, file[channel]); + + // Rewind file for reading and read first byte + rewind(file[channel]); + read_char[channel] = fgetc(file[channel]); + + // Close directory + closedir(dir); + + return ST_OK; +} + + +/* + * Close channel + */ + +uint8 FSDrive::Close(int channel) +{ + if (channel == 15) { + close_all_channels(); + return ST_OK; + } + + if (file[channel]) { + fclose(file[channel]); + file[channel] = NULL; + } + + return ST_OK; +} + + +/* + * Close all channels + */ + +void FSDrive::close_all_channels(void) +{ + for (int i=0; i<15; i++) + Close(i); + + cmd_len = 0; +} + + +/* + * Read from channel + */ + +uint8 FSDrive::Read(int channel, uint8 *byte) +{ + int c; + + // Channel 15: Error channel + if (channel == 15) { + *byte = *error_ptr++; + + if (*byte != '\r') + return ST_OK; + else { // End of message + set_error(ERR_OK); + return ST_EOF; + } + } + + if (!file[channel]) return ST_READ_TIMEOUT; + + // Read one byte + *byte = read_char[channel]; + c = fgetc(file[channel]); + if (c == EOF) + return ST_EOF; + else { + read_char[channel] = c; + return ST_OK; + } +} + + +/* + * Write to channel + */ + +uint8 FSDrive::Write(int channel, uint8 byte, bool eoi) +{ + // Channel 15: Collect chars and execute command on EOI + if (channel == 15) { + if (cmd_len >= 40) + return ST_TIMEOUT; + + cmd_buffer[cmd_len++] = byte; + + if (eoi) { + cmd_buffer[cmd_len] = 0; + cmd_len = 0; + execute_command(cmd_buffer); + } + return ST_OK; + } + + if (!file[channel]) { + set_error(ERR_FILENOTOPEN); + return ST_TIMEOUT; + } + + if (fputc(byte, file[channel]) == EOF) { + set_error(ERR_WRITEERROR); + return ST_TIMEOUT; + } + + return ST_OK; +} + + +/* + * Execute command string + */ + +void FSDrive::execute_command(char *command) +{ + switch (command[0]) { + case 'I': + close_all_channels(); + set_error(ERR_OK); + break; + + case 'U': + if ((command[1] & 0x0f) == 0x0a) { + Reset(); + } else + set_error(ERR_SYNTAX30); + break; + + case 'G': + if (command[1] != ':') + set_error(ERR_SYNTAX30); + else + chdir_cmd(&command[2]); + break; + + default: + set_error(ERR_SYNTAX30); + } +} + + +/* + * Execute 'G' command + */ + +void FSDrive::chdir_cmd(char *dirpath) +{ + char str[NAMEBUF_LENGTH]; + char *p = str; + + close_all_channels(); + + // G:. resets the directory path to its original setting + if (dirpath[0] == '.' && dirpath[1] == 0) { + change_dir(orig_dir_path); + } else { + + // Convert directory name + for (int i=0; iASCII + */ + +uint8 FSDrive::conv_from_64(uint8 c, bool map_slash) +{ + if ((c >= 'A') && (c <= 'Z') || (c >= 'a') && (c <= 'z')) + return c ^ 0x20; + if ((c >= 0xc1) && (c <= 0xda)) + return c ^ 0x80; + if ((c == '/') && map_slash && ThePrefs.MapSlash) + return '\\'; + return c; +} + + +/* + * Conversion ASCII->PETSCII + */ + +uint8 FSDrive::conv_to_64(uint8 c, bool map_slash) +{ + if ((c >= 'A') && (c <= 'Z') || (c >= 'a') && (c <= 'z')) + return c ^ 0x20; + if ((c == '\\') && map_slash && ThePrefs.MapSlash) + return '/'; + return c; +} diff --git a/archive-sources/c64emu/1541fs.h b/archive-sources/c64emu/1541fs.h new file mode 100644 index 0000000..3bc95f0 --- /dev/null +++ b/archive-sources/c64emu/1541fs.h @@ -0,0 +1,46 @@ +/* + * 1541fs.h - 1541 emulation in host file system + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _1541FS_H +#define _1541FS_H + +#include "IEC.h" + + +class FSDrive : public Drive { +public: + FSDrive(IEC *iec, char *path); + virtual ~FSDrive(); + virtual uint8 Open(int channel, char *filename); + virtual uint8 Close(int channel); + virtual uint8 Read(int channel, uint8 *byte); + virtual uint8 Write(int channel, uint8 byte, bool eoi); + virtual void Reset(void); + +private: + bool change_dir(char *dirpath); + uint8 open_file(int channel, char *filename); + uint8 open_directory(int channel, char *filename); + void convert_filename(char *srcname, char *destname, int *filemode, int *filetype, bool *wildflag); + void find_first_file(char *name); + void close_all_channels(void); + void execute_command(char *command); + void chdir_cmd(char *dirpath); + uint8 conv_from_64(uint8 c, bool map_slash); + uint8 conv_to_64(uint8 c, bool map_slash); + + char dir_path[256]; // Path to directory + char orig_dir_path[256]; // Original directory path + char dir_title[16]; // Directory title + FILE *file[16]; // File pointers for each of the 16 channels + + char cmd_buffer[44]; // Buffer for incoming command strings + int cmd_len; // Length of received command + + uint8 read_char[16]; // Buffers for one-byte read-ahead +}; + +#endif diff --git a/archive-sources/c64emu/1541job.cpp b/archive-sources/c64emu/1541job.cpp new file mode 100644 index 0000000..b2e55b6 --- /dev/null +++ b/archive-sources/c64emu/1541job.cpp @@ -0,0 +1,448 @@ +/* + * 1541job.cpp - Emulation of 1541 GCR disk reading/writing + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Notes: + * ------ + * + * - This is only used for processor-level 1541 emulation. + * It simulates the 1541 disk controller hardware (R/W head, + * GCR reading/writing). + * - The preferences settings for drive 8 are used to + * specify the .d64 file + * + * Incompatibilities: + * ------------------ + * + * - No GCR writing possible (WriteSector is a ROM patch) + * - Programs depending on the exact timing of head movement/disk + * rotation don't work + * - The .d64 error info is unused + */ + +#include "sysdeps.h" + +#include "1541job.h" +#include "CPU1541.h" +#include "Prefs.h" + + +// Number of tracks/sectors +const int NUM_TRACKS = 35; +const int NUM_SECTORS = 683; + +// Size of GCR encoded data +const int GCR_SECTOR_SIZE = 1+10+9+1+325+8; // SYNC Header Gap SYNC Data Gap (should be 5 SYNC bytes each) +const int GCR_TRACK_SIZE = GCR_SECTOR_SIZE * 21; // Each track in gcr_data has 21 sectors +const int GCR_DISK_SIZE = GCR_TRACK_SIZE * NUM_TRACKS; + +// Job return codes +const int RET_OK = 1; // No error +const int RET_NOT_FOUND = 2; // Block not found +const int RET_NOT_READY = 15; // Drive not ready + + +// Number of sectors of each track +const int num_sectors[36] = { + 0, + 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, + 19,19,19,19,19,19,19, + 18,18,18,18,18,18, + 17,17,17,17,17 +}; + +// Sector offset of start of track in .d64 file +const int sector_offset[36] = { + 0, + 0,21,42,63,84,105,126,147,168,189,210,231,252,273,294,315,336, + 357,376,395,414,433,452,471, + 490,508,526,544,562,580, + 598,615,632,649,666 +}; + + +/* + * Constructor: Open .d64 file if processor-level 1541 + * emulation is enabled + */ + +Job1541::Job1541(uint8 *ram1541) : ram(ram1541) +{ + the_file = NULL; + + gcr_data = gcr_ptr = gcr_track_start = new uint8[GCR_DISK_SIZE]; + gcr_track_end = gcr_track_start + GCR_TRACK_SIZE; + current_halftrack = 2; + + disk_changed = true; + + if (ThePrefs.Emul1541Proc) + open_d64_file(ThePrefs.DrivePath[0]); +} + + +/* + * Destructor: Close .d64 file + */ + +Job1541::~Job1541() +{ + close_d64_file(); + delete[] gcr_data; +} + + +/* + * Preferences may have changed + */ + +void Job1541::NewPrefs(Prefs *prefs) +{ + // 1541 emulation turned off? + if (!prefs->Emul1541Proc) + close_d64_file(); + + // 1541 emulation turned on? + else if (!ThePrefs.Emul1541Proc && prefs->Emul1541Proc) + open_d64_file(prefs->DrivePath[0]); + + // .d64 file name changed? + else if (strcmp(ThePrefs.DrivePath[0], prefs->DrivePath[0])) { + close_d64_file(); + open_d64_file(prefs->DrivePath[0]); + disk_changed = true; + } +} + + +/* + * Open .d64 file + */ + +void Job1541::open_d64_file(char *filepath) +{ + long size; + uint8 magic[4]; + uint8 bam[256]; + + // Clear GCR buffer + memset(gcr_data, 0x55, GCR_DISK_SIZE); + + // Try opening the file for reading/writing first, then for reading only + write_protected = false; + the_file = fopen(filepath, "rb+"); + if (the_file == NULL) { + write_protected = true; + the_file = fopen(filepath, "rb"); + } + if (the_file != NULL) { + + // Check length + fseek(the_file, 0, SEEK_END); + if ((size = ftell(the_file)) < NUM_SECTORS * 256) { + fclose(the_file); + the_file = NULL; + return; + } + + // x64 image? + fseek(the_file, 0, SEEK_SET); + fread(&magic, 4, 1, the_file); + if (magic[0] == 0x43 && magic[1] == 0x15 && magic[2] == 0x41 && magic[3] == 0x64) + image_header = 64; + else + image_header = 0; + + // Preset error info (all sectors no error) + memset(error_info, 1, NUM_SECTORS); + + // Load sector error info from .d64 file, if present + if (!image_header && size == NUM_SECTORS * 257) { + fseek(the_file, NUM_SECTORS * 256, SEEK_SET); + fread(&error_info, NUM_SECTORS, 1, the_file); + }; + + // Read BAM and get ID + read_sector(18, 0, bam); + id1 = bam[162]; + id2 = bam[163]; + + // Create GCR encoded disk data from image + disk2gcr(); + } +} + + +/* + * Close .d64 file + */ + +void Job1541::close_d64_file(void) +{ + if (the_file != NULL) { + fclose(the_file); + the_file = NULL; + } +} + + +/* + * Write sector to disk (1541 ROM patch) + */ + +void Job1541::WriteSector(void) +{ + int track = ram[0x18]; + int sector = ram[0x19]; + uint16 buf = ram[0x30] | (ram[0x31] << 8); + + if (buf <= 0x0700) + if (write_sector(track, sector, ram + buf)) + sector2gcr(track, sector); +} + + +/* + * Format one track (1541 ROM patch) + */ + +void Job1541::FormatTrack(void) +{ + int track = ram[0x51]; + + // Get new ID + uint8 bufnum = ram[0x3d]; + id1 = ram[0x12 + bufnum]; + id2 = ram[0x13 + bufnum]; + + // Create empty block + uint8 buf[256]; + memset(buf, 1, 256); + buf[0] = 0x4b; + + // Write block to all sectors on track + for(int sector=0; sector GCR + * true: success, false: error + */ + +bool Job1541::write_sector(int track, int sector, uint8 *buffer) +{ + int offset; + + // Convert track/sector to byte offset in file + if ((offset = offset_from_ts(track, sector)) < 0) + return false; + + fseek(the_file, offset + image_header, SEEK_SET); + fwrite(buffer, 256, 1, the_file); + return true; +} + + +/* + * Convert track/sector to offset + */ + +int Job1541::secnum_from_ts(int track, int sector) +{ + return sector_offset[track] + sector; +} + +int Job1541::offset_from_ts(int track, int sector) +{ + if ((track < 1) || (track > NUM_TRACKS) || + (sector < 0) || (sector >= num_sectors[track])) + return -1; + + return (sector_offset[track] + sector) << 8; +} + + +/* + * Convert 4 bytes to 5 GCR encoded bytes + */ + +const uint16 gcr_table[16] = { + 0x0a, 0x0b, 0x12, 0x13, 0x0e, 0x0f, 0x16, 0x17, + 0x09, 0x19, 0x1a, 0x1b, 0x0d, 0x1d, 0x1e, 0x15 +}; + +void Job1541::gcr_conv4(uint8 *from, uint8 *to) +{ + uint16 g; + + g = (gcr_table[*from >> 4] << 5) | gcr_table[*from & 15]; + *to++ = g >> 2; + *to = (g << 6) & 0xc0; + from++; + + g = (gcr_table[*from >> 4] << 5) | gcr_table[*from & 15]; + *to++ |= (g >> 4) & 0x3f; + *to = (g << 4) & 0xf0; + from++; + + g = (gcr_table[*from >> 4] << 5) | gcr_table[*from & 15]; + *to++ |= (g >> 6) & 0x0f; + *to = (g << 2) & 0xfc; + from++; + + g = (gcr_table[*from >> 4] << 5) | gcr_table[*from & 15]; + *to++ |= (g >> 8) & 0x03; + *to = g; +} + + +/* + * Create GCR encoded disk data from image + */ + +void Job1541::sector2gcr(int track, int sector) +{ + uint8 block[256]; + uint8 buf[4]; + uint8 *p = gcr_data + (track-1) * GCR_TRACK_SIZE + sector * GCR_SECTOR_SIZE; + + read_sector(track, sector, block); + + // Create GCR header + *p++ = 0xff; // SYNC + buf[0] = 0x08; // Header mark + buf[1] = sector ^ track ^ id2 ^ id1; // Checksum + buf[2] = sector; + buf[3] = track; + gcr_conv4(buf, p); + buf[0] = id2; + buf[1] = id1; + buf[2] = 0x0f; + buf[3] = 0x0f; + gcr_conv4(buf, p+5); + p += 10; + memset(p, 0x55, 9); // Gap + p += 9; + + // Create GCR data + uint8 sum; + *p++ = 0xff; // SYNC + buf[0] = 0x07; // Data mark + sum = buf[1] = block[0]; + sum ^= buf[2] = block[1]; + sum ^= buf[3] = block[2]; + gcr_conv4(buf, p); + p += 5; + for (int i=3; i<255; i+=4) { + sum ^= buf[0] = block[i]; + sum ^= buf[1] = block[i+1]; + sum ^= buf[2] = block[i+2]; + sum ^= buf[3] = block[i+3]; + gcr_conv4(buf, p); + p += 5; + } + sum ^= buf[0] = block[255]; + buf[1] = sum; // Checksum + buf[2] = 0; + buf[3] = 0; + gcr_conv4(buf, p); + p += 5; + memset(p, 0x55, 8); // Gap +} + +void Job1541::disk2gcr(void) +{ + // Convert all tracks and sectors + for (int track=1; track<=NUM_TRACKS; track++) + for(int sector=0; sector> 1) - 1) * GCR_TRACK_SIZE; + gcr_track_end = gcr_track_start + num_sectors[current_halftrack >> 1] * GCR_SECTOR_SIZE; +} + + +/* + * Move R/W head in (higher track numbers) + */ + +void Job1541::MoveHeadIn(void) +{ + if (current_halftrack == NUM_TRACKS*2) + return; + current_halftrack++; + printf("Head move %d\n", current_halftrack); + gcr_ptr = gcr_track_start = gcr_data + ((current_halftrack >> 1) - 1) * GCR_TRACK_SIZE; + gcr_track_end = gcr_track_start + num_sectors[current_halftrack >> 1] * GCR_SECTOR_SIZE; +} + + +/* + * Get state + */ + +void Job1541::GetState(Job1541State *state) +{ + state->current_halftrack = current_halftrack; + state->gcr_ptr = gcr_ptr - gcr_data; + state->write_protected = write_protected; + state->disk_changed = disk_changed; +} + + +/* + * Set state + */ + +void Job1541::SetState(Job1541State *state) +{ + current_halftrack = state->current_halftrack; + gcr_ptr = gcr_data + state->gcr_ptr; + gcr_track_start = gcr_data + ((current_halftrack >> 1) - 1) * GCR_TRACK_SIZE; + gcr_track_end = gcr_track_start + num_sectors[current_halftrack >> 1] * GCR_SECTOR_SIZE; + write_protected = state->write_protected; + disk_changed = state->disk_changed; +} diff --git a/archive-sources/c64emu/1541job.h b/archive-sources/c64emu/1541job.h new file mode 100644 index 0000000..67e2efa --- /dev/null +++ b/archive-sources/c64emu/1541job.h @@ -0,0 +1,112 @@ +/* + * 1541job.h - Emulation of 1541 GCR disk reading/writing + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _1541JOB_H +#define _1541JOB_H + + +class MOS6502_1541; +class Prefs; +struct Job1541State; + +class Job1541 { +public: + Job1541(uint8 *ram1541); + ~Job1541(); + + void GetState(Job1541State *state); + void SetState(Job1541State *state); + void NewPrefs(Prefs *prefs); + void MoveHeadOut(void); + void MoveHeadIn(void); + bool SyncFound(void); + uint8 ReadGCRByte(void); + uint8 WPState(void); + void WriteSector(void); + void FormatTrack(void); + +private: + void open_d64_file(char *filepath); + void close_d64_file(void); + bool read_sector(int track, int sector, uint8 *buffer); + bool write_sector(int track, int sector, uint8 *buffer); + void format_disk(void); + int secnum_from_ts(int track, int sector); + int offset_from_ts(int track, int sector); + void gcr_conv4(uint8 *from, uint8 *to); + void sector2gcr(int track, int sector); + void disk2gcr(void); + + uint8 *ram; // Pointer to 1541 RAM + FILE *the_file; // File pointer for .d64 file + int image_header; // Length of .d64/.x64 file header + + uint8 id1, id2; // ID of disk + uint8 error_info[683]; // Sector error information (1 byte/sector) + + uint8 *gcr_data; // Pointer to GCR encoded disk data + uint8 *gcr_ptr; // Pointer to GCR data under R/W head + uint8 *gcr_track_start; // Pointer to start of GCR data of current track + uint8 *gcr_track_end; // Pointer to end of GCR data of current track + int current_halftrack; // Current halftrack number (2..70) + + bool write_protected; // Flag: Disk write-protected + bool disk_changed; // Flag: Disk changed (WP sensor strobe control) +}; + +// 1541 GCR state +struct Job1541State { + int current_halftrack; + uint32 gcr_ptr; + bool write_protected; + bool disk_changed; +}; + + +/* + * Check if R/W head is over SYNC + */ + +inline bool Job1541::SyncFound(void) +{ + if (*gcr_ptr == 0xff) + return true; + else { + gcr_ptr++; // Rotate disk + if (gcr_ptr == gcr_track_end) + gcr_ptr = gcr_track_start; + return false; + } +} + + +/* + * Read one GCR byte from disk + */ + +inline uint8 Job1541::ReadGCRByte(void) +{ + uint8 byte = *gcr_ptr++; // Rotate disk + if (gcr_ptr == gcr_track_end) + gcr_ptr = gcr_track_start; + return byte; +} + + +/* + * Return state of write protect sensor + */ + +inline uint8 Job1541::WPState(void) +{ + if (disk_changed) { // Disk change -> WP sensor strobe + disk_changed = false; + return write_protected ? 0x10 : 0; + } else + return write_protected ? 0 : 0x10; +} + +#endif diff --git a/archive-sources/c64emu/1541t64.cpp b/archive-sources/c64emu/1541t64.cpp new file mode 100644 index 0000000..18efaf5 --- /dev/null +++ b/archive-sources/c64emu/1541t64.cpp @@ -0,0 +1,715 @@ +/* + * 1541t64.cpp - 1541 emulation in .t64/LYNX file + * + * Frodo (C) 1994-1997 Christian Bauer + + * + * Notes: + * ------ + * + * - If any file is opened, the contents of the file in the + * .t64 file are copied into a temporary file which is used + * for reading. This is done to insert the load address. + * - C64 LYNX archives are also handled by these routines + * + * Incompatibilities: + * ------------------ + * + * - Only read accesses possible + * - No "raw" directory reading + * - No relative/sequential/user files + * - Only "I" and "UJ" commands implemented + */ + +#include "sysdeps.h" + +#include "1541t64.h" +#include "IEC.h" +#include "Prefs.h" + + +// Access modes +enum { + FMODE_READ, FMODE_WRITE, FMODE_APPEND +}; + +// File types +enum { + FTYPE_PRG, FTYPE_SEQ, FTYPE_USR, FTYPE_REL +}; + +// Prototypes +static bool match(char *p, char *n); + + +/* + * Constructor: Prepare emulation + */ + +T64Drive::T64Drive(IEC *iec, char *filepath) : Drive(iec) +{ + the_file = NULL; + file_info = NULL; + + Ready = false; + strcpy(orig_t64_name, filepath); + for (int i=0; i<16; i++) + file[i] = NULL; + + // Open .t64 file + open_close_t64_file(filepath); + if (the_file != NULL) { + Reset(); + Ready = true; + } +} + + +/* + * Destructor + */ + +T64Drive::~T64Drive() +{ + // Close .t64 file + open_close_t64_file(""); + + Ready = false; +} + + +/* + * Open/close the .t64/LYNX file + */ + +void T64Drive::open_close_t64_file(char *t64name) +{ + uint8 buf[64]; + bool parsed_ok = false; + + // Close old .t64, if open + if (the_file != NULL) { + close_all_channels(); + fclose(the_file); + the_file = NULL; + delete[] file_info; + file_info = NULL; + } + + // Open new .t64 file + if (t64name[0]) { + if ((the_file = fopen(t64name, "rb")) != NULL) { + + // Check file ID + fread(&buf, 64, 1, the_file); + if (buf[0] == 0x43 && buf[1] == 0x36 && buf[2] == 0x34) { + is_lynx = false; + parsed_ok = parse_t64_file(); + } else if (buf[0x3c] == 0x4c && buf[0x3d] == 0x59 && buf[0x3e] == 0x4e && buf[0x3f] == 0x58) { + is_lynx = true; + parsed_ok = parse_lynx_file(); + } + + if (!parsed_ok) { + fclose(the_file); + the_file = NULL; + delete[] file_info; + file_info = NULL; + return; + } + } + } +} + + +/* + * Parse .t64 file and construct FileInfo array + */ + +bool T64Drive::parse_t64_file(void) +{ + uint8 buf[32]; + uint8 *buf2; + char *p; + int max, i, j; + + // Read header and get maximum number of files contained + fseek(the_file, 32, SEEK_SET); + fread(&buf, 32, 1, the_file); + max = (buf[3] << 8) | buf[2]; + + memcpy(dir_title, buf+8, 16); + + // Allocate buffer for file records and read them + buf2 = new uint8[max*32]; + fread(buf2, 32, max, the_file); + + // Determine number of files contained + for (i=0, num_files=0; i destname + strncpy(destname, p, NAMEBUF_LENGTH); + + // Search for ',' + p = destname; + while (*p && (*p != ',')) p++; + + // Look for mode parameters seperated by ',' + p = destname; + while ((p = strchr(p, ',')) != NULL) { + + // Cut string after the first ',' + *p++ = 0; + + switch (*p) { + case 'P': + *filetype = FTYPE_PRG; + break; + case 'S': + *filetype = FTYPE_SEQ; + break; + case 'U': + *filetype = FTYPE_USR; + break; + case 'L': + *filetype = FTYPE_REL; + break; + case 'R': + *filemode = FMODE_READ; + break; + case 'W': + *filemode = FMODE_WRITE; + break; + case 'A': + *filemode = FMODE_APPEND; + break; + } + } +} + + +/* + * Find first file matching wildcard pattern + */ + +// Return true if name 'n' matches pattern 'p' +static bool match(char *p, char *n) +{ + if (!*p) // Null pattern matches everything + return true; + + do { + if (*p == '*') // Wildcard '*' matches all following characters + return true; + if ((*p != *n) && (*p != '?')) // Wildcard '?' matches single character + return false; + p++; n++; + } while (*p); + + return !(*n); +} + +bool T64Drive::find_first_file(char *name, int type, int *num) +{ + for (int i=0; i> 8) & 0xff; + + p++; + if (i < 10) p++; // Less than 10: add one space + if (i < 100) p++; // Less than 100: add another space + + // Convert and insert file name + strcpy(str, file_info[num].name); + *p++ = '\"'; + q = p; + for (i=0; i<16 && str[i]; i++) + *q++ = str[i]; + *q++ = '\"'; + p += 18; + + // File type + switch (file_info[num].type) { + case FTYPE_PRG: + *p++ = 'P'; + *p++ = 'R'; + *p++ = 'G'; + break; + case FTYPE_SEQ: + *p++ = 'S'; + *p++ = 'E'; + *p++ = 'Q'; + break; + case FTYPE_USR: + *p++ = 'U'; + *p++ = 'S'; + *p++ = 'R'; + break; + case FTYPE_REL: + *p++ = 'R'; + *p++ = 'E'; + *p++ = 'L'; + break; + default: + *p++ = '?'; + *p++ = '?'; + *p++ = '?'; + break; + } + + // Write line + fwrite(buf, 1, 32, file[channel]); + } + } + + // Final line + fwrite("\001\001\0\0BLOCKS FREE. \0\0", 1, 32, file[channel]); + + // Rewind file for reading and read first byte + rewind(file[channel]); + read_char[channel] = fgetc(file[channel]); + + return ST_OK; +} + + +/* + * Close channel + */ + +uint8 T64Drive::Close(int channel) +{ + if (channel == 15) { + close_all_channels(); + return ST_OK; + } + + if (file[channel]) { + fclose(file[channel]); + file[channel] = NULL; + } + + return ST_OK; +} + + +/* + * Close all channels + */ + +void T64Drive::close_all_channels(void) +{ + for (int i=0; i<15; i++) + Close(i); + + cmd_len = 0; +} + + +/* + * Read from channel + */ + +uint8 T64Drive::Read(int channel, uint8 *byte) +{ + int c; + + // Channel 15: Error channel + if (channel == 15) { + *byte = *error_ptr++; + + if (*byte != '\r') + return ST_OK; + else { // End of message + set_error(ERR_OK); + return ST_EOF; + } + } + + if (!file[channel]) return ST_READ_TIMEOUT; + + // Get char from buffer and read next + *byte = read_char[channel]; + c = fgetc(file[channel]); + if (c == EOF) + return ST_EOF; + else { + read_char[channel] = c; + return ST_OK; + } +} + + +/* + * Write to channel + */ + +uint8 T64Drive::Write(int channel, uint8 byte, bool eoi) +{ + // Channel 15: Collect chars and execute command on EOI + if (channel == 15) { + if (cmd_len >= 40) + return ST_TIMEOUT; + + cmd_buffer[cmd_len++] = byte; + + if (eoi) { + cmd_buffer[cmd_len] = 0; + cmd_len = 0; + execute_command(cmd_buffer); + } + return ST_OK; + } + + if (!file[channel]) + set_error(ERR_FILENOTOPEN); + else + set_error(ERR_WRITEPROTECT); + + return ST_TIMEOUT; +} + + +/* + * Execute command string + */ + +void T64Drive::execute_command(char *command) +{ + switch (command[0]) { + case 'I': + close_all_channels(); + set_error(ERR_OK); + break; + + case 'U': + if ((command[1] & 0x0f) == 0x0a) { + Reset(); + } else + set_error(ERR_SYNTAX30); + break; + + case 'G': + if (command[1] != ':') + set_error(ERR_SYNTAX30); + else + cht64_cmd(&command[2]); + break; + + default: + set_error(ERR_SYNTAX30); + } +} + + +/* + * Execute 'G' command + */ + +void T64Drive::cht64_cmd(char *t64name) +{ + char str[NAMEBUF_LENGTH]; + char *p = str; + + // Convert .t64 file name + for (int i=0; iASCII + */ + +uint8 T64Drive::conv_from_64(uint8 c, bool map_slash) +{ + if ((c >= 'A') && (c <= 'Z') || (c >= 'a') && (c <= 'z')) + return c ^ 0x20; + if ((c >= 0xc1) && (c <= 0xda)) + return c ^ 0x80; + if ((c == '/') && map_slash && ThePrefs.MapSlash) + return '\\'; + return c; +} diff --git a/archive-sources/c64emu/1541t64.h b/archive-sources/c64emu/1541t64.h new file mode 100644 index 0000000..5ec5067 --- /dev/null +++ b/archive-sources/c64emu/1541t64.h @@ -0,0 +1,62 @@ +/* + * 1541t64.h - 1541 emulation in .t64/LYNX file + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _1541T64_H +#define _1541T64_H + +#include "IEC.h" + + +// Information for file inside a .t64 file +typedef struct { + char name[17]; // File name, PETSCII + uint8 type; // File type + uint8 sa_lo, sa_hi; // Start address + int offset; // Offset of first byte in .t64 file + int length; // Length of file +} FileInfo; + + +class T64Drive : public Drive { +public: + T64Drive(IEC *iec, char *filepath); + virtual ~T64Drive(); + virtual uint8 Open(int channel, char *filename); + virtual uint8 Close(int channel); + virtual uint8 Read(int channel, uint8 *byte); + virtual uint8 Write(int channel, uint8 byte, bool eoi); + virtual void Reset(void); + +private: + void open_close_t64_file(char *t64name); + bool parse_t64_file(void); + bool parse_lynx_file(void); + uint8 open_file(int channel, char *filename); + uint8 open_directory(int channel, char *filename); + void convert_filename(char *srcname, char *destname, int *filemode, int *filetype); + bool find_first_file(char *name, int type, int *num); + void close_all_channels(void); + void execute_command(char *command); + void cht64_cmd(char *t64path); + uint8 conv_from_64(uint8 c, bool map_slash); + + FILE *the_file; // File pointer for .t64 file + bool is_lynx; // Flag: .t64 file is really a LYNX archive + + char orig_t64_name[256]; // Original path of .t64 file + char dir_title[16]; // Directory title + FILE *file[16]; // File pointers for each of the 16 channels (all temporary files) + + int num_files; // Number of files in .t64 file and in file_info array + FileInfo *file_info; // Pointer to array of file information structs for each file + + char cmd_buffer[44]; // Buffer for incoming command strings + int cmd_len; // Length of received command + + uint8 read_char[16]; // Buffers for one-byte read-ahead +}; + +#endif diff --git a/archive-sources/c64emu/C64.cpp b/archive-sources/c64emu/C64.cpp new file mode 100644 index 0000000..13e62e3 --- /dev/null +++ b/archive-sources/c64emu/C64.cpp @@ -0,0 +1,665 @@ +/* + * C64.cpp - Put the pieces together + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysdeps.h" + +#include "C64.h" +#include "CPUC64.h" +#include "CPU1541.h" +#include "VIC.h" +#include "SID.h" +#include "CIA.h" +#include "REU.h" +#include "IEC.h" +#include "1541job.h" +#include "Display.h" +#include "Prefs.h" + +#ifdef FRODO_SC +bool IsFrodoSC = true; +#else +bool IsFrodoSC = false; +#endif + + +/* + * Constructor: Allocate objects and memory + */ + +C64::C64() +{ + int i,j; + uint8 *p; + + // The thread is not yet running + thread_running = false; + quit_thyself = false; + have_a_break = false; + + // System-dependent things + c64_ctor1(); + + // Open display + TheDisplay = new C64Display(this); + + // Allocate RAM/ROM memory + RAM = new uint8[0x10000]; + Basic = new uint8[0x2000]; + Kernal = new uint8[0x2000]; + Char = new uint8[0x1000]; + Color = new uint8[0x0400]; + RAM1541 = new uint8[0x0800]; + ROM1541 = new uint8[0x4000]; + + // Create the chips + TheCPU = new MOS6510(this, RAM, Basic, Kernal, Char, Color); + + TheJob1541 = new Job1541(RAM1541); + TheCPU1541 = new MOS6502_1541(this, TheJob1541, TheDisplay, RAM1541, ROM1541); + + TheVIC = TheCPU->TheVIC = new MOS6569(this, TheDisplay, TheCPU, RAM, Char, Color); + TheSID = TheCPU->TheSID = new MOS6581(this); + TheCIA1 = TheCPU->TheCIA1 = new MOS6526_1(TheCPU, TheVIC); + TheCIA2 = TheCPU->TheCIA2 = TheCPU1541->TheCIA2 = new MOS6526_2(TheCPU, TheVIC, TheCPU1541); + TheIEC = TheCPU->TheIEC = new IEC(TheDisplay); + TheREU = TheCPU->TheREU = new REU(TheCPU); + + // Initialize RAM with powerup pattern + for (i=0, p=RAM; i<512; i++) { + for (j=0; j<64; j++) + *p++ = 0; + for (j=0; j<64; j++) + *p++ = 0xff; + } + + // Initialize color RAM with random values + for (i=0, p=Color; i<1024; i++) + *p++ = rand() & 0x0f; + + // Clear 1541 RAM + memset(RAM1541, 0, 0x800); + + // Open joystick drivers if required + open_close_joysticks(false, false, ThePrefs.Joystick1On, ThePrefs.Joystick2On); + joykey = 0xff; + +#ifdef FRODO_SC + CycleCounter = 0; +#endif + + // System-dependent things + c64_ctor2(); +} + + +/* + * Destructor: Delete all objects + */ + +C64::~C64() +{ + open_close_joysticks(ThePrefs.Joystick1On, ThePrefs.Joystick2On, false, false); + + delete TheJob1541; + delete TheREU; + delete TheIEC; + delete TheCIA2; + delete TheCIA1; + delete TheSID; + delete TheVIC; + delete TheCPU1541; + delete TheCPU; + delete TheDisplay; + + delete[] RAM; + delete[] Basic; + delete[] Kernal; + delete[] Char; + delete[] Color; + delete[] RAM1541; + delete[] ROM1541; + + c64_dtor(); +} + + +/* + * Reset C64 + */ + +void C64::Reset(void) +{ + TheCPU->AsyncReset(); + TheCPU1541->AsyncReset(); + TheSID->Reset(); + TheCIA1->Reset(); + TheCIA2->Reset(); + TheIEC->Reset(); +} + + +/* + * NMI C64 + */ + +void C64::NMI(void) +{ + TheCPU->AsyncNMI(); +} + + +/* + * The preferences have changed. prefs is a pointer to the new + * preferences, ThePrefs still holds the previous ones. + * The emulation must be in the paused state! + */ + +void C64::NewPrefs(Prefs *prefs) +{ + open_close_joysticks(ThePrefs.Joystick1On, ThePrefs.Joystick2On, prefs->Joystick1On, prefs->Joystick2On); + PatchKernal(prefs->FastReset, prefs->Emul1541Proc); + + TheDisplay->NewPrefs(prefs); + + TheIEC->NewPrefs(prefs); + TheJob1541->NewPrefs(prefs); + + TheREU->NewPrefs(prefs); + TheSID->NewPrefs(prefs); + + // Reset 1541 processor if turned on + if (!ThePrefs.Emul1541Proc && prefs->Emul1541Proc) + TheCPU1541->AsyncReset(); +} + + +/* + * Patch kernal IEC routines + */ + +void C64::PatchKernal(bool fast_reset, bool emul_1541_proc) +{ + if (fast_reset) { + Kernal[0x1d84] = 0xa0; + Kernal[0x1d85] = 0x00; + } else { + Kernal[0x1d84] = orig_kernal_1d84; + Kernal[0x1d85] = orig_kernal_1d85; + } + + if (emul_1541_proc) { + Kernal[0x0d40] = 0x78; + Kernal[0x0d41] = 0x20; + Kernal[0x0d23] = 0x78; + Kernal[0x0d24] = 0x20; + Kernal[0x0d36] = 0x78; + Kernal[0x0d37] = 0x20; + Kernal[0x0e13] = 0x78; + Kernal[0x0e14] = 0xa9; + Kernal[0x0def] = 0x78; + Kernal[0x0df0] = 0x20; + Kernal[0x0dbe] = 0xad; + Kernal[0x0dbf] = 0x00; + Kernal[0x0dcc] = 0x78; + Kernal[0x0dcd] = 0x20; + Kernal[0x0e03] = 0x20; + Kernal[0x0e04] = 0xbe; + } else { + Kernal[0x0d40] = 0xf2; // IECOut + Kernal[0x0d41] = 0x00; + Kernal[0x0d23] = 0xf2; // IECOutATN + Kernal[0x0d24] = 0x01; + Kernal[0x0d36] = 0xf2; // IECOutSec + Kernal[0x0d37] = 0x02; + Kernal[0x0e13] = 0xf2; // IECIn + Kernal[0x0e14] = 0x03; + Kernal[0x0def] = 0xf2; // IECSetATN + Kernal[0x0df0] = 0x04; + Kernal[0x0dbe] = 0xf2; // IECRelATN + Kernal[0x0dbf] = 0x05; + Kernal[0x0dcc] = 0xf2; // IECTurnaround + Kernal[0x0dcd] = 0x06; + Kernal[0x0e03] = 0xf2; // IECRelease + Kernal[0x0e04] = 0x07; + } + + // 1541 + ROM1541[0x2ae4] = 0xea; // Don't check ROM checksum + ROM1541[0x2ae5] = 0xea; + ROM1541[0x2ae8] = 0xea; + ROM1541[0x2ae9] = 0xea; + ROM1541[0x2c9b] = 0xf2; // DOS idle loop + ROM1541[0x2c9c] = 0x00; + ROM1541[0x3594] = 0x20; // Write sector + ROM1541[0x3595] = 0xf2; + ROM1541[0x3596] = 0xf5; + ROM1541[0x3597] = 0xf2; + ROM1541[0x3598] = 0x01; + ROM1541[0x3b0c] = 0xf2; // Format track + ROM1541[0x3b0d] = 0x02; +} + + +/* + * Save RAM contents + */ + +void C64::SaveRAM(char *filename) +{ + FILE *f; + + if ((f = fopen(filename, "wb")) == NULL) + ShowRequester("RAM save failed.", "OK", NULL); + else { + fwrite((void*)RAM, 1, 0x10000, f); + fwrite((void*)Color, 1, 0x400, f); + if (ThePrefs.Emul1541Proc) + fwrite((void*)RAM1541, 1, 0x800, f); + fclose(f); + } +} + + +/* + * Save CPU state to snapshot + * + * 0: Error + * 1: OK + * -1: Instruction not completed + */ + +int C64::SaveCPUState(FILE *f) +{ + MOS6510State state; + TheCPU->GetState(&state); + + if (!state.instruction_complete) + return -1; + + int i = fwrite(RAM, 0x10000, 1, f); + i += fwrite(Color, 0x400, 1, f); + i += fwrite((void*)&state, sizeof(state), 1, f); + + return i == 3; +} + + +/* + * Load CPU state from snapshot + */ + +bool C64::LoadCPUState(FILE *f) +{ + MOS6510State state; + + int i = fread(RAM, 0x10000, 1, f); + i += fread(Color, 0x400, 1, f); + i += fread((void*)&state, sizeof(state), 1, f); + + if (i == 3) { + TheCPU->SetState(&state); + return true; + } else + return false; +} + + +/* + * Save 1541 state to snapshot + * + * 0: Error + * 1: OK + * -1: Instruction not completed + */ + +int C64::Save1541State(FILE *f) +{ + MOS6502State state; + TheCPU1541->GetState(&state); + + if (!state.idle && !state.instruction_complete) + return -1; + + int i = fwrite(RAM1541, 0x800, 1, f); + i += fwrite((void*)&state, sizeof(state), 1, f); + + return i == 2; +} + + +/* + * Load 1541 state from snapshot + */ + +bool C64::Load1541State(FILE *f) +{ + MOS6502State state; + + int i = fread(RAM1541, 0x800, 1, f); + i += fread((void*)&state, sizeof(state), 1, f); + + if (i == 2) { + TheCPU1541->SetState(&state); + return true; + } else + return false; +} + + +/* + * Save VIC state to snapshot + */ + +bool C64::SaveVICState(FILE *f) +{ + MOS6569State state; + TheVIC->GetState(&state); + return fwrite((void*)&state, sizeof(state), 1, f) == 1; +} + + +/* + * Load VIC state from snapshot + */ + +bool C64::LoadVICState(FILE *f) +{ + MOS6569State state; + + if (fread((void*)&state, sizeof(state), 1, f) == 1) { + TheVIC->SetState(&state); + return true; + } else + return false; +} + + +/* + * Save SID state to snapshot + */ + +bool C64::SaveSIDState(FILE *f) +{ + MOS6581State state; + TheSID->GetState(&state); + return fwrite((void*)&state, sizeof(state), 1, f) == 1; +} + + +/* + * Load SID state from snapshot + */ + +bool C64::LoadSIDState(FILE *f) +{ + MOS6581State state; + + if (fread((void*)&state, sizeof(state), 1, f) == 1) { + TheSID->SetState(&state); + return true; + } else + return false; +} + + +/* + * Save CIA states to snapshot + */ + +bool C64::SaveCIAState(FILE *f) +{ + MOS6526State state; + TheCIA1->GetState(&state); + + if (fwrite((void*)&state, sizeof(state), 1, f) == 1) { + TheCIA2->GetState(&state); + return fwrite((void*)&state, sizeof(state), 1, f) == 1; + } else + return false; +} + + +/* + * Load CIA states from snapshot + */ + +bool C64::LoadCIAState(FILE *f) +{ + MOS6526State state; + + if (fread((void*)&state, sizeof(state), 1, f) == 1) { + TheCIA1->SetState(&state); + if (fread((void*)&state, sizeof(state), 1, f) == 1) { + TheCIA2->SetState(&state); + return true; + } else + return false; + } else + return false; +} + + +/* + * Save 1541 GCR state to snapshot + */ + +bool C64::Save1541JobState(FILE *f) +{ + Job1541State state; + TheJob1541->GetState(&state); + return fwrite((void*)&state, sizeof(state), 1, f) == 1; +} + + +/* + * Load 1541 GCR state from snapshot + */ + +bool C64::Load1541JobState(FILE *f) +{ + Job1541State state; + + if (fread((void*)&state, sizeof(state), 1, f) == 1) { + TheJob1541->SetState(&state); + return true; + } else + return false; +} + + +#define SNAPSHOT_HEADER "FrodoSnapshot" +#define SNAPSHOT_1541 1 + +#define ADVANCE_CYCLES \ + TheVIC->EmulateCycle(); \ + TheCIA1->EmulateCycle(); \ + TheCIA2->EmulateCycle(); \ + TheCPU->EmulateCycle(); \ + if (ThePrefs.Emul1541Proc) { \ + TheCPU1541->CountVIATimers(1); \ + if (!TheCPU1541->Idle) \ + TheCPU1541->EmulateCycle(); \ + } + + +/* + * Save snapshot (emulation must be paused and in VBlank) + * + * To be able to use SC snapshots with SL, SC snapshots are made thus that no + * partially dealt with instructions are saved. Instead all devices are advanced + * cycle by cycle until the current instruction has been finished. The number of + * cycles this takes is saved in the snapshot and will be reconstructed if the + * snapshot is loaded into FrodoSC again. + */ + +void C64::SaveSnapshot(char *filename) +{ + FILE *f; + uint8 flags; + uint8 delay; + int stat; + + if ((f = fopen(filename, "wb")) == NULL) { + ShowRequester("Unable to open snapshot file", "OK", NULL); + return; + } + + fprintf(f, "%s%c", SNAPSHOT_HEADER, 10); + fputc(0, f); // Version number 0 + flags = 0; + if (ThePrefs.Emul1541Proc) + flags |= SNAPSHOT_1541; + fputc(flags, f); + SaveVICState(f); + SaveSIDState(f); + SaveCIAState(f); + +#ifdef FRODO_SC + delay = 0; + do { + if ((stat = SaveCPUState(f)) == -1) { // -1 -> Instruction not finished yet + ADVANCE_CYCLES; // Advance everything by one cycle + delay++; + } + } while (stat == -1); + fputc(delay, f); // Number of cycles the saved CPUC64 lags behind the previous chips +#else + SaveCPUState(f); + fputc(0, f); // No delay +#endif + + if (ThePrefs.Emul1541Proc) { + fwrite(ThePrefs.DrivePath[0], 256, 1, f); +#ifdef FRODO_SC + delay = 0; + do { + if ((stat = Save1541State(f)) == -1) { + ADVANCE_CYCLES; + delay++; + } + } while (stat == -1); + fputc(delay, f); +#else + Save1541State(f); + fputc(0, f); // No delay +#endif + Save1541JobState(f); + } + fclose(f); + +} + + +/* + * Load snapshot (emulation must be paused and in VBlank) + */ + +bool C64::LoadSnapshot(char *filename) +{ + FILE *f; + + if ((f = fopen(filename, "rb")) != NULL) { + char Header[] = SNAPSHOT_HEADER; + char *b = Header, c = 0; + uint8 delay, i; + + // For some reason memcmp()/strcmp() and so forth utterly fail here. + while (*b > 32) { + if ((c = fgetc(f)) != *b++) { + b = NULL; + break; + } + } + if (b != NULL) { + uint8 flags; + bool error = false; +#ifndef FRODO_SC + long vicptr; // File offset of VIC data +#endif + + while (c != 10) + c = fgetc(f); // Shouldn't be necessary + if (fgetc(f) != 0) { + ShowRequester("Unknown snapshot format", "OK", NULL); + fclose(f); + return false; + } + flags = fgetc(f); +#ifndef FRODO_SC + vicptr = ftell(f); +#endif + + error |= !LoadVICState(f); + error |= !LoadSIDState(f); + error |= !LoadCIAState(f); + error |= !LoadCPUState(f); + + delay = fgetc(f); // Number of cycles the 6510 is ahead of the previous chips +#ifdef FRODO_SC + // Make the other chips "catch up" with the 6510 + for (i=0; iEmulateCycle(); + TheCIA1->EmulateCycle(); + TheCIA2->EmulateCycle(); + } +#endif + if ((flags & SNAPSHOT_1541) != 0) { + Prefs *prefs = new Prefs(ThePrefs); + + // First switch on emulation + error |= (fread(prefs->DrivePath[0], 256, 1, f) != 1); + prefs->Emul1541Proc = true; + NewPrefs(prefs); + ThePrefs = *prefs; + delete prefs; + + // Then read the context + error |= !Load1541State(f); + + delay = fgetc(f); // Number of cycles the 6502 is ahead of the previous chips +#ifdef FRODO_SC + // Make the other chips "catch up" with the 6502 + for (i=0; iEmulateCycle(); + TheCIA1->EmulateCycle(); + TheCIA2->EmulateCycle(); + TheCPU->EmulateCycle(); + } +#endif + Load1541JobState(f); + } else if (ThePrefs.Emul1541Proc) { // No emulation in snapshot, but currently active? + Prefs *prefs = new Prefs(ThePrefs); + prefs->Emul1541Proc = false; + NewPrefs(prefs); + ThePrefs = *prefs; + delete prefs; + } + +#ifndef FRODO_SC + fseek(f, vicptr, SEEK_SET); + LoadVICState(f); // Load VIC data twice in SL (is REALLY necessary sometimes!) +#endif + fclose(f); + + if (error) { + ShowRequester("Error reading snapshot file", "OK", NULL); + Reset(); + return false; + } else + return true; + } else { + fclose(f); + ShowRequester("Not a Frodo snapshot file", "OK", NULL); + return false; + } + } else { + ShowRequester("Can't open snapshot file", "OK", NULL); + return false; + } +} + + +#include "C64_x.i" diff --git a/archive-sources/c64emu/C64.h b/archive-sources/c64emu/C64.h new file mode 100644 index 0000000..bf353ef --- /dev/null +++ b/archive-sources/c64emu/C64.h @@ -0,0 +1,103 @@ +/* + * C64.h - Put the pieces together + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _C64_H +#define _C64_H + +// false: Frodo, true: FrodoSC +extern bool IsFrodoSC; + + +class Prefs; +class C64Display; +class MOS6510; +class MOS6569; +class MOS6581; +class MOS6526_1; +class MOS6526_2; +class IEC; +class REU; +class MOS6502_1541; +class Job1541; +class CmdPipe; + +class C64 { +public: + C64(); + ~C64(); + + void Run(void); + void Quit(void); + void Pause(void); + void Resume(void); + void Reset(void); + void NMI(void); + void VBlank(bool draw_frame); + void NewPrefs(Prefs *prefs); + void PatchKernal(bool fast_reset, bool emul_1541_proc); + void SaveRAM(char *filename); + void SaveSnapshot(char *filename); + bool LoadSnapshot(char *filename); + int SaveCPUState(FILE *f); + int Save1541State(FILE *f); + bool Save1541JobState(FILE *f); + bool SaveVICState(FILE *f); + bool SaveSIDState(FILE *f); + bool SaveCIAState(FILE *f); + bool LoadCPUState(FILE *f); + bool Load1541State(FILE *f); + bool Load1541JobState(FILE *f); + bool LoadVICState(FILE *f); + bool LoadSIDState(FILE *f); + bool LoadCIAState(FILE *f); + + uint8 *RAM, *Basic, *Kernal, + *Char, *Color; // C64 + uint8 *RAM1541, *ROM1541; // 1541 + + C64Display *TheDisplay; + + MOS6510 *TheCPU; // C64 + MOS6569 *TheVIC; + MOS6581 *TheSID; + MOS6526_1 *TheCIA1; + MOS6526_2 *TheCIA2; + IEC *TheIEC; + REU *TheREU; + + MOS6502_1541 *TheCPU1541; // 1541 + Job1541 *TheJob1541; + +#ifdef FRODO_SC + uint32 CycleCounter; +#endif + +private: + void c64_ctor1(void); + void c64_ctor2(void); + void c64_dtor(void); + void open_close_joysticks(bool oldjoy1, bool oldjoy2, bool newjoy1, bool newjoy2); + uint8 poll_joystick(int port); + void thread_func(void); + + bool thread_running; // Emulation thread is running + bool quit_thyself; // Emulation thread shall quit + bool have_a_break; // Emulation thread shall pause + + int joy_minx, joy_maxx, joy_miny, joy_maxy; // For dynamic joystick calibration + uint8 joykey; // Joystick keyboard emulation mask value + + uint8 orig_kernal_1d84, // Original contents of kernal locations $1d84 and $1d85 + orig_kernal_1d85; // (for undoing the Fast Reset patch) + + int joyfd[2]; // File descriptors for joysticks + double speed_index; +public: + CmdPipe *gui; +}; + + +#endif diff --git a/archive-sources/c64emu/C64_x.i b/archive-sources/c64emu/C64_x.i new file mode 100644 index 0000000..82c6fa7 --- /dev/null +++ b/archive-sources/c64emu/C64_x.i @@ -0,0 +1,339 @@ +/* + * C64_x.i - Put the pieces together, X specific stuff + * + * Frodo (C) 1994-1997 Christian Bauer + * Unix stuff by Bernd Schmidt/Lutz Vieweg + */ + +#include "main.h" + + +static struct timeval tv_start; + +#ifndef HAVE_USLEEP +/* + * NAME: + * usleep -- This is the precision timer for Test Set + * Automation. It uses the select(2) system + * call to delay for the desired number of + * micro-seconds. This call returns ZERO + * (which is usually ignored) on successful + * completion, -1 otherwise. + * + * ALGORITHM: + * 1) We range check the passed in microseconds and log a + * warning message if appropriate. We then return without + * delay, flagging an error. + * 2) Load the Seconds and micro-seconds portion of the + * interval timer structure. + * 3) Call select(2) with no file descriptors set, just the + * timer, this results in either delaying the proper + * ammount of time or being interupted early by a signal. + * + * HISTORY: + * Added when the need for a subsecond timer was evident. + * + * AUTHOR: + * Michael J. Dyer Telephone: AT&T 414.647.4044 + * General Electric Medical Systems GE DialComm 8 *767.4044 + * P.O. Box 414 Mail Stop 12-27 Sect'y AT&T 414.647.4584 + * Milwaukee, Wisconsin USA 53201 8 *767.4584 + * internet: mike@sherlock.med.ge.com GEMS WIZARD e-mail: DYER + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +int usleep(unsigned long int microSeconds) +{ + unsigned int Seconds, uSec; + int nfds, readfds, writefds, exceptfds; + struct timeval Timer; + + nfds = readfds = writefds = exceptfds = 0; + + if( (microSeconds == (unsigned long) 0) + || microSeconds > (unsigned long) 4000000 ) + { + errno = ERANGE; /* value out of range */ + perror( "usleep time out of range ( 0 -> 4000000 ) " ); + return -1; + } + + Seconds = microSeconds / (unsigned long) 1000000; + uSec = microSeconds % (unsigned long) 1000000; + + Timer.tv_sec = Seconds; + Timer.tv_usec = uSec; + + if( select( nfds, &readfds, &writefds, &exceptfds, &Timer ) < 0 ) + { + perror( "usleep (select) failed" ); + return -1; + } + + return 0; +} +#endif + + +/* + * Constructor, system-dependent things + */ + +void C64::c64_ctor1(void) +{ + // Initialize joystick variables + joyfd[0] = joyfd[1] = -1; + joy_minx = joy_miny = 32767; + joy_maxx = joy_maxy = -32768; + + // we need to create a potential GUI subprocess here, because we don't want + // it to inherit file-descriptors (such as for the audio-device and alike..) + gui = 0; +} + +void C64::c64_ctor2(void) +{ + gettimeofday(&tv_start, NULL); +} + + +/* + * Destructor, system-dependent things + */ + +void C64::c64_dtor(void) +{ +} + + +/* + * Start main emulation thread + */ + +void C64::Run(void) +{ + // Reset chips + TheCPU->Reset(); + TheSID->Reset(); + TheCIA1->Reset(); + TheCIA2->Reset(); + TheCPU1541->Reset(); + + // Patch kernal IEC routines + orig_kernal_1d84 = Kernal[0x1d84]; + orig_kernal_1d85 = Kernal[0x1d85]; + PatchKernal(ThePrefs.FastReset, ThePrefs.Emul1541Proc); + + quit_thyself = false; + thread_func(); +} + + +/* + * Vertical blank: Poll keyboard and joysticks, update window + */ + +void C64::VBlank(bool draw_frame) +{ + // Poll keyboard + TheDisplay->PollKeyboard(TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey); + if (TheDisplay->quit_requested) + quit_thyself = true; + + // Poll joysticks + TheCIA1->Joystick1 = poll_joystick(0); + TheCIA1->Joystick2 = poll_joystick(1); + + if (ThePrefs.JoystickSwap) { + uint8 tmp = TheCIA1->Joystick1; + TheCIA1->Joystick1 = TheCIA1->Joystick2; + TheCIA1->Joystick2 = tmp; + } + + // Joystick keyboard emulation + if (TheDisplay->NumLock()) + TheCIA1->Joystick1 &= joykey; + else + TheCIA1->Joystick2 &= joykey; + + // Count TOD clocks + TheCIA1->CountTOD(); + TheCIA2->CountTOD(); + + // Update window if needed + if (draw_frame) { + TheDisplay->Update(); + + // Calculate time between VBlanks, display speedometer + struct timeval tv; + gettimeofday(&tv, NULL); + if ((tv.tv_usec -= tv_start.tv_usec) < 0) { + tv.tv_usec += 1000000; + tv.tv_sec -= 1; + } + tv.tv_sec -= tv_start.tv_sec; + double elapsed_time = (double)tv.tv_sec * 1000000 + tv.tv_usec; + speed_index = 20000 / (elapsed_time + 1) * ThePrefs.SkipFrames * 100; + + // Limit speed to 100% if desired + if ((speed_index > 100) && ThePrefs.LimitSpeed) { + usleep((unsigned long)(ThePrefs.SkipFrames * 20000 - elapsed_time)); + speed_index = 100; + } + + gettimeofday(&tv_start, NULL); + + TheDisplay->Speedometer((int)speed_index); + } +} + + +/* + * Open/close joystick drivers given old and new state of + * joystick preferences + */ + +void C64::open_close_joysticks(bool oldjoy1, bool oldjoy2, bool newjoy1, bool newjoy2) +{ +#ifdef HAVE_LINUX_JOYSTICK_H + if (oldjoy1 != newjoy1) { + joy_minx = joy_miny = 32767; // Reset calibration + joy_maxx = joy_maxy = -32768; + if (newjoy1) { + joyfd[0] = open("/dev/js0", O_RDONLY); + if (joyfd[0] < 0) + fprintf(stderr, "Couldn't open joystick 1\n"); + } else { + close(joyfd[0]); + joyfd[0] = -1; + } + } + + if (oldjoy2 != newjoy2) { + joy_minx = joy_miny = 32767; // Reset calibration + joy_maxx = joy_maxy = -32768; + if (newjoy2) { + joyfd[1] = open("/dev/js1", O_RDONLY); + if (joyfd[1] < 0) + fprintf(stderr, "Couldn't open joystick 2\n"); + } else { + close(joyfd[1]); + joyfd[1] = -1; + } + } +#endif +} + + +/* + * Poll joystick port, return CIA mask + */ + +uint8 C64::poll_joystick(int port) +{ +#ifdef HAVE_LINUX_JOYSTICK_H + JS_DATA_TYPE js; + uint8 j = 0xff; + + if (joyfd[port] >= 0) { + if (read(joyfd[port], &js, JS_RETURN) == JS_RETURN) { + if (js.x > joy_maxx) + joy_maxx = js.x; + if (js.x < joy_minx) + joy_minx = js.x; + if (js.y > joy_maxy) + joy_maxy = js.y; + if (js.y < joy_miny) + joy_miny = js.y; + + if (joy_maxx-joy_minx < 100 || joy_maxy-joy_miny < 100) + return 0xff; + + if (js.x < (joy_minx + (joy_maxx-joy_minx)/3)) + j &= 0xfb; // Left + else if (js.x > (joy_minx + 2*(joy_maxx-joy_minx)/3)) + j &= 0xf7; // Right + + if (js.y < (joy_miny + (joy_maxy-joy_miny)/3)) + j &= 0xfe; // Up + else if (js.y > (joy_miny + 2*(joy_maxy-joy_miny)/3)) + j &= 0xfd; // Down + + if (js.buttons & 1) + j &= 0xef; // Button + } + } + return j; +#else + return 0xff; +#endif +} + + +/* + * The emulation's main loop + */ + +void C64::thread_func(void) +{ + int linecnt = 0; + +#ifdef FRODO_SC + while (!quit_thyself) { + + // The order of calls is important here + if (TheVIC->EmulateCycle()) + TheSID->EmulateLine(); + TheCIA1->CheckIRQs(); + TheCIA2->CheckIRQs(); + TheCIA1->EmulateCycle(); + TheCIA2->EmulateCycle(); + TheCPU->EmulateCycle(); + + if (ThePrefs.Emul1541Proc) { + TheCPU1541->CountVIATimers(1); + if (!TheCPU1541->Idle) + TheCPU1541->EmulateCycle(); + } + CycleCounter++; +#else + while (!quit_thyself) { + + // The order of calls is important here + int cycles = TheVIC->EmulateLine(); + TheSID->EmulateLine(); +#if !PRECISE_CIA_CYCLES + TheCIA1->EmulateLine(ThePrefs.CIACycles); + TheCIA2->EmulateLine(ThePrefs.CIACycles); +#endif + + if (ThePrefs.Emul1541Proc) { + int cycles_1541 = ThePrefs.FloppyCycles; + TheCPU1541->CountVIATimers(cycles_1541); + + if (!TheCPU1541->Idle) { + // 1541 processor active, alternately execute + // 6502 and 6510 instructions until both have + // used up their cycles + while (cycles >= 0 || cycles_1541 >= 0) + if (cycles > cycles_1541) + cycles -= TheCPU->EmulateLine(1); + else + cycles_1541 -= TheCPU1541->EmulateLine(1); + } else + TheCPU->EmulateLine(cycles); + } else + // 1541 processor disabled, only emulate 6510 + TheCPU->EmulateLine(cycles); +#endif + linecnt++; + } +} diff --git a/archive-sources/c64emu/CIA.cpp b/archive-sources/c64emu/CIA.cpp new file mode 100644 index 0000000..97fc003 --- /dev/null +++ b/archive-sources/c64emu/CIA.cpp @@ -0,0 +1,556 @@ +/* + * CIA.cpp - 6526 emulation + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Notes: + * ------ + * + * - The EmulateLine() function is called for every emulated raster + * line. It counts down the timers and triggers interrupts if + * necessary. + * - The TOD clocks are counted by CountTOD() during the VBlank, so + * the input frequency is 50Hz + * - The fields KeyMatrix and RevMatrix contain one bit for each + * key on the C64 keyboard (0: key pressed, 1: key released). + * KeyMatrix is used for normal keyboard polling (PRA->PRB), + * RevMatrix for reversed polling (PRB->PRA). + * + * Incompatibilities: + * ------------------ + * + * - The TOD clock should not be stopped on a read access, but + * latched + * - The SDR interrupt is faked + */ + +#include "sysdeps.h" + +#include "CIA.h" +#include "CPUC64.h" +#include "CPU1541.h" +#include "VIC.h" +#include "Prefs.h" + + +/* + * Constructors + */ + +MOS6526::MOS6526(MOS6510 *CPU) : the_cpu(CPU) {} +MOS6526_1::MOS6526_1(MOS6510 *CPU, MOS6569 *VIC) : MOS6526(CPU), the_vic(VIC) {} +MOS6526_2::MOS6526_2(MOS6510 *CPU, MOS6569 *VIC, MOS6502_1541 *CPU1541) : MOS6526(CPU), the_vic(VIC), the_cpu_1541(CPU1541) {} + + +/* + * Reset the CIA + */ + +void MOS6526::Reset(void) +{ + pra = prb = ddra = ddrb = 0; + + ta = tb = 0xffff; + latcha = latchb = 1; + + tod_10ths = tod_sec = tod_min = tod_hr = 0; + alm_10ths = alm_sec = alm_min = alm_hr = 0; + + sdr = icr = cra = crb = int_mask = 0; + + tod_halt = ta_cnt_phi2 = tb_cnt_phi2 = tb_cnt_ta = false; + tod_divider = 0; +} + +void MOS6526_1::Reset(void) +{ + MOS6526::Reset(); + + // Clear keyboard matrix and joystick states + for (int i=0; i<8; i++) + KeyMatrix[i] = RevMatrix[i] = 0xff; + + Joystick1 = Joystick2 = 0xff; + prev_lp = 0x10; +} + +void MOS6526_2::Reset(void) +{ + MOS6526::Reset(); + + // VA14/15 = 0 + the_vic->ChangedVA(0); + + // IEC + IECLines = 0xd0; +} + + +/* + * Get CIA state + */ + +void MOS6526::GetState(MOS6526State *cs) +{ + cs->pra = pra; + cs->prb = prb; + cs->ddra = ddra; + cs->ddrb = ddrb; + + cs->ta_lo = ta & 0xff; + cs->ta_hi = ta >> 8; + cs->tb_lo = tb & 0xff; + cs->tb_hi = tb >> 8; + cs->latcha = latcha; + cs->latchb = latchb; + cs->cra = cra; + cs->crb = crb; + + cs->tod_10ths = tod_10ths; + cs->tod_sec = tod_sec; + cs->tod_min = tod_min; + cs->tod_hr = tod_hr; + cs->alm_10ths = alm_10ths; + cs->alm_sec = alm_sec; + cs->alm_min = alm_min; + cs->alm_hr = alm_hr; + + cs->sdr = sdr; + + cs->int_data = icr; + cs->int_mask = int_mask; +} + + +/* + * Restore CIA state + */ + +void MOS6526::SetState(MOS6526State *cs) +{ + pra = cs->pra; + prb = cs->prb; + ddra = cs->ddra; + ddrb = cs->ddrb; + + ta = (cs->ta_hi << 8) | cs->ta_lo; + tb = (cs->tb_hi << 8) | cs->tb_lo; + latcha = cs->latcha; + latchb = cs->latchb; + cra = cs->cra; + crb = cs->crb; + + tod_10ths = cs->tod_10ths; + tod_sec = cs->tod_sec; + tod_min = cs->tod_min; + tod_hr = cs->tod_hr; + alm_10ths = cs->alm_10ths; + alm_sec = cs->alm_sec; + alm_min = cs->alm_min; + alm_hr = cs->alm_hr; + + sdr = cs->sdr; + + icr = cs->int_data; + int_mask = cs->int_mask; + + tod_halt = false; + ta_cnt_phi2 = ((cra & 0x21) == 0x01); + tb_cnt_phi2 = ((crb & 0x61) == 0x01); + tb_cnt_ta = ((crb & 0x61) == 0x41); +} + + +/* + * Read from register (CIA 1) + */ + +uint8 MOS6526_1::ReadRegister(uint16 adr) +{ + switch (adr) { + case 0x00: { + uint8 ret = pra | ~ddra, tst = (prb | ~ddrb) & Joystick1; + if (!(tst & 0x01)) ret &= RevMatrix[0]; // AND all active columns + if (!(tst & 0x02)) ret &= RevMatrix[1]; + if (!(tst & 0x04)) ret &= RevMatrix[2]; + if (!(tst & 0x08)) ret &= RevMatrix[3]; + if (!(tst & 0x10)) ret &= RevMatrix[4]; + if (!(tst & 0x20)) ret &= RevMatrix[5]; + if (!(tst & 0x40)) ret &= RevMatrix[6]; + if (!(tst & 0x80)) ret &= RevMatrix[7]; + return ret & Joystick2; + } + case 0x01: { + uint8 ret = ~ddrb, tst = (pra | ~ddra) & Joystick2; + if (!(tst & 0x01)) ret &= KeyMatrix[0]; // AND all active rows + if (!(tst & 0x02)) ret &= KeyMatrix[1]; + if (!(tst & 0x04)) ret &= KeyMatrix[2]; + if (!(tst & 0x08)) ret &= KeyMatrix[3]; + if (!(tst & 0x10)) ret &= KeyMatrix[4]; + if (!(tst & 0x20)) ret &= KeyMatrix[5]; + if (!(tst & 0x40)) ret &= KeyMatrix[6]; + if (!(tst & 0x80)) ret &= KeyMatrix[7]; + return (ret | (prb & ddrb)) & Joystick1; + } + case 0x02: return ddra; + case 0x03: return ddrb; + case 0x04: return ta; + case 0x05: return ta >> 8; + case 0x06: return tb; + case 0x07: return tb >> 8; + case 0x08: tod_halt = false; return tod_10ths; + case 0x09: return tod_sec; + case 0x0a: return tod_min; + case 0x0b: tod_halt = true; return tod_hr; + case 0x0c: return sdr; + case 0x0d: { + uint8 ret = icr; // Read and clear ICR + icr = 0; + the_cpu->ClearCIAIRQ(); // Clear IRQ + return ret; + } + case 0x0e: return cra; + case 0x0f: return crb; + } + return 0; // Can't happen +} + + +/* + * Read from register (CIA 2) + */ + +uint8 MOS6526_2::ReadRegister(uint16 adr) +{ + switch (adr) { + case 0x00: + return (pra | ~ddra) & 0x3f + | IECLines & the_cpu_1541->IECLines; + case 0x01: return prb | ~ddrb; + case 0x02: return ddra; + case 0x03: return ddrb; + case 0x04: return ta; + case 0x05: return ta >> 8; + case 0x06: return tb; + case 0x07: return tb >> 8; + case 0x08: tod_halt = false; return tod_10ths; + case 0x09: return tod_sec; + case 0x0a: return tod_min; + case 0x0b: tod_halt = true; return tod_hr; + case 0x0c: return sdr; + case 0x0d: { + uint8 ret = icr; // Read and clear ICR + icr = 0; + the_cpu->ClearNMI(); // Clear NMI + return ret; + } + case 0x0e: return cra; + case 0x0f: return crb; + } + return 0; // Can't happen +} + + +/* + * Write to register (CIA 1) + */ + +// Write to port B, check for lightpen interrupt +inline void MOS6526_1::check_lp(void) +{ + if ((prb | ~ddrb) & 0x10 != prev_lp) + the_vic->TriggerLightpen(); + prev_lp = (prb | ~ddrb) & 0x10; +} + +void MOS6526_1::WriteRegister(uint16 adr, uint8 byte) +{ + switch (adr) { + case 0x0: pra = byte; break; + case 0x1: + prb = byte; + check_lp(); + break; + case 0x2: ddra = byte; break; + case 0x3: + ddrb = byte; + check_lp(); + break; + + case 0x4: latcha = (latcha & 0xff00) | byte; break; + case 0x5: + latcha = (latcha & 0xff) | (byte << 8); + if (!(cra & 1)) // Reload timer if stopped + ta = latcha; + break; + + case 0x6: latchb = (latchb & 0xff00) | byte; break; + case 0x7: + latchb = (latchb & 0xff) | (byte << 8); + if (!(crb & 1)) // Reload timer if stopped + tb = latchb; + break; + + case 0x8: + if (crb & 0x80) + alm_10ths = byte & 0x0f; + else + tod_10ths = byte & 0x0f; + break; + case 0x9: + if (crb & 0x80) + alm_sec = byte & 0x7f; + else + tod_sec = byte & 0x7f; + break; + case 0xa: + if (crb & 0x80) + alm_min = byte & 0x7f; + else + tod_min = byte & 0x7f; + break; + case 0xb: + if (crb & 0x80) + alm_hr = byte & 0x9f; + else + tod_hr = byte & 0x9f; + break; + + case 0xc: + sdr = byte; + TriggerInterrupt(8); // Fake SDR interrupt for programs that need it + break; + + case 0xd: + if (ThePrefs.CIAIRQHack) // Hack for addressing modes that read from the address + icr = 0; + if (byte & 0x80) { + int_mask |= byte & 0x7f; + if (icr & int_mask & 0x1f) { // Trigger IRQ if pending + icr |= 0x80; + the_cpu->TriggerCIAIRQ(); + } + } else + int_mask &= ~byte; + break; + + case 0xe: + cra = byte & 0xef; + if (byte & 0x10) // Force load + ta = latcha; + ta_cnt_phi2 = ((byte & 0x21) == 0x01); + break; + + case 0xf: + crb = byte & 0xef; + if (byte & 0x10) // Force load + tb = latchb; + tb_cnt_phi2 = ((byte & 0x61) == 0x01); + tb_cnt_ta = ((byte & 0x61) == 0x41); + break; + } +} + + +/* + * Write to register (CIA 2) + */ + +void MOS6526_2::WriteRegister(uint16 adr, uint8 byte) +{ + switch (adr) { + case 0x0:{ + pra = byte; + byte = ~pra & ddra; + the_vic->ChangedVA(byte & 3); + uint8 old_lines = IECLines; + IECLines = (byte << 2) & 0x80 // DATA + | (byte << 2) & 0x40 // CLK + | (byte << 1) & 0x10; // ATN + if ((IECLines ^ old_lines) & 0x10) { // ATN changed + the_cpu_1541->NewATNState(); + if (old_lines & 0x10) // ATN 1->0 + the_cpu_1541->IECInterrupt(); + } + break; + } + case 0x1: prb = byte; break; + + case 0x2: + ddra = byte; + the_vic->ChangedVA(~(pra | ~ddra) & 3); + break; + case 0x3: ddrb = byte; break; + + case 0x4: latcha = (latcha & 0xff00) | byte; break; + case 0x5: + latcha = (latcha & 0xff) | (byte << 8); + if (!(cra & 1)) // Reload timer if stopped + ta = latcha; + break; + + case 0x6: latchb = (latchb & 0xff00) | byte; break; + case 0x7: + latchb = (latchb & 0xff) | (byte << 8); + if (!(crb & 1)) // Reload timer if stopped + tb = latchb; + break; + + case 0x8: + if (crb & 0x80) + alm_10ths = byte & 0x0f; + else + tod_10ths = byte & 0x0f; + break; + case 0x9: + if (crb & 0x80) + alm_sec = byte & 0x7f; + else + tod_sec = byte & 0x7f; + break; + case 0xa: + if (crb & 0x80) + alm_min = byte & 0x7f; + else + tod_min = byte & 0x7f; + break; + case 0xb: + if (crb & 0x80) + alm_hr = byte & 0x9f; + else + tod_hr = byte & 0x9f; + break; + + case 0xc: + sdr = byte; + TriggerInterrupt(8); // Fake SDR interrupt for programs that need it + break; + + case 0xd: + if (ThePrefs.CIAIRQHack) + icr = 0; + if (byte & 0x80) { + int_mask |= byte & 0x7f; + if (icr & int_mask & 0x1f) { // Trigger NMI if pending + icr |= 0x80; + the_cpu->TriggerNMI(); + } + } else + int_mask &= ~byte; + break; + + case 0xe: + cra = byte & 0xef; + if (byte & 0x10) // Force load + ta = latcha; + ta_cnt_phi2 = ((byte & 0x21) == 0x01); + break; + + case 0xf: + crb = byte & 0xef; + if (byte & 0x10) // Force load + tb = latchb; + tb_cnt_phi2 = ((byte & 0x61) == 0x01); + tb_cnt_ta = ((byte & 0x61) == 0x41); + break; + } +} + + +/* + * Count CIA TOD clock (called during VBlank) + */ + +void MOS6526::CountTOD(void) +{ + uint8 lo, hi; + + // Decrement frequency divider + if (tod_divider) + tod_divider--; + else { + + // Reload divider according to 50/60 Hz flag + if (cra & 0x80) + tod_divider = 4; + else + tod_divider = 5; + + // 1/10 seconds + tod_10ths++; + if (tod_10ths > 9) { + tod_10ths = 0; + + // Seconds + lo = (tod_sec & 0x0f) + 1; + hi = tod_sec >> 4; + if (lo > 9) { + lo = 0; + hi++; + } + if (hi > 5) { + tod_sec = 0; + + // Minutes + lo = (tod_min & 0x0f) + 1; + hi = tod_min >> 4; + if (lo > 9) { + lo = 0; + hi++; + } + if (hi > 5) { + tod_min = 0; + + // Hours + lo = (tod_hr & 0x0f) + 1; + hi = (tod_hr >> 4) & 1; + tod_hr &= 0x80; // Keep AM/PM flag + if (lo > 9) { + lo = 0; + hi++; + } + tod_hr |= (hi << 4) | lo; + if ((tod_hr & 0x1f) > 0x11) + tod_hr = tod_hr & 0x80 ^ 0x80; + } else + tod_min = (hi << 4) | lo; + } else + tod_sec = (hi << 4) | lo; + } + + // Alarm time reached? Trigger interrupt if enabled + if (tod_10ths == alm_10ths && tod_sec == alm_sec && + tod_min == alm_min && tod_hr == alm_hr) + TriggerInterrupt(4); + } +} + + +/* + * Trigger IRQ (CIA 1) + */ + +void MOS6526_1::TriggerInterrupt(int bit) +{ + icr |= bit; + if (int_mask & bit) { + icr |= 0x80; + the_cpu->TriggerCIAIRQ(); + } +} + + +/* + * Trigger NMI (CIA 2) + */ + +void MOS6526_2::TriggerInterrupt(int bit) +{ + icr |= bit; + if (int_mask & bit) { + icr |= 0x80; + the_cpu->TriggerNMI(); + } +} diff --git a/archive-sources/c64emu/CIA.h b/archive-sources/c64emu/CIA.h new file mode 100644 index 0000000..9f9dda0 --- /dev/null +++ b/archive-sources/c64emu/CIA.h @@ -0,0 +1,196 @@ +/* + * CIA.h - 6526 emulation + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _CIA_H +#define _CIA_H + +#include "Prefs.h" + + +class MOS6510; +class MOS6502_1541; +class MOS6569; +struct MOS6526State; + + +class MOS6526 { +public: + MOS6526(MOS6510 *CPU); + + void Reset(void); + void GetState(MOS6526State *cs); + void SetState(MOS6526State *cs); +#ifdef FRODO_SC + void CheckIRQs(void); + void EmulateCycle(void); +#else + void EmulateLine(int cycles); +#endif + void CountTOD(void); + virtual void TriggerInterrupt(int bit)=0; + +protected: + MOS6510 *the_cpu; // Pointer to 6510 + + uint8 pra, prb, ddra, ddrb; + + uint16 ta, tb, latcha, latchb; + + uint8 tod_10ths, tod_sec, tod_min, tod_hr; + uint8 alm_10ths, alm_sec, alm_min, alm_hr; + + uint8 sdr, icr, cra, crb; + uint8 int_mask; + + int tod_divider; // TOD frequency divider + + bool tod_halt, // Flag: TOD halted + ta_cnt_phi2, // Flag: Timer A is counting Phi 2 + tb_cnt_phi2, // Flag: Timer B is counting Phi 2 + tb_cnt_ta; // Flag: Timer B is counting underflows of Timer A + +#ifdef FRODO_SC + bool ta_irq_next_cycle, // Flag: Trigger TA IRQ in next cycle + tb_irq_next_cycle, // Flag: Trigger TB IRQ in next cycle + has_new_cra, // Flag: New value for CRA pending + has_new_crb; // Flag: New value for CRB pending + char ta_state, tb_state; // Timer A/B states + uint8 new_cra, new_crb; // New values for CRA/CRB +#endif +}; + + +class MOS6526_1 : public MOS6526 { +public: + MOS6526_1(MOS6510 *CPU, MOS6569 *VIC); + + void Reset(void); + uint8 ReadRegister(uint16 adr); + void WriteRegister(uint16 adr, uint8 byte); + virtual void TriggerInterrupt(int bit); + + uint8 KeyMatrix[8]; // C64 keyboard matrix, 1 bit/key (0: key down, 1: key up) + uint8 RevMatrix[8]; // Reversed keyboard matrix + + uint8 Joystick1; // Joystick 1 AND value + uint8 Joystick2; // Joystick 2 AND value + +private: + void check_lp(void); + + MOS6569 *the_vic; + + uint8 prev_lp; // Previous state of LP line (bit 4) +}; + + +class MOS6526_2 : public MOS6526{ +public: + MOS6526_2(MOS6510 *CPU, MOS6569 *VIC, MOS6502_1541 *CPU1541); + + void Reset(void); + uint8 ReadRegister(uint16 adr); + void WriteRegister(uint16 adr, uint8 byte); + virtual void TriggerInterrupt(int bit); + + uint8 IECLines; // State of IEC lines (bit 7 - DATA, bit 6 - CLK, bit 4 - ATN) + +private: + MOS6569 *the_vic; + MOS6502_1541 *the_cpu_1541; +}; + + +// CIA state +struct MOS6526State { + uint8 pra; + uint8 ddra; + uint8 prb; + uint8 ddrb; + uint8 ta_lo; + uint8 ta_hi; + uint8 tb_lo; + uint8 tb_hi; + uint8 tod_10ths; + uint8 tod_sec; + uint8 tod_min; + uint8 tod_hr; + uint8 sdr; + uint8 int_data; // Pending interrupts + uint8 cra; + uint8 crb; + // Additional registers + uint16 latcha; // Timer latches + uint16 latchb; + uint8 alm_10ths; // Alarm time + uint8 alm_sec; + uint8 alm_min; + uint8 alm_hr; + uint8 int_mask; // Enabled interrupts +}; + + +/* + * Emulate CIA for one cycle/raster line + */ + +#ifdef FRODO_SC +inline void MOS6526::CheckIRQs(void) +{ + // Trigger pending interrupts + if (ta_irq_next_cycle) { + ta_irq_next_cycle = false; + TriggerInterrupt(1); + } + if (tb_irq_next_cycle) { + tb_irq_next_cycle = false; + TriggerInterrupt(2); + } +} +#else +inline void MOS6526::EmulateLine(int cycles) +{ + unsigned long tmp; + + // Timer A + if (ta_cnt_phi2) { + ta = tmp = ta - cycles; // Decrement timer + + if (tmp > 0xffff) { // Underflow? + ta = latcha; // Reload timer + + if (cra & 8) { // One-shot? + cra &= 0xfe; + ta_cnt_phi2 = false; + } + TriggerInterrupt(1); + if (tb_cnt_ta) { // Timer B counting underflows of Timer A? + tb = tmp = tb - 1; // tmp = --tb doesn't work + if (tmp > 0xffff) goto tb_underflow; + } + } + } + + // Timer B + if (tb_cnt_phi2) { + tb = tmp = tb - cycles; // Decrement timer + + if (tmp > 0xffff) { // Underflow? +tb_underflow: + tb = latchb; + + if (crb & 8) { // One-shot? + crb &= 0xfe; + tb_cnt_phi2 = false; + tb_cnt_ta = false; + } + TriggerInterrupt(2); + } + } +} +#endif + +#endif diff --git a/archive-sources/c64emu/CPU1541.cpp b/archive-sources/c64emu/CPU1541.cpp new file mode 100644 index 0000000..3883ecd --- /dev/null +++ b/archive-sources/c64emu/CPU1541.cpp @@ -0,0 +1,772 @@ +/* + * CPU1541.cpp - 6502 (1541) emulation (line based) + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Notes: + * ------ + * + * - The EmulateLine() function is called for every emulated + * raster line. It has a cycle counter that is decremented + * by every executed opcode and if the counter goes below + * zero, the function returns. + * - Memory map (1541C, the 1541 and 1541-II are a bit different): + * $0000-$07ff RAM (2K) + * $0800-$0fff RAM mirror + * $1000-$17ff free + * $1800-$1bff VIA 1 + * $1c00-$1fff VIA 2 + * $2000-$bfff free + * $c000-$ffff ROM (16K) + * - All memory accesses are done with the read_byte() and + * write_byte() functions which also do the memory address + * decoding. The read_zp() and write_zp() functions allow + * faster access to the zero page, the pop_byte() and + * push_byte() macros for the stack. + * - The PC is either emulated with a 16 bit address or a + * direct memory pointer (for faster access), depending on + * the PC_IS_POINTER #define. In the latter case, a second + * pointer, pc_base, is kept to allow recalculating the + * 16 bit 6502 PC if it has to be pushed on the stack. + * - The possible interrupt sources are: + * INT_VIA1IRQ: I flag is checked, jump to ($fffe) (unused) + * INT_VIA2IRQ: I flag is checked, jump to ($fffe) (unused) + * INT_IECIRQ: I flag is checked, jump to ($fffe) (unused) + * INT_RESET: Jump to ($fffc) + * - Interrupts are not checked before every opcode but only + * at certain times: + * On entering EmulateLine() + * On CLI + * On PLP if the I flag was cleared + * On RTI if the I flag was cleared + * - The z_flag variable has the inverse meaning of the + * 6502 Z flag + * - Only the highest bit of the n_flag variable is used + * - The $f2 opcode that would normally crash the 6502 is + * used to implement emulator-specific functions + * - The 1541 6502 emulation also includes a very simple VIA + * emulation (enough to make the IEC bus and GCR loading work). + * It's too small to move it to a source file of its own. + * + * Incompatibilities: + * ------------------ + * + * - If PC_IS_POINTER is set, neither branches accross memory + * areas nor jumps to I/O space are possible + * - Extra cycles for crossing page boundaries are not + * accounted for + */ + +#include "sysdeps.h" + +#include "CPU1541.h" +#include "1541job.h" +#include "C64.h" +#include "CIA.h" +#include "Display.h" + + +enum { + INT_RESET = 3 +}; + + +/* + * 6502 constructor: Initialize registers + */ + +MOS6502_1541::MOS6502_1541(C64 *c64, Job1541 *job, C64Display *disp, uint8 *Ram, uint8 *Rom) + : ram(Ram), rom(Rom), the_c64(c64), the_display(disp), the_job(job) +{ + a = x = y = 0; + sp = 0xff; + n_flag = z_flag = 0; + v_flag = d_flag = c_flag = false; + i_flag = true; + + borrowed_cycles = 0; + + via1_t1c = via1_t1l = via1_t2c = via1_t2l = 0; + via1_sr = 0; + via2_t1c = via2_t1l = via2_t2c = via2_t2l = 0; + via2_sr = 0; + + Idle = false; +} + + +/* + * Reset CPU asynchronously + */ + +void MOS6502_1541::AsyncReset(void) +{ + interrupt.intr[INT_RESET] = true; + Idle = false; +} + + +/* + * Read a byte from I/O space + */ + +inline uint8 MOS6502_1541::read_byte_io(uint16 adr) +{ + if ((adr & 0xfc00) == 0x1800) // VIA 1 + switch (adr & 0xf) { + case 0: + return (via1_prb & 0x1a + | ((IECLines & TheCIA2->IECLines) >> 7) // DATA + | ((IECLines & TheCIA2->IECLines) >> 4) & 0x04 // CLK + | (TheCIA2->IECLines << 3) & 0x80) ^ 0x85; // ATN + case 1: + case 15: + return 0xff; // Keep 1541C ROMs happy (track 0 sensor) + case 2: + return via1_ddrb; + case 3: + return via1_ddra; + case 4: + via1_ifr &= 0xbf; + return via1_t1c; + case 5: + return via1_t1c >> 8; + case 6: + return via1_t1l; + case 7: + return via1_t1l >> 8; + case 8: + via1_ifr &= 0xdf; + return via1_t2c; + case 9: + return via1_t2c >> 8; + case 10: + return via1_sr; + case 11: + return via1_acr; + case 12: + return via1_pcr; + case 13: + return via1_ifr | (via1_ifr & via1_ier ? 0x80 : 0); + case 14: + return via1_ier | 0x80; + default: // Can't happen + return 0; + } + + else if ((adr & 0xfc00) == 0x1c00) // VIA 2 + switch (adr & 0xf) { + case 0: + if (the_job->SyncFound()) + return via2_prb & 0x7f | the_job->WPState(); + else + return via2_prb | 0x80 | the_job->WPState(); + case 1: + case 15: + return the_job->ReadGCRByte(); + case 2: + return via2_ddrb; + case 3: + return via2_ddra; + case 4: + via2_ifr &= 0xbf; + interrupt.intr[INT_VIA2IRQ] = false; // Clear job IRQ + return via2_t1c; + case 5: + return via2_t1c >> 8; + case 6: + return via2_t1l; + case 7: + return via2_t1l >> 8; + case 8: + via2_ifr &= 0xdf; + return via2_t2c; + case 9: + return via2_t2c >> 8; + case 10: + return via2_sr; + case 11: + return via2_acr; + case 12: + return via2_pcr; + case 13: + return via2_ifr | (via2_ifr & via2_ier ? 0x80 : 0); + case 14: + return via2_ier | 0x80; + default: // Can't happen + return 0; + } + + else + return adr >> 8; +} + + +/* + * Read a byte from the CPU's address space + */ + +uint8 MOS6502_1541::read_byte(uint16 adr) +{ + if (adr >= 0xc000) + return rom[adr & 0x3fff]; + else if (adr < 0x1000) + return ram[adr & 0x07ff]; + else + return read_byte_io(adr); +} + + +/* + * Read a word (little-endian) from the CPU's address space + */ + +inline uint16 MOS6502_1541::read_word(uint16 adr) +{ + return read_byte(adr) | (read_byte(adr+1) << 8); +} + + +/* + * Write a byte to I/O space + */ + +void MOS6502_1541::write_byte_io(uint16 adr, uint8 byte) +{ + if ((adr & 0xfc00) == 0x1800) // VIA 1 + switch (adr & 0xf) { + case 0: + via1_prb = byte; + byte = ~via1_prb & via1_ddrb; + IECLines = (byte << 6) & ((~byte ^ TheCIA2->IECLines) << 3) & 0x80 + | (byte << 3) & 0x40; + break; + case 1: + case 15: + via1_pra = byte; + break; + case 2: + via1_ddrb = byte; + byte &= ~via1_prb; + IECLines = (byte << 6) & ((~byte ^ TheCIA2->IECLines) << 3) & 0x80 + | (byte << 3) & 0x40; + break; + case 3: + via1_ddra = byte; + break; + case 4: + case 6: + via1_t1l = via1_t1l & 0xff00 | byte; + break; + case 5: + via1_t1l = via1_t1l & 0xff | (byte << 8); + via1_ifr &= 0xbf; + via1_t1c = via1_t1l; + break; + case 7: + via1_t1l = via1_t1l & 0xff | (byte << 8); + break; + case 8: + via1_t2l = via1_t2l & 0xff00 | byte; + break; + case 9: + via1_t2l = via1_t2l & 0xff | (byte << 8); + via1_ifr &= 0xdf; + via1_t2c = via1_t2l; + break; + case 10: + via1_sr = byte; + break; + case 11: + via1_acr = byte; + break; + case 12: + via1_pcr = byte; + break; + case 13: + via1_ifr &= ~byte; + break; + case 14: + if (byte & 0x80) + via1_ier |= byte & 0x7f; + else + via1_ier &= ~byte; + break; + } + + else if ((adr & 0xfc00) == 0x1c00) // VIA 2 + switch (adr & 0xf) { + case 0: + if ((via2_prb ^ byte) & 8) // Bit 3: Drive LED + the_display->UpdateLEDs(byte & 8 ? 1 : 0, 0, 0, 0); + if ((via2_prb ^ byte) & 3) // Bits 0/1: Stepper motor + if ((via2_prb & 3) == ((byte+1) & 3)) + the_job->MoveHeadOut(); + else if ((via2_prb & 3) == ((byte-1) & 3)) + the_job->MoveHeadIn(); + via2_prb = byte & 0xef; + break; + case 1: + case 15: + via2_pra = byte; + break; + case 2: + via2_ddrb = byte; + break; + case 3: + via2_ddra = byte; + break; + case 4: + case 6: + via2_t1l = via2_t1l & 0xff00 | byte; + break; + case 5: + via2_t1l = via2_t1l & 0xff | (byte << 8); + via2_ifr &= 0xbf; + via2_t1c = via2_t1l; + break; + case 7: + via2_t1l = via2_t1l & 0xff | (byte << 8); + break; + case 8: + via2_t2l = via2_t2l & 0xff00 | byte; + break; + case 9: + via2_t2l = via2_t2l & 0xff | (byte << 8); + via2_ifr &= 0xdf; + via2_t2c = via2_t2l; + break; + case 10: + via2_sr = byte; + break; + case 11: + via2_acr = byte; + break; + case 12: + via2_pcr = byte; + break; + case 13: + via2_ifr &= ~byte; + break; + case 14: + if (byte & 0x80) + via2_ier |= byte & 0x7f; + else + via2_ier &= ~byte; + break; + } +} + + +/* + * Write a byte to the CPU's address space + */ + +inline void MOS6502_1541::write_byte(uint16 adr, uint8 byte) +{ + if (adr < 0x1000) + ram[adr & 0x7ff] = byte; + else + write_byte_io(adr, byte); +} + + +/* + * Read a byte from the zeropage + */ + +inline uint8 MOS6502_1541::read_zp(uint16 adr) +{ + return ram[adr]; +} + + +/* + * Read a word (little-endian) from the zeropage + */ + +inline uint16 MOS6502_1541::read_zp_word(uint16 adr) +{ + return ram[adr & 0xff] | (ram[(adr+1) & 0xff] << 8); +} + + +/* + * Write a byte to the zeropage + */ + +inline void MOS6502_1541::write_zp(uint16 adr, uint8 byte) +{ + ram[adr] = byte; +} + + +/* + * Read byte from 6502/1541 address space (used by SAM) + */ + +uint8 MOS6502_1541::ExtReadByte(uint16 adr) +{ + return read_byte(adr); +} + + +/* + * Write byte to 6502/1541 address space (used by SAM) + */ + +void MOS6502_1541::ExtWriteByte(uint16 adr, uint8 byte) +{ + write_byte(adr, byte); +} + + +/* + * Jump to address + */ + +#if PC_IS_POINTER +void MOS6502_1541::jump(uint16 adr) +{ + if (adr >= 0xc000) { + pc = rom + (adr & 0x3fff); + pc_base = rom - 0xc000; + } else if (adr < 0x800) { + pc = ram + adr; + pc_base = ram; + } else + illegal_jump(pc-pc_base, adr); +} +#else +inline void MOS6502_1541::jump(uint16 adr) +{ + pc = adr; +} +#endif + + +/* + * Adc instruction + */ + +void MOS6502_1541::do_adc(uint8 byte) +{ + if (!d_flag) { + uint16 tmp; + + // Binary mode + tmp = a + byte + (c_flag ? 1 : 0); + c_flag = tmp > 0xff; + v_flag = !((a ^ byte) & 0x80) && ((a ^ tmp) & 0x80); + z_flag = n_flag = a = tmp; + + } else { + uint16 al, ah; + + // Decimal mode + al = (a & 0x0f) + (byte & 0x0f) + (c_flag ? 1 : 0); // Calculate lower nybble + if (al > 9) al += 6; // BCD fixup for lower nybble + + ah = (a >> 4) + (byte >> 4); // Calculate upper nybble + if (al > 0x0f) ah++; + + z_flag = a + byte + (c_flag ? 1 : 0); // Set flags + n_flag = ah << 4; // Only highest bit used + v_flag = (((ah << 4) ^ a) & 0x80) && !((a ^ byte) & 0x80); + + if (ah > 9) ah += 6; // BCD fixup for upper nybble + c_flag = ah > 0x0f; // Set carry flag + a = (ah << 4) | (al & 0x0f); // Compose result + } +} + + +/* + * Sbc instruction + */ + +void MOS6502_1541::do_sbc(uint8 byte) +{ + uint16 tmp = a - byte - (c_flag ? 0 : 1); + + if (!d_flag) { + + // Binary mode + c_flag = tmp < 0x100; + v_flag = ((a ^ tmp) & 0x80) && ((a ^ byte) & 0x80); + z_flag = n_flag = a = tmp; + + } else { + uint16 al, ah; + + // Decimal mode + al = (a & 0x0f) - (byte & 0x0f) - (c_flag ? 0 : 1); // Calculate lower nybble + ah = (a >> 4) - (byte >> 4); // Calculate upper nybble + if (al & 0x10) { + al -= 6; // BCD fixup for lower nybble + ah--; + } + if (ah & 0x10) ah -= 6; // BCD fixup for upper nybble + + c_flag = tmp < 0x100; // Set flags + v_flag = ((a ^ tmp) & 0x80) && ((a ^ byte) & 0x80); + z_flag = n_flag = tmp; + + a = (ah << 4) | (al & 0x0f); // Compose result + } +} + + +/* + * Get 6502 register state + */ + +void MOS6502_1541::GetState(MOS6502State *s) +{ + s->a = a; + s->x = x; + s->y = y; + + s->p = 0x20 | (n_flag & 0x80); + if (v_flag) s->p |= 0x40; + if (d_flag) s->p |= 0x08; + if (i_flag) s->p |= 0x04; + if (!z_flag) s->p |= 0x02; + if (c_flag) s->p |= 0x01; + +#if PC_IS_POINTER + s->pc = pc - pc_base; +#else + s->pc = pc; +#endif + s->sp = sp | 0x0100; + + s->intr[INT_VIA1IRQ] = interrupt.intr[INT_VIA1IRQ]; + s->intr[INT_VIA2IRQ] = interrupt.intr[INT_VIA2IRQ]; + s->intr[INT_IECIRQ] = interrupt.intr[INT_IECIRQ]; + s->intr[INT_RESET] = interrupt.intr[INT_RESET]; + s->instruction_complete = true; + s->idle = Idle; + + s->via1_pra = via1_pra; s->via1_ddra = via1_ddra; + s->via1_prb = via1_prb; s->via1_ddrb = via1_ddrb; + s->via1_t1c = via1_t1c; s->via1_t1l = via1_t1l; + s->via1_t2c = via1_t2c; s->via1_t2l = via1_t2l; + s->via1_sr = via1_sr; + s->via1_acr = via1_acr; s->via1_pcr = via1_pcr; + s->via1_ifr = via1_ifr; s->via1_ier = via1_ier; + + s->via2_pra = via2_pra; s->via2_ddra = via2_ddra; + s->via2_prb = via2_prb; s->via2_ddrb = via2_ddrb; + s->via2_t1c = via2_t1c; s->via2_t1l = via2_t1l; + s->via2_t2c = via2_t2c; s->via2_t2l = via2_t2l; + s->via2_sr = via2_sr; + s->via2_acr = via2_acr; s->via2_pcr = via2_pcr; + s->via2_ifr = via2_ifr; s->via2_ier = via2_ier; +} + + +/* + * Restore 6502 state + */ + +void MOS6502_1541::SetState(MOS6502State *s) +{ + a = s->a; + x = s->x; + y = s->y; + + n_flag = s->p; + v_flag = s->p & 0x40; + d_flag = s->p & 0x08; + i_flag = s->p & 0x04; + z_flag = !(s->p & 0x02); + c_flag = s->p & 0x01; + + jump(s->pc); + sp = s->sp & 0xff; + + interrupt.intr[INT_VIA1IRQ] = s->intr[INT_VIA1IRQ]; + interrupt.intr[INT_VIA2IRQ] = s->intr[INT_VIA2IRQ]; + interrupt.intr[INT_IECIRQ] = s->intr[INT_IECIRQ]; + interrupt.intr[INT_RESET] = s->intr[INT_RESET]; + Idle = s->idle; + + via1_pra = s->via1_pra; via1_ddra = s->via1_ddra; + via1_prb = s->via1_prb; via1_ddrb = s->via1_ddrb; + via1_t1c = s->via1_t1c; via1_t1l = s->via1_t1l; + via1_t2c = s->via1_t2c; via1_t2l = s->via1_t2l; + via1_sr = s->via1_sr; + via1_acr = s->via1_acr; via1_pcr = s->via1_pcr; + via1_ifr = s->via1_ifr; via1_ier = s->via1_ier; + + via2_pra = s->via2_pra; via2_ddra = s->via2_ddra; + via2_prb = s->via2_prb; via2_ddrb = s->via2_ddrb; + via2_t1c = s->via2_t1c; via2_t1l = s->via2_t1l; + via2_t2c = s->via2_t2c; via2_t2l = s->via2_t2l; + via2_sr = s->via2_sr; + via2_acr = s->via2_acr; via2_pcr = s->via2_pcr; + via2_ifr = s->via2_ifr; via2_ier = s->via2_ier; +} + + +/* + * Reset CPU + */ + +void MOS6502_1541::Reset(void) +{ + // IEC lines and VIA registers + IECLines = 0xc0; + + via1_pra = via1_ddra = via1_prb = via1_ddrb = 0; + via1_acr = via1_pcr = 0; + via1_ifr = via1_ier = 0; + via2_pra = via2_ddra = via2_prb = via2_ddrb = 0; + via2_acr = via2_pcr = 0; + via2_ifr = via2_ier = 0; + + // Clear all interrupt lines + interrupt.intr_any = 0; + + // Read reset vector + jump(read_word(0xfffc)); + + // Wake up 1541 + Idle = false; +} + + +/* + * Illegal opcode encountered + */ + +void MOS6502_1541::illegal_op(uint8 op, uint16 at) +{ + char illop_msg[80]; + + sprintf(illop_msg, "1541: Illegal opcode %02x at %04x.", op, at); + if (ShowRequester(illop_msg, "Reset 1541", "Reset C64")) + the_c64->Reset(); + Reset(); +} + + +/* + * Jump to illegal address space (PC_IS_POINTER only) + */ + +void MOS6502_1541::illegal_jump(uint16 at, uint16 to) +{ + char illop_msg[80]; + + sprintf(illop_msg, "1541: Jump to I/O space at %04x to %04x.", at, to); + if (ShowRequester(illop_msg, "Reset 1541", "Reset C64")) + the_c64->Reset(); + Reset(); +} + + +/* + * Stack macros + */ + +// Pop a byte from the stack +#define pop_byte() ram[(++sp) | 0x0100] + +// Push a byte onto the stack +#define push_byte(byte) (ram[(sp--) & 0xff | 0x0100] = (byte)) + +// Pop processor flags from the stack +#define pop_flags() \ + n_flag = tmp = pop_byte(); \ + v_flag = tmp & 0x40; \ + d_flag = tmp & 0x08; \ + i_flag = tmp & 0x04; \ + z_flag = !(tmp & 0x02); \ + c_flag = tmp & 0x01; + +// Push processor flags onto the stack +#define push_flags(b_flag) \ + tmp = 0x20 | (n_flag & 0x80); \ + if (v_flag) tmp |= 0x40; \ + if (b_flag) tmp |= 0x10; \ + if (d_flag) tmp |= 0x08; \ + if (i_flag) tmp |= 0x04; \ + if (!z_flag) tmp |= 0x02; \ + if (c_flag) tmp |= 0x01; \ + push_byte(tmp); + + +/* + * Emulate cycles_left worth of 6502 instructions + * Returns number of cycles of last instruction + */ + +int MOS6502_1541::EmulateLine(int cycles_left) +{ + uint8 tmp, tmp2; + uint16 adr; + int last_cycles = 0; + + // Any pending interrupts? + if (interrupt.intr_any) { +handle_int: + if (interrupt.intr[INT_RESET]) + Reset(); + + else if ((interrupt.intr[INT_VIA1IRQ] || interrupt.intr[INT_VIA2IRQ] || interrupt.intr[INT_IECIRQ]) && !i_flag) { +#if PC_IS_POINTER + push_byte((pc-pc_base) >> 8); push_byte(pc-pc_base); +#else + push_byte(pc >> 8); push_byte(pc); +#endif + push_flags(false); + i_flag = true; + jump(read_word(0xfffe)); + last_cycles = 7; + } + } + +#define IS_CPU_1541 +#include "CPU_emulline.i" + + // Extension opcode + case 0xf2: +#if PC_IS_POINTER + if ((pc-pc_base) < 0xc000) { + illegal_op(0xf2, pc-pc_base-1); +#else + if (pc < 0xc000) { + illegal_op(0xf2, pc-1); +#endif + break; + } + switch (read_byte_imm()) { + case 0x00: // Go to sleep in DOS idle loop if error flag is clear and no command received + Idle = !(ram[0x26c] | ram[0x7c]); + jump(0xebff); + break; + case 0x01: // Write sector + the_job->WriteSector(); + jump(0xf5dc); + break; + case 0x02: // Format track + the_job->FormatTrack(); + jump(0xfd8b); + break; + default: +#if PC_IS_POINTER + illegal_op(0xf2, pc-pc_base-1); +#else + illegal_op(0xf2, pc-1); +#endif + break; + } + break; + } + } + return last_cycles; +} diff --git a/archive-sources/c64emu/CPU1541.h b/archive-sources/c64emu/CPU1541.h new file mode 100644 index 0000000..623eccf --- /dev/null +++ b/archive-sources/c64emu/CPU1541.h @@ -0,0 +1,281 @@ +/* + * CPU1541.h - 6502 (1541) emulation (line based) + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _CPU_1541_H +#define _CPU_1541_H + +#include "CIA.h" +#include "C64.h" + + +// Set this to 1 if the 6502 PC should be represented by a real pointer +#ifndef FRODO_SC +#ifndef PC_IS_POINTER +#define PC_IS_POINTER 1 +#endif +#endif + +// Set this to 1 for more precise CPU cycle calculation +#ifndef PRECISE_CPU_CYCLES +#define PRECISE_CPU_CYCLES 0 +#endif + + +// Interrupt types +enum { + INT_VIA1IRQ, + INT_VIA2IRQ, + INT_IECIRQ + // INT_RESET (private) +}; + + +class C64; +class Job1541; +class C64Display; +struct MOS6502State; + + +// 6502 emulation (1541) +class MOS6502_1541 { +public: + MOS6502_1541(C64 *c64, Job1541 *job, C64Display *disp, uint8 *Ram, uint8 *Rom); + +#ifdef FRODO_SC + void EmulateCycle(void); // Emulate one clock cycle +#else + int EmulateLine(int cycles_left); // Emulate until cycles_left underflows +#endif + void Reset(void); + void AsyncReset(void); // Reset the CPU asynchronously + void GetState(MOS6502State *s); + void SetState(MOS6502State *s); + uint8 ExtReadByte(uint16 adr); + void ExtWriteByte(uint16 adr, uint8 byte); + void CountVIATimers(int cycles); + void NewATNState(void); + void IECInterrupt(void); + void TriggerJobIRQ(void); + bool InterruptEnabled(void); + + MOS6526_2 *TheCIA2; // Pointer to C64 CIA 2 + + uint8 IECLines; // State of IEC lines (bit 7 - DATA, bit 6 - CLK) + bool Idle; // true: 1541 is idle + +private: + uint8 read_byte(uint16 adr); + uint8 read_byte_io(uint16 adr); + uint16 read_word(uint16 adr); + void write_byte(uint16 adr, uint8 byte); + void write_byte_io(uint16 adr, uint8 byte); + + uint8 read_zp(uint16 adr); + uint16 read_zp_word(uint16 adr); + void write_zp(uint16 adr, uint8 byte); + + void jump(uint16 adr); + void illegal_op(uint8 op, uint16 at); + void illegal_jump(uint16 at, uint16 to); + + void do_adc(uint8 byte); + void do_sbc(uint8 byte); + + uint8 *ram; // Pointer to main RAM + uint8 *rom; // Pointer to ROM + C64 *the_c64; // Pointer to C64 object + C64Display *the_display; // Pointer to C64 display object + Job1541 *the_job; // Pointer to 1541 job object + + union { // Pending interrupts + uint8 intr[4]; // Index: See definitions above + unsigned long intr_any; + } interrupt; + + uint8 n_flag, z_flag; + bool v_flag, d_flag, i_flag, c_flag; + uint8 a, x, y, sp; +#if PC_IS_POINTER + uint8 *pc, *pc_base; +#else + uint16 pc; +#endif + +#ifdef FRODO_SC + uint32 first_irq_cycle; + + uint8 state, op; // Current state and opcode + uint16 ar, ar2; // Address registers + uint8 rdbuf; // Data buffer for RMW instructions + uint8 ddr, pr; // Processor port +#else + int borrowed_cycles; // Borrowed cycles from next line +#endif + + uint8 via1_pra; // PRA of VIA 1 + uint8 via1_ddra; // DDRA of VIA 1 + uint8 via1_prb; // PRB of VIA 1 + uint8 via1_ddrb; // DDRB of VIA 1 + uint16 via1_t1c; // T1 Counter of VIA 1 + uint16 via1_t1l; // T1 Latch of VIA 1 + uint16 via1_t2c; // T2 Counter of VIA 1 + uint16 via1_t2l; // T2 Latch of VIA 1 + uint8 via1_sr; // SR of VIA 1 + uint8 via1_acr; // ACR of VIA 1 + uint8 via1_pcr; // PCR of VIA 1 + uint8 via1_ifr; // IFR of VIA 1 + uint8 via1_ier; // IER of VIA 1 + + uint8 via2_pra; // PRA of VIA 2 + uint8 via2_ddra; // DDRA of VIA 2 + uint8 via2_prb; // PRB of VIA 2 + uint8 via2_ddrb; // DDRB of VIA 2 + uint16 via2_t1c; // T1 Counter of VIA 2 + uint16 via2_t1l; // T1 Latch of VIA 2 + uint16 via2_t2c; // T2 Counter of VIA 2 + uint16 via2_t2l; // T2 Latch of VIA 2 + uint8 via2_sr; // SR of VIA 2 + uint8 via2_acr; // ACR of VIA 2 + uint8 via2_pcr; // PCR of VIA 2 + uint8 via2_ifr; // IFR of VIA 2 + uint8 via2_ier; // IER of VIA 2 +}; + +// 6502 state +struct MOS6502State { + uint8 a, x, y; + uint8 p; // Processor flags + uint16 pc, sp; + + uint8 intr[4]; // Interrupt state + bool instruction_complete; + bool idle; + + uint8 via1_pra; // VIA 1 + uint8 via1_ddra; + uint8 via1_prb; + uint8 via1_ddrb; + uint16 via1_t1c; + uint16 via1_t1l; + uint16 via1_t2c; + uint16 via1_t2l; + uint8 via1_sr; + uint8 via1_acr; + uint8 via1_pcr; + uint8 via1_ifr; + uint8 via1_ier; + + uint8 via2_pra; // VIA 2 + uint8 via2_ddra; + uint8 via2_prb; + uint8 via2_ddrb; + uint16 via2_t1c; + uint16 via2_t1l; + uint16 via2_t2c; + uint16 via2_t2l; + uint8 via2_sr; + uint8 via2_acr; + uint8 via2_pcr; + uint8 via2_ifr; + uint8 via2_ier; +}; + + + +/* + * Trigger job loop IRQ + */ + +#ifdef FRODO_SC +inline void MOS6502_1541::TriggerJobIRQ(void) +{ + if (!(interrupt.intr[INT_VIA2IRQ])) + first_irq_cycle = the_c64->CycleCounter; + interrupt.intr[INT_VIA2IRQ] = true; + Idle = false; +} +#else +inline void MOS6502_1541::TriggerJobIRQ(void) +{ + interrupt.intr[INT_VIA2IRQ] = true; + Idle = false; +} +#endif + + +/* + * Count VIA timers + */ + +inline void MOS6502_1541::CountVIATimers(int cycles) +{ + unsigned long tmp; + + via1_t1c = tmp = via1_t1c - cycles; + if (tmp > 0xffff) { + if (via1_acr & 0x40) // Reload from latch in free-run mode + via1_t1c = via1_t1l; + via1_ifr |= 0x40; + } + + if (!(via1_acr & 0x20)) { // Only count in one-shot mode + via1_t2c = tmp = via1_t2c - cycles; + if (tmp > 0xffff) + via1_ifr |= 0x20; + } + + via2_t1c = tmp = via2_t1c - cycles; + if (tmp > 0xffff) { + if (via2_acr & 0x40) // Reload from latch in free-run mode + via2_t1c = via2_t1l; + via2_ifr |= 0x40; + if (via2_ier & 0x40) + TriggerJobIRQ(); + } + + if (!(via2_acr & 0x20)) { // Only count in one-shot mode + via2_t2c = tmp = via2_t2c - cycles; + if (tmp > 0xffff) + via2_ifr |= 0x20; + } +} + + +/* + * ATN line probably changed state, recalc IECLines + */ + +inline void MOS6502_1541::NewATNState(void) +{ + uint8 byte = ~via1_prb & via1_ddrb; + IECLines = (byte << 6) & ((~byte ^ TheCIA2->IECLines) << 3) & 0x80 // DATA (incl. ATN acknowledge) + | (byte << 3) & 0x40; // CLK +} + + +/* + * Interrupt by negative edge of ATN on IEC bus + */ + +inline void MOS6502_1541::IECInterrupt(void) +{ + ram[0x7c] = 1; + + // Wake up 1541 + Idle = false; +} + + +/* + * Test if interrupts are enabled (for job loop) + */ + +inline bool MOS6502_1541::InterruptEnabled(void) +{ + return !i_flag; +} + +#endif diff --git a/archive-sources/c64emu/CPUC64.cpp b/archive-sources/c64emu/CPUC64.cpp new file mode 100644 index 0000000..b585370 --- /dev/null +++ b/archive-sources/c64emu/CPUC64.cpp @@ -0,0 +1,852 @@ +/* + * CPUC64.cpp - 6510 (C64) emulation (line based) + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Notes: + * ------ + * + * - The EmulateLine() function is called for every emulated + * raster line. It has a cycle counter that is decremented + * by every executed opcode and if the counter goes below + * zero, the function returns. + * - Memory configurations: + * $01 $a000-$bfff $d000-$dfff $e000-$ffff + * ----------------------------------------------- + * 0 RAM RAM RAM + * 1 RAM Char ROM RAM + * 2 RAM Char ROM Kernal ROM + * 3 Basic ROM Char ROM Kernal ROM + * 4 RAM RAM RAM + * 5 RAM I/O RAM + * 6 RAM I/O Kernal ROM + * 7 Basic ROM I/O Kernal ROM + * - All memory accesses are done with the read_byte() and + * write_byte() functions which also do the memory address + * decoding. The read_zp() and write_zp() functions allow + * faster access to the zero page, the pop_byte() and + * push_byte() macros for the stack. + * - If a write occurs to addresses 0 or 1, new_config is + * called to check whether the memory configuration has + * changed + * - The PC is either emulated with a 16 bit address or a + * direct memory pointer (for faster access), depending on + * the PC_IS_POINTER #define. In the latter case, a second + * pointer, pc_base, is kept to allow recalculating the + * 16 bit 6510 PC if it has to be pushed on the stack. + * - The possible interrupt sources are: + * INT_VICIRQ: I flag is checked, jump to ($fffe) + * INT_CIAIRQ: I flag is checked, jump to ($fffe) + * INT_NMI: Jump to ($fffa) + * INT_RESET: Jump to ($fffc) + * - Interrupts are not checked before every opcode but only + * at certain times: + * On entering EmulateLine() + * On CLI + * On PLP if the I flag was cleared + * On RTI if the I flag was cleared + * - The z_flag variable has the inverse meaning of the + * 6510 Z flag + * - Only the highest bit of the n_flag variable is used + * - The $f2 opcode that would normally crash the 6510 is + * used to implement emulator-specific functions, mainly + * those for the IEC routines + * + * Incompatibilities: + * ------------------ + * + * - If PC_IS_POINTER is set, neither branches accross memory + * areas nor jumps to I/O space are possible + * - Extra cycles for crossing page boundaries are not + * accounted for + * - The cassette sense line is always closed + */ + +#include "sysdeps.h" + +#include "CPUC64.h" +#include "C64.h" +#include "VIC.h" +#include "SID.h" +#include "CIA.h" +#include "REU.h" +#include "IEC.h" +#include "Display.h" +#include "Version.h" + + +enum { + INT_RESET = 3 +}; + + +/* + * 6510 constructor: Initialize registers + */ + +MOS6510::MOS6510(C64 *c64, uint8 *Ram, uint8 *Basic, uint8 *Kernal, uint8 *Char, uint8 *Color) + : the_c64(c64), ram(Ram), basic_rom(Basic), kernal_rom(Kernal), char_rom(Char), color_ram(Color) +{ + a = x = y = 0; + sp = 0xff; + n_flag = z_flag = 0; + v_flag = d_flag = c_flag = false; + i_flag = true; + dfff_byte = 0x55; + borrowed_cycles = 0; +} + + +/* + * Reset CPU asynchronously + */ + +void MOS6510::AsyncReset(void) +{ + interrupt.intr[INT_RESET] = true; +} + + +/* + * Raise NMI asynchronously (Restore key) + */ + +void MOS6510::AsyncNMI(void) +{ + if (!nmi_state) + interrupt.intr[INT_NMI] = true; +} + + +/* + * Memory configuration has probably changed + */ + +void MOS6510::new_config(void) +{ + uint8 port = ~ram[0] | ram[1]; + + basic_in = (port & 3) == 3; + kernal_in = port & 2; + char_in = (port & 3) && !(port & 4); + io_in = (port & 3) && (port & 4); +} + + +/* + * Read a byte from I/O / ROM space + */ + +inline uint8 MOS6510::read_byte_io(uint16 adr) +{ + switch (adr >> 12) { + case 0xa: + case 0xb: + if (basic_in) + return basic_rom[adr & 0x1fff]; + else + return ram[adr]; + case 0xc: + return ram[adr]; + case 0xd: + if (io_in) + switch ((adr >> 8) & 0x0f) { + case 0x0: // VIC + case 0x1: + case 0x2: + case 0x3: + return TheVIC->ReadRegister(adr & 0x3f); + case 0x4: // SID + case 0x5: + case 0x6: + case 0x7: + return TheSID->ReadRegister(adr & 0x1f); + case 0x8: // Color RAM + case 0x9: + case 0xa: + case 0xb: + return color_ram[adr & 0x03ff] | rand() & 0xf0; + case 0xc: // CIA 1 + return TheCIA1->ReadRegister(adr & 0x0f); + case 0xd: // CIA 2 + return TheCIA2->ReadRegister(adr & 0x0f); + case 0xe: // REU/Open I/O + case 0xf: + if ((adr & 0xfff0) == 0xdf00) + return TheREU->ReadRegister(adr & 0x0f); + else if (adr < 0xdfa0) + return rand(); + else + return read_emulator_id(adr & 0x7f); + } + else if (char_in) + return char_rom[adr & 0x0fff]; + else + return ram[adr]; + case 0xe: + case 0xf: + if (kernal_in) + return kernal_rom[adr & 0x1fff]; + else + return ram[adr]; + default: // Can't happen + return 0; + } +} + + +/* + * Read a byte from the CPU's address space + */ + +uint8 MOS6510::read_byte(uint16 adr) +{ + if (adr < 0xa000) + return ram[adr]; + else + return read_byte_io(adr); +} + + +/* + * $dfa0-$dfff: Emulator identification + */ + +const char frodo_id[0x5c] = "FRODO\r(C) 1994-1997 CHRISTIAN BAUER"; + +uint8 MOS6510::read_emulator_id(uint16 adr) +{ + switch (adr) { + case 0x7c: // $dffc: revision + return FRODO_REVISION << 4; + case 0x7d: // $dffd: version + return FRODO_VERSION; + case 0x7e: // $dffe returns 'F' (Frodo ID) + return 'F'; + case 0x7f: // $dfff alternates between $55 and $aa + dfff_byte = ~dfff_byte; + return dfff_byte; + default: + return frodo_id[adr - 0x20]; + } +} + + +/* + * Read a word (little-endian) from the CPU's address space + */ + +#if LITTLE_ENDIAN_UNALIGNED + +inline uint16 MOS6510::read_word(uint16 adr) +{ + switch (adr >> 12) { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + case 0x8: + case 0x9: + return *(uint16*)&ram[adr]; + break; + case 0xa: + case 0xb: + if (basic_in) + return *(uint16*)&basic_rom[adr & 0x1fff]; + else + return *(uint16*)&ram[adr]; + case 0xc: + return *(uint16*)&ram[adr]; + case 0xd: + if (io_in) + return read_byte(adr) | (read_byte(adr+1) << 8); + else if (char_in) + return *(uint16*)&char_rom[adr & 0x0fff]; + else + return *(uint16*)&ram[adr]; + case 0xe: + case 0xf: + if (kernal_in) + return *(uint16*)&kernal_rom[adr & 0x1fff]; + else + return *(uint16*)&ram[adr]; + default: // Can't happen + return 0; + } +} + +#else + +inline uint16 MOS6510::read_word(uint16 adr) +{ + return read_byte(adr) | (read_byte(adr+1) << 8); +} + +#endif + + +/* + * Write byte to I/O space + */ + +void MOS6510::write_byte_io(uint16 adr, uint8 byte) +{ + if (adr >= 0xe000) { + ram[adr] = byte; + if (adr == 0xff00) + TheREU->FF00Trigger(); + } else if (io_in) + switch ((adr >> 8) & 0x0f) { + case 0x0: // VIC + case 0x1: + case 0x2: + case 0x3: + TheVIC->WriteRegister(adr & 0x3f, byte); + return; + case 0x4: // SID + case 0x5: + case 0x6: + case 0x7: + TheSID->WriteRegister(adr & 0x1f, byte); + return; + case 0x8: // Color RAM + case 0x9: + case 0xa: + case 0xb: + color_ram[adr & 0x03ff] = byte & 0x0f; + return; + case 0xc: // CIA 1 + TheCIA1->WriteRegister(adr & 0x0f, byte); + return; + case 0xd: // CIA 2 + TheCIA2->WriteRegister(adr & 0x0f, byte); + return; + case 0xe: // REU/Open I/O + case 0xf: + if ((adr & 0xfff0) == 0xdf00) + TheREU->WriteRegister(adr & 0x0f, byte); + return; + } + else + ram[adr] = byte; +} + + +/* + * Write a byte to the CPU's address space + */ + +inline void MOS6510::write_byte(uint16 adr, uint8 byte) +{ + if (adr < 0xd000) { + ram[adr] = byte; + if (adr < 2) + new_config(); + } else + write_byte_io(adr, byte); +} + + +/* + * Read a byte from the zeropage + */ + +inline uint8 MOS6510::read_zp(uint16 adr) +{ + return ram[adr]; +} + + +/* + * Read a word (little-endian) from the zeropage + */ + +inline uint16 MOS6510::read_zp_word(uint16 adr) +{ +// !! zeropage word addressing wraps around !! +#if LITTLE_ENDIAN_UNALIGNED + return *(uint16 *)&ram[adr & 0xff]; +#else + return ram[adr & 0xff] | (ram[(adr+1) & 0xff] << 8); +#endif +} + + +/* + * Write a byte to the zeropage + */ + +inline void MOS6510::write_zp(uint16 adr, uint8 byte) +{ + ram[adr] = byte; + + // Check if memory configuration may have changed. + if (adr < 2) + new_config(); +} + + +/* + * Read byte from 6510 address space with special memory config (used by SAM) + */ + +uint8 MOS6510::ExtReadByte(uint16 adr) +{ + // Save old memory configuration + bool bi = basic_in, ki = kernal_in, ci = char_in, ii = io_in; + + // Set new configuration + basic_in = (ExtConfig & 3) == 3; + kernal_in = ExtConfig & 2; + char_in = (ExtConfig & 3) && ~(ExtConfig & 4); + io_in = (ExtConfig & 3) && (ExtConfig & 4); + + // Read byte + uint8 byte = read_byte(adr); + + // Restore old configuration + basic_in = bi; kernal_in = ki; char_in = ci; io_in = ii; + + return byte; +} + + +/* + * Write byte to 6510 address space with special memory config (used by SAM) + */ + +void MOS6510::ExtWriteByte(uint16 adr, uint8 byte) +{ + // Save old memory configuration + bool bi = basic_in, ki = kernal_in, ci = char_in, ii = io_in; + + // Set new configuration + basic_in = (ExtConfig & 3) == 3; + kernal_in = ExtConfig & 2; + char_in = (ExtConfig & 3) && ~(ExtConfig & 4); + io_in = (ExtConfig & 3) && (ExtConfig & 4); + + // Write byte + write_byte(adr, byte); + + // Restore old configuration + basic_in = bi; kernal_in = ki; char_in = ci; io_in = ii; +} + + +/* + * Read byte from 6510 address space with current memory config (used by REU) + */ + +uint8 MOS6510::REUReadByte(uint16 adr) +{ + return read_byte(adr); +} + + +/* + * Write byte to 6510 address space with current memory config (used by REU) + */ + +void MOS6510::REUWriteByte(uint16 adr, uint8 byte) +{ + write_byte(adr, byte); +} + + +/* + * Jump to address + */ + +#if PC_IS_POINTER +void MOS6510::jump(uint16 adr) +{ + if (adr < 0xa000) { + pc = ram + adr; + pc_base = ram; + } else + switch (adr >> 12) { + case 0xa: + case 0xb: + if (basic_in) { + pc = basic_rom + (adr & 0x1fff); + pc_base = basic_rom - 0xa000; + } else { + pc = ram + adr; + pc_base = ram; + } + break; + case 0xc: + pc = ram + adr; + pc_base = ram; + break; + case 0xd: + if (io_in) + illegal_jump(pc-pc_base, adr); + else if (char_in) { + pc = char_rom + (adr & 0x0fff); + pc_base = char_rom - 0xd000; + } else { + pc = ram + adr; + pc_base = ram; + } + break; + case 0xe: + case 0xf: + if (kernal_in) { + pc = kernal_rom + (adr & 0x1fff); + pc_base = kernal_rom - 0xe000; + } else { + pc = ram + adr; + pc_base = ram; + } + break; + } +} +#else +inline void MOS6510::jump(uint16 adr) +{ + pc = adr; +} +#endif + + +/* + * Adc instruction + */ + +void MOS6510::do_adc(uint8 byte) +{ + if (!d_flag) { + uint16 tmp; + + // Binary mode + tmp = a + byte + (c_flag ? 1 : 0); + c_flag = tmp > 0xff; + v_flag = !((a ^ byte) & 0x80) && ((a ^ tmp) & 0x80); + z_flag = n_flag = a = tmp; + + } else { + uint16 al, ah; + + // Decimal mode + al = (a & 0x0f) + (byte & 0x0f) + (c_flag ? 1 : 0); // Calculate lower nybble + if (al > 9) al += 6; // BCD fixup for lower nybble + + ah = (a >> 4) + (byte >> 4); // Calculate upper nybble + if (al > 0x0f) ah++; + + z_flag = a + byte + (c_flag ? 1 : 0); // Set flags + n_flag = ah << 4; // Only highest bit used + v_flag = (((ah << 4) ^ a) & 0x80) && !((a ^ byte) & 0x80); + + if (ah > 9) ah += 6; // BCD fixup for upper nybble + c_flag = ah > 0x0f; // Set carry flag + a = (ah << 4) | (al & 0x0f); // Compose result + } +} + + +/* + * Sbc instruction + */ + +void MOS6510::do_sbc(uint8 byte) +{ + uint16 tmp = a - byte - (c_flag ? 0 : 1); + + if (!d_flag) { + + // Binary mode + c_flag = tmp < 0x100; + v_flag = ((a ^ tmp) & 0x80) && ((a ^ byte) & 0x80); + z_flag = n_flag = a = tmp; + + } else { + uint16 al, ah; + + // Decimal mode + al = (a & 0x0f) - (byte & 0x0f) - (c_flag ? 0 : 1); // Calculate lower nybble + ah = (a >> 4) - (byte >> 4); // Calculate upper nybble + if (al & 0x10) { + al -= 6; // BCD fixup for lower nybble + ah--; + } + if (ah & 0x10) ah -= 6; // BCD fixup for upper nybble + + c_flag = tmp < 0x100; // Set flags + v_flag = ((a ^ tmp) & 0x80) && ((a ^ byte) & 0x80); + z_flag = n_flag = tmp; + + a = (ah << 4) | (al & 0x0f); // Compose result + } +} + + +/* + * Get 6510 register state + */ + +void MOS6510::GetState(MOS6510State *s) +{ + s->a = a; + s->x = x; + s->y = y; + + s->p = 0x20 | (n_flag & 0x80); + if (v_flag) s->p |= 0x40; + if (d_flag) s->p |= 0x08; + if (i_flag) s->p |= 0x04; + if (!z_flag) s->p |= 0x02; + if (c_flag) s->p |= 0x01; + + s->ddr = ram[0]; + s->pr = ram[1] & 0x3f; + +#if PC_IS_POINTER + s->pc = pc - pc_base; +#else + s->pc = pc; +#endif + s->sp = sp | 0x0100; + + s->intr[INT_VICIRQ] = interrupt.intr[INT_VICIRQ]; + s->intr[INT_CIAIRQ] = interrupt.intr[INT_CIAIRQ]; + s->intr[INT_NMI] = interrupt.intr[INT_NMI]; + s->intr[INT_RESET] = interrupt.intr[INT_RESET]; + s->nmi_state = nmi_state; + s->dfff_byte = dfff_byte; + s->instruction_complete = true; +} + + +/* + * Restore 6510 state + */ + +void MOS6510::SetState(MOS6510State *s) +{ + a = s->a; + x = s->x; + y = s->y; + + n_flag = s->p; + v_flag = s->p & 0x40; + d_flag = s->p & 0x08; + i_flag = s->p & 0x04; + z_flag = !(s->p & 0x02); + c_flag = s->p & 0x01; + + ram[0] = s->ddr; + ram[1] = s->pr; + new_config(); + + jump(s->pc); + sp = s->sp & 0xff; + + interrupt.intr[INT_VICIRQ] = s->intr[INT_VICIRQ]; + interrupt.intr[INT_CIAIRQ] = s->intr[INT_CIAIRQ]; + interrupt.intr[INT_NMI] = s->intr[INT_NMI]; + interrupt.intr[INT_RESET] = s->intr[INT_RESET]; + nmi_state = s->nmi_state; + dfff_byte = s->dfff_byte; +} + + +/* + * Reset CPU + */ + +void MOS6510::Reset(void) +{ + // Delete 'CBM80' if present + if (ram[0x8004] == 0xc3 && ram[0x8005] == 0xc2 && ram[0x8006] == 0xcd + && ram[0x8007] == 0x38 && ram[0x8008] == 0x30) + ram[0x8004] = 0; + + // Initialize extra 6510 registers and memory configuration + ram[0] = ram[1] = 0; + new_config(); + + // Clear all interrupt lines + interrupt.intr_any = 0; + nmi_state = false; + + // Read reset vector + jump(read_word(0xfffc)); +} + + +/* + * Illegal opcode encountered + */ + +void MOS6510::illegal_op(uint8 op, uint16 at) +{ + char illop_msg[80]; + + sprintf(illop_msg, "Illegal opcode %02x at %04x.", op, at); + ShowRequester(illop_msg, "Reset"); + the_c64->Reset(); + Reset(); +} + + +/* + * Jump to illegal address space (PC_IS_POINTER only) + */ + +void MOS6510::illegal_jump(uint16 at, uint16 to) +{ + char illop_msg[80]; + + sprintf(illop_msg, "Jump to I/O space at %04x to %04x.", at, to); + ShowRequester(illop_msg, "Reset"); + the_c64->Reset(); + Reset(); +} + + +/* + * Stack macros + */ + +// Pop a byte from the stack +#define pop_byte() ram[(++sp) | 0x0100] + +// Push a byte onto the stack +#define push_byte(byte) (ram[(sp--) & 0xff | 0x0100] = (byte)) + +// Pop processor flags from the stack +#define pop_flags() \ + n_flag = tmp = pop_byte(); \ + v_flag = tmp & 0x40; \ + d_flag = tmp & 0x08; \ + i_flag = tmp & 0x04; \ + z_flag = !(tmp & 0x02); \ + c_flag = tmp & 0x01; + +// Push processor flags onto the stack +#define push_flags(b_flag) \ + tmp = 0x20 | (n_flag & 0x80); \ + if (v_flag) tmp |= 0x40; \ + if (b_flag) tmp |= 0x10; \ + if (d_flag) tmp |= 0x08; \ + if (i_flag) tmp |= 0x04; \ + if (!z_flag) tmp |= 0x02; \ + if (c_flag) tmp |= 0x01; \ + push_byte(tmp); + + +/* + * Emulate cycles_left worth of 6510 instructions + * Returns number of cycles of last instruction + */ + +int MOS6510::EmulateLine(int cycles_left) +{ + uint8 tmp, tmp2; + uint16 adr; // Used by read_adr_abs()! + int last_cycles = 0; + + // Any pending interrupts? + if (interrupt.intr_any) { +handle_int: + if (interrupt.intr[INT_RESET]) + Reset(); + + else if (interrupt.intr[INT_NMI]) { + interrupt.intr[INT_NMI] = false; // Simulate an edge-triggered input +#if PC_IS_POINTER + push_byte((pc-pc_base) >> 8); push_byte(pc-pc_base); +#else + push_byte(pc >> 8); push_byte(pc); +#endif + push_flags(false); + i_flag = true; + jump(read_word(0xfffa)); + last_cycles = 7; + + } else if ((interrupt.intr[INT_VICIRQ] || interrupt.intr[INT_CIAIRQ]) && !i_flag) { +#if PC_IS_POINTER + push_byte((pc-pc_base) >> 8); push_byte(pc-pc_base); +#else + push_byte(pc >> 8); push_byte(pc); +#endif + push_flags(false); + i_flag = true; + jump(read_word(0xfffe)); + last_cycles = 7; + } + } + +#include "CPU_emulline.i" + + // Extension opcode + case 0xf2: +#if PC_IS_POINTER + if ((pc-pc_base) < 0xe000) { + illegal_op(0xf2, pc-pc_base-1); +#else + if (pc < 0xe000) { + illegal_op(0xf2, pc-1); +#endif + break; + } + switch (read_byte_imm()) { + case 0x00: + ram[0x90] |= TheIEC->Out(ram[0x95], ram[0xa3] & 0x80); + c_flag = false; + jump(0xedac); + break; + case 0x01: + ram[0x90] |= TheIEC->OutATN(ram[0x95]); + c_flag = false; + jump(0xedac); + break; + case 0x02: + ram[0x90] |= TheIEC->OutSec(ram[0x95]); + c_flag = false; + jump(0xedac); + break; + case 0x03: + ram[0x90] |= TheIEC->In(&a); + set_nz(a); + c_flag = false; + jump(0xedac); + break; + case 0x04: + TheIEC->SetATN(); + jump(0xedfb); + break; + case 0x05: + TheIEC->RelATN(); + jump(0xedac); + break; + case 0x06: + TheIEC->Turnaround(); + jump(0xedac); + break; + case 0x07: + TheIEC->Release(); + jump(0xedac); + break; + default: +#if PC_IS_POINTER + illegal_op(0xf2, pc-pc_base-1); +#else + illegal_op(0xf2, pc-1); +#endif + break; + } + break; + } + } + return last_cycles; +} diff --git a/archive-sources/c64emu/CPUC64.h b/archive-sources/c64emu/CPUC64.h new file mode 100644 index 0000000..1488534 --- /dev/null +++ b/archive-sources/c64emu/CPUC64.h @@ -0,0 +1,217 @@ +/* + * CPUC64.h - 6510 (C64) emulation (line based) + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _CPU_C64_H +#define _CPU_C64_H + +#include "C64.h" + + +// Set this to 1 if the 6502 PC should be represented by a real pointer +#ifndef FRODO_SC +#ifndef PC_IS_POINTER +#define PC_IS_POINTER 1 +#endif +#endif + +// Set this to 1 for more precise CPU cycle calculation +#ifndef PRECISE_CPU_CYCLES +#define PRECISE_CPU_CYCLES 0 +#endif + +// Set this to 1 for instruction-aligned CIA emulation +#ifndef PRECISE_CIA_CYCLES +#define PRECISE_CIA_CYCLES 0 +#endif + + +// Interrupt types +enum { + INT_VICIRQ, + INT_CIAIRQ, + INT_NMI + // INT_RESET (private) +}; + + +class MOS6569; +class MOS6581; +class MOS6526_1; +class MOS6526_2; +class REU; +class IEC; +struct MOS6510State; + + +// 6510 emulation (C64) +class MOS6510 { +public: + MOS6510(C64 *c64, uint8 *Ram, uint8 *Basic, uint8 *Kernal, uint8 *Char, uint8 *Color); + +#ifdef FRODO_SC + void EmulateCycle(void); // Emulate one clock cycle +#else + int EmulateLine(int cycles_left); // Emulate until cycles_left underflows +#endif + void Reset(void); + void AsyncReset(void); // Reset the CPU asynchronously + void AsyncNMI(void); // Raise NMI asynchronously (NMI pulse) + void GetState(MOS6510State *s); + void SetState(MOS6510State *s); + uint8 ExtReadByte(uint16 adr); + void ExtWriteByte(uint16 adr, uint8 byte); + uint8 REUReadByte(uint16 adr); + void REUWriteByte(uint16 adr, uint8 byte); + + void TriggerVICIRQ(void); + void ClearVICIRQ(void); + void TriggerCIAIRQ(void); + void ClearCIAIRQ(void); + void TriggerNMI(void); + void ClearNMI(void); + + int ExtConfig; // Memory configuration for ExtRead/WriteByte (0..7) + + MOS6569 *TheVIC; // Pointer to VIC + MOS6581 *TheSID; // Pointer to SID + MOS6526_1 *TheCIA1; // Pointer to CIA 1 + MOS6526_2 *TheCIA2; // Pointer to CIA 2 + REU *TheREU; // Pointer to REU + IEC *TheIEC; // Pointer to drive array + +#ifdef FRODO_SC + bool BALow; // BA line for Frodo SC +#endif + +private: + uint8 read_byte(uint16 adr); + uint8 read_byte_io(uint16 adr); + uint16 read_word(uint16 adr); + void write_byte(uint16 adr, uint8 byte); + void write_byte_io(uint16 adr, uint8 byte); + + uint8 read_zp(uint16 adr); + uint16 read_zp_word(uint16 adr); + void write_zp(uint16 adr, uint8 byte); + + void new_config(void); + void jump(uint16 adr); + void illegal_op(uint8 op, uint16 at); + void illegal_jump(uint16 at, uint16 to); + + void do_adc(uint8 byte); + void do_sbc(uint8 byte); + + uint8 read_emulator_id(uint16 adr); + + C64 *the_c64; // Pointer to C64 object + + uint8 *ram; // Pointer to main RAM + uint8 *basic_rom, *kernal_rom, *char_rom, *color_ram; // Pointers to ROMs and color RAM + + union { // Pending interrupts + uint8 intr[4]; // Index: See definitions above + unsigned long intr_any; + } interrupt; + bool nmi_state; // State of NMI line + + uint8 n_flag, z_flag; + bool v_flag, d_flag, i_flag, c_flag; + uint8 a, x, y, sp; + +#if PC_IS_POINTER + uint8 *pc, *pc_base; +#else + uint16 pc; +#endif + +#ifdef FRODO_SC + uint32 first_irq_cycle, first_nmi_cycle; + + uint8 state, op; // Current state and opcode + uint16 ar, ar2; // Address registers + uint8 rdbuf; // Data buffer for RMW instructions + uint8 ddr, pr; // Processor port +#else + int borrowed_cycles; // Borrowed cycles from next line +#endif + + bool basic_in, kernal_in, char_in, io_in; + uint8 dfff_byte; +}; + +// 6510 state +struct MOS6510State { + uint8 a, x, y; + uint8 p; // Processor flags + uint8 ddr, pr; // Port + uint16 pc, sp; + uint8 intr[4]; // Interrupt state + bool nmi_state; + uint8 dfff_byte; + bool instruction_complete; +}; + + +// Interrupt functions +#ifdef FRODO_SC +inline void MOS6510::TriggerVICIRQ(void) +{ + if (!(interrupt.intr[INT_VICIRQ] || interrupt.intr[INT_CIAIRQ])) + first_irq_cycle = the_c64->CycleCounter; + interrupt.intr[INT_VICIRQ] = true; +} + +inline void MOS6510::TriggerCIAIRQ(void) +{ + if (!(interrupt.intr[INT_VICIRQ] || interrupt.intr[INT_CIAIRQ])) + first_irq_cycle = the_c64->CycleCounter; + interrupt.intr[INT_CIAIRQ] = true; +} + +inline void MOS6510::TriggerNMI(void) +{ + if (!nmi_state) { + nmi_state = true; + interrupt.intr[INT_NMI] = true; + first_nmi_cycle = the_c64->CycleCounter; + } +} +#else +inline void MOS6510::TriggerVICIRQ(void) +{ + interrupt.intr[INT_VICIRQ] = true; +} + +inline void MOS6510::TriggerCIAIRQ(void) +{ + interrupt.intr[INT_CIAIRQ] = true; +} + +inline void MOS6510::TriggerNMI(void) +{ + if (!nmi_state) { + nmi_state = true; + interrupt.intr[INT_NMI] = true; + } +} +#endif +inline void MOS6510::ClearVICIRQ(void) +{ + interrupt.intr[INT_VICIRQ] = false; +} + +inline void MOS6510::ClearCIAIRQ(void) +{ + interrupt.intr[INT_CIAIRQ] = false; +} + +inline void MOS6510::ClearNMI(void) +{ + nmi_state = false; +} + +#endif diff --git a/archive-sources/c64emu/CPU_common.cpp b/archive-sources/c64emu/CPU_common.cpp new file mode 100644 index 0000000..145d1e8 --- /dev/null +++ b/archive-sources/c64emu/CPU_common.cpp @@ -0,0 +1,83 @@ +/* + * CPU_common.cpp - Definitions common to 6502/6510 SC emulation + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysdeps.h" + +#include "CPU_common.h" + + +// Addressing mode for each opcode (first part of execution) (Frodo SC) +const uint8 ModeTab[256] = { + O_BRK, A_INDX, 1, M_INDX, A_ZERO, A_ZERO, M_ZERO, M_ZERO, // 00 + O_PHP, O_ORA_I,O_ASL_A,O_ANC_I,A_ABS, A_ABS, M_ABS, M_ABS, + O_BPL, AE_INDY,1, M_INDY, A_ZEROX,A_ZEROX,M_ZEROX,M_ZEROX,// 10 + O_CLC, AE_ABSY,O_NOP, M_ABSY, AE_ABSX,AE_ABSX,M_ABSX, M_ABSX, + O_JSR, A_INDX, 1, M_INDX, A_ZERO, A_ZERO, M_ZERO, M_ZERO, // 20 + O_PLP, O_AND_I,O_ROL_A,O_ANC_I,A_ABS, A_ABS, M_ABS, M_ABS, + O_BMI, AE_INDY,1, M_INDY, A_ZEROX,A_ZEROX,M_ZEROX,M_ZEROX,// 30 + O_SEC, AE_ABSY,O_NOP, M_ABSY, AE_ABSX,AE_ABSX,M_ABSX, M_ABSX, + O_RTI, A_INDX, 1, M_INDX, A_ZERO, A_ZERO, M_ZERO, M_ZERO, // 40 + O_PHA, O_EOR_I,O_LSR_A,O_ASR_I,O_JMP, A_ABS, M_ABS, M_ABS, + O_BVC, AE_INDY,1, M_INDY, A_ZEROX,A_ZEROX,M_ZEROX,M_ZEROX,// 50 + O_CLI, AE_ABSY,O_NOP, M_ABSY, AE_ABSX,AE_ABSX,M_ABSX, M_ABSX, + O_RTS, A_INDX, 1, M_INDX, A_ZERO, A_ZERO, M_ZERO, M_ZERO, // 60 + O_PLA, O_ADC_I,O_ROR_A,O_ARR_I,A_ABS, A_ABS, M_ABS, M_ABS, + O_BVS, AE_INDY,1, M_INDY, A_ZEROX,A_ZEROX,M_ZEROX,M_ZEROX,// 70 + O_SEI, AE_ABSY,O_NOP, M_ABSY, AE_ABSX,AE_ABSX,M_ABSX, M_ABSX, + O_NOP_I,A_INDX, O_NOP_I,A_INDX, A_ZERO, A_ZERO, A_ZERO, A_ZERO, // 80 + O_DEY, O_NOP_I,O_TXA, O_ANE_I,A_ABS, A_ABS, A_ABS, A_ABS, + O_BCC, A_INDY, 1, A_INDY, A_ZEROX,A_ZEROX,A_ZEROY,A_ZEROY,// 90 + O_TYA, A_ABSY, O_TXS, A_ABSY, A_ABSX, A_ABSX, A_ABSY, A_ABSY, + O_LDY_I,A_INDX, O_LDX_I,A_INDX, A_ZERO, A_ZERO, A_ZERO, A_ZERO, // a0 + O_TAY, O_LDA_I,O_TAX, O_LXA_I,A_ABS, A_ABS, A_ABS, A_ABS, + O_BCS, AE_INDY,1, AE_INDY,A_ZEROX,A_ZEROX,A_ZEROY,A_ZEROY,// b0 + O_CLV, AE_ABSY,O_TSX, AE_ABSY,AE_ABSX,AE_ABSX,AE_ABSY,AE_ABSY, + O_CPY_I,A_INDX, O_NOP_I,M_INDX, A_ZERO, A_ZERO, M_ZERO, M_ZERO, // c0 + O_INY, O_CMP_I,O_DEX, O_SBX_I,A_ABS, A_ABS, M_ABS, M_ABS, + O_BNE, AE_INDY,1, M_INDY, A_ZEROX,A_ZEROX,M_ZEROX,M_ZEROX,// d0 + O_CLD, AE_ABSY,O_NOP, M_ABSY, AE_ABSX,AE_ABSX,M_ABSX, M_ABSX, + O_CPX_I,A_INDX, O_NOP_I,M_INDX, A_ZERO, A_ZERO, M_ZERO, M_ZERO, // e0 + O_INX, O_SBC_I,O_NOP, O_SBC_I,A_ABS, A_ABS, M_ABS, M_ABS, + O_BEQ, AE_INDY,O_EXT, M_INDY, A_ZEROX,A_ZEROX,M_ZEROX,M_ZEROX,// f0 + O_SED, AE_ABSY,O_NOP, M_ABSY, AE_ABSX,AE_ABSX,M_ABSX, M_ABSX +}; + + +// Operation for each opcode (second part of execution) (Frodo SC) +const uint8 OpTab[256] = { + 1, O_ORA, 1, O_SLO, O_NOP_A,O_ORA, O_ASL, O_SLO, // 00 + 1, 1, 1, 1, O_NOP_A,O_ORA, O_ASL, O_SLO, + 1, O_ORA, 1, O_SLO, O_NOP_A,O_ORA, O_ASL, O_SLO, // 10 + 1, O_ORA, 1, O_SLO, O_NOP_A,O_ORA, O_ASL, O_SLO, + 1, O_AND, 1, O_RLA, O_BIT, O_AND, O_ROL, O_RLA, // 20 + 1, 1, 1, 1, O_BIT, O_AND, O_ROL, O_RLA, + 1, O_AND, 1, O_RLA, O_NOP_A,O_AND, O_ROL, O_RLA, // 30 + 1, O_AND, 1, O_RLA, O_NOP_A,O_AND, O_ROL, O_RLA, + 1, O_EOR, 1, O_SRE, O_NOP_A,O_EOR, O_LSR, O_SRE, // 40 + 1, 1, 1, 1, 1, O_EOR, O_LSR, O_SRE, + 1, O_EOR, 1, O_SRE, O_NOP_A,O_EOR, O_LSR, O_SRE, // 50 + 1, O_EOR, 1, O_SRE, O_NOP_A,O_EOR, O_LSR, O_SRE, + 1, O_ADC, 1, O_RRA, O_NOP_A,O_ADC, O_ROR, O_RRA, // 60 + 1, 1, 1, 1, O_JMP_I,O_ADC, O_ROR, O_RRA, + 1, O_ADC, 1, O_RRA, O_NOP_A,O_ADC, O_ROR, O_RRA, // 70 + 1, O_ADC, 1, O_RRA, O_NOP_A,O_ADC, O_ROR, O_RRA, + 1, O_STA, 1, O_SAX, O_STY, O_STA, O_STX, O_SAX, // 80 + 1, 1, 1, 1, O_STY, O_STA, O_STX, O_SAX, + 1, O_STA, 1, O_SHA, O_STY, O_STA, O_STX, O_SAX, // 90 + 1, O_STA, 1, O_SHS, O_SHY, O_STA, O_SHX, O_SHA, + 1, O_LDA, 1, O_LAX, O_LDY, O_LDA, O_LDX, O_LAX, // a0 + 1, 1, 1, 1, O_LDY, O_LDA, O_LDX, O_LAX, + 1, O_LDA, 1, O_LAX, O_LDY, O_LDA, O_LDX, O_LAX, // b0 + 1, O_LDA, 1, O_LAS, O_LDY, O_LDA, O_LDX, O_LAX, + 1, O_CMP, 1, O_DCP, O_CPY, O_CMP, O_DEC, O_DCP, // c0 + 1, 1, 1, 1, O_CPY, O_CMP, O_DEC, O_DCP, + 1, O_CMP, 1, O_DCP, O_NOP_A,O_CMP, O_DEC, O_DCP, // d0 + 1, O_CMP, 1, O_DCP, O_NOP_A,O_CMP, O_DEC, O_DCP, + 1, O_SBC, 1, O_ISB, O_CPX, O_SBC, O_INC, O_ISB, // e0 + 1, 1, 1, 1, O_CPX, O_SBC, O_INC, O_ISB, + 1, O_SBC, 1, O_ISB, O_NOP_A,O_SBC, O_INC, O_ISB, // f0 + 1, O_SBC, 1, O_ISB, O_NOP_A,O_SBC, O_INC, O_ISB +}; diff --git a/archive-sources/c64emu/CPU_common.h b/archive-sources/c64emu/CPU_common.h new file mode 100644 index 0000000..48f73b2 --- /dev/null +++ b/archive-sources/c64emu/CPU_common.h @@ -0,0 +1,76 @@ +/* + * CPU_common.h - Definitions common to 6502/6510 SC emulation + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _CPU_COMMON_H_ +#define _CPU_COMMON_H_ + + +// States for addressing modes/operations (Frodo SC) +enum { + // Read effective address, no extra cycles + A_ZERO=0x18, + A_ZEROX, A_ZEROX1, + A_ZEROY, A_ZEROY1, + A_ABS, A_ABS1, + A_ABSX, A_ABSX1, A_ABSX2, A_ABSX3, + A_ABSY, A_ABSY1, A_ABSY2, A_ABSY3, + A_INDX, A_INDX1, A_INDX2, A_INDX3, + A_INDY, A_INDY1, A_INDY2, A_INDY3, A_INDY4, + + // Read effective address, extra cycle on page crossing + AE_ABSX, AE_ABSX1, AE_ABSX2, + AE_ABSY, AE_ABSY1, AE_ABSY2, + AE_INDY, AE_INDY1, AE_INDY2, AE_INDY3, + + // Read operand and write it back (for RMW instructions), no extra cycles + M_ZERO, + M_ZEROX, M_ZEROX1, + M_ZEROY, M_ZEROY1, + M_ABS, M_ABS1, + M_ABSX, M_ABSX1, M_ABSX2, M_ABSX3, + M_ABSY, M_ABSY1, M_ABSY2, M_ABSY3, + M_INDX, M_INDX1, M_INDX2, M_INDX3, + M_INDY, M_INDY1, M_INDY2, M_INDY3, M_INDY4, + RMW_DO_IT, RMW_DO_IT1, + + // Operations (_I = Immediate/Indirect, _A = Accumulator) + O_LDA, O_LDA_I, O_LDX, O_LDX_I, O_LDY, O_LDY_I, + O_STA, O_STX, O_STY, + O_TAX, O_TXA, O_TAY, O_TYA, O_TSX, O_TXS, + O_ADC, O_ADC_I, O_SBC, O_SBC_I, + O_INX, O_DEX, O_INY, O_DEY, O_INC, O_DEC, + O_AND, O_AND_I, O_ORA, O_ORA_I, O_EOR, O_EOR_I, + O_CMP, O_CMP_I, O_CPX, O_CPX_I, O_CPY, O_CPY_I, + O_BIT, + O_ASL, O_ASL_A, O_LSR, O_LSR_A, O_ROL, O_ROL_A, O_ROR, O_ROR_A, + O_PHA, O_PHA1, O_PLA, O_PLA1, O_PLA2, + O_PHP, O_PHP1, O_PLP, O_PLP1, O_PLP2, + O_JMP, O_JMP1, O_JMP_I, O_JMP_I1, + O_JSR, O_JSR1, O_JSR2, O_JSR3, O_JSR4, + O_RTS, O_RTS1, O_RTS2, O_RTS3, O_RTS4, + O_RTI, O_RTI1, O_RTI2, O_RTI3, O_RTI4, + O_BRK, O_BRK1, O_BRK2, O_BRK3, O_BRK4, O_BRK5, O_BRK5NMI, + O_BCS, O_BCC, O_BEQ, O_BNE, O_BVS, O_BVC, O_BMI, O_BPL, + O_BRANCH_NP, O_BRANCH_BP, O_BRANCH_BP1, O_BRANCH_FP, O_BRANCH_FP1, + O_SEC, O_CLC, O_SED, O_CLD, O_SEI, O_CLI, O_CLV, + O_NOP, + + O_NOP_I, O_NOP_A, + O_LAX, O_SAX, + O_SLO, O_RLA, O_SRE, O_RRA, O_DCP, O_ISB, + O_ANC_I, O_ASR_I, O_ARR_I, O_ANE_I, O_LXA_I, O_SBX_I, + O_LAS, O_SHS, O_SHY, O_SHX, O_SHA, + O_EXT +}; + + +// Addressing mode for each opcode (first part of execution) (Frodo SC) +extern const uint8 ModeTab[256]; + +// Operation for each opcode (second part of execution) (Frodo SC) +extern const uint8 OpTab[256]; + +#endif diff --git a/archive-sources/c64emu/CPU_emulcycle.i b/archive-sources/c64emu/CPU_emulcycle.i new file mode 100644 index 0000000..9464504 --- /dev/null +++ b/archive-sources/c64emu/CPU_emulcycle.i @@ -0,0 +1,1100 @@ +/* + * CPU_emulcycle.i - SC 6510/6502 emulation core (body of + * EmulateCycle() function, the same for + * both 6510 and 6502) + * + * Frodo (C) 1994-1997 Christian Bauer + */ + + +/* + * Stack macros + */ + +// Pop processor flags from the stack +#define pop_flags() \ + read_to(sp | 0x100, data); \ + n_flag = data; \ + v_flag = data & 0x40; \ + d_flag = data & 0x08; \ + i_flag = data & 0x04; \ + z_flag = !(data & 0x02); \ + c_flag = data & 0x01; + +// Push processor flags onto the stack +#define push_flags(b_flag) \ + data = 0x20 | (n_flag & 0x80); \ + if (v_flag) data |= 0x40; \ + if (b_flag) data |= 0x10; \ + if (d_flag) data |= 0x08; \ + if (i_flag) data |= 0x04; \ + if (!z_flag) data |= 0x02; \ + if (c_flag) data |= 0x01; \ + write_byte(sp-- | 0x100, data); + + +/* + * Other macros + */ + +// Branch (cycle 1) +#define Branch(flag) \ + read_to(pc++, data); \ + if (flag) { \ + ar = pc + (int8)data; \ + if ((ar >> 8) != (pc >> 8)) { \ + if (data & 0x80) \ + state = O_BRANCH_BP; \ + else \ + state = O_BRANCH_FP; \ + } else \ + state = O_BRANCH_NP; \ + } else \ + state = 0; \ + break; + +// Set N and Z flags according to byte +#define set_nz(x) (z_flag = n_flag = (x)) + +// Address fetch of RMW instruction done, now read and write operand +#define DoRMW state = RMW_DO_IT; break; + +// Operand fetch done, now execute opcode +#define Execute state = OpTab[op]; break; + +// Last cycle of opcode +#define Last state = 0; break; + + +/* + * EmulCycle() function + */ + + switch (state) { + + + // Opcode fetch (cycle 0) + case 0: + read_to(pc++, op); + state = ModeTab[op]; + break; + + + // IRQ + case 0x0008: + read_idle(pc); + state = 0x0009; + break; + case 0x0009: + read_idle(pc); + state = 0x000a; + break; + case 0x000a: + write_byte(sp-- | 0x100, pc >> 8); + state = 0x000b; + break; + case 0x000b: + write_byte(sp-- | 0x100, pc); + state = 0x000c; + break; + case 0x000c: + push_flags(false); + i_flag = true; + state = 0x000d; + break; + case 0x000d: + read_to(0xfffe, pc); + state = 0x000e; + break; + case 0x000e: + read_to(0xffff, data); + pc |= data << 8; + Last; + + + // NMI + case 0x0010: + read_idle(pc); + state = 0x0011; + break; + case 0x0011: + read_idle(pc); + state = 0x0012; + break; + case 0x0012: + write_byte(sp-- | 0x100, pc >> 8); + state = 0x0013; + break; + case 0x0013: + write_byte(sp-- | 0x100, pc); + state = 0x0014; + break; + case 0x0014: + push_flags(false); + i_flag = true; + state = 0x0015; + break; + case 0x0015: + read_to(0xfffa, pc); + state = 0x0016; + break; + case 0x0016: + read_to(0xfffb, data); + pc |= data << 8; + Last; + + + // Addressing modes: Fetch effective address, no extra cycles (-> ar) + case A_ZERO: + read_to(pc++, ar); + Execute; + + case A_ZEROX: + read_to(pc++, ar); + state = A_ZEROX1; + break; + case A_ZEROX1: + read_idle(ar); + ar = (ar + x) & 0xff; + Execute; + + case A_ZEROY: + read_to(pc++, ar); + state = A_ZEROY1; + break; + case A_ZEROY1: + read_idle(ar); + ar = (ar + y) & 0xff; + Execute; + + case A_ABS: + read_to(pc++, ar); + state = A_ABS1; + break; + case A_ABS1: + read_to(pc++, data); + ar = ar | (data << 8); + Execute; + + case A_ABSX: + read_to(pc++, ar); + state = A_ABSX1; + break; + case A_ABSX1: + read_to(pc++, ar2); // Note: Some undocumented opcodes rely on the value of ar2 + if (ar+x < 0x100) + state = A_ABSX2; + else + state = A_ABSX3; + ar = (ar + x) & 0xff | (ar2 << 8); + break; + case A_ABSX2: // No page crossed + read_idle(ar); + Execute; + case A_ABSX3: // Page crossed + read_idle(ar); + ar += 0x100; + Execute; + + case A_ABSY: + read_to(pc++, ar); + state = A_ABSY1; + break; + case A_ABSY1: + read_to(pc++, ar2); // Note: Some undocumented opcodes rely on the value of ar2 + if (ar+y < 0x100) + state = A_ABSY2; + else + state = A_ABSY3; + ar = (ar + y) & 0xff | (ar2 << 8); + break; + case A_ABSY2: // No page crossed + read_idle(ar); + Execute; + case A_ABSY3: // Page crossed + read_idle(ar); + ar += 0x100; + Execute; + + case A_INDX: + read_to(pc++, ar2); + state = A_INDX1; + break; + case A_INDX1: + read_idle(ar2); + ar2 = (ar2 + x) & 0xff; + state = A_INDX2; + break; + case A_INDX2: + read_to(ar2, ar); + state = A_INDX3; + break; + case A_INDX3: + read_to((ar2 + 1) & 0xff, data); + ar = ar | (data << 8); + Execute; + + case A_INDY: + read_to(pc++, ar2); + state = A_INDY1; + break; + case A_INDY1: + read_to(ar2, ar); + state = A_INDY2; + break; + case A_INDY2: + read_to((ar2 + 1) & 0xff, ar2); // Note: Some undocumented opcodes rely on the value of ar2 + if (ar+y < 0x100) + state = A_INDY3; + else + state = A_INDY4; + ar = (ar + y) & 0xff | (ar2 << 8); + break; + case A_INDY3: // No page crossed + read_idle(ar); + Execute; + case A_INDY4: // Page crossed + read_idle(ar); + ar += 0x100; + Execute; + + + // Addressing modes: Fetch effective address, extra cycle on page crossing (-> ar) + case AE_ABSX: + read_to(pc++, ar); + state = AE_ABSX1; + break; + case AE_ABSX1: + read_to(pc++, data); + if (ar+x < 0x100) { + ar = (ar + x) & 0xff | (data << 8); + Execute; + } else { + ar = (ar + x) & 0xff | (data << 8); + state = AE_ABSX2; + } + break; + case AE_ABSX2: // Page crossed + read_idle(ar); + ar += 0x100; + Execute; + + case AE_ABSY: + read_to(pc++, ar); + state = AE_ABSY1; + break; + case AE_ABSY1: + read_to(pc++, data); + if (ar+y < 0x100) { + ar = (ar + y) & 0xff | (data << 8); + Execute; + } else { + ar = (ar + y) & 0xff | (data << 8); + state = AE_ABSY2; + } + break; + case AE_ABSY2: // Page crossed + read_idle(ar); + ar += 0x100; + Execute; + + case AE_INDY: + read_to(pc++, ar2); + state = AE_INDY1; + break; + case AE_INDY1: + read_to(ar2, ar); + state = AE_INDY2; + break; + case AE_INDY2: + read_to((ar2 + 1) & 0xff, data); + if (ar+y < 0x100) { + ar = (ar + y) & 0xff | (data << 8); + Execute; + } else { + ar = (ar + y) & 0xff | (data << 8); + state = AE_INDY3; + } + break; + case AE_INDY3: // Page crossed + read_idle(ar); + ar += 0x100; + Execute; + + + // Addressing modes: Read operand, write it back, no extra cycles (-> ar, rdbuf) + case M_ZERO: + read_to(pc++, ar); + DoRMW; + + case M_ZEROX: + read_to(pc++, ar); + state = M_ZEROX1; + break; + case M_ZEROX1: + read_idle(ar); + ar = (ar + x) & 0xff; + DoRMW; + + case M_ZEROY: + read_to(pc++, ar); + state = M_ZEROY1; + break; + case M_ZEROY1: + read_idle(ar); + ar = (ar + y) & 0xff; + DoRMW; + + case M_ABS: + read_to(pc++, ar); + state = M_ABS1; + break; + case M_ABS1: + read_to(pc++, data); + ar = ar | (data << 8); + DoRMW; + + case M_ABSX: + read_to(pc++, ar); + state = M_ABSX1; + break; + case M_ABSX1: + read_to(pc++, data); + if (ar+x < 0x100) + state = M_ABSX2; + else + state = M_ABSX3; + ar = (ar + x) & 0xff | (data << 8); + break; + case M_ABSX2: // No page crossed + read_idle(ar); + DoRMW; + case M_ABSX3: // Page crossed + read_idle(ar); + ar += 0x100; + DoRMW; + + case M_ABSY: + read_to(pc++, ar); + state = M_ABSY1; + break; + case M_ABSY1: + read_to(pc++, data); + if (ar+y < 0x100) + state = M_ABSY2; + else + state = M_ABSY3; + ar = (ar + y) & 0xff | (data << 8); + break; + case M_ABSY2: // No page crossed + read_idle(ar); + DoRMW; + case M_ABSY3: // Page crossed + read_idle(ar); + ar += 0x100; + DoRMW; + + case M_INDX: + read_to(pc++, ar2); + state = M_INDX1; + break; + case M_INDX1: + read_idle(ar2); + ar2 = (ar2 + x) & 0xff; + state = M_INDX2; + break; + case M_INDX2: + read_to(ar2, ar); + state = M_INDX3; + break; + case M_INDX3: + read_to((ar2 + 1) & 0xff, data); + ar = ar | (data << 8); + DoRMW; + + case M_INDY: + read_to(pc++, ar2); + state = M_INDY1; + break; + case M_INDY1: + read_to(ar2, ar); + state = M_INDY2; + break; + case M_INDY2: + read_to((ar2 + 1) & 0xff, data); + if (ar+y < 0x100) + state = M_INDY3; + else + state = M_INDY4; + ar = (ar + y) & 0xff | (data << 8); + break; + case M_INDY3: // No page crossed + read_idle(ar); + DoRMW; + case M_INDY4: // Page crossed + read_idle(ar); + ar += 0x100; + DoRMW; + + case RMW_DO_IT: + read_to(ar, rdbuf); + state = RMW_DO_IT1; + break; + case RMW_DO_IT1: + write_byte(ar, rdbuf); + Execute; + + + // Load group + case O_LDA: + read_to(ar, data); + set_nz(a = data); + Last; + case O_LDA_I: + read_to(pc++, data); + set_nz(a = data); + Last; + + case O_LDX: + read_to(ar, data); + set_nz(x = data); + Last; + case O_LDX_I: + read_to(pc++, data); + set_nz(x = data); + Last; + + case O_LDY: + read_to(ar, data); + set_nz(y = data); + Last; + case O_LDY_I: + read_to(pc++, data); + set_nz(y = data); + Last; + + + // Store group + case O_STA: + write_byte(ar, a); + Last; + + case O_STX: + write_byte(ar, x); + Last; + + case O_STY: + write_byte(ar, y); + Last; + + + // Transfer group + case O_TAX: + read_idle(pc); + set_nz(x = a); + Last; + + case O_TXA: + read_idle(pc); + set_nz(a = x); + Last; + + case O_TAY: + read_idle(pc); + set_nz(y = a); + Last; + + case O_TYA: + read_idle(pc); + set_nz(a = y); + Last; + + case O_TSX: + read_idle(pc); + set_nz(x = sp); + Last; + + case O_TXS: + read_idle(pc); + sp = x; + Last; + + + // Arithmetic group + case O_ADC: + read_to(ar, data); + do_adc(data); + Last; + case O_ADC_I: + read_to(pc++, data); + do_adc(data); + Last; + + case O_SBC: + read_to(ar, data); + do_sbc(data); + Last; + case O_SBC_I: + read_to(pc++, data); + do_sbc(data); + Last; + + + // Increment/decrement group + case O_INX: + read_idle(pc); + set_nz(++x); + Last; + + case O_DEX: + read_idle(pc); + set_nz(--x); + Last; + + case O_INY: + read_idle(pc); + set_nz(++y); + Last; + + case O_DEY: + read_idle(pc); + set_nz(--y); + Last; + + case O_INC: + write_byte(ar, set_nz(rdbuf + 1)); + Last; + + case O_DEC: + write_byte(ar, set_nz(rdbuf - 1)); + Last; + + + // Logic group + case O_AND: + read_to(ar, data); + set_nz(a &= data); + Last; + case O_AND_I: + read_to(pc++, data); + set_nz(a &= data); + Last; + + case O_ORA: + read_to(ar, data); + set_nz(a |= data); + Last; + case O_ORA_I: + read_to(pc++, data); + set_nz(a |= data); + Last; + + case O_EOR: + read_to(ar, data); + set_nz(a ^= data); + Last; + case O_EOR_I: + read_to(pc++, data); + set_nz(a ^= data); + Last; + + // Compare group + case O_CMP: + read_to(ar, data); + set_nz(ar = a - data); + c_flag = ar < 0x100; + Last; + case O_CMP_I: + read_to(pc++, data); + set_nz(ar = a - data); + c_flag = ar < 0x100; + Last; + + case O_CPX: + read_to(ar, data); + set_nz(ar = x - data); + c_flag = ar < 0x100; + Last; + case O_CPX_I: + read_to(pc++, data); + set_nz(ar = x - data); + c_flag = ar < 0x100; + Last; + + case O_CPY: + read_to(ar, data); + set_nz(ar = y - data); + c_flag = ar < 0x100; + Last; + case O_CPY_I: + read_to(pc++, data); + set_nz(ar = y - data); + c_flag = ar < 0x100; + Last; + + + // Bit-test group + case O_BIT: + read_to(ar, data); + z_flag = a & data; + n_flag = data; + v_flag = data & 0x40; + Last; + + + // Shift/rotate group + case O_ASL: + c_flag = rdbuf & 0x80; + write_byte(ar, set_nz(rdbuf << 1)); + Last; + case O_ASL_A: + read_idle(pc); + c_flag = a & 0x80; + set_nz(a <<= 1); + Last; + + case O_LSR: + c_flag = rdbuf & 0x01; + write_byte(ar, set_nz(rdbuf >> 1)); + Last; + case O_LSR_A: + read_idle(pc); + c_flag = a & 0x01; + set_nz(a >>= 1); + Last; + + case O_ROL: + write_byte(ar, set_nz(c_flag ? (rdbuf << 1) | 0x01 : rdbuf << 1)); + c_flag = rdbuf & 0x80; + Last; + case O_ROL_A: + read_idle(pc); + data = a & 0x80; + set_nz(a = c_flag ? (a << 1) | 0x01 : a << 1); + c_flag = data; + Last; + + case O_ROR: + write_byte(ar, set_nz(c_flag ? (rdbuf >> 1) | 0x80 : rdbuf >> 1)); + c_flag = rdbuf & 0x01; + Last; + case O_ROR_A: + read_idle(pc); + data = a & 0x01; + set_nz(a = (c_flag ? (a >> 1) | 0x80 : a >> 1)); + c_flag = data; + Last; + + + // Stack group + case O_PHA: + read_idle(pc); + state = O_PHA1; + break; + case O_PHA1: + write_byte(sp-- | 0x100, a); + Last; + + case O_PLA: + read_idle(pc); + state = O_PLA1; + break; + case O_PLA1: + read_idle(sp++ | 0x100); + state = O_PLA2; + break; + case O_PLA2: + read_to(sp | 0x100, data); + set_nz(a = data); + Last; + + case O_PHP: + read_idle(pc); + state = O_PHP1; + break; + case O_PHP1: + push_flags(true); + Last; + + case O_PLP: + read_idle(pc); + state = O_PLP1; + break; + case O_PLP1: + read_idle(sp++ | 0x100); + state = O_PLP2; + break; + case O_PLP2: + pop_flags(); + Last; + + + // Jump/branch group + case O_JMP: + read_to(pc++, ar); + state = O_JMP1; + break; + case O_JMP1: + read_to(pc, data); + pc = (data << 8) | ar; + Last; + + case O_JMP_I: + read_to(ar, pc); + state = O_JMP_I1; + break; + case O_JMP_I1: + read_to((ar + 1) & 0xff | ar & 0xff00, data); + pc |= data << 8; + Last; + + case O_JSR: + read_to(pc++, ar); + state = O_JSR1; + break; + case O_JSR1: + read_idle(sp | 0x100); + state = O_JSR2; + break; + case O_JSR2: + write_byte(sp-- | 0x100, pc >> 8); + state = O_JSR3; + break; + case O_JSR3: + write_byte(sp-- | 0x100, pc); + state = O_JSR4; + break; + case O_JSR4: + read_to(pc++, data); + pc = ar | (data << 8); + Last; + + case O_RTS: + read_idle(pc); + state = O_RTS1; + break; + case O_RTS1: + read_idle(sp++ | 0x100); + state = O_RTS2; + break; + case O_RTS2: + read_to(sp++ | 0x100, pc); + state = O_RTS3; + break; + case O_RTS3: + read_to(sp | 0x100, data); + pc |= data << 8; + state = O_RTS4; + break; + case O_RTS4: + read_idle(pc++); + Last; + + case O_RTI: + read_idle(pc); + state = O_RTI1; + break; + case O_RTI1: + read_idle(sp++ | 0x100); + state = O_RTI2; + break; + case O_RTI2: + pop_flags(); + sp++; + state = O_RTI3; + break; + case O_RTI3: + read_to(sp++ | 0x100, pc); + state = O_RTI4; + break; + case O_RTI4: + read_to(sp | 0x100, data); + pc |= data << 8; + Last; + + case O_BRK: + read_idle(pc++); + state = O_BRK1; + break; + case O_BRK1: + write_byte(sp-- | 0x100, pc >> 8); + state = O_BRK2; + break; + case O_BRK2: + write_byte(sp-- | 0x100, pc); + state = O_BRK3; + break; + case O_BRK3: + push_flags(true); + i_flag = true; +#ifndef IS_CPU_1541 + if (interrupt.intr[INT_NMI]) { // BRK interrupted by NMI? + interrupt.intr[INT_NMI] = false; // Simulate an edge-triggered input + state = 0x0015; // Jump to NMI sequence + break; + } +#endif + state = O_BRK4; + break; + case O_BRK4: +#ifndef IS_CPU_1541 + first_nmi_cycle++; // Delay NMI +#endif + read_to(0xfffe, pc); + state = O_BRK5; + break; + case O_BRK5: + read_to(0xffff, data); + pc |= data << 8; + Last; + + case O_BCS: + Branch(c_flag); + + case O_BCC: + Branch(!c_flag); + + case O_BEQ: + Branch(!z_flag); + + case O_BNE: + Branch(z_flag); + + case O_BVS: +#ifndef IS_CPU_1541 + Branch(v_flag); +#else + Branch((via2_pcr & 0x0e) == 0x0e ? 1 : v_flag); // GCR byte ready flag +#endif + + case O_BVC: +#ifndef IS_CPU_1541 + Branch(!v_flag); +#else + Branch(!((via2_pcr & 0x0e) == 0x0e) ? 0 : v_flag); // GCR byte ready flag +#endif + + case O_BMI: + Branch(n_flag & 0x80); + + case O_BPL: + Branch(!(n_flag & 0x80)); + + case O_BRANCH_NP: // No page crossed + first_irq_cycle++; // Delay IRQ +#ifndef IS_CPU_1541 + first_nmi_cycle++; // Delay NMI +#endif + read_idle(pc); + pc = ar; + Last; + case O_BRANCH_BP: // Page crossed, branch backwards + read_idle(pc); + pc = ar; + state = O_BRANCH_BP1; + break; + case O_BRANCH_BP1: + read_idle(pc + 0x100); + Last; + case O_BRANCH_FP: // Page crossed, branch forwards + read_idle(pc); + pc = ar; + state = O_BRANCH_FP1; + break; + case O_BRANCH_FP1: + read_idle(pc - 0x100); + Last; + + + // Flag group + case O_SEC: + read_idle(pc); + c_flag = true; + Last; + + case O_CLC: + read_idle(pc); + c_flag = false; + Last; + + case O_SED: + read_idle(pc); + d_flag = true; + Last; + + case O_CLD: + read_idle(pc); + d_flag = false; + Last; + + case O_SEI: + read_idle(pc); + i_flag = true; + Last; + + case O_CLI: + read_idle(pc); + i_flag = false; + Last; + + case O_CLV: + read_idle(pc); + v_flag = false; + Last; + + + // NOP group + case O_NOP: + read_idle(pc); + Last; + + +/* + * Undocumented opcodes start here + */ + + // NOP group + case O_NOP_I: + read_idle(pc++); + Last; + + case O_NOP_A: + read_idle(ar); + Last; + + + // Load A/X group + case O_LAX: + read_to(ar, data); + set_nz(a = x = data); + Last; + + + // Store A/X group + case O_SAX: + write_byte(ar, a & x); + Last; + + + // ASL/ORA group + case O_SLO: + c_flag = rdbuf & 0x80; + rdbuf <<= 1; + write_byte(ar, rdbuf); + set_nz(a |= rdbuf); + Last; + + + // ROL/AND group + case O_RLA: + tmp = rdbuf & 0x80; + rdbuf = c_flag ? (rdbuf << 1) | 0x01 : rdbuf << 1; + c_flag = tmp; + write_byte(ar, rdbuf); + set_nz(a &= rdbuf); + Last; + + + // LSR/EOR group + case O_SRE: + c_flag = rdbuf & 0x01; + rdbuf >>= 1; + write_byte(ar, rdbuf); + set_nz(a ^= rdbuf); + Last; + + + // ROR/ADC group + case O_RRA: + tmp = rdbuf & 0x01; + rdbuf = c_flag ? (rdbuf >> 1) | 0x80 : rdbuf >> 1; + c_flag = tmp; + write_byte(ar, rdbuf); + do_adc(rdbuf); + Last; + + + // DEC/CMP group + case O_DCP: + write_byte(ar, --rdbuf); + set_nz(ar = a - rdbuf); + c_flag = ar < 0x100; + Last; + + + // INC/SBC group + case O_ISB: + write_byte(ar, ++rdbuf); + do_sbc(rdbuf); + Last; + + + // Complex functions + case O_ANC_I: + read_to(pc++, data); + set_nz(a &= data); + c_flag = n_flag & 0x80; + Last; + + case O_ASR_I: + read_to(pc++, data); + a &= data; + c_flag = a & 0x01; + set_nz(a >>= 1); + Last; + + case O_ARR_I: + read_to(pc++, data); + data &= a; + a = (c_flag ? (data >> 1) | 0x80 : data >> 1); + if (!d_flag) { + set_nz(a); + c_flag = a & 0x40; + v_flag = (a & 0x40) ^ ((a & 0x20) << 1); + } else { + n_flag = c_flag ? 0x80 : 0; + z_flag = a; + v_flag = (data ^ a) & 0x40; + if ((data & 0x0f) + (data & 0x01) > 5) + a = a & 0xf0 | (a + 6) & 0x0f; + if (c_flag = ((data + (data & 0x10)) & 0x1f0) > 0x50) + a += 0x60; + } + Last; + + case O_ANE_I: + read_to(pc++, data); + set_nz(a = (a | 0xee) & x & data); + Last; + + case O_LXA_I: + read_to(pc++, data); + set_nz(a = x = (a | 0xee) & data); + Last; + + case O_SBX_I: + read_to(pc++, data); + set_nz(x = ar = (x & a) - data); + c_flag = ar < 0x100; + Last; + + case O_LAS: + read_to(ar, data); + set_nz(a = x = sp = data & sp); + Last; + + case O_SHS: // ar2 contains the high byte of the operand address + write_byte(ar, (ar2+1) & (sp = a & x)); + Last; + + case O_SHY: // ar2 contains the high byte of the operand address + write_byte(ar, y & (ar2+1)); + Last; + + case O_SHX: // ar2 contains the high byte of the operand address + write_byte(ar, x & (ar2+1)); + Last; + + case O_SHA: // ar2 contains the high byte of the operand address + write_byte(ar, a & x & (ar2+1)); + Last; diff --git a/archive-sources/c64emu/CPU_emulline.i b/archive-sources/c64emu/CPU_emulline.i new file mode 100644 index 0000000..0053b09 --- /dev/null +++ b/archive-sources/c64emu/CPU_emulline.i @@ -0,0 +1,1398 @@ +/* + * CPU_emulline.i - 6510/6502 emulation core (body of + * EmulateLine() function, the same for + * both 6510 and 6502) + * + * Frodo (C) 1994-1997 Christian Bauer + */ + + +/* + * Addressing mode macros + */ + +// Read immediate operand +#if PC_IS_POINTER +#define read_byte_imm() (*pc++) +#else +#define read_byte_imm() read_byte(pc++) +#endif + +// Read zeropage operand address +#define read_adr_zero() ((uint16)read_byte_imm()) + +// Read zeropage x-indexed operand address +#define read_adr_zero_x() ((read_byte_imm() + x) & 0xff) + +// Read zeropage y-indexed operand address +#define read_adr_zero_y() ((read_byte_imm() + y) & 0xff) + +// Read absolute operand address (uses adr!) +#if PC_IS_POINTER +#if LITTLE_ENDIAN_UNALIGNED +#define read_adr_abs() (adr = *(UWORD *)pc, pc+=2, adr) +#else +#define read_adr_abs() (adr = ((*(pc+1)) << 8) | *pc, pc+=2, adr) +#endif +#else +#define read_adr_abs() (adr = read_word(pc), pc+=2, adr) +#endif + +// Read absolute x-indexed operand address +#define read_adr_abs_x() (read_adr_abs() + x) + +// Read absolute y-indexed operand address +#define read_adr_abs_y() (read_adr_abs() + y) + +// Read indexed indirect operand address +#define read_adr_ind_x() (read_zp_word(read_byte_imm() + x)) + +// Read indirect indexed operand address +#define read_adr_ind_y() (read_zp_word(read_byte_imm()) + y) + +// Read zeropage operand +#define read_byte_zero() read_zp(read_adr_zero()) + +// Read zeropage x-indexed operand +#define read_byte_zero_x() read_zp(read_adr_zero_x()) + +// Read zeropage y-indexed operand +#define read_byte_zero_y() read_zp(read_adr_zero_y()) + +// Read absolute operand +#define read_byte_abs() read_byte(read_adr_abs()) + +#if PRECISE_CPU_CYCLES +// Acount for cyles due to crossing page boundaries +#define page_plus(exp, reg) \ + (adr = exp, page_cycles = (adr & 0xff) + reg >= 0x100, adr + reg) + +// Read absolute x-indexed operand +#define read_byte_abs_x() read_byte(page_plus(read_adr_abs(), x)) + +// Read absolute x-indexed operand +#define read_byte_abs_y() read_byte(page_plus(read_adr_abs(), y)) + +// Read indirect y-indexed operand +#define read_byte_ind_y() read_byte(page_plus(read_zp_word(read_byte_imm()), y)) + +#else + +// Read absolute x-indexed operand +#define read_byte_abs_x() read_byte(read_adr_abs_x()) + +// Read absolute x-indexed operand +#define read_byte_abs_y() read_byte(read_adr_abs_y()) + +// Read indirect y-indexed operand +#define read_byte_ind_y() read_byte(read_adr_ind_y()) +#endif + +// Read indexed indirect operand +#define read_byte_ind_x() read_byte(read_adr_ind_x()) + + +/* + * Set N and Z flags according to byte + */ + +#define set_nz(x) (z_flag = n_flag = (x)) + + +/* + * End of opcode, decrement cycles left + */ + +#define ENDOP(cyc) last_cycles = cyc; break; + + + // Main opcode fetch/execute loop +#if PRECISE_CPU_CYCLES + if (cycles_left != 1) + cycles_left -= borrowed_cycles; + int page_cycles = 0; + for (;;) { + if (last_cycles) { + last_cycles += page_cycles; + page_cycles = 0; +#if PRECISE_CIA_CYCLES && !defined(IS_CPU_1541) + TheCIA1->EmulateLine(last_cycles); + TheCIA2->EmulateLine(last_cycles); +#endif + } + if ((cycles_left -= last_cycles) < 0) { + borrowed_cycles = -cycles_left; + break; + } +#else + while ((cycles_left -= last_cycles) >= 0) { +#endif + + switch (read_byte_imm()) { + + + // Load group + case 0xa9: // LDA #imm + set_nz(a = read_byte_imm()); + ENDOP(2); + + case 0xa5: // LDA zero + set_nz(a = read_byte_zero()); + ENDOP(3); + + case 0xb5: // LDA zero,X + set_nz(a = read_byte_zero_x()); + ENDOP(4); + + case 0xad: // LDA abs + set_nz(a = read_byte_abs()); + ENDOP(4); + + case 0xbd: // LDA abs,X + set_nz(a = read_byte_abs_x()); + ENDOP(4); + + case 0xb9: // LDA abs,Y + set_nz(a = read_byte_abs_y()); + ENDOP(4); + + case 0xa1: // LDA (ind,X) + set_nz(a = read_byte_ind_x()); + ENDOP(6); + + case 0xb1: // LDA (ind),Y + set_nz(a = read_byte_ind_y()); + ENDOP(5); + + case 0xa2: // LDX #imm + set_nz(x = read_byte_imm()); + ENDOP(2); + + case 0xa6: // LDX zero + set_nz(x = read_byte_zero()); + ENDOP(3); + + case 0xb6: // LDX zero,Y + set_nz(x = read_byte_zero_y()); + ENDOP(4); + + case 0xae: // LDX abs + set_nz(x = read_byte_abs()); + ENDOP(4); + + case 0xbe: // LDX abs,Y + set_nz(x = read_byte_abs_y()); + ENDOP(4); + + case 0xa0: // LDY #imm + set_nz(y = read_byte_imm()); + ENDOP(2); + + case 0xa4: // LDY zero + set_nz(y = read_byte_zero()); + ENDOP(3); + + case 0xb4: // LDY zero,X + set_nz(y = read_byte_zero_x()); + ENDOP(4); + + case 0xac: // LDY abs + set_nz(y = read_byte_abs()); + ENDOP(4); + + case 0xbc: // LDY abs,X + set_nz(y = read_byte_abs_x()); + ENDOP(4); + + + // Store group + case 0x85: // STA zero + write_byte(read_adr_zero(), a); + ENDOP(3); + + case 0x95: // STA zero,X + write_byte(read_adr_zero_x(), a); + ENDOP(4); + + case 0x8d: // STA abs + write_byte(read_adr_abs(), a); + ENDOP(4); + + case 0x9d: // STA abs,X + write_byte(read_adr_abs_x(), a); + ENDOP(5); + + case 0x99: // STA abs,Y + write_byte(read_adr_abs_y(), a); + ENDOP(5); + + case 0x81: // STA (ind,X) + write_byte(read_adr_ind_x(), a); + ENDOP(6); + + case 0x91: // STA (ind),Y + write_byte(read_adr_ind_y(), a); + ENDOP(6); + + case 0x86: // STX zero + write_byte(read_adr_zero(), x); + ENDOP(3); + + case 0x96: // STX zero,Y + write_byte(read_adr_zero_y(), x); + ENDOP(4); + + case 0x8e: // STX abs + write_byte(read_adr_abs(), x); + ENDOP(4); + + case 0x84: // STY zero + write_byte(read_adr_zero(), y); + ENDOP(3); + + case 0x94: // STY zero,X + write_byte(read_adr_zero_x(), y); + ENDOP(4); + + case 0x8c: // STY abs + write_byte(read_adr_abs(), y); + ENDOP(4); + + + // Transfer group + case 0xaa: // TAX + set_nz(x = a); + ENDOP(2); + + case 0x8a: // TXA + set_nz(a = x); + ENDOP(2); + + case 0xa8: // TAY + set_nz(y = a); + ENDOP(2); + + case 0x98: // TYA + set_nz(a = y); + ENDOP(2); + + case 0xba: // TSX + set_nz(x = sp); + ENDOP(2); + + case 0x9a: // TXS + sp = x; + ENDOP(2); + + + // Arithmetic group + case 0x69: // ADC #imm + do_adc(read_byte_imm()); + ENDOP(2); + + case 0x65: // ADC zero + do_adc(read_byte_zero()); + ENDOP(3); + + case 0x75: // ADC zero,X + do_adc(read_byte_zero_x()); + ENDOP(4); + + case 0x6d: // ADC abs + do_adc(read_byte_abs()); + ENDOP(4); + + case 0x7d: // ADC abs,X + do_adc(read_byte_abs_x()); + ENDOP(4); + + case 0x79: // ADC abs,Y + do_adc(read_byte_abs_y()); + ENDOP(4); + + case 0x61: // ADC (ind,X) + do_adc(read_byte_ind_x()); + ENDOP(6); + + case 0x71: // ADC (ind),Y + do_adc(read_byte_ind_y()); + ENDOP(5); + + case 0xe9: // SBC #imm + case 0xeb: // Undocumented opcode + do_sbc(read_byte_imm()); + ENDOP(2); + + case 0xe5: // SBC zero + do_sbc(read_byte_zero()); + ENDOP(3); + + case 0xf5: // SBC zero,X + do_sbc(read_byte_zero_x()); + ENDOP(4); + + case 0xed: // SBC abs + do_sbc(read_byte_abs()); + ENDOP(4); + + case 0xfd: // SBC abs,X + do_sbc(read_byte_abs_x()); + ENDOP(4); + + case 0xf9: // SBC abs,Y + do_sbc(read_byte_abs_y()); + ENDOP(4); + + case 0xe1: // SBC (ind,X) + do_sbc(read_byte_ind_x()); + ENDOP(6); + + case 0xf1: // SBC (ind),Y + do_sbc(read_byte_ind_y()); + ENDOP(5); + + + // Increment/decrement group + case 0xe8: // INX + set_nz(++x); + ENDOP(2); + + case 0xca: // DEX + set_nz(--x); + ENDOP(2); + + case 0xc8: // INY + set_nz(++y); + ENDOP(2); + + case 0x88: // DEY + set_nz(--y); + ENDOP(2); + + case 0xe6: // INC zero + adr = read_adr_zero(); + write_zp(adr, set_nz(read_zp(adr) + 1)); + ENDOP(5); + + case 0xf6: // INC zero,X + adr = read_adr_zero_x(); + write_zp(adr, set_nz(read_zp(adr) + 1)); + ENDOP(6); + + case 0xee: // INC abs + adr = read_adr_abs(); + write_byte(adr, set_nz(read_byte(adr) + 1)); + ENDOP(6); + + case 0xfe: // INC abs,X + adr = read_adr_abs_x(); + write_byte(adr, set_nz(read_byte(adr) + 1)); + ENDOP(7); + + case 0xc6: // DEC zero + adr = read_adr_zero(); + write_zp(adr, set_nz(read_zp(adr) - 1)); + ENDOP(5); + + case 0xd6: // DEC zero,X + adr = read_adr_zero_x(); + write_zp(adr, set_nz(read_zp(adr) - 1)); + ENDOP(6); + + case 0xce: // DEC abs + adr = read_adr_abs(); + write_byte(adr, set_nz(read_byte(adr) - 1)); + ENDOP(6); + + case 0xde: // DEC abs,X + adr = read_adr_abs_x(); + write_byte(adr, set_nz(read_byte(adr) - 1)); + ENDOP(7); + + + // Logic group + case 0x29: // AND #imm + set_nz(a &= read_byte_imm()); + ENDOP(2); + + case 0x25: // AND zero + set_nz(a &= read_byte_zero()); + ENDOP(3); + + case 0x35: // AND zero,X + set_nz(a &= read_byte_zero_x()); + ENDOP(4); + + case 0x2d: // AND abs + set_nz(a &= read_byte_abs()); + ENDOP(4); + + case 0x3d: // AND abs,X + set_nz(a &= read_byte_abs_x()); + ENDOP(4); + + case 0x39: // AND abs,Y + set_nz(a &= read_byte_abs_y()); + ENDOP(4); + + case 0x21: // AND (ind,X) + set_nz(a &= read_byte_ind_x()); + ENDOP(6); + + case 0x31: // AND (ind),Y + set_nz(a &= read_byte_ind_y()); + ENDOP(5); + + case 0x09: // ORA #imm + set_nz(a |= read_byte_imm()); + ENDOP(2); + + case 0x05: // ORA zero + set_nz(a |= read_byte_zero()); + ENDOP(3); + + case 0x15: // ORA zero,X + set_nz(a |= read_byte_zero_x()); + ENDOP(4); + + case 0x0d: // ORA abs + set_nz(a |= read_byte_abs()); + ENDOP(4); + + case 0x1d: // ORA abs,X + set_nz(a |= read_byte_abs_x()); + ENDOP(4); + + case 0x19: // ORA abs,Y + set_nz(a |= read_byte_abs_y()); + ENDOP(4); + + case 0x01: // ORA (ind,X) + set_nz(a |= read_byte_ind_x()); + ENDOP(6); + + case 0x11: // ORA (ind),Y + set_nz(a |= read_byte_ind_y()); + ENDOP(5); + + case 0x49: // EOR #imm + set_nz(a ^= read_byte_imm()); + ENDOP(2); + + case 0x45: // EOR zero + set_nz(a ^= read_byte_zero()); + ENDOP(3); + + case 0x55: // EOR zero,X + set_nz(a ^= read_byte_zero_x()); + ENDOP(4); + + case 0x4d: // EOR abs + set_nz(a ^= read_byte_abs()); + ENDOP(4); + + case 0x5d: // EOR abs,X + set_nz(a ^= read_byte_abs_x()); + ENDOP(4); + + case 0x59: // EOR abs,Y + set_nz(a ^= read_byte_abs_y()); + ENDOP(4); + + case 0x41: // EOR (ind,X) + set_nz(a ^= read_byte_ind_x()); + ENDOP(6); + + case 0x51: // EOR (ind),Y + set_nz(a ^= read_byte_ind_y()); + ENDOP(5); + + + // Compare group + case 0xc9: // CMP #imm + set_nz(adr = a - read_byte_imm()); + c_flag = adr < 0x100; + ENDOP(2); + + case 0xc5: // CMP zero + set_nz(adr = a - read_byte_zero()); + c_flag = adr < 0x100; + ENDOP(3); + + case 0xd5: // CMP zero,X + set_nz(adr = a - read_byte_zero_x()); + c_flag = adr < 0x100; + ENDOP(4); + + case 0xcd: // CMP abs + set_nz(adr = a - read_byte_abs()); + c_flag = adr < 0x100; + ENDOP(4); + + case 0xdd: // CMP abs,X + set_nz(adr = a - read_byte_abs_x()); + c_flag = adr < 0x100; + ENDOP(4); + + case 0xd9: // CMP abs,Y + set_nz(adr = a - read_byte_abs_y()); + c_flag = adr < 0x100; + ENDOP(4); + + case 0xc1: // CMP (ind,X) + set_nz(adr = a - read_byte_ind_x()); + c_flag = adr < 0x100; + ENDOP(6); + + case 0xd1: // CMP (ind),Y + set_nz(adr = a - read_byte_ind_y()); + c_flag = adr < 0x100; + ENDOP(5); + + case 0xe0: // CPX #imm + set_nz(adr = x - read_byte_imm()); + c_flag = adr < 0x100; + ENDOP(2); + + case 0xe4: // CPX zero + set_nz(adr = x - read_byte_zero()); + c_flag = adr < 0x100; + ENDOP(3); + + case 0xec: // CPX abs + set_nz(adr = x - read_byte_abs()); + c_flag = adr < 0x100; + ENDOP(4); + + case 0xc0: // CPY #imm + set_nz(adr = y - read_byte_imm()); + c_flag = adr < 0x100; + ENDOP(2); + + case 0xc4: // CPY zero + set_nz(adr = y - read_byte_zero()); + c_flag = adr < 0x100; + ENDOP(3); + + case 0xcc: // CPY abs + set_nz(adr = y - read_byte_abs()); + c_flag = adr < 0x100; + ENDOP(4); + + + // Bit-test group + case 0x24: // BIT zero + z_flag = a & (tmp = read_byte_zero()); + n_flag = tmp; + v_flag = tmp & 0x40; + ENDOP(3); + + case 0x2c: // BIT abs + z_flag = a & (tmp = read_byte_abs()); + n_flag = tmp; + v_flag = tmp & 0x40; + ENDOP(4); + + + // Shift/rotate group + case 0x0a: // ASL A + c_flag = a & 0x80; + set_nz(a <<= 1); + ENDOP(2); + + case 0x06: // ASL zero + tmp = read_zp(adr = read_adr_zero()); + c_flag = tmp & 0x80; + write_zp(adr, set_nz(tmp << 1)); + ENDOP(5); + + case 0x16: // ASL zero,X + tmp = read_zp(adr = read_adr_zero_x()); + c_flag = tmp & 0x80; + write_zp(adr, set_nz(tmp << 1)); + ENDOP(6); + + case 0x0e: // ASL abs + tmp = read_byte(adr = read_adr_abs()); + c_flag = tmp & 0x80; + write_byte(adr, set_nz(tmp << 1)); + ENDOP(6); + + case 0x1e: // ASL abs,X + tmp = read_byte(adr = read_adr_abs_x()); + c_flag = tmp & 0x80; + write_byte(adr, set_nz(tmp << 1)); + ENDOP(7); + + case 0x4a: // LSR A + c_flag = a & 0x01; + set_nz(a >>= 1); + ENDOP(2); + + case 0x46: // LSR zero + tmp = read_zp(adr = read_adr_zero()); + c_flag = tmp & 0x01; + write_zp(adr, set_nz(tmp >> 1)); + ENDOP(5); + + case 0x56: // LSR zero,X + tmp = read_zp(adr = read_adr_zero_x()); + c_flag = tmp & 0x01; + write_zp(adr, set_nz(tmp >> 1)); + ENDOP(6); + + case 0x4e: // LSR abs + tmp = read_byte(adr = read_adr_abs()); + c_flag = tmp & 0x01; + write_byte(adr, set_nz(tmp >> 1)); + ENDOP(6); + + case 0x5e: // LSR abs,X + tmp = read_byte(adr = read_adr_abs_x()); + c_flag = tmp & 0x01; + write_byte(adr, set_nz(tmp >> 1)); + ENDOP(7); + + case 0x2a: // ROL A + tmp2 = a & 0x80; + set_nz(a = c_flag ? (a << 1) | 0x01 : a << 1); + c_flag = tmp2; + ENDOP(2); + + case 0x26: // ROL zero + tmp = read_zp(adr = read_adr_zero()); + tmp2 = tmp & 0x80; + write_zp(adr, set_nz(c_flag ? (tmp << 1) | 0x01 : tmp << 1)); + c_flag = tmp2; + ENDOP(5); + + case 0x36: // ROL zero,X + tmp = read_zp(adr = read_adr_zero_x()); + tmp2 = tmp & 0x80; + write_zp(adr, set_nz(c_flag ? (tmp << 1) | 0x01 : tmp << 1)); + c_flag = tmp2; + ENDOP(6); + + case 0x2e: // ROL abs + tmp = read_byte(adr = read_adr_abs()); + tmp2 = tmp & 0x80; + write_byte(adr, set_nz(c_flag ? (tmp << 1) | 0x01 : tmp << 1)); + c_flag = tmp2; + ENDOP(6); + + case 0x3e: // ROL abs,X + tmp = read_byte(adr = read_adr_abs_x()); + tmp2 = tmp & 0x80; + write_byte(adr, set_nz(c_flag ? (tmp << 1) | 0x01 : tmp << 1)); + c_flag = tmp2; + ENDOP(7); + + case 0x6a: // ROR A + tmp2 = a & 0x01; + set_nz(a = (c_flag ? (a >> 1) | 0x80 : a >> 1)); + c_flag = tmp2; + ENDOP(2); + + case 0x66: // ROR zero + tmp = read_zp(adr = read_adr_zero()); + tmp2 = tmp & 0x01; + write_zp(adr, set_nz(c_flag ? (tmp >> 1) | 0x80 : tmp >> 1)); + c_flag = tmp2; + ENDOP(5); + + case 0x76: // ROR zero,X + tmp = read_zp(adr = read_adr_zero_x()); + tmp2 = tmp & 0x01; + write_zp(adr, set_nz(c_flag ? (tmp >> 1) | 0x80 : tmp >> 1)); + c_flag = tmp2; + ENDOP(6); + + case 0x6e: // ROR abs + tmp = read_byte(adr = read_adr_abs()); + tmp2 = tmp & 0x01; + write_byte(adr, set_nz(c_flag ? (tmp >> 1) | 0x80 : tmp >> 1)); + c_flag = tmp2; + ENDOP(6); + + case 0x7e: // ROR abs,X + tmp = read_byte(adr = read_adr_abs_x()); + tmp2 = tmp & 0x01; + write_byte(adr, set_nz(c_flag ? (tmp >> 1) | 0x80 : tmp >> 1)); + c_flag = tmp2; + ENDOP(7); + + + // Stack group + case 0x48: // PHA + push_byte(a); + ENDOP(3); + + case 0x68: // PLA + set_nz(a = pop_byte()); + ENDOP(4); + + case 0x08: // PHP + push_flags(true); + ENDOP(3); + + case 0x28: // PLP + pop_flags(); + if (interrupt.intr_any && !i_flag) + goto handle_int; + ENDOP(4); + + + // Jump/branch group + case 0x4c: // JMP abs + jump(read_adr_abs()); + ENDOP(3); + + case 0x6c: // JMP (ind) + adr = read_adr_abs(); + jump(read_byte(adr) | (read_byte((adr + 1) & 0xff | adr & 0xff00) << 8)); + ENDOP(5); + + case 0x20: // JSR abs +#if PC_IS_POINTER + push_byte((pc-pc_base+1) >> 8); push_byte(pc-pc_base+1); +#else + push_byte(pc+1 >> 8); push_byte(pc+1); +#endif + jump(read_adr_abs()); + ENDOP(6); + + case 0x60: // RTS + adr = pop_byte(); // Split because of pop_byte ++sp side-effect + jump((adr | pop_byte() << 8) + 1); + ENDOP(6); + + case 0x40: // RTI + pop_flags(); + adr = pop_byte(); // Split because of pop_byte ++sp side-effect + jump(adr | pop_byte() << 8); + if (interrupt.intr_any && !i_flag) + goto handle_int; + ENDOP(6); + + case 0x00: // BRK +#if PC_IS_POINTER + push_byte((pc+1-pc_base) >> 8); push_byte(pc+1-pc_base); +#else + push_byte((pc+1) >> 8); push_byte(pc+1); +#endif + push_flags(true); + i_flag = true; + jump(read_word(0xfffe)); + ENDOP(7); + +#if PC_IS_POINTER +#if PRECISE_CPU_CYCLES +#define Branch(flag) \ + if (flag) { \ + pc += (int8)*pc + 1; \ + if (((pc-pc_base) ^ (old_pc - pc_base)) & 0xff00) { \ + ENDOP(4); \ + } else { \ + ENDOP(3); \ + } \ + } else { \ + pc++; \ + ENDOP(2); \ + } +#else +#define Branch(flag) \ + if (flag) { \ + pc += (int8)*pc + 1; \ + ENDOP(3); \ + } else { \ + pc++; \ + ENDOP(2); \ + } +#endif +#else +#define Branch(flag) \ + if (flag) { \ + uint16 old_pc = pc; \ + pc += (int8)read_byte(pc) + 1; \ + if ((pc ^ old_pc) & 0xff00) { \ + ENDOP(4); \ + } else { \ + ENDOP(3); \ + } \ + } else { \ + pc++; \ + ENDOP(2); \ + } +#endif + + case 0xb0: // BCS rel + Branch(c_flag); + + case 0x90: // BCC rel + Branch(!c_flag); + + case 0xf0: // BEQ rel + Branch(!z_flag); + + case 0xd0: // BNE rel + Branch(z_flag); + + case 0x70: // BVS rel +#ifndef IS_CPU_1541 + Branch(v_flag); +#else + Branch((via2_pcr & 0x0e) == 0x0e ? 1 : v_flag); // GCR byte ready flag +#endif + + case 0x50: // BVC rel +#ifndef IS_CPU_1541 + Branch(!v_flag); +#else + Branch(!((via2_pcr & 0x0e) == 0x0e) ? 0 : v_flag); // GCR byte ready flag +#endif + + case 0x30: // BMI rel + Branch(n_flag & 0x80); + + case 0x10: // BPL rel + Branch(!(n_flag & 0x80)); + + + // Flags group + case 0x38: // SEC + c_flag = true; + ENDOP(2); + + case 0x18: // CLC + c_flag = false; + ENDOP(2); + + case 0xf8: // SED + d_flag = true; + ENDOP(2); + + case 0xd8: // CLD + d_flag = false; + ENDOP(2); + + case 0x78: // SEI + i_flag = true; + ENDOP(2); + + case 0x58: // CLI + i_flag = false; + if (interrupt.intr_any) + goto handle_int; + ENDOP(2); + + case 0xb8: // CLV + v_flag = false; + ENDOP(2); + + + // NOP group + case 0xea: // NOP + ENDOP(2); + + +/* + * Undocumented opcodes start here + */ + + // NOP group + case 0x1a: // NOP + case 0x3a: + case 0x5a: + case 0x7a: + case 0xda: + case 0xfa: + ENDOP(2); + + case 0x80: // NOP #imm + case 0x82: + case 0x89: + case 0xc2: + case 0xe2: + pc++; + ENDOP(2); + + case 0x04: // NOP zero + case 0x44: + case 0x64: + pc++; + ENDOP(3); + + case 0x14: // NOP zero,X + case 0x34: + case 0x54: + case 0x74: + case 0xd4: + case 0xf4: + pc++; + ENDOP(4); + + case 0x0c: // NOP abs + pc+=2; + ENDOP(4); + + case 0x1c: // NOP abs,X + case 0x3c: + case 0x5c: + case 0x7c: + case 0xdc: + case 0xfc: +#if PRECISE_CPU_CYCLES + read_byte_abs_x(); +#else + pc+=2; +#endif + ENDOP(4); + + + // Load A/X group + case 0xa7: // LAX zero + set_nz(a = x = read_byte_zero()); + ENDOP(3); + + case 0xb7: // LAX zero,Y + set_nz(a = x = read_byte_zero_y()); + ENDOP(4); + + case 0xaf: // LAX abs + set_nz(a = x = read_byte_abs()); + ENDOP(4); + + case 0xbf: // LAX abs,Y + set_nz(a = x = read_byte_abs_y()); + ENDOP(4); + + case 0xa3: // LAX (ind,X) + set_nz(a = x = read_byte_ind_x()); + ENDOP(6); + + case 0xb3: // LAX (ind),Y + set_nz(a = x = read_byte_ind_y()); + ENDOP(5); + + + // Store A/X group + case 0x87: // SAX zero + write_byte(read_adr_zero(), a & x); + ENDOP(3); + + case 0x97: // SAX zero,Y + write_byte(read_adr_zero_y(), a & x); + ENDOP(4); + + case 0x8f: // SAX abs + write_byte(read_adr_abs(), a & x); + ENDOP(4); + + case 0x83: // SAX (ind,X) + write_byte(read_adr_ind_x(), a & x); + ENDOP(6); + + + // ASL/ORA group +#define ShiftLeftOr \ + c_flag = tmp & 0x80; \ + tmp <<= 1; \ + set_nz(a |= tmp); + + case 0x07: // SLO zero + tmp = read_zp(adr = read_adr_zero()); + ShiftLeftOr; + write_zp(adr, tmp); + ENDOP(5); + + case 0x17: // SLO zero,X + tmp = read_zp(adr = read_adr_zero_x()); + ShiftLeftOr; + write_zp(adr, tmp); + ENDOP(6); + + case 0x0f: // SLO abs + tmp = read_byte(adr = read_adr_abs()); + ShiftLeftOr; + write_byte(adr, tmp); + ENDOP(6); + + case 0x1f: // SLO abs,X + tmp = read_byte(adr = read_adr_abs_x()); + ShiftLeftOr; + write_byte(adr, tmp); + ENDOP(7); + + case 0x1b: // SLO abs,Y + tmp = read_byte(adr = read_adr_abs_y()); + ShiftLeftOr; + write_byte(adr, tmp); + ENDOP(7); + + case 0x03: // SLO (ind,X) + tmp = read_byte(adr = read_adr_ind_x()); + ShiftLeftOr; + write_byte(adr, tmp); + ENDOP(8); + + case 0x13: // SLO (ind),Y + tmp = read_byte(adr = read_adr_ind_y()); + ShiftLeftOr; + write_byte(adr, tmp); + ENDOP(8); + + + // ROL/AND group +#define RoLeftAnd \ + tmp2 = tmp & 0x80; \ + tmp = c_flag ? (tmp << 1) | 0x01 : tmp << 1; \ + set_nz(a &= tmp); \ + c_flag = tmp2; + + case 0x27: // RLA zero + tmp = read_zp(adr = read_adr_zero()); + RoLeftAnd; + write_zp(adr, tmp); + ENDOP(5); + + case 0x37: // RLA zero,X + tmp = read_zp(adr = read_adr_zero_x()); + RoLeftAnd; + write_zp(adr, tmp); + ENDOP(6); + + case 0x2f: // RLA abs + tmp = read_byte(adr = read_adr_abs()); + RoLeftAnd; + write_byte(adr, tmp); + ENDOP(6); + + case 0x3f: // RLA abs,X + tmp = read_byte(adr = read_adr_abs_x()); + RoLeftAnd; + write_byte(adr, tmp); + ENDOP(7); + + case 0x3b: // RLA abs,Y + tmp = read_byte(adr = read_adr_abs_y()); + RoLeftAnd; + write_byte(adr, tmp); + ENDOP(7); + + case 0x23: // RLA (ind,X) + tmp = read_byte(adr = read_adr_ind_x()); + RoLeftAnd; + write_byte(adr, tmp); + ENDOP(8); + + case 0x33: // RLA (ind),Y + tmp = read_byte(adr = read_adr_ind_y()); + RoLeftAnd; + write_byte(adr, tmp); + ENDOP(8); + + + // LSR/EOR group +#define ShiftRightEor \ + c_flag = tmp & 0x01; \ + tmp >>= 1; \ + set_nz(a ^= tmp); + + case 0x47: // SRE zero + tmp = read_zp(adr = read_adr_zero()); + ShiftRightEor; + write_zp(adr, tmp); + ENDOP(5); + + case 0x57: // SRE zero,X + tmp = read_zp(adr = read_adr_zero_x()); + ShiftRightEor; + write_zp(adr, tmp); + ENDOP(6); + + case 0x4f: // SRE abs + tmp = read_byte(adr = read_adr_abs()); + ShiftRightEor; + write_byte(adr, tmp); + ENDOP(6); + + case 0x5f: // SRE abs,X + tmp = read_byte(adr = read_adr_abs_x()); + ShiftRightEor; + write_byte(adr, tmp); + ENDOP(7); + + case 0x5b: // SRE abs,Y + tmp = read_byte(adr = read_adr_abs_y()); + ShiftRightEor; + write_byte(adr, tmp); + ENDOP(7); + + case 0x43: // SRE (ind,X) + tmp = read_byte(adr = read_adr_ind_x()); + ShiftRightEor; + write_byte(adr, tmp); + ENDOP(8); + + case 0x53: // SRE (ind),Y + tmp = read_byte(adr = read_adr_ind_y()); + ShiftRightEor; + write_byte(adr, tmp); + ENDOP(8); + + + // ROR/ADC group +#define RoRightAdc \ + tmp2 = tmp & 0x01; \ + tmp = c_flag ? (tmp >> 1) | 0x80 : tmp >> 1; \ + c_flag = tmp2; \ + do_adc(tmp); + + case 0x67: // RRA zero + tmp = read_zp(adr = read_adr_zero()); + RoRightAdc; + write_zp(adr, tmp); + ENDOP(5); + + case 0x77: // RRA zero,X + tmp = read_zp(adr = read_adr_zero_x()); + RoRightAdc; + write_zp(adr, tmp); + ENDOP(6); + + case 0x6f: // RRA abs + tmp = read_byte(adr = read_adr_abs()); + RoRightAdc; + write_byte(adr, tmp); + ENDOP(6); + + case 0x7f: // RRA abs,X + tmp = read_byte(adr = read_adr_abs_x()); + RoRightAdc; + write_byte(adr, tmp); + ENDOP(7); + + case 0x7b: // RRA abs,Y + tmp = read_byte(adr = read_adr_abs_y()); + RoRightAdc; + write_byte(adr, tmp); + ENDOP(7); + + case 0x63: // RRA (ind,X) + tmp = read_byte(adr = read_adr_ind_x()); + RoRightAdc; + write_byte(adr, tmp); + ENDOP(8); + + case 0x73: // RRA (ind),Y + tmp = read_byte(adr = read_adr_ind_y()); + RoRightAdc; + write_byte(adr, tmp); + ENDOP(8); + + + // DEC/CMP group +#define DecCompare \ + set_nz(adr = a - tmp); \ + c_flag = adr < 0x100; + + case 0xc7: // DCP zero + tmp = read_zp(adr = read_adr_zero()) - 1; + write_zp(adr, tmp); + DecCompare; + ENDOP(5); + + case 0xd7: // DCP zero,X + tmp = read_zp(adr = read_adr_zero_x()) - 1; + write_zp(adr, tmp); + DecCompare; + ENDOP(6); + + case 0xcf: // DCP abs + tmp = read_byte(adr = read_adr_abs()) - 1; + write_byte(adr, tmp); + DecCompare; + ENDOP(6); + + case 0xdf: // DCP abs,X + tmp = read_byte(adr = read_adr_abs_x()) - 1; + write_byte(adr, tmp); + DecCompare; + ENDOP(7); + + case 0xdb: // DCP abs,Y + tmp = read_byte(adr = read_adr_abs_y()) - 1; + write_byte(adr, tmp); + DecCompare; + ENDOP(7); + + case 0xc3: // DCP (ind,X) + tmp = read_byte(adr = read_adr_ind_x()) - 1; + write_byte(adr, tmp); + DecCompare; + ENDOP(8); + + case 0xd3: // DCP (ind),Y + tmp = read_byte(adr = read_adr_ind_y()) - 1; + write_byte(adr, tmp); + DecCompare; + ENDOP(8); + + + // INC/SBC group + case 0xe7: // ISB zero + tmp = read_zp(adr = read_adr_zero()) + 1; + do_sbc(tmp); + write_zp(adr, tmp); + ENDOP(5); + + case 0xf7: // ISB zero,X + tmp = read_zp(adr = read_adr_zero_x()) + 1; + do_sbc(tmp); + write_zp(adr, tmp); + ENDOP(6); + + case 0xef: // ISB abs + tmp = read_byte(adr = read_adr_abs()) + 1; + do_sbc(tmp); + write_byte(adr, tmp); + ENDOP(6); + + case 0xff: // ISB abs,X + tmp = read_byte(adr = read_adr_abs_x()) + 1; + do_sbc(tmp); + write_byte(adr, tmp); + ENDOP(7); + + case 0xfb: // ISB abs,Y + tmp = read_byte(adr = read_adr_abs_y()) + 1; + do_sbc(tmp); + write_byte(adr, tmp); + ENDOP(7); + + case 0xe3: // ISB (ind,X) + tmp = read_byte(adr = read_adr_ind_x()) + 1; + do_sbc(tmp); + write_byte(adr, tmp); + ENDOP(8); + + case 0xf3: // ISB (ind),Y + tmp = read_byte(adr = read_adr_ind_y()) + 1; + do_sbc(tmp); + write_byte(adr, tmp); + ENDOP(8); + + + // Complex functions + case 0x0b: // ANC #imm + case 0x2b: + set_nz(a &= read_byte_imm()); + c_flag = n_flag & 0x80; + ENDOP(2); + + case 0x4b: // ASR #imm + a &= read_byte_imm(); + c_flag = a & 0x01; + set_nz(a >>= 1); + ENDOP(2); + + case 0x6b: // ARR #imm + tmp2 = read_byte_imm() & a; + a = (c_flag ? (tmp2 >> 1) | 0x80 : tmp2 >> 1); + if (!d_flag) { + set_nz(a); + c_flag = a & 0x40; + v_flag = (a & 0x40) ^ ((a & 0x20) << 1); + } else { + n_flag = c_flag ? 0x80 : 0; + z_flag = a; + v_flag = (tmp2 ^ a) & 0x40; + if ((tmp2 & 0x0f) + (tmp2 & 0x01) > 5) + a = a & 0xf0 | (a + 6) & 0x0f; + if (c_flag = ((tmp2 + (tmp2 & 0x10)) & 0x1f0) > 0x50) + a += 0x60; + } + ENDOP(2); + + case 0x8b: // ANE #imm + set_nz(a = read_byte_imm() & x & (a | 0xee)); + ENDOP(2); + + case 0x93: // SHA (ind),Y +#if PC_IS_POINTER + tmp2 = read_zp(pc[0] + 1); +#else + tmp2 = read_zp(read_byte(pc) + 1); +#endif + write_byte(read_adr_ind_y(), a & x & (tmp2+1)); + ENDOP(6); + + case 0x9b: // SHS abs,Y +#if PC_IS_POINTER + tmp2 = pc[1]; +#else + tmp2 = read_byte(pc+1); +#endif + write_byte(read_adr_abs_y(), a & x & (tmp2+1)); + sp = a & x; + ENDOP(5); + + case 0x9c: // SHY abs,X +#if PC_IS_POINTER + tmp2 = pc[1]; +#else + tmp2 = read_byte(pc+1); +#endif + write_byte(read_adr_abs_x(), y & (tmp2+1)); + ENDOP(5); + + case 0x9e: // SHX abs,Y +#if PC_IS_POINTER + tmp2 = pc[1]; +#else + tmp2 = read_byte(pc+1); +#endif + write_byte(read_adr_abs_y(), x & (tmp2+1)); + ENDOP(5); + + case 0x9f: // SHA abs,Y +#if PC_IS_POINTER + tmp2 = pc[1]; +#else + tmp2 = read_byte(pc+1); +#endif + write_byte(read_adr_abs_y(), a & x & (tmp2+1)); + ENDOP(5); + + case 0xab: // LXA #imm + set_nz(a = x = (a | 0xee) & read_byte_imm()); + ENDOP(2); + + case 0xbb: // LAS abs,Y + set_nz(a = x = sp = read_byte_abs_y() & sp); + ENDOP(4); + + case 0xcb: // SBX #imm + x &= a; + adr = x - read_byte_imm(); + c_flag = adr < 0x100; + set_nz(x = adr); + ENDOP(2); + + case 0x02: + case 0x12: + case 0x22: + case 0x32: + case 0x42: + case 0x52: + case 0x62: + case 0x72: + case 0x92: + case 0xb2: + case 0xd2: +#if PC_IS_POINTER + illegal_op(*(pc-1), pc-pc_base-1); +#else + illegal_op(read_byte(pc-1), pc-1); +#endif + break; diff --git a/archive-sources/c64emu/CmdPipe.cpp b/archive-sources/c64emu/CmdPipe.cpp new file mode 100644 index 0000000..8382c43 --- /dev/null +++ b/archive-sources/c64emu/CmdPipe.cpp @@ -0,0 +1,171 @@ +/* + * CmdPipe.cpp + * + * Frodo (C) 1994-1997 Christian Bauer + * Tcl/Tk stuff by Lutz Vieweg + */ + +#include "CmdPipe.h" + + +extern "C" { + #include + #include + #include + #include + #include + #include + +#if defined(__alpha__) + #include +#endif + +#if defined(AIX) + #include +#else + #include +#endif + +#if defined(__linux__) + #include +#endif + + #include + #include +} + +extern "C" { +extern void exit(int); +}; + +static void kaputt(const char * c1, const char * c2) { + fprintf(stderr,"error: %s%s\n",c1,c2); + exit(20); +} + +Pipe::Pipe(void) : fail(true) { + + fds[0] = 0; + fds[1] = 1; + + if (-1 == pipe(fds)) { + kaputt("Pipe: ","unable to create pipe"); + return; + } + + fail = false; + return; +} + +Pipe::~Pipe(void) { + + if (! fail) { + close(fds[0]); + close(fds[1]); + } + return; +} + +unsigned long Pipe::ewrite(const void * buf, unsigned long len) { + + unsigned long wsum = 0; + while (len) { + long wlen; + + wlen = ::write(fds[1], buf, (long) len); + if (wlen <= 0) { + kaputt("Pipe::ewrite ","write-error"); + } + + len -= wlen; + buf = (void*) ((char*) buf + wlen); + wsum += wlen; + } + return wsum; +} + +unsigned long Pipe::eread(void * buf, unsigned long len) { + + unsigned long rsum = 0; + while (len) { + long rlen; + + rlen = ::read(fds[0], buf, (long) len); + + if (rlen <= 0) { + kaputt("Pipe::eread ","read-error"); + } + + len -= rlen; + buf = (void*) ((char*) buf + rlen); + rsum += rlen; + } + return rsum; +} + +int Pipe::probe(void) const { + + fd_set set; + FD_ZERO(&set); + FD_SET(fds[0], &set); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + + int res; +// Use the following commented line for HP-UX < 10.20 +// res = select(FD_SETSIZE, (int *)&set, (int *)0, (int *)0, &tv); + res = select(FD_SETSIZE, &set, (fd_set *)0, (fd_set *)0, &tv); + + if (res > 0) return -1; + return 0; + +} + +CmdPipe::CmdPipe(const char * command, const char * arg, int nicediff) : childpid(0), fail(true) { + + if (tocmd.fail || fromcmd.fail) { + kaputt("CmdPipe: ","unable to initialize pipes"); + return; + } + + childpid = fork(); + + if (childpid == -1) { + childpid = 0; + kaputt("CmdPipe: ","unable to fork process"); + return; + } + + if (childpid == 0) { + + if (nicediff) { + if (-1 == nice(nicediff)) { + fprintf(stderr,"CmdPipe: unable to change nice-level (non-fatal)"); + } + } + + dup2(tocmd.get_read_fd(), STDIN_FILENO); + + dup2(fromcmd.get_write_fd(), STDOUT_FILENO); + execlp(command, "Frodo_GUI", arg, (char *)0); + kaputt("CmdPipe: unable to execute child process ",command); + _exit(0); // exit (and do NOT call destructors etc..) + } + + fail = false; + return; +} + +CmdPipe::~CmdPipe(void) { + + if (childpid) { + int status; + waitpid(childpid, &status, 0); + + if (status != 0) { + fprintf(stderr,"~CmdPipe child process returned error\n"); + } + } +} diff --git a/archive-sources/c64emu/CmdPipe.h b/archive-sources/c64emu/CmdPipe.h new file mode 100644 index 0000000..019524b --- /dev/null +++ b/archive-sources/c64emu/CmdPipe.h @@ -0,0 +1,85 @@ +/* + * CmdPipe.h + * + * Frodo (C) 1994-1997 Christian Bauer + * Tcl/Tk stuff by Lutz Vieweg + */ + +#ifndef CmdPipe_h +#define CmdPipe_h + +extern "C" { + #include + #include +} + +class Pipe { + +protected: + + int fds[2]; + +public: + + bool fail; + + Pipe(void); + Pipe(int fdin, int fdout) : fail(false) { + fds[0] = fdin; + fds[1] = fdout; + } + ~Pipe(void); + + unsigned long ewrite(const void * buf, unsigned long len); + unsigned long eread (void * buf, unsigned long len); + + int get_read_fd(void) const { + return fds[0]; + } + + int get_write_fd(void) const { + return fds[1]; + } + + int probe(void) const; +}; + +class CmdPipe { + +protected: + + Pipe tocmd; + Pipe fromcmd; + + int childpid; + +public: + + bool fail; + + CmdPipe(const char * command, const char * arg, int nicediff = 0); + ~CmdPipe(void); + + unsigned long ewrite(const void * buf, unsigned long len) { + return tocmd.ewrite(buf, len); + } + + unsigned long eread (void * buf, unsigned long len) { + return fromcmd.eread(buf, len); + } + + int get_read_fd(void) const { + return fromcmd.get_read_fd(); + } + + int get_write_fd(void) const { + return tocmd.get_write_fd(); + } + + int probe(void) const { + return fromcmd.probe(); + } + +}; + +#endif CmdPipe_h diff --git a/archive-sources/c64emu/Display.cpp b/archive-sources/c64emu/Display.cpp new file mode 100644 index 0000000..0900242 --- /dev/null +++ b/archive-sources/c64emu/Display.cpp @@ -0,0 +1,71 @@ +/* + * Display.cpp - C64 graphics display, emulator window handling + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysdeps.h" + +#include "Display.h" +#include "main.h" +#include "Prefs.h" + + +// LED states +enum { + LED_OFF, // LED off + LED_ON, // LED on (green) + LED_ERROR_ON, // LED blinking (red), currently on + LED_ERROR_OFF // LED blinking, currently off +}; + + +#undef USE_THEORETICAL_COLORS + +#ifdef USE_THEORETICAL_COLORS + +// C64 color palette (theoretical values) +const uint8 palette_red[16] = { + 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0xff, 0x40, 0x80, 0x80, 0x80, 0xc0 +}; + +const uint8 palette_green[16] = { + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0x40, 0x80, 0x40, 0x80, 0xff, 0x80, 0xc0 +}; + +const uint8 palette_blue[16] = { + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0x40, 0x80, 0x80, 0xff, 0xc0 +}; + +#else + +// C64 color palette (more realistic looking colors) +const uint8 palette_red[16] = { + 0x00, 0xff, 0x99, 0x00, 0xcc, 0x44, 0x11, 0xff, 0xaa, 0x66, 0xff, 0x40, 0x80, 0x66, 0x77, 0xc0 +}; + +const uint8 palette_green[16] = { + 0x00, 0xff, 0x00, 0xff, 0x00, 0xcc, 0x00, 0xff, 0x55, 0x33, 0x66, 0x40, 0x80, 0xff, 0x77, 0xc0 +}; + +const uint8 palette_blue[16] = { + 0x00, 0xff, 0x00, 0xcc, 0xcc, 0x44, 0x99, 0x00, 0x00, 0x00, 0x66, 0x40, 0x80, 0x66, 0xff, 0xc0 +}; + +#endif + + +/* + * Update drive LED display (deferred until Update()) + */ + +void C64Display::UpdateLEDs(int l0, int l1, int l2, int l3) +{ + led_state[0] = l0; + led_state[1] = l1; + led_state[2] = l2; + led_state[3] = l3; +} + + +#include "Display_dbox.i" diff --git a/archive-sources/c64emu/Display.h b/archive-sources/c64emu/Display.h new file mode 100644 index 0000000..7fd3085 --- /dev/null +++ b/archive-sources/c64emu/Display.h @@ -0,0 +1,59 @@ +/* + * Display.h - C64 graphics display, emulator window handling + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _DISPLAY_H +#define _DISPLAY_H + +// Display dimensions +#if defined(SMALL_DISPLAY) +const int DISPLAY_X = 0x168; +const int DISPLAY_Y = 0x110; +#else +const int DISPLAY_X = 0x180; +const int DISPLAY_Y = 0x110; +#endif + + +class C64Window; +class C64Screen; +class C64; +class Prefs; + +// Class for C64 graphics display +class C64Display { +public: + C64Display(C64 *the_c64); + ~C64Display(); + + void Update(void); + void UpdateLEDs(int l0, int l1, int l2, int l3); + void Speedometer(int speed); + uint8 *BitmapBase(void); + int BitmapXMod(void); + void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); + bool NumLock(void); + void InitColors(uint8 *colors); + void NewPrefs(Prefs *prefs); + + C64 *TheC64; + + bool quit_requested; + +private: + int led_state[4]; + int old_led_state[4]; + + void draw_led(int num, int state); // Draw one LED + static void pulse_handler(...); // LED error blinking + +}; + + +// Exported functions +extern long ShowRequester(char *str, char *button1, char *button2 = NULL); + + +#endif diff --git a/archive-sources/c64emu/Display_dbox.i b/archive-sources/c64emu/Display_dbox.i new file mode 100644 index 0000000..809ae4f --- /dev/null +++ b/archive-sources/c64emu/Display_dbox.i @@ -0,0 +1,564 @@ +/* + * Display_x.i - C64 graphics display, emulator window handling, + * X specific stuff + * + * Frodo (C) 1994-1997 Christian Bauer + * SVGAlib stuff by Bernd Schmidt + */ + +#if 0 +#include +#include +#include +#endif +#include + +#include "C64.h" + + +#define SCODE_CURSORBLOCKUP 103 /* Cursor key block. */ +#define SCODE_CURSORBLOCKLEFT 105 +#define SCODE_CURSORBLOCKRIGHT 106 +#define SCODE_CURSORBLOCKDOWN 108 + +#define SCODE_INSERT 110 +#define SCODE_HOME 102 +#define SCODE_PGUP 104 +#define SCODE_DELETE 111 +#define SCODE_END 107 +#define SCODE_PGDN 109 + +#define SCODE_NUMLOCK 69 + +#define SCODE_KEYPAD0 82 +#define SCODE_KEYPAD1 79 +#define SCODE_KEYPAD2 80 +#define SCODE_KEYPAD3 81 +#define SCODE_KEYPAD4 75 +#define SCODE_KEYPAD5 76 +#define SCODE_KEYPAD6 77 +#define SCODE_KEYPAD7 71 +#define SCODE_KEYPAD8 72 +#define SCODE_KEYPAD9 73 +#define SCODE_KEYPADENTER 96 +#define SCODE_KEYPADPLUS 78 +#define SCODE_KEYPADMINUS 74 +#define SCODE_KEYPADMULTIPLY 55 +#define SCODE_KEYPADDIVIDE 98 + +#define SCODE_Q 16 +#define SCODE_W 17 +#define SCODE_E 18 +#define SCODE_R 19 +#define SCODE_T 20 +#define SCODE_Y 21 +#define SCODE_U 22 +#define SCODE_I 23 +#define SCODE_O 24 +#define SCODE_P 25 + +#define SCODE_A 30 +#define SCODE_S 31 +#define SCODE_D 32 +#define SCODE_F 33 +#define SCODE_G 34 +#define SCODE_H 35 +#define SCODE_J 36 +#define SCODE_K 37 +#define SCODE_L 38 + +#define SCODE_Z 44 +#define SCODE_X 45 +#define SCODE_C 46 +#define SCODE_V 47 +#define SCODE_B 48 +#define SCODE_N 49 +#define SCODE_M 50 + +#define SCODE_ESCAPE 1 +#define SCODE_ENTER 28 +#define SCODE_RIGHTCONTROL 97 +#define SCODE_CONTROL 97 +#define SCODE_RIGHTALT 100 +#define SCODE_LEFTCONTROL 29 +#define SCODE_LEFTALT 56 +#define SCODE_SPACE 57 + +#define SCODE_F1 59 +#define SCODE_F2 60 +#define SCODE_F3 61 +#define SCODE_F4 62 +#define SCODE_F5 63 +#define SCODE_F6 64 +#define SCODE_F7 65 +#define SCODE_F8 66 +#define SCODE_F9 67 +#define SCODE_F10 68 + +#define SCODE_0 11 +#define SCODE_1 2 +#define SCODE_2 3 +#define SCODE_3 4 +#define SCODE_4 5 +#define SCODE_5 6 +#define SCODE_6 7 +#define SCODE_7 8 +#define SCODE_8 9 +#define SCODE_9 10 + +#define SCODE_LEFTSHIFT 42 +#define SCODE_RIGHTSHIFT 54 +#define SCODE_TAB 15 + +#define SCODE_F11 87 +#define SCODE_F12 88 +#define SCODE_NEXT 81 +#define SCODE_PRIOR 73 +#define SCODE_BS 14 + +#define SCODE_asciicircum 41 +#define SCODE_bracketleft 26 +#define SCODE_bracketright 27 +#define SCODE_comma 51 +#define SCODE_period 52 +#define SCODE_slash 53 +#define SCODE_semicolon 39 +#define SCODE_grave 40 +#define SCODE_minus 12 +#define SCODE_equal 13 +#define SCODE_numbersign 43 +#define SCODE_ltgt 86 +#define SCODE_scrolllock 70 + +static int bitdepth; +static char *bufmem; +static int hsize; +static vga_modeinfo modeinfo; +static char *linear_mem; + +static int keystate[256]; +static int f11pressed = 0, f12pressed = 0, quit = 0; +static int joystate = 0xFF; +static int numlock = 0; +static UBYTE rev_matrix[8], key_matrix[8]; + +/* + C64 keyboard matrix: + + Bit 7 6 5 4 3 2 1 0 + 0 CUD F5 F3 F1 F7 CLR RET DEL + 1 SHL E S Z 4 A W 3 + 2 X T F C 6 D R 5 + 3 V U H B 8 G Y 7 + 4 N O K M 0 J I 9 + 5 , @ : . - L P + + 6 / ^ = SHR HOM ; * £ + 7 R/S Q C= SPC 2 CTL <- 1 +*/ +#define MATRIX(a,b) (((a) << 3) | (b)) +#define KEY_F10 512 +#define KEY_F11 513 +#define KEY_F12 514 + +#define KEY_FIRE 515 +#define KEY_JUP 516 +#define KEY_JDN 517 +#define KEY_JLF 518 +#define KEY_JRT 519 + +#define KEY_NUMLOCK 520 + +#define KEY_KPPLUS 521 +#define KEY_KPMINUS 522 +#define KEY_KPMULT 523 +#define KEY_KPDIV 524 + +#if 0 +static int scode2c64(int scancode) +{ + switch (scancode) { + case SCODE_asciicircum: return MATRIX(7,1); + case SCODE_KEYPAD0: return KEY_FIRE; + case SCODE_KEYPAD1: return -1; + case SCODE_KEYPAD2: return KEY_JDN; + case SCODE_KEYPAD3: return -1; + case SCODE_KEYPAD4: return KEY_JLF; + case SCODE_KEYPAD5: return -1; + case SCODE_KEYPAD6: return KEY_JRT; + case SCODE_KEYPAD7: return -1; + case SCODE_KEYPAD8: return KEY_JUP; + case SCODE_KEYPAD9: return -1; + + case SCODE_NUMLOCK: return KEY_NUMLOCK; + case SCODE_KEYPADMULTIPLY: return KEY_KPMULT; + case SCODE_KEYPADDIVIDE: return KEY_KPDIV; + case SCODE_KEYPADMINUS: return KEY_KPMINUS; + case SCODE_KEYPADPLUS: return KEY_KPPLUS; + case SCODE_KEYPADENTER: return MATRIX(0,1); + + case SCODE_F10: return KEY_F10; + case SCODE_F11: return KEY_F11; + case SCODE_F12: return KEY_F12; + + case SCODE_comma: return MATRIX(5,7); + case SCODE_period: return MATRIX(5,4); + + case SCODE_A: return MATRIX(1,2); + case SCODE_B: return MATRIX(3,4); + case SCODE_C: return MATRIX(2,4); + case SCODE_D: return MATRIX(2,2); + case SCODE_E: return MATRIX(1,6); + case SCODE_F: return MATRIX(2,5); + case SCODE_G: return MATRIX(3,2); + case SCODE_H: return MATRIX(3,5); + case SCODE_I: return MATRIX(4,1); + case SCODE_J: return MATRIX(4,2); + case SCODE_K: return MATRIX(4,5); + case SCODE_L: return MATRIX(5,2); + case SCODE_M: return MATRIX(4,4); + case SCODE_N: return MATRIX(4,7); + case SCODE_O: return MATRIX(4,6); + case SCODE_P: return MATRIX(5,1); + case SCODE_Q: return MATRIX(7,6); + case SCODE_R: return MATRIX(2,1); + case SCODE_S: return MATRIX(1,5); + case SCODE_T: return MATRIX(2,6); + case SCODE_U: return MATRIX(3,6); + case SCODE_V: return MATRIX(3,7); + case SCODE_W: return MATRIX(1,1); + case SCODE_X: return MATRIX(2,7); + case SCODE_Y: return MATRIX(3,1); + case SCODE_Z: return MATRIX(1,4); + + case SCODE_BS: return MATRIX(0,0); + case SCODE_DELETE: return MATRIX(0,0); + case SCODE_LEFTCONTROL: return MATRIX(7,2); + case SCODE_TAB: return MATRIX(7,1); + case SCODE_ENTER: return MATRIX(0,1); + case SCODE_SPACE: return MATRIX(7,4); + case SCODE_LEFTSHIFT: return MATRIX(1,7); + case SCODE_RIGHTSHIFT: return MATRIX(6,4); + case SCODE_ESCAPE: return MATRIX(7,7); + case SCODE_RIGHTCONTROL: + case SCODE_LEFTALT: + case SCODE_RIGHTALT: return MATRIX(7,5); + + case SCODE_INSERT: return MATRIX(0,0) | 0x80; + case SCODE_HOME: return MATRIX(6,3); + case SCODE_END: return MATRIX(6,0); + case SCODE_PGUP: return MATRIX(6,6); + case SCODE_PGDN: return MATRIX(6,5); + + case SCODE_CURSORBLOCKUP: return MATRIX(0,7)| 0x80; + case SCODE_CURSORBLOCKDOWN: return MATRIX(0,7); + case SCODE_CURSORBLOCKLEFT: return MATRIX(0,2) | 0x80; + case SCODE_CURSORBLOCKRIGHT: return MATRIX(0,2); + + case SCODE_F1: return MATRIX(0,4); + case SCODE_F2: return MATRIX(0,4) | 0x80; + case SCODE_F3: return MATRIX(0,5); + case SCODE_F4: return MATRIX(0,5) | 0x80; + case SCODE_F5: return MATRIX(0,6); + case SCODE_F6: return MATRIX(0,6) | 0x80; + case SCODE_F7: return MATRIX(0,3); + case SCODE_F8: return MATRIX(0,3) | 0x80; + + case SCODE_0: return MATRIX(4,3); + case SCODE_1: return MATRIX(7,0); + case SCODE_2: return MATRIX(7,3); + case SCODE_3: return MATRIX(1,0); + case SCODE_4: return MATRIX(1,3); + case SCODE_5: return MATRIX(2,0); + case SCODE_6: return MATRIX(2,3); + case SCODE_7: return MATRIX(3,0); + case SCODE_8: return MATRIX(3,3); + case SCODE_9: return MATRIX(4,0); + + case SCODE_bracketleft: return MATRIX(5,6); + case SCODE_bracketright: return MATRIX(6,1); + case SCODE_slash: return MATRIX(6,7); + case SCODE_semicolon: return MATRIX(5,5); + case SCODE_grave: return MATRIX(6,2); + case SCODE_numbersign: return MATRIX(6,5); + case SCODE_ltgt: return MATRIX(6,6); + case SCODE_minus: return MATRIX(5,0); + case SCODE_equal: return MATRIX(5,3); + } +} + +static void my_kbd_handler(int scancode, int newstate) +{ + int kc = scode2c64(scancode); +#if 0 + if (kc == -1) { + printf("%d\n",kc); + return; + } +#endif + if (newstate == KEY_EVENTPRESS) { + switch (kc) { + case KEY_KPPLUS: + if (ThePrefs.SkipFrames < 10) + ThePrefs.SkipFrames++; + break; + + case KEY_KPMINUS: + if (ThePrefs.SkipFrames > 1) + ThePrefs.SkipFrames--; + break; + + case KEY_KPMULT: + ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed; + break; + + case KEY_KPDIV: + ThePrefs.JoystickSwap = !ThePrefs.JoystickSwap; + break; + + case KEY_NUMLOCK: + numlock = !numlock; + break; + + case KEY_F10: + quit = 1; + break; + + case KEY_F11: + f11pressed = 1; + break; + + case KEY_F12: + f12pressed = 1; + break; + + case KEY_FIRE: + joystate &= ~0x10; + break; + + case KEY_JDN: + joystate &= ~0x2; + break; + + case KEY_JUP: + joystate &= ~0x1; + break; + + case KEY_JLF: + joystate &= ~0x4; + break; + + case KEY_JRT: + joystate &= ~0x8; + break; + + default: + if (keystate[kc]) + break; + keystate[kc] = 1; + int c64_byte, c64_bit, shifted; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) { + key_matrix[6] &= 0xef; + rev_matrix[4] &= 0xbf; + } + key_matrix[c64_byte] &= ~(1 << c64_bit); + rev_matrix[c64_bit] &= ~(1 << c64_byte); + break; + } + } else { + switch (kc) { + case KEY_FIRE: + joystate |= 0x10; + break; + + case KEY_JDN: + joystate |= 0x2; + break; + + case KEY_JUP: + joystate |= 0x1; + break; + + case KEY_JLF: + joystate |= 0x4; + break; + + case KEY_JRT: + joystate |= 0x8; + break; + + default: + if (!keystate[kc]) + break; + keystate[kc] = 0; + int c64_byte, c64_bit, shifted; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) { + key_matrix[6] |= 0x10; + rev_matrix[4] |= 0x40; + } + key_matrix[c64_byte] |= (1 << c64_bit); + rev_matrix[c64_bit] |= (1 << c64_byte); + break; + } + + } +} +#endif + +C64Display::C64Display(C64 *the_c64) : TheC64(the_c64) +{ + quit_requested = false; +} + +#include + + +C64Display::~C64Display() +{ + sleep(1); + vga_setmode(TEXT); +} + + +/* + * Prefs may have changed + */ + +void C64Display::NewPrefs(Prefs *prefs) +{ +} + + +void C64Display::Speedometer(int speed) +{ +// printf("speed:%d\r",speed); +} + + +int init_graphics(void) +{ + int vgamode = G640x480x256; + modeinfo = *vga_getmodeinfo (vgamode); + + if (vga_setmode(vgamode) < 0) { + sleep(1); + vga_setmode(TEXT); + fprintf(stderr, "SVGAlib doesn't like my video mode. Giving up.\n"); + return 0; + } + + hsize = modeinfo.linewidth; + if (hsize < DISPLAY_X) + hsize = DISPLAY_X; + + bufmem = NULL; + if ((modeinfo.flags & CAPABLE_LINEAR) && modeinfo.linewidth >= DISPLAY_X) { + if (vga_setlinearaddressing() != -1) { + linear_mem = (char *)vga_getgraphmem(); + bufmem = linear_mem; + } + } + if (bufmem == NULL) + bufmem = (char *)malloc(hsize * DISPLAY_Y); + + if (keyboard_init() != 0) + abort(); +#if 0 + keyboard_seteventhandler(my_kbd_handler); + /* keyboard_translatekeys(DONT_CATCH_CTRLC);*/ +#endif + + memset(keystate, 0, sizeof(keystate)); + memset(key_matrix, 0xFF, 8); + memset(rev_matrix, 0xFF, 8); + return 1; +} + + +void C64Display::Update(void) +{ + int y; + + if (linear_mem) + return; + + for (y = 0; y < DISPLAY_Y; y++) { + vga_drawscanline(y, bufmem + hsize * y); + } +} + + +UBYTE *C64Display::BitmapBase(void) +{ + return (UBYTE *)bufmem; +} + + +int C64Display::BitmapXMod(void) +{ + return hsize; +} + +void C64Display::PollKeyboard(UBYTE *CIA_key_matrix, UBYTE *CIA_rev_matrix, UBYTE *joystick) +{ + keyboard_update(); + *joystick = joystate; + memcpy(CIA_key_matrix, key_matrix, 8); + memcpy(CIA_rev_matrix, rev_matrix, 8); + if (f11pressed) + TheC64->NMI(); + if (f12pressed) + TheC64->Reset(); + if (quit) + quit_requested = true; + f11pressed = f12pressed = 0; +} + + +/* + * Check if NumLock is down (for switching the joystick keyboard emulation) + */ + +bool C64Display::NumLock(void) +{ + return numlock; +} + + +/* + * Allocate C64 colors + */ + +static int colorval(int v) +{ + return v%256; + return ((v & 255)*0x01010101) >> 26; +} + +void C64Display::InitColors(UBYTE *colors) +{ + int i; + + for (i=0; i< 256; i++) { + vga_setpalette(i, colorval(palette_red[i & 0x0f]), colorval(palette_green[i & 0x0f]), colorval(palette_blue[i & 0x0f])); + colors[i] = i; + } +} + + +/* + * Show a requester (error message) + */ + +long int ShowRequester(char *a,char *b,char *) +{ + printf("%s: %s\n", a, b); + return 1; +} diff --git a/archive-sources/c64emu/Display_x.i b/archive-sources/c64emu/Display_x.i new file mode 100644 index 0000000..b0ca832 --- /dev/null +++ b/archive-sources/c64emu/Display_x.i @@ -0,0 +1,802 @@ +/* + * Display_x.i - C64 graphics display, emulator window handling, + * X specific stuff + * + * Frodo (C) 1994-1997 Christian Bauer + * X11 stuff by Bernd Schmidt/Lutz Vieweg + */ + +#include "CmdPipe.h" +#include "SAM.h" +#include "C64.h" + +#include +#include +#include +#include + +#if defined(X_USE_SHM) +#include +#include +#include +static XShmSegmentInfo shminfo; +#endif + +static Display *display; +static int screen; +static Window rootwin, mywin; + +static GC black_gc, led_gc; +static XColor black, fill_gray, shine_gray, shadow_gray, red, green; +static Colormap cmap; +static Font led_font; + +static XImage *img; +static Visual *vis; +static XVisualInfo visualInfo; +static int bitdepth; +static char *bufmem; +static int hsize; + +// For LED error blinking +static C64Display *c64_disp; +static struct sigaction pulse_sa; +static itimerval pulse_tv; + +// Keyboard and joystick +static int keystate[256]; +static int joystate = 0xFF; +static bool num_locked = false; + +#undef KBD_LANG +#define KBD_LANG 1 + +static const long int eventmask = (KeyPressMask|KeyReleaseMask|FocusChangeMask|ExposureMask); + + +/* + C64 keyboard matrix: + + Bit 7 6 5 4 3 2 1 0 + 0 CUD F5 F3 F1 F7 CLR RET DEL + 1 SHL E S Z 4 A W 3 + 2 X T F C 6 D R 5 + 3 V U H B 8 G Y 7 + 4 N O K M 0 J I 9 + 5 , @ : . - L P + + 6 / ^ = SHR HOM ; * £ + 7 R/S Q C= SPC 2 CTL <- 1 +*/ + +#define MATRIX(a,b) (((a) << 3) | (b)) + +#define KEY_F9 512 +#define KEY_F10 513 +#define KEY_F11 514 +#define KEY_F12 515 + +#ifdef SUN +#define KEY_FIRE 58 +#define KEY_JU 135 +#define KEY_JD 7 +#define KEY_JL 130 +#define KEY_JR 2 +#else +#define KEY_FIRE 516 +#define KEY_JU 517 +#define KEY_JD 518 +#define KEY_JL 519 +#define KEY_JR 520 +#endif + +#define KEY_JUL 521 +#define KEY_JUR 522 +#define KEY_JDL 523 +#define KEY_JDR 524 + +#define KEY_KP_PLUS 525 +#define KEY_KP_MINUS 526 +#define KEY_KP_MULT 527 +#define KEY_NUM_LOCK 528 + + +/* + * Decode KeySyms. This function knows about all keys that + * are common between different keyboard languages. + */ + +static int kc_decode(KeySym ks) +{ + switch (ks) { + case XK_A: case XK_a: return MATRIX(1,2); + case XK_B: case XK_b: return MATRIX(3,4); + case XK_C: case XK_c: return MATRIX(2,4); + case XK_D: case XK_d: return MATRIX(2,2); + case XK_E: case XK_e: return MATRIX(1,6); + case XK_F: case XK_f: return MATRIX(2,5); + case XK_G: case XK_g: return MATRIX(3,2); + case XK_H: case XK_h: return MATRIX(3,5); + case XK_I: case XK_i: return MATRIX(4,1); + case XK_J: case XK_j: return MATRIX(4,2); + case XK_K: case XK_k: return MATRIX(4,5); + case XK_L: case XK_l: return MATRIX(5,2); + case XK_M: case XK_m: return MATRIX(4,4); + case XK_N: case XK_n: return MATRIX(4,7); + case XK_O: case XK_o: return MATRIX(4,6); + case XK_P: case XK_p: return MATRIX(5,1); + case XK_Q: case XK_q: return MATRIX(7,6); + case XK_R: case XK_r: return MATRIX(2,1); + case XK_S: case XK_s: return MATRIX(1,5); + case XK_T: case XK_t: return MATRIX(2,6); + case XK_U: case XK_u: return MATRIX(3,6); + case XK_V: case XK_v: return MATRIX(3,7); + case XK_W: case XK_w: return MATRIX(1,1); + case XK_X: case XK_x: return MATRIX(2,7); + case XK_Y: case XK_y: return MATRIX(3,1); + case XK_Z: case XK_z: return MATRIX(1,4); + + case XK_0: return MATRIX(4,3); + case XK_1: return MATRIX(7,0); + case XK_2: return MATRIX(7,3); + case XK_3: return MATRIX(1,0); + case XK_4: return MATRIX(1,3); + case XK_5: return MATRIX(2,0); + case XK_6: return MATRIX(2,3); + case XK_7: return MATRIX(3,0); + case XK_8: return MATRIX(3,3); + case XK_9: return MATRIX(4,0); + + case XK_space: return MATRIX(7,4); + case XK_grave: return MATRIX(7,1); + case XK_backslash: return MATRIX(6,6); + case XK_comma: return MATRIX(5,7); + case XK_period: return MATRIX(5,4); + + case XK_Escape: return MATRIX(7,7); + case XK_Return: return MATRIX(0,1); + case XK_BackSpace: case XK_Delete: return MATRIX(0,0); + case XK_Insert: return MATRIX(6,3); + case XK_Home: case XK_Help: return MATRIX(6,3); + case XK_End: return MATRIX(6,0); +#ifdef __hpux + case XK_Prior: return MATRIX(6,0); + case XK_Next: return MATRIX(6,5); +#else + case XK_Page_Up: return MATRIX(6,0); + case XK_Page_Down: return MATRIX(6,5); +#endif + case XK_Control_L: return MATRIX(7,2); + case XK_Control_R: return MATRIX(7,5); + case XK_Shift_L: return MATRIX(1,7); + case XK_Shift_R: return MATRIX(6,4); + case XK_Alt_L: return MATRIX(7,5); + case XK_Alt_R: return MATRIX(7,5); + + case XK_Up: return MATRIX(0,7)| 0x80; + case XK_Down: return MATRIX(0,7); + case XK_Left: return MATRIX(0,2) | 0x80; + case XK_Right: return MATRIX(0,2); + + case XK_F1: return MATRIX(0,4); + case XK_F2: return MATRIX(0,4) | 0x80; + case XK_F3: return MATRIX(0,5); + case XK_F4: return MATRIX(0,5) | 0x80; + case XK_F5: return MATRIX(0,6); + case XK_F6: return MATRIX(0,6) | 0x80; + case XK_F7: return MATRIX(0,3); + case XK_F8: return MATRIX(0,3) | 0x80; + + case XK_F9: return KEY_F9; + case XK_F10: return KEY_F10; + case XK_F11: return KEY_F11; + case XK_F12: return KEY_F12; + + /* You never know which Keysyms might be missing on some workstation + * This #ifdef should be enough. */ +#if defined(XK_KP_Prior) && defined(XK_KP_Left) && defined(XK_KP_Insert) && defined (XK_KP_End) + case XK_KP_0: case XK_KP_Insert: return KEY_FIRE; + case XK_KP_1: case XK_KP_End: return KEY_JDL; + case XK_KP_2: case XK_KP_Down: return KEY_JD; + case XK_KP_3: case XK_KP_Next: return KEY_JDR; + case XK_KP_4: case XK_KP_Left: return KEY_JL; + case XK_KP_5: case XK_KP_Begin: return KEY_FIRE; + case XK_KP_6: case XK_KP_Right: return KEY_JR; + case XK_KP_7: case XK_KP_Home: return KEY_JUL; + case XK_KP_8: case XK_KP_Up: return KEY_JU; + case XK_KP_9: case XK_KP_Prior: return KEY_JUR; +#else + case XK_KP_0: return KEY_FIRE; + case XK_KP_1: return KEY_JDL; + case XK_KP_2: return KEY_JD; + case XK_KP_3: return KEY_JDR; + case XK_KP_4: return KEY_JL; + case XK_KP_5: return KEY_FIRE; + case XK_KP_6: return KEY_JR; + case XK_KP_7: return KEY_JUL; + case XK_KP_8: return KEY_JU; + case XK_KP_9: return KEY_JUR; +#endif + + case XK_KP_Add: return KEY_KP_PLUS; + case XK_KP_Subtract: return KEY_KP_MINUS; + case XK_KP_Multiply: return KEY_KP_MULT; + case XK_KP_Divide: return MATRIX(6,7); + case XK_KP_Enter: return MATRIX(0,1); + +#ifdef SUN + case XK_Num_Lock: return KEY_NUM_LOCK; +#endif + } + return -1; +} + +static int decode_us(KeySym ks) +{ + switch(ks) { /* US specific */ + case XK_minus: return MATRIX(5,0); + case XK_equal: return MATRIX(5,3); + case XK_bracketleft: return MATRIX(5,6); + case XK_bracketright: return MATRIX(6,1); + case XK_semicolon: return MATRIX(5,5); + case XK_apostrophe: return MATRIX(6,2); + case XK_slash: return MATRIX(6,7); + } + + return -1; +} + +static int decode_de(KeySym ks) +{ + switch(ks) { /* DE specific */ + case XK_ssharp: return MATRIX(5,0); + case XK_apostrophe: return MATRIX(5,3); + case XK_Udiaeresis: case XK_udiaeresis: return MATRIX(5,6); + case XK_plus: return MATRIX(6,1); + case XK_Odiaeresis: case XK_odiaeresis: return MATRIX(5,5); + case XK_Adiaeresis: case XK_adiaeresis: return MATRIX(6,2); + case XK_numbersign: return MATRIX(6,5); + case XK_less: case XK_greater: return MATRIX(6,0); + case XK_minus: return MATRIX(6,7); + } + + return -1; +} + +static int keycode2c64(XKeyEvent *event) +{ + KeySym ks; + int as; + int index = 0; + + do { + ks = XLookupKeysym(event, index); + as = kc_decode(ks); + + if (as == -1) + as = KBD_LANG == 0 ? decode_us(ks) : decode_de(ks); + if (as != -1) + return as; + index++; + } while (ks != NoSymbol); + + return -1; +} + + +/* + * Display constructor: Draw Speedometer/LEDs in window + */ + +C64Display::C64Display(C64 *the_c64) : TheC64(the_c64) +{ + int i; + char str[16]; + + quit_requested = false; + + // LEDs off + for (i=0; i<4; i++) + led_state[i] = old_led_state[i] = LED_OFF; + + // Draw speedometer/LEDs + led_gc = XCreateGC(display, mywin, 0, 0); + XSetFont(display, led_gc, led_font); + + XSetForeground(display, led_gc, fill_gray.pixel); + XFillRectangle(display, mywin, led_gc, 0, DISPLAY_Y, DISPLAY_X-1, 16); + + XSetForeground(display, led_gc, shine_gray.pixel); + XDrawLine(display, mywin, led_gc, 0, DISPLAY_Y, DISPLAY_X-1, DISPLAY_Y); + for (i=0; i<5; i++) + XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5, DISPLAY_Y, DISPLAY_X*i/5, DISPLAY_Y+14); + for (i=2; i<6; i++) { + XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-23, DISPLAY_Y+11, DISPLAY_X*i/5-9, DISPLAY_Y+11); + XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-9, DISPLAY_Y+11, DISPLAY_X*i/5-9, DISPLAY_Y+5); + } + + XSetForeground(display, led_gc, shadow_gray.pixel); + XDrawLine(display, mywin, led_gc, 0, DISPLAY_Y+15, DISPLAY_X-1, DISPLAY_Y+15); + for (i=1; i<6; i++) + XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-1, DISPLAY_Y+1, DISPLAY_X*i/5-1, DISPLAY_Y+15); + for (i=2; i<6; i++) { + XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-24, DISPLAY_Y+11, DISPLAY_X*i/5-24, DISPLAY_Y+4); + XDrawLine(display, mywin, led_gc, DISPLAY_X*i/5-24, DISPLAY_Y+4, DISPLAY_X*i/5-9, DISPLAY_Y+4); + } + + for (i=0; i<4; i++) { + sprintf(str, "Drive %d", i+8); + XSetForeground(display, led_gc, black.pixel); + XDrawString(display, mywin, led_gc, DISPLAY_X*(i+1)/5+8, DISPLAY_Y+12, str, strlen(str)); + draw_led(i, LED_OFF); + } + + // Start timer for LED error blinking + c64_disp = this; + pulse_sa.sa_handler = pulse_handler; + pulse_sa.sa_flags = 0; + sigemptyset(&pulse_sa.sa_mask); + sigaction(SIGALRM, &pulse_sa, NULL); + pulse_tv.it_interval.tv_sec = 0; + pulse_tv.it_interval.tv_usec = 400000; + pulse_tv.it_value.tv_sec = 0; + pulse_tv.it_value.tv_usec = 400000; + setitimer(ITIMER_REAL, &pulse_tv, NULL); +} + + +/* + * Display destructor + */ + +C64Display::~C64Display() +{ + XAutoRepeatOn(display); + XSync(display, 0); +} + + +/* + * Prefs may have changed + */ + +void C64Display::NewPrefs(Prefs *prefs) +{ +} + + +/* + * Connect to X server and open window + */ + +int init_graphics(void) +{ + int i; + char *display_name = 0; + XSetWindowAttributes wattr; + XSizeHints *hints; + XColor exact_color; + int pixbytes; + + display = XOpenDisplay(display_name); + if (display == 0) { + fprintf(stderr, "Can't connect to X server %s\n", XDisplayName(display_name)); + return 0; + } + + screen = XDefaultScreen(display); + rootwin = XRootWindow(display, screen); +#if 0 + if (XMatchVisualInfo(display, screen, 16, TrueColor, &visualInfo)) { + } else if (XMatchVisualInfo(display, screen, 24, TrueColor, &visualInfo)) { + } else +#endif + if (XMatchVisualInfo(display, screen, 8, PseudoColor, &visualInfo)) { + /* for our HP boxes */ + } else if (XMatchVisualInfo(display, screen, 8, GrayScale, &visualInfo)) { + } else { + fprintf(stderr, "Can't obtain appropriate X visual\n"); + return 0; + } + + vis = visualInfo.visual; + bitdepth = visualInfo.depth; + pixbytes = (bitdepth == 24 || bitdepth == 32 ? 4 : bitdepth == 12 || bitdepth == 16 ? 2 : 1); + fprintf(stderr, "Using %d bit visual\n", bitdepth); + + hsize = (DISPLAY_X + 3) & ~3; + +#if defined(X_USE_SHM) + img = XShmCreateImage(display, vis, bitdepth, ZPixmap, 0, &shminfo, + hsize, DISPLAY_Y); + + shminfo.shmid = shmget(IPC_PRIVATE, DISPLAY_Y * img->bytes_per_line, + IPC_CREAT | 0777); + shminfo.shmaddr = img->data = bufmem = (char *)shmat(shminfo.shmid, 0, 0); + shminfo.readOnly = False; + XShmAttach(display, &shminfo); + XSync(display,0); + /* now deleting means making it temporary */ + shmctl(shminfo.shmid, IPC_RMID, 0); +#else + bufmem = (char *)malloc(pixbytes * hsize * DISPLAY_Y); + img = XCreateImage(display, vis, bitdepth, ZPixmap, 0, bufmem, hsize, DISPLAY_Y, 32, 0); +#endif + + cmap = XCreateColormap(display, rootwin, vis, AllocNone); + + XParseColor(display, cmap, "#000000", &black); + if (!XAllocColor(display, cmap, &black)) + fprintf(stderr, "Whoops??\n"); + + wattr.event_mask = eventmask; + wattr.background_pixel = black.pixel; + wattr.backing_store = Always; + wattr.backing_planes = bitdepth; + wattr.border_pixmap = None; + wattr.border_pixel = black.pixel; + wattr.colormap = cmap; + + mywin = XCreateWindow(display, rootwin, 0, 0, DISPLAY_X, DISPLAY_Y + 16, 0, + bitdepth, InputOutput, vis, + CWEventMask|CWBackPixel|CWBorderPixel|CWBackingStore + |CWBackingPlanes|CWColormap, + &wattr); + XMapWindow(display, mywin); + XStoreName(display, mywin, "Frodo"); + + if ((hints = XAllocSizeHints()) != NULL) { + hints->min_width = DISPLAY_X; + hints->max_width = DISPLAY_X; + hints->min_height = DISPLAY_Y + 16; + hints->max_height = DISPLAY_Y + 16; + hints->flags = PMinSize | PMaxSize; + XSetWMNormalHints(display, mywin, hints); + XFree((char *)hints); + } + + black_gc = XCreateGC(display,mywin, 0, 0); + XSetForeground(display, black_gc, black.pixel); + + // Allocate colors for speedometer/LEDs + if (!XAllocNamedColor(display, cmap, "rgb:d0/d0/d0", &fill_gray, &exact_color)) + return 0; + if (!XAllocNamedColor(display, cmap, "rgb:e8/e8/e8", &shine_gray, &exact_color)) + return 0; + if (!XAllocNamedColor(display, cmap, "rgb:98/98/98", &shadow_gray, &exact_color)) + return 0; + if (!XAllocNamedColor(display, cmap, "rgb:f0/00/00", &red, &exact_color)) + return 0; + if (!XAllocNamedColor(display, cmap, "rgb:00/f0/00", &green, &exact_color)) + return 0; + + // Load font for speedometer/LED labels + led_font = XLoadFont(display, "-*-helvetica-medium-r-*-*-10-*"); + + for(i=0; i<256; i++) + keystate[i] = 0; + + return 1; +} + + +/* + * Redraw bitmap + */ + +void C64Display::Update(void) +{ + // Update C64 display + XSync(display, 0); +#if defined(X_USE_SHM) + XShmPutImage(display, mywin, black_gc, img, 0, 0, 0, 0, DISPLAY_X, DISPLAY_Y, 0); +#else + XPutImage(display, mywin, black_gc, img, 0, 0, 0, 0, DISPLAY_X, DISPLAY_Y); +#endif + + // Update drive LEDs + for (int i=0; i<4; i++) + if (led_state[i] != old_led_state[i]) { + draw_led(i, led_state[i]); + old_led_state[i] = led_state[i]; + } +} + + +/* + * Draw one drive LED + */ + +void C64Display::draw_led(int num, int state) +{ + switch (state) { + case LED_OFF: + case LED_ERROR_OFF: + XSetForeground(display, led_gc, black.pixel); + break; + case LED_ON: + XSetForeground(display, led_gc, green.pixel); + break; + case LED_ERROR_ON: + XSetForeground(display, led_gc, red.pixel); + break; + } + XFillRectangle(display, mywin, led_gc, DISPLAY_X*(num+2)/5-23, DISPLAY_Y+5, 14, 6); +} + + +/* + * LED error blink + */ + +void C64Display::pulse_handler(...) +{ + for (int i=0; i<4; i++) + switch (c64_disp->led_state[i]) { + case LED_ERROR_ON: + c64_disp->led_state[i] = LED_ERROR_OFF; + break; + case LED_ERROR_OFF: + c64_disp->led_state[i] = LED_ERROR_ON; + break; + } +} + + +/* + * Draw speedometer + */ + +void C64Display::Speedometer(int speed) +{ + static int delay = 0; + + if (delay >= 20) { + char str[16]; + sprintf(str, "%d%%", speed); + XSetForeground(display, led_gc, fill_gray.pixel); + XFillRectangle(display,mywin, led_gc, 1, DISPLAY_Y+1, DISPLAY_X/5-2, 14); + XSetForeground(display, led_gc, black.pixel); + XDrawString(display, mywin, led_gc, 24, DISPLAY_Y+12, str, strlen(str)); + delay = 0; + } else + delay++; +} + + +/* + * Return pointer to bitmap data + */ + +uint8 *C64Display::BitmapBase(void) +{ + return (uint8 *)bufmem; +} + + +/* + * Return number of bytes per row + */ + +int C64Display::BitmapXMod(void) +{ + return hsize; +} + + +/* + * Poll the keyboard + */ + +void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick) +{ + static bool auto_rep = true; + for(;;) { + XEvent event; + if (!XCheckMaskEvent(display, eventmask, &event)) + break; + + switch(event.type) { + + case KeyPress: { + int kc = keycode2c64((XKeyEvent *)&event); + if (kc == -1) + break; + switch (kc) { + + case KEY_F9: // F9: Invoke SAM + SAM(TheC64); + break; + + case KEY_F10: // F10: Quit + quit_requested = true; + break; + + case KEY_F11: // F11: NMI (Restore) + TheC64->NMI(); + break; + + case KEY_F12: // F12: Reset + TheC64->Reset(); + break; + + case KEY_NUM_LOCK: // NumLock: Toggle joyport + num_locked = true; + break; + + case KEY_FIRE: + joystate &= ~0x10; + break; + case KEY_JD: + joystate &= ~0x02; + break; + case KEY_JU: + joystate &= ~0x01; + break; + case KEY_JL: + joystate &= ~0x04; + break; + case KEY_JR: + joystate &= ~0x08; + break; + case KEY_JUL: + joystate &= ~0x05; + break; + case KEY_JUR: + joystate &= ~0x09; + break; + case KEY_JDL: + joystate &= ~0x06; + break; + case KEY_JDR: + joystate &= ~0x0a; + break; + + case KEY_KP_PLUS: // '+' on keypad: Increase SkipFrames + ThePrefs.SkipFrames++; + break; + + case KEY_KP_MINUS: // '-' on keypad: Decrease SkipFrames + if (ThePrefs.SkipFrames > 1) + ThePrefs.SkipFrames--; + break; + + case KEY_KP_MULT: // '*' on keypad: Toggle speed limiter + ThePrefs.LimitSpeed = !ThePrefs.LimitSpeed; + break; + + default: + if (keystate[kc]) + break; + keystate[kc] = 1; + int c64_byte, c64_bit, shifted; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) { + key_matrix[6] &= 0xef; + rev_matrix[4] &= 0xbf; + } + key_matrix[c64_byte] &= ~(1 << c64_bit); + rev_matrix[c64_bit] &= ~(1 << c64_byte); + break; + } + break; + } + + case KeyRelease: { + int kc = keycode2c64((XKeyEvent *)&event); + if (kc == -1) + break; + switch (kc) { + + case KEY_NUM_LOCK: + num_locked = false; + break; + + case KEY_FIRE: + joystate |= 0x10; + break; + case KEY_JD: + joystate |= 0x02; + break; + case KEY_JU: + joystate |= 0x01; + break; + case KEY_JL: + joystate |= 0x04; + break; + case KEY_JR: + joystate |= 0x08; + break; + case KEY_JUL: + joystate |= 0x05; + break; + case KEY_JUR: + joystate |= 0x09; + break; + case KEY_JDL: + joystate |= 0x06; + break; + case KEY_JDR: + joystate |= 0x0a; + break; + + default: + if (!keystate[kc]) + break; + keystate[kc] = 0; + int c64_byte, c64_bit, shifted; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) { + key_matrix[6] |= 0x10; + rev_matrix[4] |= 0x40; + } + key_matrix[c64_byte] |= (1 << c64_bit); + rev_matrix[c64_bit] |= (1 << c64_byte); + break; + } + } + + case FocusIn: + if (auto_rep) { + XAutoRepeatOff(display); + auto_rep = false; + } + break; + + case FocusOut: + if (!auto_rep) { + XAutoRepeatOn(display); + auto_rep = true; + } + break; + } + } + *joystick = joystate; +} + + +/* + * Check if NumLock is down (for switching the joystick keyboard emulation) + */ + +bool C64Display::NumLock(void) +{ + return num_locked; +} + + +/* + * Allocate C64 colors + */ + +void C64Display::InitColors(uint8 *colors) +{ + int i; + XColor col; + char str[20]; + + for (i=0; i< 256; i++) { + sprintf(str, "rgb:%x/%x/%x", palette_red[i & 0x0f], palette_green[i & 0x0f], palette_blue[i & 0x0f]); + XParseColor(display, cmap, str, &col); + if (XAllocColor(display, cmap, &col)) + colors[i] = col.pixel; + else + fprintf(stderr, "Couldn't get all colors\n"); + } +} + + +/* + * Show a requester (error message) + */ + +long int ShowRequester(char *a,char *b,char *) +{ + printf("%s: %s\n", a, b); + return 1; +} diff --git a/archive-sources/c64emu/FixPoint.i b/archive-sources/c64emu/FixPoint.i new file mode 100644 index 0000000..4b04290 --- /dev/null +++ b/archive-sources/c64emu/FixPoint.i @@ -0,0 +1,415 @@ +/* + * FixPoint.i + * + * Provides fixpoint arithmetic (for use in SID.cpp) + * You need to define FIXPOINT_PREC (number of fractional bits) and + * ldSINTAB (ld of the size of the sinus table) as well M_PI + * _before_ including this file. + * Requires at least 32bit ints! + * (C) 1997 Andreas Dehmel + */ + + +#define FIXPOINT_BITS 32 +// Sign-bit +#define FIXPOINT_SIGN (1<<(FIXPOINT_BITS-1)) + + +/* + * Elementary functions for the FixPoint class + */ + +// Multiplies two fixpoint numbers, result is a fixpoint number. +static inline int fixmult(int x, int y) +{ + register unsigned int a,b; + register bool sign; + + sign = (x ^ y) < 0; + if (x < 0) {x = -x;} + if (y < 0) {y = -y;} + // a, b : integer part; x, y : fractional part. All unsigned now (for shift right)!!! + a = (((unsigned int)x) >> FIXPOINT_PREC); x &= ~(a << FIXPOINT_PREC); + b = (((unsigned int)y) >> FIXPOINT_PREC); y &= ~(b << FIXPOINT_PREC); + x = ((a*b) << FIXPOINT_PREC) + (a*y + b*x) + + ((unsigned int)((x*y) + (1 << (FIXPOINT_PREC-1))) >> FIXPOINT_PREC); +#ifdef FIXPOINT_SIGN + if (x < 0) {x ^= FIXPOINT_SIGN;} +#endif + if (sign) {x = -x;} + return(x); +} + + +// Multiplies a fixpoint number with an integer, result is a 32 bit (!) integer in +// contrast to using the standard member-functions which can provide only (32-FIXPOINT_PREC) +// valid bits. +static inline int intmult(int x, int y) // x is fixpoint, y integer +{ + register unsigned int i,j; + register bool sign; + + sign = (x ^ y) < 0; + if (x < 0) {x = -x;} + if (y < 0) {y = -y;} + i = (((unsigned int)x) >> 16); x &= ~(i << 16); // split both into 16.16 parts + j = (((unsigned int)y) >> 16); y &= ~(j << 16); +#if FIXPOINT_PREC <= 16 + // This '32' is independent of the number of bits used, it's due to the 16 bit shift + i = ((i*j) << (32 - FIXPOINT_PREC)) + ((i*y + j*x) << (16 - FIXPOINT_PREC)) + + ((unsigned int)(x*y + (1 << (FIXPOINT_PREC - 1))) >> FIXPOINT_PREC); +#else + { + register unsigned int h; + + h = (i*y + j*x); + i = ((i*j) << (32 - FIXPOINT_PREC)) + (h >> (FIXPOINT_PREC - 16)); + h &= ((1 << (FIXPOINT_PREC - 16)) - 1); x *= y; + i += (x >> FIXPOINT_PREC); x &= ((1 << FIXPOINT_PREC) - 1); + i += (((h + (x >> 16)) + (1 << (FIXPOINT_PREC - 17))) >> (FIXPOINT_PREC - 16)); + } +#endif +#ifdef FIXPOINT_SIGN + if (i < 0) {i ^= FIXPOINT_SIGN;} +#endif + if (sign) {i = -i;} + return(i); +} + + +// Computes the product of a fixpoint number with itself. +static inline int fixsquare(int x) +{ + register unsigned int a; + + if (x < 0) {x = -x;} + a = (((unsigned int)x) >> FIXPOINT_PREC); x &= ~(a << FIXPOINT_PREC); + x = ((a*a) << FIXPOINT_PREC) + ((a*x) << 1) + + ((unsigned int)((x*x) + (1 << (FIXPOINT_PREC-1))) >> FIXPOINT_PREC); +#ifdef FIXPOINT_SIGN + if (x < 0) {x ^= FIXPOINT_SIGN;} +#endif + return(x); +} + + +// Computes the square root of a fixpoint number. +static inline int fixsqrt(int x) +{ + register int test, step; + + if (x < 0) return(-1); if (x == 0) return(0); + step = (x <= (1<>1)); + test = 0; + while (step != 0) + { + register int h; + + h = fixsquare(test + step); + if (h <= x) {test += step;} + if (h == x) break; + step >>= 1; + } + return(test); +} + + +// Divides a fixpoint number by another fixpoint number, yielding a fixpoint result. +static inline int fixdiv(int x, int y) +{ + register int res, mask; + register bool sign; + + sign = (x ^ y) < 0; + if (x < 0) {x = -x;} + if (y < 0) {y = -y;} + mask = (1< y) {y <<= 1; mask <<= 1;} + while (mask != 0) + { + if (x >= y) {res |= mask; x -= y;} + mask >>= 1; y >>= 1; + } +#ifdef FIXPOINT_SIGN + if (res < 0) {res ^= FIXPOINT_SIGN;} +#endif + if (sign) {res = -res;} + return(res); +} + + + + + +/* + * The C++ Fixpoint class. By no means exhaustive... + * Since it contains only one int data, variables of type FixPoint can be + * passed directly rather than as a reference. + */ + +class FixPoint +{ +private: + int x; + +public: + FixPoint(void); + FixPoint(int y); + ~FixPoint(void); + + // conversions + int Value(void); + int round(void); + operator int(void); + + // unary operators + FixPoint sqrt(void); + FixPoint sqr(void); + FixPoint abs(void); + FixPoint operator+(void); + FixPoint operator-(void); + FixPoint operator++(void); + FixPoint operator--(void); + + // binary operators + int imul(int y); + FixPoint operator=(FixPoint y); + FixPoint operator=(int y); + FixPoint operator+(FixPoint y); + FixPoint operator+(int y); + FixPoint operator-(FixPoint y); + FixPoint operator-(int y); + FixPoint operator/(FixPoint y); + FixPoint operator/(int y); + FixPoint operator*(FixPoint y); + FixPoint operator*(int y); + FixPoint operator+=(FixPoint y); + FixPoint operator+=(int y); + FixPoint operator-=(FixPoint y); + FixPoint operator-=(int y); + FixPoint operator*=(FixPoint y); + FixPoint operator*=(int y); + FixPoint operator/=(FixPoint y); + FixPoint operator/=(int y); + FixPoint operator<<(int y); + FixPoint operator>>(int y); + FixPoint operator<<=(int y); + FixPoint operator>>=(int y); + + // conditional operators + bool operator<(FixPoint y); + bool operator<(int y); + bool operator<=(FixPoint y); + bool operator<=(int y); + bool operator>(FixPoint y); + bool operator>(int y); + bool operator>=(FixPoint y); + bool operator>=(int y); + bool operator==(FixPoint y); + bool operator==(int y); + bool operator!=(FixPoint y); + bool operator!=(int y); +}; + + +/* + * int gets treated differently according to the case: + * + * a) Equations (=) or condition checks (==, <, <= ...): raw int (i.e. no conversion) + * b) As an argument for an arithmetic operation: conversion to fixpoint by shifting + * + * Otherwise loading meaningful values into FixPoint variables would be very awkward. + */ + +FixPoint::FixPoint(void) {x = 0;} + +FixPoint::FixPoint(int y) {x = y;} + +FixPoint::~FixPoint(void) {;} + +inline int FixPoint::Value(void) {return(x);} + +inline int FixPoint::round(void) {return((x + (1 << (FIXPOINT_PREC-1))) >> FIXPOINT_PREC);} + +inline FixPoint::operator int(void) {return(x);} + + +// unary operators +inline FixPoint FixPoint::sqrt(void) {return(fixsqrt(x));} + +inline FixPoint FixPoint::sqr(void) {return(fixsquare(x));} + +inline FixPoint FixPoint::abs(void) {return((x < 0) ? -x : x);} + +inline FixPoint FixPoint::operator+(void) {return(x);} + +inline FixPoint FixPoint::operator-(void) {return(-x);} + +inline FixPoint FixPoint::operator++(void) {x += (1 << FIXPOINT_PREC); return x;} + +inline FixPoint FixPoint::operator--(void) {x -= (1 << FIXPOINT_PREC); return x;} + + +// binary operators +inline int FixPoint::imul(int y) {return(intmult(x,y));} + +inline FixPoint FixPoint::operator=(FixPoint y) {x = y.Value(); return x;} + +inline FixPoint FixPoint::operator=(int y) {x = y; return x;} + +inline FixPoint FixPoint::operator+(FixPoint y) {return(x + y.Value());} + +inline FixPoint FixPoint::operator+(int y) {return(x + (y << FIXPOINT_PREC));} + +inline FixPoint FixPoint::operator-(FixPoint y) {return(x - y.Value());} + +inline FixPoint FixPoint::operator-(int y) {return(x - (y << FIXPOINT_PREC));} + +inline FixPoint FixPoint::operator/(FixPoint y) {return(fixdiv(x,y.Value()));} + +inline FixPoint FixPoint::operator/(int y) {return(x/y);} + +inline FixPoint FixPoint::operator*(FixPoint y) {return(fixmult(x,y.Value()));} + +inline FixPoint FixPoint::operator*(int y) {return(x*y);} + +inline FixPoint FixPoint::operator+=(FixPoint y) {x += y.Value(); return x;} + +inline FixPoint FixPoint::operator+=(int y) {x += (y << FIXPOINT_PREC); return x;} + +inline FixPoint FixPoint::operator-=(FixPoint y) {x -= y.Value(); return x;} + +inline FixPoint FixPoint::operator-=(int y) {x -= (y << FIXPOINT_PREC); return x;} + +inline FixPoint FixPoint::operator*=(FixPoint y) {x = fixmult(x,y.Value()); return x;} + +inline FixPoint FixPoint::operator*=(int y) {x *= y; return x;} + +inline FixPoint FixPoint::operator/=(FixPoint y) {x = fixdiv(x,y.Value()); return x;} + +inline FixPoint FixPoint::operator/=(int y) {x /= y; return x;} + +inline FixPoint FixPoint::operator<<(int y) {return(x << y);} + +inline FixPoint FixPoint::operator>>(int y) {return(x >> y);} + +inline FixPoint FixPoint::operator<<=(int y) {x <<= y; return x;} + +inline FixPoint FixPoint::operator>>=(int y) {x >>= y; return x;} + + +// conditional operators +inline bool FixPoint::operator<(FixPoint y) {return(x < y.Value());} + +inline bool FixPoint::operator<(int y) {return(x < y);} + +inline bool FixPoint::operator<=(FixPoint y) {return(x <= y.Value());} + +inline bool FixPoint::operator<=(int y) {return(x <= y);} + +inline bool FixPoint::operator>(FixPoint y) {return(x > y.Value());} + +inline bool FixPoint::operator>(int y) {return(x > y);} + +inline bool FixPoint::operator>=(FixPoint y) {return(x >= y.Value());} + +inline bool FixPoint::operator>=(int y) {return(x >= y);} + +inline bool FixPoint::operator==(FixPoint y) {return(x == y.Value());} + +inline bool FixPoint::operator==(int y) {return(x == y);} + +inline bool FixPoint::operator!=(FixPoint y) {return(x != y.Value());} + +inline bool FixPoint::operator!=(int y) {return(x != y);} + + + +/* + * In case the first argument is an int (i.e. member-operators not applicable): + * Not supported: things like int/FixPoint. The same difference in conversions + * applies as mentioned above. + */ + + +// binary operators +inline FixPoint operator+(int x, FixPoint y) {return((x << FIXPOINT_PREC) + y.Value());} + +inline FixPoint operator-(int x, FixPoint y) {return((x << FIXPOINT_PREC) - y.Value());} + +inline FixPoint operator*(int x, FixPoint y) {return(x*y.Value());} + + +// conditional operators +inline bool operator==(int x, FixPoint y) {return(x == y.Value());} + +inline bool operator!=(int x, FixPoint y) {return(x != y.Value());} + +inline bool operator<(int x, FixPoint y) {return(x < y.Value());} + +inline bool operator<=(int x, FixPoint y) {return(x <= y.Value());} + +inline bool operator>(int x, FixPoint y) {return(x > y.Value());} + +inline bool operator>=(int x, FixPoint y) {return(x >= y.Value());} + + + +/* + * For more convenient creation of constant fixpoint numbers from constant floats. + */ + +#define FixNo(n) (FixPoint)((int)(n*(1<= 3*(1<= 2*(1<= (1<> (FIXPOINT_PREC - ldSINTAB - 1)) & ((1<<(ldSINTAB+2))-1); + FIXPOINT_SIN_COS_GENERIC +} + + +static inline FixPoint fixcos(FixPoint x) +{ + int angle = x; + + // cos(x) = sin(x+PI/2) + angle = (angle + (1<<(FIXPOINT_PREC-1)) >> (FIXPOINT_PREC - ldSINTAB - 1)) & ((1<<(ldSINTAB+2))-1); + FIXPOINT_SIN_COS_GENERIC +} + + + +static inline void InitFixSinTab(void) +{ + int i; + float step; + + for (i=0, step=0; i<(1<Ready) + drive[i]->Reset(); + + UpdateLEDs(); +} + + +/* + * Preferences have changed, prefs points to new preferences, + * ThePrefs still holds the previous ones. Check if drive settings + * have changed. + */ + +void IEC::NewPrefs(Prefs *prefs) +{ + // Delete and recreate all changed drives + for (int i=0; i<4; i++) + if ((ThePrefs.DriveType[i] != prefs->DriveType[i]) || strcmp(ThePrefs.DrivePath[i], prefs->DrivePath[i]) || ThePrefs.Emul1541Proc != prefs->Emul1541Proc) { + delete drive[i]; + drive[i] = NULL; // Important because UpdateLEDs is called from drive constructors (via set_error()) + if (!prefs->Emul1541Proc) { + if (prefs->DriveType[i] == DRVTYPE_DIR) + drive[i] = new FSDrive(this, prefs->DrivePath[i]); + else if (prefs->DriveType[i] == DRVTYPE_D64) + drive[i] = new D64Drive(this, prefs->DrivePath[i]); + else + drive[i] = new T64Drive(this, prefs->DrivePath[i]); + } + } + + UpdateLEDs(); +} + + +/* + * Update drive LED display + */ + +void IEC::UpdateLEDs(void) +{ + if (drive[0] != NULL && drive[1] != NULL && drive[2] != NULL && drive[3] != NULL) + the_display->UpdateLEDs(drive[0]->LED, drive[1]->LED, drive[2]->LED, drive[3]->LED); +} + + +/* + * Output one byte + */ + +uint8 IEC::Out(uint8 byte, bool eoi) +{ + if (listener_active) { + if (received_cmd == CMD_OPEN) + return open_out(byte, eoi); + if (received_cmd == CMD_DATA) + return data_out(byte, eoi); + return ST_TIMEOUT; + } else + return ST_TIMEOUT; +} + + +/* + * Output one byte with ATN (Talk/Listen/Untalk/Unlisten) + */ + +uint8 IEC::OutATN(uint8 byte) +{ + received_cmd = sec_addr = 0; // Command is sent with secondary address + switch (byte & 0xf0) { + case ATN_LISTEN: + listening = true; + return listen(byte & 0x0f); + case ATN_UNLISTEN: + listening = false; + return unlisten(); + case ATN_TALK: + listening = false; + return talk(byte & 0x0f); + case ATN_UNTALK: + listening = false; + return untalk(); + } + return ST_TIMEOUT; +} + + +/* + * Output secondary address + */ + +uint8 IEC::OutSec(uint8 byte) +{ + if (listening) { + if (listener_active) { + sec_addr = byte & 0x0f; + received_cmd = byte & 0xf0; + return sec_listen(); + } + } else { + if (talker_active) { + sec_addr = byte & 0x0f; + received_cmd = byte & 0xf0; + return sec_talk(); + } + } + return ST_TIMEOUT; +} + + +/* + * Read one byte + */ + +uint8 IEC::In(uint8 *byte) +{ + if (talker_active && (received_cmd == CMD_DATA)) + return data_in(byte); + + *byte = 0; + return ST_TIMEOUT; +} + + +/* + * Assert ATN (for Untalk) + */ + +void IEC::SetATN(void) +{ + // Only needed for real IEC +} + + +/* + * Release ATN + */ + +void IEC::RelATN(void) +{ + // Only needed for real IEC +} + + +/* + * Talk-attention turn-around + */ + +void IEC::Turnaround(void) +{ + // Only needed for real IEC +} + + +/* + * System line release + */ + +void IEC::Release(void) +{ + // Only needed for real IEC +} + + +/* + * Listen + */ + +uint8 IEC::listen(int device) +{ + if ((device >= 8) && (device <= 11)) { + if ((listener = drive[device-8]) != NULL && listener->Ready) { + listener_active = true; + return ST_OK; + } + } + + listener_active = false; + return ST_NOTPRESENT; +} + + +/* + * Talk + */ + +uint8 IEC::talk(int device) +{ + if ((device >= 8) && (device <= 11)) { + if ((talker = drive[device-8]) != NULL && talker->Ready) { + talker_active = true; + return ST_OK; + } + } + + talker_active = false; + return ST_NOTPRESENT; +} + + +/* + * Unlisten + */ + +uint8 IEC::unlisten(void) +{ + listener_active = false; + return ST_OK; +} + + +/* + * Untalk + */ + +uint8 IEC::untalk(void) +{ + talker_active = false; + return ST_OK; +} + + +/* + * Secondary address after Listen + */ + +uint8 IEC::sec_listen(void) +{ + switch (received_cmd) { + + case CMD_OPEN: // Prepare for receiving the file name + name_ptr = name_buf; + name_len = 0; + return ST_OK; + + case CMD_CLOSE: // Close channel + if (listener->LED != DRVLED_ERROR) { + listener->LED = DRVLED_OFF; // Turn off drive LED + UpdateLEDs(); + } + return listener->Close(sec_addr); + } + return ST_OK; +} + + +/* + * Secondary address after Talk + */ + +uint8 IEC::sec_talk(void) +{ + return ST_OK; +} + + +/* + * Byte after Open command: Store character in file name, open file on EOI + */ + +uint8 IEC::open_out(uint8 byte, bool eoi) +{ + if (name_len < NAMEBUF_LENGTH) { + *name_ptr++ = byte; + name_len++; + } + + if (eoi) { + *name_ptr = 0; // End string + listener->LED = DRVLED_ON; // Turn on drive LED + UpdateLEDs(); + return listener->Open(sec_addr, name_buf); + } + + return ST_OK; +} + + +/* + * Write byte to channel + */ + +uint8 IEC::data_out(uint8 byte, bool eoi) +{ + return listener->Write(sec_addr, byte, eoi); +} + + +/* + * Read byte from channel + */ + +uint8 IEC::data_in(uint8 *byte) +{ + return talker->Read(sec_addr, byte); +} + + +/* + * Drive constructor + */ + +Drive::Drive(IEC *iec) +{ + the_iec = iec; + LED = DRVLED_OFF; + Ready = false; + set_error(ERR_STARTUP); +} + + +/* + * Set error message on drive + */ + +// 1541 error messages +char *Errors_1541[] = { + "00, OK,00,00\r", + "25,WRITE ERROR,00,00\r", + "26,WRITE PROTECT ON,00,00\r", + "30,SYNTAX ERROR,00,00\r", + "33,SYNTAX ERROR,00,00\r", + "60,WRITE FILE OPEN,00,00\r", + "61,FILE NOT OPEN,00,00\r", + "62,FILE NOT FOUND,00,00\r", + "67,ILLEGAL TRACK OR SECTOR,00,00\r", + "70,NO CHANNEL,00,00\r", + "73,CBM DOS V2.6 1541,00,00\r", + "74,DRIVE NOT READY,00,00\r" +}; + +void Drive::set_error(int error) +{ + error_ptr = Errors_1541[error]; + error_len = strlen(error_ptr); + + // Set drive condition + if (error != ERR_OK) + if (error == ERR_STARTUP) + LED = DRVLED_OFF; + else + LED = DRVLED_ERROR; + else if (LED == DRVLED_ERROR) + LED = DRVLED_OFF; + the_iec->UpdateLEDs(); +} diff --git a/archive-sources/c64emu/IEC.h b/archive-sources/c64emu/IEC.h new file mode 100644 index 0000000..5d62d01 --- /dev/null +++ b/archive-sources/c64emu/IEC.h @@ -0,0 +1,146 @@ +/* + * IEC.h - IEC bus routines, 1541 emulation (DOS level) + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _IEC_H +#define _IEC_H + + +// Maximum length of file names +const int NAMEBUF_LENGTH = 256; + + +// C64 status codes +enum { + ST_OK = 0, // No error + ST_READ_TIMEOUT = 0x02, // Timeout on reading + ST_TIMEOUT = 0x03, // Timeout + ST_EOF = 0x40, // End of file + ST_NOTPRESENT = 0x80 // Device not present +}; + + +// 1541 error codes +enum { + ERR_OK, // 00 OK + ERR_WRITEERROR, // 25 WRITE ERROR + ERR_WRITEPROTECT, // 26 WRITE PROTECT ON + ERR_SYNTAX30, // 30 SYNTAX ERROR (unknown command) + ERR_SYNTAX33, // 33 SYNTAX ERROR (wildcards on writing) + ERR_WRITEFILEOPEN, // 60 WRITE FILE OPEN + ERR_FILENOTOPEN, // 61 FILE NOT OPEN + ERR_FILENOTFOUND, // 62 FILE NOT FOUND + ERR_ILLEGALTS, // 67 ILLEGAL TRACK OR SECTOR + ERR_NOCHANNEL, // 70 NO CHANNEL + ERR_STARTUP, // 73 Power-up message + ERR_NOTREADY // 74 DRIVE NOT READY +}; + + +// IEC command codes +enum { + CMD_DATA = 0x60, // Data transfer + CMD_CLOSE = 0xe0, // Close channel + CMD_OPEN = 0xf0 // Open channel +}; + + +// IEC ATN codes +enum { + ATN_LISTEN = 0x20, + ATN_UNLISTEN = 0x30, + ATN_TALK = 0x40, + ATN_UNTALK = 0x50 +}; + + +// Drive LED states +enum { + DRVLED_OFF, // Inactive, LED off + DRVLED_ON, // Active, LED on + DRVLED_ERROR // Error, blink LED +}; + + +class Drive; +class C64Display; +class Prefs; + +// Class for complete IEC bus system with drives 8..11 +class IEC { +public: + IEC(C64Display *display); + ~IEC(); + + void Reset(void); + void NewPrefs(Prefs *prefs); + void UpdateLEDs(void); + + uint8 Out(uint8 byte, bool eoi); + uint8 OutATN(uint8 byte); + uint8 OutSec(uint8 byte); + uint8 In(uint8 *byte); + void SetATN(void); + void RelATN(void); + void Turnaround(void); + void Release(void); + +private: + uint8 listen(int device); + uint8 talk(int device); + uint8 unlisten(void); + uint8 untalk(void); + uint8 sec_listen(void); + uint8 sec_talk(void); + uint8 open_out(uint8 byte, bool eoi); + uint8 data_out(uint8 byte, bool eoi); + uint8 data_in(uint8 *byte); + + C64Display *the_display; // Pointer to display object (for drive LEDs) + + char name_buf[NAMEBUF_LENGTH]; // Buffer for file names and command strings + char *name_ptr; // Pointer for reception of file name + int name_len; // Received length of file name + + Drive *drive[4]; // 4 drives (8..11) + + Drive *listener; // Pointer to active listener + Drive *talker; // Pointer to active talker + + bool listener_active; // Listener selected, listener_data is valid + bool talker_active; // Talker selected, talker_data is valid + bool listening; // Last ATN was listen (to decide between sec_listen/sec_talk) + + uint8 received_cmd; // Received command code ($x0) + uint8 sec_addr; // Received secondary address ($0x) +}; + + +// Abstract superclass for individual drives +class Drive { +public: + Drive(IEC *iec); + virtual ~Drive() {} + + virtual uint8 Open(int channel, char *filename)=0; + virtual uint8 Close(int channel)=0; + virtual uint8 Read(int channel, uint8 *byte)=0; + virtual uint8 Write(int channel, uint8 byte, bool eoi)=0; + virtual void Reset(void)=0; + + int LED; // Drive LED state + bool Ready; // Drive is ready for operation + +protected: + void set_error(int error); + + char *error_ptr; // Pointer within error message + int error_len; // Remaining length of error message + +private: + IEC *the_iec; // Pointer to IEC object +}; + +#endif diff --git a/archive-sources/c64emu/Invisible.cur b/archive-sources/c64emu/Invisible.cur new file mode 100644 index 0000000000000000000000000000000000000000..6bb01a5c9bb4172cb56a952e087e6691b2c83a0e GIT binary patch literal 326 zcmZQzU}9ioP*7lC;0HnjMg|5k1_lNVAO;FCH~=vt5P|`ef^ZPz|Ns9HoB?71-7ug4 E0Gd66u>b%7 literal 0 HcmV?d00001 diff --git a/archive-sources/c64emu/Prefs.cpp b/archive-sources/c64emu/Prefs.cpp new file mode 100644 index 0000000..5fd5ff5 --- /dev/null +++ b/archive-sources/c64emu/Prefs.cpp @@ -0,0 +1,418 @@ +/* + * Prefs.cpp - Global preferences + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysdeps.h" + +#include "Prefs.h" +#include "Display.h" +#include "C64.h" +#include "main.h" + + +// These are the active preferences +Prefs ThePrefs; + +// These are the preferences on disk +Prefs ThePrefsOnDisk; + +/* + * Constructor: Set up preferences with defaults + */ + +Prefs::Prefs() +{ + char *imgenv; + + NormalCycles = 63; + BadLineCycles = 23; + CIACycles = 63; + FloppyCycles = 64; + SkipFrames = 2; + LatencyMin = 80; + LatencyMax = 120; + LatencyAvg = 280; + ScalingNumerator = 2; + ScalingDenominator = 2; + + for (int i=0; i<4; i++) + DriveType[i] = DRVTYPE_D64; + + imgenv = getenv("D64"); + if ( imgenv ) + strcpy(DrivePath[0], imgenv ); + else + { + strcpy(DrivePath[0], *d64image ? d64image : "" ); + } + strcpy(DrivePath[1], ""); + strcpy(DrivePath[2], ""); + strcpy(DrivePath[3], ""); + + strcpy(ViewPort, "Default"); + strcpy(DisplayMode, "Default"); + + SIDType = SIDTYPE_NONE; + REUSize = REU_NONE; + DisplayType = DISPTYPE_WINDOW; + + SpritesOn = true; + SpriteCollisions = true; + Joystick1On = false; + Joystick2On = false; + JoystickSwap = false; + LimitSpeed = true; + FastReset = false; + CIAIRQHack = false; + MapSlash = true; + Emul1541Proc = false; + SIDFilters = true; + DoubleScan = true; + HideCursor = false; + DirectSound = true; + ExclusiveSound = false; + AutoPause = false; + PrefsAtStartup = false; + SystemMemory = false; + AlwaysCopy = false; + SystemKeys = true; + ShowLEDs = false; +} + + +/* + * Check if two Prefs structures are equal + */ + +bool Prefs::operator==(const Prefs &rhs) const +{ + return (1 + && NormalCycles == rhs.NormalCycles + && BadLineCycles == rhs.BadLineCycles + && CIACycles == rhs.CIACycles + && FloppyCycles == rhs.FloppyCycles + && SkipFrames == rhs.SkipFrames + && LatencyMin == rhs.LatencyMin + && LatencyMax == rhs.LatencyMax + && LatencyAvg == rhs.LatencyAvg + && ScalingNumerator == rhs.ScalingNumerator + && ScalingDenominator == rhs.ScalingNumerator + && DriveType[0] == rhs.DriveType[0] + && DriveType[1] == rhs.DriveType[1] + && DriveType[2] == rhs.DriveType[2] + && DriveType[3] == rhs.DriveType[3] + && strcmp(DrivePath[0], rhs.DrivePath[0]) == 0 + && strcmp(DrivePath[1], rhs.DrivePath[1]) == 0 + && strcmp(DrivePath[2], rhs.DrivePath[2]) == 0 + && strcmp(DrivePath[3], rhs.DrivePath[3]) == 0 + && strcmp(ViewPort, rhs.ViewPort) == 0 + && strcmp(DisplayMode, rhs.DisplayMode) == 0 + && SIDType == rhs.SIDType + && REUSize == rhs.REUSize + && DisplayType == rhs.DisplayType + && SpritesOn == rhs.SpritesOn + && SpriteCollisions == rhs.SpriteCollisions + && Joystick1On == rhs.Joystick1On + && Joystick2On == rhs.Joystick2On + && JoystickSwap == rhs.JoystickSwap + && LimitSpeed == rhs.LimitSpeed + && FastReset == rhs.FastReset + && CIAIRQHack == rhs.CIAIRQHack + && MapSlash == rhs.MapSlash + && Emul1541Proc == rhs.Emul1541Proc + && SIDFilters == rhs.SIDFilters + && DoubleScan == rhs.DoubleScan + && HideCursor == rhs.HideCursor + && DirectSound == rhs.DirectSound + && ExclusiveSound == rhs.ExclusiveSound + && AutoPause == rhs.AutoPause + && PrefsAtStartup == rhs.PrefsAtStartup + && SystemMemory == rhs.SystemMemory + && AlwaysCopy == rhs.AlwaysCopy + && SystemKeys == rhs.SystemKeys + && ShowLEDs == rhs.ShowLEDs + ); +} + +bool Prefs::operator!=(const Prefs &rhs) const +{ + return !operator==(rhs); +} + + +/* + * Check preferences for validity and correct if necessary + */ + +void Prefs::Check(void) +{ + if (SkipFrames <= 0) SkipFrames = 1; + + if (SIDType < SIDTYPE_NONE || SIDType > SIDTYPE_SIDCARD) + SIDType = SIDTYPE_NONE; + + if (REUSize < REU_NONE || REUSize > REU_512K) + REUSize = REU_NONE; + + if (DisplayType < DISPTYPE_WINDOW || DisplayType > DISPTYPE_SCREEN) + DisplayType = DISPTYPE_WINDOW; + + for (int i=0; i<4; i++) + if (DriveType[i] < DRVTYPE_DIR || DriveType[i] > DRVTYPE_T64) + DriveType[i] = DRVTYPE_DIR; +} + + +/* + * Load preferences from file + */ + +void Prefs::Load(char *filename) +{ + FILE *file; + char line[256], keyword[256], value[256]; + + char *imgenv; + + imgenv = getenv("D64"); + if ( imgenv ) + strcpy(DrivePath[0], imgenv ); + else + { + strcpy(DrivePath[0], *d64image ? d64image : "" ); + } + ThePrefsOnDisk = ThePrefs; +return; + +#if 0 + if ((file = fopen(filename, "r")) != NULL) { + while(fgets(line, 255, file)) { + if (sscanf(line, "%s = %s\n", keyword, value) == 2) { + if (!strcmp(keyword, "NormalCycles")) + NormalCycles = atoi(value); + else if (!strcmp(keyword, "BadLineCycles")) + BadLineCycles = atoi(value); + else if (!strcmp(keyword, "CIACycles")) + CIACycles = atoi(value); + else if (!strcmp(keyword, "FloppyCycles")) + FloppyCycles = atoi(value); + else if (!strcmp(keyword, "SkipFrames")) + SkipFrames = atoi(value); + else if (!strcmp(keyword, "LatencyMin")) + LatencyMin = atoi(value); + else if (!strcmp(keyword, "LatencyMax")) + LatencyMax = atoi(value); + else if (!strcmp(keyword, "LatencyAvg")) + LatencyAvg = atoi(value); + else if (!strcmp(keyword, "ScalingNumerator")) + ScalingNumerator = atoi(value); + else if (!strcmp(keyword, "ScalingDenominator")) + ScalingDenominator = atoi(value); + else if (!strcmp(keyword, "DriveType8")) + if (!strcmp(value, "DIR")) + DriveType[0] = DRVTYPE_DIR; + else if (!strcmp(value, "D64")) + DriveType[0] = DRVTYPE_D64; + else + DriveType[0] = DRVTYPE_T64; + else if (!strcmp(keyword, "DriveType9")) + if (!strcmp(value, "DIR")) + DriveType[1] = DRVTYPE_DIR; + else if (!strcmp(value, "D64")) + DriveType[1] = DRVTYPE_D64; + else + DriveType[1] = DRVTYPE_T64; + else if (!strcmp(keyword, "DriveType10")) + if (!strcmp(value, "DIR")) + DriveType[2] = DRVTYPE_DIR; + else if (!strcmp(value, "D64")) + DriveType[2] = DRVTYPE_D64; + else + DriveType[2] = DRVTYPE_T64; + else if (!strcmp(keyword, "DriveType11")) + if (!strcmp(value, "DIR")) + DriveType[3] = DRVTYPE_DIR; + else if (!strcmp(value, "D64")) + DriveType[3] = DRVTYPE_D64; + else + DriveType[3] = DRVTYPE_T64; + else if (!strcmp(keyword, "DrivePath8")) + strcpy(DrivePath[0], value); + else if (!strcmp(keyword, "DrivePath9")) + strcpy(DrivePath[1], value); + else if (!strcmp(keyword, "DrivePath10")) + strcpy(DrivePath[2], value); + else if (!strcmp(keyword, "DrivePath11")) + strcpy(DrivePath[3], value); + else if (!strcmp(keyword, "ViewPort")) + strcpy(ViewPort, value); + else if (!strcmp(keyword, "DisplayMode")) + strcpy(DisplayMode, value); + else if (!strcmp(keyword, "SIDType")) + if (!strcmp(value, "DIGITAL")) + SIDType = SIDTYPE_DIGITAL; + else if (!strcmp(value, "SIDCARD")) + SIDType = SIDTYPE_SIDCARD; + else + SIDType = SIDTYPE_NONE; + else if (!strcmp(keyword, "REUSize")) { + if (!strcmp(value, "128K")) + REUSize = REU_128K; + else if (!strcmp(value, "256K")) + REUSize = REU_256K; + else if (!strcmp(value, "512K")) + REUSize = REU_512K; + else + REUSize = REU_NONE; + } else if (!strcmp(keyword, "DisplayType")) + DisplayType = strcmp(value, "SCREEN") ? DISPTYPE_WINDOW : DISPTYPE_SCREEN; + else if (!strcmp(keyword, "SpritesOn")) + SpritesOn = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "SpriteCollisions")) + SpriteCollisions = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "Joystick1On")) + Joystick1On = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "Joystick2On")) + Joystick2On = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "JoystickSwap")) + JoystickSwap = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "LimitSpeed")) + LimitSpeed = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "FastReset")) + FastReset = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "CIAIRQHack")) + CIAIRQHack = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "MapSlash")) + MapSlash = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "Emul1541Proc")) + Emul1541Proc = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "SIDFilters")) + SIDFilters = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "DoubleScan")) + DoubleScan = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "HideCursor")) + HideCursor = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "DirectSound")) + DirectSound = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "ExclusiveSound")) + ExclusiveSound = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "AutoPause")) + AutoPause = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "PrefsAtStartup")) + PrefsAtStartup = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "SystemMemory")) + SystemMemory = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "AlwaysCopy")) + AlwaysCopy = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "SystemKeys")) + SystemKeys = !strcmp(value, "TRUE"); + else if (!strcmp(keyword, "ShowLEDs")) + ShowLEDs = !strcmp(value, "TRUE"); + } + } + fclose(file); + } + Check(); + ThePrefsOnDisk = *this; +#endif +} + + +/* + * Save preferences to file + * true: success, false: error + */ + +bool Prefs::Save(char *filename) +{ +#if 0 + FILE *file; + + Check(); + if ((file = fopen(filename, "w")) != NULL) { + fprintf(file, "NormalCycles = %d\n", NormalCycles); + fprintf(file, "BadLineCycles = %d\n", BadLineCycles); + fprintf(file, "CIACycles = %d\n", CIACycles); + fprintf(file, "FloppyCycles = %d\n", FloppyCycles); + fprintf(file, "SkipFrames = %d\n", SkipFrames); + fprintf(file, "LatencyMin = %d\n", LatencyMin); + fprintf(file, "LatencyMax = %d\n", LatencyMax); + fprintf(file, "LatencyAvg = %d\n", LatencyAvg); + fprintf(file, "ScalingNumerator = %d\n", ScalingNumerator); + fprintf(file, "ScalingDenominator = %d\n", ScalingDenominator); + for (int i=0; i<4; i++) { + fprintf(file, "DriveType%d = ", i+8); + switch (DriveType[i]) { + case DRVTYPE_DIR: + fprintf(file, "DIR\n"); + break; + case DRVTYPE_D64: + fprintf(file, "D64\n"); + break; + case DRVTYPE_T64: + fprintf(file, "T64\n"); + break; + } + fprintf(file, "DrivePath%d = %s\n", i+8, DrivePath[i]); + } + fprintf(file, "ViewPort = %s\n", ViewPort); + fprintf(file, "DisplayMode = %s\n", DisplayMode); + fprintf(file, "SIDType = "); + switch (SIDType) { + case SIDTYPE_NONE: + fprintf(file, "NONE\n"); + break; + case SIDTYPE_DIGITAL: + fprintf(file, "DIGITAL\n"); + break; + case SIDTYPE_SIDCARD: + fprintf(file, "SIDCARD\n"); + break; + } + fprintf(file, "REUSize = "); + switch (REUSize) { + case REU_NONE: + fprintf(file, "NONE\n"); + break; + case REU_128K: + fprintf(file, "128K\n"); + break; + case REU_256K: + fprintf(file, "256K\n"); + break; + case REU_512K: + fprintf(file, "512K\n"); + break; + }; + fprintf(file, "DisplayType = %s\n", DisplayType == DISPTYPE_WINDOW ? "WINDOW" : "SCREEN"); + fprintf(file, "SpritesOn = %s\n", SpritesOn ? "TRUE" : "FALSE"); + fprintf(file, "SpriteCollisions = %s\n", SpriteCollisions ? "TRUE" : "FALSE"); + fprintf(file, "Joystick1On = %s\n", Joystick1On ? "TRUE" : "FALSE"); + fprintf(file, "Joystick2On = %s\n", Joystick2On ? "TRUE" : "FALSE"); + fprintf(file, "JoystickSwap = %s\n", JoystickSwap ? "TRUE" : "FALSE"); + fprintf(file, "LimitSpeed = %s\n", LimitSpeed ? "TRUE" : "FALSE"); + fprintf(file, "FastReset = %s\n", FastReset ? "TRUE" : "FALSE"); + fprintf(file, "CIAIRQHack = %s\n", CIAIRQHack ? "TRUE" : "FALSE"); + fprintf(file, "MapSlash = %s\n", MapSlash ? "TRUE" : "FALSE"); + fprintf(file, "Emul1541Proc = %s\n", Emul1541Proc ? "TRUE" : "FALSE"); + fprintf(file, "SIDFilters = %s\n", SIDFilters ? "TRUE" : "FALSE"); + fprintf(file, "DoubleScan = %s\n", DoubleScan ? "TRUE" : "FALSE"); + fprintf(file, "HideCursor = %s\n", HideCursor ? "TRUE" : "FALSE"); + fprintf(file, "DirectSound = %s\n", DirectSound ? "TRUE" : "FALSE"); + fprintf(file, "ExclusiveSound = %s\n", ExclusiveSound ? "TRUE" : "FALSE"); + fprintf(file, "AutoPause = %s\n", AutoPause ? "TRUE" : "FALSE"); + fprintf(file, "PrefsAtStartup = %s\n", PrefsAtStartup ? "TRUE" : "FALSE"); + fprintf(file, "SystemMemory = %s\n", SystemMemory ? "TRUE" : "FALSE"); + fprintf(file, "AlwaysCopy = %s\n", AlwaysCopy ? "TRUE" : "FALSE"); + fprintf(file, "SystemKeys = %s\n", SystemKeys ? "TRUE" : "FALSE"); + fprintf(file, "ShowLEDs = %s\n", ShowLEDs ? "TRUE" : "FALSE"); + fclose(file); + ThePrefsOnDisk = *this; + return true; + } + return false; +#endif + return true; +} diff --git a/archive-sources/c64emu/Prefs.h b/archive-sources/c64emu/Prefs.h new file mode 100644 index 0000000..3c4480d --- /dev/null +++ b/archive-sources/c64emu/Prefs.h @@ -0,0 +1,108 @@ +/* + * Prefs.h - Global preferences + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _PREFS_H +#define _PREFS_H + + +// Drive types +enum { + DRVTYPE_DIR, // 1541 emulation in host file system + DRVTYPE_D64, // 1541 emulation in .d64 file + DRVTYPE_T64 // 1541 emulation in .t64 file +}; + + +// SID types +enum { + SIDTYPE_NONE, // SID emulation off + SIDTYPE_DIGITAL, // Digital SID emulation + SIDTYPE_SIDCARD // SID card +}; + + +// REU sizes +enum { + REU_NONE, // No REU + REU_128K, // 128K + REU_256K, // 256K + REU_512K // 512K +}; + + +// Display types (BeOS) +enum { + DISPTYPE_WINDOW, // BWindow + DISPTYPE_SCREEN // BWindowScreen +}; + + +// Preferences data +class Prefs { +public: + Prefs(); + bool ShowEditor(bool startup, char *prefs_name); + void Check(void); + void Load(char *filename); + bool Save(char *filename); + + bool operator==(const Prefs &rhs) const; + bool operator!=(const Prefs &rhs) const; + + int NormalCycles; // Available CPU cycles in normal raster lines + int BadLineCycles; // Available CPU cycles in Bad Lines + int CIACycles; // CIA timer ticks per raster line + int FloppyCycles; // Available 1541 CPU cycles per line + int SkipFrames; // Draw every n-th frame + + int DriveType[4]; // Type of drive 8..11 + + char DrivePath[4][256]; // Path for drive 8..11 + + char ViewPort[256]; // Size of the C64 screen to display (Win32) + char DisplayMode[256]; // Video mode to use for full screen (Win32) + + int SIDType; // SID emulation type + int REUSize; // Size of REU + int DisplayType; // Display type (BeOS) + int LatencyMin; // Min msecs ahead of sound buffer (Win32) + int LatencyMax; // Max msecs ahead of sound buffer (Win32) + int LatencyAvg; // Averaging interval in msecs (Win32) + int ScalingNumerator; // Window scaling numerator (Win32) + int ScalingDenominator; // Window scaling denominator (Win32) + + bool SpritesOn; // Sprite display is on + bool SpriteCollisions; // Sprite collision detection is on + bool Joystick1On; // Joystick connected to port 1 of host + bool Joystick2On; // Joystick connected to port 2 of host + bool JoystickSwap; // Swap joysticks 1<->2 + bool LimitSpeed; // Limit speed to 100% + bool FastReset; // Skip RAM test on reset + bool CIAIRQHack; // Write to CIA ICR clears IRQ + bool MapSlash; // Map '/' in C64 filenames + bool Emul1541Proc; // Enable processor-level 1541 emulation + bool SIDFilters; // Emulate SID filters + bool DoubleScan; // Double scan lines (BeOS, if DisplayType == DISPTYPE_SCREEN) + bool HideCursor; // Hide mouse cursor when visible (Win32) + bool DirectSound; // Use direct sound (instead of wav) (Win32) + bool ExclusiveSound; // Use exclusive mode with direct sound (Win32) + bool AutoPause; // Auto pause when not foreground app (Win32) + bool PrefsAtStartup; // Show prefs dialog at startup (Win32) + bool SystemMemory; // Put view work surface in system mem (Win32) + bool AlwaysCopy; // Always use a work surface (Win32) + bool SystemKeys; // Enable system keys and menu keys (Win32) + bool ShowLEDs; // Show LEDs (Win32) + +}; + + +// These are the active preferences +extern Prefs ThePrefs; + +// Theses are the preferences on disk +extern Prefs ThePrefsOnDisk; + +#endif diff --git a/archive-sources/c64emu/REU.cpp b/archive-sources/c64emu/REU.cpp new file mode 100644 index 0000000..cb01964 --- /dev/null +++ b/archive-sources/c64emu/REU.cpp @@ -0,0 +1,262 @@ +/* + * REU.cpp - 17xx REU emulation + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Incompatibilities: + * ------------------ + * + * - REU interrupts are not emulated + * - Transfer time is not accounted for, all transfers + * are done in 0 cycles + */ + +#include "sysdeps.h" + +#include "REU.h" +#include "CPUC64.h" +#include "Prefs.h" + + +/* + * Constructor + */ + +REU::REU(MOS6510 *CPU) : the_cpu(CPU) +{ + int i; + + // Init registers + regs[0] = 0x40; + for (i=1; i<11; i++) + regs[i] = 0; + for (i=11; i<16; i++) + regs[i] = 0xff; + + ex_ram = NULL; + ram_size = ram_mask = 0; + + // Allocate RAM + open_close_reu(REU_NONE, ThePrefs.REUSize); +} + + +/* + * Destructor + */ + +REU::~REU() +{ + // Free RAM + open_close_reu(ThePrefs.REUSize, REU_NONE); +} + + +/* + * Prefs may have changed, reallocate expansion RAM + */ + +void REU::NewPrefs(Prefs *prefs) +{ + open_close_reu(ThePrefs.REUSize, prefs->REUSize); +} + + +/* + * Allocate/free expansion RAM + */ + +void REU::open_close_reu(int old_size, int new_size) +{ + if (old_size == new_size) + return; + + // Free old RAM + if (old_size != REU_NONE) { + delete[] ex_ram; + ex_ram = NULL; + } + + // Allocate new RAM + if (new_size != REU_NONE) { + switch (new_size) { + case REU_128K: + ram_size = 0x20000; + break; + case REU_256K: + ram_size = 0x40000; + break; + case REU_512K: + ram_size = 0x80000; + break; + } + ram_mask = ram_size - 1; + ex_ram = new uint8[ram_size]; + + // Set size bit in status register + if (ram_size > 0x20000) + regs[0] |= 0x10; + else + regs[0] &= 0xef; + } +} + + +/* + * Reset the REU + */ + +void REU::Reset(void) +{ + int i; + + for (i=1; i<11; i++) + regs[i] = 0; + for (i=11; i<16; i++) + regs[i] = 0xff; + + if (ram_size > 0x20000) + regs[0] = 0x50; + else + regs[0] = 0x40; +} + + +/* + * Read from REU register + */ + +uint8 REU::ReadRegister(uint16 adr) +{ + if (ex_ram == NULL) + return rand(); + + switch (adr) { + case 0:{ + uint8 ret = regs[0]; + regs[0] &= 0x1f; + return ret; + } + case 6: + return regs[6] | 0xf8; + case 9: + return regs[9] | 0x1f; + case 10: + return regs[10] | 0x3f; + default: + return regs[adr]; + } +} + + +/* + * Write to REU register + */ + +void REU::WriteRegister(uint16 adr, uint8 byte) +{ + if (ex_ram == NULL) + return; + + switch (adr) { + case 0: // Status register is read-only + case 11: // Unconnected registers + case 12: + case 13: + case 14: + case 15: + break; + case 1: // Command register + regs[1] = byte; + if ((byte & 0x90) == 0x90) + execute_dma(); + break; + default: + regs[adr] = byte; + break; + } +} + + +/* + * CPU triggered REU by writing to $ff00 + */ + +void REU::FF00Trigger(void) +{ + if (ex_ram == NULL) + return; + + if ((regs[1] & 0x90) == 0x80) + execute_dma(); +} + + +/* + * Execute REU DMA transfer + */ + +void REU::execute_dma(void) +{ + // Get C64 and REU transfer base addresses + uint16 c64_adr = regs[2] | (regs[3] << 8); + uint32 reu_adr = regs[4] | (regs[5] << 8) | (regs[6] << 16); + + // Calculate transfer length + int length = regs[7] | (regs[8] << 8); + if (!length) + length = 0x10000; + + // Calculate address increments + uint32 c64_inc = (regs[10] & 0x80) ? 0 : 1; + uint32 reu_inc = (regs[10] & 0x40) ? 0 : 1; + + // Do transfer + switch (regs[1] & 3) { + + case 0: // C64 -> REU + for (; length--; c64_adr+=c64_inc, reu_adr+=reu_inc) + ex_ram[reu_adr & ram_mask] = the_cpu->REUReadByte(c64_adr); + break; + + case 1: // C64 <- REU + for (; length--; c64_adr+=c64_inc, reu_adr+=reu_inc) + the_cpu->REUWriteByte(c64_adr, ex_ram[reu_adr & ram_mask]); + break; + + case 2: // C64 <-> REU + for (; length--; c64_adr+=c64_inc, reu_adr+=reu_inc) { + uint8 tmp = the_cpu->REUReadByte(c64_adr); + the_cpu->REUWriteByte(c64_adr, ex_ram[reu_adr & ram_mask]); + ex_ram[reu_adr & ram_mask] = tmp; + } + break; + + case 3: // Compare + for (; length--; c64_adr+=c64_inc, reu_adr+=reu_inc) + if (ex_ram[reu_adr & ram_mask] != the_cpu->REUReadByte(c64_adr)) { + regs[0] |= 0x20; + break; + } + break; + } + + // Update address and length registers if autoload is off + if (!(regs[1] & 0x20)) { + regs[2] = c64_adr; + regs[3] = c64_adr >> 8; + regs[4] = reu_adr; + regs[5] = reu_adr >> 8; + regs[6] = reu_adr >> 16; + regs[7] = length + 1; + regs[8] = (length + 1) >> 8; + } + + // Set complete bit in status register + regs[0] |= 0x40; + + // Clear execute bit in command register + regs[1] &= 0x7f; +} diff --git a/archive-sources/c64emu/REU.h b/archive-sources/c64emu/REU.h new file mode 100644 index 0000000..535a80a --- /dev/null +++ b/archive-sources/c64emu/REU.h @@ -0,0 +1,39 @@ +/* + * REU.h - 17xx REU emulation + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _REU_H +#define _REU_H + + +class MOS6510; +class Prefs; + +class REU { +public: + REU(MOS6510 *CPU); + ~REU(); + + void NewPrefs(Prefs *prefs); + void Reset(void); + uint8 ReadRegister(uint16 adr); + void WriteRegister(uint16 adr, uint8 byte); + void FF00Trigger(void); + +private: + void open_close_reu(int old_size, int new_size); + void execute_dma(void); + + MOS6510 *the_cpu; // Pointer to 6510 + + uint8 *ex_ram; // REU expansion RAM + + uint32 ram_size; // Size of expansion RAM + uint32 ram_mask; // Expansion RAM address bit mask + + uint8 regs[16]; // REU registers +}; + +#endif diff --git a/archive-sources/c64emu/ROlib.h b/archive-sources/c64emu/ROlib.h new file mode 100644 index 0000000..8224865 --- /dev/null +++ b/archive-sources/c64emu/ROlib.h @@ -0,0 +1,520 @@ +/* + * ROlib.h + * + * Defines Classes, variables and OS interface calls for Acorn RISC OS computers. + * (C) 1997 Andreas Dehmel + * + */ + + + +#ifndef RO_CUSTOM_LIB +#define RO_CUSTOM_LIB + +#include + + +#define TASKNAME "Frodo" +#define TASK_WORD 0x4b534154 + +/* Scrap-file for 1541fs directory function */ +#define RO_TEMPFILE ".FrodoDIR" + + + +/* Icon Flags */ +#define IFlg_Text 1 +#define IFlg_Sprite 2 +#define IFlg_Border 4 +#define IFlg_HCenter 8 +#define IFlg_VCenter 16 +#define IFlg_Filled 32 +#define IFlg_AntiA 64 +#define IFlg_AutoRdrw 128 +#define IFlg_Indir 256 +#define IFlg_RAdjust 512 +#define IFlg_Slct (1<<21) +#define IFlg_Grey (1<<22) + +/* Menu Flags */ +#define MFlg_Tick 1 +#define MFlg_Dotted 2 +#define MFlg_Writable 4 +#define MFlg_Warning 8 +#define MFlg_LastItem 128 + +/* Joystick stuff */ +#define JoyDir_Thresh 32 +#define JoyButton1 (1<<16) +#define JoyButton2 (1<<17) + + + +/* Size of WIMP data types */ +#define RO_WINDOW_WORDS 23 +#define RO_WINDOW_BYTES 92 +#define RO_ICON_WORDS 8 +#define RO_ICON_BYTES 32 +#define RO_MHEAD_WORDS 7 +#define RO_MHEAD_BYTES 28 +#define RO_MITEM_WORDS 6 +#define RO_MITEM_BYTES 24 + + + + +/* Structures for directory scanning (mainly 1541fs) */ +/* May hold entire pathname, so DON'T REDUCE!!! */ +#define FILENAME_MAX_CHARS 256 /* must be >= NAMEBUF_LENGTH (256) */ + +typedef struct { + unsigned int load, exec, length, attrib, otype; + char name[FILENAME_MAX_CHARS]; +} dir_full_info; + +typedef struct { + int readno, offset, buffsize; + char *match; +} dir_env; + + + +/* WIMP structures: */ +typedef struct { + int *tit, *val; + int len; +} WIdatI; + +/* data type for window / icon data */ +typedef union { + char strg[12]; + WIdatI ind; +} WIdata; + + +/* Window descriptor - 23 words = 92 bytes */ +typedef struct { + int Handle; + int vminx,vminy,vmaxx,vmaxy; + int scrollx,scrolly; + int stackpos; + unsigned int wflags; + char col_tfg, col_tbg, col_wfg, col_wbg; /* title/work_area fore/background colour */ + char col_sbo, col_sbi, col_tsl, reserved;/* scroll bar inner/outer, title if input focus */ + int wminx, wminy, wmaxx, wmaxy; + unsigned int tflags, waflags; + int SpriteAreaPtr; + short min_width, min_height; + WIdata dat; + int icon_no; +} RO_Window; + + +/* Icon descriptor */ +typedef struct { + int minx, miny, maxx, maxy; + int iflags; + WIdata dat; +} RO_Icon; + + +typedef struct { + int WindowHandle; + int minx, miny, maxx, maxy; + int iflags; + WIdata dat; +} RO_IconDesc; + + +typedef struct { + char title[12]; + char col_tfg, col_tbg, col_wfg, col_wbg; + int width, height, vgap; +} RO_MenuHead; + + +typedef struct { + unsigned int mflags; + RO_MenuHead *submenu; + unsigned int iflags; + WIdata dat; +} RO_MenuItem; + + +/* Caret descriptor */ +typedef struct { + int WHandle; + int IHandle; + int offx, offy; + int height, index; +} RO_Caret; + + + +/* Joystick key descriptor */ +typedef struct { + unsigned char up, down, left, right, fire; +} Joy_Keys; + + + + +/* Declare classes that are needed in the following new classes */ +class C64Display; +class C64; + + + +/* Very simple class to read the resolution and eigen values */ +class RORes +{ + public: + RORes(void); + ~RORes(void); + + int resx,resy,eigx,eigy; +}; + + +/* Handle current screenmode */ +class ROScreen +{ + private: + _kernel_oserror ModeError; + + public: + ROScreen(void); + ~ROScreen(void); + int ReadMode(void); + + int resx, resy, ldbpp, eigx, eigy, ladd; + char *scrbase; +}; + + +class Icon +{ + private: + RO_IconDesc icon; + + public: + Icon(int IconHandle, const RO_IconDesc *IDesc); + ~Icon(void); + void setstate(unsigned int eor, unsigned int clear); + void getstate(void); + + int IHandle; +}; + + +class Window +{ + private: + RO_Window *wind; + bool isopen; + + public: + Window(const int *WDesc, const char *Title); + ~Window(void); + int MyHandle(void); + void GetWorkArea(int *Dest); + void RedrawAWindow(int *Block, uint8 *Bitmap, C64Display *Disp); + RO_Window *Descriptor(void); + RO_Icon *GetIcon(unsigned int number); + void SetIconState(unsigned int number, unsigned int eor, unsigned int clear); + void GetIconState(unsigned int number, int *Block); + void WriteIconText(unsigned int number, const char *text); + void WriteIconTextU(unsigned int number, const char *text); // update instead of force redrw + void WriteIconNumber(unsigned int number, int value); + void WriteIconNumberU(unsigned int number, int value); + char *ReadIconText(unsigned int number); + int ReadIconNumber(unsigned int number); + void ForceIconRedraw(unsigned int number); + void UpdateIcon(unsigned int number); + void WriteTitle(const char *title); + char *ReadTitle(void); + void UpdateTitle(void); + bool HaveInput(void); + bool OpenStatus(void); + bool OpenStatus(int *Block); + void open(void); + void open(int *Block); + void close(void); + void forceredraw(int minx, int miny, int maxx, int maxy); + void update(uint8 *Bitmap, C64Display *Disp); + void update(int *Block, uint8 *Bitmap, C64Display *Disp); + void redraw(int *Block, uint8 *Bitmap, C64Display *Disp); + void extent(int minx, int miny, int maxx, int maxy); + void getstate(void); + void getstate(int *dest); // read window definition to external block +}; + + +class WIMP +{ + private: + _kernel_oserror WimpError; + int Block[64], AuxBlock[64]; // two WIMP blocks for convenience + int Mask; + int DragType, CMOS_DragType; + bool UseScrap; // Scrap file used (data transfer protocol!) + bool EmuPaused; + int UseNULL; // Number of clients that need NULL events + int RAMsize, RAMtransfered, RAMpartner; // for RAM transfer + int LastMenu, LastClick, LastDrag, MenuType, LastIcon, SaveType; + int *SpriteArea; + RO_Caret LastCaret; + int EmuZoom; + Joy_Keys NewJoyKeys[2]; + C64 *the_c64; + + public: + WIMP(C64 *my_c64); + ~WIMP(void); + + // On startup + bool LoadATemplate(char *Name, Window **Which); + + // To make window and pane work as a team + void OpenEmuWindow(void); + void OpenEmuWindow(int *Block); // open at pos + void CloseEmuWindow(void); + void UpdateEmuWindow(void); // update window and pane + void ThePrefsToWindow(void); // write ThePrefs into the window + void WindowToThePrefs(void); // update ThePrefs from window + void SysConfToWindow(void); + void WindowToSysConf(void); + void PollSysConfWindow(void); // low-level koyboard scan + void DragIconSprite(Window *host, unsigned int number); + int CalculateVolume(int *Block); + int CheckFilename(char *name); + void SnapshotSaved(bool OK); + void IssueSnapshotRequest(void); + void SetLEDIcons(bool FloppyEmulation); + void SetEmuWindowSize(void); + void ToggleEmuWindowSize(void); + int ReadEmuWindowSize(void); + void NewDriveImage(int DrNum, int *MsgBlock, bool SetNow); + void SetSpeedLimiter(bool LimitSpeed); + + // Standard WIMP functions + void Poll(bool Paused); + void Redraw(void); + void OpenWindow(void); + void CloseWindow(void); + void MouseClick(void); + void UserDrag(void); + void KeyPressed(void); + void MenuSelection(void); + void UserMessage(void); + void UserMessageAck(void); + + // WIMP's Windows and Icons + Icon *IBicon; + Window *EmuWindow, *EmuPane, *PrefsWindow, *ConfigWindow, *InfoWindow, *SoundWindow, *SaveBox; + char SnapFile[256], RAMFile[256]; +}; + + + +/* system-specific Variables */ + +extern RO_IconDesc IBarIcon; +extern unsigned int TaskHandle; +extern int WimpMessages[]; + + +/* Functions available via ROlib (not RISC OS Lib, mind you) + All SWIs are called in the X-Form! */ + +extern "C" +{ + +/* WIMP FUNCTIONS */ + +/* returns handle or 0 if error */ +extern int Wimp_Initialise(int Version, int tw, const char *TaskName, const int *Messages); + +extern _kernel_oserror *Wimp_CloseDown(int Handle, int tw); + +/* returns handle or 0 if error */ +extern int Wimp_CreateWindow(const int *Window); + +extern int Wimp_CreateIcon(int Priority, const RO_IconDesc *Icon); + +extern _kernel_oserror *Wimp_DeleteWindow(const int *Window); + +extern _kernel_oserror *Wimp_DeleteIcon(int *Block); + +extern _kernel_oserror *Wimp_OpenWindow(const int *Window); + +extern _kernel_oserror *Wimp_CloseWindow(const int *Window); + +extern int Wimp_Poll(unsigned int Mask, int *Block, int *PollWord); + +/* returns 0 if no more to do or error */ +extern int Wimp_RedrawWindow(int *Block); + +extern int Wimp_UpdateWindow(int *Block); + +extern int Wimp_GetRectangle(int *Block); + +extern _kernel_oserror *Wimp_GetWindowState(int *Block); + +extern _kernel_oserror *Wimp_GetWindowInfo(int *Block); + +extern _kernel_oserror *Wimp_SetIconState(int *Block); + +extern _kernel_oserror *Wimp_GetIconState(int *Block); + +extern _kernel_oserror *Wimp_GetPointerInfo(int *Block); + +extern _kernel_oserror *Wimp_DragBox(int *Block); + +extern _kernel_oserror *Wimp_ForceRedraw(int Handle, int minx, int miny, int maxx, int maxy); + +extern _kernel_oserror *Wimp_SetCaretPosition(int WHandle, int IHandle, int xoff, int yoff, int height, int index); + +extern _kernel_oserror *Wimp_GetCaretPosition(RO_Caret *Caret); + +extern _kernel_oserror *Wimp_CreateMenu(const int *Menu, int cx, int cy); + +extern _kernel_oserror *Wimp_SetExtent(int Handle, int *Block); + +extern _kernel_oserror *Wimp_OpenTemplate(char *Name); + +extern _kernel_oserror *Wimp_CloseTemplate(void); + +extern _kernel_oserror *Wimp_LoadTemplate(char **Template, char **Indirect, char *IndirLimit, char *Fonts, char *Name, int *Position); + +extern _kernel_oserror *Wimp_ProcessKey(int Key); + +extern int Wimp_StartTask(char *command); + +extern _kernel_oserror *Wimp_ReportError(const _kernel_oserror *Error, unsigned int Flags, const char *AppName); + +extern _kernel_oserror *Wimp_GetWindowOutline(int *Block); + +extern int Wimp_PollIdle(unsigned int Mask, int *Block, int MinTime, int *PollWord); + +extern _kernel_oserror *Wimp_PlotIcon(int *Block); + +extern _kernel_oserror *Wimp_SendMessage(int Event, int *Block, int THandle, int IHandle); + +extern _kernel_oserror *Wimp_CreateSubMenu(int *MenuBlock, int cx, int xy); + +extern _kernel_oserror *Wimp_SpriteOp(int, int, int, int, int, int, int, int); + +extern _kernel_oserror *Wimp_BaseOfSprites(int *ROM, int *RAM); + +extern _kernel_oserror *Wimp_CommandWindow(int Action); + +extern _kernel_oserror *Wimp_TransferBlock(int SHandle, char *SBuff, int DHandle, char *DBuff, int BuffSize); + +extern _kernel_oserror *Wimp_SpriteInfo(char *name, int *width, int *height, int *mode); + +extern _kernel_oserror *DragASprite_Start(unsigned int Flags, int SpriteArea, char *SpriteName, int *Box, int *BBox); + +extern _kernel_oserror *DragASprite_Stop(void); + +extern _kernel_oserror *ColourTrans_SelectTable(int SMode, int SPal, int DMode, int DPal, char **Buffer, unsigned int Flags, int *TransWork, int *TransFunc); + +extern _kernel_oserror *ColourTrans_SetFontColours(int Handle, int BPal, int FPal, int Offset); + +extern _kernel_oserror *ColourTrans_SetColour(int GCOL, unsigned int Flags, int Action); + +extern _kernel_oserror *ColourTrans_SetGCOL(int Palette, unsigned int Flags, int Action); + + + +/* OS FUNCTIONS */ + +extern int OS_ReadModeVariable(int mode, int var); + +extern int OS_ReadDynamicArea(int area); + +extern int ScanKeys(int keys); + +extern int ReadKeyboardStatus(void); + +extern int ReadDragType(void); + +extern int SetMousePointer(int NewShape); + + +/* Generic sprite op call */ +extern _kernel_oserror *OS_SpriteOp(int, int, int, int, int, int, int, int); + +extern _kernel_oserror *OS_Plot(int Command, int x, int y); + +extern _kernel_oserror *MouseBoundingBox(char Box[8]); + +extern int OS_ReadMonotonicTime(void); + +extern _kernel_oserror *OS_ReadC(char *Code); + +/* returns length of characters read; if length negative ==> terminated by escape */ +extern int OS_ReadLine(char *Buffer, int BuffSize, int minasc, int maxasc, int Echo); + +/* TRUE ==> escape */ +extern bool OS_ReadEscapeState(void); + +/* File related calls */ + +/* Returns object type */ +extern int ReadCatalogueInfo(char *Name, int Result[4]); + +/* Read the next name in the directory */ +extern _kernel_oserror *ReadDirName(const char *dirname, char *buffer, dir_env *env); + +/* Read the next entry (name, length, type,...) in the directory */ +extern _kernel_oserror *ReadDirNameInfo(const char *dirname,dir_full_info *buffer,dir_env *env); + +extern _kernel_oserror *DeleteFile(char *name); + +extern _kernel_oserror *OS_FlushBuffer(int BuffNum); + +/* These functions are more secure than using sprintf because they allow buffersize */ +/* Return value is a pointer to the terminating null */ +extern char *ConvertInteger1(int value, char *buffer, int buffsize); +extern char *ConvertInteger2(int value, char *buffer, int buffsize); +extern char *ConvertInteger3(int value, char *buffer, int buffsize); +extern char *ConvertInteger4(int value, char *buffer, int buffsize); + + +/* Misc */ + +extern unsigned int ModeColourNumber(unsigned int pal_entry); + +/* Returns -1 if error in joystick module, -2 if SWI unknown, joystate otherwise */ +extern int Joystick_Read(int joyno); + + +/* Sound stuff */ + +#define DRState_Active 1 +#define DRState_NeedData 2 +#define DRState_Overflow 4 + +/* Sound calls */ + +extern int Sound_Volume(int volume); + +/* Digital Renderer SWI calls */ +extern _kernel_oserror *DigitalRenderer_Activate(int Channels, int Length, int SamPeriod); + +extern _kernel_oserror *DigitalRenderer_Deactivate(void); + +extern _kernel_oserror *DigitalRenderer_Pause(void); + +extern _kernel_oserror *DigitalRenderer_Resume(void); + +extern _kernel_oserror *DigitalRenderer_GetTables(uint8 **LinToLog, uint8 **LogScale); + +extern int DigitalRenderer_ReadState(void); + +extern _kernel_oserror *DigitalRenderer_NewSample(uint8 *Sample); + +} + +#endif diff --git a/archive-sources/c64emu/ROlib.s b/archive-sources/c64emu/ROlib.s new file mode 100644 index 0000000..88b2029 --- /dev/null +++ b/archive-sources/c64emu/ROlib.s @@ -0,0 +1,1152 @@ +;* +;* ROlib.h +;* +;* Assembler interface to RISC OS +;* (C) 1997 Andreas Dehmel +;* + + +a1 rn 0 +a2 rn 1 +a3 rn 2 +a4 rn 3 +v1 rn 4 +v2 rn 5 +v3 rn 6 +v4 rn 7 +v5 rn 8 +v6 rn 9 +sl rn 10 +fp rn 11 +ip rn 12 +sp rn 13 +lr rn 14 +pc rn 15 + + + idfn (C) 1997 by Andreas Dehmel + +; ************ WIMP STUFF **************** + + AREA CODE, READONLY + align 4 + export |Wimp_Initialise| + = "Wimp_Initialise" + align 4 + +|Wimp_Initialise|: + swi 0x600c0 ;XWimp_Initialise + movvs a1,#0 ;return 0 if error + movvc a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CloseDown| + = "Wimp_CloseDown" + align 4 + +|Wimp_CloseDown| + swi 0x600dd ;XWimp_CloseDown + movvc a1,#0 ;return pointer to error block + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CreateWindow| + = "Wimp_CreateWindow" + align 4 + +|Wimp_CreateWindow|: + mov a2,a1 + swi 0x600c1 + movvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CreateIcon| + = "Wimp_CreateIcon" + align 4 + +|Wimp_CreateIcon|: + swi 0x600c2 + movvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_DeleteWindow| + = "Wimp_DeleteWindow" + align 4 + +|Wimp_DeleteWindow|: + mov a2,a1 + swi 0x600c3 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_DeleteIcon| + = "Wimp_DeleteIcon" + align 4 + +|Wimp_DeleteIcon|: + mov a2,a1 + swi 0x600c4 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_OpenWindow| + = "Wimp_OpenWindow" + align 4 + +|Wimp_OpenWindow|: + mov a2,a1 + swi 0x600c5 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CloseWindow| + = "Wimp_CloseWindow" + align 4 + +|Wimp_CloseWindow|: + mov a2,a1 + swi 0x600c6 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_Poll| + = "Wimp_Poll" + align 4 + +|Wimp_Poll|: + mov a4,a3 + swi 0x600c7 + mvnvs a1,#0 ;return -1 if error + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_RedrawWindow| + = "Wimp_RedrawWindow" + align 4 + +|Wimp_RedrawWindow|: + mov a2,a1 + swi 0x600c8 + movvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_UpdateWindow| + = "Wimp_UpdateWindow" + align 4 + +|Wimp_UpdateWindow| + mov a2,a1 + swi 0x600c9 + movvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetRectangle| + = "Wimp_GetRectangle" + align 4 + +|Wimp_GetRectangle|: + mov a2,a1 + swi 0x600ca + movvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetWindowState| + = "Wimp_GetWindowState" + align 4 + +|Wimp_GetWindowState|: + mov a2,a1 + swi 0x600cb + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetWindowInfo| + = "Wimp_GetWindowInfo" + align 4 + +|Wimp_GetWindowInfo|: + mov a2,a1 + swi 0x600cc + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_SetIconState| + = "Wimp_SetIconState" + align 4 + +|Wimp_SetIconState|: + mov a2,a1 + swi 0x600cd + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetIconState| + = "Wimp_GetIconState" + align 4 + +|Wimp_GetIconState|: + mov a2,a1 + swi 0x600ce + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetPointerInfo| + = "Wimp_GetPointerInfo" + align 4 + +|Wimp_GetPointerInfo|: + mov a2,a1 + swi 0x600cf + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_DragBox| + = "Wimp_DragBox" + align 4 + +|Wimp_DragBox|: + mov a2,a1 + swi 0x600d0 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_ForceRedraw| + = "Wimp_ForceRedraw" + align 4 + +|Wimp_ForceRedraw|: + stmdb sp!,{v1} + ldr v1,[sp,#4] + swi 0x600d1 + movvc a1,#0 + ldmia sp!,{v1} + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_SetCaretPosition| + = "Wimp_SetCaretPosition" + align 4 + +|Wimp_SetCaretPosition|: + stmdb sp!,{v1,v2} + add v1,sp,#8 + ldmia v1,{v1,v2} + swi 0x600d2 + movvc a1,#0 + ldmia sp!,{v1,v2} + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetCaretPosition| + = "Wimp_GetCaretPosition" + align 4 + +|Wimp_GetCaretPosition|: + mov a2,a1 + swi 0x600d3 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CreateMenu| + = "Wimp_CreateMenu" + align 4 + +|Wimp_CreateMenu|: + mov a4,a3 + mov a3,a2 + mov a2,a1 + swi 0x600d4 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_SetExtent| + = "Wimp_SetExtent" + align 4 + +|Wimp_SetExtent|: + swi 0x600d7 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_OpenTemplate| + = "Wimp_OpenTemplate" + align 4 + +|Wimp_OpenTemplate|: + mov a2,a1 + swi 0x600d9 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CloseTemplate| + = "Wimp_CloseTemplate" + align 4 + +|Wimp_CloseTemplate|: + swi 0x600da + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_LoadTemplate| + = "Wimp_LoadTemplate" + align 4 + +|Wimp_LoadTemplate|: + stmdb sp!,{a1,a2,v1-v4,lr} ;7 registers + mov v1,a4 ;Fonts + mov a4,a3 ;IndirectLimit + ldr a3,[a2] ;*Indirect + ldr a2,[a1] ;*Template + add v2,sp,#28 + ldmia v2,{v2,v4} + ldr v3,[v4] ;Position + swi 0x600db + addvs sp,sp,#8 + bvs |WLTexit| + str v3,[v4] ;store Position + ldmia sp!,{v1,v2} + str a2,[v1] + str a3,[v2] + mov a1,#0 +|WLTexit|: + ldmia sp!,{v1-v4,pc}^ + + + AREA CODE, READONLY + align 4 + export |Wimp_ProcessKey| + = "Wimp_ProcessKey" + align 4 + +|Wimp_ProcessKey|: + swi 0x600dc + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_StartTask| + = "Wimp_StartTask" + align 4 + +|Wimp_StartTask|: + swi 0x600de + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_ReportError| + = "Wimp_ReportError" + align 4 + +|Wimp_ReportError|: + swi 0x600df + movvs a1,#0 + movvc a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_GetWindowOutline| + = "Wimp_GetWindowOutline" + align 4 + +|Wimp_GetWindowOutline|: + mov a2,a1 + swi 0x600e0 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_PollIdle| + = "Wimp_PollIdle" + align 4 + +|Wimp_PollIdle|: + swi 0x600e1 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_PlotIcon| + = "Wimp_PlotIcon" + align 4 + +|Wimp_PlotIcon|: + mov a2,a1 + swi 0x600e2 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_SendMessage| + = "Wimp_SendMessage" + align 4 + +|Wimp_SendMessage|: + swi 0x600e7 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CreateSubMenu| + = "Wimp_CreateSubMenu" + align 4 + +|Wimp_CreateSubMenu|: + mov a4,a3 + mov a3,a2 + mov a2,a1 + swi 0x600e8 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_SpriteOp| + = "Wimp_SpriteOp" + align 4 + +|Wimp_SpriteOp|: + stmdb sp!,{v1-v4,lr} + add v1,sp,#20 + ldmia v1,{v1-v4} + swi 0x600e9 + movvc a1,#0 + ldmia sp!,{v1-v4,pc}^ + + + AREA CODE, READONLY + align 4 + export |Wimp_BaseOfSprites| + = "Wimp_BaseOfSprites" + align 4 + +|Wimp_BaseOfSprites|: + mov a3,a1 + mov a4,a2 + swi 0x600ea + strvc a1,[a3] + strvc a2,[a4] + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_CommandWindow| + = "Wimp_CommandWindow" + align 4 + +|Wimp_CommandWindow|: + swi 0x600ef + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_TransferBlock| + = "Wimp_TransferBlock" + align 4 + +|Wimp_TransferBlock|: + str v1,[sp,#-4]! + ldr v1,[sp,#4] + swi 0x600f1 + ldr v1,[sp],#4 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |Wimp_SpriteInfo| + = "Wimp_SpriteInfo" + align 4 + +|Wimp_SpriteInfo|: + stmdb sp!,{v1-v6,lr} + mov v4,a2 + mov v5,a3 + mov v6,a4 + mov a3,a1 + mov a1,#40 + movvc a1,#0 + swi 0x600e9 ;Wimp_SpriteOp + str a4,[v4] + str v1,[v5] + str v3,[v6] + ldmia sp!,{v1-v6,pc}^ + + + AREA CODE, READONLY + align 4 + export |DragASprite_Start| + = "DragASprite_Start" + align 4 + +|DragASprite_Start|: + swi 0x62400 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DragASprite_Stop| + = "DragASprite_Stop" + align 4 + +|DragASprite_Stop|: + swi 0x62401 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ColourTrans_SelectTable| + = "ColourTrans_SelectTable" + align 4 + +|ColourTrans_SelectTable|: + stmdb sp!,{v1-v4,lr} + add v1,sp,#20 + ldmia v1,{v1-v4} + ldr v1,[v1] + swi 0x60740 + addvs sp,sp,#4 + bvs |CTSTexit| + mov a1,v1 + ldr v1,[sp],#4 + str a1,[v1] + mov a1,#0 +|CTSTexit|: + ldmia sp!,{v2-v4,pc}^ + + + AREA CODE, READONLY + align 4 + export |ColourTrans_SetFontColours| + = "ColourTrans_SetFontColours" + align 4 + +|ColourTrans_SetFontColours|: + swi 0x6074f + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ColourTrans_SetColour| + = "ColourTrans_SetColour" + align 4 + +|ColourTrans_SetColour|: + str v1,[sp,#-4]! + mov v1,a3 + mov a4,a2 + swi 0x6075e + movvc a1,#0 + ldr v1,[sp],#4 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ColourTrans_SetGCOL| + = "ColourTrans_SetGCOL" + align 4 + +|ColourTrans_SetGCOL|: + str v1,[sp,#-4]! + mov v1,a3 + mov a4,a2 + swi 0x60743 + movvc a1,#0 + ldr v1,[sp],#4 + movs pc,lr + + + + + +; ************* OS STUFF *************** + + AREA CODE, READONLY + align 4 + export |OS_ReadModeVariable| + = "OS_ReadModeVariable" + align 4 + +|OS_ReadModeVariable|: + swi 0x20035 + mvncs a1,#0 + movcc a1,a3 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |OS_ReadDynamicArea| + = "OS_ReadDynamicArea" + align 4 + +|OS_ReadDynamicArea|: + swi 0x2005c + movvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ModeColourNumber| + = "ModeColourNumber" + align 4 + +|ModeColourNumber|: + swi 0x60744 ;XColourTrans_ReturnColourNumber + mvnvs a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ScanKeys| + = "ScanKeys" + align 4 + +|ScanKeys|: + mov a2,a1 + mov a1,#121 + swi 0x20006 ;XOS_Byte 121 + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ReadKeyboardStatus| + = "ReadKeyboardStatus" + align 4 + +|ReadKeyboardStatus|: + mov a1,#202 + mov a2,#0 + mov a3,#255 + swi 0x20006 + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ReadDragType| + = "ReadDragType" + align 4 + +|ReadDragType|: + mov a1,#161 + mov a2,#28 + swi 0x20006 + and a1,a3,#2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |SetMousePointer| + = "SetMousePointer" + align 4 + +|SetMousePointer|: + mov a2,a1 + mov a1,#106 + swi 0x20006 + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY ;sprite ops (I have 52, 53 and 56 in mind) + align 4 + export |OS_SpriteOp| + = "OS_SpriteOp" + align 4 + +|OS_SpriteOp|: + stmdb sp!,{v1-v4,lr} + add v1,sp,#20 + ldmia v1,{v1-v4} + swi 0x2002e + movvc a1,#0 + ldmia sp!,{v1-v4,pc}^ + + + AREA CODE, READONLY + align 4 + export |OS_Plot| + = "OS_Plot" + align 4 + +|OS_Plot|: + swi 0x20045 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |MouseBoundingBox| + = "MouseBoundingBox" + align 4 + +|MouseBoundingBox|: + mov a2,a1 + mov a1,#21 + swi 0x20007 ;OS_Word21,1 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |OS_ReadMonotonicTime| + = "OS_ReadMonotonicTime" + align 4 + +|OS_ReadMonotonicTime|: + swi 0x20042 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |OS_ReadC| + = "OS_ReadC" + align 4 + +|OS_ReadC|: + mov a2,a1 + swi 0x20004 + strccb a1,[a2] + movcc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |OS_ReadLine| + = "OS_ReadLine" + align 4 + +|OS_ReadLine|: + stmdb sp!,{a1,v1,v2} + stmdb sp!,{a1-a3} + mov a1,#200 + mov a2,#1 + mvn a3,#1 + swi 0x20006 + mov v2,a2 + ldmia sp!,{a1-a3} + ldr v1,[sp,#8] + swi 0x2000e + mov v1,a2 + mov a1,#200 + mov a2,v2 + mvn a3,#0 + swi 0x20006 + mov a2,v1 + ldmia sp!,{a4,v1,v2} + bic a4,a4,#0xc0000000 + mov a1,#10 + strb a1,[a4,a2] ;make compatible with fgets (terminated by 10, not 13) + mov a1,a2 + rsbcs a1,a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |OS_ReadEscapeState| + = "OS_ReadEscapeState" + align 4 + +|OS_ReadEscapeState|: + swi 0x2002c + movcc a1,#0 + movcs a1,#1 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ReadCatalogueInfo| + = "ReadCatalogueInfo" + align 4 + +|ReadCatalogueInfo|: + stmdb sp!,{v1-v3,lr} + mov v3,a2 + mov a2,a1 + mov a1,#17 + swi 0x20008 ;OS_File 17 + stmia v3,{a3-v2} + ldmia sp!,{v1-v3,pc}^ + + + AREA CODE, READONLY + align 4 + export |ReadDirName| + = "ReadDirName" + align 4 + +|ReadDirName|: + stmdb sp!,{v1-v4,lr} + mov v4,a3 ;preserve dir_env * + ldmia a3,{a4-v3} + mov a3,a2 + mov a2,a1 + mov a1,#9 + swi 0x2000c ;OS_GBPB 9 + stmia v4,{a4,v1} + movvc a1,#0 + ldmia sp!,{v1-v4,pc}^ + + + AREA CODE, READONLY + align 4 + export |ReadDirNameInfo| + = "ReadDirNameInfo" + align 4 + +|ReadDirNameInfo|: + stmdb sp!,{v1-v4,lr} + mov v4,a3 + ldmia a3,{a4-v3} + mov a3,a2 + mov a2,a1 + mov a1,#10 + swi 0x2000c ;OS_GBPB 10 + stmia v4,{a4,v1} + movvc a1,#0 + ldmia sp!,{v1-v4,pc}^ + + + AREA CODE, READONLY + align 4 + export |DeleteFile| + = "DeleteFile" + align 4 + +|DeleteFile|: + stmdb sp!,{v1,v2} + mov a2,a1 + mov a1,#6 + swi 0x20008 ;OS_File 6 + movvc a1,#0 + ldmia sp!,{v1,v2} + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ConvertInteger1| + = "ConvertInteger1" + align 4 + +|ConvertInteger1|: + swi 0x200d9 + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ConvertInteger2| + = "ConvertInteger2" + align 4 + +|ConvertInteger2|: + swi 0x200da + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ConvertInteger3| + = "ConvertInteger3" + align 4 + +|ConvertInteger3|: + swi 0x200db + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |ConvertInteger4| + = "ConvertInteger4" + align 4 + +|ConvertInteger4|: + swi 0x200dc + mov a1,a2 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |OS_FlushBuffer| + = "OS_FlushBuffer" + align 4 + +|OS_FlushBuffer|: + mov a2,a1 + mov a1,#21 + swi 0x20006 + movvc a1,#0 + movs pc,lr + + + + + + +; ************ MISC STUFF *************** + + AREA CODE, READONLY + align 4 + export |Joystick_Read| + = "Joystick_Read" + align 4 + +|Joystick_Read|: + swi 0x63f40 ;XJoystick_Read (Acorn) + bvc |JRexit| + ldr a2,[a1] ;get error-number + eor a2,a2,#0xe6 + eors a2,a2,#0x100 + mvneq a1,#1 ;-2 ==> unknown SWI + mvnne a1,#0 ;-1 ==> error generated from joystick module +|JRexit|: + movs pc,lr + + + + + +; ************** SOUND SWIS ************* + + AREA CODE, READONLY + align 4 + export |Sound_Volume| + = "Sound_Volume" + align 4 + +|Sound_Volume|: + swi 0x60180 + mvnvs a1,#0 + movs pc,lr + + +; *********** DIGITAL RENDERER ********** + +DigiRendChunk equ 0x6F700 ;X flag set + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_Activate| + = "DigitalRenderer_Activate" + align 4 + +|DigitalRenderer_Activate|: + swi DigiRendChunk + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_Deactivate| + = "DigitalRenderer_Deactivate" + align 4 + +|DigitalRenderer_Deactivate|: + swi DigiRendChunk+1 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_Pause| + = "DigitalRenderer_Pause" + align 4 + +|DigitalRenderer_Pause|: + swi DigiRendChunk+2 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_Resume| + = "DigitalRenderer_Resume" + align 4 + +|DigitalRenderer_Resume|: + swi DigiRendChunk+3 + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_GetTables| + = "DigitalRenderer_GetTables" + align 4 + +|DigitalRenderer_GetTables|: + mov a3,a1 + mov a4,a2 + swi DigiRendChunk+4 + strvc a1,[a3] + strvc a2,[a4] + movvc a1,#0 + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_ReadState| + = "DigitalRenderer_ReadState" + align 4 + +|DigitalRenderer_ReadState|: + swi DigiRendChunk+5 + mvnvs a1,#0 ;returns -1 on error + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |DigitalRenderer_NewSample| + = "DigitalRenderer_NewSample" + align 4 + +|DigitalRenderer_NewSample|: + swi DigiRendChunk+6 + movvc a1,#0 + movs pc,lr + + +; *********** PLOTTER ************** + +BPlotChunk equ 0x70100 ;X bit set + + AREA CODE, READONLY + align 4 + export |PlotZoom1| + = "PlotZoom1" + align 4 + +|PlotZoom1|: + swi BPlotChunk + movs pc,lr + + + AREA CODE, READONLY + align 4 + export |PlotZoom2| + = "PlotZoom2" + align 4 + +|PlotZoom2|: + swi BPlotChunk+1 diff --git a/archive-sources/c64emu/SAM.cpp b/archive-sources/c64emu/SAM.cpp new file mode 100644 index 0000000..081bc8b --- /dev/null +++ b/archive-sources/c64emu/SAM.cpp @@ -0,0 +1,2151 @@ +/* + * SAM.h - Simple Assembler and Monitor With Integrated System Explorer + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysdeps.h" + +#include "SAM.h" +#include "C64.h" +#include "CPUC64.h" +#include "CPU1541.h" +#include "VIC.h" +#include "SID.h" +#include "CIA.h" + + +// Pointers to chips +static MOS6510 *TheCPU; +static MOS6502_1541 *TheCPU1541; +static MOS6569 *TheVIC; +static MOS6581 *TheSID; +static MOS6526_1 *TheCIA1; +static MOS6526_2 *TheCIA2; + +// 6510/6502 registers +static MOS6510State R64; +static MOS6502State R1541; + +static bool access_1541; // false: accessing C64, true: accessing 1541 + +// Access to 6510/6502 address space +static inline uint8 SAMReadByte(uint16 adr) +{ + if (access_1541) + return TheCPU1541->ExtReadByte(adr); + else + return TheCPU->ExtReadByte(adr); +} + +static inline void SAMWriteByte(uint16 adr, uint8 byte) +{ + if (access_1541) + TheCPU1541->ExtWriteByte(adr, byte); + else + TheCPU->ExtWriteByte(adr, byte); +} + + +// Streams for input, output and error messages +static FILE *fin, *fout, *ferr; + +// Input line +#define INPUT_LENGTH 80 +static char input[INPUT_LENGTH]; +static char *in_ptr; + +static uint16 address, end_address; + + +// Input tokens +enum Token { + T_NULL, // Invalid token + T_END, // End of line + T_NUMBER, // Hexadecimal number + T_STRING, // String enclosed in "" + T_LPAREN, // '(' + T_RPAREN, // ')' + T_ADD, // '+' + T_SUB, // '-' + T_MUL, // '*' + T_DIV, // '/' + T_COMMA, // ',' + T_IMMED, // '#' + T_X, // 'x' + T_Y, // 'y' + T_PC, // 'pc' + T_SP, // 'sp' + + T_A, // 'a' (get_reg_token() only) + T_DR, // 'dr' (get_reg_token() only) + T_PR // 'pr' (get_reg_token() only) +}; + +static enum Token the_token; // Last token read +static uint16 the_number; // Contains the number if the_token==T_NUMBER +static char the_string[INPUT_LENGTH]; // Contains the string if the_token==T_STRING + + +// Addressing modes +enum { + A_IMPL, + A_ACCU, // A + A_IMM, // #zz + A_REL, // Branches + A_ZERO, // zz + A_ZEROX, // zz,x + A_ZEROY, // zz,y + A_ABS, // zzzz + A_ABSX, // zzzz,x + A_ABSY, // zzzz,y + A_IND, // (zzzz) + A_INDX, // (zz,x) + A_INDY // (zz),y +}; + +// Mnemonics +enum { + M_ADC, M_AND, M_ASL, M_BCC, M_BCS, M_BEQ, M_BIT, M_BMI, M_BNE, M_BPL, + M_BRK, M_BVC, M_BVS, M_CLC, M_CLD, M_CLI, M_CLV, M_CMP, M_CPX, M_CPY, + M_DEC, M_DEX, M_DEY, M_EOR, M_INC, M_INX, M_INY, M_JMP, M_JSR, M_LDA, + M_LDX, M_LDY, M_LSR, M_NOP, M_ORA, M_PHA, M_PHP, M_PLA, M_PLP, M_ROL, + M_ROR, M_RTI, M_RTS, M_SBC, M_SEC, M_SED, M_SEI, M_STA, M_STX, M_STY, + M_TAX, M_TAY, M_TSX, M_TXA, M_TXS, M_TYA, + + M_ILLEGAL, // Undocumented opcodes start here + + M_IANC, M_IANE, M_IARR, M_IASR, M_IDCP, M_IISB, M_IJAM, M_INOP, M_ILAS, + M_ILAX, M_ILXA, M_IRLA, M_IRRA, M_ISAX, M_ISBC, M_ISBX, M_ISHA, M_ISHS, + M_ISHX, M_ISHY, M_ISLO, M_ISRE, + + M_MAXIMUM // Highest element +}; + +// Mnemonic for each opcode +static const char mnemonic[256] = { + M_BRK , M_ORA , M_IJAM, M_ISLO, M_INOP, M_ORA, M_ASL , M_ISLO, // 00 + M_PHP , M_ORA , M_ASL , M_IANC, M_INOP, M_ORA, M_ASL , M_ISLO, + M_BPL , M_ORA , M_IJAM, M_ISLO, M_INOP, M_ORA, M_ASL , M_ISLO, // 10 + M_CLC , M_ORA , M_INOP, M_ISLO, M_INOP, M_ORA, M_ASL , M_ISLO, + M_JSR , M_AND , M_IJAM, M_IRLA, M_BIT , M_AND, M_ROL , M_IRLA, // 20 + M_PLP , M_AND , M_ROL , M_IANC, M_BIT , M_AND, M_ROL , M_IRLA, + M_BMI , M_AND , M_IJAM, M_IRLA, M_INOP, M_AND, M_ROL , M_IRLA, // 30 + M_SEC , M_AND , M_INOP, M_IRLA, M_INOP, M_AND, M_ROL , M_IRLA, + M_RTI , M_EOR , M_IJAM, M_ISRE, M_INOP, M_EOR, M_LSR , M_ISRE, // 40 + M_PHA , M_EOR , M_LSR , M_IASR, M_JMP , M_EOR, M_LSR , M_ISRE, + M_BVC , M_EOR , M_IJAM, M_ISRE, M_INOP, M_EOR, M_LSR , M_ISRE, // 50 + M_CLI , M_EOR , M_INOP, M_ISRE, M_INOP, M_EOR, M_LSR , M_ISRE, + M_RTS , M_ADC , M_IJAM, M_IRRA, M_INOP, M_ADC, M_ROR , M_IRRA, // 60 + M_PLA , M_ADC , M_ROR , M_IARR, M_JMP , M_ADC, M_ROR , M_IRRA, + M_BVS , M_ADC , M_IJAM, M_IRRA, M_INOP, M_ADC, M_ROR , M_IRRA, // 70 + M_SEI , M_ADC , M_INOP, M_IRRA, M_INOP, M_ADC, M_ROR , M_IRRA, + M_INOP, M_STA , M_INOP, M_ISAX, M_STY , M_STA, M_STX , M_ISAX, // 80 + M_DEY , M_INOP, M_TXA , M_IANE, M_STY , M_STA, M_STX , M_ISAX, + M_BCC , M_STA , M_IJAM, M_ISHA, M_STY , M_STA, M_STX , M_ISAX, // 90 + M_TYA , M_STA , M_TXS , M_ISHS, M_ISHY, M_STA, M_ISHX, M_ISHA, + M_LDY , M_LDA , M_LDX , M_ILAX, M_LDY , M_LDA, M_LDX , M_ILAX, // a0 + M_TAY , M_LDA , M_TAX , M_ILXA, M_LDY , M_LDA, M_LDX , M_ILAX, + M_BCS , M_LDA , M_IJAM, M_ILAX, M_LDY , M_LDA, M_LDX , M_ILAX, // b0 + M_CLV , M_LDA , M_TSX , M_ILAS, M_LDY , M_LDA, M_LDX , M_ILAX, + M_CPY , M_CMP , M_INOP, M_IDCP, M_CPY , M_CMP, M_DEC , M_IDCP, // c0 + M_INY , M_CMP , M_DEX , M_ISBX, M_CPY , M_CMP, M_DEC , M_IDCP, + M_BNE , M_CMP , M_IJAM, M_IDCP, M_INOP, M_CMP, M_DEC , M_IDCP, // d0 + M_CLD , M_CMP , M_INOP, M_IDCP, M_INOP, M_CMP, M_DEC , M_IDCP, + M_CPX , M_SBC , M_INOP, M_IISB, M_CPX , M_SBC, M_INC , M_IISB, // e0 + M_INX , M_SBC , M_NOP , M_ISBC, M_CPX , M_SBC, M_INC , M_IISB, + M_BEQ , M_SBC , M_IJAM, M_IISB, M_INOP, M_SBC, M_INC , M_IISB, // f0 + M_SED , M_SBC , M_INOP, M_IISB, M_INOP, M_SBC, M_INC , M_IISB +}; + +// Addressing mode for each opcode +static const char adr_mode[256] = { + A_IMPL, A_INDX, A_IMPL, A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // 00 + A_IMPL, A_IMM , A_ACCU, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROX, A_ZEROX, // 10 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSX , A_ABSX, + A_ABS , A_INDX, A_IMPL, A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // 20 + A_IMPL, A_IMM , A_ACCU, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROX, A_ZEROX, // 30 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSX , A_ABSX, + A_IMPL, A_INDX, A_IMPL, A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // 40 + A_IMPL, A_IMM , A_ACCU, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROX, A_ZEROX, // 50 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSX , A_ABSX, + A_IMPL, A_INDX, A_IMPL, A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // 60 + A_IMPL, A_IMM , A_ACCU, A_IMM , A_IND , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROX, A_ZEROX, // 70 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSX , A_ABSX, + A_IMM , A_INDX, A_IMM , A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // 80 + A_IMPL, A_IMM , A_IMPL, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROY, A_ZEROY, // 90 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSY , A_ABSY, + A_IMM , A_INDX, A_IMM , A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // a0 + A_IMPL, A_IMM , A_IMPL, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROY, A_ZEROY, // b0 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSY , A_ABSY, + A_IMM , A_INDX, A_IMM , A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // c0 + A_IMPL, A_IMM , A_IMPL, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROX, A_ZEROX, // d0 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSX , A_ABSX, + A_IMM , A_INDX, A_IMM , A_INDX, A_ZERO , A_ZERO , A_ZERO , A_ZERO, // e0 + A_IMPL, A_IMM , A_IMPL, A_IMM , A_ABS , A_ABS , A_ABS , A_ABS, + A_REL , A_INDY, A_IMPL, A_INDY, A_ZEROX, A_ZEROX, A_ZEROX, A_ZEROX, // f0 + A_IMPL, A_ABSY, A_IMPL, A_ABSY, A_ABSX , A_ABSX , A_ABSX , A_ABSX +}; + +// Chars for each mnemonic +static const char mnem_1[] = "aaabbbbbbbbbbcccccccdddeiiijjllllnopppprrrrssssssstttttt?aaaadijnlllrrsssssssss"; +static const char mnem_2[] = "dnscceimnprvvllllmppeeeonnnmsdddsorhhlloottbeeetttaasxxy?nnrscsaoaaxlrabbhhhhlr"; +static const char mnem_3[] = "cdlcsqtielkcscdivpxycxyrcxypraxyrpaapaplrisccdiaxyxyxasa?cerrpbmpsxaaaxcxasxyoe"; + +// Instruction length for each addressing mode +static const char adr_length[] = {1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2}; + + +// Prototypes +static void error(char *s); +static void handle_abort(...); +static void init_abort(void); +static void exit_abort(void); +static bool aborted(void); + +static void read_line(void); // Scanner +static char get_char(void); +static void put_back(char c); +static enum Token get_token(void); +static enum Token get_reg_token(void); +static uint16 get_number(void); +static enum Token get_string(char *str); + +static bool expression(uint16 *number); // Parser +static bool term(uint16 *number); +static bool factor(uint16 *number); +static bool address_args(void); +static bool range_args(int def_range); +static bool instr_args(uint16 *number, char *mode); + +static void help(void); // Routines for commands +static void registers(void); +static void display_registers(void); +static void memory_dump(void); +static void ascii_dump(void); +static char conv_from_64(char c); +static void screen_dump(void); +static char conv_from_scode(char c); +static void binary_dump(void); +static void sprite_dump(void); +static void byte_to_bin(uint8 byte, char *str); +static void disassemble(void); +static int disass_line(uint16 adr, uint8 op, uint8 lo, uint8 hi); +static void assemble(void); +static char find_mnemonic(char op1, char op2, char op3); +static bool find_opcode(char mnem, char mode, uint8 *opcode); +static void mem_config(void); +static void fill(void); +static void compare(void); +static void transfer(void); +static void modify(void); +static void print_expr(void); +static void redir_output(void); +static void int_vectors(void); +static void view_state(void); +static void view_cia_state(void); +static void dump_cia_ints(uint8 i); +static void view_sid_state(void); +static void dump_sid_waveform(uint8 wave); +static void view_vic_state(void); +static void dump_spr_flags(uint8 f); +static void dump_vic_ints(uint8 i); +static void view_1541_state(void); +static void dump_via_ints(uint8 i); +static void load_data(void); +static void save_data(void); + + +/* + * Open and handle SAM + */ + +void SAM(C64 *the_c64) +{ + bool done = false; + char c; + + TheCPU = the_c64->TheCPU; + TheCPU1541 = the_c64->TheCPU1541; + TheVIC = the_c64->TheVIC; + TheSID = the_c64->TheSID; + TheCIA1 = the_c64->TheCIA1; + TheCIA2 = the_c64->TheCIA2; + + // Get CPU registers and current memory configuration + TheCPU->GetState(&R64); + TheCPU->ExtConfig = (~R64.ddr | R64.pr) & 7; + TheCPU1541->GetState(&R1541); + + fin = stdin; + fout = stdout; + ferr = stdout; + + access_1541 = false; + address = R64.pc; + + fprintf(ferr, "\n *** SAM - Simple Assembler and Monitor ***\n *** Press 'h' for help ***\n\n"); + init_abort(); + display_registers(); + + while (!done) { + if (access_1541) + fprintf(ferr, "1541> "); + else + fprintf(ferr, "C64> "); + fflush(ferr); + read_line(); + while ((c = get_char()) == ' ') ; + + switch (c) { + case 'a': // Assemble + get_token(); + assemble(); + break; + + case 'b': // Binary dump + get_token(); + binary_dump(); + break; + + case 'c': // Compare + get_token(); + compare(); + break; + + case 'd': // Disassemble + get_token(); + disassemble(); + break; + + case 'e': // Interrupt vectors + int_vectors(); + break; + + case 'f': // Fill + get_token(); + fill(); + break; + + case 'h': // Help + help(); + break; + + case 'i': // ASCII dump + get_token(); + ascii_dump(); + break; + + case 'k': // Memory configuration + get_token(); + mem_config(); + break; + + case 'l': // Load data + get_token(); + load_data(); + break; + + case 'm': // Memory dump + get_token(); + memory_dump(); + break; + + case 'n': // Screen code dump + get_token(); + screen_dump(); + break; + + case 'o': // Redirect output + get_token(); + redir_output(); + break; + + case 'p': // Sprite dump + get_token(); + sprite_dump(); + break; + + case 'r': // Registers + get_reg_token(); + registers(); + break; + + case 's': // Save data + get_token(); + save_data(); + break; + + case 't': // Transfer + get_token(); + transfer(); + break; + + case 'v': // View machine state + view_state(); + break; + + case 'x': // Exit + done = true; + break; + + case ':': // Change memory + get_token(); + modify(); + break; + + case '1': // Switch to 1541 mode + access_1541 = true; + break; + + case '6': // Switch to C64 mode + access_1541 = false; + break; + + case '?': // Compute expression + get_token(); + print_expr(); + break; + + case '\n': // Blank line + break; + + default: // Unknown command + error("Unknown command"); + break; + } + } + + exit_abort(); + + if (fout != ferr) + fclose(fout); + + // Set CPU registers + TheCPU->SetState(&R64); + TheCPU1541->SetState(&R1541); +} + + +/* + * Print error message + */ + +static void error(char *s) +{ + fprintf(ferr, "*** %s\n", s); +} + + +/* + * CTRL-C pressed? + */ + +static bool WasAborted; + +#ifdef HAVE_SIGACTION +struct sigaction my_sa; +#endif + +#ifdef HAVE_SIGACTION +static void handle_abort( int snr) +#else +static void handle_abort(...) +#endif +{ + WasAborted = true; +#if !defined(HAVE_SIGACTION) && defined(HAVE_SIGNAL) + signal(SIGINT, (sighandler_t) handle_abort); +#endif +} + +static void init_abort(void) +{ + WasAborted = false; +#if defined(HAVE_SIGACTION) + my_sa.sa_handler = handle_abort; + my_sa.sa_flags = 0; + sigemptyset(&my_sa.sa_mask); + sigaction(SIGINT, &my_sa, NULL); +#elif defined(HAVE_SIGNAL) + signal(SIGINT, (sighandler_t) handle_abort); +#endif +} + +static void exit_abort(void) +{ +#if defined(HAVE_SIGACTION) + my_sa.sa_handler = SIG_DFL; + sigaction(SIGINT, &my_sa, NULL); +#elif defined(HAVE_SIGNAL) + signal(SIGINT, SIG_DFL); +#endif +} + +static bool aborted(void) +{ + bool ret = WasAborted; + + WasAborted = false; + return ret; +} + + +/* + * Read a line from the keyboard + */ + +static void read_line(void) +{ + fgets(in_ptr = input, INPUT_LENGTH, fin); +} + + +/* + * Read a character from the input line + */ + +static char get_char(void) +{ + return *in_ptr++; +} + + +/* + * Stuff back a character into the input line + */ + +static void put_back(char c) +{ + *(--in_ptr) = c; +} + + +/* + * Scanner: Get a token from the input line + */ + +static enum Token get_token(void) +{ + char c; + + // Skip spaces + while ((c = get_char()) == ' ') ; + + switch (c) { + case '\n': + return the_token = T_END; + case '(': + return the_token = T_LPAREN; + case ')': + return the_token = T_RPAREN; + case '+': + return the_token = T_ADD; + case '-': + return the_token = T_SUB; + case '*': + return the_token = T_MUL; + case '/': + return the_token = T_DIV; + case ',': + return the_token = T_COMMA; + case '#': + return the_token = T_IMMED; + case 'x': + return the_token = T_X; + case 'y': + return the_token = T_Y; + case 'p': + if (get_char() == 'c') + return the_token = T_PC; + else { + error("Unrecognized token"); + return the_token = T_NULL; + } + case 's': + if (get_char() == 'p') + return the_token = T_SP; + else { + error("Unrecognized token"); + return the_token = T_NULL; + } + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + put_back(c); + the_number = get_number(); + return the_token = T_NUMBER; + case '"': + return the_token = get_string(the_string); + default: + error("Unrecognized token"); + return the_token = T_NULL; + } +} + +static enum Token get_reg_token(void) +{ + char c; + + // Skip spaces + while ((c = get_char()) == ' ') ; + + switch (c) { + case '\n': + return the_token = T_END; + case 'a': + return the_token = T_A; + case 'd': + if (get_char() == 'r') + return the_token = T_DR; + else { + error("Unrecognized token"); + return the_token = T_NULL; + } + case 'p': + if ((c = get_char()) == 'c') + return the_token = T_PC; + else if (c == 'r') + return the_token = T_PR; + else { + error("Unrecognized token"); + return the_token = T_NULL; + } + case 's': + if (get_char() == 'p') + return the_token = T_SP; + else { + error("Unrecognized token"); + return the_token = T_NULL; + } + case 'x': + return the_token = T_X; + case 'y': + return the_token = T_Y; + default: + error("Unrecognized token"); + return the_token = T_NULL; + } +} + +static uint16 get_number(void) +{ + char c; + uint16 i = 0; + + while (((c = get_char()) >= '0') && (c <= '9') || (c >= 'a') && (c <= 'f')) + if (c < 'a') + i = (i << 4) + (c - '0'); + else + i = (i << 4) + (c - 'a' + 10); + + put_back(c); + return i; +} + +static enum Token get_string(char *str) +{ + char c; + + while ((c = get_char()) != '\n') { + if (c == '"') { + *str = 0; + return T_STRING; + } + *str++ = c; + } + + error("Unterminated string"); + return T_NULL; +} + + +/* + * expression = term {(ADD | SUB) term} + * true: OK, false: Error + */ + +static bool expression(uint16 *number) +{ + uint16 accu, trm; + + if (!term(&accu)) + return false; + + for (;;) + switch (the_token) { + case T_ADD: + get_token(); + if (!term(&trm)) + return false; + accu += trm; + break; + + case T_SUB: + get_token(); + if (!term(&trm)) + return false; + accu -= trm; + break; + + default: + *number = accu; + return true; + } +} + + +/* + * term = factor {(MUL | DIV) factor} + * true: OK, false: Error + */ + +static bool term(uint16 *number) +{ + uint16 accu, fact; + + if (!factor(&accu)) + return false; + + for (;;) + switch (the_token) { + case T_MUL: + get_token(); + if (!factor(&fact)) + return false; + accu *= fact; + break; + + case T_DIV: + get_token(); + if (!factor(&fact)) + return false; + if (fact == 0) { + error("Division by 0"); + return false; + } + accu /= fact; + break; + + default: + *number = accu; + return true; + } +} + + +/* + * factor = NUMBER | PC | SP | LPAREN expression RPAREN + * true: OK, false: Error + */ + +static bool factor(uint16 *number) +{ + switch (the_token) { + case T_NUMBER: + *number = the_number; + get_token(); + return true; + + case T_PC: + get_token(); + *number = access_1541 ? R1541.pc : R64.pc; + return true; + + case T_SP: + get_token(); + *number = access_1541 ? R1541.sp : R64.sp; + return true; + + case T_LPAREN: + get_token(); + if (expression(number)) + if (the_token == T_RPAREN) { + get_token(); + return true; + } else { + error("Missing ')'"); + return false; + } + else { + error("Error in expression"); + return false; + } + + case T_END: + error("Required argument missing"); + return false; + + default: + error("'pc', 'sp', '(' or number expected"); + return false; + } +} + + +/* + * address_args = [expression] END + * + * Read start to "address" + * + * true: OK, false: Error + */ + +static bool address_args(void) +{ + if (the_token == T_END) + return true; + else { + if (!expression(&address)) + return false; + return the_token == T_END; + } +} + + +/* + * range_args = [expression] [[COMMA] expression] END + * + * Read start address to "address", end address to "end_address" + * + * true: OK, false: Error + */ + +static bool range_args(int def_range) +{ + end_address = address + def_range; + + if (the_token == T_END) + return true; + else { + if (!expression(&address)) + return false; + end_address = address + def_range; + if (the_token == T_END) + return true; + else { + if (the_token == T_COMMA) get_token(); + if (!expression(&end_address)) + return false; + return the_token == T_END; + } + } +} + + +/* + * instr_args = END + * | IMMED NUMBER END + * | NUMBER [COMMA (X | Y)] END + * | LPAREN NUMBER (RPAREN [COMMA Y] | COMMA X RPAREN) END + * + * Read arguments of a 6510 instruction, determine address and addressing mode + * + * true: OK, false: Error + */ + +static bool instr_args(uint16 *number, char *mode) +{ + switch (the_token) { + + case T_END: + *mode = A_IMPL; + return true; + + case T_IMMED: + get_token(); + if (the_token == T_NUMBER) { + *number = the_number; + *mode = A_IMM; + get_token(); + return the_token == T_END; + } else { + error("Number expected"); + return false; + } + + case T_NUMBER: + *number = the_number; + get_token(); + switch (the_token) { + + case T_END: + if (*number < 0x100) + *mode = A_ZERO; + else + *mode = A_ABS; + return true; + + case T_COMMA: + get_token(); + switch (the_token) { + + case T_X: + get_token(); + if (*number < 0x100) + *mode = A_ZEROX; + else + *mode = A_ABSX; + return the_token == T_END; + + case T_Y: + get_token(); + if (*number < 0x100) + *mode = A_ZEROY; + else + *mode = A_ABSY; + return the_token == T_END; + + default: + error("Illegal index register"); + return false; + } + + default: + return false; + } + + case T_LPAREN: + get_token(); + if (the_token == T_NUMBER) { + *number = the_number; + get_token(); + switch (the_token) { + + case T_RPAREN: + get_token(); + switch (the_token) { + + case T_END: + *mode = A_IND; + return true; + + case T_COMMA: + get_token(); + if (the_token == T_Y) { + *mode = A_INDY; + get_token(); + return the_token == T_END; + } else { + error("Only 'y' index register allowed"); + return false; + } + + default: + error("Illegal characters after ')'"); + return false; + } + + case T_COMMA: + get_token(); + if (the_token == T_X) { + get_token(); + if (the_token == T_RPAREN) { + *mode = A_INDX; + get_token(); + return the_token == T_END; + } else { + error("')' expected"); + return false; + } + } else { + error("Only 'x' index register allowed"); + return false; + } + + default: + error("')' or ',' expected"); + return false; + } + } else { + error("Number expected"); + return false; + } + + default: + error("'(', '#' or number expected"); + return false; + } +} + + +/* + * Display help + * h + */ + +static void help(void) +{ + fprintf(fout, "a [start] Assemble\n" + "b [start] [end] Binary dump\n" + "c start end dest Compare memory\n" + "d [start] [end] Disassemble\n" + "e Show interrupt vectors\n" + "f start end byte Fill memory\n" + "i [start] [end] ASCII/PETSCII dump\n" + "k [config] Show/set C64 memory configuration\n" + "l start \"file\" Load data\n" + "m [start] [end] Memory dump\n" + "n [start] [end] Screen code dump\n" + "o [\"file\"] Redirect output\n" + "p [start] [end] Sprite dump\n" + "r [reg value] Show/set CPU registers\n" + "s start end \"file\" Save data\n" + "t start end dest Transfer memory\n" + "vc1 View CIA 1 state\n" + "vc2 View CIA 2 state\n" + "vf View 1541 state\n" + "vs View SID state\n" + "vv View VIC state\n" + "x Return to Frodo\n" + ": addr {byte} Modify memory\n" + "1541 Switch to 1541\n" + "64 Switch to C64\n" + "? expression Calculate expression\n"); +} + + +/* + * Display/change 6510 registers + * r [reg value] + */ + +static void registers(void) +{ + enum Token the_reg; + uint16 value; + + if (the_token != T_END) + switch (the_reg = the_token) { + case T_A: + case T_X: + case T_Y: + case T_PC: + case T_SP: + case T_DR: + case T_PR: + get_token(); + if (!expression(&value)) + return; + + switch (the_reg) { + case T_A: + if (access_1541) + R1541.a = value; + else + R64.a = value; + break; + case T_X: + if (access_1541) + R1541.x = value; + else + R64.x = value; + break; + case T_Y: + if (access_1541) + R1541.y = value; + else + R64.y = value; + break; + case T_PC: + if (access_1541) + R1541.pc = value; + else + R64.pc = value; + break; + case T_SP: + if (access_1541) + R1541.sp = (value & 0xff) | 0x0100; + else + R64.sp = (value & 0xff) | 0x0100; + break; + case T_DR: + if (!access_1541) + R64.ddr = value; + break; + case T_PR: + if (!access_1541) + R64.pr = value; + break; + default: + break; + } + break; + + default: + return; + } + + display_registers(); +} + +static void display_registers(void) +{ + if (access_1541) { + fprintf(fout, " PC A X Y SP NVDIZC Instruction\n"); + fprintf(fout, "%04lx %02lx %02lx %02lx %04lx %c%c%c%c%c%c ", + R1541.pc, R1541.a, R1541.x, R1541.y, R1541.sp, + R1541.p & 0x80 ? '1' : '0', R1541.p & 0x40 ? '1' : '0', R1541.p & 0x08 ? '1' : '0', + R1541.p & 0x04 ? '1' : '0', R1541.p & 0x02 ? '1' : '0', R1541.p & 0x01 ? '1' : '0'); + disass_line(R1541.pc, SAMReadByte(R1541.pc), SAMReadByte(R1541.pc+1), SAMReadByte(R1541.pc+2)); + } else { + fprintf(fout, " PC A X Y SP DR PR NVDIZC Instruction\n"); + fprintf(fout, "%04lx %02lx %02lx %02lx %04lx %02lx %02lx %c%c%c%c%c%c ", + R64.pc, R64.a, R64.x, R64.y, R64.sp, R64.ddr, R64.pr, + R64.p & 0x80 ? '1' : '0', R64.p & 0x40 ? '1' : '0', R64.p & 0x08 ? '1' : '0', + R64.p & 0x04 ? '1' : '0', R64.p & 0x02 ? '1' : '0', R64.p & 0x01 ? '1' : '0'); + disass_line(R64.pc, SAMReadByte(R64.pc), SAMReadByte(R64.pc+1), SAMReadByte(R64.pc+2)); + } +} + + +/* + * Memory dump + * m [start] [end] + */ + +#define MEMDUMP_BPL 16 // Bytes per line + +static void memory_dump(void) +{ + bool done = false; + short i; + uint8 mem[MEMDUMP_BPL + 2]; + uint8 byte; + + mem[MEMDUMP_BPL] = 0; + + if (!range_args(16 * MEMDUMP_BPL - 1)) // 16 lines unless end address specified + return; + + do { + fprintf(fout, "%04lx:", address); + for (i=0; i= ' ') && (byte <= '~')) + mem[i] = conv_from_64(byte); + else + mem[i] = '.'; + } + fprintf(fout, " '%s'\n", mem); + } while (!done && !aborted()); +} + + +/* + * ASCII dump + * i [start] [end] + */ + +#define ASCIIDUMP_BPL 64 // Bytes per line + +static void ascii_dump(void) +{ + bool done = false; + short i; + uint8 mem[ASCIIDUMP_BPL + 2]; + uint8 byte; + + mem[ASCIIDUMP_BPL] = 0; + + if (!range_args(16 * ASCIIDUMP_BPL - 1)) // 16 lines unless end address specified + return; + + do { + fprintf(fout, "%04lx:", address); + for (i=0; i= ' ') && (byte <= '~')) + mem[i] = conv_from_64(byte); + else + mem[i] = '.'; + } + fprintf(fout, " '%s'\n", mem); + } while (!done && !aborted()); +} + + +/* + * Convert PETSCII->ASCII + */ + +static char conv_from_64(char c) +{ + if ((c >= 'A') && (c <= 'Z') || (c >= 'a') && (c <= 'z')) + return c ^ 0x20; + else + return c; +} + + +/* + * Screen code dump + * n [start] [end] + */ + +#define SCRDUMP_BPL 64 // Bytes per line + +static void screen_dump(void) +{ + bool done = false; + short i; + uint8 mem[SCRDUMP_BPL + 2]; + uint8 byte; + + mem[SCRDUMP_BPL] = 0; + + if (!range_args(16 * SCRDUMP_BPL - 1)) // 16 Zeilen unless end address specified + return; + + do { + fprintf(fout, "%04lx:", address); + for (i=0; iASCII + */ + +static char conv_from_scode(char c) +{ + c &= 0x7f; + + if (c <= 31) + return c + 64; + else + if (c >= 64) + return c + 32; + else + return c; +} + + +/* + * Binary dump + * b [start] [end] + */ + +static void binary_dump(void) +{ + bool done = false; + char bin[10]; + + bin[8] = 0; + + if (!range_args(7)) // 8 lines unless end address specified + return; + + do { + if (address == end_address) done = true; + + byte_to_bin(SAMReadByte(address), bin); + fprintf(fout, "%04lx: %s\n", address++, bin); + } while (!done && !aborted()); +} + + +/* + * Sprite data dump + * p [start] [end] + */ + +static void sprite_dump(void) +{ + bool done = false; + short i; + char bin[10]; + + bin[8] = 0; + + if (!range_args(21 * 3 - 1)) // 21 lines unless end address specified + return; + + do { + fprintf(fout, "%04lx: ", address); + for (i=0; i<3; i++, address++) { + if (address == end_address) done = true; + + byte_to_bin(SAMReadByte(address), bin); + fprintf(fout, "%s", bin); + } + fputc('\n', fout); + } while (!done && !aborted()); +} + + +/* + * Convert byte to binary representation + */ + +static void byte_to_bin(uint8 byte, char *str) +{ + short i; + + for (i=0; i<8; i++, byte<<=1) + if (byte & 0x80) + str[i] = '#'; + else + str[i] = '.'; +} + + +/* + * Disassemble + * d [start] [end] + */ + +static void disassemble(void) +{ + bool done = false; + short i; + uint8 op[3]; + uint16 adr; + + if (!range_args(31)) // 32 bytes unless end address specified + return; + + do { + fprintf(fout, "%04lx:", adr = address); + for (i=0; i<3; i++, adr++) { + if (adr == end_address) done = true; + op[i] = SAMReadByte(adr); + } + address += disass_line(address, op[0], op[1], op[2]); + } while (!done && !aborted()); +} + + +/* + * Disassemble one instruction, return length + */ + +static int disass_line(uint16 adr, uint8 op, uint8 lo, uint8 hi) +{ + char mode = adr_mode[op], mnem = mnemonic[op]; + + // Display instruction bytes in hex + switch (adr_length[mode]) { + case 1: + fprintf(fout, " %02lx ", op); + break; + + case 2: + fprintf(fout, " %02lx %02lx ", op, lo); + break; + + case 3: + fprintf(fout, " %02lx %02lx %02lx ", op, lo, hi); + break; + } + + // Tag undocumented opcodes with an asterisk + if (mnem > M_ILLEGAL) + fputc('*', fout); + else + fputc(' ', fout); + + // Print mnemonic + fprintf(fout, "%c%c%c ", mnem_1[mnem], mnem_2[mnem], mnem_3[mnem]); + + // Pring argument + switch (mode) { + case A_IMPL: + break; + + case A_ACCU: + fprintf(fout, "a"); + break; + + case A_IMM: + fprintf(fout, "#%02lx", lo); + break; + + case A_REL: + fprintf(fout, "%04lx", ((adr + 2) + (int8)lo) & 0xffff); + break; + + case A_ZERO: + fprintf(fout, "%02lx", lo); + break; + + case A_ZEROX: + fprintf(fout, "%02lx,x", lo); + break; + + case A_ZEROY: + fprintf(fout, "%02lx,y", lo); + break; + + case A_ABS: + fprintf(fout, "%04lx", (hi << 8) | lo); + break; + + case A_ABSX: + fprintf(fout, "%04lx,x", (hi << 8) | lo); + break; + + case A_ABSY: + fprintf(fout, "%04lx,y", (hi << 8) | lo); + break; + + case A_IND: + fprintf(fout, "(%04lx)", (hi << 8) | lo); + break; + + case A_INDX: + fprintf(fout, "(%02lx,x)", lo); + break; + + case A_INDY: + fprintf(fout, "(%02lx),y", lo); + break; + } + + fputc('\n', fout); + return adr_length[mode]; +} + + +/* + * Assemble + * a [start] + */ + +static void assemble(void) +{ + bool done = false; + char c1, c2, c3; + char mnem, mode; + uint8 opcode; + uint16 arg; + int16 rel; + + // Read parameters + if (!address_args()) + return; + + do { + fprintf(fout, "%04lx> ", address); + fflush(ferr); + read_line(); + + c1 = get_char(); + c2 = get_char(); + c3 = get_char(); + + if (c1 != '\n') { + + if ((mnem = find_mnemonic(c1, c2, c3)) != M_ILLEGAL) { + + get_token(); + if (instr_args(&arg, &mode)) { + + // Convert A_IMPL -> A_ACCU if necessary + if ((mode == A_IMPL) && find_opcode(mnem, A_ACCU, &opcode)) + mode = A_ACCU; + + // Handle relative addressing seperately + if (((mode == A_ABS) || (mode == A_ZERO)) && find_opcode(mnem, A_REL, &opcode)) { + mode = A_REL; + rel = arg - (address + 2) & 0xffff; + if ((rel < -128) || (rel > 127)) { + error("Branch too long"); + continue; + } else + arg = rel & 0xff; + } + + if (find_opcode(mnem, mode, &opcode)) { + + // Print disassembled line + fprintf(fout, "\v%04lx:", address); + disass_line(address, opcode, arg & 0xff, arg >> 8); + + switch (adr_length[mode]) { + case 1: + SAMWriteByte(address++, opcode); + break; + + case 2: + SAMWriteByte(address++, opcode); + SAMWriteByte(address++, arg); + break; + + case 3: + SAMWriteByte(address++, opcode); + SAMWriteByte(address++, arg & 0xff); + SAMWriteByte(address++, arg >> 8); + break; + + default: + error("Internal error"); + break; + } + + } else + error("Addressing mode not supported by instruction"); + + } else + error("Unrecognized addressing mode"); + + } else + error("Unknown instruction"); + + } else // Input is terminated with a blank line + done = true; + } while (!done); +} + + +/* + * Find mnemonic code to three letters + * M_ILLEGAL: No matching mnemonic found + */ + +static char find_mnemonic(char op1, char op2, char op3) +{ + int i; + + for (i=0; iExtConfig = con; + else + con = TheCPU->ExtConfig; + + fprintf(fout, "Configuration: %ld\n", con & 7); + fprintf(fout, "A000-BFFF: %s\n", (con & 3) == 3 ? "Basic" : "RAM"); + fprintf(fout, "D000-DFFF: %s\n", (con & 3) ? ((con & 4) ? "I/O" : "Char") : "RAM"); + fprintf(fout, "E000-FFFF: %s\n", (con & 2) ? "Kernal" : "RAM"); +} + + +/* + * Fill + * f start end byte + */ + +static void fill(void) +{ + bool done = false; + uint16 adr, end_adr, value; + + if (!expression(&adr)) + return; + if (!expression(&end_adr)) + return; + if (!expression(&value)) + return; + + do { + if (adr == end_adr) done = true; + + SAMWriteByte(adr++, value); + } while (!done); +} + + +/* + * Compare + * c start end dest + */ + +static void compare(void) +{ + bool done = false; + uint16 adr, end_adr, dest; + int num = 0; + + if (!expression(&adr)) + return; + if (!expression(&end_adr)) + return; + if (!expression(&dest)) + return; + + do { + if (adr == end_adr) done = true; + + if (SAMReadByte(adr) != SAMReadByte(dest)) { + fprintf(fout, "%04lx ", adr); + num++; + if (!(num & 7)) + fputc('\n', fout); + } + adr++; dest++; + } while (!done && !aborted()); + + if (num & 7) + fputc('\n', fout); + fprintf(fout, "%ld byte(s) different\n", num); +} + + +/* + * Transfer memory + * t start end dest + */ + +static void transfer(void) +{ + bool done = false; + uint16 adr, end_adr, dest; + + if (!expression(&adr)) + return; + if (!expression(&end_adr)) + return; + if (!expression(&dest)) + return; + + if (dest < adr) + do { + if (adr == end_adr) done = true; + SAMWriteByte(dest++, SAMReadByte(adr++)); + } while (!done); + else { + dest += end_adr - adr; + do { + if (adr == end_adr) done = true; + SAMWriteByte(dest--, SAMReadByte(end_adr--)); + } while (!done); + } +} + + +/* + * Change memory + * : addr {byte} + */ + +static void modify(void) +{ + uint16 adr, val; + + if (!expression(&adr)) + return; + + while (the_token != T_END) + if (expression(&val)) + SAMWriteByte(adr++, val); + else + return; +} + + +/* + * Compute and display expression + * ? expression + */ + +static void print_expr(void) +{ + uint16 val; + + if (!expression(&val)) + return; + + fprintf(fout, "Hex: %04lx\nDec: %lu\n", val, val); +} + + +/* + * Redirect output + * o [file] + */ + +static void redir_output(void) +{ + // Close old file + if (fout != ferr) { + fclose(fout); + fout = ferr; + return; + } + + // No argument given? + if (the_token == T_END) + return; + + // Otherwise open file + if (the_token == T_STRING) { + if (!(fout = fopen(the_string, "w"))) + error("Unable to open file"); + } else + error("'\"' around file name expected"); +} + + +/* + * Display interrupt vectors + */ + +static void int_vectors(void) +{ + fprintf(fout, " IRQ BRK NMI\n"); + fprintf(fout, "%d : %04lx %04lx %04lx\n", + access_1541 ? 6502 : 6510, + SAMReadByte(0xffff) << 8 | SAMReadByte(0xfffe), + SAMReadByte(0xffff) << 8 | SAMReadByte(0xfffe), + SAMReadByte(0xfffb) << 8 | SAMReadByte(0xfffa)); + + if (!access_1541 && TheCPU->ExtConfig & 2) + fprintf(fout, "Kernal: %04lx %04lx %04lx\n", + SAMReadByte(0x0315) << 8 | SAMReadByte(0x0314), + SAMReadByte(0x0317) << 8 | SAMReadByte(0x0316), + SAMReadByte(0x0319) << 8 | SAMReadByte(0x0318)); +} + + +/* + * Display state of custom chips + */ + +static void view_state(void) +{ + switch (get_char()) { + case 'c': // CIA + view_cia_state(); + break; + + case 's': // SID + view_sid_state(); + break; + + case 'v': // VIC + view_vic_state(); + break; + + case 'f': // Floppy + view_1541_state(); + break; + + default: + error("Unknown command"); + break; + } +} + +static void view_cia_state(void) +{ + MOS6526State cs; + + switch (get_char()) { + case '1': + TheCIA1->GetState(&cs); + break; + case '2': + TheCIA2->GetState(&cs); + break; + default: + error("Unknown command"); + return; + } + + fprintf(fout, "Timer A : %s\n", cs.cra & 1 ? "On" : "Off"); + fprintf(fout, " Counter : %04lx Latch: %04lx\n", (cs.ta_hi << 8) | cs.ta_lo, cs.latcha); + fprintf(fout, " Run mode: %s\n", cs.cra & 8 ? "One-shot" : "Continuous"); + fprintf(fout, " Input : %s\n", cs.cra & 0x20 ? "CNT" : "Phi2"); + fprintf(fout, " Output : "); + if (cs.cra & 2) + if (cs.cra & 4) + fprintf(fout, "PB6 Toggle\n\n"); + else + fprintf(fout, "PB6 Pulse\n\n"); + else + fprintf(fout, "None\n\n"); + + fprintf(fout, "Timer B : %s\n", cs.crb & 1 ? "On" : "Off"); + fprintf(fout, " Counter : %04lx Latch: %04lx\n", (cs.tb_hi << 8) | cs.tb_lo, cs.latchb); + fprintf(fout, " Run mode: %s\n", cs.crb & 8 ? "One-shot" : "Continuous"); + fprintf(fout, " Input : "); + if (cs.crb & 0x40) + if (cs.crb & 0x20) + fprintf(fout, "Timer A underflow (CNT high)\n"); + else + fprintf(fout, "Timer A underflow\n"); + else + if (cs.crb & 0x20) + fprintf(fout, "CNT\n"); + else + fprintf(fout, "Phi2\n"); + fprintf(fout, " Output : "); + if (cs.crb & 2) + if (cs.crb & 4) + fprintf(fout, "PB7 Toggle\n\n"); + else + fprintf(fout, "PB7 Pulse\n\n"); + else + fprintf(fout, "None\n\n"); + + fprintf(fout, "TOD : %lx%lx:%lx%lx:%lx%lx.%lx %s\n", + (cs.tod_hr >> 4) & 1, cs.tod_hr & 0x0f, + (cs.tod_min >> 4) & 7, cs.tod_min & 0x0f, + (cs.tod_sec >> 4) & 7, cs.tod_sec & 0x0f, + cs.tod_10ths & 0x0f, cs.tod_hr & 0x80 ? "PM" : "AM"); + fprintf(fout, "Alarm : %lx%lx:%lx%lx:%lx%lx.%lx %s\n", + (cs.alm_hr >> 4) & 1, cs.alm_hr & 0x0f, + (cs.alm_min >> 4) & 7, cs.alm_min & 0x0f, + (cs.alm_sec >> 4) & 7, cs.alm_sec & 0x0f, + cs.alm_10ths & 0x0f, cs.alm_hr & 0x80 ? "PM" : "AM"); + fprintf(fout, "TOD input : %s\n", cs.cra & 0x80 ? "50Hz" : "60Hz"); + fprintf(fout, "Write to : %s registers\n\n", cs.crb & 0x80 ? "Alarm" : "TOD"); + + fprintf(fout, "Serial data : %02lx\n", cs.sdr); + fprintf(fout, "Serial mode : %s\n\n", cs.cra & 0x40 ? "Output" : "Input"); + + fprintf(fout, "Pending int.: "); + dump_cia_ints(cs.int_data); + fprintf(fout, "Enabled int.: "); + dump_cia_ints(cs.int_mask); +} + +static void dump_cia_ints(uint8 i) +{ + if (i & 0x1f) { + if (i & 1) fprintf(fout, "TA "); + if (i & 2) fprintf(fout, "TB "); + if (i & 4) fprintf(fout, "Alarm "); + if (i & 8) fprintf(fout, "Serial "); + if (i & 0x10) fprintf(fout, "Flag"); + } else + fprintf(fout, "None"); + fputc('\n', fout); +} + +static void view_sid_state(void) +{ + MOS6581State ss; + + TheSID->GetState(&ss); + + fprintf(fout, "Voice 1\n"); + fprintf(fout, " Frequency : %04lx\n", (ss.freq_hi_1 << 8) | ss.freq_lo_1); + fprintf(fout, " Pulse Width: %04lx\n", ((ss.pw_hi_1 & 0x0f) << 8) | ss.pw_lo_1); + fprintf(fout, " Env. (ADSR): %lx %lx %lx %lx\n", ss.AD_1 >> 4, ss.AD_1 & 0x0f, ss.SR_1 >> 4, ss.SR_1 & 0x0f); + fprintf(fout, " Waveform : "); + dump_sid_waveform(ss.ctrl_1); + fprintf(fout, " Gate : %s Ring mod.: %s\n", ss.ctrl_1 & 0x01 ? "On " : "Off", ss.ctrl_1 & 0x04 ? "On" : "Off"); + fprintf(fout, " Test bit : %s Synchron.: %s\n", ss.ctrl_1 & 0x08 ? "On " : "Off", ss.ctrl_1 & 0x02 ? "On" : "Off"); + fprintf(fout, " Filter : %s\n", ss.res_filt & 0x01 ? "On" : "Off"); + + fprintf(fout, "\nVoice 2\n"); + fprintf(fout, " Frequency : %04lx\n", (ss.freq_hi_2 << 8) | ss.freq_lo_2); + fprintf(fout, " Pulse Width: %04lx\n", ((ss.pw_hi_2 & 0x0f) << 8) | ss.pw_lo_2); + fprintf(fout, " Env. (ADSR): %lx %lx %lx %lx\n", ss.AD_2 >> 4, ss.AD_2 & 0x0f, ss.SR_2 >> 4, ss.SR_2 & 0x0f); + fprintf(fout, " Waveform : "); + dump_sid_waveform(ss.ctrl_2); + fprintf(fout, " Gate : %s Ring mod.: %s\n", ss.ctrl_2 & 0x01 ? "On " : "Off", ss.ctrl_2 & 0x04 ? "On" : "Off"); + fprintf(fout, " Test bit : %s Synchron.: %s\n", ss.ctrl_2 & 0x08 ? "On " : "Off", ss.ctrl_2 & 0x02 ? "On" : "Off"); + fprintf(fout, " Filter : %s\n", ss.res_filt & 0x02 ? "On" : "Off"); + + fprintf(fout, "\nVoice 3\n"); + fprintf(fout, " Frequency : %04lx\n", (ss.freq_hi_3 << 8) | ss.freq_lo_3); + fprintf(fout, " Pulse Width: %04lx\n", ((ss.pw_hi_3 & 0x0f) << 8) | ss.pw_lo_3); + fprintf(fout, " Env. (ADSR): %lx %lx %lx %lx\n", ss.AD_3 >> 4, ss.AD_3 & 0x0f, ss.SR_3 >> 4, ss.SR_3 & 0x0f); + fprintf(fout, " Waveform : "); + dump_sid_waveform(ss.ctrl_3); + fprintf(fout, " Gate : %s Ring mod.: %s\n", ss.ctrl_3 & 0x01 ? "On " : "Off", ss.ctrl_3 & 0x04 ? "On" : "Off"); + fprintf(fout, " Test bit : %s Synchron.: %s\n", ss.ctrl_3 & 0x08 ? "On " : "Off", ss.ctrl_3 & 0x02 ? "On" : "Off"); + fprintf(fout, " Filter : %s Mute : %s\n", ss.res_filt & 0x04 ? "On" : "Off", ss.mode_vol & 0x80 ? "Yes" : "No"); + + fprintf(fout, "\nFilters/Volume\n"); + fprintf(fout, " Frequency: %04lx\n", (ss.fc_hi << 3) | (ss.fc_lo & 0x07)); + fprintf(fout, " Resonance: %lx\n", ss.res_filt >> 4); + fprintf(fout, " Mode : "); + if (ss.mode_vol & 0x70) { + if (ss.mode_vol & 0x10) fprintf(fout, "Low-pass "); + if (ss.mode_vol & 0x20) fprintf(fout, "Band-pass "); + if (ss.mode_vol & 0x40) fprintf(fout, "High-pass"); + } else + fprintf(fout, "None"); + fprintf(fout, "\n Volume : %lx\n", ss.mode_vol & 0x0f); +} + +static void dump_sid_waveform(uint8 wave) +{ + if (wave & 0xf0) { + if (wave & 0x10) fprintf(fout, "Triangle "); + if (wave & 0x20) fprintf(fout, "Sawtooth "); + if (wave & 0x40) fprintf(fout, "Rectangle "); + if (wave & 0x80) fprintf(fout, "Noise"); + } else + fprintf(fout, "None"); + fputc('\n', fout); +} + +static void view_vic_state(void) +{ + MOS6569State vs; + short i; + + TheVIC->GetState(&vs); + + fprintf(fout, "Raster line : %04lx\n", vs.raster | ((vs.ctrl1 & 0x80) << 1)); + fprintf(fout, "IRQ raster line : %04lx\n\n", vs.irq_raster); + + fprintf(fout, "X scroll : %ld\n", vs.ctrl2 & 7); + fprintf(fout, "Y scroll : %ld\n", vs.ctrl1 & 7); + fprintf(fout, "Horizontal border : %ld columns\n", vs.ctrl2 & 8 ? 40 : 38); + fprintf(fout, "Vertical border : %ld rows\n\n", vs.ctrl1 & 8 ? 25 : 24); + + fprintf(fout, "Display mode : "); + switch (((vs.ctrl1 >> 4) & 6) | ((vs.ctrl2 >> 4) & 1)) { + case 0: + fprintf(fout, "Standard text\n"); + break; + case 1: + fprintf(fout, "Multicolor text\n"); + break; + case 2: + fprintf(fout, "Standard bitmap\n"); + break; + case 3: + fprintf(fout, "Multicolor bitmap\n"); + break; + case 4: + fprintf(fout, "ECM text\n"); + break; + case 5: + fprintf(fout, "Invalid text (ECM+MCM)\n"); + break; + case 6: + fprintf(fout, "Invalid bitmap (ECM+BMM)\n"); + break; + case 7: + fprintf(fout, "Invalid bitmap (ECM+BMM+ECM)\n"); + break; + } + fprintf(fout, "Sequencer state : %s\n", vs.display_state ? "Display" : "Idle"); + fprintf(fout, "Bad line state : %s\n", vs.bad_line ? "Yes" : "No"); + fprintf(fout, "Bad lines enabled : %s\n", vs.bad_line_enable ? "Yes" : "No"); + fprintf(fout, "Video counter : %04lx\n", vs.vc); + fprintf(fout, "Video counter base: %04lx\n", vs.vc_base); + fprintf(fout, "Row counter : %ld\n\n", vs.rc); + + fprintf(fout, "VIC bank : %04lx-%04lx\n", vs.bank_base, vs.bank_base + 0x3fff); + fprintf(fout, "Video matrix base : %04lx\n", vs.matrix_base); + fprintf(fout, "Character base : %04lx\n", vs.char_base); + fprintf(fout, "Bitmap base : %04lx\n\n", vs.bitmap_base); + + fprintf(fout, " Spr.0 Spr.1 Spr.2 Spr.3 Spr.4 Spr.5 Spr.6 Spr.7\n"); + fprintf(fout, "Enabled: "); dump_spr_flags(vs.me); + fprintf(fout, "Data : %04lx %04lx %04lx %04lx %04lx %04lx %04lx %04lx\n", + vs.sprite_base[0], vs.sprite_base[1], vs.sprite_base[2], vs.sprite_base[3], + vs.sprite_base[4], vs.sprite_base[5], vs.sprite_base[6], vs.sprite_base[7]); + fprintf(fout, "MC : %02lx %02lx %02lx %02lx %02lx %02lx %02lx %02lx\n", + vs.mc[0], vs.mc[1], vs.mc[2], vs.mc[3], vs.mc[4], vs.mc[5], vs.mc[6], vs.mc[7]); + + fprintf(fout, "Mode : "); + for (i=0; i<8; i++) + if (vs.mmc & (1< + +#include "SID.h" +#include "Prefs.h" + +#ifdef USE_FIXPOINT_MATHS +#include "FixPoint.i" +#endif + + +/* + * Resonance frequency polynomials + */ + +#define CALC_RESONANCE_LP(f) (227.755\ + - 1.7635 * f\ + - 0.0176385 * f * f\ + + 0.00333484 * f * f * f\ + - 9.05683E-6 * f * f * f * f) + +#define CALC_RESONANCE_HP(f) (366.374\ + - 14.0052 * f\ + + 0.603212 * f * f\ + - 0.000880196 * f * f * f) + + +/* + * Random number generator for noise waveform + */ + +static uint8 sid_random(void); +static uint8 sid_random(void) +{ + static uint32 seed = 1; + seed = seed * 1103515245 + 12345; + return seed >> 16; +} + + +/* + * Constructor + */ + +MOS6581::MOS6581(C64 *c64) : the_c64(c64) +{ + the_renderer = NULL; + for (int i=0; i<32; i++) + regs[i] = 0; + + // Open the renderer + open_close_renderer(SIDTYPE_NONE, ThePrefs.SIDType); +} + + +/* + * Destructor + */ + +MOS6581::~MOS6581() +{ + // Close the renderer + open_close_renderer(ThePrefs.SIDType, SIDTYPE_NONE); +} + + +/* + * Reset the SID + */ + +void MOS6581::Reset(void) +{ + for (int i=0; i<32; i++) + regs[i] = 0; + last_sid_byte = 0; + + // Reset the renderer + if (the_renderer != NULL) + the_renderer->Reset(); +} + + +/* + * Preferences may have changed + */ + +void MOS6581::NewPrefs(Prefs *prefs) +{ + open_close_renderer(ThePrefs.SIDType, prefs->SIDType); + if (the_renderer != NULL) + the_renderer->NewPrefs(prefs); +} + + +/* + * Pause sound output + */ + +void MOS6581::PauseSound(void) +{ + if (the_renderer != NULL) + the_renderer->Pause(); +} + + +/* + * Resume sound output + */ + +void MOS6581::ResumeSound(void) +{ + if (the_renderer != NULL) + the_renderer->Resume(); +} + + +/* + * Get SID state + */ + +void MOS6581::GetState(MOS6581State *ss) +{ + ss->freq_lo_1 = regs[0]; + ss->freq_hi_1 = regs[1]; + ss->pw_lo_1 = regs[2]; + ss->pw_hi_1 = regs[3]; + ss->ctrl_1 = regs[4]; + ss->AD_1 = regs[5]; + ss->SR_1 = regs[6]; + + ss->freq_lo_2 = regs[7]; + ss->freq_hi_2 = regs[8]; + ss->pw_lo_2 = regs[9]; + ss->pw_hi_2 = regs[10]; + ss->ctrl_2 = regs[11]; + ss->AD_2 = regs[12]; + ss->SR_2 = regs[13]; + + ss->freq_lo_3 = regs[14]; + ss->freq_hi_3 = regs[15]; + ss->pw_lo_3 = regs[16]; + ss->pw_hi_3 = regs[17]; + ss->ctrl_3 = regs[18]; + ss->AD_3 = regs[19]; + ss->SR_3 = regs[20]; + + ss->fc_lo = regs[21]; + ss->fc_hi = regs[22]; + ss->res_filt = regs[23]; + ss->mode_vol = regs[24]; + + ss->pot_x = 0xff; + ss->pot_y = 0xff; + ss->osc_3 = 0; + ss->env_3 = 0; +} + + +/* + * Restore SID state + */ + +void MOS6581::SetState(MOS6581State *ss) +{ + regs[0] = ss->freq_lo_1; + regs[1] = ss->freq_hi_1; + regs[2] = ss->pw_lo_1; + regs[3] = ss->pw_hi_1; + regs[4] = ss->ctrl_1; + regs[5] = ss->AD_1; + regs[6] = ss->SR_1; + + regs[7] = ss->freq_lo_2; + regs[8] = ss->freq_hi_2; + regs[9] = ss->pw_lo_2; + regs[10] = ss->pw_hi_2; + regs[11] = ss->ctrl_2; + regs[12] = ss->AD_2; + regs[13] = ss->SR_2; + + regs[14] = ss->freq_lo_3; + regs[15] = ss->freq_hi_3; + regs[16] = ss->pw_lo_3; + regs[17] = ss->pw_hi_3; + regs[18] = ss->ctrl_3; + regs[19] = ss->AD_3; + regs[20] = ss->SR_3; + + regs[21] = ss->fc_lo; + regs[22] = ss->fc_hi; + regs[23] = ss->res_filt; + regs[24] = ss->mode_vol; + + // Stuff the new register values into the renderer + if (the_renderer != NULL) + for (int i=0; i<25; i++) + the_renderer->WriteRegister(i, regs[i]); +} + + +/** + ** Renderer for digital SID emulation (SIDTYPE_DIGITAL) + **/ + +const uint32 SAMPLE_FREQ = 44100; // Sample output frequency in Hz +const uint32 SID_FREQ = 985248; // SID frequency in Hz +const uint32 CALC_FREQ = 50; // Frequency at which calc_buffer is called in Hz (should be 50Hz) +const uint32 SID_CYCLES = SID_FREQ/SAMPLE_FREQ; // # of SID clocks per sample frame +const int SAMPLE_BUF_SIZE = 0x138*2;// Size of buffer for sampled voice (double buffered) + +// SID waveforms (some of them :-) +enum { + WAVE_NONE, + WAVE_TRI, + WAVE_SAW, + WAVE_TRISAW, + WAVE_RECT, + WAVE_TRIRECT, + WAVE_SAWRECT, + WAVE_TRISAWRECT, + WAVE_NOISE +}; + +// EG states +enum { + EG_IDLE, + EG_ATTACK, + EG_DECAY, + EG_RELEASE +}; + +// Filter types +enum { + FILT_NONE, + FILT_LP, + FILT_BP, + FILT_LPBP, + FILT_HP, + FILT_NOTCH, + FILT_HPBP, + FILT_ALL +}; + +// Structure for one voice +struct DRVoice { + int wave; // Selected waveform + int eg_state; // Current state of EG + DRVoice *mod_by; // Voice that modulates this one + DRVoice *mod_to; // Voice that is modulated by this one + + uint32 count; // Counter for waveform generator, 8.16 fixed + uint32 add; // Added to counter in every frame + + uint16 freq; // SID frequency value + uint16 pw; // SID pulse-width value + + uint32 a_add; // EG parameters + uint32 d_sub; + uint32 s_level; + uint32 r_sub; + uint32 eg_level; // Current EG level, 8.16 fixed + + uint32 noise; // Last noise generator output value + + bool gate; // EG gate bit + bool ring; // Ring modulation bit + bool test; // Test bit + bool filter; // Flag: Voice filtered + + // The following bit is set for the modulating + // voice, not for the modulated one (as the SID bits) + bool sync; // Sync modulation bit +}; + +// Renderer class +class DigitalRenderer : public SIDRenderer { +public: + DigitalRenderer(); + virtual ~DigitalRenderer(); + + virtual void Reset(void); + virtual void EmulateLine(void); + virtual void WriteRegister(uint16 adr, uint8 byte); + virtual void NewPrefs(Prefs *prefs); + virtual void Pause(void); + virtual void Resume(void); + +private: + void init_sound(void); + void calc_filter(void); + void calc_buffer(int16 *buf, long count); + + bool ready; // Flag: Renderer has initialized and is ready + uint8 volume; // Master volume + bool v3_mute; // Voice 3 muted + + static uint16 TriTable[0x1000*2]; // Tables for certain waveforms + static const uint16 TriSawTable[0x100]; + static const uint16 TriRectTable[0x100]; + static const uint16 SawRectTable[0x100]; + static const uint16 TriSawRectTable[0x100]; + static const uint32 EGTable[16]; // Increment/decrement values for all A/D/R settings + static const uint8 EGDRShift[256]; // For exponential approximation of D/R + static const int16 SampleTab[16]; // Table for sampled voice + + DRVoice voice[3]; // Data for 3 voices + + uint8 f_type; // Filter type + uint8 f_freq; // SID filter frequency (upper 8 bits) + uint8 f_res; // Filter resonance (0..15) +#ifdef USE_FIXPOINT_MATHS + FixPoint f_ampl; + FixPoint d1, d2, g1, g2; + int32 xn1, xn2, yn1, yn2; // can become very large + FixPoint sidquot; +#ifdef PRECOMPUTE_RESONANCE + FixPoint resonanceLP[256]; + FixPoint resonanceHP[256]; +#endif +#else + float f_ampl; // IIR filter input attenuation + float d1, d2, g1, g2; // IIR filter coefficients + float xn1, xn2, yn1, yn2; // IIR filter previous input/output signal +#ifdef PRECOMPUTE_RESONANCE + float resonanceLP[256]; // shortcut for calc_filter + float resonanceHP[256]; +#endif +#endif + + uint8 sample_buf[SAMPLE_BUF_SIZE]; // Buffer for sampled voice + int sample_in_ptr; // Index in sample_buf for writing + + int devfd, sndbufsize, buffer_rate; + int16 *sound_buffer; +}; + +// Static data members +uint16 DigitalRenderer::TriTable[0x1000*2]; + +#ifndef EMUL_MOS8580 +// Sampled from a 6581R4 +const uint16 DigitalRenderer::TriSawTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0808, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1010, 0x3C3C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0808, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1010, 0x3C3C +}; + +const uint16 DigitalRenderer::TriRectTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, 0xC0C0, + 0x0000, 0x8080, 0x8080, 0xE0E0, 0x8080, 0xE0E0, 0xF0F0, 0xFCFC, + 0xFFFF, 0xFCFC, 0xFAFA, 0xF0F0, 0xF6F6, 0xE0E0, 0xE0E0, 0x8080, + 0xEEEE, 0xE0E0, 0xE0E0, 0x8080, 0xC0C0, 0x0000, 0x0000, 0x0000, + 0xDEDE, 0xC0C0, 0xC0C0, 0x0000, 0x8080, 0x0000, 0x0000, 0x0000, + 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xBEBE, 0x8080, 0x8080, 0x0000, 0x8080, 0x0000, 0x0000, 0x0000, + 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7E7E, 0x4040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +const uint16 DigitalRenderer::SawRectTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7878, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7878 +}; + +const uint16 DigitalRenderer::TriSawRectTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; +#else +// Sampled from an 8580R5 +const uint16 DigitalRenderer::TriSawTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0808, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x3C3C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1C1C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, 0x0000, 0x8080, 0x8080, + 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xE0E0, + 0xF0F0, 0xF0F0, 0xF0F0, 0xF0F0, 0xF8F8, 0xF8F8, 0xFCFC, 0xFEFE +}; + +const uint16 DigitalRenderer::TriRectTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFFF, 0xFCFC, 0xF8F8, 0xF0F0, 0xF4F4, 0xF0F0, 0xF0F0, 0xE0E0, + 0xECEC, 0xE0E0, 0xE0E0, 0xC0C0, 0xE0E0, 0xC0C0, 0xC0C0, 0xC0C0, + 0xDCDC, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0x8080, 0x8080, + 0xC0C0, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x0000, 0x0000, + 0xBEBE, 0xA0A0, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x0000, + 0x8080, 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7E7E, 0x7070, 0x6060, 0x0000, 0x4040, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +const uint16 DigitalRenderer::SawRectTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, 0x8080, + 0x0000, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0xB0B0, 0xBEBE, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, + 0x0000, 0x0000, 0x0000, 0x8080, 0x8080, 0x8080, 0x8080, 0xC0C0, + 0x0000, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0xC0C0, + 0x8080, 0x8080, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xDCDC, + 0x8080, 0x8080, 0x8080, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, + 0xC0C0, 0xC0C0, 0xC0C0, 0xE0E0, 0xE0E0, 0xE0E0, 0xE0E0, 0xECEC, + 0xC0C0, 0xE0E0, 0xE0E0, 0xE0E0, 0xE0E0, 0xF0F0, 0xF0F0, 0xF4F4, + 0xF0F0, 0xF0F0, 0xF8F8, 0xF8F8, 0xF8F8, 0xFCFC, 0xFEFE, 0xFFFF +}; + +const uint16 DigitalRenderer::TriSawRectTable[0x100] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8080, 0x8080, + 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0xC0C0, 0xC0C0, + 0xC0C0, 0xC0C0, 0xE0E0, 0xE0E0, 0xE0E0, 0xF0F0, 0xF8F8, 0xFCFC +}; +#endif + +const uint32 DigitalRenderer::EGTable[16] = { + (SID_CYCLES << 16) / 9, (SID_CYCLES << 16) / 32, + (SID_CYCLES << 16) / 63, (SID_CYCLES << 16) / 95, + (SID_CYCLES << 16) / 149, (SID_CYCLES << 16) / 220, + (SID_CYCLES << 16) / 267, (SID_CYCLES << 16) / 313, + (SID_CYCLES << 16) / 392, (SID_CYCLES << 16) / 977, + (SID_CYCLES << 16) / 1954, (SID_CYCLES << 16) / 3126, + (SID_CYCLES << 16) / 3906, (SID_CYCLES << 16) / 11720, + (SID_CYCLES << 16) / 19531, (SID_CYCLES << 16) / 31251 +}; + +const uint8 DigitalRenderer::EGDRShift[256] = { + 5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4, + 3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +const int16 DigitalRenderer::SampleTab[16] = { + 0x8000, 0x9111, 0xa222, 0xb333, 0xc444, 0xd555, 0xe666, 0xf777, + 0x0888, 0x1999, 0x2aaa, 0x3bbb, 0x4ccc, 0x5ddd, 0x6eee, 0x7fff, +}; + + +/* + * Constructor + */ + +DigitalRenderer::DigitalRenderer() +{ + // Link voices together + voice[0].mod_by = &voice[2]; + voice[1].mod_by = &voice[0]; + voice[2].mod_by = &voice[1]; + voice[0].mod_to = &voice[1]; + voice[1].mod_to = &voice[2]; + voice[2].mod_to = &voice[0]; + + // Calculate triangle table + for (int i=0; i<0x1000; i++) { + TriTable[i] = (i << 4) | (i >> 8); + TriTable[0x1fff-i] = (i << 4) | (i >> 8); + } + +#ifdef PRECOMPUTE_RESONANCE +#ifdef USE_FIXPOINT_MATHS + // slow floating point doesn't matter much on startup! + for (int i=0; i<256; i++) { + resonanceLP[i] = FixNo(CALC_RESONANCE_LP(i)); + resonanceHP[i] = FixNo(CALC_RESONANCE_HP(i)); + } + // Pre-compute the quotient. No problem since int-part is small enough + sidquot = (int32)((((double)SID_FREQ)*65536) / SAMPLE_FREQ); + // compute lookup table for sin and cos + InitFixSinTab(); +#else + for (int i=0; i<256; i++) { + resonanceLP[i] = CALC_RESONANCE_LP(i); + resonanceHP[i] = CALC_RESONANCE_HP(i); + } +#endif +#endif + + Reset(); + + // System specific initialization + init_sound(); +} + + +/* + * Reset emulation + */ + +void DigitalRenderer::Reset(void) +{ + volume = 0; + v3_mute = false; + + for (int v=0; v<3; v++) { + voice[v].wave = WAVE_NONE; + voice[v].eg_state = EG_IDLE; + voice[v].count = voice[v].add = 0; + voice[v].freq = voice[v].pw = 0; + voice[v].eg_level = voice[v].s_level = 0; + voice[v].a_add = voice[v].d_sub = voice[v].r_sub = EGTable[0]; + voice[v].gate = voice[v].ring = voice[v].test = false; + voice[v].filter = voice[v].sync = false; + } + + f_type = FILT_NONE; + f_freq = f_res = 0; +#ifdef USE_FIXPOINT_MATHS + f_ampl = FixNo(1); + d1 = d2 = g1 = g2 = 0; + xn1 = xn2 = yn1 = yn2 = 0; +#else + f_ampl = 1.0; + d1 = d2 = g1 = g2 = 0.0; + xn1 = xn2 = yn1 = yn2 = 0.0; +#endif + + sample_in_ptr = 0; + memset(sample_buf, 0, SAMPLE_BUF_SIZE); +} + + +/* + * Write to register + */ + +void DigitalRenderer::WriteRegister(uint16 adr, uint8 byte) +{ + if (!ready) + return; + + int v = adr/7; // Voice number + + switch (adr) { + case 0: + case 7: + case 14: + voice[v].freq = (voice[v].freq & 0xff00) | byte; +#ifdef USE_FIXPOINT_MATHS + voice[v].add = sidquot.imul((int)voice[v].freq); +#else + voice[v].add = (uint32)((float)voice[v].freq * SID_FREQ / SAMPLE_FREQ); +#endif + break; + + case 1: + case 8: + case 15: + voice[v].freq = (voice[v].freq & 0xff) | (byte << 8); +#ifdef USE_FIXPOINT_MATHS + voice[v].add = sidquot.imul((int)voice[v].freq); +#else + voice[v].add = (uint32)((float)voice[v].freq * SID_FREQ / SAMPLE_FREQ); +#endif + break; + + case 2: + case 9: + case 16: + voice[v].pw = (voice[v].pw & 0x0f00) | byte; + break; + + case 3: + case 10: + case 17: + voice[v].pw = (voice[v].pw & 0xff) | ((byte & 0xf) << 8); + break; + + case 4: + case 11: + case 18: + voice[v].wave = (byte >> 4) & 0xf; + if ((byte & 1) != voice[v].gate) + if (byte & 1) // Gate turned on + voice[v].eg_state = EG_ATTACK; + else // Gate turned off + if (voice[v].eg_state != EG_IDLE) + voice[v].eg_state = EG_RELEASE; + voice[v].gate = byte & 1; + voice[v].mod_by->sync = byte & 2; + voice[v].ring = byte & 4; + if ((voice[v].test = byte & 8)) + voice[v].count = 0; + break; + + case 5: + case 12: + case 19: + voice[v].a_add = EGTable[byte >> 4]; + voice[v].d_sub = EGTable[byte & 0xf]; + break; + + case 6: + case 13: + case 20: + voice[v].s_level = (byte >> 4) * 0x111111; + voice[v].r_sub = EGTable[byte & 0xf]; + break; + + case 22: + if (byte != f_freq) { + f_freq = byte; + if (ThePrefs.SIDFilters) + calc_filter(); + } + break; + + case 23: + voice[0].filter = byte & 1; + voice[1].filter = byte & 2; + voice[2].filter = byte & 4; + if ((byte >> 4) != f_res) { + f_res = byte >> 4; + if (ThePrefs.SIDFilters) + calc_filter(); + } + break; + + case 24: + volume = byte & 0xf; + v3_mute = byte & 0x80; + if (((byte >> 4) & 7) != f_type) { + f_type = (byte >> 4) & 7; +#ifdef USE_FIXPOINT_MATHS + xn1 = xn2 = yn1 = yn2 = 0; +#else + xn1 = xn2 = yn1 = yn2 = 0.0; +#endif + if (ThePrefs.SIDFilters) + calc_filter(); + } + break; + } +} + + +/* + * Preferences may have changed + */ + +void DigitalRenderer::NewPrefs(Prefs *prefs) +{ + calc_filter(); +} + + +/* + * Calculate IIR filter coefficients + */ + +void DigitalRenderer::calc_filter(void) +{ +#ifdef USE_FIXPOINT_MATHS + FixPoint fr, arg; + + if (f_type == FILT_ALL) + { + d1 = 0; d2 = 0; g1 = 0; g2 = 0; f_ampl = FixNo(1); return; + } + else if (f_type == FILT_NONE) + { + d1 = 0; d2 = 0; g1 = 0; g2 = 0; f_ampl = 0; return; + } +#else + float fr, arg; + + // Check for some trivial cases + if (f_type == FILT_ALL) { + d1 = 0.0; d2 = 0.0; + g1 = 0.0; g2 = 0.0; + f_ampl = 1.0; + return; + } else if (f_type == FILT_NONE) { + d1 = 0.0; d2 = 0.0; + g1 = 0.0; g2 = 0.0; + f_ampl = 0.0; + return; + } +#endif + + // Calculate resonance frequency + if (f_type == FILT_LP || f_type == FILT_LPBP) +#ifdef PRECOMPUTE_RESONANCE + fr = resonanceLP[f_freq]; +#else + fr = CALC_RESONANCE_LP(f_freq); +#endif + else +#ifdef PRECOMPUTE_RESONANCE + fr = resonanceHP[f_freq]; +#else + fr = CALC_RESONANCE_HP(f_freq); +#endif + +#ifdef USE_FIXPOINT_MATHS + // explanations see below. + arg = fr / (SAMPLE_FREQ >> 1); + if (arg > FixNo(0.99)) {arg = FixNo(0.99);} + if (arg < FixNo(0.01)) {arg = FixNo(0.01);} + + g2 = FixNo(0.55) + FixNo(1.2) * arg * (arg - 1) + FixNo(0.0133333333) * f_res; + g1 = FixNo(-2) * g2.sqrt() * fixcos(arg); + + if (f_type == FILT_LPBP || f_type == FILT_HPBP) {g2 += FixNo(0.1);} + + if (g1.abs() >= g2 + 1) + { + if (g1 > 0) {g1 = g2 + FixNo(0.99);} + else {g1 = -(g2 + FixNo(0.99));} + } + + switch (f_type) + { + case FILT_LPBP: + case FILT_LP: + d1 = FixNo(2); d2 = FixNo(1); f_ampl = FixNo(0.25) * (1 + g1 + g2); break; + case FILT_HPBP: + case FILT_HP: + d1 = FixNo(-2); d2 = FixNo(1); f_ampl = FixNo(0.25) * (1 - g1 + g2); break; + case FILT_BP: + d1 = 0; d2 = FixNo(-1); + f_ampl = FixNo(0.25) * (1 + g1 + g2) * (1 + fixcos(arg)) / fixsin(arg); + break; + case FILT_NOTCH: + d1 = FixNo(-2) * fixcos(arg); d2 = FixNo(1); + f_ampl = FixNo(0.25) * (1 + g1 + g2) * (1 + fixcos(arg)) / fixsin(arg); + break; + default: break; + } + +#else + + // Limit to <1/2 sample frequency, avoid div by 0 in case FILT_BP below + arg = fr / (float)(SAMPLE_FREQ >> 1); + if (arg > 0.99) + arg = 0.99; + if (arg < 0.01) + arg = 0.01; + + // Calculate poles (resonance frequency and resonance) + g2 = 0.55 + 1.2 * arg * arg - 1.2 * arg + (float)f_res * 0.0133333333; + g1 = -2.0 * sqrt(g2) * cos(M_PI * arg); + + // Increase resonance if LP/HP combined with BP + if (f_type == FILT_LPBP || f_type == FILT_HPBP) + g2 += 0.1; + + // Stabilize filter + if (fabs(g1) >= g2 + 1.0) + if (g1 > 0.0) + g1 = g2 + 0.99; + else + g1 = -(g2 + 0.99); + + // Calculate roots (filter characteristic) and input attenuation + switch (f_type) { + + case FILT_LPBP: + case FILT_LP: + d1 = 2.0; d2 = 1.0; + f_ampl = 0.25 * (1.0 + g1 + g2); + break; + + case FILT_HPBP: + case FILT_HP: + d1 = -2.0; d2 = 1.0; + f_ampl = 0.25 * (1.0 - g1 + g2); + break; + + case FILT_BP: + d1 = 0.0; d2 = -1.0; + f_ampl = 0.25 * (1.0 + g1 + g2) * (1 + cos(M_PI * arg)) / sin(M_PI * arg); + break; + + case FILT_NOTCH: + d1 = -2.0 * cos(M_PI * arg); d2 = 1.0; + f_ampl = 0.25 * (1.0 + g1 + g2) * (1 + cos(M_PI * arg)) / (sin(M_PI * arg)); + break; + + default: + break; + } +#endif +} + + +/* + * Fill one audio buffer with calculated SID sound + */ + +void DigitalRenderer::calc_buffer(int16 *buf, long count) +{ + // Get filter coefficients, so the emulator won't change + // them in the middle of our calculations +#ifdef USE_FIXPOINT_MATHS + FixPoint cf_ampl = f_ampl; + FixPoint cd1 = d1, cd2 = d2, cg1 = g1, cg2 = g2; +#else + float cf_ampl = f_ampl; + float cd1 = d1, cd2 = d2, cg1 = g1, cg2 = g2; +#endif + + // Index in sample_buf for reading, 16.16 fixed + uint32 sample_count = (sample_in_ptr + SAMPLE_BUF_SIZE/2) << 16; + + count >>= 1; // 16 bit mono output, count is in bytes + while (count--) { + int32 sum_output; + int32 sum_output_filter = 0; + + // Get current master volume from sample buffer, + // calculate sampled voice + uint8 master_volume = sample_buf[(sample_count >> 16) % SAMPLE_BUF_SIZE]; + sample_count += ((0x138 * 50) << 16) / SAMPLE_FREQ; + sum_output = SampleTab[master_volume] << 8; + + // Loop for all three voices + for (int j=0; j<3; j++) { + DRVoice *v = &voice[j]; + + // Envelope generators + uint16 envelope; + + switch (v->eg_state) { + case EG_ATTACK: + v->eg_level += v->a_add; + if (v->eg_level > 0xffffff) { + v->eg_level = 0xffffff; + v->eg_state = EG_DECAY; + } + break; + case EG_DECAY: + if (v->eg_level <= v->s_level || v->eg_level > 0xffffff) + v->eg_level = v->s_level; + else { + v->eg_level -= v->d_sub >> EGDRShift[v->eg_level >> 16]; + if (v->eg_level <= v->s_level || v->eg_level > 0xffffff) + v->eg_level = v->s_level; + } + break; + case EG_RELEASE: + v->eg_level -= v->r_sub >> EGDRShift[v->eg_level >> 16]; + if (v->eg_level > 0xffffff) { + v->eg_level = 0; + v->eg_state = EG_IDLE; + } + break; + case EG_IDLE: + v->eg_level = 0; + break; + } + envelope = (v->eg_level * master_volume) >> 20; + + // Waveform generator + uint16 output; + + if (!v->test) + v->count += v->add; + + if (v->sync && (v->count > 0x1000000)) + v->mod_to->count = 0; + + v->count &= 0xffffff; + + switch (v->wave) { + case WAVE_TRI: + if (v->ring) + output = TriTable[(v->count ^ (v->mod_by->count & 0x800000)) >> 11]; + else + output = TriTable[v->count >> 11]; + break; + case WAVE_SAW: + output = v->count >> 8; + break; + case WAVE_RECT: + if (v->count > (uint32)(v->pw << 12)) + output = 0xffff; + else + output = 0; + break; + case WAVE_TRISAW: + output = TriSawTable[v->count >> 16]; + break; + case WAVE_TRIRECT: + if (v->count > (uint32)(v->pw << 12)) + output = TriRectTable[v->count >> 16]; + else + output = 0; + break; + case WAVE_SAWRECT: + if (v->count > (uint32)(v->pw << 12)) + output = SawRectTable[v->count >> 16]; + else + output = 0; + break; + case WAVE_TRISAWRECT: + if (v->count > (uint32)(v->pw << 12)) + output = TriSawRectTable[v->count >> 16]; + else + output = 0; + break; + case WAVE_NOISE: + if (v->count > 0x100000) { + output = v->noise = sid_random() << 8; + v->count &= 0xfffff; + } else + output = v->noise; + break; + default: + output = 0x8000; + break; + } + if (v->filter) + sum_output_filter += (int16)(output ^ 0x8000) * envelope; + else + sum_output += (int16)(output ^ 0x8000) * envelope; + } + + // Filter + if (ThePrefs.SIDFilters) { +#ifdef USE_FIXPOINT_MATHS + int32 xn = cf_ampl.imul(sum_output_filter); + int32 yn = xn+cd1.imul(xn1)+cd2.imul(xn2)-cg1.imul(yn1)-cg2.imul(yn2); + yn2 = yn1; yn1 = yn; xn2 = xn1; xn1 = xn; + sum_output_filter = yn; +#else + float xn = (float)sum_output_filter * cf_ampl; + float yn = xn + cd1 * xn1 + cd2 * xn2 - cg1 * yn1 - cg2 * yn2; + yn2 = yn1; yn1 = yn; xn2 = xn1; xn1 = xn; + sum_output_filter = (int32)yn; +#endif + } + + // Write to buffer + *buf++ = (sum_output + sum_output_filter) >> 10; + } +} + + +// Manufacturer independent sound is still just a dream... +#include "SID_linux.i" + +/* + * Open/close the renderer, according to old and new prefs + */ + +void MOS6581::open_close_renderer(int old_type, int new_type) +{ + if (old_type == new_type) + return; + + // Delete the old renderer + delete the_renderer; + + // Create new renderer + if (new_type == SIDTYPE_DIGITAL) + the_renderer = new DigitalRenderer(); + else + the_renderer = NULL; + + // Stuff the current register values into the new renderer + if (the_renderer != NULL) + for (int i=0; i<25; i++) + the_renderer->WriteRegister(i, regs[i]); +} diff --git a/archive-sources/c64emu/SID.h b/archive-sources/c64emu/SID.h new file mode 100644 index 0000000..eb120a8 --- /dev/null +++ b/archive-sources/c64emu/SID.h @@ -0,0 +1,147 @@ +/* + * SID.h - 6581 emulation + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _SID_H +#define _SID_H + +#include + + +// Define this if you want an emulation of an 8580 +// (affects combined waveforms) +#undef EMUL_MOS8580 + + +class Prefs; +class C64; +class SIDRenderer; +struct MOS6581State; + +// Class for administrative functions +class MOS6581 { +public: + MOS6581(C64 *c64); + ~MOS6581(); + + void Reset(void); + uint8 ReadRegister(uint16 adr); + void WriteRegister(uint16 adr, uint8 byte); + void NewPrefs(Prefs *prefs); + void PauseSound(void); + void ResumeSound(void); + void GetState(MOS6581State *ss); + void SetState(MOS6581State *ss); + void EmulateLine(void); + +private: + void open_close_renderer(int old_type, int new_type); + + C64 *the_c64; // Pointer to C64 object + SIDRenderer *the_renderer; // Pointer to current renderer + uint8 regs[32]; // Copies of the 25 write-only SID registers + uint8 last_sid_byte; // Last value written to SID +}; + + +// Renderers do the actual audio data processing +class SIDRenderer { +public: + virtual ~SIDRenderer() {} + virtual void Reset(void)=0; + virtual void EmulateLine(void)=0; + virtual void WriteRegister(uint16 adr, uint8 byte)=0; + virtual void NewPrefs(Prefs *prefs)=0; + virtual void Pause(void)=0; + virtual void Resume(void)=0; +}; + + +// SID state +struct MOS6581State { + uint8 freq_lo_1; + uint8 freq_hi_1; + uint8 pw_lo_1; + uint8 pw_hi_1; + uint8 ctrl_1; + uint8 AD_1; + uint8 SR_1; + + uint8 freq_lo_2; + uint8 freq_hi_2; + uint8 pw_lo_2; + uint8 pw_hi_2; + uint8 ctrl_2; + uint8 AD_2; + uint8 SR_2; + + uint8 freq_lo_3; + uint8 freq_hi_3; + uint8 pw_lo_3; + uint8 pw_hi_3; + uint8 ctrl_3; + uint8 AD_3; + uint8 SR_3; + + uint8 fc_lo; + uint8 fc_hi; + uint8 res_filt; + uint8 mode_vol; + + uint8 pot_x; + uint8 pot_y; + uint8 osc_3; + uint8 env_3; +}; + + +/* + * Fill buffer (for Unix sound routines), sample volume (for sampled voice) + */ + +inline void MOS6581::EmulateLine(void) +{ + if (the_renderer != NULL) + the_renderer->EmulateLine(); +} + + +/* + * Read from register + */ + +inline uint8 MOS6581::ReadRegister(uint16 adr) +{ + // A/D converters + if (adr == 0x19 || adr == 0x1a) { + last_sid_byte = 0; + return 0xff; + } + + // Voice 3 oscillator/EG readout + if (adr == 0x1b || adr == 0x1c) { + last_sid_byte = 0; + return rand(); + } + + // Write-only register: Return last value written to SID + return last_sid_byte; +} + + +/* + * Write to register + */ + +inline void MOS6581::WriteRegister(uint16 adr, uint8 byte) +{ + // Keep a local copy of the register values + last_sid_byte = regs[adr] = byte; + + if (the_renderer != NULL) + the_renderer->WriteRegister(adr, byte); +} + +#endif diff --git a/archive-sources/c64emu/SID_linux.i b/archive-sources/c64emu/SID_linux.i new file mode 100644 index 0000000..d5de0a0 --- /dev/null +++ b/archive-sources/c64emu/SID_linux.i @@ -0,0 +1,134 @@ +/* + * SID_linux.i - 6581 emulation, Linux specific stuff + * + * Frodo (C) 1994-1997 Christian Bauer + * Linux sound stuff by Bernd Schmidt + */ + +#include +#include +#include +#include + +#include "VIC.h" + + +/* + * Initialization + */ + +void DigitalRenderer::init_sound(void) +{ + int tmp; + int rate; + int dspbits; + unsigned long formats; + + ready = false; + devfd = open("/dev/dsp", O_WRONLY); + + if (devfd < 0) + return; + + ioctl (devfd, SNDCTL_DSP_GETFMTS, &formats); + + /* + * Buffer size: 2^9 == 512 bytes. Note that too large buffers will not work + * very well: The speed of the C64 is slowed down to an average speed of + * 100% by the blocking write() call in EmulateLine(). If you use a buffer + * of, say 4096 bytes, that will happen only about every 4 frames, which + * means that the emulation runs much faster in some frames, and much + * slower in others. + * On really fast machines, it might make sense to use an even smaller + * buffer size. + */ + tmp = 0x00040009; + ioctl (devfd, SNDCTL_DSP_SETFRAGMENT, &tmp); + ioctl (devfd, SNDCTL_DSP_GETBLKSIZE, &sndbufsize); + dspbits = 16; + ioctl(devfd, SNDCTL_DSP_SAMPLESIZE, &dspbits); + ioctl(devfd, SOUND_PCM_READ_BITS, &dspbits); + if (dspbits != 16) + return; + + tmp = 0; + ioctl(devfd, SNDCTL_DSP_STEREO, &tmp); + + rate = 44100; + ioctl(devfd, SNDCTL_DSP_SPEED, &rate); + ioctl(devfd, SOUND_PCM_READ_RATE, &rate); + if (rate < 43000 || rate > 45000) + return; + + if (!(formats & AFMT_S16_LE)) + return; + + sound_buffer = new int16[sndbufsize]; + ready = true; +} + + +/* + * Destructor + */ + +DigitalRenderer::~DigitalRenderer() +{ + if (devfd >= 0) + close(devfd); +} + + +/* + * Pause sound output + */ + +void DigitalRenderer::Pause(void) +{ +} + + +/* + * Resume sound output + */ + +void DigitalRenderer::Resume(void) +{ +} + + +/* + * Fill buffer, sample volume (for sampled voice) + */ + +void DigitalRenderer::EmulateLine(void) +{ + static int divisor = 0; + static int to_output = 0; + static int buffer_pos = 0; + + if (!ready) + return; + + sample_buf[sample_in_ptr] = volume; + sample_in_ptr = (sample_in_ptr + 1) % SAMPLE_BUF_SIZE; + + /* + * Now see how many samples have to be added for this line + */ + divisor += SAMPLE_FREQ; + while (divisor >= 0) + divisor -= TOTAL_RASTERS*SCREEN_FREQ, to_output++; + + /* + * Calculate the sound data only when we have enough to fill + * the buffer entirely. + */ + if ((buffer_pos + to_output) >= sndbufsize) { + int datalen = sndbufsize - buffer_pos; + to_output -= datalen; + calc_buffer(sound_buffer + buffer_pos, datalen*2); + write(devfd, sound_buffer, sndbufsize*2); + buffer_pos = 0; + } +} diff --git a/archive-sources/c64emu/VIC.cpp b/archive-sources/c64emu/VIC.cpp new file mode 100644 index 0000000..b3c5a31 --- /dev/null +++ b/archive-sources/c64emu/VIC.cpp @@ -0,0 +1,1852 @@ +/* + * VIC.cpp - 6569R5 emulation (line based) + * + * Frodo (C) 1994-1997 Christian Bauer + * + + * + * Notes: + * ------ + * + * - The EmulateLine() function is called for every emulated + * raster line. It computes one pixel row of the graphics + * according to the current VIC register settings and returns + * the number of cycles available for the CPU in that line. + * - The graphics are output into an 8 bit chunky bitmap + * - The sprite-graphics priority handling and collision + * detection is done in a bit-oriented way with masks. + * The foreground/background pixel mask for the graphics + * is stored in the fore_mask_buf[] array. Multicolor + * sprites are converted from their original chunky format + * to a bitplane representation (two bit masks) for easier + * handling of priorities and collisions. + * - The sprite-sprite priority handling and collision + * detection is done in with the byte array spr_coll_buf[], + * that is used to keep track of which sprites are already + * visible at certain X positions. + * + * Incompatibilities: + * ------------------ + * + * - Raster effects that are achieved by modifying VIC registers + * in the middle of a raster line cannot be emulated + * - Sprite collisions are only detected within the visible + * screen area (excluding borders) + * - Sprites are only drawn if they completely fit within the + * left/right limits of the chunky bitmap + * - The Char ROM is not visible in the bitmap displays at + * addresses $0000 and $8000 + * - The IRQ is cleared on every write access to the flag + * register. This is a hack for the RMW instructions of the + * 6510 that first write back the original value. + */ + +#include "sysdeps.h" + +#include "VIC.h" +#include "C64.h" +#include "CPUC64.h" +#include "Display.h" +#include "Prefs.h" + + +// Test alignment on run-time for processors that can't access unaligned: + +// First and last displayed line +const int FIRST_DISP_LINE = 0x10; +const int LAST_DISP_LINE = 0x11f; + +// First and last possible line for Bad Lines +const int FIRST_DMA_LINE = 0x30; +const int LAST_DMA_LINE = 0xf7; + +// Display window coordinates +const int ROW25_YSTART = 0x33; +const int ROW25_YSTOP = 0xfb; +const int ROW24_YSTART = 0x37; +const int ROW24_YSTOP = 0xf7; + +#if defined(SMALL_DISPLAY) +/* This does not work yet, the sprite code doesn't know about it. */ +const int COL40_XSTART = 0x14; +const int COL40_XSTOP = 0x154; +const int COL38_XSTART = 0x1B; +const int COL38_XSTOP = 0x14B; +#else +const int COL40_XSTART = 0x20; +const int COL40_XSTOP = 0x160; +const int COL38_XSTART = 0x27; +const int COL38_XSTOP = 0x157; +#endif + + +// Tables for sprite X expansion +uint16 ExpTable[256] = { + 0x0000, 0x0003, 0x000C, 0x000F, 0x0030, 0x0033, 0x003C, 0x003F, + 0x00C0, 0x00C3, 0x00CC, 0x00CF, 0x00F0, 0x00F3, 0x00FC, 0x00FF, + 0x0300, 0x0303, 0x030C, 0x030F, 0x0330, 0x0333, 0x033C, 0x033F, + 0x03C0, 0x03C3, 0x03CC, 0x03CF, 0x03F0, 0x03F3, 0x03FC, 0x03FF, + 0x0C00, 0x0C03, 0x0C0C, 0x0C0F, 0x0C30, 0x0C33, 0x0C3C, 0x0C3F, + 0x0CC0, 0x0CC3, 0x0CCC, 0x0CCF, 0x0CF0, 0x0CF3, 0x0CFC, 0x0CFF, + 0x0F00, 0x0F03, 0x0F0C, 0x0F0F, 0x0F30, 0x0F33, 0x0F3C, 0x0F3F, + 0x0FC0, 0x0FC3, 0x0FCC, 0x0FCF, 0x0FF0, 0x0FF3, 0x0FFC, 0x0FFF, + 0x3000, 0x3003, 0x300C, 0x300F, 0x3030, 0x3033, 0x303C, 0x303F, + 0x30C0, 0x30C3, 0x30CC, 0x30CF, 0x30F0, 0x30F3, 0x30FC, 0x30FF, + 0x3300, 0x3303, 0x330C, 0x330F, 0x3330, 0x3333, 0x333C, 0x333F, + 0x33C0, 0x33C3, 0x33CC, 0x33CF, 0x33F0, 0x33F3, 0x33FC, 0x33FF, + 0x3C00, 0x3C03, 0x3C0C, 0x3C0F, 0x3C30, 0x3C33, 0x3C3C, 0x3C3F, + 0x3CC0, 0x3CC3, 0x3CCC, 0x3CCF, 0x3CF0, 0x3CF3, 0x3CFC, 0x3CFF, + 0x3F00, 0x3F03, 0x3F0C, 0x3F0F, 0x3F30, 0x3F33, 0x3F3C, 0x3F3F, + 0x3FC0, 0x3FC3, 0x3FCC, 0x3FCF, 0x3FF0, 0x3FF3, 0x3FFC, 0x3FFF, + 0xC000, 0xC003, 0xC00C, 0xC00F, 0xC030, 0xC033, 0xC03C, 0xC03F, + 0xC0C0, 0xC0C3, 0xC0CC, 0xC0CF, 0xC0F0, 0xC0F3, 0xC0FC, 0xC0FF, + 0xC300, 0xC303, 0xC30C, 0xC30F, 0xC330, 0xC333, 0xC33C, 0xC33F, + 0xC3C0, 0xC3C3, 0xC3CC, 0xC3CF, 0xC3F0, 0xC3F3, 0xC3FC, 0xC3FF, + 0xCC00, 0xCC03, 0xCC0C, 0xCC0F, 0xCC30, 0xCC33, 0xCC3C, 0xCC3F, + 0xCCC0, 0xCCC3, 0xCCCC, 0xCCCF, 0xCCF0, 0xCCF3, 0xCCFC, 0xCCFF, + 0xCF00, 0xCF03, 0xCF0C, 0xCF0F, 0xCF30, 0xCF33, 0xCF3C, 0xCF3F, + 0xCFC0, 0xCFC3, 0xCFCC, 0xCFCF, 0xCFF0, 0xCFF3, 0xCFFC, 0xCFFF, + 0xF000, 0xF003, 0xF00C, 0xF00F, 0xF030, 0xF033, 0xF03C, 0xF03F, + 0xF0C0, 0xF0C3, 0xF0CC, 0xF0CF, 0xF0F0, 0xF0F3, 0xF0FC, 0xF0FF, + 0xF300, 0xF303, 0xF30C, 0xF30F, 0xF330, 0xF333, 0xF33C, 0xF33F, + 0xF3C0, 0xF3C3, 0xF3CC, 0xF3CF, 0xF3F0, 0xF3F3, 0xF3FC, 0xF3FF, + 0xFC00, 0xFC03, 0xFC0C, 0xFC0F, 0xFC30, 0xFC33, 0xFC3C, 0xFC3F, + 0xFCC0, 0xFCC3, 0xFCCC, 0xFCCF, 0xFCF0, 0xFCF3, 0xFCFC, 0xFCFF, + 0xFF00, 0xFF03, 0xFF0C, 0xFF0F, 0xFF30, 0xFF33, 0xFF3C, 0xFF3F, + 0xFFC0, 0xFFC3, 0xFFCC, 0xFFCF, 0xFFF0, 0xFFF3, 0xFFFC, 0xFFFF +}; + +uint16 MultiExpTable[256] = { + 0x0000, 0x0005, 0x000A, 0x000F, 0x0050, 0x0055, 0x005A, 0x005F, + 0x00A0, 0x00A5, 0x00AA, 0x00AF, 0x00F0, 0x00F5, 0x00FA, 0x00FF, + 0x0500, 0x0505, 0x050A, 0x050F, 0x0550, 0x0555, 0x055A, 0x055F, + 0x05A0, 0x05A5, 0x05AA, 0x05AF, 0x05F0, 0x05F5, 0x05FA, 0x05FF, + 0x0A00, 0x0A05, 0x0A0A, 0x0A0F, 0x0A50, 0x0A55, 0x0A5A, 0x0A5F, + 0x0AA0, 0x0AA5, 0x0AAA, 0x0AAF, 0x0AF0, 0x0AF5, 0x0AFA, 0x0AFF, + 0x0F00, 0x0F05, 0x0F0A, 0x0F0F, 0x0F50, 0x0F55, 0x0F5A, 0x0F5F, + 0x0FA0, 0x0FA5, 0x0FAA, 0x0FAF, 0x0FF0, 0x0FF5, 0x0FFA, 0x0FFF, + 0x5000, 0x5005, 0x500A, 0x500F, 0x5050, 0x5055, 0x505A, 0x505F, + 0x50A0, 0x50A5, 0x50AA, 0x50AF, 0x50F0, 0x50F5, 0x50FA, 0x50FF, + 0x5500, 0x5505, 0x550A, 0x550F, 0x5550, 0x5555, 0x555A, 0x555F, + 0x55A0, 0x55A5, 0x55AA, 0x55AF, 0x55F0, 0x55F5, 0x55FA, 0x55FF, + 0x5A00, 0x5A05, 0x5A0A, 0x5A0F, 0x5A50, 0x5A55, 0x5A5A, 0x5A5F, + 0x5AA0, 0x5AA5, 0x5AAA, 0x5AAF, 0x5AF0, 0x5AF5, 0x5AFA, 0x5AFF, + 0x5F00, 0x5F05, 0x5F0A, 0x5F0F, 0x5F50, 0x5F55, 0x5F5A, 0x5F5F, + 0x5FA0, 0x5FA5, 0x5FAA, 0x5FAF, 0x5FF0, 0x5FF5, 0x5FFA, 0x5FFF, + 0xA000, 0xA005, 0xA00A, 0xA00F, 0xA050, 0xA055, 0xA05A, 0xA05F, + 0xA0A0, 0xA0A5, 0xA0AA, 0xA0AF, 0xA0F0, 0xA0F5, 0xA0FA, 0xA0FF, + 0xA500, 0xA505, 0xA50A, 0xA50F, 0xA550, 0xA555, 0xA55A, 0xA55F, + 0xA5A0, 0xA5A5, 0xA5AA, 0xA5AF, 0xA5F0, 0xA5F5, 0xA5FA, 0xA5FF, + 0xAA00, 0xAA05, 0xAA0A, 0xAA0F, 0xAA50, 0xAA55, 0xAA5A, 0xAA5F, + 0xAAA0, 0xAAA5, 0xAAAA, 0xAAAF, 0xAAF0, 0xAAF5, 0xAAFA, 0xAAFF, + 0xAF00, 0xAF05, 0xAF0A, 0xAF0F, 0xAF50, 0xAF55, 0xAF5A, 0xAF5F, + 0xAFA0, 0xAFA5, 0xAFAA, 0xAFAF, 0xAFF0, 0xAFF5, 0xAFFA, 0xAFFF, + 0xF000, 0xF005, 0xF00A, 0xF00F, 0xF050, 0xF055, 0xF05A, 0xF05F, + 0xF0A0, 0xF0A5, 0xF0AA, 0xF0AF, 0xF0F0, 0xF0F5, 0xF0FA, 0xF0FF, + 0xF500, 0xF505, 0xF50A, 0xF50F, 0xF550, 0xF555, 0xF55A, 0xF55F, + 0xF5A0, 0xF5A5, 0xF5AA, 0xF5AF, 0xF5F0, 0xF5F5, 0xF5FA, 0xF5FF, + 0xFA00, 0xFA05, 0xFA0A, 0xFA0F, 0xFA50, 0xFA55, 0xFA5A, 0xFA5F, + 0xFAA0, 0xFAA5, 0xFAAA, 0xFAAF, 0xFAF0, 0xFAF5, 0xFAFA, 0xFAFF, + 0xFF00, 0xFF05, 0xFF0A, 0xFF0F, 0xFF50, 0xFF55, 0xFF5A, 0xFF5F, + 0xFFA0, 0xFFA5, 0xFFAA, 0xFFAF, 0xFFF0, 0xFFF5, 0xFFFA, 0xFFFF +}; + +#ifdef __POWERPC__ +static union { + struct { + uint8 a,b,c,d,e,f,g,h; + } a; + double b; +} TextColorTable[16][16][256]; +#else +static union { + struct { + uint8 a,b,c,d; + } a; + uint32 b; +} TextColorTable[16][16][256][2]; +#endif + +#ifdef GLOBAL_VARS +static uint16 mc_color_lookup[4]; +#ifndef CAN_ACCESS_UNALIGNED +static uint8 text_chunky_buf[40*8]; +#endif +static uint16 mx[8]; // VIC registers +static uint8 mx8; +static uint8 my[8]; +static uint8 ctrl1, ctrl2; +static uint8 lpx, lpy; +static uint8 me, mxe, mye, mdp, mmc; +static uint8 vbase; +static uint8 irq_flag, irq_mask; +static uint8 clx_spr, clx_bgr; +static uint8 ec, b0c, b1c, b2c, b3c, mm0, mm1; +static uint8 sc[8]; + +static uint8 *ram, *char_rom, *color_ram; // Pointers to RAM and ROM +static C64 *the_c64; // Pointer to C64 +static C64Display *the_display; // Pointer to C64Display +static MOS6510 *the_cpu; // Pointer to 6510 + +static uint8 colors[256]; // Indices of the 16 C64 colors (16 times mirrored to avoid "& 0x0f") + +static uint8 ec_color, b0c_color, b1c_color, b2c_color, b3c_color; // Indices for exterior/background colors +static uint8 mm0_color, mm1_color; // Indices for MOB multicolors +static uint8 spr_color[8]; // Indices for MOB colors + +static uint32 ec_color_long; // ec_color expanded to 32 bits + +static uint8 matrix_line[40]; // Buffer for video line, read in Bad Lines +static uint8 color_line[40]; // Buffer for color line, read in Bad Lines + +#ifdef __POWERPC__ +static double chunky_tmp[DISPLAY_X/8]; // Temporary line buffer for GameKit speedup +#endif +static uint8 *chunky_line_start; // Pointer to start of current line in bitmap buffer +static int xmod; // Number of bytes per row + +static uint8 *matrix_base; // Video matrix base +static uint8 *char_base; // Character generator base +static uint8 *bitmap_base; // Bitmap base + +static uint16 raster_y; // Current raster line +static uint16 irq_raster; // Interrupt raster line +static uint16 dy_start; // Comparison values for border logic +static uint16 dy_stop; +static uint16 rc; // Row counter +static uint16 vc; // Video counter +static uint16 vc_base; // Video counter base +static uint16 x_scroll; // X scroll value +static uint16 y_scroll; // Y scroll value +static uint16 cia_vabase; // CIA VA14/15 video base + +static int display_idx; // Index of current display mode +static int skip_counter; // Counter for frame-skipping + +static uint16 mc[8]; // Sprite data counters +static uint8 sprite_on; // 8 Flags: Sprite display/DMA active + +static uint8 spr_coll_buf[0x180]; // Buffer for sprite-sprite collisions and priorities +static uint8 fore_mask_buf[0x180/8]; // Foreground mask for sprite-graphics collisions and priorities + +static bool display_state; // true: Display state, false: Idle state +static bool border_on; // Flag: Upper/lower border on +static bool border_40_col; // Flag: 40 column border +static bool frame_skipped; // Flag: Frame is being skipped +static uint8 bad_lines_enabled; // Flag: Bad Lines enabled for this frame +static bool lp_triggered; // Flag: Lightpen was triggered in this frame +#endif + + +/* + * Constructor: Initialize variables + */ + +static void init_text_color_table(uint8 *colors) +{ + for (int i = 0; i < 16; i++) + for (int j = 0; j < 16; j++) + for (int k = 0; k < 256; k++) { +#ifdef __POWERPC__ + TextColorTable[i][j][k].a.a = colors[k & 128 ? i : j]; + TextColorTable[i][j][k].a.b = colors[k & 64 ? i : j]; + TextColorTable[i][j][k].a.c = colors[k & 32 ? i : j]; + TextColorTable[i][j][k].a.d = colors[k & 16 ? i : j]; + TextColorTable[i][j][k].a.e = colors[k & 8 ? i : j]; + TextColorTable[i][j][k].a.f = colors[k & 4 ? i : j]; + TextColorTable[i][j][k].a.g = colors[k & 2 ? i : j]; + TextColorTable[i][j][k].a.h = colors[k & 1 ? i : j]; +#else + TextColorTable[i][j][k][0].a.a = colors[k & 128 ? i : j]; + TextColorTable[i][j][k][0].a.b = colors[k & 64 ? i : j]; + TextColorTable[i][j][k][0].a.c = colors[k & 32 ? i : j]; + TextColorTable[i][j][k][0].a.d = colors[k & 16 ? i : j]; + TextColorTable[i][j][k][1].a.a = colors[k & 8 ? i : j]; + TextColorTable[i][j][k][1].a.b = colors[k & 4 ? i : j]; + TextColorTable[i][j][k][1].a.c = colors[k & 2 ? i : j]; + TextColorTable[i][j][k][1].a.d = colors[k & 1 ? i : j]; +#endif + } +} + +MOS6569::MOS6569(C64 *c64, C64Display *disp, MOS6510 *CPU, uint8 *RAM, uint8 *Char, uint8 *Color) +#ifndef GLOBAL_VARS + : ram(RAM), char_rom(Char), color_ram(Color), the_c64(c64), the_display(disp), the_cpu(CPU) +#endif +{ + int i; + + // Set pointers +#ifdef GLOBAL_VARS + the_c64 = c64; + the_display = disp; + the_cpu = CPU; + ram = RAM; + char_rom = Char; + color_ram = Color; +#endif + matrix_base = RAM; + char_base = RAM; + bitmap_base = RAM; + + // Get bitmap info + chunky_line_start = disp->BitmapBase(); + xmod = disp->BitmapXMod(); + + // Initialize VIC registers + mx8 = 0; + ctrl1 = ctrl2 = 0; + lpx = lpy = 0; + me = mxe = mye = mdp = mmc = 0; + vbase = irq_flag = irq_mask = 0; + clx_spr = clx_bgr = 0; + cia_vabase = 0; + ec = b0c = b1c = b2c = b3c = mm0 = mm1 = 0; + for (i=0; i<8; i++) mx[i] = my[i] = sc[i] = 0; + + // Initialize other variables + raster_y = 0xffff; + rc = 7; + irq_raster = vc = vc_base = x_scroll = y_scroll = 0; + dy_start = ROW24_YSTART; + dy_stop = ROW24_YSTOP; + + display_idx = 0; + display_state = false; + border_on = false; + lp_triggered = false; + + sprite_on = 0; + for (i=0; i<8; i++) + mc[i] = 63; + + frame_skipped = false; + skip_counter = 1; + + // Clear foreground mask + memset(fore_mask_buf, 0, DISPLAY_X/8); + + // Preset colors to black + disp->InitColors(colors); + init_text_color_table(colors); + ec_color = b0c_color = b1c_color = b2c_color = b3c_color = mm0_color = mm1_color = colors[0]; + ec_color_long = (ec_color << 24) | (ec_color << 16) | (ec_color << 8) | ec_color; + for (i=0; i<8; i++) spr_color[i] = colors[0]; +} + + +/* + * Reinitialize the colors table for when the palette has changed + */ + +void MOS6569::ReInitColors(void) +{ + int i; + + // Build inverse color table. + uint8 xlate_colors[256]; + memset(xlate_colors, 0, sizeof(xlate_colors)); + for (i = 0; i < 16; i++) + xlate_colors[colors[i]] = i; + + // Get the new colors. + the_display->InitColors(colors); + init_text_color_table(colors); + + // Build color translation table. + for (i = 0; i < 256; i++) + xlate_colors[i] = colors[xlate_colors[i]]; + + // Translate all the old colors variables. + ec_color = colors[ec]; + ec_color_long = ec_color | (ec_color << 8) | (ec_color << 16) | (ec_color << 24); + b0c_color = colors[b0c]; + b1c_color = colors[b1c]; + b2c_color = colors[b2c]; + b3c_color = colors[b3c]; + mm0_color = colors[mm0]; + mm1_color = colors[mm1]; + for (i = 0; i < 8; i++) + spr_color[i] = colors[sc[i]]; + mc_color_lookup[0] = b0c_color | (b0c_color << 8); + mc_color_lookup[1] = b1c_color | (b1c_color << 8); + mc_color_lookup[2] = b2c_color | (b2c_color << 8); + + // Translate the chunky buffer. + uint8 *scanline = the_display->BitmapBase(); + for (int y = 0; y < DISPLAY_Y; y++) { + for (int x = 0; x < DISPLAY_X; x++) + scanline[x] = xlate_colors[scanline[x]]; + scanline += xmod; + } +} + +#ifdef GLOBAL_VARS +static void make_mc_table(void) +#else +void MOS6569::make_mc_table(void) +#endif +{ + mc_color_lookup[0] = b0c_color | (b0c_color << 8); + mc_color_lookup[1] = b1c_color | (b1c_color << 8); + mc_color_lookup[2] = b2c_color | (b2c_color << 8); +} + + +/* + * Convert video address to pointer + */ + +#ifdef GLOBAL_VARS +static inline uint8 *get_physical(uint16 adr) +#else +inline uint8 *MOS6569::get_physical(uint16 adr) +#endif +{ + int va = adr | cia_vabase; + if ((va & 0x7000) == 0x1000) + return char_rom + (va & 0x0fff); + else + return ram + va; +} + + +/* + * Get VIC state + */ + +void MOS6569::GetState(MOS6569State *vd) +{ + int i; + + vd->m0x = mx[0] & 0xff; vd->m0y = my[0]; + vd->m1x = mx[1] & 0xff; vd->m1y = my[1]; + vd->m2x = mx[2] & 0xff; vd->m2y = my[2]; + vd->m3x = mx[3] & 0xff; vd->m3y = my[3]; + vd->m4x = mx[4] & 0xff; vd->m4y = my[4]; + vd->m5x = mx[5] & 0xff; vd->m5y = my[5]; + vd->m6x = mx[6] & 0xff; vd->m6y = my[6]; + vd->m7x = mx[7] & 0xff; vd->m7y = my[7]; + vd->mx8 = mx8; + + vd->ctrl1 = (ctrl1 & 0x7f) | ((raster_y & 0x100) >> 1); + vd->raster = raster_y & 0xff; + vd->lpx = lpx; vd->lpy = lpy; + vd->ctrl2 = ctrl2; + vd->vbase = vbase; + vd->irq_flag = irq_flag; + vd->irq_mask = irq_mask; + + vd->me = me; vd->mxe = mxe; vd->mye = mye; vd->mdp = mdp; vd->mmc = mmc; + vd->mm = clx_spr; vd->md = clx_bgr; + + vd->ec = ec; + vd->b0c = b0c; vd->b1c = b1c; vd->b2c = b2c; vd->b3c = b3c; + vd->mm0 = mm0; vd->mm1 = mm1; + vd->m0c = sc[0]; vd->m1c = sc[1]; + vd->m2c = sc[2]; vd->m3c = sc[3]; + vd->m4c = sc[4]; vd->m5c = sc[5]; + vd->m6c = sc[6]; vd->m7c = sc[7]; + + vd->pad0 = 0; + vd->irq_raster = irq_raster; + vd->vc = vc; + vd->vc_base = vc_base; + vd->rc = rc; + vd->spr_dma = vd->spr_disp = sprite_on; + for (i=0; i<8; i++) + vd->mc[i] = vd->mc_base[i] = mc[i]; + vd->display_state = display_state; + vd->bad_line = raster_y >= FIRST_DMA_LINE && raster_y <= LAST_DMA_LINE && ((raster_y & 7) == y_scroll) && bad_lines_enabled; + vd->bad_line_enable = bad_lines_enabled; + vd->lp_triggered = lp_triggered; + vd->border_on = border_on; + + vd->bank_base = cia_vabase; + vd->matrix_base = ((vbase & 0xf0) << 6) | cia_vabase; + vd->char_base = ((vbase & 0x0e) << 10) | cia_vabase; + vd->bitmap_base = ((vbase & 0x08) << 10) | cia_vabase; + for (i=0; i<8; i++) + vd->sprite_base[i] = (matrix_base[0x3f8 + i] << 6) | cia_vabase; + + vd->cycle = 1; + vd->raster_x = 0; + vd->ml_index = 0; + vd->ref_cnt = 0xff; + vd->last_vic_byte = 0; + vd->ud_border_on = border_on; +} + + +/* + * Set VIC state (only works if in VBlank) + */ + +void MOS6569::SetState(MOS6569State *vd) +{ + int i, j; + + mx[0] = vd->m0x; my[0] = vd->m0y; + mx[1] = vd->m1x; my[1] = vd->m1y; + mx[2] = vd->m2x; my[2] = vd->m2y; + mx[3] = vd->m3x; my[3] = vd->m3y; + mx[4] = vd->m4x; my[4] = vd->m4y; + mx[5] = vd->m5x; my[5] = vd->m5y; + mx[6] = vd->m6x; my[6] = vd->m6y; + mx[7] = vd->m7x; my[7] = vd->m7y; + mx8 = vd->mx8; + for (i=0, j=1; i<8; i++, j<<=1) { + if (mx8 & j) + mx[i] |= 0x100; + else + mx[i] &= 0xff; + } + + ctrl1 = vd->ctrl1; + ctrl2 = vd->ctrl2; + x_scroll = ctrl2 & 7; + y_scroll = ctrl1 & 7; + if (ctrl1 & 8) { + dy_start = ROW25_YSTART; + dy_stop = ROW25_YSTOP; + } else { + dy_start = ROW24_YSTART; + dy_stop = ROW24_YSTOP; + } + border_40_col = ctrl2 & 8; + display_idx = ((ctrl1 & 0x60) | (ctrl2 & 0x10)) >> 4; + + raster_y = 0; + lpx = vd->lpx; lpy = vd->lpy; + + vbase = vd->vbase; + cia_vabase = vd->bank_base; + matrix_base = get_physical((vbase & 0xf0) << 6); + char_base = get_physical((vbase & 0x0e) << 10); + bitmap_base = get_physical((vbase & 0x08) << 10); + + irq_flag = vd->irq_flag; + irq_mask = vd->irq_mask; + + me = vd->me; mxe = vd->mxe; mye = vd->mye; mdp = vd->mdp; mmc = vd->mmc; + clx_spr = vd->mm; clx_bgr = vd->md; + + ec = vd->ec; + ec_color = colors[ec]; + ec_color_long = (ec_color << 24) | (ec_color << 16) | (ec_color << 8) | ec_color; + + b0c = vd->b0c; b1c = vd->b1c; b2c = vd->b2c; b3c = vd->b3c; + b0c_color = colors[b0c]; + b1c_color = colors[b1c]; + b2c_color = colors[b2c]; + b3c_color = colors[b3c]; + make_mc_table(); + + mm0 = vd->mm0; mm1 = vd->mm1; + mm0_color = colors[mm0]; + mm1_color = colors[mm1]; + + sc[0] = vd->m0c; sc[1] = vd->m1c; + sc[2] = vd->m2c; sc[3] = vd->m3c; + sc[4] = vd->m4c; sc[5] = vd->m5c; + sc[6] = vd->m6c; sc[7] = vd->m7c; + for (i=0; i<8; i++) + spr_color[i] = colors[sc[i]]; + + irq_raster = vd->irq_raster; + vc = vd->vc; + vc_base = vd->vc_base; + rc = vd->rc; + sprite_on = vd->spr_dma; + for (i=0; i<8; i++) + mc[i] = vd->mc[i]; + display_state = vd->display_state; + bad_lines_enabled = vd->bad_line_enable; + lp_triggered = vd->lp_triggered; + border_on = vd->border_on; +} + + +/* + * Trigger raster IRQ + */ + +#ifdef GLOBAL_VARS +static inline void raster_irq(void) +#else +inline void MOS6569::raster_irq(void) +#endif +{ + irq_flag |= 0x01; + if (irq_mask & 0x01) { + irq_flag |= 0x80; + the_cpu->TriggerVICIRQ(); + } +} + + +/* + * Read from VIC register + */ + +uint8 MOS6569::ReadRegister(uint16 adr) +{ + switch (adr) { + case 0x00: case 0x02: case 0x04: case 0x06: + case 0x08: case 0x0a: case 0x0c: case 0x0e: + return mx[adr >> 1]; + + case 0x01: case 0x03: case 0x05: case 0x07: + case 0x09: case 0x0b: case 0x0d: case 0x0f: + return my[adr >> 1]; + + case 0x10: // Sprite X position MSB + return mx8; + + case 0x11: // Control register 1 + return (ctrl1 & 0x7f) | ((raster_y & 0x100) >> 1); + + case 0x12: // Raster counter + return raster_y; + + case 0x13: // Light pen X + return lpx; + + case 0x14: // Light pen Y + return lpy; + + case 0x15: // Sprite enable + return me; + + case 0x16: // Control register 2 + return ctrl2 | 0xc0; + + case 0x17: // Sprite Y expansion + return mye; + + case 0x18: // Memory pointers + return vbase | 0x01; + + case 0x19: // IRQ flags + return irq_flag | 0x70; + + case 0x1a: // IRQ mask + return irq_mask | 0xf0; + + case 0x1b: // Sprite data priority + return mdp; + + case 0x1c: // Sprite multicolor + return mmc; + + case 0x1d: // Sprite X expansion + return mxe; + + case 0x1e:{ // Sprite-sprite collision + uint8 ret = clx_spr; + clx_spr = 0; // Read and clear + return ret; + } + + case 0x1f:{ // Sprite-background collision + uint8 ret = clx_bgr; + clx_bgr = 0; // Read and clear + return ret; + } + + case 0x20: return ec | 0xf0; + case 0x21: return b0c | 0xf0; + case 0x22: return b1c | 0xf0; + case 0x23: return b2c | 0xf0; + case 0x24: return b3c | 0xf0; + case 0x25: return mm0 | 0xf0; + case 0x26: return mm1 | 0xf0; + + case 0x27: case 0x28: case 0x29: case 0x2a: + case 0x2b: case 0x2c: case 0x2d: case 0x2e: + return sc[adr - 0x27] | 0xf0; + + default: + return 0xff; + } +} + + +/* + * Write to VIC register + */ + +void MOS6569::WriteRegister(uint16 adr, uint8 byte) +{ + switch (adr) { + case 0x00: case 0x02: case 0x04: case 0x06: + case 0x08: case 0x0a: case 0x0c: case 0x0e: + mx[adr >> 1] = (mx[adr >> 1] & 0xff00) | byte; + break; + + case 0x10:{ + int i, j; + mx8 = byte; + for (i=0, j=1; i<8; i++, j<<=1) { + if (mx8 & j) + mx[i] |= 0x100; + else + mx[i] &= 0xff; + } + break; + } + + case 0x01: case 0x03: case 0x05: case 0x07: + case 0x09: case 0x0b: case 0x0d: case 0x0f: + my[adr >> 1] = byte; + break; + + case 0x11:{ // Control register 1 + ctrl1 = byte; + y_scroll = byte & 7; + + uint16 new_irq_raster = (irq_raster & 0xff) | ((byte & 0x80) << 1); + if (irq_raster != new_irq_raster && raster_y == new_irq_raster) + raster_irq(); + irq_raster = new_irq_raster; + + if (byte & 8) { + dy_start = ROW25_YSTART; + dy_stop = ROW25_YSTOP; + } else { + dy_start = ROW24_YSTART; + dy_stop = ROW24_YSTOP; + } + + display_idx = ((ctrl1 & 0x60) | (ctrl2 & 0x10)) >> 4; + break; + } + + case 0x12:{ // Raster counter + uint16 new_irq_raster = (irq_raster & 0xff00) | byte; + if (irq_raster != new_irq_raster && raster_y == new_irq_raster) + raster_irq(); + irq_raster = new_irq_raster; + break; + } + + case 0x15: // Sprite enable + me = byte; + break; + + case 0x16: // Control register 2 + ctrl2 = byte; + x_scroll = byte & 7; + border_40_col = byte & 8; + display_idx = ((ctrl1 & 0x60) | (ctrl2 & 0x10)) >> 4; + break; + + case 0x17: // Sprite Y expansion + mye = byte; + break; + + case 0x18: // Memory pointers + vbase = byte; + matrix_base = get_physical((byte & 0xf0) << 6); + char_base = get_physical((byte & 0x0e) << 10); + bitmap_base = get_physical((byte & 0x08) << 10); + break; + + case 0x19: // IRQ flags + irq_flag = irq_flag & (~byte & 0x0f); + the_cpu->ClearVICIRQ(); // Clear interrupt (hack!) + if (irq_flag & irq_mask) // Set master bit if allowed interrupt still pending + irq_flag |= 0x80; + break; + + case 0x1a: // IRQ mask + irq_mask = byte & 0x0f; + if (irq_flag & irq_mask) { // Trigger interrupt if pending and now allowed + irq_flag |= 0x80; + the_cpu->TriggerVICIRQ(); + } else { + irq_flag &= 0x7f; + the_cpu->ClearVICIRQ(); + } + break; + + case 0x1b: // Sprite data priority + mdp = byte; + break; + + case 0x1c: // Sprite multicolor + mmc = byte; + break; + + case 0x1d: // Sprite X expansion + mxe = byte; + break; + + case 0x20: + ec_color = colors[ec = byte]; + ec_color_long = (ec_color << 24) | (ec_color << 16) | (ec_color << 8) | ec_color; + break; + + case 0x21: + if (b0c != byte) { + b0c_color = colors[b0c = byte & 0xF]; + make_mc_table(); + } + break; + + case 0x22: + if (b1c != byte) { + b1c_color = colors[b1c = byte & 0xF]; + make_mc_table(); + } + break; + + case 0x23: + if (b2c != byte) { + b2c_color = colors[b2c = byte & 0xF]; + make_mc_table(); + } + break; + + case 0x24: b3c_color = colors[b3c = byte & 0xF]; break; + case 0x25: mm0_color = colors[mm0 = byte]; break; + case 0x26: mm1_color = colors[mm1 = byte]; break; + + case 0x27: case 0x28: case 0x29: case 0x2a: + case 0x2b: case 0x2c: case 0x2d: case 0x2e: + spr_color[adr - 0x27] = colors[sc[adr - 0x27] = byte]; + break; + } +} + + +/* + * CIA VA14/15 has changed + */ + +void MOS6569::ChangedVA(uint16 new_va) +{ + cia_vabase = new_va << 14; + WriteRegister(0x18, vbase); // Force update of memory pointers +} + + +/* + * Trigger lightpen interrupt, latch lightpen coordinates + */ + +void MOS6569::TriggerLightpen(void) +{ + if (!lp_triggered) { // Lightpen triggers only once per frame + lp_triggered = true; + + lpx = 0; // Latch current coordinates + lpy = raster_y; + + irq_flag |= 0x08; // Trigger IRQ + if (irq_mask & 0x08) { + irq_flag |= 0x80; + the_cpu->TriggerVICIRQ(); + } + } +} + + +/* + * VIC vertical blank: Reset counters and redraw screen + */ + +#ifdef GLOBAL_VARS +static inline void vblank(void) +#else +inline void MOS6569::vblank(void) +#endif +{ + raster_y = vc_base = 0; + lp_triggered = false; + + if (!(frame_skipped = --skip_counter)) + skip_counter = ThePrefs.SkipFrames; + + the_c64->VBlank(!frame_skipped); + + // Get bitmap pointer for next frame. This must be done + // after calling the_c64->VBlank() because the preferences + // and screen configuration may have been changed there + chunky_line_start = the_display->BitmapBase(); + xmod = the_display->BitmapXMod(); +} + + +#ifdef GLOBAL_VARS +static inline void el_std_text(uint8 *p, uint8 *q, uint8 *r) +#else +inline void MOS6569::el_std_text(uint8 *p, uint8 *q, uint8 *r) +#endif +{ + unsigned int b0cc = b0c; +#ifdef __POWERPC__ + double *dp = (double *)p - 1; +#else + uint32 *lp = (uint32 *)p; +#endif + uint8 *cp = color_line; + uint8 *mp = matrix_line; + + // Loop for 40 characters + for (int i=0; i<40; i++) { + uint8 color = cp[i]; + uint8 data = r[i] = q[mp[i] << 3]; + +#ifdef __POWERPC__ + *++dp = TextColorTable[color][b0cc][data].b; +#else + *lp++ = TextColorTable[color][b0cc][data][0].b; + *lp++ = TextColorTable[color][b0cc][data][1].b; +#endif + } +} + + +#ifdef GLOBAL_VARS +static inline void el_mc_text(uint8 *p, uint8 *q, uint8 *r) +#else +inline void MOS6569::el_mc_text(uint8 *p, uint8 *q, uint8 *r) +#endif +{ + uint16 *wp = (uint16 *)p; + uint8 *cp = color_line; + uint8 *mp = matrix_line; + uint16 *mclp = mc_color_lookup; + + // Loop for 40 characters + for (int i=0; i<40; i++) { + uint8 data = q[mp[i] << 3]; + + if (cp[i] & 8) { + uint8 color = colors[cp[i] & 7]; + r[i] = (data & 0xaa) | (data & 0xaa) >> 1; + mclp[3] = color | (color << 8); + *wp++ = mclp[(data >> 6) & 3]; + *wp++ = mclp[(data >> 4) & 3]; + *wp++ = mclp[(data >> 2) & 3]; + *wp++ = mclp[(data >> 0) & 3]; + + } else { // Standard mode in multicolor mode + uint8 color = cp[i]; + r[i] = data; +#ifdef __POWERPC__ + *(double *)wp = TextColorTable[color][b0c][data].b; + wp += 4; +#else + *(uint32 *)wp = TextColorTable[color][b0c][data][0].b; + wp += 2; + *(uint32 *)wp = TextColorTable[color][b0c][data][1].b; + wp += 2; +#endif + } + } +} + + +#ifdef GLOBAL_VARS +static inline void el_std_bitmap(uint8 *p, uint8 *q, uint8 *r) +#else +inline void MOS6569::el_std_bitmap(uint8 *p, uint8 *q, uint8 *r) +#endif +{ +#ifdef __POWERPC__ + double *dp = (double *)p-1; +#else + uint32 *lp = (uint32 *)p; +#endif + uint8 *mp = matrix_line; + + // Loop for 40 characters + for (int i=0; i<40; i++, q+=8) { + uint8 data = r[i] = *q; + uint8 color = mp[i] >> 4; + uint8 bcolor = mp[i] & 15; + +#ifdef __POWERPC__ + *++dp = TextColorTable[color][bcolor][data].b; +#else + *lp++ = TextColorTable[color][bcolor][data][0].b; + *lp++ = TextColorTable[color][bcolor][data][1].b; +#endif + } +} + + +#ifdef GLOBAL_VARS +static inline void el_mc_bitmap(uint8 *p, uint8 *q, uint8 *r) +#else +inline void MOS6569::el_mc_bitmap(uint8 *p, uint8 *q, uint8 *r) +#endif +{ + uint16 lookup[4]; + uint16 *wp = (uint16 *)p - 1; + uint8 *cp = color_line; + uint8 *mp = matrix_line; + +#ifdef __GNU_C__ + &lookup; /* Statement with no effect other than preventing GCC from + * putting the array in a register, which generates + * spectacularly bad code. */ +#endif + + lookup[0] = (b0c_color << 8) | b0c_color; + + // Loop for 40 characters + for (int i=0; i<40; i++, q+=8) { + uint8 color, acolor, bcolor; + + color = colors[mp[i] >> 4]; + lookup[1] = (color << 8) | color; + bcolor = colors[mp[i]]; + lookup[2] = (bcolor << 8) | bcolor; + acolor = colors[cp[i]]; + lookup[3] = (acolor << 8) | acolor; + + uint8 data = *q; + r[i] = (data & 0xaa) | (data & 0xaa) >> 1; + + *++wp = lookup[(data >> 6) & 3]; + *++wp = lookup[(data >> 4) & 3]; + *++wp = lookup[(data >> 2) & 3]; + *++wp = lookup[(data >> 0) & 3]; + } +} + + +#ifdef GLOBAL_VARS +static inline void el_ecm_text(uint8 *p, uint8 *q, uint8 *r) +#else +inline void MOS6569::el_ecm_text(uint8 *p, uint8 *q, uint8 *r) +#endif +{ +#ifdef __POWERPC__ + double *dp = (double *)p - 1; +#else + uint32 *lp = (uint32 *)p; +#endif + uint8 *cp = color_line; + uint8 *mp = matrix_line; + uint8 *bcp = &b0c; + + // Loop for 40 characters + for (int i=0; i<40; i++) { + uint8 data = r[i] = mp[i]; + uint8 color = cp[i]; + uint8 bcolor = bcp[(data >> 6) & 3]; + + data = q[(data & 0x3f) << 3]; +#ifdef __POWERPC__ + *++dp = TextColorTable[color][bcolor][data].b; +#else + *lp++ = TextColorTable[color][bcolor][data][0].b; + *lp++ = TextColorTable[color][bcolor][data][1].b; +#endif + } +} + + +#ifdef GLOBAL_VARS +static inline void el_std_idle(uint8 *p, uint8 *r) +#else +inline void MOS6569::el_std_idle(uint8 *p, uint8 *r) +#endif +{ +#ifdef __POWERPC__ + uint8 data = *get_physical(ctrl1 & 0x40 ? 0x39ff : 0x3fff); + double *dp = (double *)p - 1; + double conv = TextColorTable[0][b0c][data].b; + r--; + + for (int i=0; i<40; i++) { + *++dp = conv; + *++r = data; + } +#else + uint8 data = *get_physical(ctrl1 & 0x40 ? 0x39ff : 0x3fff); + uint32 *lp = (uint32 *)p; + uint32 conv0 = TextColorTable[0][b0c][data][0].b; + uint32 conv1 = TextColorTable[0][b0c][data][1].b; + + for (int i=0; i<40; i++) { + *lp++ = conv0; + *lp++ = conv1; + *r++ = data; + } +#endif +} + + +#ifdef GLOBAL_VARS +static inline void el_mc_idle(uint8 *p, uint8 *r) +#else +inline void MOS6569::el_mc_idle(uint8 *p, uint8 *r) +#endif +{ + uint8 data = *get_physical(0x3fff); + uint32 *lp = (uint32 *)p - 1; + r--; + + uint16 lookup[4]; + lookup[0] = (b0c_color << 8) | b0c_color; + lookup[1] = lookup[2] = lookup[3] = colors[0]; + + uint16 conv0 = (lookup[(data >> 6) & 3] << 16) | lookup[(data >> 4) & 3]; + uint16 conv1 = (lookup[(data >> 2) & 3] << 16) | lookup[(data >> 0) & 3]; + + for (int i=0; i<40; i++) { + *++lp = conv0; + *++lp = conv1; + *++r = data; + } +} + + +#ifdef GLOBAL_VARS +static inline void el_sprites(uint8 *chunky_ptr) +#else +inline void MOS6569::el_sprites(uint8 *chunky_ptr) +#endif +{ + int i; + int snum, sbit; // Sprite number/bit mask + int spr_coll=0, gfx_coll=0; + + // Draw each active sprite + for (snum=0, sbit=1; snum<8; snum++, sbit<<=1) + if ((sprite_on & sbit) && mx[snum] < DISPLAY_X-32) { + int spr_mask_pos; // Sprite bit position in fore_mask_buf + uint32 sdata, fore_mask; + + uint8 *p = chunky_ptr + mx[snum] + 8; + uint8 *q = spr_coll_buf + mx[snum] + 8; + + uint8 *sdatap = get_physical(matrix_base[0x3f8 + snum] << 6 | mc[snum]); + sdata = (*sdatap << 24) | (*(sdatap+1) << 16) | (*(sdatap+2) << 8); + + uint8 color = spr_color[snum]; + + spr_mask_pos = mx[snum] + 8 - x_scroll; + + uint8 *fmbp = fore_mask_buf + (spr_mask_pos / 8); + int sshift = spr_mask_pos & 7; + fore_mask = (((*(fmbp+0) << 24) | (*(fmbp+1) << 16) | (*(fmbp+2) << 8) + | (*(fmbp+3))) << sshift) | (*(fmbp+4) >> (8-sshift)); + + if (mxe & sbit) { // X-expanded + if (mx[snum] >= DISPLAY_X-56) + continue; + + uint32 sdata_l = 0, sdata_r = 0, fore_mask_r; + fore_mask_r = (((*(fmbp+4) << 24) | (*(fmbp+5) << 16) | (*(fmbp+6) << 8) + | (*(fmbp+7))) << sshift) | (*(fmbp+8) >> (8-sshift)); + + if (mmc & sbit) { // Multicolor mode + uint32 plane0_l, plane0_r, plane1_l, plane1_r; + + // Expand sprite data + sdata_l = MultiExpTable[sdata >> 24 & 0xff] << 16 | MultiExpTable[sdata >> 16 & 0xff]; + sdata_r = MultiExpTable[sdata >> 8 & 0xff] << 16; + + // Convert sprite chunky pixels to bitplanes + plane0_l = (sdata_l & 0x55555555) | (sdata_l & 0x55555555) << 1; + plane1_l = (sdata_l & 0xaaaaaaaa) | (sdata_l & 0xaaaaaaaa) >> 1; + plane0_r = (sdata_r & 0x55555555) | (sdata_r & 0x55555555) << 1; + plane1_r = (sdata_r & 0xaaaaaaaa) | (sdata_r & 0xaaaaaaaa) >> 1; + + // Collision with graphics? + if ((fore_mask & (plane0_l | plane1_l)) || (fore_mask_r & (plane0_r | plane1_r))) { + gfx_coll |= sbit; + if (mdp & sbit) { + plane0_l &= ~fore_mask; // Mask sprite if in background + plane1_l &= ~fore_mask; + plane0_r &= ~fore_mask_r; + plane1_r &= ~fore_mask_r; + } + } + + // Paint sprite + for (i=0; i<32; i++, plane0_l<<=1, plane1_l<<=1) { + uint8 col; + if (plane1_l & 0x80000000) { + if (plane0_l & 0x80000000) + col = mm1_color; + else + col = color; + } else { + if (plane0_l & 0x80000000) + col = mm0_color; + else + continue; + } + if (q[i]) + spr_coll |= q[i] | sbit; + else { + p[i] = col; + q[i] = sbit; + } + } + for (; i<48; i++, plane0_r<<=1, plane1_r<<=1) { + uint8 col; + if (plane1_r & 0x80000000) { + if (plane0_r & 0x80000000) + col = mm1_color; + else + col = color; + } else { + if (plane0_r & 0x80000000) + col = mm0_color; + else + continue; + } + if (q[i]) + spr_coll |= q[i] | sbit; + else { + p[i] = col; + q[i] = sbit; + } + } + + } else { // Standard mode + + // Expand sprite data + sdata_l = ExpTable[sdata >> 24 & 0xff] << 16 | ExpTable[sdata >> 16 & 0xff]; + sdata_r = ExpTable[sdata >> 8 & 0xff] << 16; + + // Collision with graphics? + if ((fore_mask & sdata_l) || (fore_mask_r & sdata_r)) { + gfx_coll |= sbit; + if (mdp & sbit) { + sdata_l &= ~fore_mask; // Mask sprite if in background + sdata_r &= ~fore_mask_r; + } + } + + // Paint sprite + for (i=0; i<32; i++, sdata_l<<=1) + if (sdata_l & 0x80000000) { + if (q[i]) // Collision with sprite? + spr_coll |= q[i] | sbit; + else { // Draw pixel if no collision + p[i] = color; + q[i] = sbit; + } + } + for (; i<48; i++, sdata_r<<=1) + if (sdata_r & 0x80000000) { + if (q[i]) // Collision with sprite? + spr_coll |= q[i] | sbit; + else { // Draw pixel if no collision + p[i] = color; + q[i] = sbit; + } + } + } + + } else // Unexpanded + + if (mmc & sbit) { // Multicolor mode + uint32 plane0, plane1; + + // Convert sprite chunky pixels to bitplanes + plane0 = (sdata & 0x55555555) | (sdata & 0x55555555) << 1; + plane1 = (sdata & 0xaaaaaaaa) | (sdata & 0xaaaaaaaa) >> 1; + + // Collision with graphics? + if (fore_mask & (plane0 | plane1)) { + gfx_coll |= sbit; + if (mdp & sbit) { + plane0 &= ~fore_mask; // Mask sprite if in background + plane1 &= ~fore_mask; + } + } + + // Paint sprite + for (i=0; i<24; i++, plane0<<=1, plane1<<=1) { + uint8 col; + if (plane1 & 0x80000000) { + if (plane0 & 0x80000000) + col = mm1_color; + else + col = color; + } else { + if (plane0 & 0x80000000) + col = mm0_color; + else + continue; + } + if (q[i]) + spr_coll |= q[i] | sbit; + else { + p[i] = col; + q[i] = sbit; + } + } + + } else { // Standard mode + + // Collision with graphics? + if (fore_mask & sdata) { + gfx_coll |= sbit; + if (mdp & sbit) + sdata &= ~fore_mask; // Mask sprite if in background + } + + // Paint sprite + for (i=0; i<24; i++, sdata<<=1) + if (sdata & 0x80000000) { + if (q[i]) { // Collision with sprite? + spr_coll |= q[i] | sbit; + } else { // Draw pixel if no collision + p[i] = color; + q[i] = sbit; + } + } + + } + } + + if (ThePrefs.SpriteCollisions) { + + // Check sprite-sprite collisions + if (clx_spr) + clx_spr |= spr_coll; + else { + clx_spr |= spr_coll; + irq_flag |= 0x04; + if (irq_mask & 0x04) { + irq_flag |= 0x80; + the_cpu->TriggerVICIRQ(); + } + } + + // Check sprite-background collisions + if (clx_bgr) + clx_bgr |= gfx_coll; + else { + clx_bgr |= gfx_coll; + irq_flag |= 0x02; + if (irq_mask & 0x02) { + irq_flag |= 0x80; + the_cpu->TriggerVICIRQ(); + } + } + } +} + + +#ifdef GLOBAL_VARS +static inline int el_update_mc(int raster) +#else +inline int MOS6569::el_update_mc(int raster) +#endif +{ + int i, j; + int cycles_used = 0; + uint8 spron = sprite_on; + uint8 spren = me; + uint8 sprye = mye; + uint8 raster8bit = raster; + uint16 *mcp = mc; + uint8 *myp = my; + + // Increment sprite data counters + for (i=0, j=1; i<8; i++, j<<=1, mcp++, myp++) { + + // Sprite enabled? + if (spren & j) + + // Yes, activate if Y position matches raster counter + if (*myp == (raster8bit & 0xff)) { + *mcp = 0; + spron |= j; + } else + goto spr_off; + else +spr_off: + // No, turn sprite off when data counter exceeds 60 + // and increment counter + if (*mcp != 63) { + if (sprye & j) { // Y expansion + if (!((*myp ^ raster8bit) & 1)) { + *mcp += 3; + cycles_used += 2; + if (*mcp == 63) + spron &= ~j; + } + } else { + *mcp += 3; + cycles_used += 2; + if (*mcp == 63) + spron &= ~j; + } + } + } + + sprite_on = spron; + return cycles_used; +} + + +#ifdef __POWERPC__ +static asm void fastcopy(register uchar *dst, register uchar *src); +static asm void fastcopy(register uchar *dst, register uchar *src) +{ + lfd fp0,0(src) + lfd fp1,8(src) + lfd fp2,16(src) + lfd fp3,24(src) + lfd fp4,32(src) + lfd fp5,40(src) + lfd fp6,48(src) + lfd fp7,56(src) + addi src,src,64 + stfd fp0,0(dst) + stfd fp1,8(dst) + stfd fp2,16(dst) + stfd fp3,24(dst) + stfd fp4,32(dst) + stfd fp5,40(dst) + stfd fp6,48(dst) + stfd fp7,56(dst) + addi dst,dst,64 + + lfd fp0,0(src) + lfd fp1,8(src) + lfd fp2,16(src) + lfd fp3,24(src) + lfd fp4,32(src) + lfd fp5,40(src) + lfd fp6,48(src) + lfd fp7,56(src) + addi src,src,64 + stfd fp0,0(dst) + stfd fp1,8(dst) + stfd fp2,16(dst) + stfd fp3,24(dst) + stfd fp4,32(dst) + stfd fp5,40(dst) + stfd fp6,48(dst) + stfd fp7,56(dst) + addi dst,dst,64 + + lfd fp0,0(src) + lfd fp1,8(src) + lfd fp2,16(src) + lfd fp3,24(src) + lfd fp4,32(src) + lfd fp5,40(src) + lfd fp6,48(src) + lfd fp7,56(src) + addi src,src,64 + stfd fp0,0(dst) + stfd fp1,8(dst) + stfd fp2,16(dst) + stfd fp3,24(dst) + stfd fp4,32(dst) + stfd fp5,40(dst) + stfd fp6,48(dst) + stfd fp7,56(dst) + addi dst,dst,64 + + lfd fp0,0(src) + lfd fp1,8(src) + lfd fp2,16(src) + lfd fp3,24(src) + lfd fp4,32(src) + lfd fp5,40(src) + lfd fp6,48(src) + lfd fp7,56(src) + addi src,src,64 + stfd fp0,0(dst) + stfd fp1,8(dst) + stfd fp2,16(dst) + stfd fp3,24(dst) + stfd fp4,32(dst) + stfd fp5,40(dst) + stfd fp6,48(dst) + stfd fp7,56(dst) + addi dst,dst,64 + + lfd fp0,0(src) + lfd fp1,8(src) + lfd fp2,16(src) + lfd fp3,24(src) + lfd fp4,32(src) + lfd fp5,40(src) + lfd fp6,48(src) + lfd fp7,56(src) + addi src,src,64 + stfd fp0,0(dst) + stfd fp1,8(dst) + stfd fp2,16(dst) + stfd fp3,24(dst) + stfd fp4,32(dst) + stfd fp5,40(dst) + stfd fp6,48(dst) + stfd fp7,56(dst) + addi dst,dst,64 + + lfd fp0,0(src) + lfd fp1,8(src) + lfd fp2,16(src) + lfd fp3,24(src) + lfd fp4,32(src) + lfd fp5,40(src) + lfd fp6,48(src) + lfd fp7,56(src) + addi src,src,64 + stfd fp0,0(dst) + stfd fp1,8(dst) + stfd fp2,16(dst) + stfd fp3,24(dst) + stfd fp4,32(dst) + stfd fp5,40(dst) + stfd fp6,48(dst) + stfd fp7,56(dst) + addi dst,dst,64 + blr +} +#endif + + +/* + * Emulate one raster line + */ + +int MOS6569::EmulateLine(void) +{ + int cycles_left = ThePrefs.NormalCycles; // Cycles left for CPU + bool is_bad_line = false; + + // Get raster counter into local variable for faster access and increment + unsigned int raster = raster_y+1; + + // End of screen reached? + if (raster != TOTAL_RASTERS) + raster_y = raster; + else { + vblank(); + raster = 0; + } + + // Trigger raster IRQ if IRQ line reached + if (raster == irq_raster) + raster_irq(); + + // In line $30, the DEN bit controls if Bad Lines can occur + if (raster == 0x30) + bad_lines_enabled = ctrl1 & 0x10; + + // Skip frame? Only calculate Bad Lines then + if (frame_skipped) { + if (raster >= FIRST_DMA_LINE && raster <= LAST_DMA_LINE && ((raster & 7) == y_scroll) && bad_lines_enabled) { + is_bad_line = true; + cycles_left = ThePrefs.BadLineCycles; + } + goto VIC_nop; + } + + // Within the visible range? + if (raster >= FIRST_DISP_LINE && raster <= LAST_DISP_LINE) { + + // Our output goes here +#ifdef __POWERPC__ + uint8 *chunky_ptr = (uint8 *)chunky_tmp; +#else + uint8 *chunky_ptr = chunky_line_start; +#endif + + // Set video counter + vc = vc_base; + + // Bad Line condition? + if (raster >= FIRST_DMA_LINE && raster <= LAST_DMA_LINE && ((raster & 7) == y_scroll) && bad_lines_enabled) { + + // Turn on display + display_state = is_bad_line = true; + cycles_left = ThePrefs.BadLineCycles; + rc = 0; + + // Read and latch 40 bytes from video matrix and color RAM + uint8 *mp = matrix_line - 1; + uint8 *cp = color_line - 1; + int vc1 = vc - 1; + uint8 *mbp = matrix_base + vc1; + uint8 *crp = color_ram + vc1; + for (int i=0; i<40; i++) { + *++mp = *++mbp; + *++cp = *++crp; + } + } + + // Handler upper/lower border + if (raster == dy_stop) + border_on = true; + if (raster == dy_start && (ctrl1 & 0x10)) // Don't turn off border if DEN bit cleared + border_on = false; + + if (!border_on) { + + // Display window contents + uint8 *p = chunky_ptr + COL40_XSTART; // Pointer in chunky display buffer + uint8 *r = fore_mask_buf + COL40_XSTART/8; // Pointer in foreground mask buffer +#ifdef ALIGNMENT_CHECK + uint8 *use_p = ((((int)p) & 3) == 0) ? p : text_chunky_buf; +#endif + + { + p--; + uint8 b0cc = b0c_color; + int limit = x_scroll; + for (int i=0; i0 + *++p = b0cc; + p++; + } + + if (display_state) { + switch (display_idx) { + + case 0: // Standard text +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_std_text(use_p, char_base + rc, r); + if (use_p != p) + memcpy(p, use_p, 8*40); +#else + if (x_scroll) { + el_std_text(text_chunky_buf, char_base + rc, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_std_text(p, char_base + rc, r); +#endif +#else + el_std_text(p, char_base + rc, r); +#endif + break; + + case 1: // Multicolor text +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_mc_text(use_p, char_base + rc, r); + if (use_p != p) + memcpy(p, use_p, 8*40); +#else + if (x_scroll) { + el_mc_text(text_chunky_buf, char_base + rc, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_mc_text(p, char_base + rc, r); +#endif +#else + el_mc_text(p, char_base + rc, r); +#endif + break; + + case 2: // Standard bitmap +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_std_bitmap(use_p, bitmap_base + (vc << 3) + rc, r); + if (use_p != p) + memcpy(p, use_p, 8*40); +#else + if (x_scroll) { + el_std_bitmap(text_chunky_buf, bitmap_base + (vc << 3) + rc, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_std_bitmap(p, bitmap_base + (vc << 3) + rc, r); +#endif +#else + el_std_bitmap(p, bitmap_base + (vc << 3) + rc, r); +#endif + break; + + case 3: // Multicolor bitmap +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_mc_bitmap(use_p, bitmap_base + (vc << 3) + rc, r); + if (use_p != p) + memcpy(p, use_p, 8*40); +#else + if (x_scroll) { + el_mc_bitmap(text_chunky_buf, bitmap_base + (vc << 3) + rc, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_mc_bitmap(p, bitmap_base + (vc << 3) + rc, r); +#endif +#else + el_mc_bitmap(p, bitmap_base + (vc << 3) + rc, r); +#endif + break; + + case 4: // ECM text +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_ecm_text(use_p, char_base + rc, r); + if (use_p != p) + memcpy(p, use_p, 8*40); +#else + if (x_scroll) { + el_ecm_text(text_chunky_buf, char_base + rc, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_ecm_text(p, char_base + rc, r); +#endif +#else + el_ecm_text(p, char_base + rc, r); +#endif + break; + + default: // Invalid mode (all black) + memset(p, colors[0], 320); + memset(r, 0, 40); + break; + } + vc += 40; + + } else { // Idle state graphics + switch (display_idx) { + + case 0: // Standard text + case 1: // Multicolor text + case 4: // ECM text +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_std_idle(use_p, r); + if (use_p != p) {memcpy(p, use_p, 8*40);} +#else + if (x_scroll) { + el_std_idle(text_chunky_buf, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_std_idle(p, r); +#endif +#else + el_std_idle(p, r); +#endif + break; + + case 3: // Multicolor bitmap +#ifndef CAN_ACCESS_UNALIGNED +#ifdef ALIGNMENT_CHECK + el_mc_idle(use_p, r); + if (use_p != p) {memcpy(p, use_p, 8*40);} +#else + if (x_scroll) { + el_mc_idle(text_chunky_buf, r); + memcpy(p, text_chunky_buf, 8*40); + } else + el_mc_idle(p, r); +#endif +#else + el_mc_idle(p, r); +#endif + break; + + default: // Invalid mode (all black) + memset(p, colors[0], 320); + memset(r, 0, 40); + break; + } + } + + // Draw sprites + if (sprite_on && ThePrefs.SpritesOn) { + + // Clear sprite collision buffer + uint32 *lp = (uint32 *)spr_coll_buf - 1; + for (int i=0; i= FIRST_DMA_LINE-1 && raster <= LAST_DMA_LINE-1 && (((raster+1) & 7) == y_scroll) && bad_lines_enabled) + rc = 0; + } + +VIC_nop: + // Skip this if all sprites are off + if (me | sprite_on) + cycles_left -= el_update_mc(raster); + + return cycles_left; +} diff --git a/archive-sources/c64emu/VIC.h b/archive-sources/c64emu/VIC.h new file mode 100644 index 0000000..d5eaaed --- /dev/null +++ b/archive-sources/c64emu/VIC.h @@ -0,0 +1,274 @@ +/* + * VIC.h - 6569R5 emulation (line based) + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _VIC_H +#define _VIC_H + + +// Define this if you want global variables instead of member variables +#if defined(__i386) || defined(mc68000) || defined(__MC68K__) +#define GLOBAL_VARS +#endif + +// Define this if you have a processor that can do unaligned accesses quickly +#if defined(__i386) || defined(mc68000) || defined(__MC68K__) +#define CAN_ACCESS_UNALIGNED +#endif + + +// Total number of raster lines (PAL) +const int TOTAL_RASTERS = 0x138; + +// Screen refresh frequency (PAL) +const int SCREEN_FREQ = 50; + + +class MOS6510; +class C64Display; +class C64; +struct MOS6569State; + + +class MOS6569 { +public: + MOS6569(C64 *c64, C64Display *disp, MOS6510 *CPU, uint8 *RAM, uint8 *Char, uint8 *Color); + + uint8 ReadRegister(uint16 adr); + void WriteRegister(uint16 adr, uint8 byte); +#ifdef FRODO_SC + bool EmulateCycle(void); +#else + int EmulateLine(void); +#endif + void ChangedVA(uint16 new_va); // CIA VA14/15 has changed + void TriggerLightpen(void); // Trigger lightpen interrupt + void ReInitColors(void); + void GetState(MOS6569State *vd); + void SetState(MOS6569State *vd); + +#ifdef FRODO_SC + uint8 LastVICByte; +#endif + +private: +#ifndef GLOBAL_VARS + void vblank(void); + void raster_irq(void); + + uint16 mx[8]; // VIC registers + uint8 my[8]; + uint8 mx8; + uint8 ctrl1, ctrl2; + uint8 lpx, lpy; + uint8 me, mxe, mye, mdp, mmc; + uint8 vbase; + uint8 irq_flag, irq_mask; + uint8 clx_spr, clx_bgr; + uint8 ec, b0c, b1c, b2c, b3c, mm0, mm1; + uint8 sc[8]; + + uint8 *ram, *char_rom, *color_ram; // Pointers to RAM and ROM + C64 *the_c64; // Pointer to C64 + C64Display *the_display; // Pointer to C64Display + MOS6510 *the_cpu; // Pointer to 6510 + + uint8 colors[256]; // Indices of the 16 C64 colors (16 times mirrored to avoid "& 0x0f") + + uint8 ec_color, b0c_color, b1c_color, + b2c_color, b3c_color; // Indices for exterior/background colors + uint8 mm0_color, mm1_color; // Indices for MOB multicolors + uint8 spr_color[8]; // Indices for MOB colors + + uint32 ec_color_long; // ec_color expanded to 32 bits + + uint8 matrix_line[40]; // Buffer for video line, read in Bad Lines + uint8 color_line[40]; // Buffer for color line, read in Bad Lines + +#ifdef __POWERPC__ + double chunky_tmp[0x180/8]; // Temporary line buffer for speedup +#endif + uint8 *chunky_line_start; // Pointer to start of current line in bitmap buffer + int xmod; // Number of bytes per row + + uint16 raster_y; // Current raster line + uint16 irq_raster; // Interrupt raster line + uint16 dy_start; // Comparison values for border logic + uint16 dy_stop; + uint16 rc; // Row counter + uint16 vc; // Video counter + uint16 vc_base; // Video counter base + uint16 x_scroll; // X scroll value + uint16 y_scroll; // Y scroll value + uint16 cia_vabase; // CIA VA14/15 video base + + uint16 mc[8]; // Sprite data counters + + int display_idx; // Index of current display mode + int skip_counter; // Counter for frame-skipping + + long pad0; // Keep buffers long-aligned + uint8 spr_coll_buf[0x180]; // Buffer for sprite-sprite collisions and priorities + uint8 fore_mask_buf[0x180/8]; // Foreground mask for sprite-graphics collisions and priorities +#ifndef CAN_ACCESS_UNALIGNED + uint8 text_chunky_buf[40*8]; // Line graphics buffer +#endif + + bool display_state; // true: Display state, false: Idle state + bool border_on; // Flag: Upper/lower border on (Frodo SC: Main border flipflop) + bool frame_skipped; // Flag: Frame is being skipped + uint8 bad_lines_enabled; // Flag: Bad Lines enabled for this frame + bool lp_triggered; // Flag: Lightpen was triggered in this frame + +#ifdef FRODO_SC + uint8 read_byte(uint16 adr); + void matrix_access(void); + void graphics_access(void); + void draw_graphics(void); + void draw_sprites(void); + void draw_background(void); + + int cycle; // Current cycle in line (1..63) + + uint8 *chunky_ptr; // Pointer in chunky bitmap buffer (this is where out output goes) + uint8 *fore_mask_ptr; // Pointer in fore_mask_buf + + uint16 matrix_base; // Video matrix base + uint16 char_base; // Character generator base + uint16 bitmap_base; // Bitmap base + + bool is_bad_line; // Flag: Current line is bad line + bool draw_this_line; // Flag: This line is drawn on the screen + bool ud_border_on; // Flag: Upper/lower border on + bool vblanking; // Flag: VBlank in next cycle + + bool border_on_sample[5]; // Samples of border state at different cycles (1, 17, 18, 56, 57) + uint8 border_color_sample[0x180/8]; // Samples of border color at each "displayed" cycle + + uint8 ref_cnt; // Refresh counter + uint8 spr_exp_y; // 8 sprite y expansion flipflops + uint8 spr_dma_on; // 8 flags: Sprite DMA active + uint8 spr_disp_on; // 8 flags: Sprite display active + uint8 spr_draw; // 8 flags: Draw sprite in this line + uint16 spr_ptr[8]; // Sprite data pointers + uint16 mc_base[8]; // Sprite data counter bases + + uint16 raster_x; // Current raster x position + + int ml_index; // Index in matrix/color_line[] + uint8 gfx_data, char_data, color_data, last_char_data; + uint8 spr_data[8][4]; // Sprite data read + uint8 spr_draw_data[8][4]; // Sprite data for drawing + + uint32 first_ba_cycle; // Cycle when BA first went low +#else + uint8 *get_physical(uint16 adr); + void make_mc_table(void); + void el_std_text(uint8 *p, uint8 *q, uint8 *r); + void el_mc_text(uint8 *p, uint8 *q, uint8 *r); + void el_std_bitmap(uint8 *p, uint8 *q, uint8 *r); + void el_mc_bitmap(uint8 *p, uint8 *q, uint8 *r); + void el_ecm_text(uint8 *p, uint8 *q, uint8 *r); + void el_std_idle(uint8 *p, uint8 *r); + void el_mc_idle(uint8 *p, uint8 *r); + void el_sprites(uint8 *chunky_ptr); + int el_update_mc(int raster); + + uint16 mc_color_lookup[4]; + + bool border_40_col; // Flag: 40 column border + uint8 sprite_on; // 8 flags: Sprite display/DMA active + + uint8 *matrix_base; // Video matrix base + uint8 *char_base; // Character generator base + uint8 *bitmap_base; // Bitmap base +#endif +#endif +}; + + +// VIC state +struct MOS6569State { + uint8 m0x; // Sprite coordinates + uint8 m0y; + uint8 m1x; + uint8 m1y; + uint8 m2x; + uint8 m2y; + uint8 m3x; + uint8 m3y; + uint8 m4x; + uint8 m4y; + uint8 m5x; + uint8 m5y; + uint8 m6x; + uint8 m6y; + uint8 m7x; + uint8 m7y; + uint8 mx8; + + uint8 ctrl1; // Control registers + uint8 raster; + uint8 lpx; + uint8 lpy; + uint8 me; + uint8 ctrl2; + uint8 mye; + uint8 vbase; + uint8 irq_flag; + uint8 irq_mask; + uint8 mdp; + uint8 mmc; + uint8 mxe; + uint8 mm; + uint8 md; + + uint8 ec; // Color registers + uint8 b0c; + uint8 b1c; + uint8 b2c; + uint8 b3c; + uint8 mm0; + uint8 mm1; + uint8 m0c; + uint8 m1c; + uint8 m2c; + uint8 m3c; + uint8 m4c; + uint8 m5c; + uint8 m6c; + uint8 m7c; + // Additional registers + uint8 pad0; + uint16 irq_raster; // IRQ raster line + uint16 vc; // Video counter + uint16 vc_base; // Video counter base + uint8 rc; // Row counter + uint8 spr_dma; // 8 Flags: Sprite DMA active + uint8 spr_disp; // 8 Flags: Sprite display active + uint8 mc[8]; // Sprite data counters + uint8 mc_base[8]; // Sprite data counter bases + bool display_state; // true: Display state, false: Idle state + bool bad_line; // Flag: Bad Line state + bool bad_line_enable; // Flag: Bad Lines enabled for this frame + bool lp_triggered; // Flag: Lightpen was triggered in this frame + bool border_on; // Flag: Upper/lower border on (Frodo SC: Main border flipflop) + + uint16 bank_base; // VIC bank base address + uint16 matrix_base; // Video matrix base + uint16 char_base; // Character generator base + uint16 bitmap_base; // Bitmap base + uint16 sprite_base[8]; // Sprite bases + + // Frodo SC: + int cycle; // Current cycle in line (1..63) + uint16 raster_x; // Current raster x position + int ml_index; // Index in matrix/color_line[] + uint8 ref_cnt; // Refresh counter + uint8 last_vic_byte; // Last byte read by VIC + bool ud_border_on; // Flag: Upper/lower border on +}; + +#endif diff --git a/archive-sources/c64emu/Version.h b/archive-sources/c64emu/Version.h new file mode 100644 index 0000000..22bb4cd --- /dev/null +++ b/archive-sources/c64emu/Version.h @@ -0,0 +1,15 @@ +/* + * Version.h - Version information + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _VERSION_H +#define _VERSION_H + +// Version/revision +const int FRODO_VERSION = 4; +const int FRODO_REVISION = 1; +const char VERSION_STRING[] = "Frodo V4.1a"; + +#endif diff --git a/archive-sources/c64emu/c64emu.cfg b/archive-sources/c64emu/c64emu.cfg new file mode 100644 index 0000000..1deac52 --- /dev/null +++ b/archive-sources/c64emu/c64emu.cfg @@ -0,0 +1,9 @@ +pluginversion=1 +name=c64emu +desc=a C64 Emulator +depend=libfx2.so +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 diff --git a/archive-sources/c64emu/fbemul.h b/archive-sources/c64emu/fbemul.h new file mode 100644 index 0000000..f8cff49 --- /dev/null +++ b/archive-sources/c64emu/fbemul.h @@ -0,0 +1,36 @@ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char UBYTE; + +typedef struct { + int width; + int height; + int bytesperpixel; + int colors; + int linewidth; + int memory; + int flags; + +} vga_modeinfo; + +extern vga_modeinfo *vga_getmodeinfo( int mode ); +extern int vga_setmode(int mode ); +extern void *vga_getgraphmem( void ); +#define vga_drawscanline(y,mem) +extern int vga_setlinearaddressing(void); +extern void vga_setpalette( int i, UBYTE red, UBYTE green, UBYTE blue ); + +extern void vga_drawlogo(void); +extern void vga_printscreen( char *fname ); + +#define TEXT 1 +#define G640x480x256 2 + +#define CAPABLE_LINEAR 1 + +#ifdef __cplusplus +}; +#endif diff --git a/archive-sources/c64emu/joystick.h b/archive-sources/c64emu/joystick.h new file mode 100644 index 0000000..9d1e2df --- /dev/null +++ b/archive-sources/c64emu/joystick.h @@ -0,0 +1,284 @@ +#ifndef _LINUX_JOYSTICK_H +#define _LINUX_JOYSTICK_H + +/* + * /usr/include/linux/joystick.h Version 1.2 + * + * Copyright (C) 1996-1999 Vojtech Pavlik + * + * Sponsored by SuSE + */ + +#include + +/* + * 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 + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic + */ + + +/* + * Version + */ + +#define JS_VERSION 0x01020f + +/* + * Types and constants for reading from /dev/js + */ + +#define JS_EVENT_BUTTON 0x01 /* button pressed/released */ +#define JS_EVENT_AXIS 0x02 /* joystick moved */ +#define JS_EVENT_INIT 0x80 /* initial state of device */ + +struct js_event { + __u32 time; /* event timestamp in miliseconds */ + __s16 value; /* value */ + __u8 type; /* event type */ + __u8 number; /* axis/button number */ +}; + +/* + * IOCTL commands for joystick driver + */ + +#define JSIOCGVERSION _IOR('j', 0x01, __u32) /* get driver version */ + +#define JSIOCGAXES _IOR('j', 0x11, __u8) /* get number of axes */ +#define JSIOCGBUTTONS _IOR('j', 0x12, __u8) /* get number of buttons */ +#define JSIOCGNAME(len) _IOC(_IOC_READ, 'j', 0x13, len) /* get identifier string */ + +#define JSIOCSCORR _IOW('j', 0x21, struct js_corr) /* set correction values */ +#define JSIOCGCORR _IOR('j', 0x22, struct js_corr) /* get correction values */ + +/* + * Types and constants for get/set correction + */ + +#define JS_CORR_NONE 0x00 /* returns raw values */ +#define JS_CORR_BROKEN 0x01 /* broken line */ + +struct js_corr { + __s32 coef[8]; + __s16 prec; + __u16 type; +}; + +/* + * v0.x compatibility definitions + */ + +#define JS_RETURN sizeof(struct JS_DATA_TYPE) +#define JS_TRUE 1 +#define JS_FALSE 0 +#define JS_X_0 0x01 +#define JS_Y_0 0x02 +#define JS_X_1 0x04 +#define JS_Y_1 0x08 +#define JS_MAX 2 + +#define JS_DEF_TIMEOUT 0x1300 +#define JS_DEF_CORR 0 +#define JS_DEF_TIMELIMIT 10L + +#define JS_SET_CAL 1 +#define JS_GET_CAL 2 +#define JS_SET_TIMEOUT 3 +#define JS_GET_TIMEOUT 4 +#define JS_SET_TIMELIMIT 5 +#define JS_GET_TIMELIMIT 6 +#define JS_GET_ALL 7 +#define JS_SET_ALL 8 + +struct JS_DATA_TYPE { + int buttons; + int x; + int y; +}; + +struct JS_DATA_SAVE_TYPE { + int JS_TIMEOUT; + int BUSY; + long JS_EXPIRETIME; + long JS_TIMELIMIT; + struct JS_DATA_TYPE JS_SAVE; + struct JS_DATA_TYPE JS_CORR; +}; + +/* + * Internal definitions + */ + +#ifdef __KERNEL__ + +#define JS_BUFF_SIZE 64 /* output buffer size */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,0) +#error "You need to use at least v2.2 Linux kernel." +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) +typedef struct wait_queue *wait_queue_head_t; +#define __exit +#ifdef MODULE +#define module_init(x) int init_module(void) { return x(); } +#define module_exit(x) void cleanup_module(void) { x(); } +#else +#define module_init(x) int x##_module(void) { return x(); } +#define module_exit(x) void x##_module(void) { x(); } +#endif +#define __setup(a,b) +#define BASE_ADDRESS(x,i) ((x)->base_address[i]) +#define DECLARE_WAITQUEUE(x,y) struct wait_queue x = { y, NULL } +#define init_waitqueue_head(x) do { *(x) = NULL; } while (0) +#define __set_current_state(x) current->state = x +#define SETUP_PARAM char *str, int *ints +#define SETUP_PARSE(x) do {} while (0) +#else +#define BASE_ADDRESS(x,i) ((x)->resource[i].start) +#define SETUP_PARAM char *str +#define SETUP_PARSE(x) int ints[x]; get_options(str, x, ints) +#endif + +#define PCI_VENDOR_ID_AUREAL 0x12eb + +/* + * Parport stuff + */ + + +#define JS_PAR_STATUS_INVERT (0x80) +#define JS_PAR_CTRL_INVERT (0x04) +#define JS_PAR_DATA_IN(y) parport_read_data(y->port) +#define JS_PAR_DATA_OUT(x,y) parport_write_data(y->port, x) +#define JS_PAR_STATUS(y) parport_read_status(y->port) + +#ifndef PARPORT_NEED_GENERIC_OPS +#define JS_PAR_CTRL_IN(y) parport_read_control(y->port) +#else +#define JS_PAR_CTRL_IN(y) inb(y->port->base+2) +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) +#define JS_PAR_CTRL_OUT(x,y) parport_write_control(y->port, x) +#define JS_PAR_ECTRL_OUT(x,y) parport_write_econtrol(y->port, x) +#else +#define JS_PAR_CTRL_OUT(x,y) \ + do { \ + if ((x) & 0x20) parport_data_reverse(y->port); \ + else parport_data_forward(y->port); \ + parport_write_control(y->port, (x) & ~0x20); \ + } while (0) +#define JS_PAR_ECTRL_OUT(x,y) /*parport sets PS/2 mode on ECR chips */ +#define PARPORT_MODE_PCPS2 PARPORT_MODE_TRISTATE +#define PARPORT_MODE_PCECPPS2 PARPORT_MODE_TRISTATE +#endif + +/* + * Internal types + */ + +struct js_dev; + +typedef int (*js_read_func)(void *info, int **axes, int **buttons); +typedef int (*js_ops_func)(struct js_dev *dev); + +struct js_data { + int *axes; + int *buttons; +}; + +struct js_dev { + struct js_dev *next; + struct js_list *list; + struct js_port *port; + wait_queue_head_t wait; + struct js_data cur; + struct js_data new; + struct js_corr *corr; + struct js_event buff[JS_BUFF_SIZE]; + js_ops_func open; + js_ops_func close; + int ahead; + int bhead; + int tail; + int num_axes; + int num_buttons; + char *name; +}; + +struct js_list { + struct js_list *next; + struct js_dev *dev; + int tail; + int startup; +}; + +struct js_port { + struct js_port *next; + struct js_port *prev; + js_read_func read; + struct js_dev **devs; + int **axes; + int **buttons; + struct js_corr **corr; + void *info; + int ndevs; + int fail; + int total; +}; + +/* + * Sub-module interface + */ + +extern struct js_port *js_register_port(struct js_port *port, void *info, + int devs, int infos, js_read_func read); +extern struct js_port *js_unregister_port(struct js_port *port); + +extern int js_register_device(struct js_port *port, int number, int axes, + int buttons, char *name, js_ops_func open, js_ops_func close); +extern void js_unregister_device(struct js_dev *dev); + +/* + * Kernel interface + */ + +extern int js_init(void); +extern int js_am_init(void); +extern int js_an_init(void); +extern int js_as_init(void); +extern int js_console_init(void); +extern int js_cr_init(void); +extern int js_db9_init(void); +extern int js_gr_init(void); +extern int js_l4_init(void); +extern int js_lt_init(void); +extern int js_mag_init(void); +extern int js_pci_init(void); +extern int js_sw_init(void); +extern int js_sball_init(void); +extern int js_orb_init(void); +extern int js_tm_init(void); +extern int js_tg_init(void); +extern int js_war_init(void); + +#endif /* __KERNEL__ */ + +#endif /* _LINUX_JOYSTICK_H */ diff --git a/archive-sources/c64emu/keyemul.c b/archive-sources/c64emu/keyemul.c new file mode 100644 index 0000000..4cc0675 --- /dev/null +++ b/archive-sources/c64emu/keyemul.c @@ -0,0 +1,1028 @@ +#include + +#ifdef HAVE_DBOX_HARDWARE + + #include "input_fake.h" + #define RC_0 KEY_0 + #define RC_1 KEY_1 + #define RC_2 KEY_2 + #define RC_3 KEY_3 + #define RC_4 KEY_4 + #define RC_5 KEY_5 + #define RC_6 KEY_6 + #define RC_7 KEY_7 + #define RC_8 KEY_8 + #define RC_9 KEY_9 + #define RC_RIGHT KEY_RIGHT + #define RC_LEFT KEY_LEFT + #define RC_UP KEY_UP + #define RC_DOWN KEY_DOWN + #define RC_OK KEY_OK + #define RC_SPKR KEY_MUTE + #define RC_STANDBY KEY_POWER + #define RC_GREEN KEY_GREEN + #define RC_YELLOW KEY_YELLOW + #define RC_RED KEY_RED + #define RC_BLUE KEY_BLUE + #define RC_PLUS KEY_VOLUMEUP + #define RC_MINUS KEY_VOLUMEDOWN + #define RC_HELP KEY_HELP + #define RC_SETUP KEY_SETUP + #define RC_HOME KEY_HOME + #define RC_PAGE_DOWN KEY_PAGEDOWN + #define RC_PAGE_UP KEY_PAGEUP + +/* SAGEM remote controls have the following additional keys */ + + #ifndef KEY_TOPLEFT + #define KEY_TOPLEFT 0x1a2 + #endif + + #ifndef KEY_TOPRIGHT + #define KEY_TOPRIGHT 0x1a3 + #endif + + #ifndef KEY_BOTTOMLEFT + #define KEY_BOTTOMLEFT 0x1a4 + #endif + + #ifndef KEY_BOTTOMRIGHT + #define KEY_BOTTOMRIGHT 0x1a5 + #endif + +#else + +#define RC_0 0x00 +#define RC_1 0x01 +#define RC_2 0x02 +#define RC_3 0x03 +#define RC_4 0x04 +#define RC_5 0x05 +#define RC_6 0x06 +#define RC_7 0x07 +#define RC_8 0x08 +#define RC_9 0x09 +#define RC_RIGHT 0x0A +#define RC_LEFT 0x0B +#define RC_UP 0x0C +#define RC_DOWN 0x0D +#define RC_OK 0x0E +#define RC_SPKR 0x0F +#define RC_STANDBY 0x10 +#define RC_GREEN 0x11 +#define RC_YELLOW 0x12 +#define RC_RED 0x13 +#define RC_BLUE 0x14 +#define RC_PLUS 0x15 +#define RC_MINUS 0x16 +#define RC_HELP 0x17 +#define RC_SETUP 0x18 +#define RC_HOME 0x1F +#define RC_PAGE_DOWN 0x53 +#define RC_PAGE_UP 0x54 + +#endif + +static int kbdfd = -1; +static unsigned char actocde = 0x0000; +static int autorep=2; + +typedef struct _KeyAction +{ + unsigned char press; + unsigned char kc; + unsigned char autocont; + struct _KeyAction *next; + +} KeyAction; + +static KeyAction *keya[ 256 ]; + +static unsigned char strg2kc( char *in ) +{ + if ( !strcmp(in,"UP") ) + return RC_UP; + if ( !strcmp(in,"DOWN") ) + return RC_DOWN; + if ( !strcmp(in,"LEFT") ) + return RC_LEFT; + if ( !strcmp(in,"RIGHT") ) + return RC_RIGHT; + if ( !strcmp(in,"OK") ) + return RC_OK; + if ( !strcmp(in,"0") ) + return RC_0; + if ( !strcmp(in,"1") ) + return RC_1; + if ( !strcmp(in,"2") ) + return RC_2; + if ( !strcmp(in,"3") ) + return RC_3; + if ( !strcmp(in,"4") ) + return RC_4; + if ( !strcmp(in,"5") ) + return RC_5; + if ( !strcmp(in,"6") ) + return RC_6; + if ( !strcmp(in,"7") ) + return RC_7; + if ( !strcmp(in,"8") ) + return RC_8; + if ( !strcmp(in,"9") ) + return RC_9; + if ( !strcmp(in,"SPEAKER") ) + return RC_SPKR; + if ( !strcmp(in,"PLUS") ) + return RC_PLUS; + if ( !strcmp(in,"MINUS") ) + return RC_MINUS; + if ( !strcmp(in,"HELP") ) + return RC_HELP; + if ( !strcmp(in,"SETUP") ) + return RC_SETUP; + if ( !strcmp(in,"RED") ) + return RC_RED; + if ( !strcmp(in,"BLUE") ) + return RC_BLUE; + if ( !strcmp(in,"GREEN") ) + return RC_GREEN; + if ( !strcmp(in,"YELLOW") ) + return RC_YELLOW; + return 0xee; +} + +static KeyAction *crAction( unsigned char press, int keycode, + unsigned char autocont ) +{ + KeyAction *c; + + c = (KeyAction*)malloc(sizeof(KeyAction)); + c->press = press; + c->kc = keycode; + c->autocont = autocont; + + return c; +} + +static int scode2c64(unsigned scancode) +{ + switch (scancode) + { + case ',' : return MATRIX(5,7); + case '.': return MATRIX(5,4); + case 'a': case 'A' : return MATRIX(1,2); + case 'b': case 'B' : return MATRIX(3,4); + case 'c': case 'C' : return MATRIX(2,4); + case 'd': case 'D' : return MATRIX(2,2); + case 'e': case 'E' : return MATRIX(1,6); + case 'f': case 'F' : return MATRIX(2,5); + case 'g': case 'G' : return MATRIX(3,2); + case 'h': case 'H' : return MATRIX(3,5); + case 'i': case 'I' : return MATRIX(4,1); + case 'j': case 'J' : return MATRIX(4,2); + case 'k': case 'K' : return MATRIX(4,5); + case 'l': case 'L' : return MATRIX(5,2); + case 'm': case 'M' : return MATRIX(4,4); + case 'n': case 'N' : return MATRIX(4,7); + case 'o': case 'O' : return MATRIX(4,6); + case 'p': case 'P' : return MATRIX(5,1); + case 'q': case 'Q' : return MATRIX(7,6); + case 'r': case 'R' : return MATRIX(2,1); + case 's': case 'S' : return MATRIX(1,5); + case 't': case 'T' : return MATRIX(2,6); + case 'u': case 'U' : return MATRIX(3,6); + case 'v': case 'V' : return MATRIX(3,7); + case 'w': case 'W' : return MATRIX(1,1); + case 'x': case 'X' : return MATRIX(2,7); + case 'y': case 'Y' : return MATRIX(3,1); + case 'z': case 'Z' : return MATRIX(1,4); + + case 0x7f: return MATRIX(0,0); + case 0x08: return MATRIX(0,0); + case 0x07: return MATRIX(7,1); + case 0x0d: return MATRIX(0,1); + case ' ': return MATRIX(7,4); + case 0x1b: return MATRIX(7,7); + + case '0': return MATRIX(4,3); + case '1': return MATRIX(7,0); + case '2': return MATRIX(7,3); + case '"': return MATRIX(7,3) | 0x80; + case '3': return MATRIX(1,0); + case '4': return MATRIX(1,3); + case '5': return MATRIX(2,0); + case '6': return MATRIX(2,3); + case '7': return MATRIX(3,0); + case '8': return MATRIX(3,3); + case '9': return MATRIX(4,0); + + case '[': return MATRIX(5,6); + case '*': return MATRIX(6,1); + case '$': return MATRIX(1,3) | 0x80; + case ']': return MATRIX(6,1) | 0x80; + case '/': return MATRIX(6,7); + case ':': return MATRIX(5,5); + case '~': return MATRIX(6,2); + case '#': return MATRIX(6,5) | 0x80; + case '<': return MATRIX(6,6); + case '>': return MATRIX(6,7); + case '-': return MATRIX(5,3); + case '+': return MATRIX(5,0); + case '=': return MATRIX(6,5); + default : +// printf("unused code %02x\n",scancode); + break; + } + return 0; +} + +static KeyAction *buildAction( char *in ) +{ + KeyAction n1; + KeyAction *l=&n1; + KeyAction *c=0; + char *p; + char *t; + int kc; + int pl; + + n1.next = 0; + + for( p=in; *p; p++ ) + { + if ( *p == '<' ) + { + p++; + t=strchr(p,'>'); + if ( !t ) + break; + pl=(t-p); + *t=0; + if ( !strcmp(p,"F1") ) + { + c=crAction( 3, MATRIX(0,4), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"F2") ) + { + c=crAction( 3, MATRIX(0,4) | 0x80, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"F3") ) + { + c=crAction( 3, MATRIX(0,5), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"F4") ) + { + c=crAction( 3, MATRIX(0,5) | 0x80, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"F5") ) + { + c=crAction( 3, MATRIX(0,6), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"F6") ) + { + c=crAction( 3, MATRIX(0,6) | 0x80, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"RET") ) + { + c=crAction( 1, MATRIX(0,1), 1 ); + l->next = c; + l=c; + c=crAction( 0, MATRIX(0,1), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"DEL") ) + { + c=crAction( 1, MATRIX(0,0), 1 ); + l->next = c; + l=c; + c=crAction( 0, MATRIX(0,0), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"SHL") ) + { + c=crAction( 3, MATRIX(1,0), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"SHR") ) + { + c=crAction( 3, MATRIX(6,4), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"HOM") ) + { + c=crAction( 3, MATRIX(6,3), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"R/S") ) + { + c=crAction( 3, MATRIX(7,7), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"C=") ) + { + c=crAction( 3, MATRIX(7,5), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"CTL") ) + { + c=crAction( 3, MATRIX(7,2), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"CUP") ) + { + c=crAction( 3, MATRIX(0,7) | 0x80, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"CDOWN") ) + { + c=crAction( 3, MATRIX(0,7), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"CLEFT") ) + { + c=crAction( 3, MATRIX(0,2) | 0x80, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"CRIGHT") ) + { + c=crAction( 3, MATRIX(0,2), 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"UP") ) + { + c=crAction( 4, 0x01, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"DOWN") ) + { + c=crAction( 4, 0x02, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"LEFT") ) + { + c=crAction( 4, 0x04, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"RIGHT") ) + { + c=crAction( 4, 0x08, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"UP/LEFT") ) + { + c=crAction( 4, 0x05, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"UP/RIGHT") ) + { + c=crAction( 4, 0x09, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"DOWN/LEFT") ) + { + c=crAction( 4, 0x03, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"DOWN/RIGHT") ) + { + c=crAction( 4, 0x0a, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"FIRE") ) + { + c=crAction( 4, 0x10, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"FIRE2") ) + { + c=crAction( 4, 0x20, 1 ); + l->next = c; + l=c; + } + else if ( !strcmp(p,"PRINT") ) + { + c=crAction( 5, 0x1, 0 ); + l->next = c; + l=c; + } + p+=pl; + continue; + } + kc=scode2c64( *p ); + c=crAction( 1, kc, 1 ); + l->next = c; + l=c; + c=crAction( 0, kc, 1 ); + l->next = c; + l=c; + } + l->autocont=0; + + return n1.next; +} + +static void init_keyfile(void) +{ + FILE *fp; + char buffer[256]; + char *p; + char *c; + KeyAction *k; + KeyAction *e; + unsigned char kc; + + memset(keya,0,sizeof(KeyAction*)*256); + + if ( *kbdname ) + strcpy(buffer,kbdname); + else + { + strcpy(buffer,d64image); + p=strrchr(buffer,'.'); + if ( !p ) + return; + strcpy(p,".kbd"); + } + if ( ! *buffer ) + return; + + fp = fopen( buffer, "r" ); + if ( !fp ) + return; + while( fgets( buffer, 256, fp ) ) + { + if ( *buffer == '#' ) + continue; + p=strchr(buffer,'\n'); + if ( p ) + *p=0; + p=strchr(buffer,':'); + if ( !p ) + continue; + *p=0; + p++; + if ( !strcmp(buffer,"autorep") ) + { + autorep=atoi(p); + if (( autorep < 0 ) || ( autorep > 100 )) + autorep=2; + continue; + } + kc=strg2kc(buffer); + if ( kc == 0xee ) + continue; + k=buildAction(p); + if ( k ) + { + if ( !keya[kc] ) + keya[kc] = k; + else + { + for( e=keya[kc]; e->next; e=e->next ); + e->next = k; + } + } + } + fclose(fp); +} + +static void c64setkey( int kc ) +{ + int c64_byte, c64_bit, shifted; + + if (keystate[kc]) + return; + keystate[kc] = 1; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) { + key_matrix[6] &= 0xef; + rev_matrix[4] &= 0xbf; + } + key_matrix[c64_byte] &= ~(1 << c64_bit); + rev_matrix[c64_bit] &= ~(1 << c64_byte); +} + +static void rec64setkey( int kc ) +{ + int c64_byte, c64_bit, shifted; + + keystate[kc] = 0; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) { + key_matrix[6] |= 0x10; + rev_matrix[4] |= 0x40; + } + key_matrix[c64_byte] |= (1 << c64_bit); + rev_matrix[c64_bit] |= (1 << c64_byte); +} + +static int last_key = 0xee; +static int isjoy; +static int prblocked=0; + +static void autodo( int key ) +{ + KeyAction *k; + int frk=0; + + isjoy = 0; + + if ( key != 0xee ) + last_key = key; + if ( last_key == 0xee ) + return; + + k = keya[ last_key ]; + if ( !k ) + return; + + switch ( k->press ) + { + case 1: + c64setkey(k->kc); + break; + case 0: + rec64setkey(k->kc); + break; + case 3: + if ( !k->next && ( key == 0xee )) + rec64setkey(k->kc); + else + c64setkey(k->kc); + break; + case 4: + if ( !k->next && ( key == 0xee )) + { + joystate |= k->kc; + } + else + { + joystate &= ~k->kc; + if ( k->kc & 0x0f ) + isjoy=1; + } + break; + case 5: + if ( prblocked > 0 ) + break; + if ( !k->next && ( key != 0xee )) + { + prblocked=10; + vga_printscreen( "/var/tmp/screen.xpm" ); + } + break; + } + + if ( k->next ) + { + keya[last_key] = k->next; + frk=1; + } + if ( !k->autocont ) + { + switch( k->press ) + { + case 1: + case 0: + last_key = 0xee; + break; + case 3: + case 4: + case 5: + last_key = key; + break; + } + } + + if ( frk ) + free(k); +} + +#ifdef i386 + +#include + +static struct termios tios; + +static int keyboard_init( void ) +{ + struct termios ntios; + + kbdfd=0; + + init_keyfile(); + + tcgetattr(kbdfd,&tios); + memset(&ntios,0,sizeof(ntios)); + tcsetattr(kbdfd,TCSANOW,&ntios); + + return 0; +} + +#if 0 +static void keyboard_update( void ) +{ + unsigned char buf[ 256 ]; + int x; + int left; + unsigned short code = 0; + unsigned char *p = buf; + int kc; + + if ( kbdfd != 0 ) + return; + + x = read( kbdfd,buf,256); + if ( x>0 ) + { + for( p=buf,left=x; left; left--, p++ ) + { + switch( *p ) + { + case 0x1b : + if ( left >= 3 ) + { + p+=2; + switch( *p ) + { + case 0x41 : + joystate &= ~0x1; + break; + case 0x42 : + joystate &= ~0x2; + break; + case 0x43 : + joystate &= ~0x8; + break; + case 0x44 : + joystate &= ~0x4; + break; + case 0x5b : + p++; + left--; + switch( *p ) + { + case 0x41 : + c64setkey( MATRIX(0,4) ); + break; + case 0x42 : + c64setkey( MATRIX(0,4)|0x80 ); + break; + case 0x43 : + c64setkey( MATRIX(0,5) ); + break; + case 0x44 : + c64setkey( MATRIX(0,5)|0x80 ); + break; + case 0x45 : + c64setkey( MATRIX(0,6) ); + break; + } + break; + case 0x31 : + p++; + left--; + switch( *p ) + { + case 0x37 : + c64setkey( MATRIX(0,6)|0x80 ); + break; + case 0x38 : + c64setkey( MATRIX(0,3) ); + break; + case 0x39 : + c64setkey( MATRIX(0,3)|0x80 ); + break; + default : + printf("31,%02x\n\r",*p); + break; + } + break; + case 0x32 : + p++; + left--; + switch( *p ) + { + case 0x30 : + c64setkey( MATRIX(7,7) ); + break; + case 0x31 : + c64setkey( MATRIX(7,5) ); + break; + case 0x33 : + joystate=0; + c64setkey( MATRIX(0,7) ); + break; + case 0x34 : + f12pressed=1; + break; + case 0x7e : + joystate &= ~0x10; + break; + default : + printf("32,%02x\n\r",*p); + break; + } + break; + default : +printf("do 3. key %02x\n\r",*p); + break; + } + left-=2; + } + else + left=1; + break; + case 0x03 : + tcsetattr(kbdfd,TCSANOW,&tios); + close(kbdfd); + kbdfd=-1; + quit=1; + break; + default : + kc = scode2c64(*p); + c64setkey(kc); + break; + } + } + } + else + { + joystate=0xff; + for( kc=0; kc<256; kc++ ) + { + if (!keystate[kc]) + continue; + keystate[kc]--; + if (keystate[kc]) + continue; + rec64setkey( kc ); + } + } +} +#endif + +static void keyboard_update( void ) +{ + unsigned char buf[ 256 ]; + int x; + int left; + unsigned short code = 0; + unsigned char *p = buf; + int kc; +static int slowdown=0; + + if ( kbdfd != 0 ) + return; + + if ( prblocked ) + prblocked--; + + x = read( kbdfd,buf,256); + if ( x>0 ) + { + if ( slowdown ) + autodo(0xee); + slowdown=0; + for( p=buf,left=x; left; left--, p++ ) + { + switch( *p ) + { + case 0x1b : + if ( left >= 3 ) + { + p+=2; + switch( *p ) + { + case 0x41 : + autodo( RC_UP ); + break; + case 0x42 : + autodo( RC_DOWN ); + break; + case 0x43 : + autodo( RC_LEFT ); + break; + case 0x44 : + autodo( RC_RIGHT ); + break; + case 0x32 : + p++; + left--; + switch( *p ) + { + case 0x7e : + autodo( RC_OK ); + break; + } + break; + } + left-=2; + } + else + left=1; + break; + case 0x03 : + tcsetattr(kbdfd,TCSANOW,&tios); + close(kbdfd); + kbdfd=-1; + quit=1; + break; + case 'r' : + autodo( RC_RED ); + break; + case 'g' : + autodo( RC_GREEN ); + break; + case 'b' : + autodo( RC_BLUE ); + break; + case 'y' : + autodo( RC_YELLOW ); + break; + } + } + if ( isjoy ) + slowdown+=autorep; + } + else + { + if ( slowdown ) + slowdown--; + if ( slowdown ) + return; + autodo(0xee); + } +} + +#else /* i386 */ + +#include + +static int keyboard_init( void ) +{ +#if defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE + char buf[32]; + + kbdfd=open("/dev/dbox/rc0", O_RDONLY); + if ( kbdfd == -1 ) + return -1; + fcntl(kbdfd,F_SETFL,O_NONBLOCK); + ioctl(kbdfd,RC_IOCTL_BCODES, 1 ); + + read( kbdfd, buf, 32 ); /* make it empty */ +#endif + +#ifdef HAVE_DBOX_HARDWARE + kbdfd=open("/dev/input/event0", O_RDONLY); + if ( kbdfd == -1 ) + return -1; + fcntl(kbdfd,F_SETFL,O_NONBLOCK); +#endif + init_keyfile(); + + return 0; +} + +static unsigned short rctranslate( unsigned short code ) +{ + if ((code&0xFF00)==0x5C00) + { + switch (code&0xFF) + { + case 0x0C: return RC_STANDBY; + case 0x20: return RC_HOME; + case 0x27: return RC_SETUP; + case 0x00: return RC_0; + case 0x01: return RC_1; + case 0x02: return RC_2; + case 0x03: return RC_3; + case 0x04: return RC_4; + case 0x05: return RC_5; + case 0x06: return RC_6; + case 0x07: return RC_7; + case 0x08: return RC_8; + case 0x09: return RC_9; + case 0x3B: return RC_BLUE; + case 0x52: return RC_YELLOW; + case 0x55: return RC_GREEN; + case 0x2D: return RC_RED; + case 0x54: return RC_PAGE_UP; + case 0x53: return RC_PAGE_DOWN; + case 0x0E: return RC_UP; + case 0x0F: return RC_DOWN; + case 0x2F: return RC_LEFT; + case 0x2E: return RC_RIGHT; + case 0x30: return RC_OK; + case 0x16: return RC_PLUS; + case 0x17: return RC_MINUS; + case 0x28: return RC_SPKR; + case 0x82: return RC_HELP; + default: + //perror("unknown old rc code"); + return 0xee; + } + } else if (!(code&0x00)) + return code&0x3F; + return 0xee; +} + +static void keyboard_update( void ) +{ + char buf[32]; + int x; + unsigned short code = 0xee; +static int slowdown=0; +static int firstkey=1; + + if ( prblocked ) + prblocked--; + + x = read( kbdfd,buf,32); + if ( x < 2 ) + { + if ( slowdown ) + slowdown--; + if ( slowdown ) + return; + autodo(0xee); + return; + } + + x-=2; + + memcpy(&code,buf+x,2); + + code=rctranslate(code); + + if ( code == 0xee ) + return; + + if (firstkey) + vga_drawlogo(); + firstkey=0; + + if ( slowdown ) + { + if ( code != last_key ) + autodo(0xee); + slowdown=0; + } + + if( code == RC_HOME ) + { + quit=1; + joystate = 0xff; + } + else if( code == RC_STANDBY ) + { + f11pressed=1; + joystate = 0xff; + } + else + autodo(code); + + if ( isjoy ) + slowdown+=autorep; +} + +#endif diff --git a/archive-sources/c64emu/main.cpp b/archive-sources/c64emu/main.cpp new file mode 100644 index 0000000..52457b0 --- /dev/null +++ b/archive-sources/c64emu/main.cpp @@ -0,0 +1,88 @@ +/* + * main.cpp - Main program + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysdeps.h" + +#include "main.h" +#include "C64.h" +#include "Display.h" +#include "Prefs.h" +#include "SAM.h" + + +// Global variables +char AppDirPath[1024]; // Path of application directory +char d64image[512]; // Path of application directory +char kbdname[512]; // Path of application directory + +#define BASIC_ROM_FILE "/lib/tuxbox/plugins/c64emu/basic.rom" +#define KERNAL_ROM_FILE "/lib/tuxbox/plugins/c64emu/kernal.rom" +#define CHAR_ROM_FILE "/lib/tuxbox/plugins/c64emu/char.rom" +#define FLOPPY_ROM_FILE "/lib/tuxbox/plugins/c64emu/1541.rom" + +/* + * Load C64 ROM files + */ + +#ifndef __PSXOS__ +bool Frodo::load_rom_files(void) +{ + FILE *file; + + // Load Basic ROM + if ((file = fopen(BASIC_ROM_FILE, "rb")) != NULL) { + if (fread(TheC64->Basic, 1, 0x2000, file) != 0x2000) { + ShowRequester("Can't read 'Basic ROM'.", "Quit"); + return false; + } + fclose(file); + } else { + ShowRequester("Can't find 'Basic ROM'.", "Quit"); + return false; + } + + // Load Kernal ROM + if ((file = fopen(KERNAL_ROM_FILE, "rb")) != NULL) { + if (fread(TheC64->Kernal, 1, 0x2000, file) != 0x2000) { + ShowRequester("Can't read 'Kernal ROM'.", "Quit"); + return false; + } + fclose(file); + } else { + ShowRequester("Can't find 'Kernal ROM'.", "Quit"); + return false; + } + + // Load Char ROM + if ((file = fopen(CHAR_ROM_FILE, "rb")) != NULL) { + if (fread(TheC64->Char, 1, 0x1000, file) != 0x1000) { + ShowRequester("Can't read 'Char ROM'.", "Quit"); + return false; + } + fclose(file); + } else { + ShowRequester("Can't find 'Char ROM'.", "Quit"); + return false; + } + + // Load 1541 ROM + if ((file = fopen(FLOPPY_ROM_FILE, "rb")) != NULL) { + if (fread(TheC64->ROM1541, 1, 0x4000, file) != 0x4000) { + ShowRequester("Can't read '1541 ROM'.", "Quit"); + return false; + } + fclose(file); + } else { + ShowRequester("Can't find '1541 ROM'.", "Quit"); + return false; + } + + return true; +} +#endif + + +#include "main_x.i" diff --git a/archive-sources/c64emu/main.h b/archive-sources/c64emu/main.h new file mode 100644 index 0000000..ed98d7f --- /dev/null +++ b/archive-sources/c64emu/main.h @@ -0,0 +1,49 @@ +/* + * main.h - Main program + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#ifndef _MAIN_H +#define _MAIN_H + + +class C64; + +// Global variables +extern char AppDirPath[1024]; // Path of application directory +extern char d64image[512]; // fname of application +extern char kbdname[512]; // fname of application + + +/* + * X specific stuff + */ + +class Prefs; + +class Frodo { +public: + Frodo(); + void ArgvReceived(int argc, char **argv); + void ReadyToRun(void); + static Prefs *reload_prefs(void); + + C64 *TheC64; + +private: + bool load_rom_files(void); + + static char prefs_path[256]; // Pathname of current preferences file +}; + + +inline void Debug(const char *format, ...) +{ +} + +#define DebugResult(message, val) \ + Debug("%s: 0x%x (%d)\n", message, val, HRESULT_CODE(val)) + + +#endif diff --git a/archive-sources/c64emu/main_x.i b/archive-sources/c64emu/main_x.i new file mode 100644 index 0000000..226f6af --- /dev/null +++ b/archive-sources/c64emu/main_x.i @@ -0,0 +1,109 @@ +/* + * main_x.i - Main program, X specific stuff + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "Version.h" + + +extern int init_graphics(void); + + +// Global variables +char Frodo::prefs_path[256] = ""; + + +/* + * Create application object and start it + */ + +int main(int argc, char **argv) +{ + Frodo *the_app; + + timeval tv; + gettimeofday(&tv, NULL); + srand(tv.tv_usec); + + *d64image=0; + *kbdname=0; + + if (argc > 1) + strncpy(d64image, argv[1], 255); + + if (argc > 2) + strncpy(kbdname, argv[2], 255); + +// printf("%s by Christian Bauer\n", VERSION_STRING); + if (!init_graphics()) + return 0; + fflush(stdout); + + the_app = new Frodo(); + the_app->ArgvReceived(argc, argv); + the_app->ReadyToRun(); + delete the_app; + + return 0; +} + + +/* + * Constructor: Initialize member variables + */ + +Frodo::Frodo() +{ + TheC64 = NULL; +} + + +/* + * Process command line arguments + */ + +void Frodo::ArgvReceived(int argc, char **argv) +{ + if (argc > 1) + strncpy(d64image, argv[1], 255); + if (argc > 2) + strncpy(kbdname, argv[2], 255); +} + + +/* + * Arguments processed, run emulation + */ + +void Frodo::ReadyToRun(void) +{ + getcwd(AppDirPath, 256); + + // Load preferences + if (!prefs_path[0]) { + char *home = getenv("HOME"); + if (home != NULL && strlen(home) < 240) + { + strncpy(prefs_path, home, 200); + strcat(prefs_path, "/"); + } + strcat(prefs_path, ".frodorc"); + } + ThePrefs.Load(prefs_path); + + // Create and start C64 + TheC64 = new C64; + if (load_rom_files()) { + TheC64->Run(); + } + delete TheC64; +} + + +Prefs *Frodo::reload_prefs(void) +{ + static Prefs newprefs; + newprefs.Load(prefs_path); + return &newprefs; +} diff --git a/archive-sources/c64emu/ndir.c b/archive-sources/c64emu/ndir.c new file mode 100644 index 0000000..b2b833c --- /dev/null +++ b/archive-sources/c64emu/ndir.c @@ -0,0 +1,222 @@ +/* msd_dir.c - portable directory routines + Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet + + 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Header: /cvs/tuxbox/apps/tuxbox/plugins/fx2/c64emu/ndir.c,v 1.1 2008/04/25 20:51:06 houdini Exp $ + */ + +/* Everything non trivial in this code is from: @(#)msd_dir.c 1.4 + 87/11/06. A public domain implementation of BSD directory routines + for MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield), + August 1897 */ + + +#include +#include +#include +#include +#include +#include + +#include + +#include + +static void free_dircontents (struct _dircontents *); + +/* find ALL files! */ +#define ATTRIBUTES (_A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_SUBDIR) + + + +DIR * +opendir (const char *name) +{ + struct _finddata_t find_buf; + DIR *dirp; + struct _dircontents *dp; + char name_buf[_MAX_PATH + 1]; + char *slash = ""; + long hFile; + + if (!name) + name = ""; + else if (*name) + { + const char *s; + int l = strlen (name); + + s = name + l - 1; + if ( !(l == 2 && *s == ':') && *s != '\\' && *s != '/') + slash = "/"; /* save to insert slash between path and "*.*" */ + } + + strcat (strcat (strcpy (name_buf, name), slash), "*.*"); + + dirp = (DIR *) malloc (sizeof (DIR)); + if (dirp == (DIR *)0) + return (DIR *)0; + + dirp->dd_loc = 0; + dirp->dd_contents = dirp->dd_cp = (struct _dircontents *) 0; + + if ((hFile = _findfirst (name_buf, &find_buf)) < 0) + { + free (dirp); + return (DIR *)0; + } + + do + { + dp = (struct _dircontents *) malloc (sizeof (struct _dircontents)); + if (dp == (struct _dircontents *)0) + { + free_dircontents (dirp->dd_contents); + return (DIR *)0; + } + + dp->_d_entry = malloc (strlen (find_buf.name) + 1); + if (dp->_d_entry == (char *)0) + { + free (dp); + free_dircontents (dirp->dd_contents); + return (DIR *)0; + } + + if (dirp->dd_contents) + dirp->dd_cp = dirp->dd_cp->_d_next = dp; + else + dirp->dd_contents = dirp->dd_cp = dp; + + strcpy (dp->_d_entry, find_buf.name); + + dp->_d_next = (struct _dircontents *)0; + + } while (!_findnext (hFile, &find_buf)); + + dirp->dd_cp = dirp->dd_contents; + + _findclose(hFile); + + return dirp; +} + + +void +closedir (DIR *dirp) +{ + free_dircontents (dirp->dd_contents); + free ((char *) dirp); +} + + +struct direct * +readdir (DIR *dirp) +{ + static struct direct dp; + + if (dirp->dd_cp == (struct _dircontents *)0) + return (struct direct *)0; + dp.d_namlen = dp.d_reclen = + strlen (strcpy (dp.d_name, dirp->dd_cp->_d_entry)); +#if 0 /* JB */ + strlwr (dp.d_name); /* JF */ +#endif + dp.d_ino = 0; + dirp->dd_cp = dirp->dd_cp->_d_next; + dirp->dd_loc++; + + return &dp; +} + + +void +seekdir (DIR *dirp, long off) +{ + long i = off; + struct _dircontents *dp; + + if (off < 0) + return; + for (dp = dirp->dd_contents; --i >= 0 && dp; dp = dp->_d_next) + ; + dirp->dd_loc = off - (i + 1); + dirp->dd_cp = dp; +} + + +long +telldir (DIR *dirp) +{ + return dirp->dd_loc; +} + + +/* Garbage collection */ + +static void +free_dircontents (struct _dircontents *dp) +{ + struct _dircontents *odp; + + while (dp) + { + if (dp->_d_entry) + free (dp->_d_entry); + dp = (odp = dp)->_d_next; + free (odp); + } +} + + +#ifdef TEST + +void main (int argc, char *argv[]); + +void +main (int argc, char *argv[]) +{ + static DIR *directory; + struct direct *entry = (struct direct *)0; + + char *name = ""; + + if (argc > 1) + name = argv[1]; + + directory = opendir (name); + + if (!directory) + { + fprintf (stderr, "can't open directory `%s'.\n", name); + exit (2); + } + + while (entry = readdir (directory)) + printf ("> %s\n", entry->d_name); + + printf ("done.\n"); +} + +#endif /* TEST */ + +/* + * Local Variables: + * mode:C + * ChangeLog:ChangeLog + * compile-command:make + * End: + */ diff --git a/archive-sources/c64emu/ndir.h b/archive-sources/c64emu/ndir.h new file mode 100644 index 0000000..78d5ec5 --- /dev/null +++ b/archive-sources/c64emu/ndir.h @@ -0,0 +1,69 @@ +/* ndir.c - portable directory routines + Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet + + 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Header: /cvs/tuxbox/apps/tuxbox/plugins/fx2/c64emu/ndir.h,v 1.1 2008/04/25 20:51:06 houdini Exp $ + */ + +/* Everything non trivial in this code is taken from: @(#)msd_dir.c 1.4 + 87/11/06. A public domain implementation of BSD directory routines + for MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield), + August 1897 */ + +#include /* ino_t definition */ + +#define rewinddir(dirp) seekdir(dirp, 0L) + +/* 255 is said to be big enough for Windows NT. The more elegant + solution would be declaring d_name as one byte long and allocating + it to the actual size needed. */ +#define MAXNAMLEN 255 + +struct direct +{ + ino_t d_ino; /* a bit of a farce */ + int d_reclen; /* more farce */ + int d_namlen; /* length of d_name */ + char d_name[MAXNAMLEN + 1]; /* garentee null termination */ +}; + +struct _dircontents +{ + char *_d_entry; + struct _dircontents *_d_next; +}; + +typedef struct _dirdesc +{ + int dd_id; /* uniquely identify each open directory */ + long dd_loc; /* where we are in directory entry is this */ + struct _dircontents *dd_contents; /* pointer to contents of dir */ + struct _dircontents *dd_cp; /* pointer to current position */ +} DIR; + +extern void seekdir (DIR *, long); +extern long telldir (DIR *); +extern DIR *opendir (const char *); +extern void closedir (DIR *); +extern struct direct *readdir (DIR *); + +/* + * Local Variables: + * mode:C + * ChangeLog:ChangeLog + * compile-command:make + * End: + */ diff --git a/archive-sources/c64emu/readme-kbd b/archive-sources/c64emu/readme-kbd new file mode 100644 index 0000000..55cb0e1 --- /dev/null +++ b/archive-sources/c64emu/readme-kbd @@ -0,0 +1,97 @@ +# +# es sind keine leerzeichen oder tabs erlaubt !!! +# linke seite taste der Fernbedienung +# rechte seite zu erzeugender Tastaturcode +# +# Symbole fuer Links +UP: +DOWN: +LEFT: +RIGHT: +OK: +0: +1: +2: +3: +4: +5: +6: +7: +8: +9: +SPEAKER: +PLUS: +MINUS: +HELP: +SETUP: +RED: +GREEN: +BLUE: +YELLOW: +# +Die Tasten HOME und STDBY koennen aus Sicherheitsgruenden nicht frei +belegt werden. +HOME = Ende des Emulators +STDBY = NMI +# +# wird ein Symbol auf der linken Seite mehrmals genannt, so +# wird bei jedem Tastendruck die naechste zeile ausgefuehrt. +# +# auf der rechten Seite steht dann der Buchstabe bzw. +# eine ganze buchstabenfolge. +OK:LOAD"$",8 +# so wie +# gibt es folgende sonderzeichen + + + + + + + + + + + + + + + : cursor + : cursor + : cursor + : cursor + : joystick + : joystick + : joystick + : joystick + : joystick + : joystick + : joystick + : joystick + : joystick + : joystick +# + : save screen into /var/tmp/screen.xpm (dauert lange !) +# +# special, zum einschalten eines autorepeaters +autorep:zahl +# die zahl gibt die dauer des halten wieder, bei mir ist 5 optimal +# wenn die zahl zu gross ist, laeuft der joystick länger als man will +# in die jeweilige richtung +# zu kleine zahlen ueberbruecken nicht die Zeit, in der die Fern- +# bedienung repeated. +# +# kurzes beispiel fuer Yathzee +# +# immer wenn OK gedrueckt wird, benutzt er die naechste zeile +# das letzte genannte zeichen wird dann immer wiederholt +# +OK:LOAD"YATHYEE",8,1 +OK:RUN +OK: +LEFT: +RIGHT: +UP: +DOWN: +HELP: +autorep:5 diff --git a/archive-sources/c64emu/readme-start b/archive-sources/c64emu/readme-start new file mode 100644 index 0000000..2f08043 --- /dev/null +++ b/archive-sources/c64emu/readme-start @@ -0,0 +1,23 @@ + + + +starten mit: + +c64emu [kbdfile] + +wird das kbdfile nicht genannt, benutzt er d64file-name mit endung .kbd + +:) + +beispiel: +c64emu Yathzee.d64 Yathzee.kbd ( das d64 hat nur yathzee ) +c64emu Disk001a.d64 GianaSisters.kbd ( hier ist giana nur eins von viele ) + ++------------------------------------------+ +| dank an die Macher der Emu : Frodo :) | +| | +| diese war grundlage fuer die c64emu | ++------------------------------------------+ + +note! +ich hab festgestellt, das die hyperloader meistens nicht gehen diff --git a/archive-sources/c64emu/sysconfig.h b/archive-sources/c64emu/sysconfig.h new file mode 100644 index 0000000..aa5ef12 --- /dev/null +++ b/archive-sources/c64emu/sysconfig.h @@ -0,0 +1,150 @@ +/* sysconfig.h. Generated automatically by configure. */ +/* Src/sysconfig.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define if your struct stat has st_blocks. */ +#define HAVE_ST_BLOCKS 1 + +/* Define if utime(file, NULL) sets file's timestamp to the present. */ +#define HAVE_UTIME_NULL 1 + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define if your declares struct tm. */ +/* #undef TM_IN_SYS_TIME */ + +/* The number of bytes in a char. */ +#define SIZEOF_CHAR 1 + +/* The number of bytes in a int. */ +#define SIZEOF_INT 4 + +/* The number of bytes in a long. */ +#define SIZEOF_LONG 4 + +/* The number of bytes in a long long. */ +#define SIZEOF_LONG_LONG 8 + +/* The number of bytes in a short. */ +#define SIZEOF_SHORT 2 + +/* Define if you have the gettimeofday function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define if you have the mkdir function. */ +#define HAVE_MKDIR 1 + +/* Define if you have the rmdir function. */ +#define HAVE_RMDIR 1 + +/* Define if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define if you have the sigaction function. */ +#define HAVE_SIGACTION 1 + +/* Define if you have the statfs function. */ +#define HAVE_STATFS 1 + +/* Define if you have the strerror function. */ +#define HAVE_STRERROR 1 + +/* Define if you have the strstr function. */ +#define HAVE_STRSTR 1 + +/* Define if you have the usleep function. */ +#define HAVE_USLEEP 1 + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_LINUX_JOYSTICK_H 1 + +/* Define if you have the header file. */ +#define HAVE_NCURSES_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_MOUNT_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_STATFS_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_STATVFS_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_VFS_H 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_VALUES_H 1 diff --git a/archive-sources/c64emu/sysdeps.h b/archive-sources/c64emu/sysdeps.h new file mode 100644 index 0000000..b473964 --- /dev/null +++ b/archive-sources/c64emu/sysdeps.h @@ -0,0 +1,167 @@ +/* + * sysdeps.h - Try to include the right system headers and get other + * system-specific stuff right + * + * Frodo (C) 1994-1997 Christian Bauer + */ + +#include "sysconfig.h" + +extern "C" +{ + +#include +#include +#include +#include + +#ifndef __PSXOS__ +#include +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_VALUES_H +#include +#endif + +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef HAVE_UTIME_H +#include +#endif + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifdef HAVE_SYS_VFS_H +#include +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#ifdef HAVE_SYS_MOUNT_H +#include +#endif + +#ifdef HAVE_SYS_STATFS_H +#include +#endif + +#ifdef HAVE_SYS_STATVFS_H +#include +#endif + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +#ifndef __PSXOS__ +# include +#endif +# endif +#endif + +#if HAVE_DIRENT_H +# include +#else +# define dirent direct +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +#endif + +#ifndef __PSXOS__ +#include +#endif +#include + +#if EEXIST == ENOTEMPTY +#define BROKEN_OS_PROBABLY_AIX +#endif + +#ifdef HAVE_LINUX_JOYSTICK_H +#if BROKEN_JOYSTICK_H == 1 +#include "joystick.h" +#else +#include +#endif +#endif + +#ifdef __NeXT__ +#define S_IRUSR S_IREAD +#define S_IWUSR S_IWRITE +#define S_IXUSR S_IEXEC +#define S_ISDIR(val) (S_IFDIR & val) +struct utimbuf +{ + time_t actime; + time_t modtime; +}; +#endif + +#ifdef __DOS__ +#include +#include +#else +#undef O_BINARY +#define O_BINARY 0 +#endif + +/* If char has more then 8 bits, good night. */ +typedef unsigned char uint8; +typedef signed char int8; + +#if SIZEOF_SHORT == 2 +typedef unsigned short uint16; +typedef short int16; +#elif SIZEOF_INT == 2 +typedef unsigned int uint16; +typedef int int16; +#else +#error No 2 byte type, you lose. +#endif + +#if SIZEOF_INT == 4 +typedef unsigned int uint32; +typedef int int32; +#elif SIZEOF_LONG == 4 +typedef unsigned long uint32; +typedef long int32; +#else +#error No 4 byte type, you lose. +#endif + +#define UNUSED(x) (x = x) +} diff --git a/archive-sources/c64emu/vga.c b/archive-sources/c64emu/vga.c new file mode 100644 index 0000000..c22d96a --- /dev/null +++ b/archive-sources/c64emu/vga.c @@ -0,0 +1,289 @@ +#include +#include +#include +#include +#include + +extern int atoi(char* in); + +#define XOFF 150 +#define YOFF 130 + +#include + +#ifdef i386 +#define fbdevname "/dev/fb0" +#else +#define fbdevname "/dev/fb/0" +#endif + +static int fd = -1; +static struct fb_var_screeninfo screeninfo; +static struct fb_var_screeninfo oldscreen; +static int available; +static unsigned char *lfb = 0; +static int stride; +static int bpp = 8; +static struct fb_cmap cmap; +static unsigned short red[ 256 ]; +static unsigned short green[ 256 ]; +static unsigned short blue[ 256 ]; +static unsigned short trans[ 256 ]; +static struct fb_fix_screeninfo fix; +static vga_modeinfo mymode; + +typedef unsigned char uchar; + +void vga_setpalette( int i, unsigned char r, unsigned char g, unsigned char b ) +{ + if ( !r ) + r++; + if ( !g ) + g++; + if ( !b ) + b++; + red[i] = r<<8; + green[i] = g<<8; + blue[i] = b<<8; + trans[i] = 0; + + if ( i==255 ) + { + cmap.start=0; + cmap.len=256; + cmap.red=red; + cmap.green=green; + cmap.blue=blue; + cmap.transp=trans; + + if ( fd != -1 ) + ioctl(fd,FBIOPUTCMAP,&cmap); + } +} + +int vga_setlinearaddressing( void ) +{ + return 0; +} + +int vga_setmode( int mode ) +{ + if ( mode == 1 ) + { + if ( fd == -1 ) + return 0; + + memset(lfb,0,stride*screeninfo.yres); + ioctl(fd,FBIOPUT_VSCREENINFO, &oldscreen); + munmap(lfb,available); + return 0; + } + + if ( fd != -1 ) + return 0; + + fd = open( fbdevname, O_RDWR ); + if ( fd == -1 ) + return -1; + + if ( ioctl(fd,FBIOGET_VSCREENINFO, &screeninfo)<0) + { + perror("failed - FBIOGET_VSCREENINFO"); + return -1; + } + memcpy(&oldscreen,&screeninfo,sizeof(screeninfo)); + + screeninfo.xres_virtual=screeninfo.xres=720; + screeninfo.yres_virtual=screeninfo.yres=576; + screeninfo.bits_per_pixel=8; + if (ioctl(fd, FBIOPUT_VSCREENINFO, &screeninfo)<0) + perror("FBSetMode"); +#if 0 + screeninfo.xres_virtual=screeninfo.xres=320; + screeninfo.yres_virtual=screeninfo.yres=288; + screeninfo.bits_per_pixel=8; + + if (ioctl(fd, FBIOPUT_VSCREENINFO, &screeninfo)<0) + { + perror("FBSetMode"); + screeninfo.xres_virtual=screeninfo.xres=720; + screeninfo.yres_virtual=screeninfo.yres=576; + screeninfo.bits_per_pixel=8; + if (ioctl(fd, FBIOPUT_VSCREENINFO, &screeninfo)<0) + perror("FBSetMode"); + } +#endif + if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0) + perror("failed - FBIOGET_VSCREENINFO"); + + bpp = screeninfo.bits_per_pixel; + + if ( bpp != 8 ) + return -1; + + if (ioctl(fd, FBIOGET_FSCREENINFO, &fix)<0) + { + perror("failed - FBIOGET_FSCREENINFO"); + return -1; + } + + available=fix.smem_len; + stride = fix.line_length; + lfb=(unsigned char*)mmap(0,available,PROT_WRITE|PROT_READ, MAP_SHARED,fd,0); + + if ( !lfb ) + { + perror("failed - mmap"); + return -1; + } + return 0; +} + +vga_modeinfo *vga_getmodeinfo( int mode ) +{ + vga_setmode(2); // switch to graphic + + if ( fd == -1 ) + return 0; + + mymode.width = screeninfo.xres; +#ifdef YOFF + mymode.height = screeninfo.yres - YOFF - 1; +#endif + mymode.bytesperpixel = 1; + mymode.colors = 256; + mymode.linewidth = mymode.width; + mymode.memory = (available-stride*YOFF-XOFF) / 1024; + mymode.flags = CAPABLE_LINEAR; + + return &mymode; +} + +void *vga_getgraphmem( void ) +{ + return lfb + XOFF + stride*YOFF; +} + +#define FX_WIDTH 45 + +#define _ 0 +#define W 1 +#define R 2 + +static unsigned char data_fx2[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,W,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,W,W,W,_,_,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +W,W,W,W,W,W,W,W,W,_,_,_,W,W,W,W,W,W,W,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,R,R,R,_,_,_,_,_,_,_, +W,W,W,W,W,W,W,W,W,_,_,_,W,W,W,W,W,W,W,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,W,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,W,W,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,R,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,_,W,W,W,W,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,_,W,W,W,W,W,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,_,_,_,W,W,W,W,_,_,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,_,_,_,W,W,W,W,W,_,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,_,_,_,_,W,W,W,W,W,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,_,_,_,_,_,W,W,W,W,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,_,_,_,_,_,_,W,W,W,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,W,W,W,W,W,W,_,_,_,_,_,W,W,W,W,W,_,_,_,_,W,W,W,W,R,R,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,W,W,W,W,W,W,_,_,_,_,_,W,W,W,W,W,_,_,_,_,W,W,W,R,R,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,_,_,_,_,_,_,_,_,_,_,_,_,R,R,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +}; + +void vga_drawlogo( void ) +{ + unsigned char *to; + unsigned char *from = data_fx2; + int x; + int y; + + for (y=0;y<64;y++) + { + to = lfb + (stride*(y+64)) - 100; + memcpy(to,from,FX_WIDTH); + from+=FX_WIDTH; + } +} + +void vga_printscreen( char *fname ) +{ + FILE *fp; + unsigned int x; + unsigned int y; + unsigned int i; + unsigned char *p=lfb; + +#define H(x) ((x/26)+65) +#define L(x) ((x%26)+65) + + fp=fopen(fname,"w"); + if ( !fp ) + return; + fprintf(fp,"/* XPM */\n"); + fprintf(fp,"static char *screen[] = {\n"); + fprintf(fp,"\" %d %d 256 2\"",screeninfo.xres,screeninfo.yres); + for(x=0; x<256; x++ ) + fprintf(fp,",\n\"%c%c c #%02x%02x%02x\"",H(x),L(x), + (unsigned char)(red[x] >> 8), + (unsigned char)(green[x] >> 8), + (unsigned char)(blue[x] >> 8) ); + for(y=0;y +#include +#include + +#include +#include +#include +#include +#include + +#define max(a,b) ((a)>(b)?(a):(b)) + +static unsigned char *dblImage=0; +#define stride 328 +#define lfb dblImage + +static unsigned long lineflags[32]; + +#define MarkFlag(a,b) lineflags[(b)/5]|=(1L<<((a)/16)) + +void dblCopyImage( int x1, int y1, int dx, int dy, unsigned char *src ) +{ + int x; + int y; + + if ( x1+dx < 0 ) + return; + if ( x1 >= stride ) + return; + if ( y1+dy < 0 ) + return; + if ( y1 >= 160 ) + return; + + for( y=0; (y= 0 ) && *(src+dx*y+x) ) + { + if ( *(lfb+(y1+y)*stride+x1+x) != *(src+dx*y+x) ) + { + *(lfb+(y1+y)*stride+x1+x) = *(src+dx*y+x); + MarkFlag(x+x1,y+y1); + } + } + } + } +} + +void dblXMove( int x1, int x2 ) +{ + int y; + int i; + int dx=0; + + if ( x1 < x2 ) + { + dx=x2-x1; + + for( y=0; y < 160; y++ ) + memmove(lfb+y*stride+x2,lfb+y*stride+x1,stride-dx); + *lineflags=0; + for( i=x1/16; i<(x2+1)/16; i++ ) + *lineflags|=(1L< x2 ) + { + dx=x1-x2; + + for( y=0; y < 160; y++ ) + memcpy(lfb+y*stride+x2,lfb+y*stride+x1,stride-dx); + *lineflags=0; + for( i=(stride-dx)/16; i<(stride)/16; i++ ) + *lineflags|=(1L<stride) + dx=stride-x; + + for( i=0; i<10; i+=2, p+=stride ) + FB2CopyImage( x+x+32, y+y+i+32, dx, 1, p, 1 ); +} + +void dblDrawFrame( int all ) +{ + int k; + int i; + unsigned long f; + int x=0; + int dx=0; + + for( k=0; k<32; k++ ) + { + dx=0; + x=0; + for( i=0; i<21; i++ ) + { + if ( !all && !lineflags[k] ) + break; + f= (1L< +#include +#include + +#include "draw.h" +#include +#include "rcinput.h" +#include "colors.h" +#include "sprite.h" + +#define LASTLEVEL 6 + +#define max(a,b) ((a)>(b)?(a):(b)) + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; + +extern unsigned short realcode; +extern unsigned short actcode; + +extern unsigned char *GetAniPic( int idx, int ani, int *width, int *height ); +extern unsigned char *GetMirrorPic( char picid ); +extern int LoadPics( void ); +extern void SoundPlay( int pnr ); +extern void SoundStart( void ); +extern void dblCopyImage( int x1, int y1, int dx,int dy,unsigned char *src); +extern void dblXMove( int x1, int x2 ); +extern void dblDrawFrame( void ); + +#define SND_DIE 0 +#define SND_DOOR 1 +#define SND_OING 2 +#define SND_OHNO 3 +#define SND_EXPLODE 4 +#define SND_LETSGO 5 + +static int portfolio[8]; // Wieviele Stopper/Buddler/Lemmings +static int level=1; + int main_x=660; +static Sprite *deko[15]; +static Sprite *lemm[100]; +static unsigned char *bgImage=0; +static int haus_x; +static int haus_y1; +static int haus_y2; +static int to_rescue; +static int newspeed; +static int minspeed; +static int in_level; // gerade im level vorhanden +static int lem_in; // im haus +static int lem_cnt; // anz lemming die kommen +static int lem_run; // anz lemming die da sind +static int pic_moved=0; +static int action=0; +static int pause=0; +static int afunc=-1; +static int sel_sprite=-1; +static int killall=0; + +static unsigned char *svdimage[12]; + +static int part_x[]={ 0,2,4,6,8,10,12,14,16,18,20,22 }; +static int part_y[]={ 0,6,12,17,19,19,17,12,6,0,-6,-12 }; + +#define stride 1600 +#define lfb bgImage + +static unsigned char p0_0[15]; +static unsigned char p1_0[15]; +static unsigned char p1_1[15]; +static unsigned char p1_2[15]; +static unsigned char p1_3[15]; +static unsigned char p1_4[15]; +static unsigned char p1_5[15]; +static unsigned char p1_6[15]; +static unsigned char p1_7[15]; +static unsigned char p1_8[15]; +static unsigned char p1_9[15]; +/**/ +static unsigned char p2_0[15]; +static unsigned char p2_1[15]; +static unsigned char p2_2[15]; +static unsigned char p2_3[15]; +static unsigned char p2_4[15]; +static unsigned char p2_5[15]; +static unsigned char p2_6[15]; +static unsigned char p2_7[15]; +static unsigned char p2_8[15]; +static unsigned char p2_9[15]; + +static unsigned char *pnums_1[]={ p1_0,p1_1,p1_2,p1_3,p1_4, + p1_5,p1_6,p1_7,p1_8,p1_9}; + +static unsigned char *pnums_2[]={ p2_0,p2_1,p2_2,p2_3,p2_4, + p2_5,p2_6,p2_7,p2_8,p2_9}; + +static unsigned char pbomb[ 441 ]; + +static void initNumbers( void ) +{ + int i; + int b; + unsigned char *f,*t; + + /* 0 */ + memset(p0_0,53,15); + /* 0 */ + memset(p1_0,28,15); + p1_0[4]=53; + p1_0[7]=53; + p1_0[10]=53; + /* 1 */ + memset(p1_1,53,15); + p1_1[2]=28; + p1_1[5]=28; + p1_1[8]=28; + p1_1[11]=28; + p1_1[14]=28; + /* 2 */ + memcpy(p1_2,p1_0,15); + p1_2[3]=53; + p1_2[7]=28; + p1_2[11]=53; + /* 3 */ + memcpy(p1_3,p1_2,15); + memcpy(p1_3+9,p1_3+3,3); + /* 4 */ + memcpy(p1_4,p1_1,15); + p1_4[0]=28; + p1_4[3]=28; + memset(p1_4+6,28,2); + /* 5 */ + memcpy(p1_5,p1_3,15); + memcpy(p1_5+3,p1_2+9,3); + /* 6 */ + memset(p1_6,28,15); + p1_6[1]=53; + p1_6[2]=53; + p1_6[4]=53; + p1_6[5]=53; + p1_6[10]=53; + /* 7 */ + memcpy(p1_7,p1_1,15); + memcpy(p1_7,p1_0,3); + /* 8 */ + memcpy(p1_8,p1_0,15); + p1_8[7]=28; + /* 9 */ + memcpy(p1_9,p1_4,15); + p1_9[1]=28; + +/* copy to #2 */ + for( i=0; i<10; i++ ) + { + f=pnums_1[i]; + t=pnums_2[i]; + for( b=0; b < 15; b++ ) + { + t[b] = ( f[b] == 28 ) ? 53 : 0; + } + } + +/* init bomb - pic */ + { + int z[] = { 6,3,2,1,1,1 }; + memset( pbomb, 14, 441 ); + for( i=0; i<6; i++ ) + { + memset( pbomb+(i*21), 0, z[i] ); + memset( pbomb+(i*21)+21-z[i], 0, z[i] ); + memset( pbomb+((20-i)*21), 0, z[i] ); + memset( pbomb+((20-i)*21)+21-z[i], 0, z[i] ); + } + } +} + +static void DrawSimpleNumber( int x, int y, int num, int trans ) +{ + if ( trans ) + dblCopyImage( x,y,3,5,pnums_2[ num ] ); + else + FB2CopyImage( x, y, 3, 5, pnums_1[ num ], 1 ); +} + +static void DrawNumber( int x, int y, int num ) +{ + int i; + int rest; + + if ( num > 99 ) + { + printf("outofnum...\n"); + return; + } + + i=num/10; + rest=num%10; + if ( i ) + DrawSimpleNumber( x, y, i, 0 ); + else + FB2CopyImage( x, y, 3, 5, p0_0, 1 ); + if ( !num ) + FB2CopyImage( x+8, y, 3, 5, p0_0, 1 ); + else + DrawSimpleNumber( x+8, y, rest, 0 ); +} + +// 14 background, 118 - stair +static int isBrick( int x, int y, int seestair ) +{ + if ( seestair ) + return( (y<160) && (*(lfb+stride*y+x)!=14) && + (*(lfb+stride*y+x)!=STEELBLUE) && (*(lfb+stride*y+x)!=118) ); + return ((y<160)&&(*(lfb+stride*y+x)!=14)&&(*(lfb+stride*y+x)!=STEELBLUE)); +} + +static void CopyBg2Screen( int srcx, int srcy, int dx, int dy ) +{ + int y; + unsigned char *p; + + if ( srcx-main_x+dx < 0 ) + return; + if ( srcx-main_x >= 328 ) + return; + if ( srcy+dy < 0 ) + return; + if ( srcy >= 160 ) + return; + p = bgImage+(srcy*stride)+srcx; + + /* line per line ! - because stride */ + for( y=0; (yoldx,s->oldy, s->width, s->height); +} + +void bg2CopyImage( int x1, int y1, int dx, int dy, unsigned char *src ) +{ + int x; + int y; + + if ( !dx || !dy ) + return; + + for( y=0; (y < dy) && (y+y1<160); y++ ) + { + for( x=0; (x < dx) && (x+x1<1600) && (y+y1>=0); x++ ) + { + if ( ( x+x1>=0 ) && *(src+dx*y+x) ) + *(lfb+(y1+y)*stride+x1+x) = *(src+dx*y+x); + } + } +} + +static void bgRect( int x, int y, int w, int h, unsigned char c ) +{ + int sy; + for( sy=y; sy<=y+h; sy++ ) + memset(lfb+sy*stride+x,c,w); +} + +static void bghLine( int x, int y, int l, unsigned char *c, int clen ) +{ + int sy; + for( sy=y; sy656 )) // 656 = 720 - 32 - 32 + return; + } + else + { + if (( x+width<0 ) || ( x>656 )) + return; + } + FB2CopyImage( x+32, y+32, width, height, data, usedbl & 1 ); +} + +void DrawLevelIntoBg( void ) +{ + int y; + int x; + int i; + int j; + unsigned char line1[] = { 32, 30 }; + unsigned char line2[] = { 32, 30, 32, 29, 30, 31, 33 }; + unsigned char line3[] = { 32, 30, 29, 33 }; + unsigned char line4[] = { 36, 38 }; + + switch( level ) + { + case 1: + case 4: + case 6: + /* stein */ + for( y=0; y<160; y+= 32 ) + for( x=530; x < 1038; x+=32 ) + inBg(10,0,x,y); + /* masken */ + inBg(15,0,530,0); + inBg(16,0,664,28); + inBg(17,0,685,3); + inBg(18,0,996,0); + /* moos */ + inBg(12,0,714,15); + /* boden */ + inBg(13,0,687,68); + inBg(13,0,713,70); + inBg(13,0,739,68); + inBg(13,0,763,71); + inBg(13,0,789,74); + inBg(13,0,815,74); + inBg(13,0,828,74); + inBg(13,0,665,123); + inBg(13,0,691,124); + inBg(13,0,717,124); + for(i=0;i<5;i++) + inBg(13,0,743+26*i,126); + inBg(13,0,873,127); + inBg(13,0,899,128); + /* aeste */ + inBg(14,0,555,17); + inBg(14,0,573,38); + inBg(14,0,829,11); + /* torleiste */ + inBg(11,0,726,36); + break; + case 2 : + bghLine(726,40,177,line1,2); + bghLine(654,59,113,line1,2); + bghLine(625,78,64,line1,2); + bghLine(736,78,128,line1,2); + bghLine(665,97,124,line1,2); + bghLine(642,115,128,line1,2); + + bghLine(685,153,173,line2,7); + bghLine(888,153,130,line2,7); + + /** Schnörkel */ + inBg(22,0,672,143); + inBg(23,0,1018,143); + + /** Säulen */ + inBg(24,0,917,140); + for (i=0;i<140;i++) + inBg(25,0,927,i); + + inBg(21,0,589,0); + for (i=11;i<159;i++) + inBg(26,0,597,i); + + /** Die Torleiste */ + inBg(11,0,726,4); + break; + case 3 : + bghLine(726,60,60,line1,2); + bghLine(690,100,40,line1,2); + bghLine(720,120,40,line1,2); + + for( i=0; i<21; i++ ) + bghLine(790+i*6,151-i*4,150-(i*6-i*i/40),line3,4); + + bghLine(600,153,100,line2,7); + bghLine(740,153,390,line2,7); + + /* moos */ + inBg(12,0,670,0); + + /* schnoerkel */ + inBg(22,0,590,143); + inBg(23,0,700,143); + + inBg(22,0,730,143); + inBg(23,0,1130,143); + + /* saeulen */ + inBg(24,0,620,140); + inBg(24,0,1050,140); + for( i=0; i<140; i++ ) + { + inBg(25,0,1060,i); + inBg(25,0,630,i); + } + + /** Die Torleiste */ + inBg(11,0,726,20); + break; + case 5 : + for( i=0; i<21; i++ ) + inBg(27,0,810,18+6*i); + for( i=1; i< 5; i++ ) + for( j=0; j-2; x-- ) + inBg(30,0,720+6*x+i*4,120+i*6); + break; + } +} + +void DrawInfo( int what ) +{ + char text[64]; + + if ( what == 3 ) + { + sprintf(text,"LEVEL %d/%d ",level,LASTLEVEL); + FBDrawString(80,354,30,text,GREEN,STEELBLUE); + } + if ( what & 1 ) + { + sprintf(text,"OUT %d ",in_level); + FBDrawString(220,354,30,text,GREEN,STEELBLUE); + } + if ( what & 2 ) + { + sprintf(text,"IN %d%% ",lem_in*100/lem_cnt); + FBDrawString(320,354,30,text,GREEN,STEELBLUE); + } +} + +void InitLevel( void ) +{ + int i; + char text[64]; + + in_level=0; + pause=0; + killall=0; + action=0; + lem_in=0; + lem_run=0; + afunc=-1; + main_x=660; + memset(deko,0,sizeof(deko)); + memset(bgImage,STEELBLUE,1600*160); + deko[0]=CreateSprite(0,0,main_x+160,80); // cursor + deko[0]->anilocked=1; + switch( level ) + { + case 1 : + case 4 : + case 6 : + /* deko */ + deko[1]=CreateSprite(1,0,726,39); // tor + deko[1]->anilocked=1; + deko[1]->backlocked=1; + /* zielhaus */ + deko[2]=CreateSprite(7,0,871,106); // haus + deko[2]->anilocked=1; + deko[2]->backlocked=1; + deko[3]=CreateSprite(2,0,876,108); // flamme + deko[3]->backlocked=1; + deko[4]=CreateSprite(2,3,902,108); // flamme + deko[4]->backlocked=1; + MirrorSprite( deko[4] ); + + /* setup */ + memset(lemm,0,sizeof(lemm)); + memset(portfolio,0,sizeof(portfolio)); + switch( level ) + { + case 6 : + portfolio[7]=2; + portfolio[3]=2; + portfolio[2]=2; + break; + case 1 : + portfolio[7]=10; +#if 1 +portfolio[6]=10; +portfolio[4]=10; +portfolio[3]=10; +portfolio[2]=10; +#endif + break; + case 4 : + portfolio[2]=5; + break; + } + haus_x=889; + haus_y1=117; + haus_y2=135; + to_rescue=level==6?39:5; + newspeed=level==6?1:50; + lem_cnt=level==6?40:10; + break; + case 2 : + /* deko */ + deko[1]=CreateSprite(1,0,726,7); // tor + deko[1]->anilocked=1; + deko[1]->backlocked=1; + /* zielhaus */ + deko[2]=CreateSprite(7,1,700,128); // haus + deko[2]->anilocked=1; + deko[2]->backlocked=1; + deko[3]=CreateSprite(2,0,704,129); // flamme + deko[3]->backlocked=1; + deko[4]=CreateSprite(2,3,731,129); // flamme + deko[4]->backlocked=1; + MirrorSprite( deko[4] ); + + /* setup */ + memset(lemm,0,sizeof(lemm)); + memset(portfolio,0,sizeof(portfolio)); + portfolio[3]=4; + haus_x=718; + haus_y1=139; + haus_y2=157; + to_rescue=25; + newspeed=50; + lem_cnt=50; + break; + case 3 : + /* deko */ + deko[1]=CreateSprite(1,0,726,23); // tor + deko[1]->anilocked=1; + deko[1]->backlocked=1; + /* zielhaus */ + deko[2]=CreateSprite(7,1,1000,128); // haus + deko[2]->anilocked=1; + deko[2]->backlocked=1; + deko[3]=CreateSprite(2,0,1004,129); // flamme + deko[3]->backlocked=1; + deko[4]=CreateSprite(2,3,1031,129); // flamme + deko[4]->backlocked=1; + MirrorSprite( deko[4] ); + + /* setup */ + memset(lemm,0,sizeof(lemm)); + memset(portfolio,0,sizeof(portfolio)); + portfolio[3]=2; + portfolio[7]=2; + haus_x=1018; + haus_y1=139; + haus_y2=157; + to_rescue=50; + newspeed=50; + lem_cnt=50; + break; + case 5 : + /* deko */ + deko[1]=CreateSprite(1,0,712,3); // tor + deko[1]->anilocked=1; + deko[1]->backlocked=1; + /* zielhaus */ + deko[2]=CreateSprite(7,1,1150,117); // haus + deko[2]->anilocked=1; + deko[2]->backlocked=1; + deko[3]=CreateSprite(2,0,1154,118); // flamme + deko[3]->backlocked=1; + deko[4]=CreateSprite(2,3,1181,118); // flamme + deko[4]->backlocked=1; + MirrorSprite( deko[4] ); + + /* feuer */ + deko[5]=CreateSprite(9,0,849,39); // feuer + deko[6]=CreateSprite(9,0,979,39); // feuer + deko[7]=CreateSprite(9,0,880,66); // feuer + deko[8]=CreateSprite(9,0,880,107); // feuer + deko[9]=CreateSprite(9,0,979,131); // feuer + deko[10]=CreateSprite(9,0,1002,86); // feuer + + /* setup */ + memset(lemm,0,sizeof(lemm)); + memset(portfolio,0,sizeof(portfolio)); + portfolio[2]=5; + portfolio[3]=3; + haus_x=1168; + haus_y1=128; + haus_y2=146; + to_rescue=30; + newspeed=50; + lem_cnt=50; + break; + } + minspeed=newspeed; + DrawLevelIntoBg(); + /* copy level to screen */ + CopyBg2Screen( main_x, 0, 328, 160 ); + SpritesGetBackground(); + DrawSprites(); + /* Draw Menu-Item-Numbers */ + for( i=0; i<8; i++ ) + DrawNumber( 106+i*32, 389, portfolio[i] ); + + DrawNumber( 42, 389, newspeed ); + DrawNumber( 74, 389, 100-newspeed ); + DrawInfo(3); + /* show level info */ + FBFillRect( 60, 448, 200, 100, BLACK ); + sprintf(text,"Lemmings : %d ",lem_cnt); + FBDrawString(64,450,32,text,WHITE,0); + sprintf(text,"%d%% to be saved ",to_rescue*100/lem_cnt); + FBDrawString(64,482,32,text,WHITE,0); + sprintf(text,"Release Rate %d ",100-newspeed); + FBDrawString(64,514,32,text,WHITE,0); + SoundPlay( SND_LETSGO ); +} + +void AnimateDeko( void ) +{ + int l; + + for( l=1; deko[l]; l++ ); + for( l--; l && deko[l]; l-- ) + { + if ( !deko[l]->anilocked || pic_moved ) + { + if (( l==1 ) && ( action == 1 ) && + ( deko[l]->ani == deko[l]->maxani )) + { + deko[l]->anilocked=1; +// inBg(1,deko[l]->maxani,deko[l]->x,deko[l]->y); + action=2; // send lemmings into level + } + SpriteNextPic( deko[l] ); + DrawSprite( deko[l] ); + } + } + pic_moved=0; +} + +void UnanimatedDeko( void ) +{ + int l; + + for( l=1; deko[l]; l++ ) + { + if ( deko[l]->anilocked && !pic_moved ) + DrawSprite( deko[l] ); + } +} + +int InitLemm( void ) +{ + int i; + +#ifdef USEX + FBFlushGrafic(); +#endif + FBFillRect( 0, 0, 720, 576, STEELBLUE ); + FBFillRect( 60, 448, 300, 100, BLACK ); + + if ( !bgImage ) + { + FBDrawString(64,482,32,"Initialize...",WHITE,0); + FBDrawFx2Logo( 320, 486 ); +#ifdef USEX + FBFlushGrafic(); +#endif + + initNumbers(); + + if ( LoadPics() == -1 ) + return -1; + bgImage=malloc(1600*160); + SoundStart(); + } + + if ( !bgImage ) + return -1; + + for( i=0; i<12; i++ ) + svdimage[i]=malloc(32*48); + + for( i=0; i<320; i+=32 ) + inSc( 19, 0, i+main_x, 352, 1 ); + + inSc( 29, 0, 66+main_x, 370, 1 ); + inSc( 29, 1, 100+main_x, 372, 1 ); + inSc( 8, 0, 134+main_x, 372, 0 ); // explosion + inSc( 4, 10, 166+main_x, 374, 1 ); // lemming2 + inSc( 29, 2, 200+main_x, 368, 1 ); + inSc( 29, 3, 234+main_x, 368, 1 ); + inSc( 29, 4, 264+main_x, 372, 1 ); + inSc( 5, 2, 292+main_x, 368, 1 ); + + inSc( 20, 0, 320+main_x, 352, 1 ); + + FBDrawString(44,390,48,"-",GREEN,0); + FBDrawString(76,390,48,"+",GREEN,0); + + return 0; +} + +void HandleDirection( int actcode ) +{ +Sprite *s; + int umove=0; + int dmove=0; + int lmove=0; + int rmove=0; +static int step=2; +static int cnt=0; +static int zcnt=0; +static int lastc=0; + + + if ( realcode == 0xee ) + { + if ( step == 2 ) + return; + zcnt++; + if ( zcnt > 3 ) + { + step=2; + cnt=0; + zcnt=0; + } + return; + } + + cnt++; + if( cnt > 8 ) + step=32; + else if( cnt > 6 ) + step=16; + else if( cnt > 4 ) + step=8; + else if( cnt > 2 ) + step=4; + else + step=2; + + if (( step != 2 ) && ( actcode != lastc )){ + cnt=0; + step=2; + } + + lastc=actcode; + if ( action > 2 ) + return; + s=deko[0]; + if (!s) + return; + switch (actcode){ +#ifdef KEY_TOPLEFT + case KEY_TOPLEFT: + umove=1;lmove=1;break; + case KEY_TOPRIGHT: + umove=1;rmove=1;break; + case KEY_BOTTOMLEFT: + dmove=1;lmove=1;break; + case KEY_BOTTOMRIGHT: + dmove=1;rmove=1;break; +#endif + case RC_UP: + umove=1;break; + case RC_DOWN: + dmove=1;break; + case RC_LEFT: + lmove=1;break; + case RC_RIGHT: + rmove=1;break; + } + + if ((lmove||rmove)&&(( s->x == main_x - 6 )||(s->x == main_x + 320))) // move screen + { + int new_x; + if (s->x == main_x - 6){ + main_x -= step; + new_x = main_x; + dblXMove( 0, step ); + } else { // (s->x == main_x + 320) + main_x += step; + new_x = main_x+328-step; + dblXMove( step, 0 ); + } + CopyBg2Screen( new_x, 0, step, 160 ); + SpriteGetBackground( s ); + pic_moved=1; // mark for redraw unanimated deko-sprites + return; + } + // all other movements + UndrawSprite( s ); + if ((lmove)&&(s->x >= 32)){ + s->x -= step; + if ( s->x < main_x - 6 ) + s->x = main_x - 6; + } + if ((rmove)&&(s->x <= 1580)){ + s->x += step; + if ( s->x > main_x + 320 ) + s->x = main_x + 320; + } + if ((umove)&&(s->y > -6)){ + s->y -= step; + if ( s->y < -6 ) + s->y = -6; + } + if ((dmove)&&(s->y < 152)){ + s->y += step; + if ( s->y > 152 ) + s->y = 152; + } + SpriteGetBackground( s ); + DrawSprite( s ); +} + + +void RunKey( void ) +{ + Sprite *s; + int nac; + int sel_type=0; + unsigned long otype; + + switch( actcode ) + { +#ifdef KEY_TOPLEFT + case KEY_TOPLEFT: + case KEY_TOPRIGHT: + case KEY_BOTTOMLEFT: + case KEY_BOTTOMRIGHT: +#endif + case RC_LEFT : + case RC_RIGHT : + case RC_UP : + case RC_DOWN : + HandleDirection ( actcode ); + break; + case RC_RED : // kill all lemmings + if ( pause || (action!=2) || !in_level ) + break; + SoundPlay( SND_OHNO ); + FBGetImage( 11*32+32, 384, 32, 48, svdimage[11] ); + FBDrawRect( 11*32+32, 384, 31, 47, RED ); + FBDrawRect( 11*32+33, 385, 29, 45, RED ); + killall=1; + break; + case RC_BLUE : // PAUSE - GO + if ( action!=2 ) + return; + if ( pause == 1 ) + FBCopyImage( 10*32+32, 384, 32, 48, svdimage[10] ); + pause = pause ? 0 : 1; + if ( pause ) + { + FBGetImage( 10*32+32, 384, 32, 48, svdimage[10] ); + FBDrawRect( 10*32+32, 384, 31, 47, BLUE ); + FBDrawRect( 10*32+33, 385, 29, 45, BLUE ); + } + break; + case RC_1 : + case RC_2 : + case RC_3 : + case RC_4 : + case RC_5 : + case RC_6 : + case RC_7 : + case RC_8 : // select lemm-action + if ( pause || !action || (action>2)) + break; + nac=actcode-1; + if ( afunc == actcode-1 ) + break; + if ( !portfolio[ actcode-1 ] ) + break; + FBGetImage( (nac+2)*32+32, 384, 32, 48, svdimage[nac+2] ); // save + if ( afunc != -1 ) + { + FBCopyImage( (afunc+2)*32+32, 384, 32, 48, svdimage[afunc+2] ); + DrawNumber( 106+afunc*32, 389, portfolio[afunc] ); + } + FBDrawRect( (nac+2)*32+32, 384, 31, 47, YELLOW ); + FBDrawRect( (nac+2)*32+33, 385, 29, 45, YELLOW ); + afunc=nac; + break; + case RC_PLUS : + if ( pause || (action!=2) ) + break; + newspeed--; + if ( newspeed < 1 ) + newspeed=1; + else + { + DrawNumber( 74, 389, 100-newspeed ); + } + break; + case RC_MINUS : + if ( pause || (action!=2) ) + break; + newspeed++; + if ( newspeed > minspeed ) + newspeed=minspeed; + else + { + DrawNumber( 74, 389, 100-newspeed ); + } + break; + case RC_OK : + if( !action ) + { + action=1; + s=deko[1]; // tor; + s->anilocked=0; + SoundPlay( SND_DOOR ); + break; + } + if (( action != 2 ) || pause || ( sel_sprite == -1 ) || !portfolio[afunc]) + break; + s=lemm[ sel_sprite ]; + if ( !s ) + break; + if ( afunc == 2 ) // EXPLODE + { + if ( !( s->type & TYP_EXPLODE ) ) + { + s->type |= TYP_EXPLODE; + s->counter1=0; + portfolio[ afunc ]--; + DrawNumber( 106+afunc*32, 389, portfolio[afunc] ); + } + } + else if ( afunc == 0 ) // CLIMB + { + if ( !( s->type & TYP_CLIMB ) ) + { + s->type |= TYP_CLIMB; + portfolio[ afunc ]--; + DrawNumber( 106+afunc*32, 389, portfolio[afunc] ); + } + } + else + { + switch( afunc ) + { + case 3 : + sel_type = TYP_STOPPER; + break; + case 4 : + sel_type = TYP_BUILDER; + break; + case 6 : + sel_type = TYP_DIGDIAG; + break; + case 7 : + sel_type = TYP_DIGDOWN; + break; + } + otype=s->type & TYP_WORK; + while( 1 ) + { + if ( otype == sel_type ) + { + if (( otype == TYP_BUILDER ) && ( s->counter2 > 11 )) + break; + sel_type = 0; + break; + } + if ( !( otype & TYP_STOPPER ) && !( s->type & TYP_FALLEN )) + break; + sel_type = 0; + break; + } + if ( sel_type ) + { + otype = s->type; + s->type = sel_type; + portfolio[ afunc ]--; + DrawNumber( 106+afunc*32, 389, portfolio[afunc] ); +// erstmal die sprite-koordinaten wieder auf 0 + if (( otype & TYP_BUILDER ) && ( s->counter2 < 12 )) + { + s->y+=3; + } + else if (( otype & TYP_BUILDER ) && ( s->counter2 == 12 )) + { + s->y-=2; + } + else if ( otype & TYP_DIGDIAG ) + { + s->y+=5; + if ( !s->dir ) + s->x+=7; + } + else if ( otype & TYP_DIGDOWN ) + { + s->y+=2; + } +// sprite-koordinaten eventl. verschieben + if ( sel_type == TYP_DIGDOWN ) + { + s->y-=2; + SpriteChangePic( s, 5 ); // lemming3 + } + if ( sel_type == TYP_STOPPER ) + { + s->counter1=0; + SpriteChangePic( s, 4 ); // lemming2 + bgRect( s->x+(s->width/2), s->y, 1, s->height-2, 150 ); + } + if ( sel_type == TYP_BUILDER ) + { + s->counter1=0; + s->counter2=0; + s->y -= 3; // 2 + SpriteChangePic( s, 31 ); // builder + if ( s->dir ) + { + s->x++; + MirrorSprite( s ); + } + else + s->x--; + } + if ( sel_type == TYP_DIGDIAG ) + { + s->counter1=0; + s->counter2=0; + s->y -= 5; + SpriteChangePic( s, 33 ); // hacke + if ( s->dir ) + { + MirrorSprite( s ); + } + else + s->x-=7; + } + } + } + break; + } +} + +void RemoveBg( void ) +{ + int i; + + for( i=0; i<10; i++ ) + free(svdimage[i]); + + if ( bgImage ) + free( bgImage ); +} + +static void killlem( int i ) +{ + in_level--; + if ( sel_sprite == i ) + sel_sprite=-1; + lemm[i]=0; + if ( !in_level && (( lem_run == lem_cnt ) || killall )) + { + if ( killall ) + FBCopyImage( 11*32+32, 384, 32, 48, svdimage[11] ); + action=3; // level done + } +} + +static int oneoftwo( int x ) +{ + return x&(~1); +} + +static void partikel( int i, int onoff ) +{ + Sprite *s; + unsigned char c[]={ 22,24,26 }; + int x1; + int x2; + int y2; + + s=lemm[i]; + if ( !s ) + return; + for( i=0; i<3; i++ ) + { + x1=s->x+s->width; + x2=part_x[s->counter1]+i; + y2=s->y-part_y[s->counter1]-((i==1)?1:0); + + if ( onoff ) + { + dblCopyImage(oneoftwo(x1+x2)-main_x,oneoftwo(y2),1,1,c+i); + dblCopyImage(oneoftwo(x1-x2)-main_x,oneoftwo(y2),1,1,c+i); + } + else + { + CopyBg2Screen( oneoftwo(x1+x2), oneoftwo(y2), 1, 1); + CopyBg2Screen( oneoftwo(x1-x2), oneoftwo(y2), 1, 1); + } + } +} + +void restorecd( int i ) +{ + Sprite *s = lemm[i]; + + if ( s->partikel == 1 ) + partikel( i, 0 ); + else + { + if ( s->countdown > 0 ) + { + CopyBg2Screen( s->oldx,s->oldy-6, 3, 5); + } + } + s->partikel=0; +} + +void RunLemm( void ) +{ +static int counter1=0; +static int blinkc=0; + int i; + int f; + int b; + Sprite *s; + int cursor_get=0; + int kab=0; + int hbk=0; // hat boden kontakt +//int hhy=0; + + blinkc++; + + if ( action==3 ) + { + counter1=0; + action=4; + DrawSprite( deko[0] ); + return; + } + if ( action==4 ) + { + counter1++; + if ( counter1 < 24 ) + return; + + if ( to_rescue > lem_in ) + { + FBDrawString( 252, 142, 64, "You lost !", WHITE, 0 ); + FBDrawString( 250, 140, 64, "You lost !", RED, 0 ); + } + else + { + level++; + if ( level>LASTLEVEL ) + { + FBDrawString( 252, 142, 64, "all level solved", WHITE, 0 ); + FBDrawString( 250, 140, 64, "all level solved", GREEN, 0 ); + FBDrawString( 240, 250, 36, "thanx to emuman for his javacode,", WHITE, 0 ); + FBDrawString( 240, 286, 36, "Psygnosis and DMA for artwork...", WHITE, 0 ); + level=1; + doexit=2; + return; + } + else + { + FBDrawString( 252, 142, 64, "Level solved", WHITE, 0 ); + FBDrawString( 250, 140, 64, "Level solved", GREEN, 0 ); + } + } + if ( afunc != -1 ) + FBCopyImage( (afunc+2)*32+32, 384, 32, 48, svdimage[afunc+2] ); + action=5; + doexit=1; + } + + if ( action != 2 ) + { + DrawSprite( deko[0] ); + return; + } + if ( pause ) + { + UndrawSprite( deko[0] ); + for( i=0; itype & TYP_EXPLODE ) && ( s->countdown > 0 )) + { + DrawSimpleNumber( s->x-main_x, s->y-6, s->countdown, 1 ); + } + SpriteGetBackground( s ); + DrawSprite( s ); + } + SpriteSelPic( deko[0], 0 ); + SpriteGetBackground( deko[0] ); + DrawSprite( deko[0] ); + + if ( blinkc%5 ) + return; + if ( pause == 1 ) + { + FBCopyImage( 10*32+32, 384, 32, 48, svdimage[10] ); + pause=2; + } + else + { + FBDrawRect( 10*32+32, 384, 31, 47, BLUE ); + FBDrawRect( 10*32+33, 385, 29, 45, BLUE ); + pause=1; + } + return; + } + + sel_sprite=-1; + + if (( lem_run < lem_cnt ) && !( counter1%((newspeed/2)+3) ) && !killall ) + { + lemm[ lem_run ] = CreateSprite(3,0,deko[1]->x+19,deko[1]->y); + lemm[ lem_run ]->dir=0; // rechts + lemm[ lem_run ]->type = TYP_WALKER; + + in_level++; + lem_run++; + DrawInfo(1); + } + if ( in_level ) + UndrawSprite( deko[0] ); + for( i=0; itype & TYP_EXPLODE ) + restorecd( i ); + else if (( s->type & TYP_FALLEN ) && s->partikel ) + restorecd( i ); + UndrawSprite( s ); + s->counter1++; + if ( !( s->counter1 % 10 ) && ( s->type & TYP_EXPLODE ) ) + { + s->countdown--; + if ( s->countdown == -1 ) + { + s->counter1=0; + bg2CopyImage( s->x-7, s->y-4, 21, 21, pbomb ); + CopyBg2Screen( s->x-7,s->y-4, 21, 21); + } + } + if (( s->counter1 == 2 ) && ( s->type & TYP_STOPPER ) && + !( s->type & TYP_EXPLODE )) + bgRect( s->x+1, s->y, s->width-1, s->height-2, 150 ); + } +// DrawSprite( deko[2] ); // ziel + UnanimatedDeko(); + for( i=0; itype & TYP_EXPLODE ) ) + { + s->type |= TYP_EXPLODE; + s->counter1=1; + kab++; + } + } + + if ( (s->countdown==-1) && ( s->type & TYP_EXPLODE ) ) + { + s->partikel=1; + partikel(i,1); + } + if ( !( s->counter1 % 10 ) && ( s->type & TYP_EXPLODE ) ) + { + if ( s->countdown == -1 ) + { + s->y-=4; + s->x-=4; + SpriteChangePic( s, 8 ); // explosion + SpriteGetBackground( s ); + DrawSprite(s); + SoundPlay( SND_EXPLODE ); + } + if ( s->countdown == -2 ) + { + partikel(i,0); + killlem( i ); + s=0; + DrawInfo(1); + } + } + + if ( s && ( s->countdown < 0 )) + s=0; + + if ( s && ( s->type & TYP_FALLEN ) ) + { + if ( s->counter1 < 10 ) + { + s->partikel=1; + partikel(i,1); + } + else + { + killlem( i ); + DrawInfo(1); + } + s=0; + } + + if ( s&&(s->countdown>0) ) + { + SpriteNextPic( s ); + if ( s->type&TYP_ATHOME ) + { + s->y-=1; + if(s->ani==4) + { + lem_in++; + killlem(i); + SoundPlay( SND_OING ); + DrawInfo(3); + } + } + else + { /* lemming im ziel ? */ + if((s->x==haus_x)&&(s->y>haus_y1)&& + (s->ytype=TYP_ATHOME; + s->counter2=0; + SpriteChangePic( s, 6 ); // lemming4 + } + else + { /* kein bodenkontakt ? */ + switch( s->type & TYP_WORK ) + { + case TYP_WALKER : + case TYP_DIGDOWN : + hbk=isBrick(s->x+1,s->y+s->height,0)|| + isBrick(s->x-2+s->width,s->y+s->height,0); + break; + case TYP_STOPPER : + hbk=isBrick(s->x+1,s->y+s->height+1,0)|| + isBrick(s->x-2+s->width,s->y+s->height+1,0); + break; + case TYP_DIGDIAG : + hbk=isBrick(s->x+10,s->y+s->height-2,0)|| + isBrick(s->x+11,s->y+s->height-2,0); + break; + case TYP_BUILDER : + hbk=1; + break; + } + if ( !hbk ) + { +#if 0 +if ( s->type & TYP_DIGDIAG ) +{ +hhy=s->y+s->height-2; +printf("kein boden on %d, %d\n",s->x,s->y+s->height); +} +#endif + if( !( s->type&TYP_WALKER ) ) + { + switch( s->type & TYP_WORK ) + { + case TYP_STOPPER : + bgRect(s->x+1,s->y,s->width-1,s->height-2,14); + break; + case TYP_DIGDIAG : + s->y+=5; + if ( !s->dir ) + s->x+=7; + break; + case TYP_DIGDOWN : + s->y+=2; + break; + } + s->type=TYP_WALKER|(s->type&TYP_UTILS); + SpriteChangePic( s, 3 ); // lemming1-faller + if ( s->dir ) + MirrorSprite( s ); + } + // freier fall + s->y += 2; + s->counter2++; + // aus bild gefallen + if(s->y>=160) + { + SoundPlay( SND_DIE ); + killlem(i); + DrawInfo(1); + } + } + else + { + if(s->type&TYP_WALKER) + { /* aufgeschlagen */ + if(s->counter2>=40) + { + s->counter1=0; + s->type=TYP_FALLEN; + SoundPlay( SND_DIE ); + s->partikel=1; + partikel(i,1); + s=0; + } + else + { /* wieder auf boden */ + s->counter2=0; + /* laeufer - getestet wird oben */ + if((isBrick(s->x,s->y+1,1)&& + (s->dir==1))|| + (isBrick(s->x+s->width,s->y+1,1)&& + (s->dir==0))) + { + MirrorSprite( s ); + s->dir^=1; + } + else + { + s->x += (s->dir?-1:1); + if ( s->dir ) + { + for(b=8;b>0;b--) + { + if(isBrick(s->x, + s->y+s->height-b,0)) + { + s->y-=1; + b=0; + } + } + } + else + { + for(b=8;b>0;b--) + { + if(isBrick(s->x+s->width, + s->y+s->height-b,0)) + { + s->y-=1; + b=0; + } + } + } + } + } /* else, kein matsch */ + } /** walker **/ + else if(s&&(s->type&TYP_BUILDER)) + { + unsigned char c=118; // stair + if ( !s->ani ) + { + s->counter2++; + s->y--; + if ( s->counter2 != 13 ) + { + if ( s->dir ) + { + s->x-=2; + bghLine(s->x+2,s->y+s->height,6,&c,1); + CopyBg2Screen( s->x+2,s->y+s->height,6,1); + if ( isBrick(s->x+1,s->y+2,1) ) + { + s->y+=2; + s->dir=0; + s->counter2=13; + } + } + else + { + s->x+=2; + bghLine(s->x+1,s->y+s->height,6,&c,1); + CopyBg2Screen( s->x+1,s->y+s->height,6,1); + if ( isBrick(s->x+s->width,s->y+2,1) ) + { + s->y+=2; + s->dir=1; + s->counter2=13; + } + } + } + if ( s->counter2 == 12 ) + { + s->y+=2; + SpriteChangePic( s, 32 );//keinesteine + if ( s->dir ) + MirrorSprite( s ); + } + if ( s->counter2 == 13 ) + { + s->type&=TYP_UTILS; + s->type|=TYP_WALKER; + SpriteChangePic( s, 3 );// lemming1 + if ( s->dir ) + MirrorSprite( s ); + } + } + } + else if(s&&(s->type&TYP_DIGDOWN)) + { + if(!(s->counter1%8)) + { + if(s->y<160) + { + bgRect( s->x+1, s->y+4, 10, + 8-max(0,s->y-152), STEELBLUE ); + s->y+=1; + cursor_get=1; + } + } + } /* digger */ + else if(s&&(s->type&TYP_DIGDIAG)) + { + if ( s->ani == 8 ) + { + if ( s->dir ) + { + unsigned char *data = GetMirrorPic(34); + bg2CopyImage(s->x+1,s->y+2,6,14,data); + } + else + { + inBg(34,0,s->x+11,s->y+2); + } + } + if ( !s->ani ) + { + s->y+=1; + if ( s->dir ) + s->x-=2; + else + s->x+=2; + } + } + } /* freier fall */ + } /* nicht am ziel */ + } /* countdown */ + if ( s&&(level==5) ) + { /* ab ins feuer ? */ + for( f=5; f<11; f++ ) + { + if ( SpriteCollide( deko[f], s->x+s->width, s->y ) ) + { + SoundPlay( SND_DIE ); + killlem(i); + s=0; + break; + } + } + } + } /* typ-fallen */ + + if ( !lemm[i] || !s ) + continue; + + if (( s->type & TYP_EXPLODE ) && ( s->countdown > 0 )) + { + DrawSimpleNumber( s->x-main_x, s->y-6, s->countdown, 1 ); + } + + SpriteGetBackground( s ); + DrawSprite( s ); + if ( SpriteCollide( s, deko[0]->x+7, deko[0]->y+7 ) ) + { + sel_sprite=i; + } + } + if ( cursor_get ) + SpriteGetBackground( deko[0] ); + if ( sel_sprite != -1 ) + { + SpriteSelPic( deko[0], 1 ); + } + else + { + SpriteSelPic( deko[0], 0 ); + } + DrawSprite( deko[0] ); +#if 0 +if ( hhy ) +FBDrawLine(32,hhy+hhy+32,656,hhy+hhy+32,RED); +#endif + counter1++; +} diff --git a/archive-sources/lemm/lemmings.cfg b/archive-sources/lemm/lemmings.cfg new file mode 100644 index 0000000..88a37cc --- /dev/null +++ b/archive-sources/lemm/lemmings.cfg @@ -0,0 +1,9 @@ +pluginversion=1 +name=Lemmings +desc=ohhh noooo +depend=libfx2.so,/lib/libz.so.1 +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 diff --git a/archive-sources/lemm/pic.c b/archive-sources/lemm/pic.c new file mode 100644 index 0000000..4fd52de --- /dev/null +++ b/archive-sources/lemm/pic.c @@ -0,0 +1,296 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#define COMPSZ 8033 + +extern int doexit; + +extern unsigned short realcode; +extern unsigned short actcode; + +typedef struct _Pic +{ + unsigned char *pic_data; + unsigned char *pic_flip; + int ani; // how many animation levels in pic + int width; + int height; +} Pic; + +#define NUMPICS 36 + +static Pic pics[] = { +{ 0, 0, 2, 14, 14 }, // 0 cursor +{ 0, 0, 9, 41, 22 }, // 1 tor +{ 0, 0, 6, 6, 5 }, // 2 flamme +{ 0, 0, 7, 6, 10 }, // 3 lemming1 +{ 0, 0, 11, 10, 10 }, // 4 lemming2 +{ 0, 0, 12, 12, 12 }, // 5 lemming3 +{ 0, 0, 5, 5, 11 }, // 6 lemming4 +{ 0, 0, 2, 41, 25 }, // 7 haus +{ 0, 0, 1, 16, 16 }, // 8 explosion +{ 0, 0, 3, 32, 14 }, // 9 feuer +{ 0, 0, 1, 32, 32 }, +{ 0, 0, 1, 41, 3 }, +{ 0, 0, 1, 9, 18 }, +{ 0, 0, 1, 26, 8 }, +{ 0, 0, 1, 11, 26 }, +{ 0, 0, 1, 66, 159 }, +{ 0, 0, 1, 287,110 }, +{ 0, 0, 1, 181,82 }, +{ 0, 0, 1, 47, 160 }, +{ 0, 0, 1, 16, 24 }, +{ 0, 0, 1, 32, 24 }, +{ 0, 0, 1, 33, 11 }, +{ 0, 0, 1, 13, 17 }, +{ 0, 0, 1, 13, 17 }, +{ 0, 0, 1, 54, 13 }, +{ 0, 0, 1, 34, 1 }, +{ 0, 0, 1, 17, 1 }, +{ 0, 0, 1, 25, 6 }, +{ 0, 0, 1, 32, 32 }, +{ 0, 0, 5, 9, 13 }, // 29 menu-icons (no ani) +{ 0, 0, 1, 14, 14 }, // 30 level6 short mask +{ 0, 0, 17, 9, 13 }, // 31 lemming - builder +{ 0, 0, 8, 8, 11 }, // 32 lemming - builder - ende +{ 0, 0, 22, 17, 17 }, // 33 lemming - hacke +{ 0, 0, 1, 6, 14 }, // 34 maske hacke +{ 0, 0, 8, 9, 15 } // 35 lemming - rutscher +}; + +static int piccolors[] = { + 0x00EE00, + 0x00AA00, + 0xFFFF00, + 0x660000, + 0x000033, + 0xCC7700, + 0xAA5511, + 0x993311, + 0x444455, + 0x666677, + 0x888888, + 0x226622, + 0x4444EE, + 0x779900, + 0xFFDDDD, + 0xFF2222, + 0x00BB00, + 0xDDBB88, + 0x010101, + 0xDDBB44, + 0xFFFF66, + 0xBB8822, + 0xAA5500, + 0x883311, + 0x550000, + 0xCC0000, + 0x665555, + 0x880000, + 0x887777, + 0x554444, + 0x442222, + 0xFFFFFF, + 0x5E1A1A, + 0x995544, + 0xC49022, + 0xBB881A, + 0x884433, + 0x66221A, + 0x904C3C, + 0xBB9990, + 0x3C0808, + 0x773C2A, + 0xE6D46E, + 0xDDDDDD, + 0x2A0000, + 0x330000, + 0x883C33, + 0x441108, + 0x80332A, + 0x330808, + 0x772222, + 0x552211, + 0x6E3322, + 0x662A22, + 0x4C1A11, + 0xB27711, + 0x4C2A22, + 0x2A1108, + 0x3C1111, + 0x3C1108, + 0x220000, + 0x770000, + 0xDD6600, + 0xDD2A00, + 0xEE9000, + 0xEECC00, + 0x44221A, + 0x1A0000, + 0x4C1111, + 0xEE5500, + 0x882A00, + 0x220808, + 0x901108, + 0x800000, + 0x551111, + 0x880808, + 0xB29088, + 0xBB4C1A, + 0x441111, + 0xC45522, + 0x55221A, + 0x304536, + 0x30593E, + 0x305236, + 0x3E6745, + 0x303E30, + 0x303630, + 0x303030, + 0x304C30, + 0x304C36, + 0x3E673E, + 0x36674C, + 0x3E674C, + 0x36593E, + 0x366145, + 0x304530, + 0x36613E, + 0x365236, + 0x365936, + 0x364C36, + 0x3E6E4C, + 0x36523E, + 0x3E7559, + 0x457552, + 0x364C3E, + 0x457559, + 0x457C61, + 0x3E6E52, + 0xDD8822 }; + +#if 0 +#include +#include +#endif + +int LoadPics( void ) +{ + unsigned long i; + unsigned char *data; + int sz; + + data = malloc(UNZSIZE+100); + i=UNZSIZE+100; + if ( uncompress(data,&i,pic_img_gz,COMPSZ) != Z_OK ) + { + free(data); + return -1; + } + + pics[0].pic_data=data; + sz=pics[0].width*pics[0].height*pics[0].ani; + for( i=1; i> 16) & 0xff; + g=(piccolors[i] >> 8) & 0xff; + b=piccolors[i] & 0xff; + FBSetColor( i+10, r, g, b ); + } +} + +unsigned char *GetMirrorPic( int picid ) +{ + int sz; + int y; + int x; + int width; + int height; + unsigned char *data1; + unsigned char *data; + + if ( pics[picid].pic_flip ) + return pics[picid].pic_flip; + + width=pics[picid].width; + height=pics[picid].height; + sz=pics[picid].width*pics[picid].height; + pics[picid].pic_flip = malloc(sz*pics[picid].ani); + data=pics[picid].pic_flip; + data1=pics[picid].pic_data; + for( y=0; y < height * pics[picid].ani; y++ ) + for( x=0; x < width; x++ ) + data[ y*width+x ] = data1[ y*width+width-x-1 ]; + + return data; +} diff --git a/archive-sources/lemm/pics.h b/archive-sources/lemm/pics.h new file mode 100644 index 0000000..bcaf4f9 --- /dev/null +++ b/archive-sources/lemm/pics.h @@ -0,0 +1,404 @@ +#define UNZSIZE 96972 +static unsigned char pic_img_gz[ 8033 ] = { +120,156,237,93,237,127,219,200,113,198,39,127,112,4,190,138,20,72,137,34, +105,73,150,127,166,67,241,164,182,210,49,148,79,241,53,182,37,231,234,187, +54,77,175,149,105,82,146,19,155,178,238,210,36,141,254,254,206,204,190,96, +1,44,150,128,72,138,164,111,71,62,112,177,251,236,188,60,59,3,128,0, +152,56,14,202,175,30,58,177,146,126,236,33,253,173,172,56,191,194,63,218, +224,30,235,214,225,127,21,111,33,201,216,195,135,96,4,45,128,177,135,15, +31,234,32,220,221,224,94,188,102,208,22,216,89,137,29,10,139,201,94,208, +179,160,215,110,34,201,128,184,217,92,72,242,110,164,47,143,80,55,151,15, +10,104,136,116,101,50,26,100,20,200,112,17,235,97,211,18,23,210,89,40, +20,87,87,139,26,125,17,157,65,141,1,92,80,103,208,199,32,46,160,83, +213,24,193,89,177,226,139,235,230,243,165,82,185,84,54,9,166,94,198,205, +103,115,99,160,185,44,101,91,62,159,203,101,65,114,26,44,27,128,52,38, +235,60,149,5,60,4,33,225,126,170,149,137,240,178,2,81,113,153,12,37, +189,47,229,192,196,92,78,137,157,247,112,120,89,66,168,35,192,146,192,224, +152,187,234,230,148,253,16,159,190,6,56,0,184,138,66,29,247,92,69,161, +32,12,24,106,21,193,153,66,198,12,178,178,156,146,166,10,115,99,171,144, +159,11,243,185,108,174,4,208,24,44,102,156,43,172,35,180,172,197,18,76, +158,11,93,169,181,164,131,41,231,66,31,90,138,194,212,20,166,142,144,86, +14,11,85,141,43,161,171,76,36,44,92,18,252,108,137,208,98,177,40,97, +154,42,116,5,52,47,93,137,43,49,54,194,15,92,241,48,14,45,248,174, +24,11,22,138,186,40,90,86,230,42,184,166,9,170,16,214,211,133,51,157, +166,8,130,21,193,175,72,179,171,165,181,248,42,44,175,230,228,21,105,118, +117,173,180,166,175,66,5,199,145,107,37,189,3,171,193,43,82,210,89,10, +85,97,4,39,116,50,108,64,235,106,244,138,52,187,170,147,232,149,38,32, +139,81,209,93,145,186,145,243,40,156,115,181,117,3,53,29,234,137,171,175, +240,209,35,190,14,131,72,83,189,170,72,115,93,187,49,237,136,20,76,131, +1,41,38,70,46,181,0,199,197,177,85,88,164,42,204,67,109,153,161,44, +43,221,4,85,152,115,217,73,51,235,25,171,176,152,21,229,74,200,216,42, +148,56,95,167,182,10,21,156,212,169,171,194,0,142,74,203,211,86,97,164, +188,242,218,34,44,22,32,224,16,241,250,132,134,175,156,154,21,210,149,176, +174,83,115,198,141,49,19,65,198,215,181,107,220,87,71,130,10,99,235,48, +121,13,38,70,46,123,177,194,122,172,142,173,194,85,118,46,244,198,86,97, +145,170,16,179,219,92,133,197,60,63,105,230,198,84,33,79,14,240,50,103, +172,194,188,43,207,174,249,156,161,10,37,142,46,2,114,177,85,152,247,129, +164,50,23,83,133,42,142,93,56,234,138,176,88,40,184,42,144,84,234,47, +3,131,56,82,233,106,235,40,4,4,149,250,2,9,227,162,51,21,92,168, +226,220,24,96,196,35,157,74,173,153,232,197,62,191,26,215,153,73,212,7, +42,53,197,170,229,108,113,171,154,157,225,198,85,33,100,175,155,79,84,133, +84,174,185,100,85,8,42,243,99,171,144,159,93,19,84,33,255,74,58,174, +10,121,93,83,33,152,171,80,156,134,115,84,175,250,42,84,190,27,50,149, +166,42,244,207,215,185,216,115,143,27,172,235,92,164,54,20,92,224,196,110, +2,6,234,90,91,91,209,1,55,70,101,180,63,70,101,180,59,197,1,64, +95,153,81,59,113,231,102,77,255,244,107,112,106,197,58,253,42,116,19,86, +161,155,162,10,243,9,170,80,148,171,185,10,3,229,106,174,66,113,26,206, +49,235,49,85,24,6,198,84,97,8,136,213,165,93,15,66,249,15,114,114, +242,174,140,6,168,28,0,168,90,19,1,243,250,74,224,181,112,71,160,222, +118,32,22,113,220,136,7,42,7,169,124,76,52,1,203,210,182,214,199,8, +48,246,74,58,164,98,30,23,204,249,188,151,168,10,243,28,57,166,10,11, +46,70,181,58,182,10,11,116,191,50,135,72,99,21,22,92,14,36,100,124, +21,22,92,9,228,58,245,85,88,200,251,64,102,93,95,133,5,55,0,68, +164,182,10,169,186,20,96,206,53,158,11,21,141,166,154,81,128,230,226,82, +162,78,8,116,19,2,221,132,192,252,18,0,213,167,222,17,9,15,207,237, +140,89,161,13,110,43,43,240,81,129,45,180,87,88,55,141,86,112,148,245, +179,65,62,106,158,171,170,87,48,92,69,176,155,182,43,114,71,49,43,44, +114,205,43,153,140,120,1,161,90,165,141,7,31,85,207,243,96,199,43,59, +98,235,149,169,141,91,15,43,203,129,113,194,240,169,56,25,230,58,161,185, +101,207,241,219,138,30,130,84,29,154,196,205,178,238,240,84,216,122,52,213, +115,194,70,133,6,174,194,81,85,200,201,100,151,52,224,244,144,211,134,120, +229,220,177,241,58,209,185,49,241,154,3,246,36,62,38,96,22,165,180,206, +66,70,239,29,79,88,240,80,32,94,166,150,121,224,4,90,20,11,107,201, +213,241,152,6,199,167,146,217,96,77,208,133,173,59,219,112,164,13,79,19, +135,176,81,157,161,13,103,42,54,52,92,105,109,56,11,110,35,9,87,211, +206,43,77,90,85,69,205,205,48,142,42,26,153,102,28,115,178,225,76,106, +35,194,149,34,235,145,158,40,66,139,9,119,42,25,202,74,109,157,77,173, +242,99,29,63,146,74,23,60,141,51,19,139,36,79,241,135,74,70,24,195, +195,170,240,129,252,41,75,47,198,51,161,224,214,131,187,240,33,105,2,187, +222,58,27,168,138,54,24,67,23,60,197,7,199,247,193,145,109,199,228,79, +204,50,172,43,253,235,190,15,220,88,149,31,246,214,29,158,71,220,7,150, +63,212,77,254,72,21,190,67,177,254,172,135,125,9,14,173,107,71,252,254, +113,206,81,114,51,187,235,236,220,61,214,183,8,41,241,123,178,51,14,164, +28,180,196,34,241,28,134,8,120,110,51,55,157,192,218,173,199,251,147,90, +162,84,9,127,214,21,127,132,111,124,6,208,38,56,89,95,247,214,73,166, +225,76,213,241,83,59,224,15,213,209,122,216,7,185,118,194,9,62,123,6, +229,30,240,82,250,192,125,227,137,174,30,7,2,190,121,222,148,248,137,243, +39,226,27,115,66,30,140,200,31,158,253,161,99,145,70,12,21,167,246,251, +71,39,168,29,105,150,218,98,29,61,116,66,230,15,191,186,37,241,125,136, +175,47,105,47,112,220,137,184,192,122,61,133,7,47,112,25,35,46,100,132, +15,242,116,64,53,197,119,226,15,142,14,187,2,135,173,184,24,39,136,167, +108,216,217,144,105,243,60,243,12,186,218,102,166,137,130,114,232,252,36,231, +6,166,149,249,12,126,169,206,46,251,121,168,193,185,108,195,191,78,120,210, +146,167,129,71,166,209,140,50,183,198,190,19,232,240,75,40,240,101,61,25, +174,80,44,198,12,21,10,69,175,88,144,184,66,113,213,101,187,129,1,146, +226,170,104,20,11,128,92,45,2,54,56,32,129,69,174,14,111,32,21,138, +160,170,136,200,66,20,88,40,50,125,5,186,221,192,236,3,46,12,4,24, +253,91,149,119,37,240,253,87,214,27,13,9,213,100,10,153,2,172,118,1, +117,186,49,193,187,136,204,16,174,12,120,8,60,134,78,23,252,231,10,17, +88,136,165,19,89,145,64,22,143,86,37,14,112,96,105,13,111,181,8,138, +52,64,226,166,80,90,91,67,96,1,239,171,21,116,64,16,12,59,131,55, +242,232,230,13,204,211,121,137,36,22,50,69,249,252,19,227,94,93,141,226, +92,90,184,76,81,62,11,6,227,145,117,97,46,186,68,9,123,201,216,101, +64,157,105,204,66,208,87,96,111,44,187,200,40,134,23,13,155,126,219,80, +44,176,23,181,217,211,50,32,118,53,8,44,173,149,48,71,49,195,178,242, +149,110,0,98,79,8,184,86,202,229,241,142,44,160,232,237,110,122,133,181, +68,140,151,74,81,63,107,155,155,53,248,99,219,90,189,161,33,145,164,177, +137,24,2,209,191,70,51,6,136,168,90,173,14,127,181,122,29,91,49,42, +27,96,13,0,245,58,109,17,30,163,114,147,244,8,16,205,8,169,100,213, +219,224,131,117,102,150,254,154,205,80,97,23,87,51,25,82,136,90,80,234, +220,211,102,38,184,220,192,108,99,179,78,200,70,179,209,132,127,52,9,189, +12,3,11,155,53,22,104,147,242,183,64,250,192,118,35,8,44,20,27,204, +175,70,163,192,171,122,147,230,193,196,80,2,177,112,235,128,99,183,166,11, +245,77,138,42,28,56,120,136,238,55,154,25,113,19,187,176,201,200,106,54, +67,10,89,36,5,31,88,39,175,235,65,210,27,204,14,40,244,129,69,92, +239,122,8,41,61,84,52,22,133,202,70,64,33,139,176,160,106,44,214,24, +69,138,202,77,182,116,224,161,170,177,88,220,100,107,37,129,13,145,43,88, +246,181,70,163,249,8,4,139,53,28,15,207,66,244,176,144,129,238,102,147, +3,139,148,160,53,161,82,241,176,144,225,203,209,148,42,149,192,55,153,211, +228,97,134,194,108,32,146,171,244,83,157,121,88,231,30,50,91,168,148,171, +36,130,105,121,54,57,176,192,44,215,185,224,68,166,18,6,155,13,166,144, +86,153,123,24,81,73,29,144,165,172,242,234,77,74,47,14,18,42,241,160, +197,19,63,148,68,90,169,176,109,37,216,65,251,114,8,111,56,163,176,125, +108,175,172,172,84,248,15,220,176,189,226,97,7,135,195,30,202,10,87,196, +247,87,252,125,143,143,87,120,207,74,120,159,105,20,46,129,65,234,169,56, +190,125,20,97,191,194,212,242,24,2,241,36,187,53,63,99,217,162,205,214, +22,187,13,191,165,14,109,175,138,27,239,48,138,55,244,119,50,91,184,187, +131,219,202,234,234,246,99,98,154,205,194,85,216,217,33,45,59,59,200,194, +99,24,207,48,0,62,20,200,236,64,11,7,50,140,175,204,99,62,31,186, +9,181,131,55,255,43,21,78,112,133,198,57,183,172,103,119,27,6,119,25, +120,123,155,244,239,238,226,200,46,194,118,119,161,15,250,119,81,195,46,236, +61,126,12,59,240,111,229,9,160,42,79,96,251,228,73,5,54,187,79,42, +180,183,253,120,27,122,98,5,198,77,195,8,152,222,34,236,192,95,130,149, +170,232,187,183,248,182,34,158,185,176,53,197,245,131,15,122,220,130,11,140, +196,147,157,10,126,108,225,250,33,142,88,103,147,112,9,169,3,86,144,173, +31,95,44,241,248,5,160,59,59,152,8,21,182,62,108,177,216,138,236,178, +12,0,101,184,78,43,52,127,171,178,5,173,45,92,158,10,174,223,206,206, +46,34,148,245,219,2,200,46,130,104,253,118,96,189,16,160,174,223,22,172, +213,86,96,253,118,102,185,126,99,22,98,107,204,112,116,124,75,221,174,68, +148,80,69,85,182,208,238,14,127,240,85,65,45,59,84,127,91,244,32,141, +47,44,148,23,62,251,194,5,130,246,170,92,31,190,124,59,88,119,43,108, +125,97,135,214,143,173,30,61,99,163,170,164,7,116,180,192,59,202,250,241, +133,227,53,182,66,48,26,223,161,138,221,169,208,48,140,109,211,42,169,245, +7,3,176,166,88,152,56,178,189,141,136,96,253,237,192,90,237,4,214,239, +201,148,214,143,253,14,47,155,203,227,229,101,150,126,99,152,205,227,111,26, +169,145,199,223,244,225,53,106,30,127,52,196,186,242,240,31,246,224,67,112, +124,203,196,205,17,208,101,191,86,164,209,60,94,254,178,151,90,112,147,101, +15,122,115,248,75,73,188,146,5,116,150,58,115,46,77,231,239,112,228,133, +17,254,139,94,151,105,103,143,198,233,113,49,93,84,147,109,82,142,51,114, +252,217,47,123,123,8,61,201,49,111,242,124,4,63,115,236,141,55,156,235, +226,111,128,113,55,155,227,47,28,101,233,81,57,204,66,96,206,205,50,219, +44,66,82,73,166,179,57,134,204,230,152,222,44,255,214,144,207,242,31,31, +139,139,126,254,88,27,201,228,63,94,68,219,224,107,214,191,218,71,123,248, +131,53,156,237,74,8,5,79,63,165,100,123,72,33,143,130,66,229,235,131, +158,50,114,25,146,56,200,209,15,224,88,220,89,70,67,142,147,138,11,149, +165,32,113,143,175,103,142,253,80,139,44,100,217,178,176,223,120,209,23,13, +151,214,89,248,133,139,138,147,8,77,113,161,19,236,209,188,248,29,39,79, +155,28,17,33,198,243,57,97,157,47,26,179,207,127,200,234,114,124,222,239, +225,113,243,36,100,47,7,128,89,180,136,168,60,115,0,23,48,155,23,171, +75,233,70,201,152,101,44,160,58,62,151,178,2,103,224,130,65,84,57,78, +54,228,93,150,255,164,141,45,39,234,16,54,49,1,178,140,8,54,31,83, +40,75,62,176,183,42,8,201,88,102,46,80,248,108,45,56,129,89,190,150, +174,8,57,71,165,145,229,203,168,176,76,17,229,68,213,241,85,35,190,56, +139,174,152,78,54,115,89,198,117,206,103,57,231,234,106,88,225,52,167,173, +97,222,204,17,121,238,24,113,192,109,170,152,252,24,48,7,42,63,53,142, +7,226,95,54,147,41,173,185,110,169,4,135,220,82,41,159,95,43,97,71, +198,197,87,122,50,37,218,129,214,26,182,177,181,150,33,28,222,82,96,13, +222,35,134,50,48,192,27,48,37,190,145,9,54,74,178,145,9,55,194,187, +65,100,137,252,148,206,48,165,104,104,13,125,196,215,146,214,248,63,122,157, +137,245,146,148,196,7,125,203,47,241,183,152,196,160,24,45,229,115,56,43, +87,202,150,242,68,0,66,153,46,250,189,43,29,12,242,121,132,224,34,99, +7,213,9,165,3,37,68,137,114,25,20,224,170,48,215,149,151,243,240,237, +242,188,104,202,95,144,41,239,156,251,175,241,185,226,21,100,151,191,45,238, +250,63,89,117,253,31,195,6,95,157,115,221,168,34,166,195,111,143,235,14, +182,117,77,189,14,55,163,105,226,176,136,221,87,194,182,15,194,146,224,187, +85,80,22,82,67,106,21,81,13,105,85,204,68,67,74,21,139,170,33,157, +138,25,105,72,165,66,175,33,141,142,56,13,201,85,196,106,72,172,98,150, +26,146,170,88,112,13,9,85,204,86,67,50,21,70,13,137,116,140,209,144, +64,197,56,13,227,117,140,215,48,78,75,50,13,38,21,9,53,24,84,36, +213,16,175,228,94,53,196,168,248,229,105,208,171,72,165,65,171,226,190,53, +232,84,164,212,160,81,145,86,67,84,133,213,112,71,13,17,21,233,53,132, +85,220,65,195,131,201,53,4,181,44,179,134,7,147,107,144,90,38,86,96, +53,124,33,26,38,207,7,166,98,50,13,168,99,254,26,30,44,130,134,69, +144,5,88,11,171,97,74,26,230,95,221,139,112,140,90,0,13,139,112,180, +183,26,20,5,115,188,18,155,248,106,208,177,26,66,10,150,87,131,99,53, +76,71,131,51,169,6,103,82,13,142,213,160,83,48,243,123,65,81,88,74, +13,26,92,58,13,58,96,10,13,122,100,84,65,154,39,65,41,52,104,96, +233,52,196,40,136,147,137,21,124,169,26,210,42,176,26,22,88,67,106,5, +211,215,144,94,129,51,177,2,103,98,5,95,160,134,59,41,88,44,13,119, +155,174,104,184,179,130,184,19,81,58,13,147,41,112,38,86,240,165,104,152, +84,129,213,176,64,26,172,88,89,96,177,9,110,146,201,79,106,95,180,76, +120,209,241,133,203,228,87,101,95,180,76,122,217,252,133,203,196,95,43,190, +104,153,252,187,227,151,44,15,30,88,126,12,98,233,49,138,165,199,40,15, +44,63,38,177,244,4,100,220,51,211,249,120,181,48,98,233,49,138,165,199, +40,150,30,163,140,123,227,99,78,110,45,138,88,122,140,50,238,197,171,121, +249,181,32,18,96,32,202,142,165,199,252,22,231,28,93,91,0,9,112,160, +97,199,210,35,89,208,177,99,233,49,203,188,29,156,175,88,122,140,98,233, +49,138,165,199,36,99,217,177,244,88,122,98,197,210,99,146,241,236,88,122, +44,61,241,98,233,49,138,165,199,44,150,30,179,88,122,204,98,233,49,139, +165,103,140,88,118,140,98,233,49,139,165,199,44,150,30,163,88,122,140,98, +233,49,139,165,199,44,150,30,179,88,122,140,98,233,49,138,165,199,40,150, +30,163,88,122,76,98,207,92,70,177,244,152,68,207,142,165,135,73,12,59, +150,30,38,150,29,163,88,122,76,98,107,203,40,150,30,179,88,122,198,136, +165,199,44,150,158,49,98,233,49,139,165,199,40,150,30,163,88,118,140,98, +217,49,137,77,158,120,177,167,117,147,216,171,30,131,232,200,177,236,112,209, +146,163,253,159,56,191,127,223,230,44,49,212,232,232,249,101,229,21,69,105, +96,103,220,255,62,66,16,184,216,196,249,158,153,86,56,138,74,74,79,18, +252,88,134,83,68,115,199,137,154,48,147,121,127,135,24,131,6,167,32,41, +194,187,251,228,105,57,155,34,154,89,233,141,89,240,153,78,159,150,220,215, +106,76,104,226,94,57,9,217,157,151,237,37,16,203,142,81,44,61,70,177, +244,24,197,178,99,20,155,61,70,177,103,46,163,88,122,140,98,233,49,138, +165,199,36,247,253,13,111,185,196,178,99,20,75,143,81,44,61,38,113,44, +61,241,18,186,211,100,37,32,145,59,113,86,20,113,28,45,63,142,10,152, +143,103,11,32,97,114,130,255,143,75,242,139,188,250,191,39,42,167,6,21, +105,90,75,47,81,118,156,241,79,71,31,248,55,195,5,25,154,169,243,13, +108,42,50,134,135,137,132,91,240,109,205,41,198,187,203,44,217,81,159,238, +45,225,205,182,217,82,67,100,232,57,19,229,40,252,120,16,61,25,76,35, +184,201,148,206,158,157,116,18,151,96,126,175,0,177,160,157,232,201,34,114, +32,188,123,214,222,95,220,105,133,19,193,154,193,78,209,214,118,202,94,173, +210,130,26,123,136,138,72,107,202,17,77,87,244,241,37,238,76,99,73,203, +197,98,179,99,197,138,21,43,86,230,42,75,120,146,16,23,93,75,33,73, +47,233,22,232,98,38,246,66,244,65,224,182,136,114,249,59,99,127,98,94, +237,84,174,36,205,95,61,34,95,174,103,125,233,24,176,22,120,11,216,228, +102,148,110,101,242,204,157,214,154,15,219,79,232,116,164,247,94,92,150,150, +83,250,204,38,204,244,87,56,198,135,208,119,116,250,129,19,187,58,83,114, +218,232,128,243,32,125,118,240,237,12,189,78,224,193,157,124,142,117,122,98, +183,147,185,112,55,162,227,231,205,216,229,187,223,11,50,14,206,216,231,153, +220,116,149,119,140,102,226,241,76,157,78,239,246,12,92,73,239,117,202,139, +218,249,250,28,60,252,39,244,120,238,62,167,113,90,60,25,154,191,168,231, +172,69,206,136,160,168,135,241,165,116,154,246,151,192,231,100,215,173,115,241, +204,32,241,78,199,66,230,47,113,78,27,32,11,40,11,154,17,102,89,98, +167,231,237,69,74,177,78,223,151,88,167,239,77,172,211,247,37,214,233,251, +146,101,244,217,58,125,111,178,148,78,47,231,75,190,75,234,244,188,61,184, +131,44,165,211,203,240,165,48,42,203,232,244,146,22,226,18,122,189,140,78, +47,237,85,222,178,57,189,180,62,91,167,239,67,172,211,247,36,75,153,30, +214,233,123,146,101,244,121,41,157,94,70,159,173,211,247,38,214,233,251,146, +41,56,173,188,31,123,79,241,59,119,127,244,201,166,249,10,238,109,209,156, +136,211,9,31,235,59,6,153,157,187,17,211,58,95,238,228,243,140,221,30, +99,90,177,175,56,226,36,154,56,95,167,213,183,15,19,207,145,110,251,238, +79,43,140,196,246,39,20,97,107,153,124,14,251,191,116,78,79,236,245,252, +156,142,57,172,154,143,187,119,125,181,119,58,78,179,79,37,211,149,163,237, +131,96,1,248,147,22,230,87,70,86,172,88,137,145,148,7,203,153,194,19, +161,211,94,92,127,1,240,132,232,180,223,21,210,161,239,164,125,182,206,164, +131,39,71,167,125,38,57,107,120,26,244,29,156,73,201,204,50,195,83,160, +151,29,158,150,200,217,22,223,76,107,245,151,147,51,105,208,105,37,165,242, +180,112,123,20,251,50,225,41,208,191,44,120,26,180,133,27,224,139,118,230, +155,237,53,176,133,199,193,19,163,127,105,240,228,232,69,59,29,164,65,47, +218,241,221,30,103,12,240,196,232,133,43,143,20,232,229,190,132,72,133,94, +44,153,245,119,143,217,194,23,237,56,179,72,240,228,104,123,42,155,34,220, +158,202,166,7,79,121,187,62,245,179,131,132,120,39,29,222,9,226,199,77, +115,84,25,159,18,142,78,102,11,143,199,235,225,177,248,185,192,227,240,113, +240,24,124,44,92,143,143,135,107,39,152,224,154,25,99,224,142,60,16,177, +143,113,112,117,150,147,24,126,63,242,180,245,236,215,109,33,123,157,175,246, +219,7,255,244,207,66,254,165,253,236,176,125,228,239,127,221,237,28,182,59, +95,201,253,253,238,179,195,206,145,191,255,155,118,235,176,219,82,240,189,175, +14,247,20,252,215,189,103,135,199,42,126,175,117,184,167,238,247,158,237,239, +61,239,128,180,91,173,118,167,215,57,106,237,183,143,15,90,221,222,94,175, +219,121,190,215,3,124,187,119,124,208,105,247,16,6,219,206,254,81,239,96, +175,215,234,236,29,31,119,58,93,216,239,181,14,142,123,221,86,171,119,220, +105,117,122,224,15,244,30,115,68,11,253,235,28,245,158,2,162,215,6,11, +93,208,215,65,36,236,244,58,237,54,224,123,71,136,108,119,218,221,94,239, +24,231,127,131,200,118,15,134,187,123,56,126,140,200,94,187,219,193,254,35, +240,167,5,35,221,147,253,214,17,66,14,1,122,124,124,188,135,62,128,6, +28,239,180,159,195,94,187,141,184,206,33,200,254,161,144,253,167,79,91,24, +107,167,211,66,121,246,219,78,120,127,191,141,108,244,176,239,69,187,251,2, +214,167,211,237,118,193,50,40,135,208,190,58,124,222,3,231,193,151,118,231, +155,86,247,0,214,11,134,91,24,80,167,11,35,176,127,12,67,173,111,123, +189,141,111,143,254,117,227,224,176,125,240,187,151,175,94,109,189,62,61,123, +125,10,252,30,118,58,199,123,48,183,253,98,99,227,155,141,141,23,135,109, +24,125,117,122,122,122,118,246,230,236,236,215,207,96,61,247,142,219,173,223, +111,116,54,190,235,188,128,249,255,6,227,111,79,223,158,189,121,139,8,88, +223,118,247,184,215,217,216,248,125,235,184,119,116,244,213,225,247,47,79,95, +189,221,122,251,6,71,95,195,248,113,183,187,183,215,123,177,241,116,255,187, +141,31,142,159,29,254,251,247,167,223,159,158,190,62,125,253,230,205,235,179, +179,103,135,123,93,80,176,119,116,240,221,6,200,9,228,195,201,254,225,203, +151,96,255,245,127,236,31,238,181,246,193,122,187,125,252,252,5,14,111,252, +161,181,223,121,126,124,178,255,242,251,211,179,255,220,235,1,247,148,31,207, +247,14,216,248,211,103,251,237,86,183,253,252,55,175,182,78,129,157,163,163, +103,148,47,27,237,189,111,112,248,135,189,63,194,122,63,127,9,33,64,4, +167,173,110,247,143,152,63,7,95,183,58,127,248,195,198,198,119,79,247,190, +218,223,219,123,249,61,18,0,1,190,233,64,61,188,104,181,54,190,5,118, +142,14,48,159,128,255,238,201,247,111,79,95,157,157,189,61,251,109,11,226, +253,6,88,217,56,216,216,248,215,189,231,109,228,187,211,121,126,178,255,155, +151,167,175,79,78,90,61,168,143,31,128,185,111,187,47,54,142,49,169,32, +223,96,105,186,207,95,190,218,58,251,175,214,81,23,242,25,56,111,157,252, +248,244,8,146,13,50,11,252,133,204,255,29,44,208,233,25,38,238,179,67, +96,238,199,239,54,190,219,3,18,33,169,160,126,218,173,3,152,254,246,237, +155,255,62,56,122,254,236,240,232,136,152,251,26,50,140,229,103,23,227,219, +34,0,174,111,143,49,243,45,75,87,208,255,63,56,124,250,22,87,232,45, +230,7,31,103,233,219,58,252,157,178,254,111,222,66,125,28,49,102,89,58, +183,14,79,14,15,127,220,199,255,246,15,127,252,26,235,241,232,232,7,28, +102,233,221,130,17,248,59,193,255,78,78,208,31,204,242,147,19,153,239,225, +252,111,212,234,155,32,53,248,171,215,234,141,122,163,209,108,52,155,143,154, +143,30,225,6,91,245,70,13,4,6,107,141,154,28,84,100,172,134,177,128, +76,189,134,131,155,100,5,164,65,8,24,105,50,68,38,147,169,215,9,176, +9,227,164,162,217,192,137,143,228,56,32,106,210,4,211,208,100,26,96,147, +201,112,68,13,221,0,8,211,192,245,203,113,64,224,232,38,121,65,26,184, +130,76,70,69,144,6,238,4,83,144,81,165,238,171,224,227,143,148,209,38, +234,149,77,132,209,46,181,97,102,189,14,123,196,119,163,129,99,153,38,110, +145,50,226,158,122,97,140,153,199,133,169,211,188,102,3,38,226,62,66,155, +205,90,189,73,118,80,57,54,48,140,102,173,214,204,160,87,200,26,243,157, +162,108,210,102,179,137,90,193,24,77,192,46,212,9,16,116,4,39,53,113, +73,54,33,110,220,39,226,176,163,78,57,241,72,112,28,8,142,18,134,5, +199,34,99,123,228,59,139,48,67,1,97,112,208,71,19,176,191,78,161,18, +30,173,65,152,232,73,3,91,77,226,20,195,197,197,129,207,12,70,133,222, +176,140,1,8,250,130,41,178,73,97,208,6,225,224,63,152,64,253,24,18, +11,13,199,54,55,27,52,74,222,53,88,206,97,132,200,32,165,118,131,214, +145,69,132,153,210,216,108,192,234,55,89,178,54,128,72,76,73,154,199,102, +63,122,132,44,212,253,37,166,176,209,188,113,86,147,153,108,42,116,209,68, +227,44,154,132,65,98,134,53,104,18,101,4,142,104,103,161,1,156,212,32, +32,24,107,178,245,68,122,88,194,243,89,77,74,187,26,159,129,38,216,1, +0,93,195,122,166,73,48,237,17,229,47,173,19,210,138,89,73,135,10,218, +240,57,48,3,19,18,29,97,107,79,135,148,102,147,231,177,56,182,16,30, +83,139,114,3,45,52,41,237,184,34,152,213,160,181,169,51,211,100,138,254, +234,181,26,131,209,145,161,241,8,61,100,65,162,131,60,173,168,106,106,148, +15,141,58,113,134,9,197,122,107,136,171,209,226,54,200,191,38,21,64,93, +110,113,45,40,220,38,75,7,138,176,65,102,128,224,12,103,148,225,41,127, +235,148,99,12,87,103,92,98,158,215,5,136,151,60,17,194,99,105,16,188, +94,227,7,142,38,175,188,26,247,176,30,168,44,92,31,248,135,5,139,73, +195,167,208,193,184,201,14,12,124,169,89,89,142,205,89,140,107,19,235,131, +141,195,241,98,251,241,227,109,248,15,54,184,229,31,176,221,222,133,127,187, +212,160,15,127,251,132,122,217,248,46,125,178,221,199,79,118,89,31,3,110, +203,237,227,39,178,159,15,237,178,61,156,241,4,4,183,208,241,132,118,176, +181,125,254,174,255,126,240,110,56,188,184,184,28,92,92,13,251,31,6,208, +68,25,92,92,12,135,127,250,243,224,227,167,15,56,10,255,141,70,195,225, +245,167,171,11,46,67,236,27,126,190,190,57,31,224,238,187,203,193,240,102, +112,213,31,13,197,248,0,251,135,151,63,125,28,13,6,231,176,55,236,15, +216,60,148,243,75,134,58,71,83,96,19,123,135,163,155,209,64,168,63,103, +31,151,125,174,239,252,3,192,174,110,126,26,192,199,57,206,97,138,222,93, +4,101,8,134,96,12,71,135,3,174,123,160,140,159,247,7,131,207,151,48, +216,63,199,176,46,62,188,187,184,10,204,191,28,158,163,227,159,63,244,127, +194,207,247,239,63,10,70,132,243,195,209,231,209,229,251,63,189,187,186,186, +58,191,248,240,243,245,135,191,168,10,174,111,192,250,245,205,207,239,63,143, +70,253,171,139,255,125,255,254,175,127,83,199,7,253,254,159,175,111,174,47, +174,223,95,162,95,159,254,250,247,15,161,16,174,251,55,55,159,46,63,126, +186,236,159,35,137,127,123,127,30,2,12,254,242,241,211,187,155,247,55,72, +245,112,244,174,31,28,189,26,93,125,254,120,253,211,104,112,131,6,134,87, +87,163,155,203,119,35,63,134,119,239,70,87,255,119,221,127,255,174,127,5, +212,124,30,246,175,32,30,101,252,98,112,243,243,207,127,255,199,207,55,184, +92,163,203,254,197,224,18,22,254,82,44,28,80,248,241,230,230,230,231,254, +53,210,67,124,12,175,63,208,216,136,251,127,125,125,211,191,238,95,94,194, +218,33,209,31,62,1,25,87,156,188,139,193,249,251,79,127,125,127,53,26, +13,206,145,216,75,80,127,249,15,138,97,40,125,248,248,161,127,117,245,238, +230,51,172,36,46,127,255,195,245,21,126,244,253,133,252,212,31,221,128,95, +192,14,101,223,185,186,196,148,122,163,225,187,235,254,104,116,5,28,12,249, +224,240,122,160,66,144,187,171,143,126,58,159,15,110,70,163,207,156,2,114, +229,252,106,112,254,211,57,101,226,144,246,110,134,151,2,62,194,244,31,142, +62,140,6,67,30,246,229,213,64,205,20,176,112,245,185,223,31,250,54,97, +88,29,71,1,18,135,202,120,104,20,220,240,3,131,181,138,76,87,50,123, +56,24,14,34,195,192,238,80,172,219,224,242,234,74,53,48,188,128,154,188, +236,143,253,50,237,241,45,254,57,85,207,163,79,167,90,245,202,108,164,90, +229,13,167,90,46,243,57,101,222,242,68,3,230,148,165,66,143,109,197,135, +71,58,171,252,143,166,11,104,185,90,173,210,39,14,85,5,94,168,150,198, +88,151,106,180,204,26,142,4,241,89,6,225,166,40,52,222,224,182,182,182, +182,202,226,147,119,112,155,216,40,7,67,86,77,142,181,9,54,2,214,97, +6,88,247,148,6,169,17,28,150,57,211,17,163,240,81,22,81,210,44,97, +90,120,224,57,27,178,99,195,17,145,122,34,102,79,196,236,149,229,76,47, +26,152,48,198,90,184,2,101,97,150,77,99,103,83,110,51,163,238,201,139, +245,192,78,38,176,19,218,203,132,247,12,187,137,247,34,190,240,142,241,43, +133,75,84,229,141,80,130,84,42,140,172,138,108,172,172,132,27,149,10,167, +79,54,146,36,101,50,163,108,209,192,86,89,24,45,79,100,212,81,74,33, +88,228,149,170,48,94,9,219,154,216,168,39,140,138,0,165,173,106,136,195, +233,25,173,202,250,147,105,239,73,158,67,70,147,89,191,139,81,113,168,184, +245,226,141,70,173,39,50,42,108,221,10,200,45,103,245,86,88,191,165,3, +37,211,195,20,174,36,137,84,161,247,86,90,139,180,32,129,110,217,103,85, +36,146,140,57,121,128,78,154,227,120,232,64,142,230,41,163,110,69,128,183, +188,100,192,51,115,254,164,202,222,88,169,84,88,17,87,86,176,5,73,94, +129,22,154,103,70,61,97,212,19,199,118,113,198,245,110,65,238,108,148,172, +146,45,60,123,134,141,210,241,2,143,228,19,25,101,68,243,176,252,35,17, +176,90,33,197,96,84,216,170,72,19,58,122,83,24,245,87,215,227,145,122, +220,130,104,224,154,242,30,177,184,138,173,187,24,141,94,26,56,210,104,153, +52,6,141,114,171,101,121,226,118,228,209,37,129,209,200,193,87,228,31,196, +193,143,136,112,86,225,198,28,110,213,191,56,136,156,251,111,147,25,245,143, +190,129,16,253,163,11,132,232,31,251,3,4,59,254,98,138,195,167,201,232, +204,78,164,183,183,65,163,194,144,60,248,248,23,143,142,246,51,124,13,231, +71,37,20,6,245,134,22,72,172,129,92,11,207,175,175,24,189,30,215,39, +212,10,189,213,128,221,160,126,143,234,213,139,215,235,5,245,58,122,189,30, +211,231,113,125,38,63,67,122,85,135,125,189,30,27,79,161,79,163,87,227, +239,178,233,157,2,191,211,19,121,173,17,215,225,31,210,68,71,196,137,114, +216,41,42,23,47,128,240,198,117,148,253,163,160,232,8,236,207,34,120,141, +140,15,63,1,31,101,39,212,193,150,91,69,36,8,127,12,31,242,132,41, +228,254,248,241,212,125,118,68,51,116,120,94,40,252,50,255,78,239,119,148, +35,9,163,235,8,135,31,237,112,140,29,119,224,39,60,197,211,119,41,187, +20,127,144,160,224,132,104,71,196,175,72,65,149,195,177,68,58,18,132,63, +109,130,194,249,22,57,10,132,123,136,24,181,192,40,47,212,240,35,29,40, +81,126,252,171,52,33,11,73,80,68,238,198,152,74,153,174,131,238,206,4, +15,91,209,99,101,36,148,169,240,49,109,130,124,53,81,61,38,178,170,213, +80,29,134,59,170,252,214,161,223,49,254,44,182,200,4,77,93,228,53,183, +223,227,133,146,170,90,142,82,22,8,175,92,46,7,207,116,225,14,118,99, +80,89,23,113,221,170,89,220,192,222,60,88,139,48,146,128,162,114,144,34, +249,253,153,139,23,38,200,225,123,134,14,222,235,119,220,210,45,139,5,32, +104,252,197,227,109,57,68,16,198,95,13,237,171,161,220,122,101,39,72,16, +39,195,208,113,203,58,239,59,131,18,221,26,136,102,140,210,129,26,144,160, +48,33,166,12,114,56,95,178,243,54,156,48,145,14,38,83,38,40,245,125, +39,54,33,90,82,225,99,76,164,35,228,88,248,188,30,34,232,54,66,144, +195,175,36,13,29,252,130,117,154,4,141,227,39,50,30,127,43,36,180,111, +230,231,54,122,202,9,103,80,176,227,86,82,168,16,20,46,49,210,232,133, +25,155,106,137,221,26,119,165,164,252,122,118,155,228,235,89,12,65,158,116, +164,204,190,106,197,116,208,12,54,97,150,4,133,37,134,176,116,4,201,155, +223,1,73,69,16,219,15,243,161,116,220,74,149,1,130,120,209,169,50,219, +179,24,103,72,62,240,112,196,190,23,211,33,68,37,136,129,24,65,254,10, +72,130,110,3,29,9,9,242,85,206,151,32,46,50,131,36,97,94,92,135, +152,145,52,131,194,140,45,57,65,114,223,120,12,114,102,95,98,254,140,251, +61,6,197,200,194,18,196,239,182,10,249,197,17,84,14,243,17,237,8,19, +20,185,146,156,5,65,233,239,57,39,189,233,106,234,8,19,228,132,249,136, +118,120,145,219,178,78,248,54,228,242,102,144,230,62,126,136,32,221,125,235, +72,71,136,32,47,33,65,254,139,56,252,5,28,117,155,68,20,124,210,55, +118,124,151,216,71,85,60,149,168,122,252,139,104,181,202,235,42,208,144,79, +101,194,13,133,194,104,99,66,235,229,160,117,141,27,206,196,110,120,97,55, +60,225,70,200,168,217,122,58,55,130,99,60,229,48,93,203,220,11,246,42, +31,121,17,36,97,204,90,76,224,134,239,69,153,110,114,81,3,21,86,165, +27,209,70,140,27,41,150,96,140,27,85,225,70,85,186,81,21,119,213,100, +195,81,26,234,89,33,249,81,73,86,189,111,94,201,8,149,4,56,12,201, +134,19,108,4,173,71,14,45,227,25,80,173,250,13,150,143,85,246,30,84, +85,159,0,222,36,214,81,254,31,175,168,18,192 }; diff --git a/archive-sources/lemm/somain.c b/archive-sources/lemm/somain.c new file mode 100644 index 0000000..a5248a0 --- /dev/null +++ b/archive-sources/lemm/somain.c @@ -0,0 +1,179 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "pig.h" +#include "colors.h" +//#include +#include "fx2math.h" +#include "sprite.h" + +extern int doexit; +extern int debug; +extern int gametime; +extern int pices; +extern int score; +extern unsigned short actcode; +extern unsigned short realcode; + +extern void RemovePics( void ); +extern int InitLemm( void ); +extern void InitLevel( void ); +extern void PicSetupColors( void ); + +/* special */ +extern void AnimateDeko( void ); +extern void UnanimatedDeko( void ); +extern void RunKey( void ); +extern void RunLemm( void ); +extern void RemoveBg( void ); +extern void SoundPlay( int pnr ); +extern int dblInit( void ); +extern void dblFree( void ); +extern void dblDrawFrame( int all ); + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 20 ); + FBSetColor( GREEN, 20, 255, 20 ); + FBSetColor( STEELBLUE, 0, 0, 51 ); + FBSetColor( BLUE, 30, 30, 220 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 60, 60, 60 ); + FBSetColor( 150, 0, 0, 51 ); // blocker + + PicSetupColors(); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int rc=0; + + int fdfb = -1, fdrc = -1; + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( dblInit() < 0 ) + return -1; + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + while( doexit != 3 ) + { + if ( InitLemm() != 0 ) + break; + + InitLevel(); + + dblDrawFrame( 1 ); + +// Fx2ShowPig( 430, 358, 240, 188 ); + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 80000; + x = select( 0, 0, 0, 0, &tv ); /* 50ms pause */ + RcGetActCode( ); + RunKey(); + UnanimatedDeko(); + AnimateDeko(); + RunLemm(); + dblDrawFrame( 0 ); +#ifdef USEX + FBFlushGrafic(); +#endif + } + + rc=doexit; + + FreeSprites(); + + if ( doexit != 3 ) + { + actcode=0xee; +#ifdef USEX + FBFlushGrafic(); +#endif + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + } + + if ( rc == 2 ) + break; + } + + SoundPlay(-2); // stop thread + + dblFree(); + RemoveBg(); + RemovePics(); +// Fx2StopPig(); + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + +//int plugin_exec( PluginParam *par ) +//{ +// int fd_fb=-1; +// int fd_rc=-1; +// +// for( ; par; par=par->next ) +// { +// if ( !strcmp(par->id,P_ID_FBUFFER) ) +// fd_fb=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_RCINPUT) ) +// fd_rc=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_NOPIG) ) +// fx2_use_pig=!_atoi(par->val); +// } +// return lemmings_exec( fd_fb, fd_rc, -1, 0 ); +//} diff --git a/archive-sources/lemm/sound.c b/archive-sources/lemm/sound.c new file mode 100644 index 0000000..8a6f06e --- /dev/null +++ b/archive-sources/lemm/sound.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sounds.h" + +static unsigned char *sounds[6] = +{ snd_die, snd_door, snd_oing, snd_ohno, snd_explode, snd_letsgo }; +static int ssz[6] = +{ 5708, 5360, 4084, 5621, 1364, 9929 }; + +static int sound_fd=-1; +static pthread_t pth; +static int play[20]; +static int playidx=0; +static pthread_cond_t cond; +static pthread_mutex_t mutex; + +void * _run_sound( void *ptr ) +{ + int sz; + int i; + unsigned char *data; + struct timeval tv; + + while( 1 ) + { + tv.tv_usec=50000; + tv.tv_sec=0; + select( 0,0,0,0,&tv); + if ( !playidx ) + { + i=1; + ioctl(sound_fd,SNDCTL_DSP_SYNC,&i); + continue; + } + + i=play[0]; + playidx--; + if ( i < 0 ) + break; + + data=sounds[i]; + sz=ssz[i]; + while( sz ) + { + i=sz>1022?1022:sz; + write(sound_fd,data,i); + sz-=i; + data+=i; + } + i=1; + if ( !playidx ) + ioctl(sound_fd,SNDCTL_DSP_SYNC,&i); + else + playidx=0; + } + if ( sound_fd >= 0 ) + close( sound_fd ); + return NULL; +} + +void SoundStart( void ) +{ + int rc; + int format = AFMT_S8; // signed, 8 Bit + int channels = 1; // 1=mono, 2=stereo + int speed = 12000; // 11025 is not availible when video playback is enabled + + if ( sound_fd == -1 ) +#ifdef __i386__ + sound_fd=open("/dev/dsp",O_WRONLY); +#else + sound_fd=open("/dev/sound/dsp",O_WRONLY); +#endif + if ( sound_fd == -1 ) + sound_fd = -2; + + if ( sound_fd == -2 ) + return; + + ioctl(sound_fd, SNDCTL_DSP_SETFMT, &format); + ioctl(sound_fd, SNDCTL_DSP_CHANNELS, &channels); + ioctl(sound_fd, SNDCTL_DSP_SPEED, &speed); + + memset(&pth,0,sizeof(pth)); + pthread_cond_init (&cond, NULL); + pthread_mutex_init (&mutex, NULL); + + playidx=0; + rc=pthread_create( &pth, NULL, _run_sound, 0 ); +} + +void SoundPlay( int pnr ) +{ + if ( sound_fd==-2) + return; + if ( playidx < 1 ) + play[ playidx ]=pnr; + playidx++; +} diff --git a/archive-sources/lemm/sounds.h b/archive-sources/lemm/sounds.h new file mode 100644 index 0000000..474859b --- /dev/null +++ b/archive-sources/lemm/sounds.h @@ -0,0 +1,2024 @@ +unsigned char snd_die[5708] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, + 0x01, 0x02, 0x02, 0x02, 0x00, 0xFF, 0xFE, 0xFE, 0xFD, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x04, 0x04, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0xFF, 0xFF, 0xFD, 0xFB, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, + 0x00, 0x02, 0x00, 0x02, 0x05, 0x04, 0x01, 0xFF, 0xFE, 0xFF, 0xFE, 0xFB, 0xFB, 0xFF, 0x00, 0x00, + 0x00, 0x01, 0x03, 0xFF, 0xFD, 0x03, 0x09, 0x07, 0x00, 0xFE, 0x00, 0x01, 0xFD, 0xF9, 0xFA, 0xFF, + 0x00, 0xFE, 0xFF, 0x01, 0x02, 0x00, 0x00, 0x05, 0x07, 0x05, 0x01, 0x00, 0x00, 0xFF, 0xFB, 0xF8, + 0xFA, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x02, 0x04, 0x06, 0x06, 0x03, 0x00, 0xFE, 0xFD, 0xFD, 0xFB, + 0xF9, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0xFF, 0x00, 0x07, 0x08, 0x01, 0xFC, 0xFD, 0x00, + 0xFD, 0xF9, 0xFB, 0x00, 0x02, 0x00, 0xFE, 0x01, 0x04, 0xFF, 0xFF, 0x08, 0x0C, 0x04, 0xFC, 0xFC, + 0x00, 0x00, 0xF8, 0xF6, 0xFC, 0x01, 0x00, 0xFE, 0x00, 0x05, 0x07, 0xFE, 0xF9, 0x04, 0x0F, 0x07, + 0xFB, 0xF9, 0x00, 0x03, 0xFA, 0xF3, 0xFA, 0x02, 0x02, 0xFD, 0xFD, 0x04, 0x09, 0x03, 0xF8, 0xF9, + 0x07, 0x0D, 0x04, 0xFD, 0xFE, 0x04, 0x02, 0xF9, 0xF5, 0xFB, 0x01, 0x00, 0xFA, 0xFD, 0x05, 0x07, + 0x02, 0xFC, 0xFC, 0x07, 0x0C, 0x02, 0xFA, 0xFD, 0x04, 0x02, 0xF7, 0xF5, 0xFE, 0x03, 0x00, 0xFA, + 0xFE, 0x06, 0x07, 0x00, 0xFA, 0x00, 0x0C, 0x09, 0xFC, 0xF9, 0x01, 0x05, 0xFC, 0xF4, 0xFA, 0x02, + 0x03, 0xFD, 0xFA, 0x02, 0x09, 0x01, 0xF8, 0xFF, 0x0B, 0x0C, 0x00, 0xFA, 0x00, 0x04, 0xFF, 0xF5, + 0xF6, 0x00, 0x03, 0xFF, 0xFA, 0x00, 0x08, 0x03, 0xFA, 0x00, 0x0D, 0x0C, 0xFF, 0xF7, 0xFE, 0x04, + 0xFF, 0xF4, 0xF6, 0x00, 0x05, 0xFF, 0xFA, 0x01, 0x08, 0x02, 0xFC, 0x00, 0x0B, 0x0A, 0x00, 0xFB, + 0xFE, 0x02, 0xFE, 0xF5, 0xF7, 0x00, 0x03, 0x00, 0xFC, 0x01, 0x08, 0x01, 0xFB, 0x03, 0x0D, 0x08, + 0xFD, 0xF9, 0xFF, 0x01, 0xFA, 0xF5, 0xFA, 0x02, 0x03, 0xFD, 0xFD, 0x04, 0x04, 0xFF, 0x03, 0x0A, + 0x08, 0x00, 0xFB, 0xFD, 0x00, 0xFE, 0xF8, 0xF8, 0xFE, 0x02, 0x00, 0xFF, 0x02, 0x04, 0x01, 0x00, + 0x04, 0x08, 0x05, 0x00, 0xFD, 0xFE, 0xFE, 0xFA, 0xF8, 0xFB, 0x00, 0x01, 0x00, 0x00, 0x03, 0x04, + 0x01, 0x00, 0x06, 0x08, 0x01, 0xFC, 0xFD, 0x00, 0xFE, 0xF8, 0xFA, 0xFF, 0x02, 0x00, 0xFE, 0x01, + 0x05, 0x00, 0xFC, 0x01, 0x09, 0x07, 0xFF, 0xFC, 0x00, 0x02, 0xFD, 0xF7, 0xF9, 0x00, 0x01, 0xFE, + 0xFE, 0x02, 0x06, 0x01, 0xFB, 0x01, 0x0C, 0x08, 0xFE, 0xFB, 0x00, 0x02, 0xFB, 0xF4, 0xFA, 0x02, + 0x02, 0xFD, 0xFD, 0x04, 0x07, 0x01, 0xFD, 0x01, 0x09, 0x06, 0xFD, 0xFB, 0x00, 0x02, 0xFC, 0xF6, + 0xFB, 0x01, 0x02, 0xFF, 0xFD, 0x03, 0x07, 0xFF, 0xFB, 0x05, 0x0D, 0x03, 0xFA, 0xFB, 0x01, 0x02, + 0xFB, 0xF6, 0xFD, 0x03, 0x00, 0xFC, 0xFE, 0x04, 0x07, 0x00, 0xFB, 0x04, 0x0D, 0x06, 0xFC, 0xFB, + 0x01, 0x03, 0xFA, 0xF5, 0xFC, 0x03, 0x01, 0xFC, 0xFD, 0x04, 0x06, 0x00, 0xFB, 0x00, 0x09, 0x07, + 0xFD, 0xFB, 0x00, 0x02, 0xFB, 0xF5, 0xFB, 0x02, 0x02, 0xFE, 0xFD, 0x03, 0x07, 0xFF, 0xFA, 0x02, + 0x0A, 0x05, 0xFD, 0xFC, 0x01, 0x02, 0xFC, 0xF7, 0xFC, 0x02, 0x01, 0xFD, 0xFE, 0x03, 0x06, 0x00, + 0xFA, 0x01, 0x0A, 0x06, 0xFD, 0xFC, 0x00, 0x01, 0xFA, 0xF6, 0xFC, 0x03, 0x02, 0xFD, 0xFE, 0x05, + 0x05, 0xFC, 0xFE, 0x09, 0x0B, 0x01, 0xFA, 0xFD, 0x03, 0x00, 0xF8, 0xF8, 0xFF, 0x02, 0xFF, 0xFC, + 0x01, 0x06, 0x03, 0xFF, 0x00, 0x07, 0x07, 0x00, 0xFC, 0xFF, 0x01, 0xFE, 0xF7, 0xF9, 0x00, 0x02, + 0x00, 0xFE, 0x01, 0x06, 0x01, 0xFC, 0x03, 0x0A, 0x06, 0xFD, 0xFA, 0x00, 0x01, 0xF9, 0xF6, 0xFD, + 0x02, 0x01, 0xFD, 0xFF, 0x06, 0x04, 0xFB, 0x00, 0x0A, 0x0A, 0x00, 0xFB, 0xFF, 0x02, 0xFE, 0xF6, + 0xF8, 0x00, 0x02, 0xFF, 0xFD, 0x02, 0x06, 0x03, 0xFD, 0x00, 0x09, 0x09, 0xFF, 0xFA, 0xFF, 0x01, + 0xFD, 0xF7, 0xFB, 0x01, 0x02, 0xFE, 0xFC, 0x03, 0x07, 0xFF, 0xFC, 0x07, 0x0D, 0x03, 0xFA, 0xFB, + 0x02, 0x01, 0xF8, 0xF5, 0xFD, 0x03, 0x00, 0xFC, 0x00, 0x06, 0x06, 0xFF, 0xFC, 0x04, 0x0B, 0x03, + 0xFA, 0xFC, 0x02, 0x00, 0xF8, 0xF7, 0xFF, 0x03, 0x00, 0xFC, 0xFF, 0x07, 0x04, 0xF9, 0xFD, 0x0B, + 0x0B, 0xFF, 0xFA, 0x00, 0x04, 0xFF, 0xF6, 0xF8, 0x00, 0x02, 0xFE, 0xFC, 0x01, 0x07, 0x03, 0xFC, + 0xFF, 0x09, 0x0A, 0x00, 0xFA, 0xFF, 0x03, 0xFD, 0xF5, 0xFA, 0x02, 0x02, 0xFE, 0xFC, 0x02, 0x08, + 0x00, 0xF9, 0x00, 0x0B, 0x08, 0xFE, 0xFC, 0x02, 0x03, 0xFC, 0xF6, 0xFB, 0x01, 0x00, 0xFD, 0xFE, + 0x03, 0x07, 0x00, 0xFA, 0x03, 0x0E, 0x08, 0xFC, 0xFA, 0x02, 0x03, 0xFB, 0xF4, 0xFB, 0x03, 0x00, + 0xFB, 0xFE, 0x05, 0x07, 0x00, 0xFA, 0x00, 0x0A, 0x09, 0xFE, 0xFB, 0x01, 0x03, 0xFB, 0xF5, 0xFB, + 0x02, 0x01, 0xFC, 0xFD, 0x04, 0x06, 0x01, 0xFC, 0xFF, 0x07, 0x09, 0x00, 0xFC, 0x00, 0x02, 0xFD, + 0xF7, 0xFA, 0x00, 0x01, 0xFE, 0xFE, 0x02, 0x06, 0x01, 0xFD, 0xFF, 0x05, 0x07, 0x01, 0xFD, 0x00, + 0x02, 0xFF, 0xF9, 0xFA, 0x00, 0x00, 0xFE, 0xFD, 0x00, 0x04, 0x02, 0xFE, 0xFF, 0x04, 0x06, 0x02, + 0xFE, 0x00, 0x02, 0x00, 0xFB, 0xFA, 0xFE, 0x00, 0xFF, 0xFD, 0x00, 0x03, 0x03, 0xFF, 0xFB, 0x01, + 0x09, 0x07, 0x00, 0xFF, 0x02, 0x01, 0xFC, 0xF8, 0xFC, 0x00, 0xFF, 0xFD, 0xFF, 0x02, 0x04, 0x01, + 0xFB, 0xFE, 0x09, 0x0A, 0x00, 0xFC, 0x00, 0x03, 0xFE, 0xF7, 0xF9, 0x00, 0x00, 0xFD, 0xFE, 0x02, + 0x05, 0x03, 0xFD, 0xFA, 0x03, 0x0B, 0x04, 0xFD, 0xFF, 0x02, 0x00, 0xFA, 0xF9, 0xFE, 0x00, 0xFE, + 0xFC, 0x00, 0x04, 0x04, 0x00, 0xFD, 0x00, 0x07, 0x06, 0x00, 0xFF, 0x01, 0x02, 0xFE, 0xF9, 0xFB, + 0xFF, 0xFF, 0xFD, 0xFE, 0x02, 0x03, 0x01, 0xFF, 0xFE, 0x02, 0x07, 0x04, 0xFF, 0x00, 0x01, 0x00, + 0xFB, 0xF9, 0xFD, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0x03, 0x00, 0xFF, 0x00, 0x03, 0x04, 0x02, 0x00, + 0x00, 0x01, 0x00, 0xFB, 0xFB, 0xFE, 0xFF, 0xFE, 0xFE, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x02, 0x00, 0x00, 0x00, 0xFE, 0xFA, 0xFB, 0xFE, 0x00, 0xFE, 0xFE, 0x01, 0x03, 0x02, 0x00, + 0xFF, 0x02, 0x08, 0x06, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0xF9, 0xFB, 0x00, 0x00, 0xFE, 0x00, 0x03, + 0x03, 0x01, 0xFF, 0xFE, 0x05, 0x09, 0x02, 0xFD, 0xFF, 0x01, 0x00, 0xFA, 0xF9, 0xFE, 0x00, 0xFF, + 0xFE, 0x01, 0x04, 0x03, 0x00, 0xFC, 0xFE, 0x07, 0x07, 0x00, 0xFE, 0x00, 0x01, 0xFD, 0xF9, 0xFB, + 0x00, 0xFF, 0xFD, 0xFE, 0x02, 0x04, 0x01, 0xFF, 0xFF, 0x03, 0x06, 0x03, 0x00, 0x00, 0x01, 0x00, + 0xFC, 0xFA, 0xFD, 0xFF, 0xFE, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x05, 0x04, 0x01, + 0xFF, 0x00, 0xFF, 0xFC, 0xFB, 0xFD, 0xFF, 0x00, 0xFF, 0x00, 0x02, 0x02, 0x01, 0x00, 0xFE, 0x02, + 0x08, 0x04, 0xFF, 0xFF, 0x01, 0x00, 0xFB, 0xF9, 0xFD, 0x00, 0xFF, 0xFD, 0x00, 0x03, 0x03, 0x00, + 0xFD, 0xFF, 0x07, 0x09, 0x01, 0xFE, 0x00, 0x02, 0xFE, 0xF9, 0xFA, 0xFF, 0xFF, 0xFD, 0xFE, 0x01, + 0x04, 0x02, 0x00, 0xFE, 0x00, 0x05, 0x03, 0x00, 0x00, 0x01, 0x00, 0xFD, 0xFB, 0xFD, 0xFE, 0xFE, + 0xFE, 0xFF, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x02, 0x00, 0xFF, 0x00, 0xFD, 0xFA, + 0xFB, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0xFC, 0xFF, 0x06, 0x06, 0x00, 0x00, 0x01, + 0x01, 0xFD, 0xFA, 0xFC, 0xFF, 0xFE, 0xFD, 0xFE, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01, 0x05, 0x04, + 0x01, 0x00, 0x00, 0x00, 0xFC, 0xFA, 0xFC, 0xFE, 0xFF, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x00, 0xFF, + 0x00, 0x06, 0x06, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0xFA, 0xFB, 0xFF, 0x00, 0xFE, 0xFF, 0x02, 0x02, + 0x01, 0x00, 0xFE, 0x02, 0x07, 0x03, 0xFF, 0x00, 0x01, 0x00, 0xFC, 0xFA, 0xFE, 0x00, 0xFF, 0xFE, + 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFC, 0xFF, + 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x04, 0x00, 0x00, 0x00, 0xFF, + 0xFB, 0xFB, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x02, 0x02, 0x00, 0xFE, 0xFE, 0x05, 0x07, 0x01, 0xFE, + 0x00, 0x01, 0xFE, 0xFA, 0xFB, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0x03, 0x02, 0x00, 0xFD, 0x01, 0x08, + 0x04, 0xFF, 0x00, 0x01, 0x00, 0xFC, 0xFA, 0xFE, 0x00, 0xFE, 0xFD, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x01, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFB, 0xFC, 0xFF, 0xFF, 0xFE, 0xFE, 0x01, 0x03, + 0x00, 0xFF, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0xFD, 0xFA, 0xFC, 0xFE, 0xFE, 0xFE, + 0xFF, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0xFF, 0xFF, 0x00, 0xFE, 0xFA, 0xFA, + 0xFE, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x00, 0xFC, 0xFF, 0x07, 0x07, 0x00, 0xFF, 0x01, 0x01, + 0xFD, 0xF9, 0xFB, 0xFF, 0xFF, 0xFD, 0xFE, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x02, + 0x00, 0x00, 0x00, 0xFD, 0xFA, 0xFC, 0xFF, 0xFF, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0xFD, 0xFD, + 0x06, 0x09, 0x03, 0x00, 0x00, 0x01, 0xFE, 0xF9, 0xFA, 0xFE, 0xFF, 0xFE, 0xFE, 0x01, 0x04, 0x01, + 0x00, 0x00, 0xFF, 0x01, 0x07, 0x05, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0xF9, 0xFC, 0x00, 0x00, 0xFF, + 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0xFD, 0xFB, 0xFD, + 0xFF, 0xFF, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0x04, 0x06, 0x02, 0x00, 0x01, 0x01, + 0xFF, 0xFA, 0xFB, 0xFE, 0xFF, 0xFE, 0xFE, 0x01, 0x03, 0x01, 0x00, 0x00, 0xFE, 0x01, 0x08, 0x06, + 0x00, 0xFF, 0x00, 0x00, 0xFC, 0xF9, 0xFC, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x03, 0x00, 0x00, 0xFF, + 0x00, 0x03, 0x06, 0x02, 0x00, 0x00, 0x00, 0xFD, 0xFA, 0xFB, 0xFE, 0xFE, 0xFE, 0x00, 0x03, 0x03, + 0x00, 0x00, 0xFE, 0xFD, 0x03, 0x08, 0x05, 0x01, 0x00, 0x01, 0xFF, 0xF9, 0xF9, 0xFD, 0xFF, 0xFE, + 0xFE, 0x01, 0x05, 0x02, 0x00, 0x00, 0xFC, 0xFF, 0x09, 0x09, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0xF7, + 0xFA, 0xFF, 0x00, 0xFF, 0xFF, 0x04, 0x05, 0x00, 0x00, 0xFF, 0xFC, 0x02, 0x0A, 0x06, 0x00, 0xFE, + 0x00, 0x00, 0xFB, 0xF8, 0xFD, 0x00, 0x00, 0xFE, 0x00, 0x04, 0x03, 0xFF, 0x00, 0xFE, 0xFC, 0x05, + 0x0B, 0x04, 0xFF, 0x00, 0x02, 0x00, 0xF9, 0xF8, 0xFE, 0x00, 0xFE, 0xFE, 0x01, 0x04, 0x02, 0x00, + 0x00, 0xFE, 0xFE, 0x06, 0x09, 0x02, 0xFE, 0x00, 0x01, 0xFE, 0xF8, 0xFA, 0xFF, 0x00, 0xFE, 0xFF, + 0x02, 0x04, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x07, 0x07, 0x00, 0xFF, 0x01, 0x01, 0xFC, 0xF8, 0xFB, + 0xFF, 0xFE, 0xFE, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x08, 0x05, 0x00, 0x00, 0x01, + 0x00, 0xFB, 0xF9, 0xFD, 0xFF, 0xFE, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x01, 0x00, 0xFD, 0x02, 0x08, + 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xF9, 0xFA, 0xFE, 0xFE, 0xFD, 0xFF, 0x02, 0x04, 0x01, 0x00, 0x02, + 0xFF, 0xFD, 0x04, 0x08, 0x03, 0x00, 0x00, 0x01, 0xFE, 0xF9, 0xFA, 0xFE, 0xFE, 0xFE, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x01, 0xFE, 0xFE, 0x06, 0x07, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0xF9, 0xFB, 0xFF, + 0xFF, 0xFE, 0xFF, 0x02, 0x03, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x08, 0x07, 0x00, 0xFD, 0x00, 0x02, + 0xFD, 0xF8, 0xFB, 0x00, 0xFF, 0xFE, 0xFF, 0x03, 0x04, 0x00, 0x01, 0x00, 0xFA, 0x00, 0x0A, 0x06, + 0xFE, 0xFD, 0x00, 0x02, 0xFC, 0xF8, 0xFD, 0x00, 0xFF, 0xFD, 0xFF, 0x04, 0x04, 0x00, 0x00, 0xFF, + 0xFC, 0x02, 0x09, 0x05, 0xFF, 0xFF, 0x01, 0x00, 0xFA, 0xF9, 0xFE, 0x01, 0xFF, 0xFD, 0x00, 0x03, + 0x02, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x04, 0x06, 0x01, 0x00, 0x01, 0x00, 0xFB, 0xF9, 0xFD, 0x00, + 0xFE, 0xFE, 0x01, 0x04, 0x03, 0xFF, 0xFF, 0x01, 0xFE, 0xFC, 0x04, 0x08, 0x03, 0x00, 0x00, 0x00, + 0xFC, 0xF8, 0xFB, 0xFF, 0xFE, 0xFF, 0x01, 0x04, 0x04, 0x00, 0x00, 0x01, 0xFC, 0xFC, 0x07, 0x0A, + 0x01, 0xFD, 0x00, 0x04, 0x00, 0xF9, 0xFA, 0x00, 0xFF, 0xFD, 0xFE, 0x03, 0x05, 0x01, 0x00, 0x00, + 0xFC, 0xFB, 0x05, 0x0B, 0x04, 0xFD, 0x00, 0x02, 0xFE, 0xF7, 0xF9, 0x00, 0x01, 0xFD, 0xFD, 0x03, + 0x05, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x07, 0x06, 0x01, 0x01, 0x01, 0xFE, 0xF6, 0xF7, 0xFE, + 0x00, 0xFE, 0x00, 0x04, 0x06, 0x01, 0xFD, 0x00, 0x00, 0xF9, 0xFF, 0x0A, 0x07, 0xFF, 0xFF, 0x04, + 0x04, 0xFB, 0xF6, 0xFB, 0xFE, 0xFC, 0xFD, 0x02, 0x07, 0x04, 0x00, 0x01, 0xFF, 0xF7, 0xFE, 0x0B, + 0x09, 0xFF, 0xFC, 0x02, 0x02, 0xFA, 0xF7, 0xFD, 0x00, 0xFE, 0xFC, 0x00, 0x05, 0x04, 0x00, 0x00, + 0xFF, 0xF9, 0xFD, 0x09, 0x0C, 0x03, 0xFF, 0x02, 0x00, 0xF7, 0xF4, 0xFC, 0x02, 0x00, 0xFD, 0x01, + 0x06, 0x04, 0xFE, 0xFE, 0x02, 0xFD, 0xF9, 0x05, 0x0D, 0x04, 0xFE, 0x02, 0x06, 0xFF, 0xF4, 0xF6, + 0xFE, 0xFF, 0xFD, 0x00, 0x07, 0x07, 0x00, 0xFF, 0x01, 0xFB, 0xF7, 0x03, 0x10, 0x08, 0xFB, 0xFD, + 0x04, 0x00, 0xF8, 0xF8, 0x00, 0x01, 0xFB, 0xFC, 0x03, 0x07, 0x02, 0xFF, 0x01, 0xFE, 0xF6, 0xFC, + 0x0B, 0x0C, 0x01, 0x00, 0x05, 0x01, 0xF5, 0xF1, 0xFA, 0x01, 0xFF, 0xFE, 0x03, 0x08, 0x03, 0xFC, + 0x00, 0x02, 0xFA, 0xF7, 0x05, 0x0F, 0x04, 0xFB, 0x00, 0x06, 0xFE, 0xF5, 0xF9, 0x01, 0x00, 0xFA, + 0xFE, 0x07, 0x07, 0x00, 0xFE, 0x01, 0xFE, 0xF5, 0xFE, 0x0D, 0x09, 0xFE, 0x00, 0x06, 0x03, 0xF7, + 0xF2, 0xFC, 0x00, 0xFC, 0xFE, 0x05, 0x09, 0x04, 0xFD, 0x00, 0x01, 0xF8, 0xF6, 0x05, 0x0E, 0x04, + 0xFE, 0x04, 0x07, 0xFD, 0xF3, 0xF6, 0xFF, 0x00, 0xFD, 0x01, 0x09, 0x07, 0xFF, 0xFD, 0x01, 0xFF, + 0xF7, 0xFD, 0x0A, 0x0A, 0x00, 0xFF, 0x05, 0x03, 0xF8, 0xF3, 0xFB, 0x01, 0xFF, 0xFD, 0x04, 0x09, + 0x04, 0xFD, 0xFE, 0x01, 0xFE, 0xF8, 0xFE, 0x09, 0x09, 0x00, 0x00, 0x04, 0x00, 0xF7, 0xF5, 0xFD, + 0x00, 0xFE, 0xFE, 0x04, 0x08, 0x02, 0xFE, 0x00, 0x01, 0xFD, 0xF9, 0xFE, 0x07, 0x09, 0x03, 0x00, + 0x03, 0x01, 0xF9, 0xF7, 0xFC, 0x00, 0xFE, 0xFF, 0x03, 0x07, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFA, + 0xFB, 0x02, 0x07, 0x05, 0x02, 0x01, 0x01, 0xFE, 0xF9, 0xF9, 0xFD, 0xFF, 0x00, 0x01, 0x04, 0x04, + 0x02, 0x00, 0x00, 0xFE, 0xFD, 0xFC, 0xFD, 0x01, 0x08, 0x09, 0x04, 0x00, 0xFF, 0xFC, 0xF8, 0xF9, + 0xFD, 0x00, 0x00, 0x02, 0x06, 0x06, 0x02, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xFF, 0x02, 0x06, 0x09, + 0x06, 0x00, 0xFE, 0xFD, 0xFB, 0xF9, 0xFA, 0xFE, 0x00, 0x03, 0x04, 0x04, 0x03, 0x00, 0xFE, 0xFD, + 0xFC, 0xFD, 0xFE, 0x00, 0x03, 0x09, 0x09, 0x02, 0xFF, 0xFF, 0xFD, 0xF9, 0xF9, 0xFD, 0x00, 0x00, + 0x03, 0x07, 0x06, 0x00, 0xFC, 0xFC, 0xFE, 0xFD, 0xFD, 0x00, 0x02, 0x05, 0x07, 0x05, 0x00, 0xFC, + 0xFC, 0xFD, 0xFB, 0xFB, 0x00, 0x03, 0x04, 0x03, 0x02, 0x02, 0x00, 0xFD, 0xFC, 0xFC, 0xFE, 0x00, + 0x00, 0x03, 0x08, 0x07, 0x01, 0xFD, 0xFD, 0xFD, 0xFA, 0xF9, 0xFD, 0x03, 0x04, 0x03, 0x03, 0x03, + 0x00, 0xFD, 0xFB, 0xFC, 0xFE, 0xFE, 0x00, 0x04, 0x04, 0x04, 0x05, 0x03, 0xFD, 0xF9, 0xFA, 0xFC, + 0xFD, 0xFE, 0x01, 0x05, 0x05, 0x02, 0x01, 0x00, 0xFD, 0xFB, 0xFC, 0xFF, 0x00, 0x00, 0x02, 0x05, + 0x05, 0x04, 0x03, 0x00, 0xFB, 0xF9, 0xFB, 0xFD, 0xFF, 0x01, 0x03, 0x03, 0x02, 0x01, 0x00, 0xFD, + 0xFB, 0xFC, 0xFF, 0x00, 0x01, 0x02, 0x04, 0x03, 0x01, 0x02, 0x01, 0xFD, 0xF9, 0xFC, 0xFF, 0x00, + 0x00, 0x01, 0x04, 0x03, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x01, 0x01, 0x00, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x02, 0x00, 0xFF, 0x00, 0xFF, + 0xFD, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0xFD, 0xFC, 0xFE, 0xFF, + 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xFF, + 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0xFF, 0x01, + 0xFF, 0xFB, 0xFD, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x02, + 0x01, 0x00, 0x00, 0x01, 0x01, 0xFF, 0x00, 0x04, 0x01, 0xFD, 0x00, 0x03, 0xFF, 0xFA, 0xFE, 0x03, + 0x00, 0xFC, 0x00, 0x04, 0x00, 0xFD, 0xFF, 0x02, 0x00, 0xFC, 0xFF, 0x02, 0x01, 0x00, 0x01, 0x02, + 0x00, 0xFE, 0x01, 0x07, 0x01, 0xFA, 0xFF, 0x05, 0xFF, 0xF6, 0xFC, 0x04, 0x00, 0xFA, 0xFF, 0x07, + 0x02, 0xFB, 0xFD, 0x02, 0x00, 0xFC, 0x00, 0x03, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFD, 0xFD, 0x03, + 0x07, 0x02, 0xFD, 0x00, 0x03, 0xFE, 0xF7, 0xFB, 0x02, 0x01, 0xFE, 0x01, 0x06, 0x02, 0xFB, 0xFC, + 0x00, 0xFF, 0xFC, 0x00, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0xFF, 0x01, 0x01, 0xFD, 0xFB, 0xFF, + 0x04, 0x03, 0xFE, 0xFE, 0x03, 0x00, 0xFA, 0xFD, 0x02, 0x00, 0xFD, 0x00, 0x03, 0x00, 0xFD, 0xFF, + 0x01, 0xFF, 0xFC, 0x00, 0x03, 0x01, 0x00, 0x01, 0x04, 0x05, 0x01, 0xFE, 0xFD, 0xFC, 0xFD, 0x02, + 0x06, 0x00, 0xFE, 0x02, 0x00, 0xFA, 0xFB, 0x00, 0x01, 0xFF, 0x00, 0x04, 0x01, 0xFE, 0xFE, 0xFF, + 0xFF, 0xFE, 0xFF, 0x03, 0x03, 0x01, 0x02, 0x00, 0xFD, 0xF8, 0xF7, 0x05, 0x13, 0x09, 0xFF, 0x01, + 0x02, 0xFA, 0xF4, 0xFD, 0x04, 0x01, 0x00, 0x08, 0x07, 0xFE, 0xFA, 0xFF, 0x00, 0xFB, 0xFD, 0x05, + 0x07, 0x00, 0xFE, 0x00, 0xFE, 0xFA, 0xFB, 0x02, 0x06, 0x02, 0x00, 0x02, 0x01, 0xFB, 0xFA, 0x00, + 0x01, 0xFF, 0x00, 0x04, 0x03, 0xFE, 0xFE, 0x00, 0xFF, 0xFD, 0x00, 0x03, 0x02, 0x00, 0x00, 0x01, + 0xFD, 0xF7, 0xFB, 0x09, 0x0E, 0x04, 0xFF, 0x00, 0xFE, 0xF3, 0xF5, 0x01, 0x04, 0x00, 0x03, 0x09, + 0x03, 0xFA, 0xFA, 0xFF, 0xFE, 0xFD, 0x01, 0x05, 0x02, 0xFE, 0xFF, 0x00, 0xFC, 0xFC, 0x01, 0x05, + 0x02, 0xFF, 0x00, 0x01, 0xFD, 0xFA, 0x00, 0x02, 0x00, 0x00, 0x03, 0x02, 0xFE, 0xFD, 0x00, 0x00, + 0xFD, 0xFF, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xF7, 0x00, 0x10, 0x0B, 0xFD, 0xFE, 0x02, + 0xF8, 0xF1, 0xFB, 0x05, 0x02, 0x00, 0x07, 0x08, 0xFD, 0xF7, 0xFD, 0x00, 0xFC, 0xFF, 0x06, 0x05, + 0xFE, 0xFE, 0x01, 0xFE, 0xFA, 0xFF, 0x04, 0x03, 0x01, 0x01, 0x01, 0xFE, 0xFC, 0xFE, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x02, 0x01, 0x01, 0x03, 0x02, 0xFE, 0xFC, + 0xFE, 0x00, 0xFE, 0x00, 0x06, 0x07, 0x00, 0xFE, 0x00, 0xFE, 0xFA, 0xFE, 0x03, 0x02, 0xFF, 0x01, + 0x03, 0xFF, 0xFB, 0xFE, 0x01, 0x00, 0x00, 0x03, 0x04, 0x01, 0x00, 0xFF, 0xFD, 0xFC, 0xFE, 0x00, + 0x01, 0x01, 0x05, 0x05, 0x00, 0xFB, 0xFD, 0xFF, 0xFD, 0xFE, 0x04, 0x05, 0x01, 0x00, 0x00, 0xFD, + 0xFA, 0xFE, 0x01, 0x00, 0x01, 0x04, 0x04, 0x00, 0xFF, 0x02, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0xFE, + 0x00, 0x03, 0x03, 0x00, 0xFF, 0xFE, 0xFD, 0xFD, 0xFF, 0x01, 0x02, 0x02, 0x01, 0x00, 0xFE, 0xFD, + 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFD, 0xFC, 0xFF, 0x00, 0xFE, 0x00, + 0x02, 0x04, 0x03, 0xFF, 0xFD, 0xFF, 0xFE, 0xFD, 0x00, 0x03, 0x01, 0x00, 0x01, 0x00, 0xFD, 0xFD, + 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x01, 0x00, + 0xFE, 0xFC, 0xFB, 0xFE, 0x03, 0x08, 0x05, 0xFE, 0xFE, 0x00, 0xFA, 0xF8, 0x00, 0x04, 0x00, 0x00, + 0x05, 0x01, 0xFA, 0xFA, 0xFF, 0xFE, 0xFE, 0x03, 0x05, 0x00, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0x00, + 0xFE, 0xFD, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x03, 0x02, 0x00, 0xFE, 0xFE, 0xFF, 0xFE, 0xFE, 0x02, + 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x02, 0x00, 0xFF, 0x00, 0x01, 0x02, + 0x02, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x02, 0x00, 0xFB, 0xFC, 0x00, + 0x00, 0xFF, 0x02, 0x03, 0x00, 0xFE, 0x00, 0xFF, 0xFD, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x00, + 0x00, 0x00, 0xFD, 0xFB, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x01, 0xFF, 0x00, 0x02, 0x00, 0xFC, 0xFD, + 0x01, 0x00, 0x00, 0x01, 0x02, 0xFF, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, + 0x01, 0xFF, 0xFD, 0xFE, 0xFE, 0xFE, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x01, 0x02, 0xFE, + 0xFD, 0x01, 0x01, 0xFF, 0x00, 0x02, 0x00, 0xFD, 0xFF, 0x01, 0x00, 0xFF, 0x02, 0x02, 0x00, 0x00, + 0x03, 0x01, 0xFC, 0xFD, 0x00, 0xFF, 0xFD, 0x02, 0x04, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x04, + 0x02, 0xFD, 0x00, 0x02, 0xFF, 0xFE, 0x01, 0x02, 0xFF, 0xFF, 0x01, 0x00, 0xFE, 0x00, 0x02, 0x00, + 0x00, 0x02, 0x02, 0xFD, 0xFC, 0x00, 0xFF, 0xFD, 0x00, 0x03, 0x00, 0xFF, 0x00, 0x00, 0xFD, 0xFF, + 0x03, 0x04, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0xFF, 0x01, 0x01, 0xFE, 0xFD, 0x00, + 0x00, 0xFF, 0x01, 0x03, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0xFE, 0x02, 0x01, 0xFF, + 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0xFF, 0x00, 0x04, 0x01, 0xFD, 0xFE, + 0xFF, 0xFD, 0xFE, 0x01, 0x02, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0x01, 0x01, 0x00, 0xFE, + 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, + 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x01, 0x00, + 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x02, + 0x05, 0x02, 0xFE, 0xFD, 0xFC, 0xFB, 0xFE, 0x01, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xFE, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x00, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x03, 0x05, 0x03, 0x00, + 0xFD, 0xFB, 0xFB, 0xFD, 0x00, 0x02, 0x02, 0x01, 0x00, 0xFE, 0xFE, 0xFF, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0xFD, 0xFF, 0x01, 0x00, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x00, 0xFC, 0xFC, 0xFE, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0xFD, 0xFE, 0x00, 0xFF, 0x00, 0x02, 0x01, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x02, + 0xFF, 0xFC, 0xFB, 0xFD, 0xFE, 0x00, 0x03, 0x02, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x01, 0x01, 0x01, + 0x02, 0x01, 0xFE, 0xFC, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x00, 0xFE, 0xFF, 0x00, 0xFE, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x01, 0xFF, 0xFB, 0xFC, 0xFE, 0x00, 0x01, + 0x03, 0x01, 0x00, 0xFF, 0xFE, 0xFE, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFE, 0xFD, 0xFF, 0x01, + 0x00, 0x01, 0x02, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0xFD, 0xFD, 0xFE, 0xFD, 0x00, 0x03, 0x01, 0x00, 0xFF, + 0xFE, 0xFD, 0xFF, 0x02, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x02, 0x06, 0x03, 0xF9, 0xF9, 0xFE, 0xFB, 0xFE, 0x08, 0x08, 0x00, 0xFD, 0xFD, 0xF9, 0xFC, + 0x04, 0x05, 0x00, 0x01, 0x00, 0xFA, 0xF9, 0x00, 0x02, 0x00, 0x03, 0x03, 0xFD, 0xFA, 0xFE, 0x00, + 0x00, 0x02, 0x04, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0xFD, 0xFB, 0xFE, + 0x00, 0x01, 0x02, 0x01, 0xFF, 0xFD, 0xFD, 0xFF, 0x00, 0x02, 0x03, 0x01, 0xFF, 0xFE, 0xFE, 0xFF, + 0x00, 0x02, 0x03, 0x00, 0xFF, 0xFE, 0xFE, 0x00, 0x01, 0x02, 0x02, 0x00, 0xFF, 0xFE, 0xFE, 0x00, + 0x01, 0x02, 0x02, 0x00, 0xFE, 0xFD, 0xFE, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0xFF, 0x03, + 0x0A, 0x05, 0xFC, 0xFB, 0xFD, 0xFC, 0x00, 0x04, 0x04, 0x00, 0xFF, 0xFE, 0xFC, 0xFD, 0x01, 0x04, + 0x02, 0x01, 0x00, 0xFC, 0xFA, 0x00, 0x02, 0x01, 0x03, 0x03, 0xFE, 0xFB, 0xFF, 0x00, 0x00, 0x03, + 0x04, 0x00, 0xFC, 0xFD, 0xFF, 0xFF, 0x02, 0x05, 0x03, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0xFE, 0xFA, 0xFD, 0x06, 0x08, 0x05, + 0x08, 0x01, 0xF4, 0xFA, 0x03, 0x02, 0x0C, 0x10, 0xFE, 0xF1, 0xF6, 0xFC, 0x00, 0x07, 0x0B, 0x06, + 0xF9, 0xF6, 0xFA, 0xFC, 0x03, 0x0C, 0x07, 0xFE, 0xFA, 0xF9, 0xFA, 0x00, 0x08, 0x09, 0x02, 0xFE, + 0xFB, 0xFA, 0xFD, 0x03, 0x07, 0x04, 0x00, 0xFD, 0xFB, 0xFC, 0x00, 0x05, 0x05, 0x01, 0xFF, 0xFC, + 0xFB, 0xFF, 0x03, 0x04, 0x02, 0x00, 0xFC, 0xFA, 0xFD, 0x01, 0x06, 0x06, 0x05, 0x01, 0xFB, 0xF9, + 0xFD, 0x02, 0x03, 0x04, 0x02, 0xFE, 0xFA, 0xFC, 0x00, 0x02, 0x04, 0x03, 0xFF, 0xFC, 0xFC, 0xFF, + 0x01, 0x04, 0x04, 0x00, 0xFB, 0xFC, 0xFF, 0x00, 0x02, 0x04, 0x01, 0xFD, 0xFD, 0xFE, 0x00, 0x01, + 0x03, 0x02, 0xFF, 0xFD, 0xFE, 0xFE, 0x00, 0x03, 0x03, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x02, 0x02, 0x02, 0x01, 0x00, 0xFE, 0xFC, 0xFE, 0x01, 0x01, 0x01, 0x01, 0xFF, + 0xFE, 0xFE, 0x00, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFE, + 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFB, 0xFC, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFE, + 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x00, 0xFE, 0xFE, 0x01, 0x03, 0x01, 0x01, 0x00, 0xFE, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFF, 0xFD, 0xFC, 0xFD, 0x00, 0x02, 0x01, 0x00, + 0xFE, 0xFD, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFE, + 0x00, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFD, + 0x00, 0x04, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x02, + 0x01, 0x01, 0x00, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x01, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0xFE, 0xFD, 0x02, 0x02, 0x02, + 0x02, 0xFB, 0xFB, 0x00, 0x00, 0x04, 0x04, 0xFF, 0x00, 0xFE, 0xFE, 0x04, 0x04, 0x00, 0xFE, 0xFB, + 0xFC, 0x00, 0x02, 0x04, 0x01, 0xFE, 0xFC, 0xFD, 0x00, 0x02, 0x02, 0x00, 0xFE, 0xFD, 0xFE, 0x00, + 0x02, 0x02, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x01, + 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0x02, 0xFC, 0xFC, 0x06, 0x05, 0xFF, 0xFF, 0xFC, 0xFB, 0x00, + 0x04, 0x05, 0x02, 0xFE, 0xFC, 0xFE, 0x02, 0x05, 0x03, 0x00, 0xFC, 0xFB, 0xFF, 0x02, 0x03, 0x02, + 0x00, 0xFC, 0xFD, 0xFF, 0x01, 0x03, 0x01, 0xFF, 0xFD, 0xFD, 0x00, 0x02, 0x02, 0x01, 0xFF, 0xFE, + 0xFE, 0x00, 0x01, 0x02, 0x00, 0xFF, 0xFE, 0xFE, 0x00, 0x02, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x01, 0x02, 0x00, 0x00, 0xFA, 0xFC, 0x0C, 0x08, 0xF8, 0xFB, 0xFD, 0xFE, 0x04, 0x02, 0x03, 0x04, + 0xFA, 0xFA, 0x00, 0x01, 0x05, 0x02, 0xFC, 0xFB, 0xFC, 0x00, 0x04, 0x02, 0x01, 0xFF, 0xFC, 0xFE, + 0x00, 0x02, 0x03, 0x00, 0xFF, 0xFE, 0xFE, 0x00, 0x02, 0x02, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x02, + 0x01, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0xFD, + 0xFA, 0x00, 0x04, 0x04, 0x05, 0xFF, 0xF4, 0xF9, 0x07, 0x08, 0x04, 0x00, 0xFB, 0xFC, 0x00, 0x00, + 0x02, 0x01, 0xFF, 0xFE, 0xFD, 0xFF, 0x01, 0x02, 0x01, 0xFF, 0xFC, 0xFE, 0x00, 0x02, 0x02, 0x00, + 0xFE, 0xFD, 0xFF, 0x00, 0x02, 0x02, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFE, 0xFF, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x01, 0x00, 0x03, 0xFE, 0xF8, 0xFF, 0x00, 0x06, + 0x09, 0xF9, 0xF8, 0xFF, 0xFA, 0x03, 0x09, 0x03, 0x03, 0xFC, 0xF7, 0x01, 0x04, 0x05, 0x04, 0xFB, + 0xFA, 0xFD, 0x00, 0x05, 0x04, 0x00, 0xFE, 0xFA, 0xFD, 0x01, 0x03, 0x04, 0x00, 0xFD, 0xFC, 0xFD, + 0x01, 0x04, 0x02, 0x00, 0xFD, 0xFD, 0xFF, 0x01, 0x03, 0x02, 0x00, 0xFE, 0xFD, 0xFF, 0x01, 0x02, + 0x02, 0x00, 0xFE, 0xFE, 0x00, 0x01, 0x02, 0x01, 0xFF, 0xFD, 0xFF, 0x01, 0x01, 0x01, 0xFD, 0xFD, + 0x02, 0xFF, 0xFD, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x02, + 0x00, 0xFE, 0xFF, 0xFE, 0x00, 0x04, 0x03, 0x00, 0xFF, 0xFE, 0x00, 0x02, 0x01, 0x01, 0x00, 0xFE, + 0xFF, 0xFF, 0x00, 0x02, 0x00, 0xFF, 0xFE, 0xFE, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x03, + 0x03, 0xFD, 0x00, 0x00, 0xFC, 0x04, 0x01, 0xFE, 0x07, 0x00, 0xF8, 0x00, 0xFF, 0x00, 0x06, 0x01, + 0x01, 0x00, 0xFC, 0x01, 0x01, 0x00, 0x01, 0xFC, 0xFD, 0x00, 0xFF, 0x02, 0x01, 0xFE, 0x00, 0xFE, + 0xFF, 0x01, 0x00, 0x01, 0x00, 0xFD, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x04, 0x01, 0x00, 0x01, + 0xFE, 0x00, 0x01, 0x00, 0x03, 0x01, 0xFE, 0x01, 0xFD, 0xFA, 0x03, 0x01, 0xFC, 0x01, 0x01, 0x00, + 0x00, 0xFF, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x04, + 0x03, 0x00, 0xFE, 0xFE, 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFE, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFB, 0x00, 0x00, 0xFC, 0x08, 0x03, + 0xFA, 0x03, 0xFC, 0xF8, 0x04, 0x03, 0x05, 0x04, 0xFB, 0xFE, 0x00, 0xFF, 0x04, 0x00, 0x00, 0x00, + 0xFB, 0xFE, 0x01, 0x00, 0x03, 0x00, 0xFC, 0xFF, 0xFE, 0x01, 0x03, 0x00, 0x00, 0xFF, 0xFD, 0x01, + 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFD, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0xFF, 0xFF, 0xFD, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x01, 0x00, 0x01, 0xFE, 0xFF, + 0x00, 0xFE, 0x00, 0x00, 0xFF, 0x03, 0x00, 0xFD, 0x00, 0xFE, 0x03, 0x05, 0x00, 0x00, 0xFD, 0xFE, + 0x01, 0xFE, 0x06, 0x06, 0xF5, 0xFC, 0x03, 0x00, 0x06, 0x03, 0xFF, 0x02, 0xFE, 0xFE, 0x01, 0xFF, + 0x02, 0x01, 0xFF, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x00, 0xFD, 0xFF, 0x00, 0xFF, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xFE, 0x01, 0x04, 0xFF, 0x00, 0x00, 0xFD, 0x00, 0x03, 0x00, 0x00, 0xFD, 0xFD, + 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0xFE, 0xFD, 0x02, 0x01, 0x01, 0x00, 0xFD, 0xFF, 0x00, 0x00, + 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0x01, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x02, + 0xFF, 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0x04, 0x03, 0x00, 0x07, 0xFF, 0xF7, 0x03, 0xFF, 0xFE, 0x06, + 0x00, 0x00, 0x00, 0xF9, 0x01, 0x03, 0x01, 0x04, 0xFE, 0xFC, 0xFE, 0xFD, 0x03, 0x04, 0x00, 0x00, + 0xFB, 0xFD, 0x02, 0x00, 0x03, 0x00, 0xFD, 0xFF, 0xFE, 0x00, 0x03, 0x00, 0x00, 0xFF, 0xFD, 0x00, + 0x00, 0x01, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x01, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x04, 0x03, 0xFE, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xFE, 0xFF, 0xFE, 0x00, 0x03, 0x00, 0x01, 0xFE, 0xFA, 0xFF, 0x01, 0x02, 0x05, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x03, 0x04, 0x00, + 0xFA, 0xFA, 0xFE, 0x00, 0x03, 0x04, 0x00, 0xFD, 0xFB, 0xFC, 0x00, 0x00, + } ; + +unsigned char snd_door[5360] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x0A, + 0x08, 0xFE, 0xF7, 0x00, 0x0C, 0x04, 0x00, 0x04, 0xFC, 0xFC, 0x06, 0x00, 0xF8, 0xFA, 0x00, 0x01, + 0xF7, 0xF4, 0xFD, 0x00, 0x0A, 0x0A, 0xFC, 0xFD, 0x00, 0xF9, 0xFB, 0x0B, 0x17, 0x00, 0xE4, 0xFB, + 0x12, 0x01, 0x05, 0x16, 0x01, 0xED, 0xF1, 0xFC, 0x0B, 0x14, 0x02, 0xF1, 0xEF, 0xEA, 0xF8, 0x13, + 0x0F, 0x00, 0xFB, 0xF7, 0x09, 0x14, 0x00, 0x01, 0x07, 0xFB, 0x01, 0x06, 0xF9, 0xFE, 0x02, 0xFD, + 0xFD, 0xF8, 0xF4, 0xFB, 0x06, 0x0C, 0x00, 0xF4, 0xFE, 0x05, 0x04, 0x06, 0x01, 0x00, 0x05, 0xF4, + 0xEF, 0x12, 0x1E, 0x05, 0xF9, 0xF1, 0xF0, 0x00, 0x06, 0x0D, 0x17, 0x00, 0xEB, 0xF0, 0x00, 0x10, + 0x08, 0xFB, 0xFA, 0xE6, 0xE8, 0x0A, 0x0D, 0x03, 0x00, 0xF8, 0x09, 0x0F, 0xFC, 0x02, 0x0A, 0x01, + 0x02, 0x03, 0x00, 0xFC, 0xF7, 0x00, 0x03, 0xF7, 0xEF, 0xF5, 0x02, 0x0E, 0x05, 0xF7, 0xFF, 0x09, + 0xF5, 0xF2, 0x1D, 0x26, 0x00, 0xF1, 0xF2, 0xF8, 0x01, 0x00, 0x0F, 0x18, 0xFA, 0xE0, 0xE9, 0x0E, + 0x22, 0x05, 0xF8, 0xF5, 0xDE, 0xF4, 0x12, 0x08, 0x08, 0x00, 0xF2, 0x08, 0x0D, 0x00, 0x02, 0x00, + 0x02, 0x05, 0xFC, 0x00, 0x00, 0xF9, 0x00, 0x00, 0xF8, 0xF4, 0xF4, 0xFF, 0x0A, 0x06, 0xFB, 0xFA, + 0x01, 0x08, 0x0A, 0x00, 0xF7, 0x04, 0x09, 0x0A, 0x10, 0xF0, 0xE2, 0x0A, 0x0C, 0xFD, 0x10, 0x0A, + 0xF2, 0xF3, 0x00, 0x0A, 0x09, 0x02, 0xFC, 0xEF, 0xEA, 0xF3, 0x07, 0x13, 0x01, 0xF9, 0xFE, 0x00, + 0x11, 0x0F, 0xFF, 0x06, 0xFF, 0xFA, 0x10, 0x06, 0xF4, 0xFC, 0xFF, 0x02, 0xFD, 0xEF, 0xF5, 0xFF, + 0x07, 0x0B, 0xFA, 0xF7, 0x00, 0x00, 0x06, 0x08, 0x03, 0x01, 0xFD, 0xFF, 0x06, 0x05, 0x02, 0x01, + 0xFF, 0xFB, 0xFF, 0x04, 0x02, 0x00, 0xF8, 0xFB, 0x18, 0x08, 0xD9, 0xEF, 0x11, 0x03, 0x06, 0x11, + 0x00, 0xF0, 0xF5, 0x02, 0x03, 0x09, 0x0E, 0xF5, 0xE6, 0xF1, 0xFB, 0x0F, 0x12, 0x00, 0x00, 0xFB, + 0x03, 0x18, 0x00, 0xFC, 0x0C, 0xF7, 0xFD, 0x12, 0xFE, 0xF4, 0xFB, 0xFA, 0x05, 0xFE, 0xE9, 0xF2, + 0x06, 0x12, 0x07, 0xF2, 0xF6, 0x00, 0x02, 0x09, 0x0C, 0x02, 0xFD, 0xFD, 0x01, 0x06, 0x04, 0x00, + 0x01, 0xFF, 0xF9, 0xFE, 0x02, 0x05, 0x09, 0x00, 0xFD, 0x02, 0xFD, 0xFF, 0x01, 0xFB, 0x01, 0xF9, + 0xEC, 0x02, 0x0C, 0x0B, 0x05, 0xE1, 0xEB, 0x14, 0x03, 0x00, 0x1F, 0x10, 0xEC, 0xEC, 0x04, 0x10, + 0x0A, 0x07, 0xFA, 0xE8, 0xEA, 0xF6, 0x0B, 0x16, 0x02, 0xF8, 0xFD, 0x07, 0x15, 0x06, 0xFC, 0x07, + 0xFE, 0xFB, 0x0A, 0x00, 0xF4, 0xF7, 0xF8, 0xFF, 0xFE, 0xF6, 0xF6, 0xFE, 0x0D, 0x0C, 0xFB, 0xFC, + 0x04, 0x06, 0x07, 0x01, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0xFD, + 0x00, 0x06, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFE, 0xFC, 0x03, 0x02, 0xFB, 0xFF, 0x01, 0x00, 0xFE, + 0xFC, 0x07, 0x08, 0xFB, 0xFD, 0x05, 0x01, 0xFE, 0xFF, 0x01, 0x02, 0xFD, 0xFE, 0x02, 0x00, 0xFF, + 0xFF, 0x00, 0x03, 0x03, 0x00, 0xFD, 0xFD, 0xFF, 0x01, 0x02, 0xFE, 0xFE, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x05, 0xFF, 0xFD, 0x01, 0x02, 0x01, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, + 0x00, 0x01, 0x02, 0x05, 0xF7, 0xE7, 0x04, 0x1B, 0x0A, 0xFC, 0xE5, 0xE4, 0x08, 0x0B, 0x07, 0x1B, + 0x0B, 0xEB, 0xE8, 0x00, 0x17, 0x0B, 0xFD, 0xFB, 0xE1, 0xE4, 0x0A, 0x12, 0x0D, 0x01, 0xF2, 0x02, + 0x10, 0x06, 0x05, 0x02, 0x02, 0x02, 0xFE, 0x06, 0x01, 0xF0, 0xFC, 0x07, 0xFA, 0xEE, 0xEE, 0xFB, + 0x09, 0x0B, 0x04, 0xFB, 0xF5, 0xFC, 0x17, 0x1F, 0xF3, 0xE0, 0x02, 0x0B, 0xFF, 0x0F, 0x18, 0x00, + 0xF0, 0xF6, 0x00, 0x0A, 0x0E, 0x00, 0xF5, 0xE8, 0xE1, 0x04, 0x1D, 0x06, 0xFA, 0xF7, 0x00, 0x18, + 0x00, 0xF0, 0x10, 0x05, 0xF0, 0x07, 0x0B, 0xFD, 0xF7, 0xF9, 0x0B, 0x07, 0xEB, 0xEC, 0x00, 0x0B, + 0x0A, 0xFD, 0xF8, 0x00, 0x01, 0x05, 0x07, 0x04, 0x03, 0x00, 0xF9, 0xFF, 0x06, 0x04, 0x00, 0xFD, + 0xFC, 0x02, 0x02, 0xFD, 0x01, 0xFF, 0xFB, 0x05, 0x05, 0xFF, 0xFD, 0xFA, 0x02, 0x0B, 0xFE, 0xF7, + 0xFF, 0x00, 0xFF, 0xFB, 0x00, 0x07, 0x00, 0xFC, 0x05, 0x04, 0xFF, 0x00, 0x01, 0x04, 0x00, 0xF9, + 0x00, 0x03, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFD, 0xFA, 0x00, 0x00, 0x02, 0x03, 0xFE, 0xFF, 0x03, + 0x03, 0x03, 0x01, 0xFF, 0xFC, 0xFE, 0x02, 0x04, 0x00, 0xFA, 0xFC, 0x02, 0x02, 0x01, 0xFF, 0xFF, + 0x02, 0xFF, 0x00, 0x01, 0x00, 0x08, 0xF6, 0xE1, 0x0F, 0x28, 0x03, 0xF5, 0xE9, 0xE5, 0x07, 0x0E, + 0x0B, 0x19, 0x07, 0xEC, 0xED, 0x00, 0x12, 0x09, 0xFC, 0xF7, 0xE1, 0xE4, 0x09, 0x14, 0x0B, 0x00, + 0xF8, 0x05, 0x13, 0x0A, 0x01, 0x03, 0x03, 0x00, 0x00, 0x06, 0x01, 0xF3, 0xF8, 0x07, 0xFD, 0xEB, + 0xEE, 0xFE, 0x0D, 0xFD, 0xEA, 0x08, 0x19, 0x0B, 0x05, 0xEB, 0xE9, 0x0F, 0x0A, 0x05, 0x1D, 0x0A, + 0xEB, 0xEE, 0x03, 0x14, 0x07, 0xFD, 0xF7, 0xE1, 0xE9, 0x08, 0x0F, 0x09, 0xFE, 0xF7, 0x00, 0x0A, + 0x12, 0x04, 0xF7, 0x02, 0x02, 0xFC, 0x04, 0xFF, 0xF6, 0xFE, 0x01, 0xFF, 0xF6, 0xEF, 0xFB, 0x0B, + 0x10, 0x03, 0xF4, 0xFB, 0x07, 0x08, 0x03, 0x00, 0x02, 0x05, 0xFF, 0xFE, 0x00, 0x01, 0x06, 0x00, + 0xF7, 0xFE, 0x02, 0xFF, 0x01, 0x04, 0xFF, 0xFB, 0xFB, 0x02, 0x08, 0xFE, 0xF7, 0x02, 0x05, 0xFA, + 0xFC, 0x02, 0xFF, 0xFD, 0xFF, 0x02, 0x03, 0xFF, 0x02, 0x08, 0x00, 0xFB, 0x01, 0x04, 0x00, 0xFD, + 0xFD, 0x01, 0x02, 0xFF, 0xFC, 0x00, 0x06, 0x02, 0xFB, 0xFC, 0xFF, 0x02, 0x01, 0xFD, 0x00, 0x03, + 0x00, 0x00, 0x02, 0x02, 0xFD, 0xFF, 0x0B, 0xF6, 0xE7, 0x14, 0x21, 0x00, 0xF3, 0xE6, 0xEB, 0x09, + 0x0A, 0x0C, 0x18, 0x04, 0xF1, 0xF0, 0x00, 0x13, 0x02, 0xFA, 0xFA, 0xDD, 0xE8, 0x0E, 0x0F, 0x0A, + 0x00, 0xF5, 0x09, 0x10, 0x02, 0x05, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0xF2, 0xFB, 0x06, 0xF9, + 0xEA, 0xF0, 0x04, 0x14, 0x03, 0xEC, 0x03, 0x1F, 0xFC, 0xDE, 0xFA, 0x11, 0x07, 0x07, 0x14, 0x0A, + 0xF6, 0xFB, 0x00, 0x01, 0x0F, 0x03, 0xEB, 0xE9, 0xE5, 0xFE, 0x20, 0x0C, 0xFB, 0xFE, 0xF9, 0x10, + 0x13, 0xF9, 0x05, 0x02, 0xF0, 0x0B, 0x0C, 0xF0, 0xFA, 0x00, 0xFC, 0x02, 0xF5, 0xEB, 0xF9, 0x07, + 0x10, 0x08, 0xF6, 0xF8, 0x04, 0x0B, 0x09, 0x00, 0xFF, 0x09, 0x04, 0xFB, 0xFF, 0x03, 0x06, 0x02, + 0xF7, 0xFB, 0x04, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0xFB, 0xFA, 0x06, 0x03, 0xFD, 0x02, 0x00, 0xFD, + 0x00, 0x00, 0x01, 0xFF, 0xFD, 0x03, 0x01, 0xFE, 0x05, 0x0A, 0x02, 0xFB, 0xFD, 0x05, 0x04, 0xFB, + 0xFA, 0xFF, 0x00, 0x01, 0x00, 0xFE, 0x01, 0x01, 0xFE, 0xFD, 0xFF, 0x00, 0x01, 0xFE, 0xFE, 0x05, + 0x04, 0xFF, 0x00, 0x02, 0x00, 0xFD, 0x00, 0x09, 0x02, 0xFC, 0xFB, 0x00, 0x15, 0x05, 0xD7, 0xE8, + 0x13, 0x08, 0x02, 0x18, 0x0F, 0xF8, 0xF7, 0xFB, 0x00, 0x0B, 0x07, 0xF6, 0xE7, 0xE0, 0xF6, 0x17, + 0x13, 0x01, 0xFE, 0xFB, 0x0E, 0x19, 0xFC, 0xFE, 0x11, 0x00, 0xFE, 0x05, 0x00, 0x08, 0xFE, 0xE2, + 0xF1, 0xFF, 0xEF, 0xF9, 0x19, 0x1D, 0x00, 0xEC, 0xF5, 0x06, 0x14, 0x0D, 0xF6, 0xED, 0xED, 0xF9, + 0x11, 0x0F, 0x02, 0x03, 0xFC, 0x02, 0x11, 0x00, 0xFD, 0x0C, 0xFF, 0xFD, 0x0D, 0x00, 0xF4, 0xFC, + 0xFF, 0x00, 0xFA, 0xED, 0xF0, 0x01, 0x0A, 0x04, 0x01, 0xF8, 0xE2, 0xFB, 0x2B, 0x1B, 0xF3, 0xE9, + 0xED, 0xFD, 0x0A, 0x11, 0x1D, 0x0D, 0xF2, 0xF0, 0xF6, 0x07, 0x12, 0x01, 0xFA, 0xEA, 0xD5, 0xF9, + 0x1E, 0x10, 0xFC, 0xF4, 0x01, 0x14, 0x01, 0xF9, 0x0A, 0x04, 0xF8, 0x00, 0x0B, 0x09, 0xF5, 0xF1, + 0x09, 0x09, 0xF1, 0xEA, 0xF6, 0x04, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x09, 0x0E, 0x02, 0xFF, 0x01, + 0xFE, 0xFE, 0x00, 0xFC, 0x00, 0x05, 0xFF, 0xFD, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x01, 0x06, 0x05, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 0xFD, 0x02, 0x00, 0xFC, 0xFE, 0x02, + 0x04, 0x00, 0xFF, 0x01, 0x04, 0x08, 0xFB, 0xED, 0x0E, 0x27, 0xF1, 0xC9, 0xF9, 0x1A, 0x00, 0x00, + 0x1F, 0x13, 0xF6, 0xF4, 0xF6, 0x06, 0x1C, 0x06, 0xED, 0xE7, 0xDA, 0xF9, 0x22, 0x12, 0x00, 0xF8, + 0xF4, 0x1A, 0x1A, 0xF1, 0x06, 0x11, 0xF3, 0x03, 0x0C, 0xF5, 0xF8, 0xFF, 0x01, 0x00, 0xEC, 0xE7, + 0xE5, 0xEF, 0x23, 0x2B, 0xF8, 0xE3, 0xED, 0x00, 0x0C, 0x00, 0x11, 0x23, 0x01, 0xEB, 0xED, 0x00, + 0x20, 0x07, 0xE9, 0xF9, 0xE3, 0xDC, 0x16, 0x1E, 0x04, 0x00, 0xF7, 0x08, 0x15, 0xF6, 0xFF, 0x16, + 0x00, 0xF7, 0x00, 0x01, 0x00, 0xF4, 0xFB, 0x0C, 0xF5, 0xDF, 0xF3, 0x09, 0x0D, 0x05, 0x00, 0x03, + 0x00, 0x01, 0x0A, 0x01, 0xFE, 0x05, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0xF9, + 0xFC, 0x06, 0x01, 0x00, 0x00, 0xF7, 0xFA, 0xFF, 0x01, 0x0C, 0x06, 0xFC, 0xF8, 0xEF, 0x00, 0x19, + 0x10, 0x02, 0xEE, 0xD8, 0xF9, 0x16, 0x0D, 0x16, 0x19, 0xFE, 0xED, 0xF0, 0x03, 0x10, 0x00, 0xF7, + 0xEC, 0xDD, 0xF9, 0x18, 0x0D, 0x00, 0xFC, 0xFF, 0x0C, 0x07, 0xFE, 0x0A, 0x0D, 0xFF, 0xFC, 0x00, + 0x00, 0xF9, 0xF9, 0x08, 0x04, 0xEC, 0xE9, 0xFA, 0x06, 0x09, 0x03, 0x00, 0x00, 0xFE, 0x09, 0x0D, + 0xEA, 0xE6, 0x1B, 0x29, 0xF6, 0xD3, 0xEF, 0x11, 0x03, 0xFC, 0x1D, 0x16, 0xF5, 0xFA, 0xFA, 0x00, + 0x19, 0x00, 0xE6, 0xEB, 0xDC, 0xF8, 0x28, 0x12, 0xF9, 0xF8, 0xFA, 0x1B, 0x16, 0xED, 0x06, 0x13, + 0xEF, 0x00, 0x14, 0xF6, 0xF0, 0x02, 0x08, 0xFF, 0xE6, 0xE0, 0xFC, 0x0E, 0x0C, 0x05, 0xFF, 0xFE, + 0x03, 0x06, 0x08, 0x06, 0x0D, 0x17, 0xF5, 0xC8, 0xEE, 0x1E, 0x0B, 0x04, 0x18, 0x08, 0xEE, 0xF3, + 0x09, 0x12, 0x08, 0x00, 0xF7, 0xE2, 0xE0, 0x01, 0x1E, 0x11, 0xF5, 0xF4, 0x05, 0x11, 0x08, 0xF8, + 0x04, 0x0F, 0xF6, 0xFB, 0x14, 0xFD, 0xEE, 0x09, 0x0F, 0xF7, 0xE1, 0xE6, 0x02, 0x0D, 0x05, 0x00, + 0xFB, 0x00, 0x0A, 0x06, 0x00, 0x00, 0x05, 0x07, 0xFC, 0xF7, 0x01, 0x0A, 0x05, 0xFB, 0xFD, 0x00, + 0xF8, 0xFD, 0x07, 0x05, 0x00, 0xFD, 0xFE, 0x04, 0x00, 0xFC, 0x03, 0x04, 0xFA, 0xF5, 0xFF, 0x08, + 0x03, 0xFE, 0x00, 0xFF, 0xFF, 0x03, 0x05, 0x00, 0xF9, 0xFE, 0x06, 0x05, 0x00, 0xFB, 0xFF, 0x07, + 0x03, 0xF9, 0xFB, 0x04, 0x04, 0xFD, 0xFB, 0x00, 0x04, 0x06, 0xF1, 0xE9, 0x14, 0x27, 0x08, 0xF3, + 0xE2, 0xDF, 0xFD, 0x09, 0x13, 0x25, 0x11, 0xF1, 0xE9, 0xFA, 0x15, 0x0A, 0xF1, 0xF4, 0xE5, 0xDA, + 0x02, 0x1E, 0x13, 0x05, 0xF8, 0x00, 0x15, 0x06, 0xF7, 0x09, 0x14, 0x0A, 0x00, 0xEC, 0xE4, 0xF6, + 0x06, 0x11, 0x11, 0xF8, 0xE0, 0xEA, 0x02, 0x13, 0x0F, 0xFF, 0xF6, 0xF2, 0xF3, 0x01, 0x11, 0x11, + 0x02, 0xF9, 0xFC, 0x03, 0x0B, 0x07, 0xFE, 0x07, 0x08, 0xF8, 0x01, 0x06, 0xF5, 0x01, 0x0D, 0xF6, + 0xEA, 0xEC, 0xF5, 0x09, 0x0F, 0x04, 0xFE, 0xFB, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x04, 0xFF, 0xFF, 0xFE, 0xFB, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01, 0xFE, 0xF9, + 0x00, 0x06, 0x02, 0xFA, 0xF9, 0x02, 0x03, 0xFB, 0xFD, 0x03, 0x00, 0xFE, 0x01, 0x05, 0x03, 0xFE, + 0xFC, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0x01, 0x02, 0xFF, 0x00, 0x06, 0x04, 0xFF, 0x00, 0x00, 0x01, + 0x00, 0xFD, 0xFE, 0x00, 0xFE, 0xFF, 0x01, 0x01, 0xFB, 0xFD, 0x09, 0xF2, 0xD8, 0x06, 0x2D, 0x07, + 0xE0, 0xE0, 0xF6, 0x05, 0x03, 0x14, 0x24, 0x0E, 0xF8, 0xEF, 0xF8, 0x15, 0x0B, 0xEB, 0xEE, 0xE3, + 0xDB, 0x0A, 0x1F, 0x04, 0x00, 0xFC, 0xF4, 0x0D, 0x20, 0x15, 0x09, 0xEF, 0xDC, 0xF9, 0x0B, 0x00, + 0x0E, 0x20, 0x08, 0xE2, 0xD4, 0xF9, 0x16, 0x02, 0xFC, 0xFA, 0xDE, 0xED, 0x19, 0x1B, 0x05, 0xF8, + 0xFF, 0x11, 0x08, 0xF7, 0x00, 0x0D, 0x06, 0xF5, 0xFE, 0x0E, 0xF9, 0xF6, 0x11, 0x02, 0xF1, 0xF6, + 0xF1, 0x01, 0x00, 0xE3, 0x0B, 0x32, 0x0B, 0xFB, 0xED, 0xD4, 0xF7, 0x0A, 0x01, 0x25, 0x21, 0xF2, + 0xEC, 0xF7, 0x0F, 0x1C, 0xFA, 0xF5, 0xF1, 0xCD, 0xF2, 0x28, 0x12, 0xFA, 0xF6, 0xFE, 0x16, 0x0D, + 0xFB, 0x08, 0x0B, 0xFC, 0xF6, 0x00, 0x06, 0xF7, 0xF9, 0x10, 0x06, 0xE9, 0xE6, 0xF6, 0x08, 0x0F, + 0x07, 0x00, 0xFA, 0xFD, 0x0E, 0x0E, 0xFD, 0x00, 0x07, 0xFD, 0xF7, 0xFB, 0x03, 0x0C, 0xFC, 0xF4, + 0x0B, 0x05, 0xF7, 0x00, 0xFE, 0xFF, 0x0A, 0xFC, 0xFA, 0x06, 0xFD, 0x00, 0x09, 0xFB, 0xF9, 0x00, + 0xFE, 0xFC, 0xFA, 0xFC, 0x03, 0x02, 0x03, 0x0D, 0x09, 0x00, 0x00, 0x04, 0x07, 0xFF, 0xF3, 0xF6, + 0xFE, 0x05, 0x08, 0x00, 0xFD, 0x05, 0x02, 0xFD, 0xFC, 0x00, 0x06, 0x06, 0x0E, 0x10, 0x0A, 0x19, + 0xF9, 0xCA, 0x00, 0x21, 0xF4, 0x12, 0x3D, 0x03, 0xDD, 0xF4, 0x0B, 0x17, 0x0B, 0xFA, 0xED, 0xD6, + 0xD7, 0x00, 0x1F, 0x11, 0xFC, 0xFC, 0xF9, 0xFF, 0x18, 0x20, 0x19, 0xFF, 0xD3, 0xEB, 0x15, 0xF9, + 0xFC, 0x2A, 0x1A, 0xED, 0xCE, 0xDA, 0x16, 0x19, 0xFA, 0x04, 0xEE, 0xD6, 0x07, 0x1F, 0x10, 0x07, + 0xF7, 0x03, 0x17, 0xFA, 0xF6, 0x11, 0x0A, 0xF9, 0xFC, 0x01, 0x00, 0xFC, 0x00, 0x08, 0x00, 0xED, + 0xEC, 0x01, 0x09, 0x03, 0x00, 0x0A, 0x24, 0x05, 0xC9, 0xF2, 0x20, 0xF5, 0x03, 0x35, 0x0A, 0xE6, + 0x00, 0x0D, 0x0A, 0x0D, 0x07, 0xF2, 0xD9, 0xD4, 0xF5, 0x23, 0x20, 0xF9, 0xF7, 0x07, 0x13, 0x15, + 0xFD, 0x00, 0x10, 0xEE, 0xF3, 0x18, 0xFB, 0xE9, 0x0C, 0x0E, 0xF8, 0xE8, 0xE8, 0xFF, 0x0A, 0x08, + 0x0C, 0x00, 0xF2, 0x00, 0x0A, 0x07, 0x03, 0x00, 0x00, 0x01, 0xF9, 0xF9, 0x07, 0x09, 0xFC, 0xF9, + 0x02, 0x07, 0x01, 0xFF, 0x00, 0xFE, 0x03, 0x03, 0xF9, 0xF8, 0xFE, 0x05, 0x08, 0xFC, 0xFA, 0x01, + 0xFC, 0xF9, 0xFD, 0x00, 0x04, 0xFF, 0x01, 0x0C, 0x06, 0x00, 0xFE, 0xFE, 0x08, 0x01, 0xF5, 0xFB, + 0xFE, 0x00, 0x05, 0xFF, 0x04, 0x0E, 0xFB, 0xE5, 0x03, 0x2F, 0x00, 0xC7, 0xFC, 0x20, 0xF5, 0x06, + 0x36, 0x13, 0xEF, 0xFB, 0xFB, 0x02, 0x17, 0xFE, 0xE3, 0xEA, 0xDB, 0xED, 0x24, 0x1B, 0xFD, 0xF9, + 0xF7, 0x14, 0x16, 0xF3, 0x0F, 0x1C, 0xF2, 0xFD, 0x1D, 0x0E, 0xE3, 0xD2, 0x00, 0x0C, 0xE0, 0xFC, + 0x21, 0xFE, 0xF2, 0x08, 0x0A, 0x0B, 0x03, 0xFA, 0xFC, 0xE8, 0xE1, 0x0A, 0x19, 0x01, 0xFC, 0x00, + 0x0C, 0x15, 0xFE, 0x00, 0x17, 0xFD, 0xF0, 0x07, 0x02, 0xFE, 0x04, 0x00, 0x00, 0xF3, 0xEF, 0xFE, + 0xE6, 0xE5, 0x1F, 0x24, 0xF3, 0xDB, 0xE4, 0x00, 0x05, 0xFF, 0x1D, 0x2D, 0x09, 0xE3, 0xE1, 0x0F, + 0x27, 0xF6, 0xE4, 0xFA, 0xE3, 0xE9, 0x1A, 0x17, 0x04, 0x00, 0xF6, 0x03, 0x09, 0xF8, 0x07, 0x11, + 0xFD, 0xF9, 0x00, 0x00, 0xF9, 0xF6, 0x08, 0x08, 0xEE, 0xEC, 0xFA, 0x01, 0x07, 0x08, 0x0E, 0x0B, + 0xF7, 0xF6, 0x06, 0x05, 0x01, 0x00, 0x00, 0x06, 0x00, 0xF4, 0x00, 0x08, 0x00, 0x01, 0xFF, 0xF6, + 0x00, 0x05, 0x00, 0x09, 0x06, 0xF7, 0xFD, 0x00, 0xFE, 0x06, 0x03, 0xF9, 0xFE, 0x03, 0x01, 0xF8, + 0xF4, 0x03, 0x08, 0xFE, 0x02, 0x0B, 0x07, 0x01, 0xFE, 0xFE, 0x02, 0xFE, 0xF8, 0xFF, 0x03, 0x00, + 0x00, 0x00, 0x01, 0x04, 0xFD, 0xFA, 0x00, 0xFC, 0xFE, 0x0D, 0xF8, 0xD3, 0xEF, 0x27, 0x1A, 0xE0, + 0xD5, 0xF4, 0xFD, 0xF8, 0x15, 0x30, 0x19, 0xFE, 0xEC, 0xE7, 0x10, 0x1A, 0xE6, 0xEA, 0xF8, 0xD3, + 0xF1, 0x26, 0x13, 0x00, 0xFA, 0x00, 0x1C, 0x06, 0xEB, 0x0B, 0x25, 0x13, 0xE7, 0xD5, 0x01, 0x09, + 0xF6, 0x1C, 0x22, 0xE8, 0xD7, 0xEC, 0x00, 0x0F, 0x0E, 0x02, 0xF5, 0xE5, 0xEF, 0x10, 0x1F, 0x0F, + 0xFA, 0xFA, 0x09, 0x07, 0xFB, 0x01, 0x0C, 0x05, 0x00, 0xFF, 0xFD, 0x01, 0xFD, 0x02, 0x0F, 0xF8, + 0xE4, 0xF4, 0xFB, 0x03, 0x12, 0x07, 0xFB, 0xFE, 0x05, 0xFE, 0xDC, 0xE8, 0x22, 0x20, 0xEE, 0xDE, + 0xEC, 0x02, 0x05, 0x01, 0x21, 0x28, 0xF7, 0xD9, 0xE9, 0x0E, 0x1F, 0x00, 0xF0, 0xFA, 0xE0, 0xE6, + 0x1D, 0x1E, 0xFF, 0xF7, 0xFA, 0x0D, 0x10, 0xF5, 0x00, 0x17, 0xFF, 0xEF, 0xFF, 0x08, 0x00, 0xFB, + 0x06, 0x06, 0xEF, 0xE9, 0xF8, 0xFF, 0x03, 0x0D, 0x0B, 0x00, 0xFA, 0x00, 0x07, 0x0A, 0x04, 0xFC, + 0xFF, 0x03, 0xFB, 0xF6, 0x00, 0x05, 0x00, 0x01, 0x00, 0xF8, 0xFF, 0x0A, 0xFE, 0xFB, 0x06, 0x02, + 0xFE, 0xFD, 0xFB, 0x05, 0x08, 0xFC, 0xFD, 0x04, 0x01, 0xFC, 0xF9, 0x00, 0x05, 0x00, 0x00, 0x02, + 0x00, 0xFD, 0x00, 0x04, 0x04, 0x00, 0xF9, 0xFC, 0x02, 0x00, 0x01, 0x02, 0xFC, 0x05, 0x08, 0xE3, + 0xCE, 0xFE, 0x2C, 0x04, 0xC8, 0xE8, 0x16, 0xF4, 0xEE, 0x2B, 0x2A, 0xFE, 0xF7, 0xEA, 0xF3, 0x22, + 0x05, 0xDA, 0xFB, 0xF1, 0xD6, 0x0B, 0x22, 0x04, 0xFE, 0xFC, 0x10, 0x1C, 0xF6, 0xF9, 0x17, 0x04, + 0xF8, 0x05, 0xFE, 0xF5, 0xFE, 0x05, 0x02, 0xF3, 0xE4, 0xEF, 0x03, 0xFF, 0x03, 0x11, 0xFD, 0x01, + 0x20, 0x15, 0x0A, 0xFA, 0xDA, 0xED, 0x05, 0x09, 0x28, 0x26, 0xF0, 0xD9, 0xFC, 0x20, 0x0B, 0xF3, + 0x01, 0xEF, 0xDC, 0xFC, 0x0C, 0x0B, 0x05, 0xF5, 0x02, 0x13, 0x04, 0xFB, 0x04, 0x11, 0x00, 0xE9, + 0x05, 0x10, 0xF1, 0xFC, 0x17, 0x05, 0xEA, 0xE6, 0xFD, 0x0A, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x00, + 0x00, 0x0A, 0x08, 0xFB, 0xFE, 0x00, 0xF9, 0xFA, 0x02, 0x05, 0x05, 0x03, 0xFE, 0xFE, 0x03, 0x00, + 0xF8, 0xFD, 0x0C, 0x06, 0xF6, 0xF7, 0x00, 0x08, 0x0B, 0xFE, 0xF6, 0x00, 0x00, 0xF8, 0xF9, 0x02, + 0x05, 0x02, 0x02, 0x03, 0x03, 0x00, 0xFE, 0x00, 0x03, 0xFD, 0xF9, 0xFE, 0x00, 0x01, 0x03, 0x00, + 0x00, 0xFE, 0xF9, 0xFD, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x08, 0x00, 0x04, 0x12, 0xF1, 0xCB, 0xEF, + 0x28, 0x16, 0xD2, 0xDB, 0x1B, 0x00, 0xE1, 0x29, 0x34, 0xF7, 0xF7, 0xF0, 0xE7, 0x19, 0x12, 0xE2, + 0xF1, 0xF1, 0xD7, 0x02, 0x2D, 0x11, 0xFE, 0x07, 0xFD, 0x01, 0x1E, 0x19, 0x0E, 0x00, 0xDC, 0xE9, + 0x05, 0xFC, 0x11, 0x2A, 0x05, 0xDA, 0xD0, 0xF2, 0x12, 0xFF, 0xFC, 0x09, 0xF0, 0xEB, 0x05, 0x12, + 0x14, 0x06, 0xFB, 0x01, 0x09, 0x0A, 0xFD, 0x00, 0x0D, 0xFC, 0x00, 0x13, 0xF1, 0xEB, 0x0F, 0x07, + 0xF4, 0xF3, 0xF5, 0xFF, 0xFE, 0x01, 0x0A, 0x08, 0x0E, 0x00, 0xDC, 0xEA, 0x1B, 0x2A, 0xF8, 0xCC, + 0x00, 0x1D, 0xEB, 0x0D, 0x3F, 0x02, 0xE6, 0x00, 0xFA, 0x07, 0x11, 0xF1, 0xED, 0xF3, 0xE1, 0xF5, + 0x1B, 0x13, 0x00, 0x00, 0x04, 0x0D, 0x02, 0xEF, 0x0B, 0x1A, 0xF3, 0xF7, 0x13, 0xFD, 0xF0, 0x00, + 0x04, 0x02, 0xF1, 0xE6, 0xF7, 0x04, 0x0C, 0x0D, 0x00, 0x00, 0x02, 0xFC, 0x03, 0x08, 0x04, 0x06, + 0x00, 0xF7, 0xFC, 0x02, 0x04, 0xFD, 0xFC, 0x05, 0xFD, 0xF5, 0x04, 0x05, 0xFD, 0x06, 0x04, 0xF9, + 0xFF, 0x02, 0x01, 0x04, 0xFD, 0xF7, 0xFF, 0x02, 0x01, 0x00, 0x00, 0x03, 0xFF, 0xFD, 0x06, 0x08, + 0xFF, 0xF8, 0xFD, 0x05, 0x02, 0xFB, 0xFD, 0xFF, 0x00, 0x03, 0x00, 0xFE, 0x00, 0x00, 0xFD, 0xFD, + 0x01, 0x01, 0x02, 0x00, 0x00, 0x09, 0x00, 0xFB, 0x06, 0xF9, 0xFD, 0x16, 0x05, 0x04, 0x14, 0x0A, + 0x19, 0x00, 0xD4, 0x04, 0x11, 0xF8, 0x2D, 0x2A, 0xE1, 0xDA, 0xFF, 0x1F, 0x16, 0xF6, 0xFB, 0xEA, + 0xCD, 0xF0, 0x10, 0x10, 0x0B, 0xFC, 0x03, 0x17, 0x10, 0x00, 0x01, 0x13, 0x01, 0xED, 0x0C, 0x0A, + 0xEA, 0xFB, 0x08, 0x00, 0xEF, 0xE2, 0xFE, 0x01, 0x00, 0x23, 0x09, 0xEE, 0x0C, 0x12, 0x17, 0x06, + 0xD6, 0xFB, 0x19, 0x00, 0x21, 0x26, 0xED, 0xE4, 0xF7, 0x10, 0x13, 0xF4, 0xFF, 0xFC, 0xD8, 0xF6, + 0x18, 0x0C, 0x02, 0xF7, 0xFB, 0x10, 0x07, 0xF8, 0x03, 0x11, 0xFF, 0xEA, 0x03, 0x10, 0xF2, 0xF6, + 0x10, 0x08, 0xF1, 0xE7, 0xF8, 0x0B, 0x04, 0x01, 0x07, 0x02, 0xFF, 0x00, 0x03, 0x0F, 0x0A, 0xFC, + 0xFA, 0x01, 0x00, 0xF8, 0x00, 0x05, 0x00, 0x02, 0xFD, 0xF9, 0x09, 0x03, 0xF4, 0x02, 0x0A, 0x00, + 0xFA, 0xF5, 0xFE, 0x08, 0x03, 0x00, 0x00, 0x01, 0xFF, 0xF6, 0xFD, 0x07, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x01, 0x06, 0xFE, 0xF7, 0xFE, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0xFE, 0xF7, 0x00, + 0x01, 0xFE, 0x01, 0xFC, 0x00, 0x06, 0xFE, 0x03, 0x0A, 0x00, 0xFE, 0xFD, 0x02, 0x07, 0xF9, 0xFA, + 0x00, 0xFD, 0x09, 0xFF, 0xFC, 0x16, 0x02, 0x00, 0x1C, 0x0A, 0x09, 0x02, 0xD8, 0xEE, 0x0D, 0x0C, + 0x2A, 0x1D, 0xE5, 0xD8, 0xF4, 0x1D, 0x15, 0xF2, 0xFF, 0xEF, 0xD1, 0xFB, 0x18, 0x0F, 0x0B, 0xFF, + 0x01, 0x10, 0x04, 0xFE, 0x08, 0x10, 0x01, 0xF4, 0x07, 0x0A, 0xF1, 0xF8, 0x06, 0xFB, 0xEA, 0xE4, + 0xF3, 0x03, 0x06, 0x0D, 0x0B, 0x02, 0x03, 0x00, 0x01, 0x0A, 0x00, 0xF7, 0x02, 0x0A, 0x00, 0xF7, + 0x02, 0x07, 0x03, 0x06, 0xFC, 0xF6, 0x01, 0x00, 0x00, 0x09, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x02, + 0xFA, 0xFD, 0x03, 0x00, 0xFB, 0xF7, 0x01, 0x09, 0xFF, 0xFE, 0x07, 0x07, 0xFE, 0xFB, 0x06, 0x0B, + 0xFC, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x03, 0xFB, 0xFA, 0x00, 0x00, 0x00, 0xFE, 0xFE, + 0x04, 0x04, 0xFE, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0x02, 0x04, 0x03, 0xFF, + 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x04, 0xFF, 0xFD, 0x03, 0x03, 0x00, 0xFE, 0xFC, 0xFF, + 0x00, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x03, 0x01, 0xFE, 0x00, 0x00, 0x00, + 0x02, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFE, 0x09, 0xFC, 0xD5, 0xE5, 0x1F, 0x24, 0xE7, 0xCD, 0x05, + 0x15, 0xE2, 0x03, 0x3C, 0x0A, 0xE7, 0xF1, 0xE8, 0x0F, 0x27, 0xF0, 0xE8, 0xFC, 0xE2, 0xF5, 0x1C, + 0x0D, 0x03, 0x07, 0x06, 0x10, 0x04, 0xF5, 0x0B, 0x14, 0xFC, 0xF5, 0x02, 0x00, 0xF4, 0xF6, 0x00, + 0xFF, 0xF3, 0xEC, 0xF2, 0x00, 0x08, 0x04, 0x02, 0x04, 0x02, 0x00, 0x04, 0x07, 0x06, 0xFF, 0xFF, + 0x08, 0x05, 0xF9, 0xFF, 0x03, 0xFF, 0x02, 0x01, 0xFA, 0x01, 0x02, 0xFE, 0x06, 0x04, 0xF7, 0xFA, + 0xFE, 0xFD, 0x01, 0x00, 0xFC, 0x00, 0x04, 0x00, 0xFA, 0xFD, 0x04, 0x02, 0xFC, 0x01, 0x06, 0x04, + 0xFF, 0x00, 0x08, 0x06, 0xFB, 0xFD, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0xFC, 0xFF, 0x01, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x01, 0x01, 0xFB, 0xFE, 0x03, 0x03, 0x01, 0xFD, 0xFC, + 0x02, 0x03, 0x03, 0x02, 0x00, 0x02, 0x00, 0xFD, 0x01, 0x00, 0x00, 0x03, 0xFC, 0xFF, 0xFF, 0xFB, + 0x0F, 0x04, 0xD7, 0xE2, 0x15, 0x2E, 0x00, 0xCD, 0x02, 0x28, 0xE6, 0xFC, 0x3F, 0x07, 0xDE, 0xF8, + 0xF3, 0x05, 0x1C, 0xF6, 0xE9, 0xF5, 0xE9, 0xFB, 0x16, 0x0E, 0x06, 0x06, 0x04, 0x09, 0x00, 0xF4, + 0x08, 0x14, 0xFC, 0xF7, 0x08, 0x00, 0xF3, 0xF8, 0x00, 0xFF, 0xF5, 0xEB, 0xF4, 0x05, 0x08, 0x03, + 0x01, 0x05, 0x05, 0x01, 0x02, 0x05, 0x02, 0xFF, 0x00, 0x06, 0x06, 0xFE, 0xFF, 0x02, 0x00, 0x03, + 0x00, 0xFA, 0xFF, 0x00, 0xFE, 0x07, 0x03, 0xF7, 0xFB, 0xFF, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x03, + 0x00, 0xFD, 0xFF, 0x05, 0x05, 0xFE, 0xFF, 0x06, 0x04, 0xFD, 0xFF, 0x06, 0x05, 0xFD, 0xFD, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xFC, 0xFD, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFE, + 0x01, 0x03, 0xFC, 0xFD, 0x04, 0x02, 0x01, 0x00, 0xFD, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0x01, 0x04, 0xFE, 0x00, 0x00, 0xFD, 0x04, 0xFD, 0xFC, 0x13, 0xFF, 0xE1, 0xFB, + 0x1C, 0x23, 0xF3, 0xD2, 0x10, 0x1D, 0xEA, 0x17, 0x33, 0xEE, 0xE0, 0xF9, 0x00, 0x12, 0x0E, 0xF6, + 0xEB, 0xE4, 0xF1, 0x09, 0x0F, 0x0B, 0x05, 0x03, 0x0C, 0x09, 0xFB, 0xFD, 0x11, 0x0D, 0xF4, 0xFD, + 0x0D, 0xF8, 0xED, 0xFE, 0x01, 0xFB, 0xF2, 0xED, 0xFA, 0x07, 0x08, 0x03, 0x00, 0x04, 0x04, 0xFF, + 0x02, 0x07, 0x02, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0xFE, 0x02, 0xFF, 0xFC, 0x00, 0xFE, + 0x02, 0x09, 0xFD, 0xF3, 0xFC, 0x00, 0xFF, 0x00, 0xFD, 0xFF, 0x03, 0x01, 0x00, 0xFF, 0x00, 0x03, + 0xFF, 0xFD, 0x01, 0x05, 0x01, 0xFE, 0x03, 0x09, 0x02, 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0xFD, 0x00, + 0x03, 0x00, 0xFC, 0x00, 0x02, 0x00, 0xFD, 0xFD, 0x00, 0x02, 0x00, 0xFD, 0xFF, 0x00, 0xFF, 0x02, + 0x02, 0x01, 0x00, 0xFE, 0x00, 0x02, 0x02, 0x01, 0x00, 0xFF, 0x02, 0x00, 0x00, 0x02, 0x01, 0x03, + 0x00, 0xFA, 0xFD, 0x00, 0x00, 0x03, 0xFC, 0xFF, 0x0C, 0xF4, 0xD7, 0xF4, 0x27, 0x1F, 0xDA, 0xDD, + 0x21, 0x06, 0xE6, 0x2B, 0x2D, 0xE6, 0xE5, 0xF1, 0xFA, 0x1A, 0x0B, 0xEE, 0xEE, 0xE8, 0xF3, 0x0D, + 0x0E, 0x0A, 0x09, 0x07, 0x0D, 0x03, 0xF5, 0x01, 0x15, 0x06, 0xF4, 0x01, 0x09, 0xF1, 0xEB, 0xFE, + 0x03, 0xFC, 0xED, 0xEC, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x05, 0x04, 0x00, 0x04, 0x06, 0x01, 0x01, + 0x06, 0x05, 0x00, 0x01, 0x04, 0xFF, 0xFF, 0x01, 0xFD, 0x00, 0x00, 0xFE, 0x06, 0x04, 0xF5, 0xF8, + 0x00, 0xFE, 0xFD, 0xFC, 0xFB, 0x01, 0x03, 0xFF, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x05, 0x04, + 0x00, 0x00, 0x07, 0x08, 0x00, 0xFD, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x02, 0x00, 0xFC, 0xFD, 0x00, + 0x00, 0x00, 0xFC, 0xFC, 0x02, 0x01, 0xFD, 0x00, 0x00, 0xFE, 0x02, 0x03, 0x00, 0x0A, 0x00, 0xDC, + 0xE0, 0x18, 0x2A, 0xF0, 0xD0, 0x06, 0x15, 0xEA, 0x0D, 0x37, 0x07, 0xE8, 0xE5, 0xE2, 0x0E, 0x1C, + 0xF4, 0xF4, 0xF0, 0xE0, 0x00, 0x15, 0x0B, 0x0C, 0x06, 0x05, 0x0D, 0xFC, 0xF7, 0x0C, 0x12, 0x01, + 0xF8, 0x02, 0x04, 0xF2, 0xF0, 0xFF, 0x01, 0xF8, 0xEB, 0xEF, 0x03, 0x0A, 0x03, 0x00, 0x02, 0x06, + 0x03, 0xFF, 0x03, 0x06, 0x00, 0x00, 0x0B, 0x09, 0x00, 0x00, 0x00, 0xFE, 0x05, 0x05, 0xFC, 0xFD, + 0xFE, 0x00, 0x08, 0x00, 0xF4, 0xF8, 0xFF, 0xFE, 0xFC, 0xFA, 0xFF, 0x04, 0x00, 0xFE, 0xFF, 0x00, + 0x04, 0x02, 0xFC, 0x00, 0x04, 0x01, 0x00, 0x02, 0x09, 0x08, 0xFC, 0xFF, 0x04, 0x00, 0x00, 0xFD, + 0xFE, 0x06, 0x01, 0xFA, 0xFD, 0x00, 0x03, 0xFC, 0xF9, 0x00, 0xFF, 0x01, 0x00, 0xFB, 0x07, 0xFA, + 0xFC, 0x23, 0x03, 0xD8, 0xFB, 0x17, 0x23, 0x08, 0xD5, 0xFE, 0x21, 0x00, 0x1A, 0x27, 0xE7, 0xD5, + 0xF0, 0x0B, 0x15, 0x02, 0xFE, 0xEA, 0xD5, 0xFE, 0x14, 0x05, 0x0D, 0x0A, 0x05, 0x0E, 0x01, 0xF6, + 0x01, 0x11, 0x0D, 0xF5, 0xFA, 0x0F, 0xF9, 0xE7, 0xFB, 0x04, 0xFC, 0xED, 0xE9, 0xFF, 0x0E, 0x08, + 0xFF, 0xFC, 0x03, 0x08, 0x01, 0x00, 0x05, 0x01, 0xFE, 0x06, 0x09, 0x02, 0x03, 0x04, 0xFC, 0xFC, + 0x01, 0x00, 0x00, 0x00, 0xFB, 0x02, 0x09, 0xFA, 0xF3, 0xFF, 0xFE, 0xFA, 0xFB, 0xF9, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFE, 0x03, 0x04, 0x01, 0xFC, 0x02, 0x0C, 0x04, 0xFF, 0xFF, + 0x00, 0x01, 0xFE, 0xFF, 0x02, 0x00, 0x02, 0xFC, 0xFE, 0x06, 0xFE, 0xFE, 0xFD, 0xF9, 0x06, 0xFC, + 0xF9, 0x09, 0xF2, 0x06, 0x21, 0xE3, 0xF0, 0x28, 0x07, 0x03, 0x06, 0xE0, 0xF6, 0x13, 0x1D, 0x2A, + 0x02, 0xD7, 0xD5, 0xF9, 0x29, 0x0E, 0xF3, 0x02, 0xD9, 0xDA, 0x1C, 0x10, 0x01, 0x10, 0x02, 0x09, + 0x0B, 0xF4, 0xFD, 0x0E, 0x0C, 0xFC, 0xF4, 0x08, 0x03, 0xE7, 0xF1, 0x05, 0x02, 0xEF, 0xE5, 0xF7, + 0x0B, 0x0E, 0x05, 0xFC, 0x02, 0x08, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x00, 0x0D, 0x05, 0x00, 0x0A, + 0x01, 0xFD, 0x02, 0xFD, 0xFE, 0x00, 0xFD, 0x02, 0x02, 0xFC, 0xF5, 0xFA, 0x02, 0xFA, 0xF8, 0xFB, + 0xFC, 0x08, 0xFF, 0xFC, 0x0A, 0xF8, 0x0A, 0x1E, 0xDE, 0xEA, 0x2B, 0x0C, 0xFF, 0x06, 0xEA, 0xFD, + 0x16, 0x1C, 0x2A, 0x06, 0xD9, 0xD3, 0xF3, 0x27, 0x13, 0xF1, 0x01, 0xE2, 0xDB, 0x17, 0x0C, 0xFB, + 0x15, 0x04, 0x00, 0x0F, 0xF8, 0xF5, 0x10, 0x18, 0x05, 0xF2, 0x00, 0x08, 0xED, 0xEA, 0x04, 0x05, + 0xF5, 0xEB, 0xF0, 0x04, 0x11, 0x07, 0xFB, 0xFF, 0x06, 0x05, 0xFF, 0xFE, 0x05, 0x03, 0xFE, 0x07, + 0x0A, 0x03, 0x06, 0x01, 0xF9, 0xFE, 0x02, 0x00, 0xFF, 0xFB, 0xFC, 0x08, 0x0A, 0xFA, 0xF6, 0xFF, + 0xFF, 0xFB, 0xF9, 0xF8, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xFD, 0x03, 0x03, 0xFF, + 0xFE, 0x05, 0x0E, 0x06, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x01, 0x00, 0x01, 0xF8, 0xFD, 0x16, + 0x00, 0xCC, 0xDB, 0x1C, 0x27, 0xE0, 0xD0, 0x1F, 0x11, 0xD4, 0x18, 0x3B, 0xF2, 0xE0, 0xDA, 0xD7, + 0x19, 0x21, 0xF6, 0xFC, 0xF0, 0xE5, 0x09, 0x13, 0x0E, 0x15, 0x09, 0x09, 0x09, 0xF5, 0xF8, 0x0E, + 0x11, 0xFE, 0xF2, 0x02, 0x03, 0xEA, 0xEA, 0xFB, 0x01, 0xF9, 0xE2, 0xE9, 0x07, 0x0E, 0x06, 0x00, + 0xFF, 0x09, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x01, 0x0A, 0x0B, 0x01, 0x02, 0x06, 0xFE, 0xFE, 0x03, + 0x00, 0xFF, 0xFB, 0xF9, 0x02, 0x06, 0xFB, 0xF4, 0xFB, 0xFF, 0xF7, 0xF5, 0xFD, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x05, 0x02, 0xFC, 0xFF, 0x05, 0x03, 0xFE, 0x03, 0x0E, 0x08, 0xFF, 0xFE, 0x00, + 0x04, 0x00, 0xFA, 0xFE, 0x00, 0x03, 0xFD, 0xF7, 0x07, 0x01, 0xF6, 0x10, 0x00, 0xD1, 0xE8, 0x1E, + 0x2B, 0xF6, 0xCF, 0x11, 0x23, 0xE3, 0x0D, 0x31, 0xE9, 0xDB, 0xED, 0xE7, 0x13, 0x1E, 0xFB, 0xFA, + 0xEF, 0xED, 0x0D, 0x10, 0x0A, 0x0D, 0x04, 0x0A, 0x09, 0xF1, 0xF3, 0x0D, 0x11, 0xFD, 0xF4, 0x06, + 0x04, 0xE8, 0xEA, 0xFF, 0x04, 0xF9, 0xE7, 0xEF, 0x09, 0x10, 0x07, 0x00, 0xFF, 0x08, 0x07, 0xFC, + 0x00, 0x06, 0x00, 0x02, 0x0B, 0x0B, 0x05, 0x04, 0x01, 0xFB, 0xFF, 0x03, 0xFE, 0xFD, 0xFA, 0xFD, + 0x0C, 0x04, 0xEF, 0xF4, 0xFF, 0x00, 0xFC, 0xF3, 0xF9, 0x03, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, + 0xFE, 0x00, 0x04, 0x03, 0x00, 0x00, 0x06, 0x06, 0x01, 0x00, 0x00, 0x01, 0xFE, 0xFC, 0xFF, 0x05, + 0x09, 0xFA, 0xF7, 0x08, 0x00, 0xFE, 0x12, 0xF4, 0xCD, 0xEB, 0x23, 0x27, 0xE3, 0xD7, 0x22, 0x11, + 0xE3, 0x21, 0x20, 0xDA, 0xDE, 0xE9, 0xF6, 0x1E, 0x15, 0xFB, 0xE9, 0xDF, 0x05, 0x17, 0x06, 0x10, + 0x0E, 0x05, 0x13, 0x03, 0xEA, 0xFB, 0x16, 0x0E, 0xF1, 0xFA, 0x0D, 0xEC, 0xD7, 0xF5, 0x04, 0xFD, + 0xEF, 0xE9, 0x00, 0x13, 0x0B, 0xFF, 0xFC, 0x03, 0x0D, 0x02, 0xF8, 0x04, 0x08, 0x01, 0x09, 0x0E, + 0x09, 0x0B, 0x05, 0xF9, 0xFC, 0x04, 0x04, 0x00, 0xFA, 0xF8, 0x07, 0x11, 0xF9, 0xEB, 0xFB, 0xFE, + 0xFC, 0xFA, 0xF3, 0xFC, 0x05, 0x02, 0x01, 0xFE, 0x00, 0x06, 0x00, 0xFD, 0x03, 0x06, 0x01, 0xFB, + 0x07, 0x0D, 0x04, 0x04, 0xFE, 0x01, 0x04, 0xF6, 0xFF, 0x03, 0x00, 0x08, 0xF4, 0xFB, 0x0E, 0xEB, + 0x0C, 0x28, 0xDE, 0xF7, 0x29, 0x03, 0x12, 0x08, 0xD5, 0xFC, 0x25, 0x27, 0x20, 0xF7, 0xD6, 0xCE, + 0xFA, 0x2A, 0x02, 0xFA, 0x09, 0xD0, 0xE7, 0x2B, 0x0E, 0x03, 0x0D, 0xFE, 0x0A, 0x06, 0xF2, 0x01, + 0x12, 0x0C, 0xF9, 0xFC, 0x0E, 0xF5, 0xDA, 0xEF, 0x00, 0xFD, 0xEB, 0xE3, 0x00, 0x14, 0x0D, 0x00, + 0xFC, 0x04, 0x08, 0x00, 0xFF, 0x00, 0x01, 0x05, 0x0B, 0x0F, 0x08, 0x04, 0x06, 0xFD, 0xFC, 0x05, + 0x00, 0xFC, 0xF7, 0xF7, 0x0B, 0x09, 0xF1, 0xF2, 0xFB, 0xFD, 0xFD, 0xF1, 0xF4, 0x03, 0x01, 0x00, + 0xFF, 0xFE, 0x09, 0x08, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x07, 0x08, 0x05, 0x01, 0x00, 0x03, + 0xFC, 0xFB, 0x00, 0xFF, 0x0D, 0x00, 0xEB, 0x07, 0xFF, 0xF9, 0x20, 0xF2, 0xD9, 0x22, 0x0E, 0xE6, + 0x0B, 0xFC, 0xDC, 0x03, 0x34, 0x30, 0xFC, 0xDB, 0xCF, 0xDD, 0x1D, 0x1B, 0xF1, 0x05, 0xEC, 0xCE, + 0x0F, 0x20, 0x03, 0x0C, 0x03, 0x03, 0x10, 0xF8, 0xF3, 0x0A, 0x11, 0x06, 0xF7, 0x00, 0x06, 0xE5, + 0xDC, 0xFC, 0x05, 0xEF, 0xE2, 0xEF, 0x07, 0x18, 0x0D, 0xF9, 0xFE, 0x08, 0x02, 0x00, 0xFE, 0xFB, + 0x02, 0x06, 0x0D, 0x10, 0x04, 0x07, 0x09, 0xFC, 0xFF, 0x04, 0x00, 0xFD, 0xF5, 0xF8, 0x09, 0x03, + 0xF3, 0xF2, 0xFA, 0xFD, 0xF7, 0xF7, 0xFE, 0xFA, 0xFD, 0x05, 0x01, 0x01, 0x05, 0x02, 0x00, 0xFC, + 0x00, 0x07, 0x02, 0x03, 0x05, 0x05, 0x07, 0x00, 0x03, 0x04, 0xFC, 0x01, 0xFF, 0x00, 0x0D, 0xF6, + 0xFC, 0x0C, 0xED, 0x0C, 0x21, 0xDE, 0xEE, 0x23, 0x27, 0x27, 0xEE, 0xE1, 0x2C, 0x17, 0xFF, 0x28, + 0x03, 0xD3, 0xDA, 0xF3, 0x1D, 0x16, 0x01, 0xFF, 0xD1, 0xE3, 0x27, 0x0E, 0xFE, 0x16, 0x08, 0x0E, + 0x15, 0xF3, 0xEE, 0x0E, 0x1F, 0x03, 0xEB, 0x03, 0x02, 0xD6, 0xDC, 0x01, 0x01, 0xF2, 0xE9, 0xF1, + 0x0C, 0x17, 0x02, 0xF8, 0x00, 0x06, 0x06, 0xFE, 0xF8, 0x03, 0x09, 0x06, 0x10, 0x12, 0x0C, 0x0E, + 0x03, 0xF9, 0x00, 0x06, 0x03, 0xFD, 0xF5, 0xF9, 0x0C, 0x0A, 0xF0, 0xEE, 0xFE, 0xFC, 0xFA, 0xF8, + 0xF4, 0xFE, 0x02, 0x02, 0x03, 0xFE, 0x03, 0x05, 0xF9, 0xFD, 0x06, 0x02, 0x00, 0x01, 0x08, 0x09, + 0x0B, 0x0D, 0xE4, 0xD5, 0x1B, 0x20, 0xD3, 0xE9, 0x2A, 0x00, 0xE1, 0x23, 0x2C, 0xED, 0xDD, 0xCF, + 0xD6, 0x1D, 0x1B, 0xEE, 0xFB, 0xE6, 0xDA, 0x13, 0x1F, 0x0D, 0x0A, 0xFC, 0x05, 0x13, 0x00, 0xF7, + 0x06, 0x15, 0x07, 0xF7, 0x0A, 0x05, 0xE2, 0xE5, 0xFD, 0x08, 0xFB, 0xDF, 0xE9, 0x09, 0x11, 0x05, + 0xF5, 0xFD, 0x08, 0xFF, 0xFB, 0xFC, 0xFD, 0x03, 0x05, 0x0E, 0x13, 0x08, 0x0B, 0x0B, 0x00, 0x00, + 0x02, 0x05, 0x00, 0xF4, 0xFD, 0x06, 0x01, 0xF6, 0xF0, 0xFB, 0xFD, 0xF2, 0xF4, 0xF9, 0x00, 0x00, + 0xF8, 0x03, 0x02, 0x04, 0x0D, 0xF6, 0x00, 0x0B, 0xF2, 0x22, 0x29, 0xDA, 0xFE, 0x2F, 0x1F, 0x2C, + 0xF8, 0xDA, 0x23, 0x1A, 0x0A, 0x27, 0xF8, 0xD2, 0xD8, 0xED, 0x18, 0x0D, 0xFB, 0xFB, 0xCB, 0xE8, + 0x29, 0x02, 0xF8, 0x18, 0x0F, 0x16, 0x12, 0xED, 0xF1, 0x12, 0x21, 0x07, 0xF0, 0x04, 0xFF, 0xDA, + 0xE8, 0x0A, 0x06, 0xEF, 0xE2, 0xF5, 0x15, 0x14, 0xF6, 0xEE, 0x00, 0x06, 0x01, 0xFD, 0xF6, 0xFE, + 0x06, 0x06, 0x11, 0x0E, 0x04, 0x0B, 0x05, 0xF9, 0x02, 0x0A, 0x07, 0xFE, 0xF4, 0x00, 0x08, 0xFD, + 0xF1, 0xF2, 0xFC, 0xFC, 0xF0, 0xF6, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFE, 0xFE, + 0x07, 0x03, 0x00, 0x08, 0x02, 0x0E, 0x1F, 0xF1, 0xCF, 0xF9, 0x29, 0x1C, 0xD9, 0xDC, 0x26, 0x0E, + 0xE0, 0x15, 0x17, 0xDD, 0xD5, 0xDC, 0xF4, 0x1A, 0x16, 0xFD, 0xDE, 0xE3, 0x12, 0x15, 0x04, 0x11, + 0x0B, 0x05, 0x11, 0x07, 0xF4, 0xF9, 0x18, 0x1A, 0xED, 0xF7, 0x17, 0xF0, 0xD7, 0xF8, 0x04, 0xFE, + 0xED, 0xE1, 0xFC, 0x18, 0x0B, 0xF6, 0xF8, 0x02, 0x03, 0xFB, 0xF4, 0xFD, 0x05, 0x03, 0x0C, 0x17, + 0x10, 0x0D, 0x0D, 0x00, 0xFC, 0x04, 0x0A, 0x05, 0xF7, 0xF2, 0x07, 0x12, 0xF8, 0xEC, 0xFD, 0xFE, + 0xF7, 0xF4, 0xF0, 0xFC, 0x01, 0xFC, 0x01, 0xFA, 0x04, 0x20, 0xF7, 0xD0, 0xFC, 0x29, 0x20, 0xE4, + 0xD8, 0x21, 0x18, 0xE2, 0x12, 0x20, 0xE2, 0xD5, 0xE3, 0xFC, 0x1C, 0x15, 0xFF, 0xE4, 0xE5, 0x0F, + 0x0C, 0xF8, 0x12, 0x13, 0x05, 0x0D, 0xFB, 0xE5, 0xFC, 0x21, 0x19, 0xED, 0xF4, 0x0E, 0xEA, 0xD9, + 0x02, 0x09, 0xF8, 0xF3, 0xED, 0x00, 0x1D, 0x0E, 0xF5, 0xFB, 0x02, 0x04, 0x01, 0xF2, 0xF8, 0x0B, + 0x07, 0x0A, 0x14, 0x0D, 0x0A, 0x06, 0xF9, 0xFC, 0x04, 0x02, 0x00, 0xF7, 0xF4, 0x07, 0x0D, 0xFE, + 0xF3, 0xFA, 0x00, 0xFB, 0xF2, 0xF2, 0xFC, 0x05, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xF9, 0x00, + 0x04, 0xFC, 0xFB, 0x07, 0x0D, 0x08, 0x04, 0x04, 0x03, 0x03, 0x00, 0x00, 0x03, 0x01, 0x00, 0xFE, + 0x00, 0x12, 0xFF, 0xCC, 0xDB, 0x1C, 0x26, 0xE1, 0xD0, 0x1D, 0x18, 0xD9, 0x08, 0x25, 0xE8, 0xDC, + 0xDF, 0xDC, 0x12, 0x29, 0x05, 0xEC, 0xE8, 0xFE, 0x0C, 0x07, 0x14, 0x17, 0x0B, 0x0D, 0x06, 0xF9, + 0xF5, 0x08, 0x17, 0xF4, 0xEA, 0x0F, 0xFA, 0xD2, 0xED, 0x05, 0xFF, 0xF1, 0xE6, 0xF5, 0x10, 0x11, + 0xFD, 0xF3, 0x00, 0x0A, 0x01, 0xFB, 0xFF, 0x05, 0x08, 0x0C, 0x15, 0x13, 0x0C, 0x0B, 0x00, 0xFC, + 0x04, 0x07, 0x04, 0xFB, 0xEF, 0xFE, 0x0F, 0xFF, 0xEF, 0xF8, 0xFA, 0xF5, 0xF5, 0xF4, 0xFD, 0x03, + 0xFD, 0x03, 0x00, 0xFD, 0x1A, 0x06, 0xCE, 0xE3, 0x20, 0x24, 0xE9, 0xCF, 0x15, 0x23, 0xE4, 0x00, + 0x23, 0xEC, 0xD7, 0xE4, 0xEF, 0x15, 0x1D, 0x02, 0xEE, 0xE9, 0x05, 0x0D, 0xF8, 0x08, 0x16, 0x0C, + 0x10, 0x03, 0xE9, 0xF1, 0x15, 0x21, 0xF8, 0xEA, 0x0C, 0xF5, 0xD2, 0xFA, 0x0E, 0xFC, 0xF7, 0xF0, + 0xF8, 0x16, 0x15, 0xFC, 0xF7, 0x00, 0x05, 0x04, 0xF9, 0xF6, 0x05, 0x0A, 0x07, 0x12, 0x12, 0x0A, + 0x08, 0xFF, 0xFA, 0x01, 0x04, 0x04, 0xFC, 0xF2, 0x04, 0x11, 0x00, 0xF2, 0xF7, 0xFD, 0xFA, 0xF4, + 0xF2, 0xFB, 0x05, 0x03, 0x00, 0x01, 0xFF, 0x03, 0x05, 0xF9, 0xFF, 0x05, 0xF9, 0xFC, 0x06, 0xF7, + } ; + +unsigned char snd_explode[1364] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0x00, 0x06, 0x10, 0x1C, 0x22, + 0x2C, 0x3B, 0x3F, 0x3D, 0x3F, 0x35, 0x16, 0xF6, 0xD4, 0xC2, 0xC3, 0xC2, 0xC3, 0xC2, 0xC2, 0xC2, + 0xC2, 0xC1, 0xC3, 0xF5, 0x34, 0x3F, 0x3D, 0x3F, 0x3E, 0x3F, 0x3E, 0x3F, 0x31, 0xF6, 0xC0, 0xC3, + 0xC4, 0xC0, 0xC8, 0xC0, 0xCA, 0xC0, 0xC3, 0x1A, 0x3F, 0x38, 0x3F, 0x3D, 0x3F, 0x3F, 0x3F, 0x2D, + 0xEB, 0xC0, 0xC4, 0xC2, 0xC1, 0xC7, 0xC0, 0xCA, 0xC0, 0xC5, 0x28, 0x3F, 0x2E, 0x3F, 0x36, 0x3F, + 0x3F, 0xFC, 0xCB, 0xC0, 0xC6, 0xC0, 0xC3, 0xC5, 0xC0, 0xCA, 0xC0, 0xEC, 0x3D, 0x3F, 0x3B, 0x3F, + 0x3F, 0x35, 0xFA, 0xC4, 0xC1, 0xC5, 0xC0, 0xC7, 0xC0, 0xC4, 0xC7, 0xC1, 0x05, 0x3F, 0x3A, 0x3E, + 0x3F, 0x3F, 0x21, 0xE1, 0xC2, 0xC4, 0xC1, 0xC2, 0xC5, 0xC0, 0xCB, 0xC0, 0xC9, 0x29, 0x3F, 0x33, + 0x3F, 0x38, 0x2B, 0xFE, 0xD1, 0xC8, 0xC0, 0xC6, 0xC0, 0xC2, 0xC6, 0xC0, 0xE3, 0x1A, 0x3B, 0x3E, + 0x3F, 0x3F, 0x26, 0x05, 0xE1, 0xC8, 0xC2, 0xC2, 0xC4, 0xC0, 0xC7, 0xC0, 0xC6, 0x06, 0x2A, 0x32, + 0x3F, 0x37, 0x29, 0x10, 0xF3, 0xDC, 0xC6, 0xC4, 0xC1, 0xC2, 0xC5, 0xC0, 0xDD, 0x01, 0x0F, 0x22, + 0x2E, 0x2E, 0x28, 0x16, 0x04, 0xF0, 0xDF, 0xD1, 0xC9, 0xC6, 0xCA, 0xD4, 0xE1, 0xF0, 0x00, 0x0E, + 0x1C, 0x21, 0x20, 0x18, 0x0C, 0x00, 0xF2, 0xE5, 0xDA, 0xD3, 0xD2, 0xD4, 0xDB, 0xE6, 0xF3, 0x00, + 0x08, 0x0E, 0x10, 0x0E, 0x09, 0x00, 0xF5, 0xEC, 0xE4, 0xE0, 0xDF, 0xDF, 0xE2, 0xE7, 0xED, 0xF5, + 0xFA, 0xFB, 0xFC, 0xFB, 0xFA, 0xF9, 0xF4, 0xF0, 0xEB, 0xE8, 0xE7, 0xE7, 0xE8, 0xE9, 0xEC, 0xF0, + 0xF6, 0xFB, 0xFB, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF4, 0xEF, 0xEE, 0xEF, 0xF1, 0xF2, 0xF4, 0xF5, + 0xF8, 0xFC, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFC, 0xFA, 0xF8, 0xF7, 0xF8, 0xF9, + 0xFA, 0xFC, 0xFE, 0x00, 0x01, 0x03, 0x05, 0x04, 0x05, 0x05, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, + 0x02, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x06, 0x06, + 0x06, 0x06, 0x05, 0x06, 0x06, 0x07, 0x06, 0x06, 0x08, 0x08, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x02, 0x03, + 0x04, 0x04, 0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x04, 0x04, 0x05, 0x04, 0x04, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFE, + 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFD, 0xFC, 0xFB, 0xFB, 0xFB, + 0xFC, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFC, + 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFD, 0xFC, 0xFC, 0xFB, + 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, + 0xFD, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFE, + 0xFD, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, + 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x03, 0x03, 0x01, 0x00, 0x00, 0xFF, + 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, + 0x00, 0xFF, 0xFE, 0xFD, 0xFD, 0xFD, 0xFE, 0xFD, 0xFF, 0x00, 0x01, 0x03, 0x05, 0x06, 0x07, 0x06, + 0x06, 0x05, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x03, + 0x03, 0x04, 0x03, 0x03, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, 0xFF, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, + 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0x00, 0x01, + 0x02, 0x03, 0x02, 0x03, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFC, 0xFD, 0xFD, 0xFE, 0x00, 0x00, + 0x02, 0x03, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFE, 0xFC, 0xFC, 0xFB, 0xFC, 0xFD, 0xFF, 0x00, + 0x01, 0x03, 0x05, 0x06, 0x05, 0x05, 0x02, 0x00, 0xFE, 0xFC, 0xFB, 0xFA, 0xFA, 0xFB, 0xFD, 0xFF, + 0x01, 0x02, 0x05, 0x07, 0x07, 0x07, 0x05, 0x04, 0x01, 0x00, 0xFD, 0xFB, 0xFA, 0xF9, 0xFA, 0xFC, + 0xFE, 0x00, 0x03, 0x05, 0x07, 0x07, 0x06, 0x06, 0x03, 0x01, 0xFF, 0xFC, 0xFA, 0xF9, 0xF9, 0xF9, + 0xFB, 0xFE, 0x00, 0x02, 0x05, 0x07, 0x08, 0x08, 0x06, 0x05, 0x02, 0x00, 0xFE, 0xFC, 0xFA, 0xF9, + 0xF9, 0xFB, 0xFD, 0xFF, 0x00, 0x02, 0x05, 0x06, 0x06, 0x06, 0x05, 0x03, 0x01, 0x00, 0xFE, 0xFC, + 0xFB, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x02, 0x04, 0x05, 0x06, 0x06, 0x05, 0x04, 0x02, 0x01, 0x00, + 0xFF, 0xFD, 0xFC, 0xFD, 0xFC, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x04, 0x05, 0x05, 0x05, 0x04, 0x03, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x03, + 0x02, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0xFD, 0xFD, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, + 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x03, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFD, 0xFD, 0xFE, 0xFD, 0xFF, 0xFF, + 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFD, 0xFE, 0xFE, 0xFF, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x02, 0x03, + } ; + +unsigned char snd_letsgo[9929] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, + 0xFF, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFD, 0xFE, + 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFD, 0xFE, 0xFF, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x01, + 0x00, 0xFE, 0xFC, 0xFB, 0xFA, 0xFA, 0xFC, 0xFD, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, + 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0xFF, 0xFD, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFE, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFC, 0xFB, 0xFB, 0xFC, 0xFD, 0xFF, + 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFC, 0xFB, 0xFB, 0xFB, + 0xFC, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFF, 0x00, + 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFB, 0xFA, + 0xFA, 0xFB, 0xFB, 0xFC, 0xFF, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFE, + 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFE, + 0xFC, 0xFA, 0xFB, 0xFB, 0xFB, 0xFC, 0xFD, 0xFF, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xFF, + 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x00, + 0x00, 0xFF, 0xFD, 0xFB, 0xFB, 0xFA, 0xFB, 0xFB, 0xFC, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x04, 0x03, 0x03, + 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFB, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFF, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFB, 0xFA, 0xFA, 0xFB, 0xFB, 0xFD, 0xFE, + 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xFA, + 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, + 0x00, 0x01, 0x03, 0x03, 0x04, 0x04, 0x04, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFC, 0xFB, + 0xFA, 0xFA, 0xFA, 0xFB, 0xFC, 0xFE, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, + 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x03, 0x04, 0x04, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, + 0xFE, 0xFD, 0xFB, 0xFA, 0xFA, 0xFA, 0xFA, 0xFC, 0xFD, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, + 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFE, 0xFF, 0x00, 0x02, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x03, + 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFB, 0xFA, 0xFA, 0xFA, 0xFB, 0xFC, 0xFF, 0x00, 0x01, 0x02, + 0x02, 0x02, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFD, 0xFC, 0xFB, 0xFB, 0xFA, 0xFB, 0xFC, 0xFD, + 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, + 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFB, + 0xFB, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFD, + 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFF, + 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, + 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, + 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFB, 0xFB, 0xFB, 0xFD, 0xFE, 0xFF, 0x00, 0x00, + 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, + 0x04, 0x04, 0x03, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFB, 0xFB, 0xFB, 0xFD, + 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFF, 0x00, 0x01, + 0x01, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFD, 0xFC, 0xFB, + 0xFB, 0xFB, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFE, + 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x03, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, + 0xFF, 0xFE, 0xFD, 0xFB, 0xFB, 0xFB, 0xFB, 0xFC, 0xFD, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, + 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x03, 0x03, 0x03, 0x03, + 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFB, 0xFB, 0xFA, 0xFB, 0xFC, 0xFC, 0xFE, 0xFF, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x04, 0x04, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFB, 0xFB, 0xFB, 0xFB, + 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, + 0xFC, 0xFB, 0xFB, 0xFB, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, + 0xFE, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x04, 0x04, 0x03, 0x03, 0x01, 0x00, + 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04, + 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFB, 0xFB, 0xFB, 0xFB, 0xFC, 0xFD, + 0xFF, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFE, 0xFF, 0x00, 0x01, + 0x02, 0x03, 0x03, 0x04, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFB, 0xFA, + 0xFB, 0xFB, 0xFB, 0xFC, 0xFE, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFD, + 0xFE, 0xFE, 0xFF, 0x00, 0x02, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x01, 0x00, 0xFF, 0xFE, + 0xFE, 0xFD, 0xFB, 0xFA, 0xFA, 0xFB, 0xFC, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, + 0x00, 0x00, 0xFF, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x03, 0x04, 0x05, 0x04, 0x04, 0x04, 0x03, + 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFB, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, 0xFD, 0xFF, 0x00, 0x01, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0xFF, 0xFD, 0xFD, 0xFD, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0xFB, 0xFA, 0xFA, 0xFA, 0xFB, 0xFB, + 0xFD, 0xFF, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFD, 0xFD, 0xFF, 0x00, + 0x01, 0x03, 0x04, 0x05, 0x05, 0x04, 0x04, 0x03, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFA, 0xF9, + 0xFA, 0xFA, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFC, + 0xFD, 0xFE, 0x00, 0x00, 0x02, 0x04, 0x05, 0x05, 0x05, 0x04, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, + 0xFD, 0xFB, 0xFA, 0xFA, 0xFA, 0xFA, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, + 0x00, 0xFE, 0xFC, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x04, 0x05, 0x06, 0x05, 0x04, 0x03, 0x03, 0x01, + 0x00, 0x00, 0xFF, 0xFD, 0xFB, 0xFB, 0xFB, 0xFA, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFD, 0xFC, 0xFD, 0xFF, 0x00, 0x02, 0x04, 0x05, 0x06, 0x05, 0x04, + 0x04, 0x02, 0x01, 0x00, 0xFF, 0xFD, 0xFC, 0xFA, 0xFB, 0xFA, 0xFA, 0xFB, 0xFD, 0xFE, 0x00, 0x00, + 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0xFF, 0xFD, 0xFC, 0xFC, 0xFE, 0x00, 0x01, 0x03, 0x06, 0x07, + 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFD, 0xFB, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFD, 0xFF, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFB, 0xFC, 0xFD, 0x00, 0x01, 0x03, + 0x06, 0x07, 0x06, 0x05, 0x05, 0x04, 0x02, 0x00, 0xFF, 0xFD, 0xFB, 0xFA, 0xF9, 0xF8, 0xFA, 0xFC, + 0xFD, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFD, 0xFC, 0xFB, 0xFC, 0xFE, 0x00, + 0x02, 0x04, 0x07, 0x07, 0x06, 0x06, 0x05, 0x03, 0x02, 0x00, 0xFD, 0xFA, 0xF9, 0xF8, 0xF8, 0xF9, + 0xFB, 0xFD, 0xFF, 0x00, 0x02, 0x02, 0x03, 0x03, 0x02, 0x01, 0x00, 0xFD, 0xFC, 0xFB, 0xFC, 0xFD, + 0x00, 0x02, 0x05, 0x07, 0x08, 0x06, 0x06, 0x06, 0x04, 0x01, 0xFF, 0xFC, 0xFA, 0xF8, 0xF7, 0xF8, + 0xFA, 0xFC, 0xFE, 0x00, 0x01, 0x03, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFE, 0xFC, 0xFB, 0xFC, 0xFD, + 0x00, 0x02, 0x05, 0x07, 0x07, 0x06, 0x06, 0x05, 0x04, 0x01, 0xFE, 0xFC, 0xF9, 0xF7, 0xF7, 0xF8, + 0xFA, 0xFC, 0xFE, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFD, 0xFC, 0xFC, 0xFD, 0xFF, + 0x02, 0x05, 0x07, 0x08, 0x07, 0x07, 0x06, 0x04, 0x00, 0xFD, 0xFB, 0xF8, 0xF7, 0xF7, 0xF9, 0xFA, + 0xFD, 0x00, 0x01, 0x02, 0x04, 0x03, 0x01, 0x00, 0xFF, 0xFD, 0xFB, 0xFB, 0xFC, 0xFE, 0x01, 0x04, + 0x07, 0x09, 0x09, 0x09, 0x07, 0x04, 0x00, 0xFD, 0xF9, 0xF7, 0xF5, 0xF5, 0xF8, 0xFB, 0xFD, 0x00, + 0x03, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0xFC, 0xFB, 0xFB, 0xFD, 0x00, 0x03, 0x06, 0x07, 0x09, + 0x09, 0x08, 0x04, 0x00, 0xFD, 0xFA, 0xF8, 0xF5, 0xF6, 0xF7, 0xFA, 0xFD, 0x00, 0x02, 0x03, 0x04, + 0x04, 0x02, 0x00, 0xFE, 0xFD, 0xFC, 0xFE, 0x00, 0x02, 0x05, 0x07, 0x09, 0x09, 0x07, 0x03, 0x00, + 0xFD, 0xF9, 0xF6, 0xF5, 0xF6, 0xF8, 0xFB, 0xFE, 0x00, 0x03, 0x04, 0x04, 0x03, 0x01, 0xFF, 0xFD, + 0xFC, 0xFD, 0x00, 0x02, 0x05, 0x07, 0x09, 0x09, 0x07, 0x02, 0xFF, 0xFC, 0xF8, 0xF5, 0xF4, 0xF6, + 0xF8, 0xFB, 0xFF, 0x02, 0x04, 0x05, 0x04, 0x03, 0x00, 0xFF, 0xFD, 0xFD, 0x00, 0x02, 0x04, 0x07, + 0x0A, 0x09, 0x06, 0x02, 0x00, 0xFC, 0xF7, 0xF4, 0xF4, 0xF5, 0xF7, 0xFB, 0xFF, 0x02, 0x04, 0x05, + 0x04, 0x03, 0x00, 0xFE, 0xFE, 0xFF, 0x01, 0x03, 0x07, 0x09, 0x09, 0x06, 0x03, 0x00, 0xFC, 0xF8, + 0xF6, 0xF5, 0xF5, 0xF7, 0xFA, 0xFE, 0x01, 0x03, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x06, 0x09, 0x09, 0x07, 0x03, 0x00, 0xFD, 0xF9, 0xF6, 0xF5, 0xF5, 0xF6, 0xF9, 0xFD, 0x00, 0x02, + 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0x04, 0x07, 0x09, 0x08, 0x05, 0x02, 0x00, 0xF9, 0xF4, + 0xF3, 0xF4, 0xF7, 0xFB, 0x00, 0x04, 0x04, 0x03, 0x01, 0xFF, 0xFB, 0xFA, 0x00, 0x06, 0x0C, 0x12, + 0x16, 0x0F, 0x00, 0xF6, 0xEF, 0xEC, 0xED, 0xF7, 0x01, 0x08, 0x09, 0x08, 0x03, 0xFA, 0xF2, 0xF2, + 0xF7, 0xFB, 0x03, 0x0F, 0x15, 0x15, 0x16, 0x13, 0x00, 0xED, 0xE8, 0xEC, 0xF0, 0xFB, 0x0A, 0x0E, + 0x06, 0xFF, 0xFA, 0xF2, 0xF0, 0xF7, 0xFF, 0x01, 0x04, 0x08, 0x0B, 0x0D, 0x12, 0x13, 0x07, 0xF7, + 0xED, 0xEC, 0xF1, 0xFA, 0x04, 0x0B, 0x06, 0xFE, 0xF8, 0xF4, 0xF2, 0xF9, 0x01, 0x04, 0x03, 0x06, + 0x08, 0x0D, 0x14, 0x15, 0x07, 0xF5, 0xEB, 0xEB, 0xF1, 0xFC, 0x07, 0x0C, 0x05, 0xFB, 0xF5, 0xF3, + 0xF3, 0xFB, 0x04, 0x06, 0x04, 0x07, 0x0B, 0x0F, 0x14, 0x0F, 0xFD, 0xED, 0xEB, 0xF0, 0xF9, 0x06, + 0x0E, 0x07, 0xFD, 0xF5, 0xF0, 0xEF, 0xF9, 0x04, 0x08, 0x06, 0x04, 0x08, 0x13, 0x1A, 0x13, 0xFF, + 0xEE, 0xE8, 0xEB, 0xF7, 0x07, 0x0E, 0x07, 0xFE, 0xF5, 0xEB, 0xEC, 0xFD, 0x0B, 0x0B, 0x05, 0x04, + 0x08, 0x12, 0x17, 0x0B, 0xF7, 0xEB, 0xEA, 0xEF, 0xFE, 0x0D, 0x0D, 0x01, 0xF9, 0xF1, 0xEC, 0xF2, + 0x00, 0x0A, 0x0A, 0x06, 0x07, 0x11, 0x18, 0x0F, 0xFA, 0xED, 0xEA, 0xEE, 0xFC, 0x0C, 0x0C, 0x02, + 0xFA, 0xEE, 0xE4, 0xEF, 0x04, 0x0D, 0x0D, 0x09, 0x04, 0x0E, 0x1B, 0x0D, 0xF3, 0xED, 0xEE, 0xEE, + 0xFF, 0x11, 0x0A, 0xFE, 0xF9, 0xEE, 0xE6, 0xF5, 0x06, 0x0D, 0x0E, 0x0A, 0x0A, 0x18, 0x15, 0xFB, + 0xEC, 0xED, 0xEC, 0xF9, 0x11, 0x11, 0x01, 0xFD, 0xF1, 0xDF, 0xEA, 0x03, 0x0E, 0x10, 0x10, 0x0F, + 0x16, 0x15, 0xFD, 0xE8, 0xEA, 0xEF, 0xF9, 0x0D, 0x13, 0x05, 0xFA, 0xF1, 0xE7, 0xEC, 0xFB, 0x08, + 0x10, 0x0F, 0x0F, 0x1B, 0x1A, 0xFC, 0xE4, 0xE7, 0xEE, 0xFA, 0x10, 0x16, 0x04, 0xF6, 0xF0, 0xEB, + 0xED, 0xFA, 0x0A, 0x12, 0x0C, 0x10, 0x22, 0x1A, 0xF6, 0xE2, 0xE5, 0xEA, 0xFB, 0x15, 0x16, 0x03, + 0xF6, 0xE9, 0xE3, 0xF0, 0x02, 0x0F, 0x14, 0x0D, 0x0D, 0x1C, 0x13, 0xEE, 0xE1, 0xEC, 0xEF, 0xFD, + 0x17, 0x14, 0xFE, 0xF5, 0xEF, 0xE5, 0xEE, 0x02, 0x0D, 0x12, 0x15, 0x1D, 0x21, 0x08, 0xE3, 0xDC, + 0xEA, 0xF4, 0x0A, 0x20, 0x11, 0xF9, 0xEF, 0xE1, 0xDF, 0xFF, 0x13, 0x0F, 0x15, 0x21, 0x19, 0x08, + 0xF4, 0xDE, 0xE0, 0xF6, 0x04, 0x13, 0x1A, 0x02, 0xEB, 0xE8, 0xE1, 0xE8, 0x0A, 0x18, 0x0A, 0x1A, + 0x30, 0x12, 0xEB, 0xE3, 0xDD, 0xE1, 0x03, 0x1C, 0x19, 0x0E, 0xFA, 0xDE, 0xDC, 0xED, 0xFE, 0x13, + 0x1E, 0x18, 0x20, 0x25, 0xFE, 0xD2, 0xD9, 0xEA, 0xF6, 0x16, 0x29, 0x0E, 0xF5, 0xE9, 0xD1, 0xD7, + 0x09, 0x1B, 0x0E, 0x25, 0x38, 0x13, 0xEA, 0xDE, 0xD4, 0xDB, 0x04, 0x21, 0x20, 0x17, 0xFC, 0xD3, + 0xCD, 0xE9, 0x00, 0x15, 0x27, 0x29, 0x24, 0x19, 0xF2, 0xCB, 0xD1, 0xED, 0x01, 0x1D, 0x2C, 0x11, + 0xF0, 0xDF, 0xD2, 0xDC, 0x08, 0x22, 0x1D, 0x2C, 0x39, 0x0D, 0xD5, 0xCC, 0xD8, 0xE4, 0x0B, 0x30, + 0x25, 0x08, 0xF4, 0xD5, 0xC8, 0xEE, 0x14, 0x18, 0x27, 0x3F, 0x25, 0xED, 0xD4, 0xCE, 0xCE, 0xF3, + 0x22, 0x2B, 0x1D, 0x0B, 0xE4, 0xC3, 0xD8, 0xFD, 0x0C, 0x23, 0x3F, 0x35, 0x0A, 0xE8, 0xCC, 0xC2, + 0xDF, 0x0C, 0x24, 0x2D, 0x21, 0xF4, 0xCA, 0xCE, 0xE8, 0x00, 0x1D, 0x39, 0x3A, 0x23, 0x00, 0xD5, + 0xC0, 0xD1, 0xF5, 0x14, 0x2C, 0x2D, 0x0A, 0xDF, 0xD0, 0xDB, 0xF0, 0x0F, 0x2C, 0x37, 0x31, 0x17, + 0xE9, 0xC4, 0xC6, 0xE0, 0xFF, 0x20, 0x32, 0x1C, 0xF4, 0xDC, 0xD6, 0xDF, 0xFF, 0x26, 0x38, 0x37, + 0x23, 0xF8, 0xCB, 0xC2, 0xD4, 0xF0, 0x13, 0x2F, 0x27, 0x05, 0xE9, 0xDB, 0xDC, 0xF0, 0x12, 0x2E, + 0x38, 0x2A, 0x07, 0xE0, 0xC8, 0xCC, 0xE4, 0x03, 0x1E, 0x27, 0x15, 0xF9, 0xE6, 0xE3, 0xED, 0x08, + 0x28, 0x32, 0x22, 0x07, 0xEA, 0xD4, 0xD1, 0xE3, 0xFD, 0x13, 0x1C, 0x11, 0x00, 0xF1, 0xEA, 0xF9, + 0x13, 0x21, 0x1D, 0x12, 0xFF, 0xE6, 0xDD, 0xE4, 0xEE, 0xFE, 0x0F, 0x10, 0x04, 0xFF, 0xF8, 0xF3, + 0x03, 0x1C, 0x20, 0x16, 0x09, 0xF5, 0xE4, 0xE4, 0xEB, 0xF4, 0x03, 0x0C, 0x07, 0x01, 0xFC, 0xF3, + 0xFB, 0x11, 0x1B, 0x17, 0x12, 0x04, 0xF0, 0xE7, 0xE8, 0xE9, 0xF4, 0x02, 0x03, 0x01, 0x07, 0x03, + 0xFB, 0x07, 0x18, 0x15, 0x0B, 0x06, 0xFC, 0xEF, 0xED, 0xF0, 0xF1, 0xF8, 0xFF, 0x00, 0x01, 0x03, + 0x01, 0x04, 0x0E, 0x11, 0x0D, 0x0A, 0x04, 0xFB, 0xF6, 0xF4, 0xF2, 0xF2, 0xF6, 0xF8, 0xF9, 0xFE, + 0x01, 0x03, 0x08, 0x0E, 0x0D, 0x08, 0x06, 0x03, 0xFE, 0xFD, 0xFD, 0xFB, 0xFB, 0xFC, 0xFB, 0xFA, + 0xFA, 0xFC, 0xFE, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x04, 0x05, 0x03, 0x00, + 0xFE, 0xFC, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0x00, 0x01, 0x02, 0x02, 0x04, 0x05, 0x05, + 0x03, 0x01, 0xFF, 0xFD, 0xFC, 0xFD, 0xFE, 0xFF, 0xFF, 0xFE, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x02, + 0x04, 0x03, 0x02, 0x01, 0xFF, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFD, 0xFD, 0xFE, 0xFF, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0xFF, 0xFE, + 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x01, 0x03, 0x02, 0x01, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x02, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0x00, 0xFE, 0xFD, 0xFE, 0xFD, 0xFC, 0xFD, 0xFF, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, + 0x00, 0x00, 0x01, 0x01, 0x03, 0x02, 0x00, 0xFF, 0xFE, 0xFD, 0xFB, 0xFB, 0xFC, 0xFE, 0xFE, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x02, 0x02, 0x03, + 0x05, 0x05, 0x01, 0x00, 0xFE, 0xFC, 0xFB, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x02, + 0x00, 0xFF, 0xFD, 0xFD, 0xFD, 0xFD, 0x00, 0x03, 0x04, 0x03, 0x01, 0xFF, 0xFC, 0xFB, 0xFD, 0x00, + 0x02, 0x05, 0x04, 0x02, 0xFF, 0xFE, 0x00, 0x02, 0x02, 0xFF, 0xFC, 0xFA, 0xFC, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xFE, 0xFD, 0xFF, 0xFE, 0xFD, 0xFE, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFB, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0xFB, 0xF9, 0xFC, 0xFE, 0xFE, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0xFE, + 0xFE, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFD, 0xFE, 0xFF, 0xFD, 0xFD, 0x00, 0x02, 0x02, + 0x01, 0x01, 0x01, 0xFF, 0xFD, 0xFE, 0x00, 0x00, 0xFE, 0xFD, 0x00, 0x02, 0x00, 0xFF, 0x00, 0x00, + 0xFF, 0x00, 0x03, 0x03, 0x00, 0x01, 0x04, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, + 0xF8, 0x00, 0x05, 0x01, 0xFC, 0xFE, 0x02, 0x00, 0xFE, 0x02, 0x05, 0x00, 0xFC, 0xFD, 0x01, 0x01, + 0x00, 0x00, 0x03, 0x00, 0xFC, 0xFD, 0x04, 0x07, 0x01, 0xFD, 0xFE, 0x00, 0x00, 0x01, 0x04, 0x03, + 0xFE, 0xFA, 0xFB, 0xFF, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x01, 0x02, + 0x00, 0xFB, 0xF8, 0xFE, 0x07, 0x0A, 0x04, 0xFE, 0xFC, 0xFF, 0x01, 0xFF, 0xFB, 0xFB, 0xFF, 0x02, + 0x03, 0x00, 0xFF, 0x01, 0x02, 0x00, 0xFC, 0xFC, 0xFF, 0x02, 0x03, 0x03, 0x03, 0x02, 0x01, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFE, 0xFF, 0xFE, 0xFE, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x02, 0x03, 0x05, 0x08, 0x0A, 0x0B, + 0x08, 0x03, 0xFF, 0xFC, 0xF8, 0xF3, 0xF1, 0xF2, 0xF6, 0xF9, 0xFD, 0x01, 0x06, 0x09, 0x09, 0x07, + 0x04, 0x01, 0xFE, 0xF9, 0xF2, 0xEE, 0xF2, 0xFB, 0x03, 0x0A, 0x11, 0x16, 0x1A, 0x1B, 0x14, 0x07, + 0xFA, 0xF0, 0xE9, 0xE4, 0xE2, 0xE6, 0xEF, 0xFC, 0x05, 0x0C, 0x12, 0x15, 0x13, 0x0C, 0x02, 0xFA, + 0xF4, 0xEE, 0xE6, 0xE4, 0xED, 0xFF, 0x0E, 0x17, 0x1D, 0x21, 0x24, 0x23, 0x16, 0x00, 0xEA, 0xDE, + 0xD9, 0xD8, 0xDB, 0xE7, 0xF9, 0x0A, 0x15, 0x1A, 0x1B, 0x17, 0x0E, 0x01, 0xF3, 0xE9, 0xE4, 0xE1, + 0xE3, 0xED, 0x00, 0x14, 0x21, 0x24, 0x25, 0x25, 0x23, 0x15, 0xFD, 0xE3, 0xD6, 0xD6, 0xDB, 0xE1, + 0xEE, 0x00, 0x13, 0x1D, 0x1C, 0x15, 0x0C, 0x03, 0xF8, 0xEB, 0xE3, 0xE4, 0xEB, 0xF1, 0xF8, 0x03, + 0x13, 0x22, 0x26, 0x22, 0x1D, 0x19, 0x0F, 0xF8, 0xDF, 0xD3, 0xD7, 0xE4, 0xEF, 0xF8, 0x05, 0x15, + 0x1E, 0x19, 0x0B, 0x00, 0xF9, 0xF3, 0xEC, 0xE7, 0xE8, 0xF0, 0xF9, 0x01, 0x0D, 0x1B, 0x25, 0x26, + 0x20, 0x18, 0x0C, 0xF8, 0xE0, 0xD2, 0xD5, 0xE3, 0xF4, 0x00, 0x09, 0x14, 0x1B, 0x16, 0x08, 0xFA, + 0xF0, 0xED, 0xED, 0xEE, 0xEF, 0xF4, 0xFD, 0x07, 0x13, 0x1D, 0x21, 0x22, 0x20, 0x16, 0x01, 0xE9, + 0xD7, 0xD5, 0xDF, 0xEE, 0xFD, 0x07, 0x12, 0x19, 0x17, 0x0B, 0xFC, 0xF1, 0xED, 0xEE, 0xF1, 0xF1, + 0xF3, 0xF8, 0x03, 0x12, 0x1D, 0x23, 0x22, 0x1E, 0x15, 0x00, 0xE5, 0xD3, 0xD4, 0xE3, 0xF4, 0x00, + 0x09, 0x13, 0x19, 0x13, 0x04, 0xF5, 0xED, 0xED, 0xF1, 0xF3, 0xF4, 0xF9, 0x03, 0x11, 0x19, 0x1C, + 0x1E, 0x20, 0x1A, 0x03, 0xE6, 0xD3, 0xD5, 0xE5, 0xF6, 0x00, 0x08, 0x11, 0x16, 0x0F, 0x00, 0xF0, + 0xEA, 0xEE, 0xF5, 0xF8, 0xF9, 0xFD, 0x07, 0x12, 0x19, 0x1C, 0x1D, 0x1D, 0x12, 0xFA, 0xDF, 0xD3, + 0xDB, 0xEF, 0xFF, 0x06, 0x0D, 0x12, 0x11, 0x07, 0xF7, 0xEA, 0xE9, 0xF1, 0xFA, 0xFE, 0x00, 0x04, + 0x0F, 0x18, 0x1D, 0x1E, 0x1C, 0x11, 0xFB, 0xE1, 0xD3, 0xDA, 0xEE, 0x00, 0x0B, 0x11, 0x13, 0x10, + 0x06, 0xF6, 0xE7, 0xE3, 0xED, 0xFB, 0x01, 0x02, 0x04, 0x0D, 0x19, 0x21, 0x23, 0x1D, 0x0D, 0xF4, + 0xDC, 0xD4, 0xDE, 0xF1, 0x03, 0x0E, 0x12, 0x12, 0x0C, 0x00, 0xF1, 0xE7, 0xE6, 0xF0, 0xFD, 0x04, + 0x04, 0x06, 0x0D, 0x1A, 0x24, 0x25, 0x17, 0xFB, 0xE0, 0xD6, 0xDD, 0xEE, 0xFF, 0x0B, 0x11, 0x13, + 0x0D, 0x00, 0xF0, 0xE5, 0xE5, 0xEF, 0xFD, 0x05, 0x09, 0x0B, 0x0F, 0x18, 0x22, 0x24, 0x13, 0xF4, + 0xD9, 0xD1, 0xE0, 0xF6, 0x06, 0x0E, 0x11, 0x13, 0x0D, 0xFE, 0xEB, 0xE1, 0xE4, 0xF2, 0x00, 0x07, + 0x0A, 0x0C, 0x12, 0x1B, 0x25, 0x22, 0x0B, 0xEA, 0xD3, 0xD3, 0xE7, 0xFD, 0x0A, 0x0F, 0x11, 0x0F, + 0x06, 0xF7, 0xE7, 0xE2, 0xEC, 0xFD, 0x0A, 0x0D, 0x0B, 0x0A, 0x11, 0x1F, 0x25, 0x15, 0xF2, 0xD4, + 0xD1, 0xE5, 0xFD, 0x0A, 0x0D, 0x0E, 0x0D, 0x07, 0xF7, 0xE5, 0xE0, 0xEA, 0xFB, 0x08, 0x0E, 0x0E, + 0x0F, 0x16, 0x21, 0x24, 0x13, 0xF1, 0xD2, 0xCC, 0xE2, 0xFE, 0x10, 0x15, 0x13, 0x0E, 0x06, 0xF6, + 0xE3, 0xDC, 0xE5, 0xF9, 0x08, 0x11, 0x11, 0x11, 0x19, 0x26, 0x26, 0x0C, 0xE3, 0xC8, 0xCD, 0xEA, + 0x07, 0x15, 0x15, 0x11, 0x0C, 0x02, 0xF0, 0xDF, 0xDC, 0xEC, 0x00, 0x0C, 0x0F, 0x0F, 0x14, 0x21, + 0x2A, 0x1E, 0xF9, 0xD2, 0xC4, 0xD8, 0xFA, 0x11, 0x17, 0x14, 0x0F, 0x07, 0xF9, 0xE4, 0xD8, 0xE2, + 0xF9, 0x0B, 0x13, 0x12, 0x11, 0x1A, 0x28, 0x26, 0x08, 0xDC, 0xC2, 0xCC, 0xF1, 0x10, 0x1A, 0x15, + 0x0E, 0x09, 0x00, 0xEB, 0xDA, 0xDC, 0xF0, 0x05, 0x13, 0x16, 0x13, 0x18, 0x27, 0x29, 0x0D, 0xE1, + 0xC2, 0xC8, 0xED, 0x12, 0x20, 0x17, 0x0B, 0x05, 0x00, 0xF1, 0xDB, 0xD5, 0xE9, 0x0A, 0x25, 0x24, + 0x11, 0x09, 0x19, 0x24, 0x10, 0xE3, 0xC1, 0xC8, 0xF5, 0x1F, 0x28, 0x14, 0xFF, 0xFB, 0xFE, 0xF4, + 0xDD, 0xD3, 0xE7, 0x0D, 0x2C, 0x2A, 0x10, 0x08, 0x1C, 0x24, 0x07, 0xDB, 0xC0, 0xCE, 0x00, 0x2A, + 0x2B, 0x0E, 0xF9, 0xFA, 0xFE, 0xF1, 0xD8, 0xD2, 0xEE, 0x1A, 0x34, 0x29, 0x0D, 0x0A, 0x1E, 0x1C, + 0xF5, 0xCB, 0xC1, 0xDE, 0x12, 0x37, 0x2A, 0x04, 0xF2, 0xF8, 0xFA, 0xE8, 0xD2, 0xD5, 0xFB, 0x28, + 0x37, 0x22, 0x0B, 0x12, 0x22, 0x0F, 0xDF, 0xC0, 0xC9, 0xF5, 0x27, 0x3B, 0x1F, 0xF7, 0xEE, 0xFA, + 0xF7, 0xE0, 0xD0, 0xE1, 0x0E, 0x35, 0x35, 0x18, 0x0B, 0x19, 0x1E, 0xFC, 0xCB, 0xC0, 0xD7, 0x0D, + 0x3B, 0x39, 0x0C, 0xEB, 0xEE, 0xF9, 0xF0, 0xDC, 0xD6, 0xF0, 0x1F, 0x3B, 0x2B, 0x0E, 0x0D, 0x1C, + 0x15, 0xF0, 0xC4, 0xC0, 0xE3, 0x1F, 0x3F, 0x2C, 0x00, 0xE8, 0xEF, 0xF9, 0xED, 0xD9, 0xDA, 0xFC, + 0x29, 0x3A, 0x22, 0x0B, 0x11, 0x1D, 0x0F, 0xE7, 0xC0, 0xC0, 0xF1, 0x2D, 0x3F, 0x1F, 0xF6, 0xE7, + 0xF1, 0xF8, 0xEB, 0xD8, 0xDF, 0x04, 0x2E, 0x35, 0x1A, 0x09, 0x15, 0x1D, 0x08, 0xE0, 0xC0, 0xC2, + 0xF8, 0x34, 0x3F, 0x18, 0xF1, 0xE8, 0xF4, 0xFA, 0xEA, 0xD8, 0xE3, 0x0A, 0x30, 0x31, 0x16, 0x08, + 0x16, 0x1F, 0x08, 0xDF, 0xC0, 0xC4, 0xFA, 0x35, 0x3D, 0x15, 0xF1, 0xE9, 0xF4, 0xF9, 0xE9, 0xD7, + 0xE3, 0x0A, 0x2E, 0x30, 0x17, 0x09, 0x17, 0x22, 0x0A, 0xDF, 0xC0, 0xC2, 0xF6, 0x32, 0x3E, 0x19, + 0xF6, 0xEC, 0xF4, 0xF8, 0xE9, 0xD6, 0xDF, 0x05, 0x2A, 0x31, 0x1C, 0x09, 0x12, 0x24, 0x11, 0xE1, + 0xC0, 0xC3, 0xED, 0x24, 0x3C, 0x24, 0xFE, 0xED, 0xF3, 0xFA, 0xEF, 0xDA, 0xDA, 0xFA, 0x1F, 0x31, + 0x24, 0x0D, 0x0D, 0x21, 0x1B, 0xF1, 0xC9, 0xC1, 0xDB, 0x0D, 0x37, 0x33, 0x0D, 0xF2, 0xF1, 0xF7, + 0xF3, 0xE2, 0xD9, 0xEA, 0x0F, 0x2C, 0x2C, 0x17, 0x0A, 0x16, 0x21, 0x0C, 0xE2, 0xC0, 0xC0, 0xEA, + 0x22, 0x39, 0x21, 0x00, 0xF1, 0xF3, 0xF7, 0xEF, 0xDD, 0xDB, 0xF7, 0x1B, 0x2D, 0x26, 0x10, 0x0A, + 0x1C, 0x21, 0x00, 0xD3, 0xC0, 0xCF, 0xFA, 0x29, 0x37, 0x19, 0xF9, 0xF0, 0xF6, 0xFA, 0xEE, 0xDC, + 0xDF, 0xFE, 0x21, 0x2E, 0x21, 0x0A, 0x07, 0x1C, 0x23, 0x01, 0xD3, 0xC0, 0xCB, 0xFD, 0x2D, 0x34, + 0x14, 0xF6, 0xEF, 0xF8, 0xFD, 0xF0, 0xDC, 0xDE, 0xFE, 0x20, 0x2E, 0x20, 0x08, 0x07, 0x1C, 0x23, + 0x07, 0xDD, 0xC0, 0xC5, 0xF5, 0x29, 0x34, 0x15, 0xF8, 0xF2, 0xFB, 0x00, 0xF2, 0xDC, 0xDA, 0xF7, + 0x19, 0x29, 0x1F, 0x07, 0x02, 0x19, 0x29, 0x15, 0xE9, 0xC5, 0xC0, 0xE2, 0x15, 0x2F, 0x1D, 0x00, + 0xF6, 0xFC, 0x01, 0xFA, 0xE6, 0xDB, 0xEB, 0x08, 0x1F, 0x20, 0x11, 0x06, 0x11, 0x27, 0x26, 0x05, + 0xD9, 0xC0, 0xC8, 0xF3, 0x1D, 0x27, 0x14, 0x00, 0xFC, 0x00, 0x00, 0xF3, 0xE0, 0xDD, 0xF0, 0x0C, + 0x1F, 0x1D, 0x0F, 0x08, 0x14, 0x27, 0x24, 0x00, 0xD2, 0xC0, 0xCC, 0xF5, 0x1A, 0x24, 0x13, 0x00, + 0xFF, 0x03, 0x01, 0xF2, 0xE0, 0xDC, 0xEF, 0x09, 0x1A, 0x1B, 0x12, 0x0C, 0x16, 0x27, 0x24, 0x02, + 0xD9, 0xC2, 0xC8, 0xEB, 0x14, 0x26, 0x1A, 0x07, 0x01, 0x02, 0x00, 0xF3, 0xDE, 0xD6, 0xEA, 0x0B, + 0x21, 0x21, 0x10, 0x02, 0x08, 0x20, 0x2C, 0x15, 0xE6, 0xC1, 0xC0, 0xE2, 0x0D, 0x22, 0x1A, 0x05, + 0xFD, 0x02, 0x07, 0xFE, 0xE9, 0xDC, 0xE4, 0xFB, 0x0F, 0x15, 0x11, 0x0C, 0x0F, 0x1E, 0x29, 0x1F, + 0xFD, 0xD4, 0xC0, 0xCC, 0xEF, 0x0E, 0x1A, 0x14, 0x0A, 0x06, 0x06, 0x00, 0xF0, 0xDE, 0xDA, 0xEB, + 0x07, 0x1B, 0x1D, 0x11, 0x05, 0x07, 0x17, 0x25, 0x1D, 0xFB, 0xD3, 0xC2, 0xD3, 0xF8, 0x13, 0x18, + 0x0C, 0x01, 0x02, 0x08, 0x05, 0xF5, 0xE2, 0xDE, 0xEC, 0x01, 0x11, 0x13, 0x0E, 0x0B, 0x11, 0x20, + 0x29, 0x1D, 0xFC, 0xD4, 0xC1, 0xCD, 0xED, 0x0B, 0x17, 0x13, 0x0B, 0x08, 0x08, 0x01, 0xF2, 0xE0, + 0xDB, 0xE9, 0x02, 0x17, 0x1B, 0x12, 0x06, 0x06, 0x14, 0x26, 0x25, 0x08, 0xE2, 0xC8, 0xCC, 0xE7, + 0x03, 0x11, 0x0D, 0x06, 0x05, 0x0A, 0x0B, 0xFF, 0xEA, 0xDB, 0xE1, 0xF8, 0x10, 0x1A, 0x14, 0x08, + 0x03, 0x0E, 0x21, 0x2A, 0x1A, 0xF6, 0xD3, 0xC6, 0xD5, 0xF2, 0x08, 0x0F, 0x0B, 0x09, 0x0B, 0x0D, + 0x07, 0xF6, 0xE2, 0xDC, 0xE9, 0x00, 0x13, 0x19, 0x11, 0x07, 0x07, 0x15, 0x24, 0x25, 0x0F, 0xEA, + 0xCB, 0xC7, 0xDC, 0xF9, 0x0B, 0x0E, 0x0A, 0x09, 0x0C, 0x0E, 0x04, 0xF1, 0xDE, 0xDC, 0xED, 0x05, + 0x15, 0x17, 0x10, 0x09, 0x0B, 0x17, 0x22, 0x1F, 0x09, 0xE9, 0xD0, 0xCC, 0xDF, 0xF9, 0x09, 0x0F, + 0x0D, 0x0B, 0x0C, 0x0B, 0x02, 0xF1, 0xE0, 0xDD, 0xEB, 0x03, 0x16, 0x1A, 0x11, 0x08, 0x07, 0x12, + 0x1F, 0x21, 0x0D, 0xEB, 0xD0, 0xCA, 0xDC, 0xF7, 0x09, 0x0E, 0x0B, 0x09, 0x0A, 0x0B, 0x05, 0xF5, + 0xE3, 0xDC, 0xE9, 0xFF, 0x12, 0x19, 0x13, 0x0A, 0x07, 0x0F, 0x1C, 0x21, 0x15, 0xF9, 0xDA, 0xCC, + 0xD5, 0xEC, 0x01, 0x0B, 0x0B, 0x09, 0x0A, 0x0C, 0x0A, 0xFE, 0xEC, 0xDF, 0xE3, 0xF5, 0x09, 0x16, + 0x15, 0x0D, 0x07, 0x0A, 0x15, 0x1F, 0x1D, 0x0A, 0xEC, 0xD4, 0xCF, 0xDE, 0xF4, 0x04, 0x0A, 0x09, + 0x08, 0x0B, 0x0E, 0x09, 0xFB, 0xE9, 0xDF, 0xE7, 0xFA, 0x0D, 0x16, 0x12, 0x0A, 0x07, 0x0C, 0x17, + 0x1F, 0x1A, 0x05, 0xE9, 0xD5, 0xD3, 0xE2, 0xF4, 0x01, 0x06, 0x08, 0x0B, 0x0E, 0x0F, 0x07, 0xF7, + 0xE7, 0xE3, 0xEB, 0xFC, 0x0A, 0x11, 0x0F, 0x0A, 0x09, 0x0E, 0x17, 0x1E, 0x1A, 0x07, 0xEE, 0xD9, + 0xD4, 0xDD, 0xF0, 0x00, 0x06, 0x09, 0x0B, 0x0F, 0x0F, 0x0A, 0xFD, 0xEC, 0xE3, 0xE7, 0xF6, 0x06, + 0x10, 0x11, 0x0C, 0x08, 0x0C, 0x15, 0x1C, 0x1C, 0x0E, 0xF6, 0xDD, 0xD2, 0xD8, 0xE9, 0xFA, 0x05, + 0x09, 0x0B, 0x0D, 0x0F, 0x0C, 0x02, 0xF3, 0xE6, 0xE3, 0xEE, 0xFE, 0x0B, 0x11, 0x10, 0x0C, 0x0B, + 0x0F, 0x18, 0x1D, 0x18, 0x05, 0xEC, 0xD8, 0xD3, 0xDD, 0xF0, 0x00, 0x07, 0x09, 0x0A, 0x0D, 0x0F, + 0x0B, 0x00, 0xF1, 0xE7, 0xE7, 0xF2, 0x00, 0x0A, 0x0E, 0x0D, 0x0A, 0x0C, 0x12, 0x1A, 0x1E, 0x15, + 0x01, 0xE9, 0xD7, 0xD5, 0xE1, 0xF1, 0xFF, 0x05, 0x07, 0x0B, 0x10, 0x12, 0x0D, 0x00, 0xF0, 0xE5, + 0xE6, 0xF0, 0xFE, 0x08, 0x0D, 0x0D, 0x0C, 0x0E, 0x12, 0x18, 0x1B, 0x15, 0x05, 0xF0, 0xDD, 0xD6, + 0xDC, 0xEB, 0xFA, 0x04, 0x0A, 0x0D, 0x0F, 0x10, 0x0C, 0x02, 0xF5, 0xEA, 0xE6, 0xED, 0xF9, 0x04, + 0x0A, 0x0C, 0x0C, 0x0D, 0x11, 0x17, 0x1A, 0x18, 0x0C, 0xFA, 0xE5, 0xD9, 0xD8, 0xE3, 0xF3, 0x01, + 0x09, 0x0D, 0x0F, 0x10, 0x0E, 0x07, 0xFD, 0xF1, 0xE8, 0xE8, 0xF1, 0xFC, 0x06, 0x0C, 0x0D, 0x0D, + 0x0F, 0x13, 0x17, 0x18, 0x13, 0x06, 0xF3, 0xE1, 0xD8, 0xDC, 0xE9, 0xF9, 0x03, 0x09, 0x0B, 0x0E, + 0x0E, 0x0B, 0x05, 0xFB, 0xF0, 0xEA, 0xEB, 0xF3, 0xFD, 0x05, 0x0B, 0x0E, 0x0F, 0x10, 0x12, 0x15, + 0x16, 0x12, 0x07, 0xF5, 0xE3, 0xD9, 0xDB, 0xE8, 0xF8, 0x03, 0x08, 0x0A, 0x0D, 0x0E, 0x0E, 0x08, + 0xFD, 0xF1, 0xEA, 0xEA, 0xF2, 0xFC, 0x05, 0x0A, 0x0D, 0x0F, 0x10, 0x12, 0x14, 0x14, 0x12, 0x09, + 0xFB, 0xE9, 0xDD, 0xDB, 0xE4, 0xF2, 0xFF, 0x06, 0x0A, 0x0C, 0x0E, 0x0F, 0x0B, 0x01, 0xF7, 0xED, + 0xEA, 0xEE, 0xF7, 0xFF, 0x05, 0x0A, 0x0D, 0x0F, 0x11, 0x12, 0x13, 0x13, 0x0F, 0x05, 0xF5, 0xE5, + 0xDA, 0xDC, 0xE8, 0xF7, 0x01, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0A, 0x00, 0xF4, 0xEB, 0xEA, 0xF0, + 0xF9, 0x00, 0x06, 0x0A, 0x0C, 0x0F, 0x11, 0x13, 0x13, 0x12, 0x0D, 0x03, 0xF5, 0xE6, 0xDC, 0xDE, + 0xE9, 0xF7, 0x02, 0x08, 0x0B, 0x0D, 0x0F, 0x0E, 0x09, 0x00, 0xF4, 0xEB, 0xEA, 0xF0, 0xF8, 0xFF, + 0x04, 0x09, 0x0E, 0x11, 0x13, 0x13, 0x12, 0x12, 0x0D, 0x03, 0xF5, 0xE6, 0xDD, 0xDE, 0xE9, 0xF7, + 0x02, 0x07, 0x0A, 0x0D, 0x0E, 0x0D, 0x08, 0x00, 0xF6, 0xEE, 0xEC, 0xF0, 0xF8, 0xFE, 0x03, 0x07, + 0x0C, 0x10, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x08, 0xFD, 0xEE, 0xE1, 0xDD, 0xE4, 0xF1, 0xFD, 0x05, + 0x09, 0x0A, 0x0B, 0x0D, 0x0B, 0x05, 0xFD, 0xF4, 0xEE, 0xEF, 0xF5, 0xFB, 0xFE, 0x00, 0x06, 0x0B, + 0x10, 0x12, 0x12, 0x11, 0x10, 0x0F, 0x09, 0xFC, 0xEC, 0xE0, 0xDD, 0xE5, 0xF2, 0xFE, 0x04, 0x07, + 0x09, 0x0C, 0x0F, 0x0F, 0x08, 0xFD, 0xF3, 0xED, 0xEE, 0xF3, 0xF9, 0xFC, 0x00, 0x05, 0x0C, 0x12, + 0x15, 0x14, 0x13, 0x11, 0x0F, 0x08, 0xFC, 0xEB, 0xDE, 0xDB, 0xE2, 0xF0, 0xFE, 0x06, 0x09, 0x0B, + 0x0D, 0x10, 0x0F, 0x08, 0xFE, 0xF2, 0xEC, 0xED, 0xF1, 0xF7, 0xFC, 0x00, 0x05, 0x0C, 0x12, 0x14, + 0x13, 0x11, 0x0F, 0x0D, 0x09, 0xFF, 0xF1, 0xE3, 0xDC, 0xE1, 0xEE, 0xFB, 0x03, 0x08, 0x0A, 0x0C, + 0x0E, 0x0F, 0x0A, 0x01, 0xF6, 0xEE, 0xEC, 0xF0, 0xF6, 0xFB, 0xFF, 0x03, 0x09, 0x0F, 0x14, 0x15, + 0x13, 0x0F, 0x0D, 0x0A, 0x03, 0xF8, 0xEA, 0xDF, 0xDF, 0xE7, 0xF5, 0x00, 0x07, 0x09, 0x0A, 0x0C, + 0x0E, 0x0D, 0x07, 0xFD, 0xF3, 0xEE, 0xEE, 0xF4, 0xF9, 0xFD, 0xFF, 0x03, 0x0A, 0x11, 0x15, 0x13, + 0x0F, 0x0C, 0x0B, 0x09, 0x02, 0xF6, 0xE8, 0xDF, 0xE0, 0xEA, 0xF8, 0x01, 0x06, 0x08, 0x09, 0x0B, + 0x0E, 0x0D, 0x07, 0xFD, 0xF3, 0xEE, 0xF0, 0xF4, 0xF9, 0xFD, 0x00, 0x04, 0x0A, 0x11, 0x14, 0x12, + 0x0F, 0x0B, 0x0B, 0x09, 0x02, 0xF6, 0xE8, 0xDF, 0xE0, 0xEA, 0xF7, 0x00, 0x05, 0x06, 0x07, 0x0A, + 0x0D, 0x0E, 0x08, 0xFE, 0xF3, 0xEE, 0xEF, 0xF5, 0xFA, 0xFD, 0xFF, 0x02, 0x09, 0x10, 0x13, 0x12, + 0x0F, 0x0D, 0x0B, 0x09, 0x05, 0xFA, 0xEC, 0xE2, 0xE0, 0xE7, 0xF4, 0xFE, 0x03, 0x06, 0x08, 0x0A, + 0x0E, 0x0F, 0x0A, 0x01, 0xF7, 0xF1, 0xEF, 0xF3, 0xF8, 0xFA, 0xFC, 0xFF, 0x05, 0x0D, 0x12, 0x14, + 0x10, 0x0C, 0x0B, 0x0B, 0x09, 0x01, 0xF5, 0xE7, 0xE0, 0xE3, 0xED, 0xF9, 0x00, 0x04, 0x05, 0x07, + 0x0B, 0x10, 0x0F, 0x09, 0xFE, 0xF5, 0xF0, 0xF0, 0xF4, 0xF8, 0xFB, 0xFD, 0x01, 0x09, 0x10, 0x14, + 0x13, 0x10, 0x0C, 0x0B, 0x0A, 0x06, 0xFD, 0xEF, 0xE3, 0xDF, 0xE5, 0xF1, 0xFD, 0x02, 0x04, 0x06, + 0x09, 0x0E, 0x11, 0x0E, 0x05, 0xFA, 0xF1, 0xEF, 0xF2, 0xF7, 0xFA, 0xFB, 0xFD, 0x02, 0x0B, 0x13, + 0x16, 0x13, 0x0E, 0x0A, 0x09, 0x09, 0x05, 0xFC, 0xEE, 0xE3, 0xE0, 0xE6, 0xF3, 0xFE, 0x02, 0x03, + 0x05, 0x09, 0x0D, 0x10, 0x0D, 0x04, 0xF9, 0xF1, 0xF0, 0xF3, 0xF7, 0xFA, 0xFB, 0xFE, 0x03, 0x0B, + 0x13, 0x15, 0x11, 0x0C, 0x09, 0x09, 0x0A, 0x07, 0xFE, 0xF1, 0xE4, 0xE0, 0xE7, 0xF2, 0xFC, 0x01, + 0x02, 0x04, 0x06, 0x0C, 0x0F, 0x0E, 0x06, 0xFC, 0xF3, 0xF0, 0xF3, 0xF7, 0xFA, 0xFC, 0xFD, 0x01, + 0x08, 0x10, 0x13, 0x10, 0x0C, 0x09, 0x09, 0x0A, 0x09, 0x01, 0xF5, 0xE9, 0xE2, 0xE5, 0xED, 0xF9, + 0x00, 0x02, 0x02, 0x05, 0x0A, 0x0F, 0x0F, 0x0A, 0x00, 0xF7, 0xF3, 0xF3, 0xF6, 0xF9, 0xFA, 0xFB, + 0xFE, 0x04, 0x0C, 0x11, 0x12, 0x0E, 0x0A, 0x09, 0x0A, 0x0A, 0x06, 0xFD, 0xEF, 0xE4, 0xE2, 0xE8, + 0xF3, 0xFC, 0x00, 0x01, 0x03, 0x07, 0x0C, 0x10, 0x0F, 0x08, 0xFE, 0xF5, 0xF2, 0xF4, 0xF8, 0xFA, + 0xFA, 0xFC, 0x00, 0x06, 0x0E, 0x12, 0x11, 0x0D, 0x0A, 0x09, 0x0B, 0x0A, 0x04, 0xF9, 0xEC, 0xE3, + 0xE3, 0xEA, 0xF5, 0xFD, 0x00, 0x01, 0x04, 0x08, 0x0E, 0x11, 0x0D, 0x05, 0xFC, 0xF4, 0xF2, 0xF4, + 0xF7, 0xF8, 0xFA, 0xFC, 0x00, 0x08, 0x10, 0x12, 0x10, 0x0C, 0x0A, 0x09, 0x0A, 0x0A, 0x02, 0xF6, + 0xEA, 0xE2, 0xE4, 0xED, 0xF7, 0xFE, 0x00, 0x01, 0x04, 0x08, 0x0E, 0x11, 0x0D, 0x03, 0xFA, 0xF4, + 0xF2, 0xF5, 0xF8, 0xF9, 0xFA, 0xFC, 0x00, 0x09, 0x11, 0x13, 0x10, 0x0C, 0x09, 0x09, 0x0B, 0x09, + 0x02, 0xF7, 0xEA, 0xE3, 0xE4, 0xED, 0xF7, 0xFE, 0x00, 0x01, 0x03, 0x08, 0x0F, 0x10, 0x0C, 0x04, + 0xFB, 0xF4, 0xF3, 0xF6, 0xF8, 0xF8, 0xF8, 0xFB, 0x00, 0x08, 0x0F, 0x12, 0x10, 0x0B, 0x08, 0x09, + 0x0A, 0x0A, 0x04, 0xFA, 0xED, 0xE4, 0xE4, 0xEB, 0xF6, 0xFD, 0x00, 0x00, 0x03, 0x07, 0x0D, 0x11, + 0x0F, 0x07, 0xFE, 0xF6, 0xF3, 0xF5, 0xF7, 0xF9, 0xF8, 0xFA, 0xFE, 0x06, 0x0D, 0x12, 0x11, 0x0E, + 0x09, 0x08, 0x0A, 0x0A, 0x06, 0xFC, 0xEF, 0xE5, 0xE3, 0xE9, 0xF2, 0xFB, 0x00, 0x00, 0x01, 0x05, + 0x0C, 0x10, 0x10, 0x0A, 0x00, 0xF8, 0xF4, 0xF4, 0xF7, 0xF9, 0xF9, 0xF8, 0xFC, 0x02, 0x0A, 0x11, + 0x12, 0x0F, 0x0B, 0x09, 0x09, 0x0B, 0x08, 0x01, 0xF6, 0xEA, 0xE4, 0xE6, 0xEE, 0xF7, 0xFE, 0x00, + 0x00, 0x03, 0x09, 0x0F, 0x11, 0x0E, 0x06, 0xFD, 0xF6, 0xF3, 0xF5, 0xF8, 0xF8, 0xF8, 0xFA, 0xFE, + 0x05, 0x0D, 0x11, 0x0F, 0x0C, 0x09, 0x09, 0x0B, 0x0B, 0x07, 0xFF, 0xF2, 0xE7, 0xE4, 0xE9, 0xF1, + 0xF9, 0xFD, 0x00, 0x01, 0x04, 0x0B, 0x10, 0x11, 0x0C, 0x03, 0xFB, 0xF5, 0xF4, 0xF6, 0xF8, 0xF7, + 0xF8, 0xFA, 0x00, 0x07, 0x0E, 0x11, 0x10, 0x0C, 0x09, 0x0A, 0x0B, 0x0B, 0x06, 0xFC, 0xF0, 0xE6, + 0xE4, 0xE9, 0xF2, 0xFA, 0xFF, 0x00, 0x02, 0x06, 0x0B, 0x11, 0x11, 0x0B, 0x02, 0xFA, 0xF5, 0xF3, + 0xF5, 0xF7, 0xF8, 0xF8, 0xFA, 0x00, 0x07, 0x0F, 0x11, 0x0F, 0x0B, 0x09, 0x09, 0x0A, 0x0A, 0x05, + 0xFC, 0xF0, 0xE7, 0xE5, 0xEA, 0xF3, 0xFA, 0xFF, 0x00, 0x01, 0x06, 0x0C, 0x11, 0x10, 0x0B, 0x02, + 0xFA, 0xF4, 0xF3, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0x07, 0x0E, 0x11, 0x0F, 0x0B, 0x09, 0x08, + 0x0A, 0x0A, 0x06, 0xFE, 0xF3, 0xE9, 0xE5, 0xEA, 0xF1, 0xF8, 0xFE, 0x00, 0x01, 0x05, 0x0A, 0x0F, + 0x11, 0x0D, 0x04, 0xFC, 0xF5, 0xF4, 0xF5, 0xF8, 0xF9, 0xF9, 0xFA, 0xFE, 0x03, 0x0B, 0x10, 0x10, + 0x0B, 0x08, 0x07, 0x09, 0x0A, 0x09, 0x03, 0xF9, 0xED, 0xE6, 0xE7, 0xED, 0xF4, 0xFB, 0xFE, 0x00, + 0x02, 0x07, 0x0D, 0x10, 0x0F, 0x09, 0x00, 0xF9, 0xF5, 0xF5, 0xF6, 0xF8, 0xF8, 0xF9, 0xFC, 0x00, + 0x08, 0x0D, 0x0F, 0x0D, 0x0A, 0x07, 0x07, 0x09, 0x0A, 0x07, 0x00, 0xF5, 0xEC, 0xE8, 0xEA, 0xF0, + 0xF7, 0xFC, 0xFF, 0x00, 0x03, 0x08, 0x0E, 0x10, 0x0D, 0x06, 0xFF, 0xF9, 0xF5, 0xF5, 0xF7, 0xF8, + 0xF8, 0xF9, 0xFD, 0x02, 0x08, 0x0D, 0x0E, 0x0C, 0x09, 0x07, 0x07, 0x09, 0x09, 0x05, 0xFE, 0xF4, + 0xEB, 0xE8, 0xEC, 0xF2, 0xF8, 0xFD, 0xFF, 0x00, 0x04, 0x09, 0x0D, 0x0F, 0x0B, 0x05, 0xFE, 0xF7, + 0xF5, 0xF6, 0xF7, 0xF9, 0xFA, 0xFA, 0xFD, 0x01, 0x08, 0x0D, 0x0D, 0x0B, 0x08, 0x06, 0x06, 0x08, + 0x09, 0x06, 0x00, 0xF7, 0xEE, 0xEB, 0xEC, 0xF2, 0xF8, 0xFC, 0xFE, 0x00, 0x02, 0x07, 0x0C, 0x0E, + 0x0C, 0x07, 0x00, 0xFA, 0xF7, 0xF7, 0xF8, 0xFA, 0xFA, 0xF9, 0xFB, 0x00, 0x06, 0x0B, 0x0D, 0x0C, + 0x08, 0x05, 0x06, 0x08, 0x09, 0x08, 0x02, 0xFA, 0xF1, 0xEC, 0xEC, 0xF0, 0xF6, 0xFA, 0xFD, 0xFF, + 0x01, 0x05, 0x0A, 0x0E, 0x0D, 0x08, 0x02, 0xFC, 0xF8, 0xF7, 0xF8, 0xFA, 0xFA, 0xFA, 0xFB, 0xFF, + 0x05, 0x09, 0x0C, 0x0B, 0x08, 0x05, 0x05, 0x06, 0x08, 0x08, 0x04, 0xFE, 0xF7, 0xF0, 0xED, 0xEF, + 0xF4, 0xF8, 0xFB, 0xFD, 0xFF, 0x02, 0x06, 0x0B, 0x0C, 0x0A, 0x05, 0x00, 0xFC, 0xFA, 0xFA, 0xFA, + 0xFA, 0xF9, 0xFA, 0xFC, 0x00, 0x06, 0x0A, 0x0C, 0x09, 0x06, 0x05, 0x05, 0x07, 0x09, 0x08, 0x03, + 0xFD, 0xF6, 0xF1, 0xEF, 0xF1, 0xF4, 0xF8, 0xFA, 0xFD, 0xFF, 0x02, 0x07, 0x0A, 0x0C, 0x09, 0x05, + 0x00, 0xFD, 0xFA, 0xFA, 0xFA, 0xF9, 0xF8, 0xFA, 0xFD, 0x01, 0x07, 0x0A, 0x0A, 0x07, 0x05, 0x04, + 0x05, 0x08, 0x08, 0x07, 0x03, 0xFE, 0xF8, 0xF3, 0xF0, 0xF1, 0xF4, 0xF6, 0xF9, 0xFB, 0xFF, 0x02, + 0x05, 0x09, 0x0B, 0x0A, 0x06, 0x01, 0xFE, 0xFC, 0xFA, 0xF9, 0xF8, 0xF8, 0xF9, 0xFC, 0x00, 0x05, + 0x09, 0x0A, 0x08, 0x06, 0x05, 0x06, 0x08, 0x08, 0x07, 0x04, 0xFF, 0xF9, 0xF4, 0xF1, 0xF0, 0xF2, + 0xF5, 0xF8, 0xFB, 0xFE, 0x02, 0x06, 0x0A, 0x0B, 0x0B, 0x07, 0x03, 0xFF, 0xFC, 0xFA, 0xFA, 0xF9, + 0xF8, 0xF9, 0xFB, 0xFE, 0x02, 0x07, 0x09, 0x08, 0x06, 0x05, 0x06, 0x07, 0x08, 0x09, 0x06, 0x01, + 0xFC, 0xF7, 0xF2, 0xF0, 0xF1, 0xF3, 0xF6, 0xF9, 0xFD, 0x00, 0x04, 0x08, 0x0B, 0x0C, 0x0A, 0x06, + 0x01, 0xFD, 0xFB, 0xFA, 0xF8, 0xF8, 0xF7, 0xF9, 0xFC, 0x00, 0x04, 0x08, 0x09, 0x08, 0x06, 0x06, + 0x06, 0x08, 0x09, 0x08, 0x04, 0x00, 0xFA, 0xF5, 0xF1, 0xF0, 0xF1, 0xF4, 0xF7, 0xFB, 0xFE, 0x01, + 0x05, 0x09, 0x0B, 0x0C, 0x09, 0x04, 0x00, 0xFC, 0xF9, 0xF8, 0xF8, 0xF8, 0xF7, 0xF9, 0xFD, 0x01, + 0x06, 0x09, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x07, 0x08, 0x06, 0x03, 0xFF, 0xFA, 0xF5, 0xF1, 0xF0, + 0xF2, 0xF4, 0xF8, 0xFB, 0xFE, 0x02, 0x06, 0x0A, 0x0B, 0x0B, 0x09, 0x04, 0x00, 0xFD, 0xFA, 0xF8, + 0xF8, 0xF8, 0xF8, 0xFA, 0xFD, 0x00, 0x05, 0x08, 0x09, 0x07, 0x05, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x00, 0xFB, 0xF7, 0xF3, 0xF2, 0xF2, 0xF4, 0xF7, 0xFA, 0xFE, 0x00, 0x04, 0x08, 0x0B, 0x0A, + 0x08, 0x05, 0x00, 0xFD, 0xFB, 0xF9, 0xF7, 0xF8, 0xF9, 0xFB, 0xFC, 0x00, 0x03, 0x06, 0x08, 0x08, + 0x07, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x03, 0xFF, 0xFB, 0xF6, 0xF3, 0xF2, 0xF3, 0xF5, 0xF8, + 0xFB, 0xFF, 0x02, 0x05, 0x08, 0x0A, 0x0A, 0x07, 0x03, 0x00, 0xFD, 0xFB, 0xFA, 0xF9, 0xF8, 0xF9, + 0xFC, 0xFE, 0x00, 0x04, 0x07, 0x06, 0x06, 0x05, 0x04, 0x04, 0x05, 0x06, 0x05, 0x03, 0x01, 0xFE, + 0xFA, 0xF7, 0xF4, 0xF3, 0xF4, 0xF5, 0xF8, 0xFC, 0x00, 0x02, 0x05, 0x08, 0x09, 0x09, 0x06, 0x03, + 0x00, 0xFD, 0xFB, 0xFA, 0xFA, 0xFA, 0xFA, 0xFC, 0xFF, 0x01, 0x04, 0x06, 0x07, 0x06, 0x05, 0x04, + 0x04, 0x05, 0x06, 0x05, 0x03, 0x01, 0xFF, 0xFB, 0xF7, 0xF5, 0xF3, 0xF4, 0xF6, 0xF9, 0xFC, 0x00, + 0x02, 0x05, 0x08, 0x08, 0x08, 0x05, 0x02, 0x00, 0xFD, 0xFB, 0xFA, 0xF9, 0xFA, 0xFA, 0xFC, 0xFE, + 0x01, 0x03, 0x05, 0x06, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, 0x03, 0x01, 0x00, 0xFB, 0xF8, + 0xF5, 0xF4, 0xF4, 0xF6, 0xF9, 0xFC, 0x00, 0x02, 0x04, 0x06, 0x08, 0x08, 0x06, 0x04, 0x01, 0xFE, + 0xFC, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFC, 0xFF, 0x02, 0x05, 0x06, 0x06, 0x05, 0x04, 0x04, 0x04, + 0x05, 0x06, 0x05, 0x03, 0x00, 0xFD, 0xFA, 0xF7, 0xF4, 0xF3, 0xF5, 0xF7, 0xFA, 0xFD, 0x00, 0x02, + 0x05, 0x08, 0x09, 0x08, 0x05, 0x02, 0x00, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xFA, 0xFC, 0xFE, 0x00, + 0x03, 0x06, 0x06, 0x06, 0x04, 0x03, 0x04, 0x05, 0x05, 0x05, 0x04, 0x02, 0x00, 0xFD, 0xF9, 0xF7, + 0xF5, 0xF4, 0xF5, 0xF8, 0xFB, 0xFE, 0x00, 0x03, 0x06, 0x07, 0x08, 0x07, 0x05, 0x02, 0x00, 0xFD, + 0xFB, 0xFA, 0xFA, 0xFA, 0xFA, 0xFC, 0xFF, 0x01, 0x03, 0x05, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x00, 0xFD, 0xFB, 0xF7, 0xF5, 0xF4, 0xF6, 0xF8, 0xFB, 0xFE, 0x00, 0x03, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x03, 0x00, 0xFD, 0xFB, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFE, 0x01, + 0x03, 0x04, 0x06, 0x05, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x03, 0x02, 0x00, 0xFE, 0xFB, 0xF8, + 0xF6, 0xF4, 0xF5, 0xF8, 0xFA, 0xFD, 0x00, 0x02, 0x04, 0x06, 0x07, 0x07, 0x05, 0x03, 0x00, 0xFE, + 0xFC, 0xFB, 0xFB, 0xFA, 0xFB, 0xFC, 0xFE, 0x00, 0x02, 0x04, 0x05, 0x04, 0x04, 0x03, 0x03, 0x03, + 0x03, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFD, 0xF9, 0xF7, 0xF6, 0xF5, 0xF6, 0xF9, 0xFC, 0xFE, 0x01, + 0x03, 0x05, 0x06, 0x08, 0x07, 0x04, 0x02, 0x00, 0xFD, 0xFB, 0xFA, 0xFA, 0xFA, 0xFB, 0xFC, 0xFF, + 0x01, 0x03, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x03, 0x01, 0x00, 0xFF, 0xFC, + 0xF8, 0xF6, 0xF5, 0xF5, 0xF8, 0xFA, 0xFE, 0x00, 0x02, 0x04, 0x05, 0x07, 0x07, 0x06, 0x03, 0x00, + 0xFF, 0xFC, 0xFB, 0xFA, 0xFB, 0xFB, 0xFC, 0xFE, 0x00, 0x02, 0x04, 0x05, 0x05, 0x04, 0x03, 0x02, + 0x03, 0x03, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFE, 0xFB, 0xF9, 0xF6, 0xF5, 0xF6, 0xF8, 0xFB, 0xFE, + 0x00, 0x02, 0x04, 0x06, 0x06, 0x07, 0x06, 0x03, 0x00, 0xFE, 0xFC, 0xFA, 0xFA, 0xFB, 0xFB, 0xFD, + 0xFE, 0x00, 0x02, 0x04, 0x05, 0x04, 0x03, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x01, 0x00, + 0xFE, 0xFB, 0xF8, 0xF6, 0xF5, 0xF6, 0xF9, 0xFC, 0xFE, 0x01, 0x03, 0x04, 0x06, 0x07, 0x06, 0x04, + 0x01, 0x00, 0xFD, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x02, 0x04, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFC, 0xFA, 0xF8, 0xF7, 0xF7, 0xF8, + 0xFB, 0xFE, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x04, 0x02, 0x00, 0xFE, 0xFD, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFD, 0xFF, 0x00, 0x02, 0x04, 0x05, 0x05, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, + 0x00, 0x00, 0xFF, 0xFC, 0xFA, 0xF8, 0xF6, 0xF6, 0xF8, 0xFB, 0xFD, 0x00, 0x01, 0x03, 0x05, 0x06, + 0x07, 0x06, 0x03, 0x01, 0xFF, 0xFC, 0xFB, 0xFA, 0xFA, 0xFB, 0xFC, 0xFE, 0x00, 0x01, 0x03, 0x04, + 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFD, 0xFA, 0xF8, + 0xF6, 0xF7, 0xF9, 0xFB, 0xFE, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x02, 0x00, 0xFF, 0xFC, + 0xFB, 0xFB, 0xFD, 0xFD, 0xFD, 0xFE, 0x00, 0x01, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xFB, 0xF8, 0xF6, 0xF6, 0xF8, 0xFB, 0xFD, 0x00, + 0x01, 0x03, 0x04, 0x05, 0x05, 0x04, 0x03, 0x01, 0xFF, 0xFD, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x03, 0x03, 0x02, 0x01, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0xFF, 0xFD, 0xFA, 0xF8, 0xF6, 0xF7, 0xF9, 0xFC, 0xFE, 0x00, 0x02, 0x04, 0x04, 0x05, 0x05, + 0x04, 0x03, 0x00, 0xFE, 0xFC, 0xFB, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFA, 0xF7, + 0xF6, 0xF7, 0xF9, 0xFC, 0xFF, 0x00, 0x02, 0x03, 0x05, 0x06, 0x06, 0x04, 0x02, 0x00, 0xFE, 0xFB, + 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFF, 0x00, 0x01, 0x03, 0x04, 0x03, 0x03, 0x02, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFE, 0xFB, 0xF8, 0xF6, 0xF6, 0xF8, 0xFC, 0xFF, + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x03, 0x00, 0xFE, 0xFC, 0xFB, 0xFB, 0xFD, 0xFD, 0xFE, + 0xFF, 0x00, 0x01, 0x03, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0xFF, 0xFD, 0xFA, 0xF7, 0xF7, 0xF9, 0xFC, 0xFE, 0x00, 0x02, 0x02, 0x03, 0x05, + 0x05, 0x05, 0x03, 0x01, 0xFE, 0xFC, 0xFB, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x04, + 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFC, + 0xF9, 0xF6, 0xF6, 0xF8, 0xFC, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x05, 0x03, 0x00, 0xFE, + 0xFC, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x02, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0xFE, 0xFB, 0xF7, 0xF6, 0xF8, 0xFA, + 0xFE, 0x00, 0x02, 0x02, 0x03, 0x04, 0x05, 0x05, 0x04, 0x01, 0xFF, 0xFC, 0xFB, 0xFB, 0xFD, 0xFE, + 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x00, 0xFE, 0xFB, 0xF8, 0xF6, 0xF7, 0xFA, 0xFD, 0xFF, 0x01, 0x02, 0x03, + 0x04, 0x04, 0x05, 0x04, 0x02, 0xFF, 0xFC, 0xFA, 0xFA, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x02, + 0x03, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0xFC, 0xF8, 0xF5, 0xF6, 0xF8, 0xFD, 0x00, 0x00, 0x01, 0x03, 0x04, 0x05, 0x05, 0x04, 0x02, + 0x00, 0xFD, 0xFB, 0xFB, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x04, 0x03, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x02, 0x03, 0x02, 0x02, 0x01, 0x00, 0xFD, 0xF9, 0xF6, 0xF5, + 0xF8, 0xFB, 0xFF, 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x04, 0x01, 0xFF, 0xFC, 0xFB, 0xFC, 0xFC, + 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x00, 0xFE, 0xFC, 0xFB, 0xF8, 0xF7, 0xF8, 0xFB, 0xFE, 0x00, + 0x02, 0x03, 0x03, 0x04, 0x05, 0x04, 0x01, 0xFF, 0xFD, 0xFC, 0xFC, 0xFD, 0xFD, 0xFF, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, + 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFB, 0xF9, 0xF7, 0xF8, 0xFB, 0xFF, 0x01, 0x02, 0x03, 0x03, 0x03, + 0x04, 0x03, 0x01, 0xFF, 0xFD, 0xFC, 0xFC, 0xFD, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, + 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x01, 0x00, 0xFF, + 0xFE, 0xFE, 0xFD, 0xFB, 0xFA, 0xFA, 0xFB, 0xFE, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, + 0x00, 0xFF, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFD, + 0xFC, 0xFA, 0xFA, 0xFC, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFD, + 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFC, 0xFD, 0xFE, 0x00, + 0x02, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x01, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFC, + 0xFB, 0xFB, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFE, 0xFE, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0xFD, 0xFC, 0xFD, 0xFF, 0x01, 0x02, 0x03, + 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0xFB, 0xFA, 0xFB, 0xFD, + 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x02, 0x02, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x02, 0x03, + 0x03, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xFA, 0xFA, + 0xFC, 0xFF, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x03, 0x00, 0xFD, 0xFC, 0xFC, 0xFC, 0xFD, 0xFE, + 0xFF, 0x00, 0x02, 0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFE, 0xFD, + 0xFC, 0xF9, 0xF8, 0xF9, 0xFD, 0x01, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0xFD, 0xFA, 0xF9, + 0xFB, 0xFE, 0x00, 0x01, 0x03, 0x05, 0x06, 0x05, 0x03, 0x00, 0xFD, 0xFC, 0xFB, 0xFB, 0xFC, 0xFD, + 0xFF, 0x01, 0x03, 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0xFE, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0xFE, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x03, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, + 0xFE, 0xFD, 0xFC, 0xFD, 0xFE, 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x03, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x00, 0xFE, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x02, + 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, + 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFB, 0xFC, 0xFE, 0x00, 0x02, 0x04, 0x06, 0x07, + 0x06, 0x04, 0x03, 0x01, 0xFF, 0xFD, 0xFB, 0xFA, 0xFC, 0xFD, 0xFE, 0x00, 0x01, 0x01, 0x02, 0x01, + 0x01, 0x01, 0x00, 0xFE, 0xFC, 0xFC, 0xFB, 0xFA, 0xFB, 0xFC, 0xFD, 0x00, 0x01, 0x03, 0x05, 0x06, + 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0xFD, 0xFB, 0xFA, 0xF9, 0xF8, 0xF9, 0xFC, 0xFF, 0x01, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x03, 0x01, 0x00, 0xFE, 0xFC, 0xFC, 0xFD, 0xFF, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFA, 0xFA, 0xFA, 0xF8, + 0xF9, 0xFC, 0xFF, 0x00, 0x02, 0x04, 0x05, 0x05, 0x04, 0x04, 0x02, 0x01, 0x00, 0xFF, 0xFD, 0xFE, + 0xFE, 0xFD, 0xFE, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x01, 0xFF, 0xFD, 0xFC, 0xFC, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x03, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x02, + 0x02, 0x03, 0x02, 0x01, 0x01, 0x00, 0xFE, 0xFC, 0xFC, 0xFC, 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, + 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFD, 0xFD, 0xFD, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xFE, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x02, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFE, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFD, + 0xFC, 0xFD, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0xFF, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + } ; + +unsigned char snd_ohno[5621] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFD, 0xFE, 0x06, + 0x06, 0xFC, 0x00, 0x06, 0xFD, 0xF2, 0xFE, 0x02, 0xFB, 0xFF, 0x0D, 0x08, 0xFB, 0xFE, 0x02, 0xF7, + 0xF6, 0x04, 0x04, 0xFA, 0x03, 0x1C, 0x0F, 0xE9, 0xDE, 0xF8, 0x04, 0x07, 0x10, 0x08, 0xEA, 0xE9, + 0x13, 0x2C, 0x0E, 0xE4, 0xDE, 0xEE, 0xF7, 0x0A, 0x1B, 0x06, 0xEA, 0xEB, 0x0A, 0x21, 0x1E, 0x06, + 0xE4, 0xD3, 0xE7, 0x0C, 0x19, 0x09, 0xFD, 0xFC, 0x07, 0x13, 0x0D, 0xF5, 0xE3, 0xE7, 0xFD, 0x0B, + 0x0B, 0x08, 0x08, 0x15, 0x17, 0xED, 0xCE, 0xEA, 0x0D, 0x0E, 0x08, 0x0B, 0xF7, 0xDB, 0xE7, 0x0B, + 0x12, 0x07, 0x0A, 0x25, 0x26, 0xE8, 0xC0, 0xE5, 0x12, 0x0F, 0x0F, 0x13, 0xF0, 0xD3, 0xEE, 0x10, + 0x0F, 0x04, 0x05, 0xFD, 0xEB, 0xFD, 0x23, 0x3D, 0x0F, 0xCD, 0xC8, 0xED, 0x0C, 0x19, 0x21, 0x0A, + 0xDE, 0xD5, 0xFB, 0x0C, 0x09, 0x0A, 0x06, 0xEE, 0xEF, 0x1B, 0x3F, 0x20, 0xD4, 0xC0, 0xE6, 0x03, + 0x15, 0x25, 0x14, 0xE1, 0xD2, 0xF1, 0x08, 0x0F, 0x13, 0x0A, 0xE8, 0xEB, 0x17, 0x37, 0x2A, 0xF0, + 0xC8, 0xCF, 0xF4, 0x18, 0x25, 0x17, 0xF4, 0xDA, 0xE0, 0xFA, 0x10, 0x16, 0x0D, 0xF6, 0xF1, 0x0C, + 0x36, 0x31, 0xEE, 0xC2, 0xD5, 0xFC, 0x12, 0x1E, 0x1A, 0xF7, 0xD1, 0xDB, 0x04, 0x18, 0x10, 0x03, + 0xF9, 0xFE, 0x15, 0x34, 0x19, 0xD2, 0xC6, 0xF0, 0x09, 0x0E, 0x15, 0x0D, 0xE9, 0xD3, 0xEC, 0x10, + 0x13, 0x07, 0x06, 0x00, 0x01, 0x22, 0x3A, 0xFD, 0xC0, 0xD4, 0x02, 0x10, 0x0C, 0x19, 0x01, 0xD5, + 0xD2, 0x00, 0x1A, 0x0F, 0x07, 0x04, 0xFD, 0x04, 0x36, 0x2D, 0xDA, 0xC0, 0xE9, 0x0D, 0x08, 0x10, + 0x17, 0xF2, 0xD1, 0xE7, 0x08, 0x0C, 0x0A, 0x11, 0x06, 0xF2, 0x00, 0x35, 0x36, 0xE7, 0xC0, 0xE3, + 0x01, 0x04, 0x12, 0x1C, 0xF9, 0xD6, 0xE8, 0x03, 0x03, 0x06, 0x15, 0x0C, 0xF3, 0xFB, 0x20, 0x35, + 0x0A, 0xD4, 0xCD, 0xED, 0x03, 0x0D, 0x17, 0x08, 0xEA, 0xE1, 0xF6, 0x01, 0x05, 0x0E, 0x0E, 0xFB, + 0xF7, 0x0D, 0x31, 0x2D, 0xEB, 0xC3, 0xDD, 0xFD, 0x0A, 0x15, 0x14, 0xFB, 0xDF, 0xE6, 0xFF, 0x06, + 0x08, 0x13, 0x0B, 0xF1, 0xF4, 0x1E, 0x3A, 0x13, 0xD4, 0xCC, 0xEE, 0x00, 0x0A, 0x1B, 0x0F, 0xEA, + 0xE2, 0xF1, 0xFD, 0x02, 0x0E, 0x14, 0x07, 0xFC, 0x0E, 0x2C, 0x0F, 0xD1, 0xD3, 0xFE, 0x06, 0x01, + 0x0D, 0x0C, 0xED, 0xE2, 0xFA, 0x02, 0xFB, 0x03, 0x14, 0x0A, 0xFB, 0x12, 0x36, 0x0E, 0xC6, 0xD1, + 0x01, 0x09, 0x01, 0x12, 0x0F, 0xE9, 0xDD, 0xFC, 0x08, 0xFA, 0x01, 0x15, 0x08, 0xF4, 0x08, 0x33, + 0x1E, 0xD9, 0xCD, 0xF3, 0x05, 0x00, 0x0F, 0x17, 0xF9, 0xDD, 0xF4, 0x08, 0xFC, 0xFA, 0x0F, 0x12, + 0xFC, 0xFB, 0x21, 0x34, 0xF7, 0xC6, 0xE2, 0x02, 0x00, 0x06, 0x18, 0x07, 0xE5, 0xE5, 0x00, 0x04, + 0xF6, 0x02, 0x16, 0x05, 0xF7, 0x0D, 0x29, 0x14, 0xE0, 0xD5, 0xF5, 0x03, 0x00, 0x0E, 0x14, 0xF9, + 0xE5, 0xF6, 0x04, 0x00, 0xFA, 0x0A, 0x11, 0x01, 0x00, 0x18, 0x22, 0xFF, 0xDD, 0xE2, 0xFA, 0x00, + 0x04, 0x10, 0x0B, 0xF2, 0xEC, 0xFA, 0x00, 0xFB, 0x00, 0x0D, 0x0C, 0x04, 0x0D, 0x22, 0x0D, 0xD9, + 0xD3, 0xF9, 0x09, 0x01, 0x08, 0x0E, 0xFB, 0xE6, 0xF3, 0x07, 0x02, 0xF6, 0x01, 0x0E, 0x07, 0x02, + 0x15, 0x21, 0x02, 0xDC, 0xE0, 0xF9, 0x00, 0x02, 0x0E, 0x0C, 0xF7, 0xE8, 0xF4, 0x00, 0xFE, 0xFF, + 0x0C, 0x10, 0x04, 0x03, 0x19, 0x15, 0xEF, 0xD8, 0xED, 0x04, 0x01, 0x02, 0x0C, 0x07, 0xF0, 0xEE, + 0xFF, 0x01, 0xFA, 0xFD, 0x0F, 0x10, 0x04, 0x04, 0x16, 0x13, 0xF3, 0xDF, 0xED, 0xFE, 0x00, 0x03, + 0x0C, 0x06, 0xF5, 0xEC, 0xFA, 0x00, 0xFF, 0x06, 0x11, 0x0D, 0x05, 0x13, 0x20, 0xFF, 0xD0, 0xDB, + 0x03, 0x0C, 0x00, 0x07, 0x0F, 0xFA, 0xE4, 0xF2, 0x06, 0x01, 0xFA, 0x09, 0x15, 0x08, 0xFC, 0x07, + 0x15, 0x08, 0xEE, 0xEA, 0xF5, 0xFB, 0xFC, 0x06, 0x0C, 0x02, 0xF3, 0xF1, 0xF8, 0xFD, 0x03, 0x0B, + 0x10, 0x09, 0x02, 0x07, 0x0F, 0x07, 0xF2, 0xE3, 0xEF, 0xFF, 0x02, 0x02, 0x07, 0x02, 0xF8, 0xF0, + 0xF4, 0xFD, 0x06, 0x0E, 0x10, 0x0A, 0x04, 0x05, 0x0D, 0x0A, 0xF3, 0xE3, 0xEF, 0x00, 0x03, 0x02, + 0x06, 0x03, 0xFA, 0xEF, 0xF4, 0x00, 0x09, 0x0A, 0x0C, 0x09, 0x05, 0x05, 0x0D, 0x12, 0xFB, 0xE0, + 0xE5, 0xFB, 0x04, 0x02, 0x05, 0x07, 0xFF, 0xEE, 0xEC, 0xF9, 0x07, 0x0C, 0x0C, 0x0B, 0x06, 0x06, + 0x12, 0x14, 0xF6, 0xDB, 0xE2, 0xFD, 0x05, 0x02, 0x06, 0x09, 0xFF, 0xEE, 0xED, 0xFB, 0x04, 0x07, + 0x0E, 0x10, 0x09, 0x02, 0x07, 0x13, 0x0C, 0xEA, 0xD9, 0xED, 0x02, 0x01, 0x01, 0x09, 0x08, 0xF8, + 0xEB, 0xF0, 0xFE, 0x06, 0x08, 0x0F, 0x0E, 0x03, 0x02, 0x17, 0x1E, 0xF8, 0xD3, 0xDD, 0xFB, 0x05, + 0x00, 0x09, 0x12, 0x02, 0xE9, 0xE9, 0xFA, 0x01, 0x03, 0x0D, 0x14, 0x0B, 0xFE, 0x04, 0x1D, 0x1A, + 0xEB, 0xCF, 0xE6, 0x00, 0x01, 0x00, 0x0E, 0x12, 0xFE, 0xE6, 0xEC, 0xFD, 0x00, 0x02, 0x0F, 0x15, + 0x07, 0xFC, 0x09, 0x22, 0x19, 0xE6, 0xCE, 0xE5, 0xFF, 0x00, 0x01, 0x10, 0x13, 0xFC, 0xE7, 0xEC, + 0xFC, 0xFE, 0x01, 0x10, 0x16, 0x07, 0xFD, 0x08, 0x23, 0x1B, 0xEC, 0xCF, 0xE1, 0xFA, 0x00, 0x01, + 0x0F, 0x14, 0x00, 0xEA, 0xEB, 0xFA, 0xFD, 0xFE, 0x0C, 0x17, 0x0D, 0xFE, 0x03, 0x1F, 0x24, 0xF9, + 0xD1, 0xD7, 0xF7, 0x02, 0x00, 0x0B, 0x18, 0x09, 0xEE, 0xE6, 0xF5, 0xFD, 0xFC, 0x05, 0x15, 0x15, + 0x01, 0xFE, 0x12, 0x29, 0x0F, 0xDC, 0xCD, 0xE9, 0x00, 0xFF, 0x03, 0x13, 0x14, 0xFC, 0xE7, 0xEC, + 0xFC, 0xFD, 0xFE, 0x0D, 0x19, 0x0F, 0xFD, 0x01, 0x1C, 0x25, 0x00, 0xD5, 0xD2, 0xF0, 0xFF, 0xFE, + 0x06, 0x17, 0x10, 0xF6, 0xE6, 0xF0, 0xFB, 0xFC, 0x00, 0x10, 0x19, 0x0B, 0xFE, 0x07, 0x21, 0x20, + 0xF6, 0xCF, 0xD6, 0xF4, 0x00, 0x00, 0x0A, 0x18, 0x0D, 0xF1, 0xE5, 0xF1, 0xFC, 0xFC, 0x00, 0x10, + 0x18, 0x08, 0xFC, 0x05, 0x22, 0x22, 0xFB, 0xD2, 0xD3, 0xEF, 0xFF, 0xFF, 0x08, 0x18, 0x11, 0xF8, + 0xE7, 0xED, 0xFA, 0xFC, 0x00, 0x0E, 0x19, 0x0E, 0x00, 0x04, 0x1B, 0x24, 0x03, 0xD5, 0xCD, 0xE9, + 0xFF, 0x00, 0x05, 0x14, 0x16, 0xFF, 0xE8, 0xEA, 0xFA, 0xFD, 0xFC, 0x07, 0x18, 0x14, 0x01, 0xFC, + 0x0C, 0x23, 0x1B, 0xF3, 0xD3, 0xD7, 0xEF, 0xFD, 0x00, 0x0B, 0x17, 0x11, 0xF9, 0xEA, 0xEF, 0xF9, + 0xFA, 0xFE, 0x0C, 0x19, 0x10, 0x00, 0x00, 0x12, 0x24, 0x14, 0xE9, 0xCF, 0xDB, 0xF3, 0xFD, 0x00, + 0x0D, 0x18, 0x0F, 0xF5, 0xE9, 0xF1, 0xFB, 0xF9, 0xFD, 0x0C, 0x19, 0x11, 0x00, 0x00, 0x13, 0x25, + 0x13, 0xE7, 0xCF, 0xDD, 0xF4, 0xFD, 0x00, 0x0C, 0x19, 0x11, 0xF7, 0xEA, 0xF1, 0xFB, 0xF9, 0xFA, + 0x08, 0x18, 0x13, 0x03, 0x00, 0x10, 0x23, 0x17, 0xEC, 0xD0, 0xDA, 0xF2, 0xFC, 0xFD, 0x09, 0x19, + 0x15, 0xFC, 0xEB, 0xF0, 0xFC, 0xFA, 0xF7, 0x00, 0x14, 0x17, 0x08, 0xFF, 0x08, 0x1E, 0x1F, 0xFD, + 0xD9, 0xD4, 0xEA, 0xF9, 0xFB, 0x02, 0x14, 0x1A, 0x07, 0xF1, 0xEF, 0xF8, 0xFC, 0xF5, 0xF9, 0x0A, + 0x17, 0x0F, 0x01, 0x00, 0x13, 0x22, 0x15, 0xED, 0xD5, 0xDD, 0xF0, 0xF8, 0xFB, 0x07, 0x18, 0x16, + 0x01, 0xF0, 0xF3, 0xFB, 0xF8, 0xF2, 0xFC, 0x0C, 0x16, 0x0C, 0x02, 0x07, 0x18, 0x21, 0x0B, 0xE7, + 0xD5, 0xE1, 0xF2, 0xF8, 0xFC, 0x0A, 0x19, 0x14, 0x00, 0xF2, 0xF5, 0xFB, 0xF5, 0xF1, 0xFC, 0x0E, + 0x16, 0x0B, 0x03, 0x0A, 0x1C, 0x1F, 0x03, 0xE2, 0xD7, 0xE5, 0xF3, 0xF5, 0xFC, 0x0D, 0x1A, 0x10, + 0xFE, 0xF3, 0xF8, 0xFA, 0xF2, 0xF0, 0xFF, 0x0E, 0x12, 0x09, 0x04, 0x0B, 0x18, 0x1D, 0x0A, 0xED, + 0xDC, 0xE2, 0xED, 0xF2, 0xF9, 0x08, 0x16, 0x14, 0x03, 0xFA, 0xFA, 0xFA, 0xF2, 0xEF, 0xF8, 0x07, + 0x0F, 0x0C, 0x07, 0x0B, 0x14, 0x1C, 0x12, 0xF7, 0xDF, 0xDF, 0xE9, 0xF0, 0xF6, 0x01, 0x13, 0x16, + 0x0A, 0xFF, 0xFC, 0xFC, 0xF5, 0xEF, 0xF3, 0x02, 0x0C, 0x0C, 0x08, 0x0A, 0x10, 0x19, 0x19, 0x05, + 0xEB, 0xE0, 0xE2, 0xEB, 0xF0, 0xFA, 0x09, 0x15, 0x11, 0x05, 0xFF, 0xFE, 0xF9, 0xF1, 0xEF, 0xF9, + 0x04, 0x0A, 0x09, 0x0A, 0x0D, 0x13, 0x19, 0x14, 0xFE, 0xE5, 0xDF, 0xE7, 0xED, 0xF1, 0xFE, 0x0E, + 0x15, 0x0D, 0x03, 0x00, 0xFE, 0xF6, 0xEE, 0xF1, 0xFE, 0x05, 0x08, 0x09, 0x0C, 0x11, 0x15, 0x1A, + 0x10, 0xF5, 0xE3, 0xDF, 0xE8, 0xEC, 0xF3, 0x01, 0x11, 0x13, 0x0A, 0x02, 0x01, 0xFD, 0xF3, 0xED, + 0xF5, 0x00, 0x04, 0x07, 0x0B, 0x10, 0x11, 0x17, 0x1B, 0x0B, 0xEE, 0xE0, 0xE3, 0xEA, 0xEC, 0xF5, + 0x06, 0x14, 0x10, 0x06, 0x04, 0x04, 0xFA, 0xEF, 0xF0, 0xFA, 0xFF, 0x00, 0x05, 0x0F, 0x0E, 0x0D, + 0x17, 0x1D, 0x0D, 0xED, 0xE1, 0xE7, 0xEA, 0xE7, 0xF2, 0x09, 0x14, 0x0B, 0x07, 0x09, 0x05, 0xF7, + 0xEE, 0xF3, 0xFA, 0xFA, 0xFE, 0x09, 0x10, 0x0B, 0x0B, 0x19, 0x22, 0x0B, 0xEC, 0xE6, 0xEB, 0xE6, + 0xE3, 0xF4, 0x0B, 0x0E, 0x07, 0x0A, 0x0E, 0x04, 0xF3, 0xF2, 0xF9, 0xF7, 0xF4, 0x00, 0x0D, 0x0D, + 0x06, 0x0C, 0x1C, 0x1F, 0x0A, 0xF2, 0xEB, 0xE9, 0xE1, 0xE3, 0xF6, 0x07, 0x08, 0x09, 0x10, 0x0E, + 0x01, 0xF7, 0xFA, 0xF7, 0xF2, 0xF4, 0x03, 0x09, 0x06, 0x07, 0x11, 0x17, 0x19, 0x12, 0xFC, 0xEC, + 0xE6, 0xE5, 0xE5, 0xF1, 0x00, 0x08, 0x0B, 0x0C, 0x0C, 0x05, 0xFD, 0xF9, 0xF5, 0xF3, 0xF6, 0x00, + 0x05, 0x07, 0x0A, 0x0E, 0x13, 0x1A, 0x15, 0xFC, 0xEE, 0xEA, 0xE6, 0xE4, 0xEF, 0x00, 0x04, 0x08, + 0x0D, 0x10, 0x05, 0xFE, 0xFE, 0xF9, 0xF2, 0xF5, 0x00, 0x01, 0x03, 0x09, 0x0D, 0x0F, 0x15, 0x17, + 0x03, 0xF0, 0xF4, 0xEE, 0xE6, 0xED, 0xFB, 0xFF, 0xFF, 0x05, 0x0C, 0x07, 0x00, 0x04, 0x03, 0xFD, + 0xFB, 0x00, 0x00, 0xFB, 0xFE, 0x03, 0x04, 0x07, 0x0E, 0x0E, 0x05, 0x00, 0xFE, 0xFA, 0xF3, 0xF3, + 0xF5, 0xF6, 0xF7, 0xFE, 0x01, 0x02, 0x04, 0x05, 0x03, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x03, + 0x07, 0x0A, 0x0B, 0x04, 0x00, 0xFE, 0xF7, 0xF4, 0xF4, 0xF3, 0xF6, 0xFA, 0xFD, 0x00, 0x04, 0x05, + 0x05, 0x04, 0x02, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x07, 0x0A, 0x08, 0x04, 0x01, 0xFD, 0xF8, + 0xF6, 0xF6, 0xF3, 0xF7, 0xFB, 0xFC, 0x00, 0x05, 0x03, 0x04, 0x05, 0x01, 0x00, 0x01, 0xFE, 0xFF, + 0x01, 0x00, 0x07, 0x0A, 0x06, 0x04, 0x02, 0xFC, 0xFA, 0xF9, 0xF5, 0xF5, 0xF9, 0xFB, 0xFC, 0x02, + 0x01, 0x04, 0x05, 0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x07, 0x07, 0x06, 0x05, 0x00, + 0xFD, 0xFB, 0xF7, 0xF7, 0xF7, 0xF8, 0xFB, 0xFD, 0x00, 0x02, 0x03, 0x03, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x06, 0x08, 0x05, 0x03, 0x00, 0xFC, 0xFB, 0xF8, 0xF6, 0xF7, 0xF9, 0xFA, + 0xFF, 0x00, 0x01, 0x04, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x08, 0x05, + 0x01, 0x00, 0xFC, 0xF9, 0xF7, 0xF6, 0xF6, 0xFA, 0xFB, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x01, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x04, 0x09, 0x06, 0x04, 0x02, 0xFE, 0xFB, 0xFA, 0xF6, 0xF8, 0xF9, + 0xFA, 0xFD, 0x00, 0x01, 0x03, 0x02, 0x01, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x05, 0x08, + 0x06, 0x02, 0x00, 0xFD, 0xF9, 0xF8, 0xF8, 0xF7, 0xFB, 0xFB, 0xFE, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x04, 0x07, 0x07, 0x02, 0x01, 0xFD, 0xFB, 0xFA, 0xF7, 0xF7, + 0xFB, 0xFB, 0xFE, 0x00, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, + 0x06, 0x03, 0x03, 0xFE, 0xFD, 0xFB, 0xF8, 0xFA, 0xFA, 0xFA, 0xFD, 0xFF, 0x01, 0x02, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x03, 0x04, 0x05, 0x04, 0x02, 0x00, 0xFE, 0xFB, 0xFA, 0xF9, + 0xFA, 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x05, 0x03, + 0x03, 0x01, 0x00, 0xFD, 0xFC, 0xFA, 0xFA, 0xFA, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x03, 0x05, 0x05, 0x05, 0x04, 0x02, 0x00, 0xFF, 0xFB, 0xFA, 0xFA, 0xFA, 0xFA, 0xFC, + 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x04, 0x06, 0x06, 0x06, 0x03, 0x02, 0xFF, 0xFC, + 0xFA, 0xF8, 0xF9, 0xFA, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x02, 0x03, 0x04, + 0x05, 0x05, 0x04, 0x02, 0x00, 0xFE, 0xFA, 0xFA, 0xFA, 0xFA, 0xFB, 0xFD, 0xFE, 0xFF, 0x00, 0x01, + 0x01, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x04, 0x02, 0x00, 0xFD, 0xFA, 0xF9, 0xF8, 0xF9, 0xFA, + 0xFC, 0xFE, 0xFF, 0x00, 0x01, 0x00, 0x02, 0x03, 0x04, 0x04, 0x06, 0x07, 0x06, 0x03, 0x00, 0xFE, + 0xFB, 0xFA, 0xF8, 0xF9, 0xF9, 0xFB, 0xFC, 0xFE, 0x00, 0x00, 0x01, 0x03, 0x03, 0x04, 0x06, 0x08, + 0x09, 0x06, 0x02, 0x00, 0xFD, 0xF9, 0xF8, 0xF8, 0xF9, 0xFA, 0xFC, 0xFC, 0xFF, 0x00, 0x00, 0x02, + 0x03, 0x04, 0x05, 0x07, 0x09, 0x09, 0x06, 0x00, 0x00, 0xFB, 0xF8, 0xF7, 0xF6, 0xF8, 0xFA, 0xFC, + 0xFD, 0xFF, 0x00, 0x02, 0x03, 0x04, 0x04, 0x06, 0x08, 0x0A, 0x07, 0x05, 0x00, 0xFD, 0xF9, 0xF7, + 0xF5, 0xF7, 0xF8, 0xF9, 0xFC, 0xFD, 0x00, 0x02, 0x02, 0x05, 0x05, 0x06, 0x09, 0x0A, 0x0A, 0x06, + 0x01, 0xFE, 0xF8, 0xF6, 0xF5, 0xF4, 0xF7, 0xF8, 0xFA, 0xFD, 0x00, 0x02, 0x02, 0x05, 0x05, 0x07, + 0x0C, 0x10, 0x0C, 0x01, 0x08, 0xFE, 0xEF, 0xF6, 0xE7, 0xF0, 0xFB, 0xF4, 0x00, 0x03, 0x00, 0x08, + 0x06, 0x01, 0x05, 0x0A, 0x17, 0x2B, 0x11, 0xFB, 0xF6, 0xD8, 0xDF, 0xEE, 0xED, 0x03, 0x0D, 0xFD, + 0x00, 0xFE, 0xF7, 0x00, 0x05, 0x00, 0x10, 0x18, 0x2A, 0x36, 0xFB, 0xEB, 0xDF, 0xC3, 0xE6, 0xFC, + 0xFE, 0x16, 0x07, 0xF0, 0x01, 0xF4, 0xF5, 0x0F, 0x06, 0x1B, 0x2B, 0x32, 0x22, 0xE3, 0xDB, 0xD0, + 0xCC, 0xF2, 0x05, 0x09, 0x0A, 0xFF, 0xFA, 0x00, 0xFD, 0x04, 0x0E, 0x0E, 0x17, 0x23, 0x2C, 0x09, + 0xD7, 0xDC, 0xD0, 0xE0, 0x01, 0x02, 0xFB, 0xFE, 0x01, 0x03, 0x0C, 0x09, 0x14, 0x0F, 0x13, 0x27, + 0x12, 0xEB, 0xE0, 0xD4, 0xD6, 0xEE, 0xF8, 0x04, 0x15, 0x13, 0x1A, 0x1B, 0x0C, 0x0D, 0xF9, 0xE2, + 0xE5, 0xE8, 0xF2, 0x05, 0x0A, 0x16, 0x28, 0x2B, 0x08, 0xDA, 0xD2, 0xD3, 0xE3, 0x07, 0x0C, 0x0B, + 0x15, 0x13, 0x19, 0x2A, 0x11, 0xD8, 0xDD, 0xE8, 0xDC, 0xF9, 0x01, 0xFB, 0x11, 0x15, 0x19, 0x1D, + 0x1C, 0x05, 0xD3, 0xD1, 0xDF, 0xEF, 0x0A, 0x0E, 0x0A, 0x1B, 0x2A, 0x2D, 0x09, 0xD8, 0xD7, 0xD4, + 0xD2, 0xFA, 0x0B, 0x09, 0x1D, 0x22, 0x23, 0x2E, 0x06, 0xCB, 0xD8, 0xD5, 0xD8, 0x13, 0x11, 0x00, + 0x17, 0x15, 0x0C, 0x22, 0x17, 0xDB, 0xD7, 0xE3, 0xE9, 0x09, 0x07, 0x00, 0x0A, 0x1F, 0x23, 0x22, + 0x0B, 0xCE, 0xC3, 0xE3, 0xF5, 0x07, 0x17, 0x08, 0x07, 0x20, 0x24, 0x17, 0xFE, 0xD8, 0xD2, 0xE8, + 0xF8, 0x01, 0x04, 0x01, 0x0B, 0x1D, 0x27, 0x1A, 0x03, 0xD8, 0xD3, 0xE9, 0xEB, 0xFD, 0x0C, 0x04, + 0x05, 0x1D, 0x20, 0x23, 0x15, 0xE7, 0xCB, 0xE1, 0xEA, 0xF1, 0x08, 0x02, 0x01, 0x16, 0x23, 0x1D, + 0x16, 0xF7, 0xD8, 0xE6, 0xEA, 0xEE, 0x00, 0x02, 0x01, 0x0F, 0x20, 0x23, 0x1F, 0x00, 0xD0, 0xD7, + 0xEC, 0xEE, 0x00, 0x0A, 0x00, 0x05, 0x1C, 0x21, 0x1C, 0x0F, 0xE6, 0xD4, 0xE9, 0xEA, 0xF4, 0x07, + 0x04, 0x02, 0x13, 0x23, 0x1D, 0x14, 0xFD, 0xD5, 0xE0, 0xEE, 0xEE, 0xFF, 0x08, 0x00, 0x0A, 0x20, + 0x23, 0x1C, 0x01, 0xD9, 0xD7, 0xED, 0xF1, 0xFD, 0x04, 0x00, 0x04, 0x18, 0x21, 0x1F, 0x18, 0xEE, + 0xD1, 0xE2, 0xE8, 0xF5, 0x08, 0x05, 0x00, 0x11, 0x25, 0x1D, 0x19, 0xF9, 0xD2, 0xDF, 0xEA, 0xF2, + 0x02, 0x04, 0xFE, 0x07, 0x1C, 0x22, 0x1C, 0x11, 0xE4, 0xD3, 0xE3, 0xEC, 0xF9, 0x03, 0x05, 0x06, + 0x18, 0x28, 0x23, 0x0C, 0xE8, 0xD3, 0xE3, 0xEB, 0xF9, 0x02, 0x02, 0x00, 0x0E, 0x22, 0x25, 0x25, + 0xFA, 0xD2, 0xD9, 0xE7, 0xEF, 0x01, 0x09, 0x02, 0x0A, 0x23, 0x27, 0x1A, 0x02, 0xDA, 0xD4, 0xE5, + 0xF5, 0xFE, 0x03, 0x01, 0x07, 0x1A, 0x28, 0x27, 0x07, 0xDC, 0xD8, 0xE4, 0xE7, 0xFC, 0x06, 0x01, + 0x04, 0x16, 0x22, 0x26, 0x1A, 0xF0, 0xCE, 0xDE, 0xEE, 0xF3, 0x00, 0x08, 0x01, 0x08, 0x1D, 0x25, + 0x25, 0x02, 0xD7, 0xD8, 0xE5, 0xEA, 0xFC, 0x07, 0x02, 0x05, 0x1B, 0x27, 0x23, 0x12, 0xE4, 0xCE, + 0xDD, 0xEC, 0xFB, 0x06, 0x04, 0x00, 0x0F, 0x24, 0x27, 0x19, 0xF3, 0xD3, 0xD9, 0xEA, 0xF8, 0x00, + 0x01, 0x01, 0x0C, 0x1F, 0x2C, 0x21, 0xFD, 0xD9, 0xD8, 0xE0, 0xEF, 0x03, 0x04, 0x00, 0x06, 0x19, + 0x24, 0x27, 0x0F, 0xE2, 0xD2, 0xE3, 0xEC, 0xF9, 0x02, 0x04, 0x04, 0x15, 0x29, 0x26, 0x17, 0xEC, + 0xD0, 0xD9, 0xE8, 0xF9, 0x03, 0x02, 0x00, 0x0C, 0x20, 0x28, 0x21, 0x01, 0xD9, 0xD7, 0xE4, 0xEF, + 0xFB, 0x03, 0x03, 0x09, 0x1C, 0x29, 0x1F, 0x06, 0xE2, 0xD2, 0xE0, 0xF0, 0xFF, 0x03, 0x03, 0x03, + 0x15, 0x29, 0x28, 0x0F, 0xE7, 0xD4, 0xDE, 0xEC, 0xF8, 0xFF, 0x02, 0x07, 0x13, 0x22, 0x27, 0x19, + 0xF1, 0xD3, 0xDA, 0xE9, 0xF7, 0x00, 0x03, 0x01, 0x0C, 0x1E, 0x28, 0x1F, 0x00, 0xD8, 0xD7, 0xE8, + 0xEF, 0xFC, 0x05, 0x02, 0x02, 0x16, 0x2A, 0x23, 0x0B, 0xE9, 0xD4, 0xE1, 0xEF, 0xFA, 0x00, 0x06, + 0x04, 0x0E, 0x21, 0x2C, 0x1C, 0xED, 0xD1, 0xDD, 0xEC, 0xF4, 0xFF, 0x03, 0x01, 0x09, 0x1E, 0x2B, + 0x1F, 0x00, 0xDF, 0xD5, 0xE5, 0xF4, 0xFB, 0xFE, 0x02, 0x06, 0x11, 0x23, 0x29, 0x12, 0xEB, 0xD6, + 0xE0, 0xEE, 0xF7, 0xFE, 0x01, 0x02, 0x08, 0x1A, 0x28, 0x22, 0x02, 0xDF, 0xD5, 0xE6, 0xF5, 0xF9, + 0xFD, 0x01, 0x04, 0x0F, 0x22, 0x28, 0x17, 0xF3, 0xD7, 0xDB, 0xEE, 0xFA, 0xFA, 0xFF, 0x02, 0x07, + 0x16, 0x28, 0x29, 0x09, 0xDF, 0xD5, 0xE6, 0xF7, 0xFB, 0xFB, 0xFF, 0x02, 0x0B, 0x1C, 0x27, 0x21, + 0x00, 0xDA, 0xD7, 0xEA, 0xFA, 0xFA, 0xFB, 0x00, 0x04, 0x0C, 0x1F, 0x2A, 0x1E, 0xF8, 0xD6, 0xD8, + 0xED, 0xFC, 0xFC, 0xFB, 0x00, 0x07, 0x12, 0x23, 0x29, 0x14, 0xED, 0xD6, 0xDB, 0xF3, 0x02, 0xFE, + 0xF4, 0xFF, 0x07, 0x0F, 0x1F, 0x29, 0x1A, 0xF0, 0xD2, 0xDA, 0xF4, 0x01, 0xFD, 0xFA, 0x00, 0x04, + 0x0F, 0x20, 0x27, 0x16, 0xF0, 0xD8, 0xDC, 0xF2, 0x03, 0x00, 0xF6, 0xF8, 0x03, 0x10, 0x1F, 0x26, + 0x1F, 0xF9, 0xD1, 0xD5, 0xF2, 0x06, 0x02, 0xF7, 0xF9, 0xFD, 0x09, 0x1B, 0x28, 0x21, 0x05, 0xDD, + 0xCC, 0xE6, 0x03, 0x0C, 0xFB, 0xF3, 0xFB, 0x03, 0x13, 0x25, 0x2D, 0x17, 0xE7, 0xC8, 0xD9, 0xFD, + 0x10, 0x0A, 0xEE, 0xE9, 0xFC, 0x13, 0x22, 0x2C, 0x29, 0x01, 0xC6, 0xC1, 0xF3, 0x14, 0x13, 0x00, + 0xEB, 0xE4, 0xF8, 0x19, 0x26, 0x22, 0x22, 0x10, 0xDC, 0xC3, 0xE5, 0x09, 0x0C, 0x00, 0xF2, 0xED, + 0xF9, 0x10, 0x21, 0x22, 0x1F, 0x0B, 0xE2, 0xCB, 0xE5, 0x05, 0x0C, 0xFE, 0xF0, 0xF7, 0x02, 0x10, + 0x1F, 0x24, 0x1C, 0xFB, 0xD3, 0xD0, 0xF1, 0x08, 0x0C, 0x00, 0xEE, 0xEE, 0x01, 0x17, 0x20, 0x22, + 0x1C, 0xFD, 0xD4, 0xD1, 0xF5, 0x0A, 0x0B, 0xFE, 0xED, 0xF0, 0x04, 0x19, 0x20, 0x20, 0x19, 0xF8, + 0xD2, 0xD6, 0xFB, 0x0A, 0x08, 0xFD, 0xEC, 0xEC, 0x02, 0x1A, 0x21, 0x21, 0x1B, 0xFA, 0xCF, 0xD3, + 0xFA, 0x0E, 0x0A, 0x01, 0xEC, 0xE2, 0xFD, 0x1C, 0x22, 0x1F, 0x22, 0x07, 0xD2, 0xCA, 0xF4, 0x0C, + 0x09, 0x07, 0xFA, 0xDF, 0xE3, 0x0F, 0x26, 0x1F, 0x1F, 0x22, 0xF6, 0xC4, 0xD6, 0x03, 0x0D, 0x07, + 0x07, 0xF3, 0xD4, 0xED, 0x1D, 0x27, 0x19, 0x24, 0x1D, 0xE4, 0xC0, 0xE2, 0x0A, 0x0A, 0x06, 0x0F, + 0xF2, 0xC9, 0xE3, 0x1E, 0x29, 0x1B, 0x23, 0x26, 0xF3, 0xC0, 0xD8, 0x04, 0x0B, 0x05, 0x11, 0x00, + 0xD1, 0xD2, 0x08, 0x28, 0x1F, 0x1E, 0x26, 0x0D, 0xDD, 0xCE, 0xEE, 0x02, 0x05, 0x0B, 0x0B, 0xF3, + 0xD6, 0xDC, 0x04, 0x20, 0x21, 0x1E, 0x20, 0x0E, 0xEA, 0xD4, 0xE6, 0xFF, 0x08, 0x08, 0x06, 0xFC, + 0xE6, 0xDA, 0xEF, 0x15, 0x24, 0x1D, 0x1A, 0x18, 0x05, 0xE2, 0xD8, 0xEF, 0x02, 0x04, 0x04, 0x04, + 0xFA, 0xE8, 0xDC, 0xF0, 0x15, 0x24, 0x1E, 0x1A, 0x1E, 0x0B, 0xE0, 0xD0, 0xEC, 0x04, 0x03, 0x04, + 0x09, 0xFD, 0xE7, 0xE1, 0xF1, 0x05, 0x19, 0x22, 0x1F, 0x19, 0x14, 0xFB, 0xD4, 0xD6, 0xFA, 0x0A, + 0x06, 0x05, 0x03, 0xF6, 0xE3, 0xDE, 0xFA, 0x18, 0x21, 0x1C, 0x1C, 0x1C, 0x0B, 0xE4, 0xCF, 0xE6, + 0x03, 0x07, 0x04, 0x04, 0xFC, 0xE8, 0xDE, 0xED, 0x0B, 0x20, 0x1F, 0x1C, 0x1C, 0x17, 0xFA, 0xD7, + 0xD4, 0xF4, 0x09, 0x08, 0x02, 0x00, 0xF6, 0xE0, 0xDD, 0xFE, 0x1E, 0x23, 0x1B, 0x1B, 0x1E, 0x0D, + 0xE1, 0xCA, 0xE3, 0x03, 0x0A, 0x05, 0x02, 0xF9, 0xE0, 0xD9, 0xFE, 0x22, 0x20, 0x14, 0x1B, 0x1D, + 0x0B, 0xEE, 0xD9, 0xDC, 0xF6, 0x0B, 0x0B, 0xFF, 0xF3, 0xE3, 0xDF, 0xFD, 0x1F, 0x21, 0x17, 0x1A, + 0x1F, 0x0C, 0xE8, 0xD0, 0xDE, 0xFC, 0x0C, 0x09, 0x02, 0xED, 0xD7, 0xEA, 0x11, 0x25, 0x1B, 0x18, + 0x1F, 0x17, 0xF8, 0xDB, 0xD9, 0xED, 0x02, 0x0C, 0x06, 0xF2, 0xDD, 0xE3, 0x05, 0x1E, 0x1C, 0x19, + 0x20, 0x1B, 0x03, 0xE2, 0xD1, 0xE3, 0x01, 0x0D, 0x08, 0xF4, 0xDF, 0xE5, 0x04, 0x1B, 0x1D, 0x1B, + 0x1F, 0x17, 0xFE, 0xDC, 0xD4, 0xEB, 0x04, 0x0C, 0x02, 0xEC, 0xE3, 0xF3, 0x0E, 0x1B, 0x1D, 0x1F, + 0x1D, 0x0C, 0xEE, 0xD3, 0xDA, 0xFA, 0x0E, 0x04, 0xEF, 0xE7, 0xF6, 0x09, 0x19, 0x21, 0x24, 0x1B, + 0x04, 0xDF, 0xCD, 0xE2, 0x06, 0x0F, 0xFB, 0xEC, 0xF4, 0x00, 0x0C, 0x1A, 0x27, 0x26, 0x12, 0xEF, + 0xD0, 0xD2, 0xF3, 0x10, 0x0B, 0xF1, 0xEF, 0xFD, 0x05, 0x12, 0x21, 0x27, 0x1D, 0x00, 0xDB, 0xCF, + 0xE3, 0x01, 0x0E, 0xFE, 0xEE, 0xF7, 0x03, 0x0C, 0x17, 0x24, 0x25, 0x11, 0xEC, 0xCE, 0xD5, 0xF5, + 0x0B, 0x07, 0xF4, 0xF0, 0xFE, 0x09, 0x12, 0x20, 0x25, 0x1B, 0x00, 0xDC, 0xCF, 0xE4, 0x02, 0x0C, + 0xFE, 0xEE, 0xF6, 0x03, 0x0D, 0x17, 0x25, 0x25, 0x0F, 0xED, 0xD4, 0xD8, 0xF2, 0x07, 0x09, 0xF6, + 0xEB, 0xFA, 0x0D, 0x14, 0x1C, 0x25, 0x21, 0x04, 0xDE, 0xCD, 0xE2, 0xFF, 0x0A, 0x00, 0xF2, 0xEE, + 0xFD, 0x0D, 0x19, 0x21, 0x24, 0x1A, 0xFE, 0xDB, 0xCF, 0xE7, 0x01, 0x0C, 0x00, 0xED, 0xF0, 0x00, + 0x0D, 0x19, 0x23, 0x26, 0x1A, 0xFA, 0xD7, 0xCF, 0xE8, 0x03, 0x0D, 0x04, 0xF1, 0xEA, 0xF5, 0x0A, + 0x16, 0x1E, 0x24, 0x22, 0x0E, 0xE9, 0xCB, 0xD5, 0xF7, 0x0C, 0x0C, 0x00, 0xEC, 0xE4, 0xF8, 0x13, + 0x1E, 0x20, 0x21, 0x1F, 0x06, 0xDC, 0xC8, 0xE0, 0x00, 0x0B, 0x0A, 0x02, 0xE9, 0xDE, 0xF3, 0x14, + 0x22, 0x1C, 0x21, 0x28, 0x0D, 0xDE, 0xC6, 0xDD, 0xFD, 0x09, 0x08, 0x0C, 0xFB, 0xD7, 0xDA, 0x06, + 0x25, 0x1F, 0x19, 0x27, 0x26, 0x00, 0xD1, 0xCC, 0xE6, 0xFD, 0x05, 0x0D, 0x0E, 0xF9, 0xD6, 0xD7, + 0x00, 0x22, 0x1F, 0x1B, 0x29, 0x27, 0x0B, 0xE2, 0xCD, 0xD7, 0xF2, 0x04, 0x0E, 0x0F, 0x04, 0xEF, + 0xD4, 0xDA, 0x03, 0x23, 0x25, 0x20, 0x26, 0x27, 0x10, 0xE0, 0xC2, 0xD3, 0xF7, 0x09, 0x0E, 0x0D, + 0x08, 0xF5, 0xDA, 0xD4, 0xF4, 0x1A, 0x28, 0x22, 0x23, 0x26, 0x1C, 0xFD, 0xD2, 0xC3, 0xE0, 0x00, + 0x0C, 0x0C, 0x0C, 0x00, 0xEF, 0xDD, 0xD9, 0xF4, 0x19, 0x2A, 0x26, 0x1F, 0x21, 0x1F, 0x02, 0xD1, + 0xC1, 0xDE, 0xFF, 0x09, 0x0A, 0x0C, 0x05, 0xF2, 0xDE, 0xD9, 0xF1, 0x0E, 0x26, 0x28, 0x20, 0x1E, + 0x20, 0x10, 0xE5, 0xC4, 0xCE, 0xF5, 0x0A, 0x09, 0x09, 0x0C, 0xFD, 0xE5, 0xD8, 0xE0, 0x01, 0x22, + 0x29, 0x21, 0x20, 0x21, 0x1F, 0x00, 0xCE, 0xC2, 0xE0, 0x00, 0x09, 0x09, 0x0C, 0x06, 0xF3, 0xDC, + 0xD8, 0xF4, 0x13, 0x27, 0x26, 0x20, 0x20, 0x20, 0x12, 0xEE, 0xC5, 0xC5, 0xEA, 0x07, 0x09, 0x09, + 0x0B, 0x00, 0xEC, 0xD6, 0xDC, 0x01, 0x1E, 0x25, 0x21, 0x21, 0x21, 0x1C, 0x08, 0xE4, 0xC3, 0xCC, + 0xF1, 0x0A, 0x0A, 0x09, 0x0A, 0xFD, 0xE7, 0xD5, 0xE2, 0x08, 0x22, 0x22, 0x1F, 0x21, 0x20, 0x18, + 0x07, 0xE2, 0xC3, 0xCB, 0xF2, 0x0B, 0x0A, 0x09, 0x0B, 0x00, 0xE7, 0xD3, 0xE2, 0x0B, 0x23, 0x21, + 0x1D, 0x23, 0x24, 0x1A, 0x06, 0xE0, 0xC2, 0xCB, 0xF1, 0x0C, 0x0B, 0x0C, 0x0B, 0x00, 0xE9, 0xD4, + 0xE1, 0x06, 0x1F, 0x22, 0x1D, 0x20, 0x22, 0x1A, 0x0C, 0xED, 0xC7, 0xC6, 0xE7, 0x06, 0x0B, 0x0A, + 0x0B, 0x06, 0xF2, 0xDF, 0xDC, 0xF3, 0x13, 0x22, 0x21, 0x1D, 0x20, 0x1C, 0x16, 0xFE, 0xD5, 0xC1, + 0xD6, 0xFB, 0x0B, 0x09, 0x0E, 0x0E, 0xFC, 0xE7, 0xE0, 0xE5, 0xFA, 0x16, 0x25, 0x20, 0x1A, 0x1C, + 0x1D, 0x15, 0xF1, 0xCC, 0xC8, 0xE1, 0xFD, 0x06, 0x0C, 0x14, 0x0C, 0xF5, 0xE9, 0xEC, 0xE7, 0xF0, + 0x0E, 0x27, 0x26, 0x15, 0x14, 0x20, 0x18, 0xF3, 0xCF, 0xCC, 0xE3, 0xF9, 0x01, 0x0C, 0x18, 0x0C, + 0xF5, 0xEC, 0xF3, 0xF0, 0xE9, 0xF9, 0x1F, 0x2F, 0x19, 0x0C, 0x1B, 0x22, 0x08, 0xDB, 0xC9, 0xDC, + 0xF1, 0xF9, 0x05, 0x16, 0x16, 0x01, 0xED, 0xF1, 0xF9, 0xEC, 0xE6, 0x01, 0x24, 0x29, 0x12, 0x0E, + 0x1E, 0x1C, 0xFE, 0xD8, 0xCF, 0xE2, 0xF1, 0xFA, 0x09, 0x18, 0x12, 0xFE, 0xF0, 0xF3, 0xF9, 0xEE, + 0xE9, 0xFE, 0x1E, 0x27, 0x17, 0x10, 0x1B, 0x1A, 0x00, 0xDB, 0xCF, 0xDF, 0xF2, 0xFC, 0x07, 0x14, + 0x14, 0x02, 0xF1, 0xF0, 0xF8, 0xF1, 0xEB, 0xF9, 0x17, 0x26, 0x1B, 0x10, 0x15, 0x19, 0x07, 0xE7, + 0xD3, 0xDA, 0xED, 0xFB, 0x02, 0x0F, 0x15, 0x09, 0xF7, 0xF1, 0xF6, 0xF5, 0xEB, 0xF1, 0x09, 0x22, + 0x21, 0x13, 0x12, 0x1B, 0x13, 0xF5, 0xD7, 0xD3, 0xE5, 0xF7, 0xFF, 0x0A, 0x15, 0x11, 0x00, 0xF1, + 0xF1, 0xF7, 0xF0, 0xEB, 0xFD, 0x19, 0x24, 0x1A, 0x10, 0x16, 0x18, 0x07, 0xE4, 0xD2, 0xDA, 0xEE, + 0xFB, 0x04, 0x0F, 0x16, 0x0B, 0xF9, 0xF0, 0xF5, 0xF5, 0xED, 0xF1, 0x07, 0x1E, 0x21, 0x14, 0x12, + 0x1B, 0x16, 0xFD, 0xD9, 0xCC, 0xDE, 0xF5, 0xFE, 0x06, 0x14, 0x17, 0x07, 0xF4, 0xEE, 0xF6, 0xF6, + 0xEC, 0xF3, 0x0D, 0x23, 0x21, 0x10, 0x10, 0x1A, 0x17, 0xF9, 0xD7, 0xCF, 0xE3, 0xF7, 0xFD, 0x04, + 0x15, 0x18, 0x07, 0xF3, 0xEF, 0xF7, 0xF6, 0xEA, 0xF1, 0x0D, 0x24, 0x20, 0x10, 0x0E, 0x19, 0x18, + 0xFB, 0xD9, 0xCF, 0xE1, 0xF6, 0xFD, 0x02, 0x13, 0x18, 0x09, 0xF6, 0xEE, 0xF6, 0xF5, 0xEA, 0xEF, + 0x0C, 0x24, 0x22, 0x11, 0x0F, 0x1A, 0x1A, 0xFC, 0xD7, 0xCB, 0xE0, 0xF6, 0xFC, 0x01, 0x14, 0x1B, + 0x0C, 0xF5, 0xED, 0xF4, 0xF5, 0xEA, 0xED, 0x0A, 0x27, 0x24, 0x12, 0x0C, 0x1A, 0x1D, 0x00, 0xD6, + 0xC9, 0xDE, 0xF6, 0xFD, 0x00, 0x11, 0x1D, 0x11, 0xF7, 0xEB, 0xF4, 0xF9, 0xEB, 0xE9, 0x03, 0x24, + 0x28, 0x14, 0x09, 0x16, 0x21, 0x0A, 0xDF, 0xC8, 0xD6, 0xF3, 0xFB, 0xFC, 0x0A, 0x1D, 0x18, 0x00, + 0xEB, 0xF0, 0xFB, 0xF1, 0xE5, 0xF8, 0x1A, 0x2C, 0x1C, 0x06, 0x0D, 0x1E, 0x1C, 0xF6, 0xCC, 0xCB, + 0xE8, 0xF9, 0xF9, 0x00, 0x14, 0x20, 0x0F, 0xF2, 0xED, 0xF7, 0xF8, 0xE9, 0xE7, 0x05, 0x29, 0x29, + 0x11, 0x07, 0x17, 0x25, 0x0C, 0xDA, 0xC3, 0xD5, 0xF3, 0xFC, 0xFA, 0x07, 0x20, 0x1E, 0x02, 0xEB, + 0xED, 0xFB, 0xF2, 0xE3, 0xF0, 0x17, 0x30, 0x21, 0x07, 0x09, 0x1F, 0x24, 0xFE, 0xCD, 0xC3, 0xE2, + 0xFB, 0xFA, 0xFA, 0x0E, 0x24, 0x1B, 0xF9, 0xE8, 0xF2, 0xFD, 0xEE, 0xE1, 0xF6, 0x20, 0x31, 0x1B, + 0x04, 0x0C, 0x24, 0x21, 0xF4, 0xC8, 0xC6, 0xE8, 0xFB, 0xF7, 0xFB, 0x12, 0x26, 0x19, 0xF7, 0xE8, + 0xF4, 0xFC, 0xEB, 0xE0, 0xFA, 0x24, 0x30, 0x18, 0x03, 0x0F, 0x26, 0x21, 0xEF, 0xC3, 0xC6, 0xE8, + 0xFB, 0xF6, 0xFA, 0x15, 0x28, 0x1A, 0xF8, 0xE7, 0xF3, 0xF9, 0xE8, 0xE0, 0xFC, 0x27, 0x32, 0x17, + 0x03, 0x10, 0x28, 0x22, 0xEF, 0xC2, 0xC4, 0xE6, 0xFA, 0xF6, 0xF7, 0x14, 0x2A, 0x1D, 0xFA, 0xE6, + 0xF1, 0xF8, 0xE8, 0xE0, 0xFB, 0x26, 0x34, 0x1C, 0x04, 0x0D, 0x26, 0x25, 0xF7, 0xC7, 0xC2, 0xE2, + 0xF9, 0xF7, 0xF5, 0x0D, 0x28, 0x22, 0x00, 0xE8, 0xEF, 0xF9, 0xED, 0xDE, 0xF0, 0x1B, 0x35, 0x21, + 0x06, 0x08, 0x20, 0x2B, 0x09, 0xD5, 0xC1, 0xD4, 0xF1, 0xF4, 0xF3, 0x02, 0x21, 0x2A, 0x0E, 0xF1, + 0xEB, 0xF9, 0xF4, 0xE0, 0xDF, 0x04, 0x2D, 0x30, 0x12, 0x01, 0x12, 0x2A, 0x24, 0xF6, 0xC9, 0xC6, + 0xDE, 0xF1, 0xF0, 0xF4, 0x0F, 0x2A, 0x25, 0x05, 0xEF, 0xF1, 0xFA, 0xED, 0xDB, 0xE3, 0x0D, 0x2D, + 0x28, 0x0F, 0x06, 0x19, 0x2A, 0x20, 0xF3, 0xC9, 0xC7, 0xDB, 0xEC, 0xEE, 0xF9, 0x12, 0x2A, 0x24, + 0x08, 0xF5, 0xF2, 0xF6, 0xEA, 0xDB, 0xE4, 0x0A, 0x2A, 0x29, 0x12, 0x09, 0x17, 0x27, 0x22, 0xFD, + 0xD0, 0xC4, 0xD3, 0xE7, 0xEE, 0xF7, 0x0C, 0x25, 0x29, 0x12, 0xFB, 0xF1, 0xF4, 0xEC, 0xDC, 0xDD, + 0xFF, 0x23, 0x2D, 0x1B, 0x0B, 0x11, 0x22, 0x26, 0x0D, 0xE1, 0xC6, 0xC9, 0xDB, 0xEB, 0xF1, 0x01, + 0x1C, 0x2A, 0x21, 0x08, 0xF4, 0xF2, 0xEE, 0xE1, 0xD9, 0xEC, 0x12, 0x2E, 0x27, 0x14, 0x0C, 0x19, + 0x25, 0x1D, 0xFE, 0xD5, 0xC2, 0xCE, 0xDF, 0xEC, 0xF7, 0x08, 0x22, 0x2C, 0x1B, 0x03, 0xF3, 0xF1, + 0xEA, 0xDB, 0xDB, 0xF6, 0x1C, 0x2F, 0x24, 0x11, 0x10, 0x1B, 0x23, 0x17, 0xF8, 0xD6, 0xC5, 0xCD, + 0xDE, 0xEA, 0xFA, 0x0C, 0x21, 0x29, 0x1C, 0x05, 0xF6, 0xEF, 0xE9, 0xDE, 0xDC, 0xF0, 0x15, 0x2A, + 0x26, 0x16, 0x10, 0x18, 0x22, 0x1D, 0x03, 0xE0, 0xC4, 0xC6, 0xD8, 0xE7, 0xF5, 0x03, 0x1B, 0x2B, + 0x25, 0x10, 0xFB, 0xEF, 0xEB, 0xE5, 0xDA, 0xE4, 0x00, 0x20, 0x2C, 0x20, 0x10, 0x12, 0x1C, 0x22, + 0x18, 0xF7, 0xD1, 0xC2, 0xCB, 0xDD, 0xEC, 0xF7, 0x0B, 0x23, 0x2E, 0x23, 0x0A, 0xF6, 0xEF, 0xEB, + 0xE3, 0xDB, 0xE4, 0x01, 0x21, 0x29, 0x1E, 0x10, 0x11, 0x1D, 0x23, 0x18, 0xFC, 0xD5, 0xC2, 0xCA, + 0xDA, 0xEB, 0xF7, 0x07, 0x21, 0x30, 0x27, 0x10, 0xF9, 0xEE, 0xEB, 0xE4, 0xDC, 0xE1, 0xF9, 0x19, + 0x29, 0x23, 0x16, 0x11, 0x17, 0x1E, 0x1C, 0x08, 0xE3, 0xC7, 0xC4, 0xD3, 0xE6, 0xF3, 0x00, 0x15, + 0x29, 0x2D, 0x1D, 0x03, 0xF1, 0xEB, 0xE9, 0xE4, 0xDF, 0xE9, 0x03, 0x1F, 0x27, 0x1E, 0x10, 0x0E, + 0x16, 0x1D, 0x1B, 0x04, 0xE4, 0xC9, 0xC7, 0xD5, 0xE6, 0xF3, 0x00, 0x13, 0x27, 0x2C, 0x1D, 0x05, + 0xF3, 0xED, 0xEA, 0xE5, 0xE0, 0xE8, 0x00, 0x1A, 0x23, 0x1D, 0x11, 0x0F, 0x15, 0x1C, 0x1D, 0x0E, + 0xF1, 0xD2, 0xC6, 0xCF, 0xDE, 0xEE, 0xF9, 0x09, 0x1E, 0x2B, 0x26, 0x13, 0xFE, 0xF2, 0xED, 0xE9, + 0xE2, 0xE1, 0xF0, 0x08, 0x1D, 0x1F, 0x17, 0x0F, 0x12, 0x1A, 0x1E, 0x1C, 0x09, 0xEA, 0xCF, 0xC3, + 0xCD, 0xDE, 0xEC, 0xFB, 0x0D, 0x20, 0x2D, 0x29, 0x15, 0x00, 0xF2, 0xEC, 0xE7, 0xE1, 0xE1, 0xED, + 0x02, 0x18, 0x1E, 0x1A, 0x13, 0x14, 0x19, 0x1B, 0x1A, 0x0F, 0xF6, 0xD8, 0xC6, 0xC5, 0xD6, 0xE7, + 0xF7, 0x05, 0x18, 0x29, 0x2F, 0x21, 0x0B, 0xF7, 0xEC, 0xE8, 0xE3, 0xDF, 0xE5, 0xF5, 0x0D, 0x1D, + 0x20, 0x19, 0x13, 0x15, 0x19, 0x18, 0x15, 0x07, 0xF0, 0xD5, 0xC5, 0xCB, 0xDC, 0xED, 0xFA, 0x07, + 0x1A, 0x2A, 0x2D, 0x1F, 0x07, 0xF6, 0xEB, 0xE8, 0xE4, 0xE0, 0xE6, 0xFA, 0x0F, 0x1E, 0x1E, 0x16, + 0x12, 0x13, 0x15, 0x13, 0x10, 0x08, 0xF7, 0xE0, 0xCB, 0xCB, 0xD9, 0xEA, 0xF9, 0x04, 0x12, 0x22, + 0x2A, 0x24, 0x0F, 0xFC, 0xEE, 0xEA, 0xE6, 0xE2, 0xE2, 0xF1, 0x08, 0x1A, 0x1E, 0x18, 0x13, 0x14, + 0x15, 0x14, 0x0F, 0x0A, 0xFF, 0xEB, 0xD4, 0xCB, 0xD3, 0xE4, 0xF6, 0x00, 0x0C, 0x1A, 0x27, 0x27, + 0x19, 0x03, 0xF2, 0xEA, 0xE8, 0xE4, 0xE2, 0xE9, 0xFC, 0x11, 0x1E, 0x1C, 0x16, 0x12, 0x14, 0x14, + 0x0F, 0x0A, 0x05, 0xFB, 0xE4, 0xD3, 0xCE, 0xD9, 0xEC, 0xFA, 0x02, 0x0E, 0x1B, 0x27, 0x23, 0x13, + 0x00, 0xF1, 0xEB, 0xEB, 0xE8, 0xE6, 0xED, 0xFF, 0x11, 0x1B, 0x1A, 0x13, 0x10, 0x12, 0x12, 0x0F, + 0x0B, 0x06, 0xF9, 0xE7, 0xD5, 0xD0, 0xDC, 0xEB, 0xFA, 0x02, 0x0C, 0x1A, 0x24, 0x22, 0x13, 0x00, + 0xF1, 0xEC, 0xEC, 0xEB, 0xE8, 0xEE, 0xFB, 0x0C, 0x18, 0x18, 0x13, 0x10, 0x0F, 0x11, 0x0E, 0x0B, + 0x0A, 0x00, 0xF0, 0xDE, 0xD3, 0xDA, 0xE6, 0xF4, 0xFE, 0x06, 0x13, 0x20, 0x23, 0x1B, 0x06, 0xF7, + 0xEE, 0xED, 0xED, 0xEA, 0xEB, 0xF4, 0x04, 0x13, 0x18, 0x13, 0x0F, 0x0D, 0x0F, 0x0D, 0x0A, 0x09, + 0x07, 0xFE, 0xED, 0xDB, 0xD7, 0xDF, 0xEF, 0xF9, 0x00, 0x0A, 0x16, 0x20, 0x21, 0x12, 0x00, 0xF3, + 0xEE, 0xEF, 0xED, 0xEA, 0xED, 0xF9, 0x08, 0x14, 0x14, 0x10, 0x0C, 0x0D, 0x0D, 0x0B, 0x08, 0x08, + 0x09, 0x01, 0xF1, 0xDE, 0xD6, 0xE1, 0xEE, 0xFA, 0x00, 0x07, 0x14, 0x20, 0x20, 0x14, 0x00, 0xF2, + 0xEE, 0xEF, 0xEE, 0xEB, 0xEB, 0xF7, 0x07, 0x14, 0x15, 0x10, 0x0B, 0x0C, 0x0C, 0x0A, 0x04, 0x03, + 0x08, 0x09, 0xFD, 0xE9, 0xD7, 0xDA, 0xE9, 0xF7, 0xFE, 0x00, 0x09, 0x19, 0x22, 0x1D, 0x0A, 0xF8, + 0xEF, 0xF0, 0xF1, 0xEB, 0xE9, 0xF1, 0x02, 0x12, 0x17, 0x11, 0x0B, 0x0A, 0x0C, 0x0A, 0x02, 0x00, + 0x02, 0x0B, 0x0F, 0x00, 0xE8, 0xDA, 0xDC, 0xEB, 0xF5, 0xFA, 0xFD, 0x07, 0x1A, 0x25, 0x1B, 0x09, + 0xF7, 0xF1, 0xF1, 0xED, 0xE7, 0xE5, 0xF2, 0x08, 0x16, 0x18, 0x10, 0x0B, 0x0D, 0x0D, 0x06, 0xFE, + 0xFB, 0x00, 0x0D, 0x12, 0x07, 0xF1, 0xDF, 0xDD, 0xE7, 0xF0, 0xF4, 0xF8, 0x04, 0x15, 0x21, 0x1C, + 0x0C, 0xFD, 0xF4, 0xF2, 0xEC, 0xE6, 0xE9, 0xF7, 0x0A, 0x16, 0x17, 0x10, 0x0E, 0x0C, 0x09, 0x00, + 0xFB, 0xFA, 0x01, 0x0B, 0x0F, 0x0B, 0x02, 0xF6, 0xE7, 0xE2, 0xE2, 0xE9, 0xF2, 0xFC, 0x07, 0x13, + 0x18, 0x16, 0x0A, 0x00, 0xF5, 0xED, 0xEB, 0xEE, 0xF7, 0x04, 0x0E, 0x14, 0x13, 0x0F, 0x0A, 0x04, + 0xFE, 0xFA, 0xFA, 0x00, 0x05, 0x0A, 0x0B, 0x0C, 0x0A, 0x03, 0xF2, 0xE1, 0xD9, 0xDF, 0xED, 0xFA, + 0x02, 0x09, 0x12, 0x18, 0x15, 0x07, 0xF8, 0xEE, 0xEC, 0xF3, 0xFA, 0x01, 0x07, 0x0D, 0x11, 0x10, + 0x08, 0x00, 0xFB, 0xFB, 0xFE, 0x02, 0x07, 0x0D, 0x11, 0x10, 0x09, 0x03, 0xFC, 0xF0, 0xE2, 0xDC, + 0xE1, 0xEE, 0xFC, 0x02, 0x08, 0x0E, 0x11, 0x0D, 0x01, 0xF6, 0xEF, 0xF4, 0xFC, 0x02, 0x04, 0x08, + 0x0C, 0x0E, 0x0A, 0x02, 0xFC, 0xFC, 0x00, 0x04, 0x07, 0x0B, 0x0C, 0x0C, 0x06, 0x00, 0xFA, 0xF8, + 0xF8, 0xF4, 0xEF, 0xE9, 0xEF, 0xFB, 0x01, 0x00, 0xFE, 0x00, 0x06, 0x05, 0xFF, 0xF7, 0xF8, 0xFF, + 0x03, 0x03, 0x02, 0x06, 0x0C, 0x0B, 0x06, 0x02, 0x01, 0x03, 0x05, 0x05, 0x05, 0x07, 0x05, 0x00, + 0xF9, 0xF8, 0xFB, 0xFF, 0x01, 0xFF, 0xF9, 0xF5, 0xF4, 0xF7, 0xF5, 0xF3, 0xF5, 0xFC, 0xFF, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, + 0x05, 0x01, 0xFD, 0xFE, 0x00, 0x01, 0x02, 0x01, 0x00, 0xFD, 0xFE, 0xFA, 0xEF, 0xEB, 0xF2, 0xFA, + 0xFD, 0xFA, 0xFC, 0x03, 0x05, 0x00, 0xFA, 0xFD, 0x02, 0x05, 0x05, 0x07, 0x0B, 0x0B, 0x08, 0x03, + 0x03, 0x04, 0x03, 0x00, 0x00, 0x04, 0x03, 0xFD, 0xFC, 0x00, 0x01, 0x00, 0x01, 0x03, 0x00, 0xF9, + 0xF3, 0xEF, 0xEE, 0xF1, 0xF7, 0xFD, 0xFF, 0xFF, 0x01, 0x03, 0x04, 0x04, 0x02, 0x00, 0x01, 0x01, + 0x02, 0x05, 0x08, 0x09, 0x08, 0x06, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x03, 0x01, + 0xFE, 0xFC, 0xFA, 0xF9, 0xF8, 0xFA, 0xF8, 0xF9, 0xFA, 0xFC, 0xFC, 0xFD, 0xFF, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0x04, + 0x04, 0x04, 0x01, 0xFF, 0xFD, 0xFE, 0xFE, 0xFE, 0xFD, 0xFE, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 0xFD, + 0xFC, 0xFF, 0x00, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFC, 0xFD, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, + 0xFE, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, + 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + } ; + +unsigned char snd_oing[4084] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFD, 0xFC, 0xFB, 0x00, 0x07, 0x09, 0x07, 0x04, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xF8, 0xF8, 0x00, + 0x04, 0x05, 0x04, 0x01, 0x00, 0xFF, 0xFD, 0xFE, 0xFD, 0xFD, 0xFE, 0x00, 0x02, 0x04, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFD, 0xFC, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xEA, 0xDD, 0xD5, 0xD2, 0xDA, 0xE8, 0xF7, 0x08, + 0x18, 0x26, 0x2D, 0x2E, 0x27, 0x1B, 0x0B, 0xF6, 0xDB, 0xC7, 0xC9, 0xDF, 0xFF, 0x1E, 0x32, 0x39, + 0x35, 0x2A, 0x15, 0x01, 0xF0, 0xDF, 0xD1, 0xCD, 0xD2, 0xE2, 0xF5, 0x07, 0x1B, 0x2E, 0x39, 0x3A, + 0x32, 0x21, 0x0C, 0xFA, 0xE9, 0xDA, 0xD5, 0xD7, 0xDF, 0xEC, 0xFE, 0x0F, 0x1D, 0x27, 0x29, 0x26, + 0x1C, 0x0E, 0x00, 0xF1, 0xE6, 0xDE, 0xDC, 0xE3, 0xEA, 0xF4, 0x00, 0x0B, 0x1A, 0x2F, 0x3D, 0x3F, + 0x33, 0x0C, 0xD9, 0xC0, 0xC1, 0xC4, 0xD3, 0xF1, 0x0D, 0x29, 0x3D, 0x3E, 0x3F, 0x3E, 0x28, 0x09, + 0xED, 0xD0, 0xC0, 0xC2, 0xC1, 0xC5, 0xDB, 0xF6, 0x13, 0x2F, 0x3D, 0x3F, 0x3E, 0x37, 0x20, 0x04, + 0xEA, 0xD1, 0xC4, 0xC0, 0xC6, 0xD8, 0xF0, 0x05, 0x1F, 0x35, 0x3D, 0x3E, 0x35, 0x23, 0x0F, 0xF1, + 0xD1, 0xC1, 0xC0, 0xD1, 0xF2, 0x13, 0x28, 0x33, 0x34, 0x2A, 0x19, 0x06, 0xF4, 0xE2, 0xD2, 0xCB, + 0xCD, 0xD6, 0xE6, 0xF7, 0x08, 0x1A, 0x29, 0x2D, 0x2A, 0x20, 0x12, 0x03, 0xF4, 0xE6, 0xDC, 0xD9, + 0xDB, 0xE3, 0xF1, 0xFE, 0x09, 0x15, 0x1E, 0x1F, 0x1B, 0x14, 0x08, 0xFD, 0xF3, 0xE9, 0xE2, 0xE2, + 0xE7, 0xEE, 0xF5, 0xFE, 0x08, 0x19, 0x33, 0x3F, 0x32, 0x14, 0xEC, 0xCA, 0xC0, 0xC6, 0xD4, 0xEB, + 0x04, 0x1B, 0x30, 0x3D, 0x3E, 0x34, 0x21, 0x0C, 0xF7, 0xE0, 0xCD, 0xC2, 0xC2, 0xCD, 0xDE, 0xF2, + 0x07, 0x1D, 0x2F, 0x36, 0x34, 0x28, 0x16, 0x04, 0xF1, 0xDF, 0xD2, 0xCE, 0xD3, 0xE0, 0xF0, 0x00, + 0x11, 0x21, 0x2A, 0x2C, 0x27, 0x1A, 0x09, 0xF7, 0xE5, 0xD2, 0xC7, 0xCB, 0xDE, 0xFB, 0x13, 0x23, + 0x2A, 0x28, 0x1F, 0x12, 0x03, 0xF5, 0xE7, 0xDA, 0xD4, 0xD5, 0xDD, 0xEA, 0xF8, 0x08, 0x18, 0x23, + 0x26, 0x22, 0x19, 0x0D, 0x00, 0xF3, 0xE7, 0xDF, 0xDC, 0xDF, 0xE8, 0xF3, 0xFE, 0x0A, 0x15, 0x1E, + 0x1F, 0x1B, 0x12, 0x06, 0xFB, 0xF1, 0xE8, 0xE3, 0xE2, 0xE6, 0xF0, 0xFA, 0x03, 0x0D, 0x15, 0x23, + 0x35, 0x37, 0x23, 0xFE, 0xD5, 0xC0, 0xC2, 0xC9, 0xDD, 0xF9, 0x10, 0x29, 0x3C, 0x3F, 0x3D, 0x32, + 0x18, 0xFF, 0xE6, 0xCF, 0xC3, 0xC0, 0xC5, 0xD6, 0xED, 0x03, 0x1B, 0x2F, 0x3A, 0x3C, 0x33, 0x21, + 0x0D, 0xF8, 0xE3, 0xD2, 0xC9, 0xCC, 0xD6, 0xE7, 0xFC, 0x10, 0x22, 0x2F, 0x33, 0x2F, 0x24, 0x12, + 0x00, 0xED, 0xDA, 0xC9, 0xC1, 0xCA, 0xE3, 0x01, 0x1D, 0x30, 0x37, 0x34, 0x28, 0x16, 0x04, 0xF1, + 0xDF, 0xD1, 0xCC, 0xD1, 0xDF, 0xF0, 0x01, 0x13, 0x24, 0x2D, 0x2E, 0x27, 0x1B, 0x0D, 0xFE, 0xEF, + 0xE3, 0xDD, 0xDC, 0xE2, 0xEE, 0xFB, 0x08, 0x15, 0x1F, 0x24, 0x20, 0x18, 0x0D, 0x00, 0xF5, 0xEB, + 0xE3, 0xE3, 0xE7, 0xEF, 0xFB, 0x04, 0x0F, 0x18, 0x1D, 0x2B, 0x37, 0x31, 0x19, 0xF0, 0xCC, 0xC1, + 0xC0, 0xC9, 0xE5, 0x01, 0x1D, 0x39, 0x3F, 0x3D, 0x3F, 0x30, 0x0F, 0xF2, 0xD3, 0xC1, 0xC1, 0xC1, + 0xC6, 0xDD, 0xF9, 0x16, 0x35, 0x3F, 0x3E, 0x3F, 0x31, 0x16, 0xFE, 0xDF, 0xC5, 0xC0, 0xC1, 0xC6, + 0xDC, 0xF8, 0x10, 0x2D, 0x3E, 0x3F, 0x3C, 0x30, 0x1A, 0x02, 0xE8, 0xCD, 0xC1, 0xC0, 0xC8, 0xE0, + 0x02, 0x23, 0x38, 0x3F, 0x3E, 0x30, 0x1A, 0x04, 0xEC, 0xD3, 0xC5, 0xC0, 0xC6, 0xD7, 0xED, 0x02, + 0x1B, 0x32, 0x3D, 0x3D, 0x32, 0x20, 0x0A, 0xF5, 0xE0, 0xD0, 0xC9, 0xCD, 0xD9, 0xEC, 0x00, 0x15, + 0x28, 0x35, 0x35, 0x2E, 0x1E, 0x0B, 0xF8, 0xE4, 0xD5, 0xCD, 0xD1, 0xDC, 0xEC, 0xFE, 0x0E, 0x1D, + 0x2A, 0x35, 0x3E, 0x3F, 0x2C, 0x00, 0xD2, 0xC1, 0xC1, 0xC2, 0xD1, 0xEF, 0x11, 0x31, 0x3F, 0x3E, + 0x3F, 0x39, 0x20, 0x00, 0xDC, 0xC2, 0xC1, 0xC3, 0xC0, 0xCD, 0xEB, 0x0B, 0x2E, 0x3F, 0x3D, 0x3F, + 0x39, 0x20, 0x05, 0xE6, 0xC7, 0xC0, 0xC1, 0xC0, 0xD5, 0xF2, 0x0B, 0x2A, 0x3E, 0x3E, 0x3F, 0x34, + 0x1C, 0x03, 0xE6, 0xCB, 0xC2, 0xC0, 0xC6, 0xDD, 0xFD, 0x19, 0x31, 0x3E, 0x3F, 0x34, 0x21, 0x0B, + 0xF6, 0xDE, 0xCA, 0xC1, 0xC3, 0xCF, 0xE3, 0xF9, 0x11, 0x28, 0x38, 0x3B, 0x31, 0x21, 0x0C, 0xF8, + 0xE4, 0xD1, 0xCA, 0xCE, 0xD8, 0xE9, 0xFD, 0x10, 0x23, 0x30, 0x33, 0x2C, 0x1E, 0x0D, 0xFA, 0xE6, + 0xD8, 0xD1, 0xD4, 0xDF, 0xEE, 0x00, 0x10, 0x1E, 0x28, 0x2A, 0x2D, 0x31, 0x2A, 0x16, 0xF1, 0xCA, + 0xC0, 0xC1, 0xC4, 0xDC, 0xFE, 0x1F, 0x3C, 0x3F, 0x3C, 0x3F, 0x2E, 0x0D, 0xEF, 0xD0, 0xC1, 0xC2, + 0xC0, 0xC8, 0xE4, 0x01, 0x22, 0x3B, 0x3F, 0x3E, 0x3B, 0x24, 0x08, 0xEE, 0xCE, 0xC0, 0xC1, 0xC3, + 0xD4, 0xF0, 0x07, 0x24, 0x3A, 0x3F, 0x3D, 0x2F, 0x18, 0x01, 0xE7, 0xCE, 0xC2, 0xC1, 0xCA, 0xDF, + 0xF6, 0x0B, 0x20, 0x30, 0x37, 0x33, 0x26, 0x14, 0x00, 0xEB, 0xD7, 0xC9, 0xC7, 0xCE, 0xDF, 0xF2, + 0x06, 0x1C, 0x2E, 0x35, 0x30, 0x23, 0x11, 0xFE, 0xEA, 0xD9, 0xD1, 0xD1, 0xDB, 0xEA, 0xFB, 0x0D, + 0x1F, 0x2B, 0x2F, 0x29, 0x1D, 0x0C, 0xFB, 0xE9, 0xDB, 0xD5, 0xD8, 0xE1, 0xF1, 0x00, 0x11, 0x20, + 0x26, 0x26, 0x1D, 0x10, 0x11, 0x1B, 0x1C, 0x07, 0xDE, 0xC1, 0xC0, 0xC3, 0xD1, 0xF2, 0x16, 0x34, + 0x3F, 0x3E, 0x3F, 0x33, 0x15, 0xF5, 0xD1, 0xC0, 0xC3, 0xC0, 0xC9, 0xE6, 0x02, 0x24, 0x3E, 0x3F, + 0x3F, 0x3B, 0x20, 0x02, 0xE7, 0xCB, 0xC0, 0xC1, 0xC6, 0xDC, 0xF5, 0x10, 0x2E, 0x3E, 0x3E, 0x3B, + 0x2A, 0x10, 0xF8, 0xDE, 0xC8, 0xC0, 0xC5, 0xD5, 0xEA, 0xFD, 0x0F, 0x25, 0x37, 0x3E, 0x36, 0x24, + 0x0E, 0xF7, 0xDF, 0xCA, 0xC1, 0xC6, 0xD5, 0xE9, 0x00, 0x18, 0x2E, 0x3B, 0x39, 0x2C, 0x18, 0x01, + 0xEA, 0xD6, 0xCA, 0xCC, 0xD7, 0xE9, 0xFD, 0x12, 0x26, 0x33, 0x35, 0x2E, 0x1E, 0x0A, 0xF6, 0xE2, + 0xD3, 0xCE, 0xD4, 0xE2, 0xF4, 0x07, 0x1B, 0x2B, 0x30, 0x29, 0x1A, 0x04, 0xF0, 0xF3, 0x0F, 0x27, + 0x17, 0xEC, 0xC9, 0xC0, 0xC4, 0xD1, 0xF0, 0x1B, 0x3B, 0x3F, 0x3C, 0x3F, 0x33, 0x0F, 0xE7, 0xC9, + 0xC0, 0xC1, 0xC0, 0xD1, 0xF1, 0x15, 0x38, 0x3F, 0x3C, 0x3F, 0x30, 0x10, 0xF2, 0xCF, 0xC0, 0xC3, + 0xC0, 0xCB, 0xE7, 0x06, 0x2C, 0x3F, 0x3F, 0x3F, 0x33, 0x16, 0xFA, 0xDB, 0xC5, 0xC0, 0xC2, 0xCF, + 0xE8, 0x01, 0x16, 0x2B, 0x39, 0x3F, 0x3A, 0x26, 0x0E, 0xF5, 0xD7, 0xC3, 0xC0, 0xC5, 0xD3, 0xEC, + 0x05, 0x21, 0x38, 0x3F, 0x39, 0x2A, 0x13, 0xFA, 0xDF, 0xC8, 0xC0, 0xC7, 0xD8, 0xF0, 0x08, 0x22, + 0x37, 0x3E, 0x37, 0x28, 0x12, 0xFC, 0xE5, 0xD0, 0xC8, 0xCD, 0xDB, 0xEF, 0x03, 0x1A, 0x2F, 0x36, + 0x32, 0x22, 0x0A, 0xF3, 0xD9, 0xD0, 0xEC, 0x17, 0x33, 0x22, 0xEE, 0xC9, 0xC0, 0xC5, 0xDE, 0x03, + 0x29, 0x3D, 0x3F, 0x3F, 0x36, 0x18, 0xF4, 0xD1, 0xC1, 0xC0, 0xC1, 0xD1, 0xEF, 0x0F, 0x32, 0x3F, + 0x3E, 0x3F, 0x2B, 0x0C, 0xF1, 0xD1, 0xC1, 0xC1, 0xC5, 0xDA, 0xF7, 0x13, 0x31, 0x3F, 0x3F, 0x37, + 0x22, 0x08, 0xEB, 0xCC, 0xC0, 0xC2, 0xCD, 0xE3, 0xFF, 0x18, 0x2B, 0x30, 0x2E, 0x29, 0x1F, 0x0E, + 0xF8, 0xE0, 0xCD, 0xC5, 0xCC, 0xDC, 0xF2, 0x09, 0x20, 0x31, 0x37, 0x2F, 0x1F, 0x0A, 0xF5, 0xDF, + 0xCD, 0xC9, 0xD2, 0xE3, 0xF9, 0x10, 0x27, 0x35, 0x35, 0x2A, 0x17, 0x01, 0xEB, 0xD8, 0xCF, 0xD2, + 0xDE, 0xEF, 0x02, 0x14, 0x25, 0x2D, 0x29, 0x1E, 0x0C, 0xFA, 0xE7, 0xD5, 0xD1, 0xD9, 0xEA, 0x10, + 0x37, 0x3F, 0x2E, 0x01, 0xD3, 0xC1, 0xC4, 0xD3, 0xF2, 0x15, 0x32, 0x3F, 0x3E, 0x33, 0x1C, 0x00, + 0xDF, 0xC5, 0xC0, 0xC5, 0xCF, 0xE8, 0x05, 0x21, 0x39, 0x3F, 0x37, 0x25, 0x0A, 0xF1, 0xD9, 0xC7, + 0xC6, 0xD2, 0xE6, 0x00, 0x18, 0x2E, 0x39, 0x36, 0x28, 0x14, 0xFD, 0xE4, 0xD1, 0xCC, 0xD3, 0xE3, + 0xF8, 0x0D, 0x22, 0x2D, 0x29, 0x1D, 0x0E, 0x00, 0xF5, 0xE7, 0xDB, 0xD8, 0xDE, 0xEB, 0xFC, 0x0E, + 0x1E, 0x26, 0x23, 0x19, 0x0B, 0xFB, 0xED, 0xE0, 0xDB, 0xDF, 0xE9, 0xF8, 0x08, 0x18, 0x23, 0x25, + 0x1E, 0x11, 0x01, 0xF1, 0xE4, 0xDD, 0xDF, 0xE9, 0xF7, 0x06, 0x13, 0x1E, 0x20, 0x1A, 0x10, 0x01, + 0xF6, 0xEA, 0xE1, 0xE3, 0xE9, 0xF3, 0x01, 0x0B, 0x1A, 0x2F, 0x3A, 0x37, 0x1A, 0xEB, 0xCC, 0xC0, + 0xC1, 0xD4, 0xF2, 0x1B, 0x3C, 0x3F, 0x3F, 0x3A, 0x1A, 0xF2, 0xD1, 0xC0, 0xC0, 0xC4, 0xD8, 0xFD, + 0x20, 0x39, 0x3F, 0x3C, 0x32, 0x16, 0xF3, 0xD5, 0xC1, 0xC0, 0xCC, 0xDE, 0xFF, 0x20, 0x36, 0x3F, + 0x3C, 0x2B, 0x10, 0xF2, 0xD6, 0xC2, 0xC0, 0xD0, 0xE6, 0x01, 0x1D, 0x34, 0x3D, 0x32, 0x1C, 0x06, + 0xF1, 0xDF, 0xD2, 0xCE, 0xD5, 0xE6, 0xFC, 0x13, 0x28, 0x33, 0x2E, 0x1F, 0x0B, 0xF4, 0xDF, 0xD2, + 0xD0, 0xDB, 0xED, 0x00, 0x16, 0x26, 0x2E, 0x28, 0x1A, 0x09, 0xF5, 0xE2, 0xD6, 0xD7, 0xE2, 0xF2, + 0x05, 0x19, 0x26, 0x28, 0x21, 0x11, 0x00, 0xF0, 0xE1, 0xDB, 0xE0, 0xEB, 0xFB, 0x0A, 0x16, 0x1C, + 0x17, 0x0C, 0x0B, 0x1A, 0x28, 0x21, 0xF9, 0xCD, 0xC1, 0xC0, 0xC9, 0xF1, 0x1C, 0x35, 0x3F, 0x3D, + 0x34, 0x1A, 0xE8, 0xC5, 0xC1, 0xC0, 0xCA, 0xE6, 0x0D, 0x34, 0x3F, 0x3E, 0x3F, 0x25, 0xFB, 0xD9, + 0xC2, 0xC0, 0xC9, 0xD7, 0xFB, 0x24, 0x37, 0x3F, 0x3D, 0x2A, 0x0E, 0xE9, 0xCA, 0xC1, 0xC1, 0xD0, + 0xED, 0x0E, 0x2E, 0x3F, 0x3C, 0x2C, 0x12, 0xF7, 0xDE, 0xCA, 0xC2, 0xCA, 0xDC, 0xF6, 0x15, 0x30, + 0x3F, 0x39, 0x26, 0x0C, 0xEF, 0xD2, 0xC4, 0xC7, 0xDA, 0xF4, 0x11, 0x2C, 0x39, 0x34, 0x23, 0x0B, + 0xF0, 0xD9, 0xCE, 0xD2, 0xE2, 0xF7, 0x0E, 0x24, 0x2F, 0x2C, 0x1E, 0x09, 0xF4, 0xE1, 0xD7, 0xDA, + 0xE8, 0xFA, 0x0C, 0x1D, 0x25, 0x20, 0x13, 0x00, 0xEC, 0xE0, 0xE0, 0xF6, 0x1B, 0x38, 0x32, 0x0B, + 0xDA, 0xC0, 0xC4, 0xD6, 0xF9, 0x27, 0x3F, 0x3E, 0x37, 0x23, 0xF7, 0xD0, 0xC3, 0xC0, 0xC8, 0xE7, + 0x0E, 0x2F, 0x3F, 0x3D, 0x2D, 0x12, 0xEC, 0xCC, 0xC1, 0xC4, 0xD6, 0xF7, 0x1A, 0x35, 0x3F, 0x3A, + 0x24, 0x05, 0xE5, 0xC9, 0xC1, 0xCE, 0xE5, 0x02, 0x21, 0x37, 0x3A, 0x2B, 0x12, 0xF5, 0xDB, 0xD2, + 0xDB, 0xE9, 0xF4, 0xFE, 0x07, 0x15, 0x21, 0x23, 0x1A, 0x0B, 0xFA, 0xE8, 0xDC, 0xDB, 0xE4, 0xF4, + 0x05, 0x15, 0x1F, 0x1E, 0x13, 0x02, 0xF1, 0xE4, 0xE0, 0xE7, 0xF5, 0x04, 0x12, 0x1B, 0x19, 0x0F, + 0x01, 0xF4, 0xEA, 0xE8, 0xEF, 0xFB, 0x07, 0x12, 0x16, 0x12, 0x09, 0xFE, 0xF2, 0xEA, 0xEA, 0xF0, + 0xFA, 0x03, 0x0D, 0x12, 0x19, 0x23, 0x2B, 0x1F, 0xFA, 0xD3, 0xC1, 0xC0, 0xD3, 0xFD, 0x27, 0x3C, + 0x3F, 0x35, 0x12, 0xE7, 0xCA, 0xC0, 0xC5, 0xDB, 0x02, 0x2A, 0x3F, 0x3F, 0x30, 0x14, 0xE9, 0xC7, + 0xC0, 0xCA, 0xDF, 0x04, 0x2C, 0x3E, 0x3C, 0x2C, 0x0C, 0xE6, 0xCA, 0xC1, 0xCC, 0xE7, 0x09, 0x2B, + 0x3E, 0x39, 0x22, 0x04, 0xE4, 0xCB, 0xC5, 0xD5, 0xF2, 0x13, 0x2D, 0x31, 0x21, 0x09, 0xF2, 0xE0, + 0xD8, 0xDE, 0xF0, 0x05, 0x1A, 0x25, 0x23, 0x15, 0x01, 0xED, 0xE0, 0xDF, 0xEA, 0xFB, 0x0D, 0x1B, + 0x20, 0x1A, 0x0D, 0xFD, 0xEE, 0xE5, 0xE7, 0xF1, 0xFF, 0x0D, 0x17, 0x19, 0x13, 0x07, 0xFB, 0xF0, + 0xEB, 0xEF, 0xF8, 0x01, 0x0C, 0x10, 0x0E, 0x08, 0xFF, 0xF6, 0xF0, 0xF0, 0xF8, 0x00, 0x10, 0x27, + 0x32, 0x26, 0xFF, 0xD0, 0xC0, 0xC7, 0xE1, 0x0E, 0x32, 0x3F, 0x3D, 0x1F, 0xF2, 0xD0, 0xC0, 0xC2, + 0xDB, 0x06, 0x2D, 0x3E, 0x3C, 0x26, 0xFF, 0xD8, 0xC3, 0xC6, 0xDF, 0x02, 0x28, 0x3F, 0x3B, 0x23, + 0x01, 0xDE, 0xC8, 0xC9, 0xDE, 0xFF, 0x21, 0x37, 0x37, 0x22, 0x04, 0xE4, 0xCD, 0xCD, 0xE1, 0xFD, + 0x1A, 0x2F, 0x30, 0x1F, 0x06, 0xEA, 0xD4, 0xCF, 0xDC, 0xF5, 0x13, 0x2B, 0x31, 0x25, 0x0C, 0xEF, + 0xD7, 0xD1, 0xDE, 0xF7, 0x12, 0x27, 0x2A, 0x1D, 0x04, 0xEB, 0xDB, 0xDB, 0xE9, 0x00, 0x18, 0x25, + 0x21, 0x11, 0xFA, 0xE6, 0xDD, 0xE4, 0xF6, 0x0B, 0x1C, 0x21, 0x18, 0x08, 0xF4, 0xE3, 0xDF, 0xE9, + 0xFA, 0x0C, 0x19, 0x1B, 0x11, 0x00, 0xF1, 0xF0, 0x06, 0x21, 0x22, 0x02, 0xD9, 0xC0, 0xC8, 0xEA, + 0x18, 0x3B, 0x3F, 0x2C, 0x07, 0xDB, 0xC2, 0xC5, 0xDD, 0x06, 0x2F, 0x3F, 0x36, 0x19, 0xF0, 0xCD, + 0xC2, 0xD4, 0xF6, 0x1D, 0x39, 0x3A, 0x21, 0xFE, 0xDB, 0xC7, 0xCF, 0xEA, 0x0D, 0x2C, 0x37, 0x28, + 0x0A, 0xE9, 0xD1, 0xD0, 0xE4, 0x01, 0x1F, 0x2E, 0x27, 0x10, 0xF4, 0xDF, 0xDC, 0xE7, 0xF8, 0x09, + 0x18, 0x1E, 0x16, 0x07, 0xF5, 0xE8, 0xE7, 0xF2, 0x01, 0x11, 0x19, 0x13, 0x05, 0xF6, 0xEB, 0xE9, + 0xF3, 0x00, 0x0C, 0x15, 0x13, 0x0A, 0xFF, 0xF5, 0xEE, 0xF1, 0xFA, 0x03, 0x0A, 0x0D, 0x09, 0x03, + 0xFE, 0xFA, 0xF9, 0xFD, 0x00, 0x02, 0x02, 0x00, 0xFE, 0xFD, 0xFC, 0xFF, 0x00, 0x01, 0x02, 0x03, + 0x07, 0x12, 0x1B, 0x12, 0xF5, 0xD5, 0xCB, 0xDD, 0x00, 0x24, 0x36, 0x2B, 0x0C, 0xE6, 0xCD, 0xCE, + 0xE7, 0x0A, 0x2A, 0x35, 0x24, 0x04, 0xE3, 0xD1, 0xDA, 0xF5, 0x15, 0x2C, 0x2A, 0x13, 0xF4, 0xDB, + 0xD6, 0xE7, 0x02, 0x1E, 0x28, 0x1E, 0x05, 0xED, 0xDD, 0xE1, 0xF3, 0x0A, 0x1A, 0x1C, 0x0E, 0xFC, + 0xEB, 0xE6, 0xF0, 0x00, 0x0D, 0x14, 0x0F, 0x03, 0xF7, 0xEF, 0xEE, 0xF6, 0x02, 0x0E, 0x13, 0x0E, + 0x04, 0xF9, 0xF1, 0xF3, 0xFB, 0x03, 0x0A, 0x0A, 0x05, 0xFF, 0xF9, 0xFA, 0x00, 0x05, 0x08, 0x06, + 0x01, 0xFB, 0xF7, 0xF8, 0xFE, 0x04, 0x09, 0x0A, 0x06, 0x00, 0xFB, 0xF9, 0xFB, 0x00, 0x02, 0x03, + 0x01, 0x00, 0xFE, 0xFC, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x04, 0x0F, 0x18, 0x0E, 0xF0, 0xD2, 0xCE, + 0xE7, 0x0F, 0x31, 0x34, 0x1B, 0xF4, 0xD2, 0xCC, 0xE5, 0x0C, 0x2C, 0x31, 0x1A, 0xF7, 0xD9, 0xD5, + 0xEB, 0x0B, 0x26, 0x29, 0x15, 0xF7, 0xE0, 0xDE, 0xF1, 0x0C, 0x1F, 0x1F, 0x0C, 0xF5, 0xE6, 0xE7, + 0xF7, 0x0B, 0x17, 0x15, 0x05, 0xF6, 0xED, 0xF1, 0xFF, 0x0C, 0x10, 0x0A, 0x00, 0xF5, 0xF0, 0xF5, + 0x00, 0x0C, 0x11, 0x0B, 0xFD, 0xF0, 0xEE, 0xF8, 0x07, 0x12, 0x12, 0x07, 0xF8, 0xEF, 0xF0, 0xFC, + 0x09, 0x11, 0x0E, 0x03, 0xF8, 0xF3, 0xF6, 0x00, 0x0A, 0x0D, 0x09, 0x00, 0xF7, 0xF6, 0xFB, 0x02, + 0x09, 0x0A, 0x05, 0x00, 0xFB, 0xFA, 0xFD, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x01, 0x00, 0x00, 0x05, 0x13, 0x17, 0x02, 0xE2, 0xD2, 0xDF, 0x04, 0x28, 0x31, 0x19, 0xF3, 0xD6, + 0xD5, 0xF3, 0x18, 0x2B, 0x21, 0x01, 0xE3, 0xDB, 0xEC, 0x0A, 0x21, 0x20, 0x0A, 0xF0, 0xE2, 0xE9, + 0x00, 0x14, 0x1A, 0x0F, 0xFA, 0xEB, 0xEC, 0xFA, 0x09, 0x12, 0x0C, 0x00, 0xF6, 0xF3, 0xFC, 0x05, + 0x0A, 0x07, 0x00, 0xFA, 0xF9, 0xFD, 0x00, 0xFF, 0xFC, 0x00, 0x09, 0x0F, 0x0A, 0xFB, 0xEF, 0xF0, + 0xFD, 0x0C, 0x13, 0x0C, 0xFF, 0xF3, 0xF2, 0xFC, 0x08, 0x0D, 0x09, 0x00, 0xF6, 0xF5, 0xFC, 0x05, + 0x0C, 0x0A, 0x02, 0xFC, 0xF8, 0xFA, 0x00, 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFC, 0xFD, 0xFF, 0x01, 0x04, 0x03, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x02, 0x06, 0x11, 0x16, 0x05, + 0xE5, 0xD4, 0xE2, 0x07, 0x29, 0x2E, 0x10, 0xE9, 0xD4, 0xE2, 0x06, 0x26, 0x29, 0x0B, 0xE8, 0xDB, + 0xEC, 0x0D, 0x22, 0x1B, 0x00, 0xE5, 0xE1, 0xF6, 0x11, 0x1D, 0x12, 0xF9, 0xE7, 0xEB, 0xFD, 0x10, + 0x14, 0x09, 0xF9, 0xF0, 0xF5, 0x03, 0x0D, 0x0C, 0x00, 0xF7, 0xF6, 0xFE, 0x08, 0x0B, 0x04, 0xF8, + 0xEE, 0xF0, 0x00, 0x17, 0x1D, 0x0B, 0xF0, 0xE0, 0xEA, 0x05, 0x1B, 0x1C, 0x07, 0xEF, 0xE7, 0xF4, + 0x09, 0x15, 0x0E, 0xFC, 0xEE, 0xF0, 0x00, 0x0F, 0x11, 0x06, 0xF9, 0xF3, 0xF9, 0x03, 0x07, 0x03, + 0xFC, 0xFA, 0xFD, 0x06, 0x0B, 0x07, 0xFE, 0xF6, 0xF5, 0xFD, 0x03, 0x07, 0x05, 0xFF, 0xFC, 0xFD, + 0x01, 0x04, 0x03, 0x00, 0xFD, 0x01, 0x0E, 0x15, 0x04, 0xE6, 0xDA, 0xED, 0x11, 0x29, 0x20, 0xFE, + 0xDD, 0xDD, 0xFA, 0x1B, 0x25, 0x10, 0xEF, 0xDF, 0xEE, 0x0B, 0x1B, 0x11, 0xF8, 0xE7, 0xEC, 0x03, + 0x16, 0x15, 0x02, 0xEE, 0xEB, 0xF9, 0x0A, 0x11, 0x08, 0xF9, 0xF4, 0xFA, 0x05, 0x0B, 0x05, 0xFB, + 0xF6, 0xF9, 0x02, 0x0B, 0x09, 0x00, 0xF9, 0xF7, 0xFA, 0xFE, 0xFF, 0x06, 0x10, 0x0F, 0x01, 0xF0, + 0xEA, 0xF7, 0x0B, 0x15, 0x0E, 0xFD, 0xF1, 0xF5, 0x02, 0x0B, 0x09, 0xFE, 0xF5, 0xF9, 0x03, 0x0A, + 0x07, 0x00, 0xF9, 0xFA, 0x00, 0x05, 0x03, 0xFE, 0xFA, 0xFC, 0x02, 0x06, 0x05, 0x00, 0xFC, 0xFC, + 0xFF, 0x03, 0x03, 0x01, 0xFE, 0xFF, 0x00, 0x03, 0x03, 0x01, 0xFE, 0xFE, 0x00, 0x02, 0x06, 0x0B, + 0x0D, 0x03, 0xEF, 0xE4, 0xEF, 0x0A, 0x1E, 0x1A, 0x00, 0xE7, 0xE8, 0x00, 0x17, 0x19, 0x05, 0xEF, + 0xEA, 0xFA, 0x0D, 0x12, 0x05, 0xF4, 0xF0, 0xFD, 0x0C, 0x10, 0x05, 0xF7, 0xF1, 0xFB, 0x07, 0x0B, + 0x03, 0xF9, 0xF8, 0xFF, 0x07, 0x08, 0x00, 0xF8, 0xF8, 0xFF, 0x05, 0x07, 0x02, 0xFD, 0xFC, 0xFF, + 0x02, 0x00, 0xFB, 0xF5, 0xFA, 0x09, 0x14, 0x0C, 0xF7, 0xE9, 0xF0, 0x05, 0x15, 0x11, 0xFE, 0xF0, + 0xF3, 0x03, 0x0E, 0x0A, 0xFC, 0xF3, 0xF6, 0x02, 0x0C, 0x07, 0xFE, 0xF8, 0xFA, 0x03, 0x07, 0x02, + 0xFB, 0xF8, 0xFE, 0x05, 0x07, 0x03, 0xFE, 0xFC, 0xFF, 0x02, 0x03, 0x01, 0xFF, 0xFE, 0x00, 0x02, + 0x01, 0x00, 0xFF, 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, 0x08, 0x0C, 0x00, 0xEC, 0xE9, 0xFD, 0x15, + 0x1B, 0x09, 0xF0, 0xE8, 0xFA, 0x10, 0x15, 0x05, 0xF2, 0xEE, 0xFD, 0x0D, 0x0E, 0x01, 0xF5, 0xF5, + 0x01, 0x0B, 0x09, 0xFD, 0xF5, 0xF8, 0x02, 0x09, 0x06, 0xFD, 0xF9, 0xFD, 0x03, 0x05, 0x01, 0xFC, + 0xFA, 0xFE, 0x04, 0x05, 0x01, 0xFD, 0xFD, 0x00, 0x03, 0x02, 0xFF, 0xF8, 0xF3, 0xF9, 0x0A, 0x18, + 0x11, 0xFA, 0xE7, 0xED, 0x04, 0x16, 0x12, 0xFE, 0xEF, 0xF4, 0x06, 0x0F, 0x06, 0xF8, 0xF3, 0xFC, + 0x08, 0x0B, 0x02, 0xF8, 0xF8, 0x00, 0x08, 0x06, 0xFF, 0xF9, 0xFA, 0x01, 0x07, 0x05, 0x00, 0xFD, + 0xFF, 0x02, 0x03, 0x00, 0xFE, 0xFE, 0x00, 0x04, 0x03, 0x00, 0xFF, 0x00, 0x02, 0x02, 0x00, 0xFF, + 0xFF, 0x02, 0x0C, 0x10, 0x00, 0xE9, 0xE6, 0xFD, 0x19, 0x1C, 0x05, 0xEB, 0xEA, 0x00, 0x14, 0x12, + 0xFE, 0xEE, 0xF4, 0x07, 0x10, 0x08, 0xF9, 0xF3, 0xFC, 0x08, 0x09, 0x00, 0xF8, 0xF9, 0x01, 0x07, + 0x04, 0xFF, 0xFB, 0xFD, 0x02, 0x03, 0x00, 0xFD, 0xFC, 0x00, 0x03, 0x03, 0x01, 0xFF, 0xFE, 0x01, + 0x02, 0x01, 0xFF, 0xFD, 0xF9, 0xF8, 0xFD, 0x0B, 0x14, 0x0A, 0xF5, 0xEA, 0xF5, 0x0A, 0x13, 0x08, + 0xF8, 0xF3, 0xFE, 0x0A, 0x09, 0xFE, 0xF6, 0xFA, 0x03, 0x08, 0x03, 0xFB, 0xFA, 0x00, 0x05, 0x04, + 0x00, 0xFB, 0xFC, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x0A, 0xFC, 0xEB, 0xEF, + 0x06, 0x18, 0x12, 0xFC, 0xED, 0xF5, 0x09, 0x12, 0x07, 0xF6, 0xF4, 0x00, 0x0A, 0x09, 0xFF, 0xF7, + 0xFC, 0x04, 0x06, 0x01, 0xFC, 0xFC, 0x01, 0x04, 0x02, 0xFE, 0xFD, 0x00, 0x02, 0x02, 0x00, 0xFE, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFC, 0xFA, 0xFF, + 0x0A, 0x10, 0x06, 0xF5, 0xEE, 0xFA, 0x0B, 0x0F, 0x03, 0xF7, 0xF8, 0x02, 0x08, 0x04, 0xFC, 0xFA, + 0x00, 0x05, 0x04, 0xFF, 0xFB, 0xFF, 0x03, 0x04, 0x01, 0xFE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0x01, 0xF2, 0xEF, 0xFF, 0x12, 0x12, 0x00, 0xF2, 0xF4, 0x03, + 0x0D, 0x07, 0xFA, 0xF6, 0xFF, 0x06, 0x06, 0xFF, 0xFA, 0xFD, 0x03, 0x03, 0x00, 0xFE, 0xFF, 0x00, + 0x01, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFB, 0xFA, 0x01, 0x0C, 0x0E, 0x00, 0xF1, 0xF3, 0x01, + 0x0D, 0x07, 0xFB, 0xF8, 0xFF, 0x07, 0x07, 0xFF, 0xFA, 0xFE, 0x03, 0x03, 0x00, 0xFD, 0xFF, 0x02, + 0x03, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x09, + 0xFB, 0xED, 0xF3, 0x07, 0x14, 0x0B, 0xF8, 0xF3, 0x00, 0x0B, 0x09, 0xFD, 0xF6, 0xFD, 0x05, 0x05, + 0x00, 0xFC, 0xFF, 0x02, 0x02, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, + 0xFB, 0xF9, 0xFE, 0x0B, 0x10, 0x03, 0xF2, 0xF1, 0x00, 0x0D, 0x0A, 0xFC, 0xF8, 0x00, 0x08, 0x05, + 0xFD, 0xFA, 0xFF, 0x03, 0x02, 0xFF, 0xFE, 0x00, 0x02, 0x01, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x09, 0x09, 0xFC, 0xEE, 0xF3, 0x08, 0x15, 0x09, 0xF6, + 0xF3, 0x00, 0x0C, 0x08, 0xFB, 0xF7, 0x00, 0x07, 0x04, 0xFE, 0xFD, 0x00, 0x02, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x01, 0xFE, 0xFE, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFE, 0xFB, 0xFA, 0x00, 0x0C, 0x0D, 0x00, 0xF2, + 0xF4, 0x03, 0x0C, 0x05, 0xFB, 0xFA, 0x02, 0x07, 0x02, 0xFC, 0xFC, 0x01, 0x03, 0x00, 0xFE, 0xFF, + 0x01, 0x02, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, + 0x09, 0x05, 0xF9, 0xF0, 0xFA, 0x0B, 0x10, 0x02, 0xF5, 0xF8, 0x05, 0x0A, 0x01, 0xFA, 0xFC, 0x03, + 0x04, 0x00, 0xFE, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFE, 0xFD, 0xFD, 0x02, 0x0A, 0x09, 0xFD, 0xF4, 0xF9, 0x05, 0x08, 0x01, 0xFB, 0xFE, 0x03, + 0x04, 0xFF, 0xFC, 0x00, 0x02, 0x01, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x07, 0x05, 0xFC, 0xF3, 0xFB, 0x09, 0x0D, + 0x02, 0xF7, 0xFA, 0x04, 0x07, 0x00, 0xFA, 0xFD, 0x03, 0x03, 0x00, 0xFD, 0x00, 0x01, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFC, 0x00, 0x09, 0x0B, + 0x00, 0xF5, 0xF7, 0x03, 0x09, 0x03, 0xFC, 0xFE, 0x04, 0x04, 0x00, 0xFD, 0xFF, 0x02, 0x00, 0xFF, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x06, 0x07, 0xFD, 0xF3, 0xF7, 0x07, 0x0F, 0x05, 0xF7, 0xF9, 0x04, 0x08, 0x00, 0xFA, + 0xFE, 0x04, 0x04, 0x00, 0xFD, 0x00, 0x03, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFA, 0x00, 0x0A, 0x0C, 0x00, 0xF4, 0xF8, 0x06, 0x09, 0x00, 0xFA, + 0xFF, 0x05, 0x04, 0xFE, 0xFD, 0x01, 0x03, 0x00, 0xFE, 0x00, 0x01, 0x01, 0x00, 0xFF, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x05, 0xFA, 0xF2, 0xFA, + 0x0A, 0x0D, 0x00, 0xF6, 0xFB, 0x06, 0x06, 0xFE, 0xFA, 0x00, 0x05, 0x01, 0xFD, 0xFF, 0x02, 0x02, + 0x00, 0xFE, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFC, 0x02, + 0x0B, 0x08, 0xFC, 0xF5, 0xFD, 0x07, 0x07, 0x00, 0xFC, 0x00, 0x04, 0x01, 0xFD, 0xFF, 0x02, 0x01, + 0x00, 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x03, 0x05, 0x03, 0xFA, 0xF5, 0xFD, 0x09, 0x0B, 0x00, 0xF9, 0xFF, 0x06, 0x03, + 0xFD, 0xFD, 0x01, 0x03, 0x00, 0xFF, 0x00, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFE, 0x02, 0x07, 0x06, 0xFC, 0xF8, 0xFE, 0x05, 0x05, + 0x00, 0xFE, 0x01, 0x03, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0xFD, + 0xF7, 0xFB, 0x06, 0x0A, 0x00, 0xFA, 0xFE, 0x04, 0x03, 0xFE, 0xFC, 0x00, 0x02, 0x00, 0xFF, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, + 0xFC, 0x00, 0x07, 0x08, 0xFF, 0xF8, 0xFB, 0x04, 0x05, 0x00, 0xFD, 0x00, 0x03, 0x01, 0xFF, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x06, 0x00, 0xF6, 0xF8, 0x04, 0x0B, 0x04, 0xFB, 0xFC, + 0x03, 0x03, 0xFF, 0xFC, 0x00, 0x03, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFC, 0x00, 0x07, 0x08, 0xFF, 0xF7, 0xFC, + 0x04, 0x04, 0xFF, 0xFD, 0x01, 0x03, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x05, + 0x05, 0xFE, 0xF6, 0xFB, 0x06, 0x0A, 0x00, 0xF9, 0xFF, 0x04, 0x02, 0xFE, 0xFE, 0x01, 0x01, 0x00, + 0xFF, 0x01, 0x01, 0xFF, + } ; diff --git a/archive-sources/lemm/sprite.c b/archive-sources/lemm/sprite.c new file mode 100644 index 0000000..3aeaf65 --- /dev/null +++ b/archive-sources/lemm/sprite.c @@ -0,0 +1,152 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include +#include + +#include +#include +#include + +extern int doexit; + +extern unsigned short realcode; +extern unsigned short actcode; + +extern unsigned char *GetPic( int idx,int *maxani,int *width, int *height ); +extern unsigned char *GetMirrorPic( char picid ); +extern void dblCopyImage( int x1, int y1, int dx,int dy,unsigned char *src); + +static Sprite *root=0; +static Sprite *last=0; +extern int main_x; + +void DrawSprite( Sprite *s ) +{ + dblCopyImage( s->x-main_x, s->y, s->width, s->height,s->data+s->ani*s->sz); +} + +int SpriteCollide( Sprite *s, int x, int y ) +{ + return ((x < s->x+s->width) && + (x >= s->x) && + (y < s->y+s->height) && + (y >= s->y )); +} + +Sprite *CreateSprite( int picid, int ani, int x, int y ) +{ + Sprite *s; + int ma; + + s=malloc(sizeof(Sprite)); + memset(s,0,sizeof(Sprite)); + s->countdown = 5; + s->counter1 = 0; + s->counter2 = 0; + s->type = TYP_WALKER; + s->x = x; + s->y = y; + s->oldx = x; + s->oldy = y; + s->picid = (char)picid; + s->ori_data= GetPic( picid, &ma, &s->width, &s->height ); + s->data = s->ori_data; + s->maxani = (char)ma; + s->sz=s->width*s->height; + if ( ani <= s->maxani ) + s->ani = ani; + + s->next=0; + s->pre=last; + + if ( s->pre ) + s->pre->next = s; + + last=s; + + if ( !root ) + root=s; + + return s; +} + +void DrawSprites( void ) +{ + Sprite *s; + + for( s=root; s; s=s->next ) + DrawSprite(s); +} + +void SpriteNextPic( Sprite *s ) +{ + if ( s->anilocked ) + return; + s->ani++; + if ( s->ani > s->maxani ) + s->ani=0; +} + +void SpriteSelPic( Sprite *s, int ani ) +{ + s->ani = ani; + if ( s->ani > s->maxani ) + s->ani=0; +} + +void MirrorSprite( Sprite *s ) +{ + if ( !s->flip_data ) + s->flip_data=GetMirrorPic( s->picid ); + if ( s->data == s->ori_data ) + s->data = s->flip_data; + else + s->data = s->ori_data; +} + +void SpriteGetBackground( Sprite *s ) +{ + s->oldx=s->x; + s->oldy=s->y; +} + +void SpritesGetBackground( void ) +{ + Sprite *s; + + for( s=root; s; s=s->next ) + SpriteGetBackground(s); +} + +void FreeSprites( void ) +{ + Sprite *s; + Sprite *n; + + for( s=root; s; s=n ) + { + n=s->next; + free(s); + } + root=0; + last=0; +} + +void SpriteChangePic( Sprite *s, int picid ) +{ + int ma; + + s->picid = (char)picid; + s->ori_data= GetPic( picid, &ma, &s->width, &s->height ); + s->data = s->ori_data; + s->flip_data=0; + s->maxani = (char)ma; + s->sz=s->width*s->height; + if ( s->ani > s->maxani ) + s->ani = 0; +} diff --git a/archive-sources/lemm/sprite.h b/archive-sources/lemm/sprite.h new file mode 100644 index 0000000..080e305 --- /dev/null +++ b/archive-sources/lemm/sprite.h @@ -0,0 +1,55 @@ + +typedef struct _Sprite +{ + unsigned char *ori_data; + unsigned char *flip_data; + unsigned char *data; + int width; + int height; + int oldx; + int oldy; + int x; + int y; + int sz; + int countdown; + int counter1; + int counter2; + struct _Sprite *next; + struct _Sprite *pre; + unsigned long type; + char picid; + char anilocked; + char backlocked; + char dir; + char ani; + char maxani; + char partikel; +} Sprite; + +extern int SpriteCollide( Sprite *s, int x, int y ); +extern Sprite *CreateSprite( int picid, int ani, int x, int y ); +extern void MirrorSprite( Sprite *s ); +extern void SpriteNextPic( Sprite *s ); +extern void SpriteSelPic( Sprite *s, int ani ); +extern void DrawSprite( Sprite *s ); +extern void FreeSprites( void ); +extern void SpritesGetBackground( void ); +extern void SpriteGetBackground( Sprite *s ); +extern void DrawSprites( void ); +extern void SpriteChangePic( Sprite *s, int picid ); + +#define TYP_CLIMB (1L<<0) // 0001 +#define TYP_FALL (1L<<1) // 0002 +#define TYP_EXPLODE (1L<<2) // 0004 +#define TYP_UTILS 0x7 +#define TYP_STOPPER (1L<<3) // 0008 +#define TYP_BUILDER (1L<<4) // 0010 +#define TYP_DIGHORI (1L<<5) // 0020 +#define TYP_DIGDIAG (1L<<6) // 0040 +#define TYP_DIGDOWN (1L<<7) // 0080 +#define TYP_WALKER (1L<<8) // 0100 +#define TYP_CLIMBER (1L<<9) // 0200 +#define TYP_FALLER (1L<<10) // 0400 +#define TYP_WORK 0x7f8 +#define TYP_FALLEN (1L<<11) // 0800 +#define TYP_ATHOME (1L<<12) // 1000 diff --git a/archive-sources/libfx2/draw.c b/archive-sources/libfx2/draw.c new file mode 100644 index 0000000..72c09a9 --- /dev/null +++ b/archive-sources/libfx2/draw.c @@ -0,0 +1,2410 @@ +/* +** initial coding by fx2 +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef USEX + +#ifdef __i386__ +#define fbdevname "/dev/fb0" +#else +#define fbdevname "/dev/fb/0" +#endif + +#ifndef abs +#define abs(a) ((a>0)?a:-(a)) +#endif + +#include "draw.h" +#include "rcinput.h" +#include "pig.h" + +static int fbdevice = -1; +static struct fb_var_screeninfo screeninfo; +static struct fb_var_screeninfo oldscreen; +static int available = 0; +static unsigned char *lfb = 0; +static int stride; +static int bpp = 8; +static struct fb_cmap cmap,oldcmap; +static unsigned short red[ 256 ]; +static unsigned short green[ 256 ]; +static unsigned short blue[ 256 ]; +static unsigned short trans[ 256 ]; +static int lastcolor=0; +extern unsigned short actcode; +extern unsigned short realcode; +extern int doexit; + + +void FBSetColor( int idx, uchar r, uchar g, uchar b ) +{ + red[idx] = r<<8; + green[idx] = g<<8; + blue[idx] = b<<8; + trans[idx] = idx ? 0 : 0xffff; + + if ( idx > lastcolor ) + lastcolor=idx; +} + +void FBSetColorEx( int idx, uchar r, uchar g, uchar b, uchar transp ) +{ + red[idx] = r<<8; + green[idx] = g<<8; + blue[idx] = b<<8; + trans[idx] = transp<<8; + + if ( idx > lastcolor ) + lastcolor=idx; + +} + +int FBInitialize( int xRes, int yRes, int nbpp, int extfd ) +{ + struct fb_fix_screeninfo fix; + +// if ( extfd != -1 ) +// { +// fbdevice = extfd; +// } +// else + { + fbdevice = open( fbdevname, O_RDWR ); + if ( fbdevice == -1 ) + { + perror("failed - open " fbdevname); + return(-1); + } + } + if (ioctl(fbdevice, FBIOGET_VSCREENINFO, &screeninfo)<0) + { + perror("failed - FBIOGET_VSCREENINFO"); + return(-1); + } + if (ioctl(fbdevice, FBIOGETCMAP, &cmap )<0) + perror("FBGetCMap"); + + memcpy(&oldscreen,&screeninfo,sizeof(screeninfo)); + memcpy(&oldcmap,&cmap,sizeof(cmap)); + +// screeninfo.xres_virtual=screeninfo.xres=xRes; +// screeninfo.yres_virtual=screeninfo.yres=yRes; + screeninfo.bits_per_pixel=nbpp; + + cmap.start=0; + cmap.len=256; + cmap.red=red; + cmap.green=green; + cmap.blue=blue; + cmap.transp=trans; + + memset(red,100,sizeof(unsigned short)*256); + memset(green,100,sizeof(unsigned short)*256); + memset(blue,100,sizeof(unsigned short)*256); + memset(trans,0xffff,sizeof(unsigned short)*256); + + if (ioctl(fbdevice, FBIOPUT_VSCREENINFO, &screeninfo)<0) + perror("FBSetMode"); + if (ioctl(fbdevice, FBIOGET_VSCREENINFO, &screeninfo)<0) + perror("failed - FBIOGET_VSCREENINFO"); + + FBSetColor( BLACK, 30, 30, 100 ); + FBSetColor( BNR0, 1, 1, 1 ); + FBSetColor( WHITE, 210, 210, 210 ); + FBSetColor( RED, 240, 50, 80 ); + +// if (ioctl(fbdevice, FBIOPUTCMAP, &cmap )<0) +// perror("FBSetCMap"); + + bpp = screeninfo.bits_per_pixel; + + if ( bpp != 8 ) + return(-1); + + if (ioctl(fbdevice, FBIOGET_FSCREENINFO, &fix)<0) + { + perror("failed - FBIOGET_FSCREENINFO"); + return(-1); + } + + available=fix.smem_len; + stride = fix.line_length; + lfb=(unsigned char*)mmap(0,available,PROT_WRITE|PROT_READ, MAP_SHARED, fbdevice, 0); + + if ( !lfb ) + { + perror("failed - mmap"); + return(-1); + } + + memset(lfb,BLACK,stride * screeninfo.yres); + + return 0; +} + +void FBSetupColors( void ) +{ + if (ioctl(fbdevice, FBIOPUTCMAP, &cmap )<0) + perror("FBSetCMap"); +} + +void FBClose( void ) +{ + /* clear screen */ + if (doexit != 3){ + memset(lfb,0,stride * screeninfo.yres); + } + if (available) + { +// if (ioctl(fbdevice, FBIOPUTCMAP, &oldcmap )<0) +// perror("FBSetOldCMap"); + + if (ioctl(fbdevice, FBIOPUT_VSCREENINFO, &oldscreen)<0) + perror("FBSetOldMode"); + + if (lfb) + munmap(lfb, available); + } + if(fbdevice) + close(fbdevice); + fbdevice = -1; +} + +void FBPaintPixel( int x, int y, unsigned char farbe ) +{ + if (doexit == 3) + return; + + *(lfb + stride*y + x) = farbe; +} + +unsigned char FBGetPixel( int x, int y ) +{ + if (doexit == 3) + return; + + return *(lfb + stride*y + x); +} + +void FBGetImage( int x1, int y1, int width, int height, unsigned char *to ) +{ + if (doexit == 3) + return; + + int y; + unsigned char *p=lfb + stride*y1 + x1; + + for( y=0; y dy ) + { + int p = 2 * dy - dx; + int twoDy = 2 * dy; + int twoDyDx = 2 * (dy-dx); + + if ( xa > xb ) + { + x = xb; + y = yb; + End = xa; + step = ya < yb ? -1 : 1; + } + else + { + x = xa; + y = ya; + End = xb; + step = yb < ya ? -1 : 1; + } + + FBPaintPixel (x, y, farbe); + + while( x < End ) + { + x++; + if ( p < 0 ) + p += twoDy; + else + { + y += step; + p += twoDyDx; + } + FBPaintPixel (x, y, farbe); + } + } + else + { + int p = 2 * dx - dy; + int twoDx = 2 * dx; + int twoDxDy = 2 * (dx-dy); + + if ( ya > yb ) + { + x = xb; + y = yb; + End = ya; + step = xa < xb ? -1 : 1; + } + else + { + x = xa; + y = ya; + End = yb; + step = xb < xa ? -1 : 1; + } + + FBPaintPixel (x, y, farbe); + + while( y < End ) + { + y++; + if ( p < 0 ) + p += twoDx; + else + { + x += step; + p += twoDxDy; + } + FBPaintPixel (x, y, farbe); + } + } +} + +void FBDrawHLine( int x, int y, int dx, unsigned char farbe ) +{ + if (doexit == 3) + return; + + memset(lfb+x+stride*y,farbe,dx); +} + +void FBDrawVLine( int x, int y, int dy, unsigned char farbe ) +{ + if (doexit == 3) + return; + + unsigned char *pos = lfb + x + stride*y; + int i; + + for( i=0; i=0); x++ ) + { + if ( ( x+x1>=0 ) && *(src+dx*y+x) ) + *(lfb+(y1+y)*stride+x1+x) = *(src+dx*y+x); + } + } + return; + } + s=src; + for( y=0; (y < dy) && (y+y1+y=0) && *s ) + { + *d=*s; + d++; + *d=*s; + d++; + } + else + { + d+=2; + } + } + // line 2 + if ( x ) + memcpy(d2,d-x-x,x+x); + } +} + +void FBCopyImageCol( int x, int y, int dx, int dy, unsigned char col, + unsigned char *src ) +{ + if (doexit == 3) + return; + + int i; + int k; + unsigned char *to; + + if ( !dx || !dy ) + return; + for( i=0; i < dy; i++ ) + { + to=lfb+(y+i)*stride+x; + for( k=0; k= dx ) /* use rigth */ + { + if ( right ) + *p = *(right+dx*i+relx+k-dx); + else + *p = SWC(*(src+dx*i+k)); + } + else + { + if ( under ) + *p = *(under+dx*i+relx+k); + else + *p = SWC(*(src+dx*i+k)); + } + } + else + { + if ( rely+i >= dy ) /* use bottom */ + { + if ( bottom ) + *p = *(bottom+dx*(i+rely-dy)+k); + else + *p = SWC(*(src+dx*i+k)); + } + else + { + if ( under ) + *p = *(under+dx*(i+rely)+k); + else + *p = SWC(*(src+dx*i+k)); + } + } + } + } +} + +void FBPrintScreen( void ) +{ + if (doexit == 3) + return; + + FILE *fp; + unsigned char *p = lfb; + int y; + int x=0; + +#define H(x) ((x/26)+65) +#define L(x) ((x%26)+65) + + fp = fopen( "/var/tmp/screen.xpm", "w" ); + if ( !fp ) + { + return; + } + fprintf(fp,"/* XPM */\n"); + fprintf(fp,"static char *screen[] = {\n"); + fprintf(fp,"\" %d %d %d %d\"",screeninfo.xres,screeninfo.yres, + lastcolor+1,lastcolor<=100?1:2); + for( x=0; x < lastcolor; x++ ) + { + if ( lastcolor <= 100 ) + fprintf(fp,",\n\"%c",x+65); + else + fprintf(fp,",\n\"%c%c",H(x),L(x)); + + fprintf(fp, " c #%02x%02x%02x\"", + (unsigned char)(red[x]>>8), + (unsigned char)(green[x]>>8), + (unsigned char)(blue[x]>>8)); + } + for( y=0; y < screeninfo.yres; y++ ) + { + fprintf(fp,",\n\""); + for( x=0; x < screeninfo.xres; x++, p++ ) + { + if ( lastcolor <= 100 ) + fprintf(fp,"%c",(*p)+65); + else + fprintf(fp,"%c%c",H(*p),L(*p)); + } + fprintf(fp,"\""); + fflush(fp); + } + fprintf(fp," };\n"); + fflush(fp); + + fclose(fp); +} + +void FBBlink( int x, int y, int dx, int dy, int count ) +{ + if (doexit == 3) + return; + + unsigned char *back; + int i; + struct timeval tv; + +/* copy out */ + back = malloc(dx*dy); + for( i=0; i < dy; i++ ) + memcpy(back+dx*i,lfb+(y+i)*stride+x,dx); + + for( i=0; i < count; i++ ) + { + tv.tv_usec = 300000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + FBFillRect( x, y, dx, dy, BLACK ); + tv.tv_usec = 300000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + FBCopyImage( x, y, dx, dy, back ); + } + free( back ); +} + +void FBMove( int x, int y, int x2, int y2, int dx, int dy ) +{ + if (doexit == 3) + return; + + unsigned char *back; + int i; + unsigned long f=y*stride+x; + unsigned long t=y2*stride+x2; + + if ( f < t ) + { + back=malloc(dx*dy); + for( i=0; i < dy; i++, f+=stride ) + memcpy(back+(i*dx),lfb+f,dx); + + FBCopyImage( x2, y2, dx, dy, back ); + free( back ); + return; + } + for( i=0; i < dy; i++, f+=stride, t+=stride ) + memcpy(lfb+t,lfb+f,dx); +} + +#if 0 +static void FBDrawClock() +{ + float winkel; + struct timeval tv; + int xe = 0; + int ye = 0; + int x; + int y; + unsigned char *back; + int i; + +/* copy out */ + back = malloc(50*50); + for( i=0; i < 50; i++ ) + memcpy(back+50*i,lfb+(280-25+i)*stride+360-25,50); + + for( winkel=0; winkel < 3.1415*2; winkel+=0.001 ) + { + x = sin(winkel)*24; + y = -cos(winkel)*24; + if (( xe == x ) && (ye == y )) + continue; + xe=x; + ye=y; + FBDrawLine( 360, 280 , xe + 360, ye + 280, 2 ); + tv.tv_usec = 1000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + } + xe=0; + ye=0; + for( winkel=0; winkel < 3.1415*2; winkel+=0.001 ) + { + x = sin(winkel)*22; + y = -cos(winkel)*22; + if (( xe == x ) && (ye == y )) + continue; + xe=x; + ye=y; + FBDrawLine( 360, 280 , xe + 360, ye + 280, 1 ); + tv.tv_usec = 1000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + } + + FBCopyImage( 360-25, 280-25, 50, 50, back ); + + free( back ); +} +#endif + +void FBPause( void ) +{ + int i; + struct timeval tv; + +#if 0 + /* old pause style, disabled by alexW */ + + static int pos[64] = + { + 0, 2, 11, 23, 5, 31, 33, 29, 14, 53, 59, 36, 35, 3, 49, 1, + 16, 19, 56, 34, 58, 32, 51, 12, 4, 52, 63, 7, 57, 50, 6, 24, + 43, 48, 39, 8, 20, 44, 27, 42, 10, 55, 61, 21, 17, 37, 47, 25, + 54, 28, 18, 46, 60, 9, 30, 38, 62, 26, 15, 13, 41, 22, 40, 45 + }; + unsigned char *back; + int dx = screeninfo.xres; + int dy = screeninfo.yres; + int x; + int y; + int sx; + int sy; + + Fx2PigPause(); + + back = malloc( available ); + if ( back ) /* dimm out */ + { + memcpy(back,lfb,available); + + for( i=0; i < 64; i++ ) + { + sx = pos[i] >> 3; + sy = pos[i] & 0x7; + for( y=0; y < dy; y+=8 ) + { + for( x=0; x < dx; x+=8 ) + { + FBPaintPixel(x+sx,y+sy,0); + } + } + } + } + + while( realcode != 0xee ) + RcGetActCode(); + actcode = 0xee; + + while( actcode != RC_SPKR ) + { + tv.tv_usec = 100000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + RcGetActCode(); + } + + if ( back ) /* dimm in */ + { + for( i=0; i < 64; i++ ) + { + sx = pos[i] >> 3; + sy = pos[i] & 0x7; + for( y=0; y < dy; y+=8 ) + { + for( x=0; x < dx; x+=8 ) + { + *(lfb+(y+sy)*stride+x+sx) = *(back+(y+sy)*stride+x+sx); + } + } + } + + free(back); + } + +/* nochmal leer lesen */ + while( realcode != 0xee ) + RcGetActCode(); + actcode = 0xee; + +/* FBDrawClock(); */ + + Fx2PigResume(); +#else + int j; + unsigned short trans_sav[ 256 ]; + unsigned char img_sav[ 42*100]; + + memcpy(trans_sav, trans, 256 * sizeof( unsigned short) ); + +// Fx2PigPause(); + + if (available) + { + //save image + FBGetImage( 50, 50, 100, 42, img_sav ); + + /* dimm out */ + for( i = 0; i < 129; i++ ) + { + for( j = 0; j < 256; j++ ) + { + if( (trans[j]>>8) < 128 ) + { + trans[j] += 0x100; + } + } + FBSetupColors(); + } + + FBSetColor( RESERVED, 150, 210, 210 ); + FBSetupColors(); + FBDrawString( 50, 50, 42, "Pause", RESERVED, 0 ); + } + + while( realcode != 0xee ) + RcGetActCode(); + actcode = 0xee; + while( realcode == 0xee ) + { + tv.tv_usec = 100000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + RcGetActCode(); + } + + if (available) + { + //restore image + FBCopyImage( 50, 50, 100, 42, img_sav ); + + /* dimm in */ + for( i = 0; i < 129; i++ ) + { + for( j = 0; j < 256; j++ ) + { + if( trans[j] > trans_sav[j] ) + { + trans[j]-= 0x100; + } + } + FBSetupColors(); + } + } + + while( realcode != 0xee ) + RcGetActCode(); + actcode = 0xee; + +// Fx2PigResume(); +#endif +} + +#else /* USEX */ + +#include +#include +#include + +#include +#include +#include + +static Display *dpy = 0; +static Window window; +static GC gc; +static unsigned long colors[ 256 ]; +static int planes=16; +static int xres; +static int yres; +extern unsigned short actcode; +extern unsigned short realcode; +extern int doexit; + +void FBSetColor( int idx, uchar r, uchar g, uchar b ) +{ + switch( planes ) + { + case 24 : + colors[idx] = r<<16 | g<<8 | b; + break; + case 16 : + colors[idx] = (r&0xf8)<<8 | (g&0xfc) << 3 | (b&0xf8)>>3; + break; + } +} + +void FBSetColorEx( int idx, uchar r, uchar g, uchar b, uchar transp ) +{ + FBSetColor( idx, r, g, b ); +} + +void FBSetupColors( void ) +{ +} + +int FBInitialize( int xRes, int yRes, int bpp, int extfd ) +{ + dpy = XOpenDisplay(0); + if ( !dpy ) + return -1; + + xres = xRes; + yres = yRes; + + window = XCreateSimpleWindow(dpy,RootWindow(dpy,0), + 100, 100, xRes, yRes, 0, 0, 0 ); + + XMapWindow(dpy,window); + + planes=DisplayPlanes(dpy,0); + + gc = XCreateGC( dpy, window, 0, 0 ); + XSetFunction( dpy,gc,GXcopy); + + FBSetColor( BLACK, 30, 30, 100 ); + FBSetColor( BNR0, 1, 1, 1 ); + FBSetColor( WHITE, 210, 210, 210 ); + FBSetColor( RED, 240, 50, 80 ); + + XFlush(dpy); + return dpy ? 0 : -1; +} + +void FBClose( void ) +{ + XCloseDisplay(dpy); +} + +void FBPaintPixel( int x, int y, unsigned char col ) +{ + XSetForeground(dpy,gc,colors[col]); + XDrawPoint( dpy, window, gc, x, y ); +} + +unsigned char FBGetPixel( int x, int y ) +{ + XImage *image; + unsigned long c; + int i; + + image=XGetImage(dpy,window,x,y,1,1,-1,ZPixmap); + c=XGetPixel(image,0,0); + XDestroyImage(image); + for(i=0;i<256;i++) + if (colors[i]==c) + return i; + return 0; +} + +void FBGetImage( int x1, int y1, int width, int height, unsigned char *to ) +{ + XImage *image; + unsigned long c; + int i; + int x; + int y; + + image=XGetImage(dpy,window,x1,y1,width,height,-1,ZPixmap); + + for( y=0; y= dx ) /* use rigth */ + { + if ( right ) + FBPaintPixel(k+x,i+y,*(right+dx*i+relx+k-dx)); + else + FBPaintPixel(k+x,i+y,SWC(*(src+dx*i+k))); + } + else + { + if ( under ) + FBPaintPixel(k+x,i+y,*(under+dx*i+relx+k)); + else + FBPaintPixel(k+x,i+y,SWC(*(src+dx*i+k))); + } + } + else + { + if ( rely+i >= dy ) /* use bottom */ + { + if ( bottom ) + FBPaintPixel(k+x,i+y,*(bottom+dx*(i+rely-dy)+k)); + else + FBPaintPixel(k+x,i+y,SWC(*(src+dx*i+k))); + } + else + { + if ( under ) + FBPaintPixel(k+x,i+y,*(under+dx*(i+rely)+k)); + else + FBPaintPixel(k+x,i+y,SWC(*(src+dx*i+k))); + } + } + } + } +} + +void FBCopyImageCol( int x, int y, int dx, int dy, unsigned char col, + unsigned char *src ) +{ + int i; + int k; + + for( k=0; k < dy; k++ ) + for( i=0; i < dx; i++, src++ ) + FBPaintPixel(i+x,k+y,*src+col); +} + +void FBBlink( int x, int y, int dx, int dy, int count ) +{ +} + +void FBMove( int x, int y, int x2, int y2, int dx, int dy ) +{ + XCopyArea( dpy, window, window, gc, x, y, dx, dy, x2, y2 ); +} + +void FBPrintScreen( void ) +{ +} + +void FBFlushGrafic( void ) +{ + XFlush(dpy); +} + +void FBPause( void ) +{ + int dx = xres; + int dy = yres; + int x; + int y; + int sx; + int sy; + int i; + struct timeval tv; +static int pos[64] = +{ +0, 2, 11, 23, 5, 31, 33, 29, 14, 53, 59, 36, 35, 3, 49, 1, +16, 19, 56, 34, 58, 32, 51, 12, 4, 52, 63, 7, 57, 50, 6, 24, +43, 48, 39, 8, 20, 44, 27, 42, 10, 55, 61, 21, 17, 37, 47, 25, +54, 28, 18, 46, 60, 9, 30, 38, 62, 26, 15, 13, 41, 22, 40, 45 +}; + + for( i=0; i < 64; i++ ) + { + sx = pos[i] >> 3; + sy = pos[i] & 0x7; + for( y=0; y < dy; y+=8 ) + { + for( x=0; x < dx; x+=8 ) + { + FBPaintPixel(x+sx,y+sy,0); + } + } + } + +printf("pause()\n"); + + actcode = 0xee; + + while( actcode == 0xee ) + { + tv.tv_usec = 300000; + tv.tv_sec = 0; + select(0,0,0,0,&tv); + RcGetActCode(); + } +} + +#endif + +/* for all */ + +#define MAXMSG 1024 +#define DWIDTH 132 +#define NCHARS 128 +#define NBYTES 9271 + +/* Pointers into data_table for each ASCII char */ +const int asc_ptr[NCHARS] = { +/* ^@ */ 0, 0, 0, 0, 0, 0, 0, 0, +/* ^H */ 0, 0, 0, 0, 0, 0, 0, 0, +/* ^P */ 0, 0, 0, 0, 0, 0, 0, 0, +/* ^X */ 0, 0, 0, 0, 0, 0, 0, 0, +/* */ 1, 3, 50, 81, 104, 281, 483, 590, +/* ( */ 621, 685, 749, 851, 862, 893, 898, 921, +/* 0 */1019, 1150, 1200, 1419, 1599, 1744, 1934, 2111, +/* 8 */2235, 2445, 2622, 2659, 0, 2708, 0, 2715, +/* @ */2857, 3072, 3273, 3403, 3560, 3662, 3730, 3785, +/* H */3965, 4000, 4015, 4115, 4281, 4314, 4432, 4548, +/* P */4709, 4790, 4999, 5188, 5397, 5448, 5576, 5710, +/* X */5892, 6106, 6257, 0, 0, 0, 0, 0, +/* ` */ 50, 6503, 6642, 6733, 6837, 6930, 7073, 7157, +/* h */7380, 7452, 7499, 7584, 7689, 7702, 7797, 7869, +/* p */7978, 8069, 8160, 8222, 8381, 8442, 8508, 8605, +/* x */8732, 8888, 9016, 0, 0, 0, 0, 0 +}; + +/* + * Table of stuff to print. Format: + * 128+n -> print current line n times. + * 64+n -> this is last byte of char. + * else, put m chars at position n (where m + * is the next elt in array) and goto second + * next element in array. + */ +const unsigned char data_table[NBYTES] = { +/* 0 1 2 3 4 5 6 7 8 9 */ +/* 0 */ 129, 227, 130, 34, 6, 90, 19, 129, 32, 10, +/* 10 */ 74, 40, 129, 31, 12, 64, 53, 129, 30, 14, +/* 20 */ 54, 65, 129, 30, 14, 53, 67, 129, 30, 14, +/* 30 */ 54, 65, 129, 31, 12, 64, 53, 129, 32, 10, +/* 40 */ 74, 40, 129, 34, 6, 90, 19, 129, 194, 130, +/* 50 */ 99, 9, 129, 97, 14, 129, 96, 18, 129, 95, +/* 60 */ 22, 129, 95, 16, 117, 2, 129, 95, 14, 129, +/* 70 */ 96, 11, 129, 97, 9, 129, 99, 6, 129, 194, +/* 80 */ 129, 87, 4, 101, 4, 131, 82, 28, 131, 87, +/* 90 */ 4, 101, 4, 133, 82, 28, 131, 87, 4, 101, +/* 100 */ 4, 131, 193, 129, 39, 1, 84, 27, 129, 38, +/* 110 */ 3, 81, 32, 129, 37, 5, 79, 35, 129, 36, +/* 120 */ 5, 77, 38, 129, 35, 5, 76, 40, 129, 34, +/* 130 */ 5, 75, 21, 103, 14, 129, 33, 5, 74, 19, +/* 140 */ 107, 11, 129, 32, 5, 73, 17, 110, 9, 129, +/* 150 */ 32, 4, 73, 16, 112, 7, 129, 31, 4, 72, +/* 160 */ 15, 114, 6, 129, 31, 4, 72, 14, 115, 5, +/* 170 */ 129, 30, 4, 71, 15, 116, 5, 129, 27, 97, +/* 180 */ 131, 30, 4, 69, 14, 117, 4, 129, 30, 4, +/* 190 */ 68, 15, 117, 4, 132, 30, 4, 68, 14, 117, +/* 200 */ 4, 129, 27, 97, 131, 30, 5, 65, 15, 116, +/* 210 */ 5, 129, 31, 4, 65, 14, 116, 4, 129, 31, +/* 220 */ 6, 64, 15, 116, 4, 129, 32, 7, 62, 16, +/* 230 */ 115, 4, 129, 32, 9, 61, 17, 114, 5, 129, +/* 240 */ 33, 11, 58, 19, 113, 5, 129, 34, 14, 55, +/* 250 */ 21, 112, 5, 129, 35, 40, 111, 5, 129, 36, +/* 260 */ 38, 110, 5, 129, 37, 35, 109, 5, 129, 38, +/* 270 */ 32, 110, 3, 129, 40, 27, 111, 1, 129, 193, +/* 280 */ 129, 30, 4, 103, 9, 129, 30, 7, 100, 15, +/* 290 */ 129, 30, 10, 99, 17, 129, 33, 10, 97, 6, +/* 300 */ 112, 6, 129, 36, 10, 96, 5, 114, 5, 129, +/* 310 */ 39, 10, 96, 4, 115, 4, 129, 42, 10, 95, +/* 320 */ 4, 116, 4, 129, 45, 10, 95, 3, 117, 3, +/* 330 */ 129, 48, 10, 95, 3, 117, 3, 129, 51, 10, +/* 340 */ 95, 4, 116, 4, 129, 54, 10, 96, 4, 115, +/* 350 */ 4, 129, 57, 10, 96, 5, 114, 5, 129, 60, +/* 360 */ 10, 97, 6, 112, 6, 129, 63, 10, 99, 17, +/* 370 */ 129, 66, 10, 100, 15, 129, 69, 10, 103, 9, +/* 380 */ 129, 39, 9, 72, 10, 129, 36, 15, 75, 10, +/* 390 */ 129, 35, 17, 78, 10, 129, 33, 6, 48, 6, +/* 400 */ 81, 10, 129, 32, 5, 50, 5, 84, 10, 129, +/* 410 */ 32, 4, 51, 4, 87, 10, 129, 31, 4, 52, +/* 420 */ 4, 90, 10, 129, 31, 3, 53, 3, 93, 10, +/* 430 */ 129, 31, 3, 53, 3, 96, 10, 129, 31, 4, +/* 440 */ 52, 4, 99, 10, 129, 32, 4, 51, 4, 102, +/* 450 */ 10, 129, 32, 5, 50, 5, 105, 10, 129, 33, +/* 460 */ 6, 48, 6, 108, 10, 129, 35, 17, 111, 10, +/* 470 */ 129, 36, 15, 114, 7, 129, 40, 9, 118, 4, +/* 480 */ 129, 193, 129, 48, 18, 129, 43, 28, 129, 41, +/* 490 */ 32, 129, 39, 36, 129, 37, 40, 129, 35, 44, +/* 500 */ 129, 34, 46, 129, 33, 13, 68, 13, 129, 32, +/* 510 */ 9, 73, 9, 129, 32, 7, 75, 7, 129, 31, +/* 520 */ 6, 77, 6, 129, 31, 5, 78, 5, 129, 30, +/* 530 */ 5, 79, 5, 129, 20, 74, 132, 30, 4, 80, +/* 540 */ 4, 129, 31, 3, 79, 4, 129, 31, 4, 79, +/* 550 */ 4, 129, 32, 3, 78, 4, 129, 32, 4, 76, +/* 560 */ 6, 129, 33, 4, 74, 7, 129, 34, 4, 72, +/* 570 */ 8, 129, 35, 5, 72, 7, 129, 37, 5, 73, +/* 580 */ 4, 129, 39, 4, 74, 1, 129, 129, 193, 130, +/* 590 */ 111, 6, 129, 109, 10, 129, 108, 12, 129, 107, +/* 600 */ 14, 129, 97, 2, 105, 16, 129, 99, 22, 129, +/* 610 */ 102, 18, 129, 105, 14, 129, 108, 9, 129, 194, +/* 620 */ 130, 63, 25, 129, 57, 37, 129, 52, 47, 129, +/* 630 */ 48, 55, 129, 44, 63, 129, 41, 69, 129, 38, +/* 640 */ 75, 129, 36, 79, 129, 34, 83, 129, 33, 28, +/* 650 */ 90, 28, 129, 32, 23, 96, 23, 129, 32, 17, +/* 660 */ 102, 17, 129, 31, 13, 107, 13, 129, 30, 9, +/* 670 */ 112, 9, 129, 30, 5, 116, 5, 129, 30, 1, +/* 680 */ 120, 1, 129, 194, 130, 30, 1, 120, 1, 129, +/* 690 */ 30, 5, 116, 5, 129, 30, 9, 112, 9, 129, +/* 700 */ 31, 13, 107, 13, 129, 32, 17, 102, 17, 129, +/* 710 */ 32, 23, 96, 23, 129, 33, 28, 90, 28, 129, +/* 720 */ 34, 83, 129, 36, 79, 129, 38, 75, 129, 41, +/* 730 */ 69, 129, 44, 63, 129, 48, 55, 129, 52, 47, +/* 740 */ 129, 57, 37, 129, 63, 25, 129, 194, 129, 80, +/* 750 */ 4, 130, 80, 4, 129, 68, 2, 80, 4, 94, +/* 760 */ 2, 129, 66, 6, 80, 4, 92, 6, 129, 67, +/* 770 */ 7, 80, 4, 90, 7, 129, 69, 7, 80, 4, +/* 780 */ 88, 7, 129, 71, 6, 80, 4, 87, 6, 129, +/* 790 */ 72, 20, 129, 74, 16, 129, 76, 12, 129, 62, +/* 800 */ 40, 131, 76, 12, 129, 74, 16, 129, 72, 20, +/* 810 */ 129, 71, 6, 80, 4, 87, 6, 129, 69, 7, +/* 820 */ 80, 4, 88, 7, 129, 67, 7, 80, 4, 90, +/* 830 */ 7, 129, 66, 6, 80, 4, 92, 6, 129, 68, +/* 840 */ 2, 80, 4, 94, 2, 129, 80, 4, 130, 193, +/* 850 */ 129, 60, 4, 139, 41, 42, 131, 60, 4, 139, +/* 860 */ 193, 130, 34, 6, 129, 32, 10, 129, 31, 12, +/* 870 */ 129, 30, 14, 129, 20, 2, 28, 16, 129, 22, +/* 880 */ 22, 129, 24, 19, 129, 27, 15, 129, 31, 9, +/* 890 */ 129, 194, 129, 60, 4, 152, 193, 130, 34, 6, +/* 900 */ 129, 32, 10, 129, 31, 12, 129, 30, 14, 131, +/* 910 */ 31, 12, 129, 32, 10, 129, 34, 6, 129, 194, +/* 920 */ 129, 30, 4, 129, 30, 7, 129, 30, 10, 129, +/* 930 */ 33, 10, 129, 36, 10, 129, 39, 10, 129, 42, +/* 940 */ 10, 129, 45, 10, 129, 48, 10, 129, 51, 10, +/* 950 */ 129, 54, 10, 129, 57, 10, 129, 60, 10, 129, +/* 960 */ 63, 10, 129, 66, 10, 129, 69, 10, 129, 72, +/* 970 */ 10, 129, 75, 10, 129, 78, 10, 129, 81, 10, +/* 980 */ 129, 84, 10, 129, 87, 10, 129, 90, 10, 129, +/* 990 */ 93, 10, 129, 96, 10, 129, 99, 10, 129, 102, +/* 1000 */ 10, 129, 105, 10, 129, 108, 10, 129, 111, 10, +/* 1010 */ 129, 114, 7, 129, 117, 4, 129, 193, 129, 60, +/* 1020 */ 31, 129, 53, 45, 129, 49, 53, 129, 46, 59, +/* 1030 */ 129, 43, 65, 129, 41, 69, 129, 39, 73, 129, +/* 1040 */ 37, 77, 129, 36, 79, 129, 35, 15, 101, 15, +/* 1050 */ 129, 34, 11, 106, 11, 129, 33, 9, 109, 9, +/* 1060 */ 129, 32, 7, 112, 7, 129, 31, 6, 114, 6, +/* 1070 */ 129, 31, 5, 115, 5, 129, 30, 5, 116, 5, +/* 1080 */ 129, 30, 4, 117, 4, 132, 30, 5, 116, 5, +/* 1090 */ 129, 31, 5, 115, 5, 129, 31, 6, 114, 6, +/* 1100 */ 129, 32, 7, 112, 7, 129, 33, 9, 109, 9, +/* 1110 */ 129, 34, 11, 106, 11, 129, 35, 15, 101, 15, +/* 1120 */ 129, 36, 79, 129, 37, 77, 129, 39, 73, 129, +/* 1130 */ 41, 69, 129, 43, 65, 129, 46, 59, 129, 49, +/* 1140 */ 53, 129, 53, 45, 129, 60, 31, 129, 193, 129, +/* 1150 */ 30, 4, 129, 30, 4, 100, 1, 129, 30, 4, +/* 1160 */ 100, 3, 129, 30, 4, 100, 5, 129, 30, 76, +/* 1170 */ 129, 30, 78, 129, 30, 80, 129, 30, 82, 129, +/* 1180 */ 30, 83, 129, 30, 85, 129, 30, 87, 129, 30, +/* 1190 */ 89, 129, 30, 91, 129, 30, 4, 132, 193, 129, +/* 1200 */ 30, 3, 129, 30, 7, 129, 30, 10, 112, 1, +/* 1210 */ 129, 30, 13, 112, 2, 129, 30, 16, 112, 3, +/* 1220 */ 129, 30, 18, 111, 5, 129, 30, 21, 111, 6, +/* 1230 */ 129, 30, 23, 112, 6, 129, 30, 14, 47, 8, +/* 1240 */ 113, 6, 129, 30, 14, 49, 8, 114, 5, 129, +/* 1250 */ 30, 14, 51, 8, 115, 5, 129, 30, 14, 53, +/* 1260 */ 8, 116, 4, 129, 30, 14, 55, 8, 116, 5, +/* 1270 */ 129, 30, 14, 56, 9, 117, 4, 129, 30, 14, +/* 1280 */ 57, 9, 117, 4, 129, 30, 14, 58, 10, 117, +/* 1290 */ 4, 129, 30, 14, 59, 10, 117, 4, 129, 30, +/* 1300 */ 14, 60, 11, 117, 4, 129, 30, 14, 61, 11, +/* 1310 */ 116, 5, 129, 30, 14, 62, 11, 116, 5, 129, +/* 1320 */ 30, 14, 63, 12, 115, 6, 129, 30, 14, 64, +/* 1330 */ 13, 114, 7, 129, 30, 14, 65, 13, 113, 8, +/* 1340 */ 129, 30, 14, 65, 15, 111, 9, 129, 30, 14, +/* 1350 */ 66, 16, 109, 11, 129, 30, 14, 67, 17, 107, +/* 1360 */ 12, 129, 30, 14, 68, 20, 103, 16, 129, 30, +/* 1370 */ 14, 69, 49, 129, 30, 14, 70, 47, 129, 30, +/* 1380 */ 14, 71, 45, 129, 30, 14, 73, 42, 129, 30, +/* 1390 */ 15, 75, 38, 129, 33, 12, 77, 34, 129, 36, +/* 1400 */ 10, 79, 30, 129, 40, 6, 82, 23, 129, 44, +/* 1410 */ 3, 86, 15, 129, 47, 1, 129, 193, 129, 129, +/* 1420 */ 38, 3, 129, 37, 5, 111, 1, 129, 36, 7, +/* 1430 */ 111, 2, 129, 35, 9, 110, 5, 129, 34, 8, +/* 1440 */ 110, 6, 129, 33, 7, 109, 8, 129, 32, 7, +/* 1450 */ 110, 8, 129, 32, 6, 112, 7, 129, 31, 6, +/* 1460 */ 113, 6, 129, 31, 5, 114, 6, 129, 30, 5, +/* 1470 */ 115, 5, 129, 30, 5, 116, 4, 129, 30, 4, +/* 1480 */ 117, 4, 131, 30, 4, 117, 4, 129, 30, 4, +/* 1490 */ 79, 2, 117, 4, 129, 30, 5, 78, 4, 117, +/* 1500 */ 4, 129, 30, 5, 77, 6, 116, 5, 129, 30, +/* 1510 */ 6, 76, 8, 115, 6, 129, 30, 7, 75, 11, +/* 1520 */ 114, 6, 129, 30, 8, 73, 15, 112, 8, 129, +/* 1530 */ 31, 9, 71, 19, 110, 9, 129, 31, 11, 68, +/* 1540 */ 26, 107, 12, 129, 32, 13, 65, 14, 82, 36, +/* 1550 */ 129, 32, 16, 61, 17, 83, 34, 129, 33, 44, +/* 1560 */ 84, 32, 129, 34, 42, 85, 30, 129, 35, 40, +/* 1570 */ 87, 27, 129, 36, 38, 89, 23, 129, 38, 34, +/* 1580 */ 92, 17, 129, 40, 30, 95, 11, 129, 42, 26, +/* 1590 */ 129, 45, 20, 129, 49, 11, 129, 193, 129, 49, +/* 1600 */ 1, 129, 49, 4, 129, 49, 6, 129, 49, 8, +/* 1610 */ 129, 49, 10, 129, 49, 12, 129, 49, 14, 129, +/* 1620 */ 49, 17, 129, 49, 19, 129, 49, 21, 129, 49, +/* 1630 */ 23, 129, 49, 14, 65, 9, 129, 49, 14, 67, +/* 1640 */ 9, 129, 49, 14, 69, 9, 129, 49, 14, 71, +/* 1650 */ 10, 129, 49, 14, 74, 9, 129, 49, 14, 76, +/* 1660 */ 9, 129, 49, 14, 78, 9, 129, 49, 14, 80, +/* 1670 */ 9, 129, 49, 14, 82, 9, 129, 49, 14, 84, +/* 1680 */ 9, 129, 30, 4, 49, 14, 86, 10, 129, 30, +/* 1690 */ 4, 49, 14, 89, 9, 129, 30, 4, 49, 14, +/* 1700 */ 91, 9, 129, 30, 4, 49, 14, 93, 9, 129, +/* 1710 */ 30, 74, 129, 30, 76, 129, 30, 78, 129, 30, +/* 1720 */ 81, 129, 30, 83, 129, 30, 85, 129, 30, 87, +/* 1730 */ 129, 30, 89, 129, 30, 91, 129, 30, 4, 49, +/* 1740 */ 14, 132, 193, 129, 37, 1, 129, 36, 3, 77, +/* 1750 */ 3, 129, 35, 5, 78, 11, 129, 34, 7, 78, +/* 1760 */ 21, 129, 33, 7, 79, 29, 129, 32, 7, 79, +/* 1770 */ 38, 129, 32, 6, 80, 4, 92, 29, 129, 31, +/* 1780 */ 6, 80, 5, 102, 19, 129, 31, 5, 80, 6, +/* 1790 */ 107, 14, 129, 31, 4, 81, 5, 107, 14, 129, +/* 1800 */ 30, 5, 81, 6, 107, 14, 129, 30, 4, 81, +/* 1810 */ 6, 107, 14, 130, 30, 4, 81, 7, 107, 14, +/* 1820 */ 129, 30, 4, 80, 8, 107, 14, 130, 30, 5, +/* 1830 */ 80, 8, 107, 14, 129, 30, 5, 79, 9, 107, +/* 1840 */ 14, 129, 31, 5, 79, 9, 107, 14, 129, 31, +/* 1850 */ 6, 78, 10, 107, 14, 129, 32, 6, 76, 11, +/* 1860 */ 107, 14, 129, 32, 8, 74, 13, 107, 14, 129, +/* 1870 */ 33, 10, 71, 16, 107, 14, 129, 33, 15, 67, +/* 1880 */ 19, 107, 14, 129, 34, 51, 107, 14, 129, 35, +/* 1890 */ 49, 107, 14, 129, 36, 47, 107, 14, 129, 37, +/* 1900 */ 45, 107, 14, 129, 39, 41, 107, 14, 129, 41, +/* 1910 */ 37, 107, 14, 129, 44, 32, 107, 14, 129, 47, +/* 1920 */ 25, 111, 10, 129, 51, 16, 115, 6, 129, 119, +/* 1930 */ 2, 129, 193, 129, 56, 39, 129, 51, 49, 129, +/* 1940 */ 47, 57, 129, 44, 63, 129, 42, 67, 129, 40, +/* 1950 */ 71, 129, 38, 75, 129, 37, 77, 129, 35, 81, +/* 1960 */ 129, 34, 16, 74, 5, 101, 16, 129, 33, 11, +/* 1970 */ 76, 5, 107, 11, 129, 32, 9, 77, 5, 110, +/* 1980 */ 9, 129, 32, 7, 79, 4, 112, 7, 129, 31, +/* 1990 */ 6, 80, 4, 114, 6, 129, 31, 5, 81, 4, +/* 2000 */ 115, 5, 129, 30, 5, 82, 4, 116, 5, 129, +/* 2010 */ 30, 4, 82, 4, 116, 5, 129, 30, 4, 82, +/* 2020 */ 5, 117, 4, 131, 30, 5, 82, 5, 117, 4, +/* 2030 */ 129, 31, 5, 81, 6, 117, 4, 129, 31, 6, +/* 2040 */ 80, 7, 117, 4, 129, 32, 7, 79, 8, 117, +/* 2050 */ 4, 129, 32, 9, 77, 9, 116, 5, 129, 33, +/* 2060 */ 11, 75, 11, 116, 4, 129, 34, 16, 69, 16, +/* 2070 */ 115, 5, 129, 35, 49, 114, 5, 129, 37, 46, +/* 2080 */ 113, 5, 129, 38, 44, 112, 6, 129, 40, 41, +/* 2090 */ 112, 5, 129, 42, 37, 113, 3, 129, 44, 33, +/* 2100 */ 114, 1, 129, 47, 27, 129, 51, 17, 129, 193, +/* 2110 */ 129, 103, 2, 129, 103, 6, 129, 104, 9, 129, +/* 2120 */ 105, 12, 129, 106, 15, 129, 107, 14, 135, 30, +/* 2130 */ 10, 107, 14, 129, 30, 17, 107, 14, 129, 30, +/* 2140 */ 25, 107, 14, 129, 30, 31, 107, 14, 129, 30, +/* 2150 */ 37, 107, 14, 129, 30, 42, 107, 14, 129, 30, +/* 2160 */ 46, 107, 14, 129, 30, 50, 107, 14, 129, 30, +/* 2170 */ 54, 107, 14, 129, 30, 58, 107, 14, 129, 59, +/* 2180 */ 32, 107, 14, 129, 64, 30, 107, 14, 129, 74, +/* 2190 */ 23, 107, 14, 129, 81, 18, 107, 14, 129, 86, +/* 2200 */ 16, 107, 14, 129, 91, 14, 107, 14, 129, 96, +/* 2210 */ 25, 129, 100, 21, 129, 104, 17, 129, 107, 14, +/* 2220 */ 129, 111, 10, 129, 114, 7, 129, 117, 4, 129, +/* 2230 */ 120, 1, 129, 193, 129, 48, 13, 129, 44, 21, +/* 2240 */ 129, 42, 26, 129, 40, 30, 92, 12, 129, 38, +/* 2250 */ 34, 88, 20, 129, 36, 37, 86, 25, 129, 35, +/* 2260 */ 39, 84, 29, 129, 34, 13, 63, 12, 82, 33, +/* 2270 */ 129, 33, 11, 67, 9, 80, 36, 129, 32, 9, +/* 2280 */ 70, 7, 79, 38, 129, 31, 8, 72, 46, 129, +/* 2290 */ 30, 7, 74, 22, 108, 11, 129, 30, 6, 75, +/* 2300 */ 19, 111, 9, 129, 30, 5, 75, 17, 113, 7, +/* 2310 */ 129, 30, 5, 74, 16, 114, 6, 129, 30, 4, +/* 2320 */ 73, 16, 115, 6, 129, 30, 4, 72, 16, 116, +/* 2330 */ 5, 129, 30, 4, 72, 15, 117, 4, 129, 30, +/* 2340 */ 4, 71, 16, 117, 4, 129, 30, 5, 70, 16, +/* 2350 */ 117, 4, 129, 30, 5, 70, 15, 117, 4, 129, +/* 2360 */ 30, 6, 69, 15, 116, 5, 129, 30, 7, 68, +/* 2370 */ 17, 115, 5, 129, 30, 9, 67, 19, 114, 6, +/* 2380 */ 129, 30, 10, 65, 22, 113, 6, 129, 31, 12, +/* 2390 */ 63, 27, 110, 9, 129, 32, 14, 60, 21, 84, +/* 2400 */ 9, 106, 12, 129, 33, 47, 85, 32, 129, 34, +/* 2410 */ 45, 86, 30, 129, 35, 43, 88, 26, 129, 36, +/* 2420 */ 40, 90, 22, 129, 38, 36, 93, 17, 129, 40, +/* 2430 */ 32, 96, 10, 129, 42, 28, 129, 44, 23, 129, +/* 2440 */ 48, 15, 129, 193, 129, 83, 17, 129, 77, 27, +/* 2450 */ 129, 36, 1, 74, 33, 129, 35, 3, 72, 37, +/* 2460 */ 129, 34, 5, 70, 41, 129, 33, 6, 69, 44, +/* 2470 */ 129, 33, 5, 68, 46, 129, 32, 5, 67, 49, +/* 2480 */ 129, 31, 5, 66, 17, 101, 16, 129, 31, 5, +/* 2490 */ 66, 11, 108, 10, 129, 30, 4, 65, 9, 110, +/* 2500 */ 9, 129, 30, 4, 64, 8, 112, 7, 129, 30, +/* 2510 */ 4, 64, 7, 114, 6, 129, 30, 4, 64, 6, +/* 2520 */ 115, 5, 129, 30, 4, 64, 5, 116, 5, 129, +/* 2530 */ 30, 4, 64, 5, 117, 4, 131, 30, 4, 65, +/* 2540 */ 4, 117, 4, 129, 30, 5, 65, 4, 116, 5, +/* 2550 */ 129, 31, 5, 66, 4, 115, 5, 129, 31, 6, +/* 2560 */ 67, 4, 114, 6, 129, 32, 7, 68, 4, 112, +/* 2570 */ 7, 129, 32, 9, 69, 5, 110, 9, 129, 33, +/* 2580 */ 11, 70, 5, 107, 11, 129, 34, 16, 72, 5, +/* 2590 */ 101, 16, 129, 35, 81, 129, 37, 77, 129, 38, +/* 2600 */ 75, 129, 40, 71, 129, 42, 67, 129, 44, 63, +/* 2610 */ 129, 47, 57, 129, 51, 49, 129, 56, 39, 129, +/* 2620 */ 193, 130, 34, 6, 74, 6, 129, 32, 10, 72, +/* 2630 */ 10, 129, 31, 12, 71, 12, 129, 30, 14, 70, +/* 2640 */ 14, 131, 31, 12, 71, 12, 129, 32, 10, 72, +/* 2650 */ 10, 129, 34, 6, 74, 6, 129, 194, 130, 34, +/* 2660 */ 6, 74, 6, 129, 32, 10, 72, 10, 129, 31, +/* 2670 */ 12, 71, 12, 129, 30, 14, 70, 14, 129, 20, +/* 2680 */ 2, 28, 16, 70, 14, 129, 22, 22, 70, 14, +/* 2690 */ 129, 24, 19, 71, 12, 129, 27, 15, 72, 10, +/* 2700 */ 129, 31, 9, 74, 6, 129, 194, 129, 53, 4, +/* 2710 */ 63, 4, 152, 193, 130, 99, 7, 129, 97, 13, +/* 2720 */ 129, 96, 16, 129, 96, 18, 129, 96, 19, 129, +/* 2730 */ 97, 19, 129, 99, 6, 110, 7, 129, 112, 6, +/* 2740 */ 129, 114, 5, 129, 34, 6, 57, 5, 115, 4, +/* 2750 */ 129, 32, 10, 54, 12, 116, 4, 129, 31, 12, +/* 2760 */ 53, 16, 117, 3, 129, 30, 14, 52, 20, 117, +/* 2770 */ 4, 129, 30, 14, 52, 23, 117, 4, 129, 30, +/* 2780 */ 14, 52, 25, 117, 4, 129, 31, 12, 52, 27, +/* 2790 */ 117, 4, 129, 32, 10, 53, 10, 70, 11, 116, +/* 2800 */ 5, 129, 34, 6, 55, 5, 73, 10, 115, 6, +/* 2810 */ 129, 74, 11, 114, 7, 129, 75, 12, 112, 9, +/* 2820 */ 129, 76, 13, 110, 10, 129, 77, 16, 106, 14, +/* 2830 */ 129, 78, 41, 129, 80, 38, 129, 81, 36, 129, +/* 2840 */ 82, 34, 129, 84, 30, 129, 86, 26, 129, 88, +/* 2850 */ 22, 129, 92, 14, 129, 194, 129, 55, 15, 129, +/* 2860 */ 50, 25, 129, 47, 32, 129, 45, 13, 70, 12, +/* 2870 */ 129, 43, 9, 76, 10, 129, 42, 6, 79, 8, +/* 2880 */ 129, 41, 5, 81, 7, 129, 40, 4, 84, 6, +/* 2890 */ 129, 39, 4, 59, 12, 85, 6, 129, 38, 4, +/* 2900 */ 55, 19, 87, 5, 129, 37, 4, 53, 23, 88, +/* 2910 */ 4, 129, 36, 4, 51, 8, 71, 6, 89, 4, +/* 2920 */ 129, 36, 4, 51, 6, 73, 4, 89, 4, 129, +/* 2930 */ 36, 4, 50, 6, 74, 4, 90, 3, 129, 35, +/* 2940 */ 4, 50, 5, 75, 3, 90, 4, 129, 35, 4, +/* 2950 */ 50, 4, 75, 4, 90, 4, 131, 35, 4, 50, +/* 2960 */ 5, 75, 4, 90, 4, 129, 36, 4, 51, 5, +/* 2970 */ 75, 4, 90, 4, 129, 36, 4, 51, 6, 75, +/* 2980 */ 4, 90, 4, 129, 36, 4, 53, 26, 90, 4, +/* 2990 */ 129, 37, 4, 54, 25, 90, 4, 129, 37, 4, +/* 3000 */ 52, 27, 90, 3, 129, 38, 4, 52, 4, 89, +/* 3010 */ 4, 129, 39, 4, 51, 4, 88, 4, 129, 40, +/* 3020 */ 4, 50, 4, 87, 5, 129, 41, 4, 50, 4, +/* 3030 */ 86, 5, 129, 42, 4, 50, 4, 85, 5, 129, +/* 3040 */ 43, 3, 50, 4, 83, 6, 129, 44, 2, 51, +/* 3050 */ 5, 80, 7, 129, 46, 1, 52, 6, 76, 9, +/* 3060 */ 129, 54, 28, 129, 56, 23, 129, 60, 16, 129, +/* 3070 */ 193, 129, 30, 4, 132, 30, 5, 129, 30, 8, +/* 3080 */ 129, 30, 12, 129, 30, 16, 129, 30, 4, 37, +/* 3090 */ 12, 129, 30, 4, 41, 12, 129, 30, 4, 44, +/* 3100 */ 13, 129, 30, 4, 48, 13, 129, 52, 13, 129, +/* 3110 */ 56, 12, 129, 58, 14, 129, 58, 4, 64, 12, +/* 3120 */ 129, 58, 4, 68, 12, 129, 58, 4, 72, 12, +/* 3130 */ 129, 58, 4, 75, 13, 129, 58, 4, 79, 13, +/* 3140 */ 129, 58, 4, 83, 13, 129, 58, 4, 87, 13, +/* 3150 */ 129, 58, 4, 91, 12, 129, 58, 4, 95, 12, +/* 3160 */ 129, 58, 4, 96, 15, 129, 58, 4, 93, 22, +/* 3170 */ 129, 58, 4, 89, 30, 129, 58, 4, 85, 36, +/* 3180 */ 129, 58, 4, 81, 38, 129, 58, 4, 77, 38, +/* 3190 */ 129, 58, 4, 73, 38, 129, 58, 4, 70, 37, +/* 3200 */ 129, 58, 4, 66, 37, 129, 58, 41, 129, 58, +/* 3210 */ 37, 129, 54, 38, 129, 30, 4, 50, 38, 129, +/* 3220 */ 30, 4, 46, 38, 129, 30, 4, 42, 38, 129, +/* 3230 */ 30, 4, 38, 39, 129, 30, 43, 129, 30, 39, +/* 3240 */ 129, 30, 35, 129, 30, 31, 129, 30, 27, 129, +/* 3250 */ 30, 24, 129, 30, 20, 129, 30, 16, 129, 30, +/* 3260 */ 12, 129, 30, 8, 129, 30, 5, 129, 30, 4, +/* 3270 */ 132, 193, 129, 30, 4, 117, 4, 132, 30, 91, +/* 3280 */ 137, 30, 4, 80, 4, 117, 4, 138, 30, 4, +/* 3290 */ 80, 5, 116, 5, 129, 30, 5, 79, 6, 116, +/* 3300 */ 5, 130, 30, 6, 78, 8, 115, 6, 129, 31, +/* 3310 */ 6, 77, 9, 115, 6, 129, 31, 7, 76, 11, +/* 3320 */ 114, 6, 129, 31, 8, 75, 14, 112, 8, 129, +/* 3330 */ 32, 8, 74, 16, 111, 9, 129, 32, 9, 73, +/* 3340 */ 19, 109, 10, 129, 33, 10, 71, 24, 106, 13, +/* 3350 */ 129, 33, 13, 68, 12, 83, 35, 129, 34, 16, +/* 3360 */ 64, 15, 84, 33, 129, 35, 43, 85, 31, 129, +/* 3370 */ 36, 41, 86, 29, 129, 37, 39, 88, 25, 129, +/* 3380 */ 38, 37, 90, 21, 129, 40, 33, 93, 15, 129, +/* 3390 */ 42, 29, 96, 9, 129, 45, 24, 129, 49, 16, +/* 3400 */ 129, 193, 129, 63, 25, 129, 57, 37, 129, 53, +/* 3410 */ 45, 129, 50, 51, 129, 47, 57, 129, 45, 61, +/* 3420 */ 129, 43, 65, 129, 41, 69, 129, 39, 73, 129, +/* 3430 */ 38, 25, 92, 21, 129, 36, 21, 97, 18, 129, +/* 3440 */ 35, 18, 102, 14, 129, 34, 16, 106, 11, 129, +/* 3450 */ 33, 14, 108, 10, 129, 32, 12, 111, 8, 129, +/* 3460 */ 32, 10, 113, 6, 129, 31, 10, 114, 6, 129, +/* 3470 */ 31, 8, 115, 5, 129, 30, 8, 116, 5, 129, +/* 3480 */ 30, 7, 116, 5, 129, 30, 6, 117, 4, 130, +/* 3490 */ 30, 5, 117, 4, 131, 31, 4, 116, 5, 129, +/* 3500 */ 32, 4, 116, 4, 129, 32, 5, 115, 5, 129, +/* 3510 */ 33, 4, 114, 5, 129, 34, 4, 112, 6, 129, +/* 3520 */ 35, 4, 110, 7, 129, 37, 4, 107, 9, 129, +/* 3530 */ 39, 4, 103, 12, 129, 41, 4, 103, 18, 129, +/* 3540 */ 43, 4, 103, 18, 129, 45, 5, 103, 18, 129, +/* 3550 */ 48, 5, 103, 18, 129, 51, 1, 129, 193, 129, +/* 3560 */ 30, 4, 117, 4, 132, 30, 91, 137, 30, 4, +/* 3570 */ 117, 4, 135, 30, 5, 116, 5, 130, 30, 6, +/* 3580 */ 115, 6, 130, 31, 6, 114, 6, 129, 31, 7, +/* 3590 */ 113, 7, 129, 32, 7, 112, 7, 129, 32, 8, +/* 3600 */ 111, 8, 129, 33, 9, 109, 9, 129, 33, 12, +/* 3610 */ 106, 12, 129, 34, 13, 104, 13, 129, 35, 15, +/* 3620 */ 101, 15, 129, 36, 19, 96, 19, 129, 37, 24, +/* 3630 */ 90, 24, 129, 39, 73, 129, 40, 71, 129, 42, +/* 3640 */ 67, 129, 44, 63, 129, 46, 59, 129, 49, 53, +/* 3650 */ 129, 52, 47, 129, 56, 39, 129, 61, 29, 129, +/* 3660 */ 193, 129, 30, 4, 117, 4, 132, 30, 91, 137, +/* 3670 */ 30, 4, 80, 4, 117, 4, 140, 30, 4, 79, +/* 3680 */ 6, 117, 4, 129, 30, 4, 77, 10, 117, 4, +/* 3690 */ 129, 30, 4, 73, 18, 117, 4, 132, 30, 4, +/* 3700 */ 117, 4, 130, 30, 5, 116, 5, 130, 30, 7, +/* 3710 */ 114, 7, 129, 30, 8, 113, 8, 129, 30, 11, +/* 3720 */ 110, 11, 129, 30, 18, 103, 18, 132, 193, 129, +/* 3730 */ 30, 4, 117, 4, 132, 30, 91, 137, 30, 4, +/* 3740 */ 80, 4, 117, 4, 132, 80, 4, 117, 4, 136, +/* 3750 */ 79, 6, 117, 4, 129, 77, 10, 117, 4, 129, +/* 3760 */ 73, 18, 117, 4, 132, 117, 4, 130, 116, 5, +/* 3770 */ 130, 114, 7, 129, 113, 8, 129, 110, 11, 129, +/* 3780 */ 103, 18, 132, 193, 129, 63, 25, 129, 57, 37, +/* 3790 */ 129, 53, 45, 129, 50, 51, 129, 47, 57, 129, +/* 3800 */ 45, 61, 129, 43, 65, 129, 41, 69, 129, 39, +/* 3810 */ 73, 129, 38, 25, 92, 21, 129, 36, 21, 97, +/* 3820 */ 18, 129, 35, 18, 102, 14, 129, 34, 16, 106, +/* 3830 */ 11, 129, 33, 14, 108, 10, 129, 32, 12, 111, +/* 3840 */ 8, 129, 32, 10, 113, 6, 129, 31, 10, 114, +/* 3850 */ 6, 129, 31, 8, 115, 5, 129, 30, 8, 116, +/* 3860 */ 5, 129, 30, 7, 116, 5, 129, 30, 6, 117, +/* 3870 */ 4, 130, 30, 5, 117, 4, 131, 30, 5, 75, +/* 3880 */ 4, 116, 5, 129, 31, 5, 75, 4, 116, 4, +/* 3890 */ 129, 31, 6, 75, 4, 115, 5, 129, 32, 7, +/* 3900 */ 75, 4, 114, 5, 129, 32, 9, 75, 4, 112, +/* 3910 */ 6, 129, 33, 11, 75, 4, 110, 7, 129, 34, +/* 3920 */ 15, 75, 4, 107, 9, 129, 35, 44, 103, 12, +/* 3930 */ 129, 36, 43, 103, 18, 129, 38, 41, 103, 18, +/* 3940 */ 129, 39, 40, 103, 18, 129, 41, 38, 103, 18, +/* 3950 */ 129, 44, 35, 129, 48, 31, 129, 52, 27, 129, +/* 3960 */ 61, 18, 129, 193, 129, 30, 4, 117, 4, 132, +/* 3970 */ 30, 91, 137, 30, 4, 80, 4, 117, 4, 132, +/* 3980 */ 80, 4, 140, 30, 4, 80, 4, 117, 4, 132, +/* 3990 */ 30, 91, 137, 30, 4, 117, 4, 132, 193, 129, +/* 4000 */ 30, 4, 117, 4, 132, 30, 91, 137, 30, 4, +/* 4010 */ 117, 4, 132, 193, 129, 44, 7, 129, 40, 13, +/* 4020 */ 129, 37, 17, 129, 35, 20, 129, 34, 22, 129, +/* 4030 */ 33, 23, 129, 32, 24, 129, 32, 23, 129, 31, +/* 4040 */ 6, 41, 13, 129, 31, 5, 42, 11, 129, 30, +/* 4050 */ 5, 44, 7, 129, 30, 4, 132, 30, 5, 130, +/* 4060 */ 31, 5, 129, 31, 6, 117, 4, 129, 31, 8, +/* 4070 */ 117, 4, 129, 32, 9, 117, 4, 129, 33, 11, +/* 4080 */ 117, 4, 129, 34, 87, 129, 35, 86, 129, 36, +/* 4090 */ 85, 129, 37, 84, 129, 38, 83, 129, 40, 81, +/* 4100 */ 129, 42, 79, 129, 45, 76, 129, 50, 71, 129, +/* 4110 */ 117, 4, 132, 193, 129, 30, 4, 117, 4, 132, +/* 4120 */ 30, 91, 137, 30, 4, 76, 8, 117, 4, 129, +/* 4130 */ 30, 4, 73, 13, 117, 4, 129, 30, 4, 70, +/* 4140 */ 18, 117, 4, 129, 30, 4, 67, 23, 117, 4, +/* 4150 */ 129, 65, 26, 129, 62, 31, 129, 59, 35, 129, +/* 4160 */ 56, 29, 89, 7, 129, 53, 29, 91, 7, 129, +/* 4170 */ 50, 29, 93, 7, 129, 47, 29, 95, 6, 129, +/* 4180 */ 30, 4, 45, 29, 96, 7, 129, 30, 4, 42, +/* 4190 */ 29, 98, 7, 129, 30, 4, 39, 30, 100, 6, +/* 4200 */ 129, 30, 4, 36, 30, 101, 7, 129, 30, 33, +/* 4210 */ 103, 7, 117, 4, 129, 30, 30, 105, 6, 117, +/* 4220 */ 4, 129, 30, 27, 106, 7, 117, 4, 129, 30, +/* 4230 */ 25, 108, 7, 117, 4, 129, 30, 22, 110, 11, +/* 4240 */ 129, 30, 19, 111, 10, 129, 30, 16, 113, 8, +/* 4250 */ 129, 30, 13, 115, 6, 129, 30, 11, 116, 5, +/* 4260 */ 129, 30, 8, 117, 4, 129, 30, 5, 117, 4, +/* 4270 */ 129, 30, 4, 117, 4, 130, 30, 4, 130, 193, +/* 4280 */ 129, 30, 4, 117, 4, 132, 30, 91, 137, 30, +/* 4290 */ 4, 117, 4, 132, 30, 4, 144, 30, 5, 130, +/* 4300 */ 30, 7, 129, 30, 8, 129, 30, 11, 129, 30, +/* 4310 */ 18, 132, 193, 129, 30, 4, 117, 4, 132, 30, +/* 4320 */ 91, 132, 30, 4, 103, 18, 129, 30, 4, 97, +/* 4330 */ 24, 129, 30, 4, 92, 29, 129, 30, 4, 87, +/* 4340 */ 34, 129, 81, 40, 129, 76, 45, 129, 70, 49, +/* 4350 */ 129, 65, 49, 129, 60, 49, 129, 55, 49, 129, +/* 4360 */ 50, 48, 129, 44, 49, 129, 39, 48, 129, 33, +/* 4370 */ 49, 129, 30, 47, 129, 34, 37, 129, 40, 26, +/* 4380 */ 129, 46, 19, 129, 52, 19, 129, 58, 19, 129, +/* 4390 */ 64, 19, 129, 70, 19, 129, 76, 19, 129, 82, +/* 4400 */ 19, 129, 30, 4, 88, 18, 129, 30, 4, 94, +/* 4410 */ 18, 129, 30, 4, 100, 18, 129, 30, 4, 106, +/* 4420 */ 15, 129, 30, 91, 137, 30, 4, 117, 4, 132, +/* 4430 */ 193, 129, 30, 4, 117, 4, 132, 30, 91, 132, +/* 4440 */ 30, 4, 107, 14, 129, 30, 4, 104, 17, 129, +/* 4450 */ 30, 4, 101, 20, 129, 30, 4, 99, 22, 129, +/* 4460 */ 96, 25, 129, 93, 28, 129, 91, 28, 129, 88, +/* 4470 */ 29, 129, 85, 29, 129, 82, 29, 129, 79, 29, +/* 4480 */ 129, 76, 29, 129, 74, 29, 129, 71, 29, 129, +/* 4490 */ 68, 29, 129, 65, 29, 129, 62, 29, 129, 60, +/* 4500 */ 29, 129, 57, 29, 129, 54, 29, 129, 51, 29, +/* 4510 */ 129, 49, 28, 129, 46, 29, 129, 43, 29, 129, +/* 4520 */ 40, 29, 117, 4, 129, 37, 29, 117, 4, 129, +/* 4530 */ 35, 29, 117, 4, 129, 32, 29, 117, 4, 129, +/* 4540 */ 30, 91, 132, 117, 4, 132, 193, 129, 63, 25, +/* 4550 */ 129, 57, 37, 129, 53, 45, 129, 50, 51, 129, +/* 4560 */ 47, 57, 129, 45, 61, 129, 43, 65, 129, 41, +/* 4570 */ 69, 129, 39, 73, 129, 38, 21, 92, 21, 129, +/* 4580 */ 36, 18, 97, 18, 129, 35, 14, 102, 14, 129, +/* 4590 */ 34, 11, 106, 11, 129, 33, 10, 108, 10, 129, +/* 4600 */ 32, 8, 111, 8, 129, 32, 6, 113, 6, 129, +/* 4610 */ 31, 6, 114, 6, 129, 31, 5, 115, 5, 129, +/* 4620 */ 30, 5, 116, 5, 130, 30, 4, 117, 4, 132, +/* 4630 */ 30, 5, 116, 5, 130, 31, 5, 115, 5, 129, +/* 4640 */ 31, 6, 114, 6, 129, 32, 6, 113, 6, 129, +/* 4650 */ 32, 8, 111, 8, 129, 33, 10, 108, 10, 129, +/* 4660 */ 34, 11, 106, 11, 129, 35, 14, 102, 14, 129, +/* 4670 */ 36, 18, 97, 18, 129, 38, 21, 92, 21, 129, +/* 4680 */ 39, 73, 129, 41, 69, 129, 43, 65, 129, 45, +/* 4690 */ 61, 129, 47, 57, 129, 50, 51, 129, 53, 45, +/* 4700 */ 129, 57, 37, 129, 63, 25, 129, 193, 129, 30, +/* 4710 */ 4, 117, 4, 132, 30, 91, 137, 30, 4, 80, +/* 4720 */ 4, 117, 4, 132, 80, 4, 117, 4, 134, 80, +/* 4730 */ 5, 116, 5, 131, 80, 6, 115, 6, 130, 81, +/* 4740 */ 6, 114, 6, 129, 81, 8, 112, 8, 129, 81, +/* 4750 */ 9, 111, 9, 129, 82, 10, 109, 10, 129, 82, +/* 4760 */ 13, 106, 13, 129, 83, 35, 129, 84, 33, 129, +/* 4770 */ 85, 31, 129, 86, 29, 129, 88, 25, 129, 90, +/* 4780 */ 21, 129, 93, 15, 129, 96, 9, 129, 193, 129, +/* 4790 */ 63, 25, 129, 57, 37, 129, 53, 45, 129, 50, +/* 4800 */ 51, 129, 47, 57, 129, 45, 61, 129, 43, 65, +/* 4810 */ 129, 41, 69, 129, 39, 73, 129, 38, 21, 92, +/* 4820 */ 21, 129, 36, 18, 97, 18, 129, 35, 14, 102, +/* 4830 */ 14, 129, 34, 11, 106, 11, 129, 33, 10, 108, +/* 4840 */ 10, 129, 32, 8, 111, 8, 129, 32, 6, 113, +/* 4850 */ 6, 129, 31, 6, 114, 6, 129, 31, 5, 115, +/* 4860 */ 5, 129, 30, 5, 116, 5, 130, 30, 4, 39, +/* 4870 */ 2, 117, 4, 129, 30, 4, 40, 4, 117, 4, +/* 4880 */ 129, 30, 4, 41, 5, 117, 4, 129, 30, 4, +/* 4890 */ 41, 6, 117, 4, 129, 30, 5, 40, 8, 116, +/* 4900 */ 5, 129, 30, 5, 39, 10, 116, 5, 129, 31, +/* 4910 */ 5, 38, 11, 115, 5, 129, 31, 18, 114, 6, +/* 4920 */ 129, 32, 17, 113, 6, 129, 32, 16, 111, 8, +/* 4930 */ 129, 33, 15, 108, 10, 129, 33, 14, 106, 11, +/* 4940 */ 129, 32, 17, 102, 14, 129, 31, 23, 97, 18, +/* 4950 */ 129, 31, 28, 92, 21, 129, 30, 82, 129, 30, +/* 4960 */ 80, 129, 30, 11, 43, 65, 129, 30, 10, 45, +/* 4970 */ 61, 129, 31, 8, 47, 57, 129, 32, 6, 50, +/* 4980 */ 51, 129, 33, 5, 53, 45, 129, 35, 4, 57, +/* 4990 */ 37, 129, 38, 2, 63, 25, 129, 193, 129, 30, +/* 5000 */ 4, 117, 4, 132, 30, 91, 137, 30, 4, 76, +/* 5010 */ 8, 117, 4, 129, 30, 4, 73, 11, 117, 4, +/* 5020 */ 129, 30, 4, 70, 14, 117, 4, 129, 30, 4, +/* 5030 */ 67, 17, 117, 4, 129, 65, 19, 117, 4, 129, +/* 5040 */ 62, 22, 117, 4, 129, 59, 25, 117, 4, 129, +/* 5050 */ 56, 28, 117, 4, 129, 53, 31, 117, 4, 129, +/* 5060 */ 50, 34, 117, 4, 129, 47, 29, 80, 5, 116, +/* 5070 */ 5, 129, 30, 4, 45, 29, 80, 5, 116, 5, +/* 5080 */ 129, 30, 4, 42, 29, 80, 5, 116, 5, 129, +/* 5090 */ 30, 4, 39, 30, 80, 6, 115, 6, 129, 30, +/* 5100 */ 4, 36, 30, 80, 6, 115, 6, 129, 30, 33, +/* 5110 */ 81, 6, 114, 6, 129, 30, 30, 81, 8, 112, +/* 5120 */ 8, 129, 30, 27, 81, 9, 111, 9, 129, 30, +/* 5130 */ 25, 82, 10, 109, 10, 129, 30, 22, 82, 13, +/* 5140 */ 106, 13, 129, 30, 19, 83, 35, 129, 30, 16, +/* 5150 */ 84, 33, 129, 30, 13, 85, 31, 129, 30, 11, +/* 5160 */ 86, 29, 129, 30, 8, 88, 25, 129, 30, 5, +/* 5170 */ 90, 21, 129, 30, 4, 93, 15, 129, 30, 4, +/* 5180 */ 96, 9, 129, 30, 4, 130, 193, 129, 30, 18, +/* 5190 */ 130, 30, 18, 89, 15, 129, 30, 18, 85, 23, +/* 5200 */ 129, 34, 11, 83, 27, 129, 34, 9, 81, 31, +/* 5210 */ 129, 33, 8, 79, 35, 129, 33, 6, 78, 16, +/* 5220 */ 106, 9, 129, 32, 6, 77, 15, 109, 7, 129, +/* 5230 */ 32, 5, 76, 14, 111, 6, 129, 31, 5, 75, +/* 5240 */ 14, 113, 5, 129, 31, 4, 74, 15, 114, 5, +/* 5250 */ 129, 31, 4, 74, 14, 115, 4, 129, 30, 4, +/* 5260 */ 73, 15, 116, 4, 129, 30, 4, 73, 14, 116, +/* 5270 */ 4, 129, 30, 4, 73, 14, 117, 4, 129, 30, +/* 5280 */ 4, 72, 15, 117, 4, 130, 30, 4, 71, 15, +/* 5290 */ 117, 4, 130, 30, 4, 70, 15, 117, 4, 129, +/* 5300 */ 30, 5, 70, 15, 117, 4, 129, 30, 5, 69, +/* 5310 */ 15, 116, 5, 129, 30, 6, 68, 16, 115, 5, +/* 5320 */ 129, 31, 6, 67, 16, 114, 6, 129, 31, 7, +/* 5330 */ 66, 17, 113, 6, 129, 32, 7, 64, 18, 111, +/* 5340 */ 8, 129, 32, 8, 62, 19, 109, 9, 129, 33, +/* 5350 */ 9, 60, 20, 107, 10, 129, 34, 11, 57, 22, +/* 5360 */ 103, 13, 129, 35, 43, 103, 18, 129, 36, 41, +/* 5370 */ 103, 18, 129, 38, 38, 103, 18, 129, 39, 35, +/* 5380 */ 103, 18, 129, 41, 31, 129, 43, 27, 129, 46, +/* 5390 */ 22, 129, 49, 14, 129, 193, 129, 103, 18, 132, +/* 5400 */ 110, 11, 129, 113, 8, 129, 114, 7, 129, 116, +/* 5410 */ 5, 130, 117, 4, 132, 30, 4, 117, 4, 132, +/* 5420 */ 30, 91, 137, 30, 4, 117, 4, 132, 117, 4, +/* 5430 */ 132, 116, 5, 130, 114, 7, 129, 113, 8, 129, +/* 5440 */ 110, 11, 129, 103, 18, 132, 193, 129, 117, 4, +/* 5450 */ 132, 56, 65, 129, 50, 71, 129, 46, 75, 129, +/* 5460 */ 44, 77, 129, 42, 79, 129, 40, 81, 129, 38, +/* 5470 */ 83, 129, 36, 85, 129, 35, 86, 129, 34, 20, +/* 5480 */ 117, 4, 129, 33, 17, 117, 4, 129, 32, 15, +/* 5490 */ 117, 4, 129, 32, 13, 117, 4, 129, 31, 12, +/* 5500 */ 129, 31, 10, 129, 31, 9, 129, 30, 9, 129, +/* 5510 */ 30, 8, 130, 30, 7, 132, 31, 6, 130, 31, +/* 5520 */ 7, 129, 32, 6, 129, 32, 7, 129, 33, 7, +/* 5530 */ 129, 34, 7, 129, 35, 8, 129, 36, 9, 117, +/* 5540 */ 4, 129, 38, 9, 117, 4, 129, 40, 10, 117, +/* 5550 */ 4, 129, 42, 12, 117, 4, 129, 44, 77, 129, +/* 5560 */ 46, 75, 129, 50, 71, 129, 56, 43, 100, 21, +/* 5570 */ 129, 117, 4, 132, 193, 129, 117, 4, 132, 115, +/* 5580 */ 6, 129, 110, 11, 129, 105, 16, 129, 101, 20, +/* 5590 */ 129, 96, 25, 129, 92, 29, 129, 87, 34, 129, +/* 5600 */ 83, 38, 129, 78, 43, 129, 74, 47, 129, 70, +/* 5610 */ 42, 117, 4, 129, 65, 42, 117, 4, 129, 60, +/* 5620 */ 43, 117, 4, 129, 56, 42, 129, 51, 42, 129, +/* 5630 */ 46, 43, 129, 42, 43, 129, 37, 44, 129, 33, +/* 5640 */ 43, 129, 30, 42, 129, 33, 34, 129, 38, 25, +/* 5650 */ 129, 42, 16, 129, 47, 15, 129, 52, 15, 129, +/* 5660 */ 57, 15, 129, 61, 16, 129, 66, 16, 129, 71, +/* 5670 */ 16, 129, 76, 16, 129, 80, 16, 129, 85, 16, +/* 5680 */ 117, 4, 129, 90, 16, 117, 4, 129, 95, 16, +/* 5690 */ 117, 4, 129, 100, 21, 129, 105, 16, 129, 110, +/* 5700 */ 11, 129, 114, 7, 129, 117, 4, 132, 193, 129, +/* 5710 */ 117, 4, 132, 115, 6, 129, 110, 11, 129, 105, +/* 5720 */ 16, 129, 101, 20, 129, 96, 25, 129, 92, 29, +/* 5730 */ 129, 87, 34, 129, 83, 38, 129, 78, 43, 129, +/* 5740 */ 74, 47, 129, 70, 42, 117, 4, 129, 65, 42, +/* 5750 */ 117, 4, 129, 60, 43, 117, 4, 129, 56, 42, +/* 5760 */ 129, 51, 42, 129, 46, 43, 129, 42, 43, 129, +/* 5770 */ 37, 44, 129, 33, 43, 129, 30, 42, 129, 33, +/* 5780 */ 34, 129, 38, 25, 129, 42, 16, 129, 47, 15, +/* 5790 */ 129, 52, 15, 129, 57, 15, 129, 61, 16, 129, +/* 5800 */ 65, 17, 129, 60, 27, 129, 56, 36, 129, 51, +/* 5810 */ 42, 129, 46, 43, 129, 42, 43, 129, 37, 44, +/* 5820 */ 129, 33, 43, 129, 30, 42, 129, 33, 34, 129, +/* 5830 */ 38, 25, 129, 42, 16, 129, 47, 15, 129, 52, +/* 5840 */ 15, 129, 57, 15, 129, 61, 16, 129, 66, 16, +/* 5850 */ 129, 71, 16, 129, 76, 16, 129, 80, 16, 129, +/* 5860 */ 85, 16, 117, 4, 129, 90, 16, 117, 4, 129, +/* 5870 */ 95, 16, 117, 4, 129, 100, 21, 129, 105, 16, +/* 5880 */ 129, 110, 11, 129, 114, 7, 129, 117, 4, 132, +/* 5890 */ 193, 129, 30, 4, 117, 4, 132, 30, 4, 115, +/* 5900 */ 6, 129, 30, 4, 112, 9, 129, 30, 6, 109, +/* 5910 */ 12, 129, 30, 9, 106, 15, 129, 30, 11, 103, +/* 5920 */ 18, 129, 30, 14, 100, 21, 129, 30, 4, 38, +/* 5930 */ 9, 98, 23, 129, 30, 4, 40, 10, 95, 26, +/* 5940 */ 129, 30, 4, 43, 9, 92, 29, 129, 46, 9, +/* 5950 */ 89, 32, 129, 49, 8, 86, 28, 117, 4, 129, +/* 5960 */ 51, 9, 83, 28, 117, 4, 129, 54, 9, 80, +/* 5970 */ 28, 117, 4, 129, 57, 8, 77, 28, 117, 4, +/* 5980 */ 129, 59, 9, 74, 28, 129, 62, 37, 129, 64, +/* 5990 */ 33, 129, 66, 28, 129, 63, 28, 129, 60, 28, +/* 6000 */ 129, 57, 28, 129, 54, 33, 129, 51, 39, 129, +/* 6010 */ 48, 29, 83, 9, 129, 30, 4, 45, 29, 86, +/* 6020 */ 9, 129, 30, 4, 42, 29, 89, 9, 129, 30, +/* 6030 */ 4, 39, 29, 92, 8, 129, 30, 4, 36, 29, +/* 6040 */ 94, 9, 129, 30, 32, 97, 9, 129, 30, 29, +/* 6050 */ 100, 8, 117, 4, 129, 30, 26, 103, 8, 117, +/* 6060 */ 4, 129, 30, 23, 105, 9, 117, 4, 129, 30, +/* 6070 */ 20, 108, 13, 129, 30, 18, 111, 10, 129, 30, +/* 6080 */ 15, 113, 8, 129, 30, 12, 116, 5, 129, 30, +/* 6090 */ 9, 117, 4, 129, 30, 6, 117, 4, 129, 30, +/* 6100 */ 4, 117, 4, 132, 193, 129, 117, 4, 132, 114, +/* 6110 */ 7, 129, 111, 10, 129, 108, 13, 129, 105, 16, +/* 6120 */ 129, 102, 19, 129, 100, 21, 129, 96, 25, 129, +/* 6130 */ 93, 28, 129, 90, 31, 129, 87, 34, 129, 84, +/* 6140 */ 30, 117, 4, 129, 30, 4, 81, 30, 117, 4, +/* 6150 */ 129, 30, 4, 78, 30, 117, 4, 129, 30, 4, +/* 6160 */ 75, 30, 117, 4, 129, 30, 4, 72, 30, 129, +/* 6170 */ 30, 69, 129, 30, 66, 129, 30, 63, 129, 30, +/* 6180 */ 60, 129, 30, 57, 129, 30, 54, 129, 30, 51, +/* 6190 */ 129, 30, 48, 129, 30, 51, 129, 30, 4, 73, +/* 6200 */ 12, 129, 30, 4, 76, 12, 129, 30, 4, 80, +/* 6210 */ 12, 129, 30, 4, 83, 12, 129, 87, 12, 129, +/* 6220 */ 90, 12, 117, 4, 129, 94, 11, 117, 4, 129, +/* 6230 */ 97, 12, 117, 4, 129, 101, 12, 117, 4, 129, +/* 6240 */ 104, 17, 129, 108, 13, 129, 111, 10, 129, 115, +/* 6250 */ 6, 129, 117, 4, 134, 193, 129, 30, 1, 103, +/* 6260 */ 18, 129, 30, 4, 103, 18, 129, 30, 7, 103, +/* 6270 */ 18, 129, 30, 9, 103, 18, 129, 30, 12, 110, +/* 6280 */ 11, 129, 30, 15, 113, 8, 129, 30, 18, 114, +/* 6290 */ 7, 129, 30, 21, 116, 5, 129, 30, 24, 116, +/* 6300 */ 5, 129, 30, 27, 117, 4, 129, 30, 30, 117, +/* 6310 */ 4, 129, 30, 33, 117, 4, 129, 30, 4, 37, +/* 6320 */ 28, 117, 4, 129, 30, 4, 40, 28, 117, 4, +/* 6330 */ 129, 30, 4, 42, 29, 117, 4, 129, 30, 4, +/* 6340 */ 45, 29, 117, 4, 129, 30, 4, 48, 29, 117, +/* 6350 */ 4, 129, 30, 4, 51, 29, 117, 4, 129, 30, +/* 6360 */ 4, 54, 29, 117, 4, 129, 30, 4, 57, 29, +/* 6370 */ 117, 4, 129, 30, 4, 59, 30, 117, 4, 129, +/* 6380 */ 30, 4, 62, 30, 117, 4, 129, 30, 4, 65, +/* 6390 */ 30, 117, 4, 129, 30, 4, 68, 30, 117, 4, +/* 6400 */ 129, 30, 4, 71, 30, 117, 4, 129, 30, 4, +/* 6410 */ 74, 30, 117, 4, 129, 30, 4, 77, 30, 117, +/* 6420 */ 4, 129, 30, 4, 80, 30, 117, 4, 129, 30, +/* 6430 */ 4, 83, 30, 117, 4, 129, 30, 4, 86, 35, +/* 6440 */ 129, 30, 4, 89, 32, 129, 30, 4, 91, 30, +/* 6450 */ 129, 30, 4, 94, 27, 129, 30, 5, 97, 24, +/* 6460 */ 129, 30, 5, 100, 21, 129, 30, 7, 103, 18, +/* 6470 */ 129, 30, 8, 106, 15, 129, 30, 11, 109, 12, +/* 6480 */ 129, 30, 18, 112, 9, 129, 30, 18, 115, 6, +/* 6490 */ 129, 30, 18, 117, 4, 129, 30, 18, 120, 1, +/* 6500 */ 129, 193, 129, 42, 8, 129, 38, 16, 129, 36, +/* 6510 */ 20, 129, 34, 24, 71, 5, 129, 33, 26, 69, +/* 6520 */ 10, 129, 32, 28, 68, 13, 129, 31, 30, 68, +/* 6530 */ 14, 129, 31, 9, 52, 9, 68, 15, 129, 30, +/* 6540 */ 8, 54, 8, 69, 14, 129, 30, 7, 55, 7, +/* 6550 */ 71, 4, 78, 6, 129, 30, 6, 56, 6, 79, +/* 6560 */ 5, 129, 30, 6, 56, 6, 80, 4, 130, 31, +/* 6570 */ 5, 56, 5, 80, 4, 129, 31, 5, 56, 5, +/* 6580 */ 79, 5, 129, 32, 5, 55, 5, 78, 6, 129, +/* 6590 */ 33, 5, 54, 5, 77, 7, 129, 34, 6, 52, +/* 6600 */ 6, 74, 9, 129, 35, 48, 129, 33, 49, 129, +/* 6610 */ 32, 49, 129, 31, 49, 129, 30, 49, 129, 30, +/* 6620 */ 47, 129, 30, 45, 129, 30, 41, 129, 30, 6, +/* 6630 */ 129, 30, 4, 129, 30, 3, 129, 30, 2, 129, +/* 6640 */ 193, 129, 30, 4, 117, 4, 130, 31, 90, 136, +/* 6650 */ 37, 5, 72, 5, 129, 35, 5, 74, 5, 129, +/* 6660 */ 33, 5, 76, 5, 129, 32, 5, 77, 5, 129, +/* 6670 */ 31, 5, 78, 5, 129, 31, 4, 79, 4, 129, +/* 6680 */ 30, 5, 79, 5, 131, 30, 6, 78, 6, 129, +/* 6690 */ 30, 7, 77, 7, 129, 31, 8, 75, 8, 129, +/* 6700 */ 31, 11, 72, 11, 129, 32, 15, 67, 15, 129, +/* 6710 */ 33, 48, 129, 34, 46, 129, 35, 44, 129, 37, +/* 6720 */ 40, 129, 39, 36, 129, 42, 30, 129, 46, 22, +/* 6730 */ 129, 193, 129, 48, 18, 129, 43, 28, 129, 41, +/* 6740 */ 32, 129, 39, 36, 129, 37, 40, 129, 35, 44, +/* 6750 */ 129, 34, 46, 129, 33, 13, 68, 13, 129, 32, +/* 6760 */ 9, 73, 9, 129, 32, 7, 75, 7, 129, 31, +/* 6770 */ 6, 77, 6, 129, 31, 5, 78, 5, 129, 30, +/* 6780 */ 5, 79, 5, 129, 30, 4, 80, 4, 133, 31, +/* 6790 */ 3, 79, 4, 129, 31, 4, 79, 4, 129, 32, +/* 6800 */ 3, 78, 4, 129, 32, 4, 76, 6, 129, 33, +/* 6810 */ 4, 74, 7, 129, 34, 4, 72, 8, 129, 35, +/* 6820 */ 5, 72, 7, 129, 37, 5, 73, 4, 129, 39, +/* 6830 */ 4, 74, 1, 129, 129, 193, 129, 46, 22, 129, +/* 6840 */ 42, 30, 129, 39, 36, 129, 37, 40, 129, 35, +/* 6850 */ 44, 129, 34, 46, 129, 33, 48, 129, 32, 15, +/* 6860 */ 67, 15, 129, 31, 11, 72, 11, 129, 31, 8, +/* 6870 */ 75, 8, 129, 30, 7, 77, 7, 129, 30, 6, +/* 6880 */ 78, 6, 129, 30, 5, 79, 5, 131, 31, 4, +/* 6890 */ 79, 4, 129, 31, 5, 78, 5, 129, 32, 5, +/* 6900 */ 77, 5, 129, 33, 5, 76, 5, 129, 35, 5, +/* 6910 */ 74, 5, 117, 4, 129, 37, 5, 72, 5, 117, +/* 6920 */ 4, 129, 30, 91, 136, 30, 4, 130, 193, 129, +/* 6930 */ 48, 18, 129, 43, 28, 129, 41, 32, 129, 39, +/* 6940 */ 36, 129, 37, 40, 129, 35, 44, 129, 34, 46, +/* 6950 */ 129, 33, 13, 55, 4, 68, 13, 129, 32, 9, +/* 6960 */ 55, 4, 73, 9, 129, 32, 7, 55, 4, 75, +/* 6970 */ 7, 129, 31, 6, 55, 4, 77, 6, 129, 31, +/* 6980 */ 5, 55, 4, 78, 5, 129, 30, 5, 55, 4, +/* 6990 */ 79, 5, 129, 30, 4, 55, 4, 80, 4, 132, +/* 7000 */ 30, 4, 55, 4, 79, 5, 129, 31, 3, 55, +/* 7010 */ 4, 78, 5, 129, 31, 4, 55, 4, 77, 6, +/* 7020 */ 129, 32, 3, 55, 4, 75, 7, 129, 32, 4, +/* 7030 */ 55, 4, 73, 9, 129, 33, 4, 55, 4, 68, +/* 7040 */ 13, 129, 34, 4, 55, 25, 129, 35, 5, 55, +/* 7050 */ 24, 129, 37, 5, 55, 22, 129, 39, 4, 55, +/* 7060 */ 20, 129, 55, 18, 129, 55, 16, 129, 55, 11, +/* 7070 */ 129, 193, 129, 80, 4, 129, 30, 4, 80, 4, +/* 7080 */ 130, 30, 78, 129, 30, 82, 129, 30, 85, 129, +/* 7090 */ 30, 87, 129, 30, 88, 129, 30, 89, 129, 30, +/* 7100 */ 90, 130, 30, 4, 80, 4, 115, 6, 129, 30, +/* 7110 */ 4, 80, 4, 117, 4, 129, 80, 4, 105, 6, +/* 7120 */ 117, 4, 129, 80, 4, 103, 10, 116, 5, 129, +/* 7130 */ 80, 4, 102, 19, 129, 80, 4, 101, 19, 129, +/* 7140 */ 101, 19, 129, 101, 18, 129, 102, 16, 129, 103, +/* 7150 */ 12, 129, 105, 6, 129, 193, 129, 12, 10, 59, +/* 7160 */ 11, 129, 9, 16, 55, 19, 129, 7, 20, 53, +/* 7170 */ 23, 129, 6, 7, 23, 5, 32, 6, 51, 27, +/* 7180 */ 129, 4, 7, 25, 16, 50, 29, 129, 3, 6, +/* 7190 */ 27, 16, 49, 31, 129, 2, 6, 28, 16, 48, +/* 7200 */ 33, 129, 1, 6, 27, 18, 47, 35, 129, 1, +/* 7210 */ 6, 27, 31, 71, 12, 129, 1, 5, 26, 15, +/* 7220 */ 44, 10, 75, 8, 129, 1, 5, 25, 14, 45, +/* 7230 */ 7, 77, 7, 129, 1, 5, 25, 13, 45, 5, +/* 7240 */ 79, 5, 129, 1, 5, 24, 14, 45, 4, 80, +/* 7250 */ 4, 129, 1, 5, 24, 13, 45, 4, 80, 4, +/* 7260 */ 129, 1, 5, 23, 14, 45, 4, 80, 4, 129, +/* 7270 */ 1, 5, 23, 13, 45, 4, 80, 4, 129, 1, +/* 7280 */ 6, 22, 13, 45, 5, 79, 5, 129, 1, 6, +/* 7290 */ 21, 14, 45, 7, 77, 7, 129, 1, 7, 21, +/* 7300 */ 13, 46, 8, 75, 8, 129, 1, 8, 20, 13, +/* 7310 */ 46, 12, 71, 12, 129, 1, 10, 18, 15, 47, +/* 7320 */ 35, 129, 2, 30, 48, 33, 129, 3, 29, 49, +/* 7330 */ 32, 129, 4, 27, 50, 31, 129, 5, 25, 51, +/* 7340 */ 27, 80, 2, 86, 4, 129, 7, 21, 53, 23, +/* 7350 */ 80, 3, 85, 6, 129, 9, 17, 55, 19, 80, +/* 7360 */ 12, 129, 12, 12, 59, 11, 81, 11, 129, 82, +/* 7370 */ 10, 129, 84, 7, 129, 86, 4, 129, 193, 129, +/* 7380 */ 30, 4, 117, 4, 130, 30, 91, 136, 30, 4, +/* 7390 */ 72, 5, 129, 30, 4, 74, 5, 129, 75, 5, +/* 7400 */ 129, 76, 5, 129, 76, 6, 129, 77, 6, 130, +/* 7410 */ 77, 7, 130, 76, 8, 129, 30, 4, 75, 9, +/* 7420 */ 129, 30, 4, 72, 12, 129, 30, 54, 129, 30, +/* 7430 */ 53, 130, 30, 52, 129, 30, 51, 129, 30, 49, +/* 7440 */ 129, 30, 46, 129, 30, 42, 129, 30, 4, 130, +/* 7450 */ 193, 129, 30, 4, 80, 4, 129, 30, 4, 80, +/* 7460 */ 4, 100, 6, 129, 30, 54, 98, 10, 129, 30, +/* 7470 */ 54, 97, 12, 129, 30, 54, 96, 14, 131, 30, +/* 7480 */ 54, 97, 12, 129, 30, 54, 98, 10, 129, 30, +/* 7490 */ 54, 100, 6, 129, 30, 4, 130, 193, 129, 7, +/* 7500 */ 6, 129, 4, 11, 129, 3, 13, 129, 2, 14, +/* 7510 */ 129, 1, 15, 130, 1, 3, 6, 9, 129, 1, +/* 7520 */ 3, 7, 6, 129, 1, 3, 130, 1, 4, 129, +/* 7530 */ 1, 5, 80, 4, 129, 1, 7, 80, 4, 100, +/* 7540 */ 6, 129, 2, 82, 98, 10, 129, 3, 81, 97, +/* 7550 */ 12, 129, 4, 80, 96, 14, 129, 5, 79, 96, +/* 7560 */ 14, 129, 7, 77, 96, 14, 129, 10, 74, 97, +/* 7570 */ 12, 129, 14, 70, 98, 10, 129, 19, 65, 100, +/* 7580 */ 6, 129, 193, 129, 30, 4, 117, 4, 130, 30, +/* 7590 */ 91, 136, 30, 4, 57, 9, 129, 30, 4, 55, +/* 7600 */ 12, 129, 52, 17, 129, 50, 20, 129, 48, 24, +/* 7610 */ 129, 46, 27, 129, 44, 21, 69, 6, 129, 41, +/* 7620 */ 22, 70, 6, 80, 4, 129, 30, 4, 39, 21, +/* 7630 */ 72, 6, 80, 4, 129, 30, 4, 36, 22, 73, +/* 7640 */ 11, 129, 30, 26, 75, 9, 129, 30, 23, 76, +/* 7650 */ 8, 129, 30, 21, 78, 6, 129, 30, 19, 79, +/* 7660 */ 5, 129, 30, 16, 80, 4, 129, 30, 14, 80, +/* 7670 */ 4, 129, 30, 12, 129, 30, 10, 129, 30, 7, +/* 7680 */ 129, 30, 5, 129, 30, 4, 130, 193, 129, 30, +/* 7690 */ 4, 117, 4, 130, 30, 91, 136, 30, 4, 130, +/* 7700 */ 193, 129, 30, 4, 80, 4, 130, 30, 54, 136, +/* 7710 */ 30, 4, 72, 5, 129, 30, 4, 74, 5, 129, +/* 7720 */ 75, 5, 129, 76, 5, 129, 30, 4, 75, 7, +/* 7730 */ 129, 30, 4, 74, 9, 129, 30, 54, 132, 30, +/* 7740 */ 53, 129, 30, 52, 129, 30, 51, 129, 30, 48, +/* 7750 */ 129, 30, 4, 72, 5, 129, 30, 4, 74, 5, +/* 7760 */ 129, 75, 5, 129, 76, 5, 129, 30, 4, 75, +/* 7770 */ 7, 129, 30, 4, 74, 9, 129, 30, 54, 132, +/* 7780 */ 30, 53, 129, 30, 52, 129, 30, 51, 129, 30, +/* 7790 */ 48, 129, 30, 4, 130, 193, 129, 30, 4, 80, +/* 7800 */ 4, 130, 30, 54, 136, 30, 4, 72, 5, 129, +/* 7810 */ 30, 4, 74, 5, 129, 75, 5, 129, 76, 5, +/* 7820 */ 129, 76, 6, 129, 77, 6, 130, 77, 7, 130, +/* 7830 */ 76, 8, 129, 30, 4, 75, 9, 129, 30, 4, +/* 7840 */ 72, 12, 129, 30, 54, 129, 30, 53, 130, 30, +/* 7850 */ 52, 129, 30, 51, 129, 30, 49, 129, 30, 46, +/* 7860 */ 129, 30, 42, 129, 30, 4, 130, 193, 129, 48, +/* 7870 */ 18, 129, 43, 28, 129, 41, 32, 129, 39, 36, +/* 7880 */ 129, 37, 40, 129, 35, 44, 129, 34, 46, 129, +/* 7890 */ 33, 13, 68, 13, 129, 32, 9, 73, 9, 129, +/* 7900 */ 32, 7, 75, 7, 129, 31, 6, 77, 6, 129, +/* 7910 */ 31, 5, 78, 5, 129, 30, 5, 79, 5, 129, +/* 7920 */ 30, 4, 80, 4, 132, 30, 5, 79, 5, 130, +/* 7930 */ 31, 5, 78, 5, 129, 31, 6, 77, 6, 129, +/* 7940 */ 32, 7, 75, 7, 129, 32, 9, 73, 9, 129, +/* 7950 */ 33, 13, 68, 13, 129, 34, 46, 129, 35, 44, +/* 7960 */ 129, 37, 40, 129, 39, 36, 129, 41, 32, 129, +/* 7970 */ 43, 28, 129, 48, 18, 129, 193, 129, 1, 3, +/* 7980 */ 80, 4, 130, 1, 83, 137, 37, 5, 72, 5, +/* 7990 */ 129, 35, 5, 74, 5, 129, 33, 5, 76, 5, +/* 8000 */ 129, 32, 5, 77, 5, 129, 31, 5, 78, 5, +/* 8010 */ 129, 31, 4, 79, 4, 129, 30, 5, 79, 5, +/* 8020 */ 131, 30, 6, 78, 6, 129, 30, 7, 77, 7, +/* 8030 */ 129, 31, 8, 75, 8, 129, 31, 11, 72, 11, +/* 8040 */ 129, 32, 15, 67, 15, 129, 33, 48, 129, 34, +/* 8050 */ 46, 129, 35, 44, 129, 37, 40, 129, 39, 36, +/* 8060 */ 129, 42, 30, 129, 46, 22, 129, 193, 129, 46, +/* 8070 */ 22, 129, 42, 30, 129, 39, 36, 129, 37, 40, +/* 8080 */ 129, 35, 44, 129, 34, 46, 129, 33, 48, 129, +/* 8090 */ 32, 15, 67, 15, 129, 31, 11, 72, 11, 129, +/* 8100 */ 31, 8, 75, 8, 129, 30, 7, 77, 7, 129, +/* 8110 */ 30, 6, 78, 6, 129, 30, 5, 79, 5, 131, +/* 8120 */ 31, 4, 79, 4, 129, 31, 5, 78, 5, 129, +/* 8130 */ 32, 5, 77, 5, 129, 33, 5, 76, 5, 129, +/* 8140 */ 35, 5, 74, 5, 129, 37, 5, 72, 5, 129, +/* 8150 */ 1, 83, 136, 1, 3, 80, 4, 130, 193, 129, +/* 8160 */ 30, 4, 80, 4, 130, 30, 54, 136, 30, 4, +/* 8170 */ 68, 6, 129, 30, 4, 70, 6, 129, 71, 7, +/* 8180 */ 129, 72, 7, 129, 73, 7, 129, 74, 7, 129, +/* 8190 */ 74, 8, 129, 75, 8, 130, 69, 15, 129, 67, +/* 8200 */ 17, 129, 66, 18, 129, 65, 19, 130, 65, 18, +/* 8210 */ 130, 66, 16, 129, 67, 13, 129, 69, 8, 129, +/* 8220 */ 193, 129, 30, 13, 64, 8, 129, 30, 13, 61, +/* 8230 */ 14, 129, 30, 13, 59, 18, 129, 30, 13, 57, +/* 8240 */ 22, 129, 33, 8, 56, 24, 129, 32, 7, 55, +/* 8250 */ 26, 129, 32, 6, 54, 28, 129, 31, 6, 53, +/* 8260 */ 16, 77, 6, 129, 31, 5, 53, 14, 79, 4, +/* 8270 */ 129, 30, 5, 52, 14, 80, 4, 129, 30, 5, +/* 8280 */ 52, 13, 80, 4, 129, 30, 4, 52, 13, 80, +/* 8290 */ 4, 129, 30, 4, 52, 12, 80, 4, 129, 30, +/* 8300 */ 4, 51, 13, 80, 4, 130, 30, 4, 50, 13, +/* 8310 */ 79, 5, 129, 30, 4, 50, 13, 78, 5, 129, +/* 8320 */ 30, 5, 49, 14, 77, 6, 129, 31, 4, 49, +/* 8330 */ 13, 76, 6, 129, 31, 5, 48, 14, 75, 7, +/* 8340 */ 129, 32, 5, 47, 14, 73, 8, 129, 32, 6, +/* 8350 */ 45, 16, 71, 13, 129, 33, 27, 71, 13, 129, +/* 8360 */ 34, 26, 71, 13, 129, 35, 24, 71, 13, 129, +/* 8370 */ 37, 20, 129, 39, 16, 129, 43, 9, 129, 193, +/* 8380 */ 129, 80, 4, 131, 41, 56, 129, 37, 60, 129, +/* 8390 */ 35, 62, 129, 33, 64, 129, 32, 65, 129, 31, +/* 8400 */ 66, 129, 30, 67, 130, 30, 11, 80, 4, 129, +/* 8410 */ 30, 9, 80, 4, 129, 30, 8, 80, 4, 129, +/* 8420 */ 31, 7, 80, 4, 129, 31, 6, 129, 32, 5, +/* 8430 */ 129, 33, 5, 129, 35, 4, 129, 38, 3, 129, +/* 8440 */ 193, 129, 80, 4, 130, 42, 42, 129, 38, 46, +/* 8450 */ 129, 35, 49, 129, 33, 51, 129, 32, 52, 129, +/* 8460 */ 31, 53, 130, 30, 54, 129, 30, 12, 129, 30, +/* 8470 */ 9, 129, 30, 8, 129, 30, 7, 130, 31, 6, +/* 8480 */ 130, 32, 6, 129, 33, 5, 129, 34, 5, 129, +/* 8490 */ 35, 5, 80, 4, 129, 37, 5, 80, 4, 129, +/* 8500 */ 30, 54, 136, 30, 4, 130, 193, 129, 80, 4, +/* 8510 */ 130, 77, 7, 129, 74, 10, 129, 70, 14, 129, +/* 8520 */ 66, 18, 129, 62, 22, 129, 59, 25, 129, 55, +/* 8530 */ 29, 129, 51, 33, 129, 47, 37, 129, 44, 32, +/* 8540 */ 80, 4, 129, 40, 32, 80, 4, 129, 36, 32, +/* 8550 */ 129, 32, 33, 129, 30, 31, 129, 33, 24, 129, +/* 8560 */ 36, 17, 129, 40, 12, 129, 44, 12, 129, 48, +/* 8570 */ 12, 129, 51, 13, 129, 55, 13, 129, 59, 13, +/* 8580 */ 80, 4, 129, 63, 13, 80, 4, 129, 67, 17, +/* 8590 */ 129, 71, 13, 129, 74, 10, 129, 78, 6, 129, +/* 8600 */ 80, 4, 131, 193, 129, 80, 4, 130, 77, 7, +/* 8610 */ 129, 74, 10, 129, 70, 14, 129, 66, 18, 129, +/* 8620 */ 62, 22, 129, 59, 25, 129, 55, 29, 129, 51, +/* 8630 */ 33, 129, 47, 37, 129, 44, 32, 80, 4, 129, +/* 8640 */ 40, 32, 80, 4, 129, 36, 32, 129, 32, 33, +/* 8650 */ 129, 30, 31, 129, 33, 24, 129, 36, 17, 129, +/* 8660 */ 40, 12, 129, 44, 12, 129, 47, 13, 129, 44, +/* 8670 */ 20, 129, 40, 28, 129, 36, 31, 129, 32, 32, +/* 8680 */ 129, 30, 30, 129, 33, 24, 129, 36, 17, 129, +/* 8690 */ 40, 12, 129, 44, 12, 129, 48, 12, 129, 51, +/* 8700 */ 13, 129, 55, 13, 129, 59, 13, 80, 4, 129, +/* 8710 */ 63, 13, 80, 4, 129, 67, 17, 129, 71, 13, +/* 8720 */ 129, 74, 10, 129, 78, 6, 129, 80, 4, 131, +/* 8730 */ 193, 129, 30, 4, 80, 4, 130, 30, 4, 79, +/* 8740 */ 5, 129, 30, 5, 77, 7, 129, 30, 6, 74, +/* 8750 */ 10, 129, 30, 8, 72, 12, 129, 30, 11, 69, +/* 8760 */ 15, 129, 30, 13, 67, 17, 129, 30, 4, 37, +/* 8770 */ 8, 64, 20, 129, 30, 4, 39, 8, 62, 22, +/* 8780 */ 129, 41, 8, 59, 25, 129, 43, 8, 57, 27, +/* 8790 */ 129, 45, 8, 55, 22, 80, 4, 129, 47, 27, +/* 8800 */ 80, 4, 129, 49, 23, 129, 47, 22, 129, 44, +/* 8810 */ 23, 129, 42, 22, 129, 30, 4, 39, 27, 129, +/* 8820 */ 30, 4, 37, 31, 129, 30, 27, 62, 8, 129, +/* 8830 */ 30, 25, 64, 8, 129, 30, 22, 66, 8, 80, +/* 8840 */ 4, 129, 30, 20, 68, 8, 80, 4, 129, 30, +/* 8850 */ 17, 70, 8, 80, 4, 129, 30, 15, 73, 11, +/* 8860 */ 129, 30, 12, 75, 9, 129, 30, 10, 77, 7, +/* 8870 */ 129, 30, 7, 79, 5, 129, 30, 5, 80, 4, +/* 8880 */ 129, 30, 4, 80, 4, 130, 193, 129, 4, 5, +/* 8890 */ 80, 4, 129, 2, 9, 80, 4, 129, 1, 11, +/* 8900 */ 77, 7, 129, 1, 12, 74, 10, 129, 1, 12, +/* 8910 */ 70, 14, 129, 1, 12, 66, 18, 129, 1, 11, +/* 8920 */ 62, 22, 129, 2, 9, 59, 25, 129, 4, 11, +/* 8930 */ 55, 29, 129, 7, 12, 51, 33, 129, 10, 12, +/* 8940 */ 47, 37, 129, 14, 12, 44, 32, 80, 4, 129, +/* 8950 */ 17, 13, 40, 32, 80, 4, 129, 21, 13, 36, +/* 8960 */ 32, 129, 25, 40, 129, 29, 32, 129, 33, 24, +/* 8970 */ 129, 36, 17, 129, 40, 12, 129, 44, 12, 129, +/* 8980 */ 48, 12, 129, 51, 13, 129, 55, 13, 129, 59, +/* 8990 */ 13, 80, 4, 129, 63, 13, 80, 4, 129, 67, +/* 9000 */ 17, 129, 71, 13, 129, 74, 10, 129, 78, 6, +/* 9010 */ 129, 80, 4, 131, 193, 129, 30, 1, 71, 13, +/* 9020 */ 129, 30, 3, 71, 13, 129, 30, 6, 71, 13, +/* 9030 */ 129, 30, 9, 75, 9, 129, 30, 11, 77, 7, +/* 9040 */ 129, 30, 14, 79, 5, 129, 30, 17, 79, 5, +/* 9050 */ 129, 30, 19, 80, 4, 129, 30, 22, 80, 4, +/* 9060 */ 129, 30, 25, 80, 4, 129, 30, 27, 80, 4, +/* 9070 */ 129, 30, 4, 36, 24, 80, 4, 129, 30, 4, +/* 9080 */ 38, 25, 80, 4, 129, 30, 4, 41, 24, 80, +/* 9090 */ 4, 129, 30, 4, 44, 24, 80, 4, 129, 30, +/* 9100 */ 4, 46, 25, 80, 4, 129, 30, 4, 49, 25, +/* 9110 */ 80, 4, 129, 30, 4, 52, 24, 80, 4, 129, +/* 9120 */ 30, 4, 54, 30, 129, 30, 4, 57, 27, 129, +/* 9130 */ 30, 4, 59, 25, 129, 30, 4, 62, 22, 129, +/* 9140 */ 30, 4, 65, 19, 129, 30, 5, 67, 17, 129, +/* 9150 */ 30, 5, 70, 14, 129, 30, 7, 73, 11, 129, +/* 9160 */ 30, 9, 76, 8, 129, 30, 13, 78, 6, 129, +/* 9170 */ 30, 13, 81, 3, 129, 30, 13, 129, 193, 2, +/* 9180 */ 9, 59, 25, 129, 4, 11, 55, 29, 129, 7, +/* 9190 */ 12, 51, 33, 129, 10, 12, 47, 37, 129, 14, +/* 9200 */ 12, 44, 32, 80, 4, 129, 17, 13, 40, 32, +/* 9210 */ 80, 4, 129, 21, 13, 36, 32, 129, 25, 40, +/* 9220 */ 129, 29, 32, 129, 33, 24, 129, 36, 17, 129, +/* 9230 */ 40, 12, 129, 44, 12, 129, 48, 12, 129, 51, +/* 9240 */ 13, 129, 55, 13, 129, 59, 13, 80, 4, 129, +/* 9250 */ 63, 13, 80, 4, 129, 67, 17, 129, 71, 13, +/* 9260 */ 129, 74, 10, 129, 78, 6, 129, 80, 4, 131, +/* 9270 */ 193 +}; + +int FBDrawString( int xpos, int ypos, int height, char *msg, + unsigned char col, /* text color */ + unsigned char backcol ) /* background 0==transp */ +{ + char line[DWIDTH]; + char message[MAXMSG]; + char print[DWIDTH]; + int i, j, linen, max, nchars, pc, term, x, y; + int gx = xpos; + int gy = ypos + height -1; + + strcpy(message,msg); + + memset(print,0,DWIDTH); + + for (i = 0; i < height; i++) + { + j = i * 132 / height; + print[j] = 1; + } + + nchars = strlen(message); + + /* check message to make sure it's legal */ + for (i = 0; i < nchars; i++) + { + if ((u_char) message[i] >= NCHARS || + asc_ptr[(u_char) message[i]] == 0) + { + return(gx-xpos); + } + } + + for (i = 0; i < nchars; i++) + { + for (j = 0; j < DWIDTH; j++) + line[j] = ' '; + pc = asc_ptr[(u_char) message[i]]; + term = 0; + max = 0; + linen = 0; + while (!term) + { + if (pc < 0 || pc > NBYTES) + { + return(gx-xpos); + } + x = data_table[pc] & 0377; + if (x >= 128) + { + if (x>192) term++; + x = x & 63; + while (x--) + { + if (print[linen++]) + { + for (j=0; j <= max; j++) + { + if (print[j]) + { + if ( line[j] == '#' ) + { + FBPaintPixel(gx,gy,col); + } + else + { + if ( backcol ) + FBPaintPixel(gx,gy,backcol); + } + gy--; + } + } + for (;backcol && (j 0 ) + { + *pos=' '; + *(pos+1)=0; + pos--; + i--; + FBFillRect( xpos, ypos, dlen, 64, BLACK ); + dlen=FBDrawString( xpos, ypos, 64, text, WHITE, BLACK); + } + } + if ( actcode == RC_RIGHT ) + { + pos++; + i++; + subidx=-1; + *(pos+1)=' '; + } + if ( actcode == RC_OK ) + { + if ( i > 0 ) + { + pos++; + i++; + break; + } + } + if ( actcode == RC_BLUE ) + { + if ( i > 0 ) + { + autot9=1; + pos++; + i++; + break; + } + } + } + *pos=0; + while( realcode != 0xee ) + RcGetActCode(); + actcode=0xee; + + if ( autot9 ) + { + for( i=0; i 0 ) + break; + } + } + FBFillRect( xoffs,yoffs, 3*52+3,4*52+4+2,BLACK); + return( text ); +} diff --git a/archive-sources/libfx2/draw.h b/archive-sources/libfx2/draw.h new file mode 100644 index 0000000..d0fdd05 --- /dev/null +++ b/archive-sources/libfx2/draw.h @@ -0,0 +1,51 @@ +#ifndef DRAW_H +#define DRAW_H + +typedef unsigned char uchar; + +extern void FBSetColor( int idx, uchar r, uchar g, uchar b ); +extern void FBSetColorEx( int idx, uchar r, uchar g, uchar b, uchar transp ); +extern void FBSetupColors( void ); +extern int FBInitialize( int xRes, int yRes, int bpp, int extfd ); +extern void FBClose( void ); +extern void FBPaintPixel( int x, int y, unsigned char col ); +extern unsigned char FBGetPixel( int x, int y ); +extern void FBDrawLine( int xa, int ya, int xb, int yb, unsigned char col ); +extern void FBDrawHLine( int x, int y, int dx, unsigned char col ); +extern void FBDrawVLine( int x, int y, int dy, unsigned char col ); +extern void FBFillRect( int x, int y, int dx, int dy, unsigned char col ); +extern void FBDrawRect( int x, int y, int dx, int dy, unsigned char col ); +extern void FBCopyImage( int x, int y, int dx, int dy, unsigned char *src ); +extern void FB2CopyImage( int x, int y, int dx, int dy, unsigned char *src, + int dbl ); +extern void FBOverlayImage(int x, int y, int dx, int dy, int relx, int rely, + unsigned char c1, + unsigned char *src, + unsigned char *under, + unsigned char *right, + unsigned char *bottom ); +extern void FBCopyImageCol( int x, int y, int dx, int dy, unsigned char col, + unsigned char *src ); +extern void FBBlink( int x, int y, int dx, int dy, int count ); +extern void FBMove( int x, int y, int x2, int y2, int dx, int dy ); +extern void FBPrintScreen( void ); +extern void FBPause( void ); +extern int FBDrawString( int xpos, int ypos, int height, char *msg, + unsigned char col, /* text color */ + unsigned char backcol );/* background 0==transp */ +extern void FBDrawFx2Logo( int x, int y ); +extern char *FBEnterWord( int xpos, int ypos, int height,int len, + unsigned char col); +extern void FBGetImage( int x1, int y1, int width, int height, + unsigned char *to ); +#ifdef USEX +extern void FBFlushGrafic( void ); +#endif + +#define BNR0 0 +#define BLACK 1 +#define WHITE 2 +#define RED 3 +#define RESERVED 254 + +#endif diff --git a/archive-sources/libfx2/fx2math.h b/archive-sources/libfx2/fx2math.h new file mode 100644 index 0000000..4ba4bd9 --- /dev/null +++ b/archive-sources/libfx2/fx2math.h @@ -0,0 +1,6 @@ +#ifndef FX2_MATH +#define FX2_MATH + +extern int _atoi( const char *str ); + +#endif diff --git a/archive-sources/libfx2/math.c b/archive-sources/libfx2/math.c new file mode 100644 index 0000000..26789d0 --- /dev/null +++ b/archive-sources/libfx2/math.c @@ -0,0 +1,40 @@ + +#define tolower(a) ((a)|32) + +int _atoi( const char *str ) +{ + int val; + int base, c; + char *sp; + char ineg=0; + + val=0; + sp=(char*)str; + if ((*sp == '0' ) && (*(sp+1) == 'x' )) + { + base=16; + sp+=2; + } + else if ( *sp == '0' ) + { + base = 8; + sp++; + } + else + { + base = 10; + if ( *sp == '-' ) + { + ineg=1; + sp++; + } + } + for (; (*sp != 0); sp++) + { + c = (*sp > '9') ? (tolower(*sp) - 'a' + 10) : (*sp - '0'); + if ((c < 0) || (c >= base)) + break; + val = (val*base)+c; + } + return ineg ? -val:val; +} diff --git a/archive-sources/libfx2/pig.c b/archive-sources/libfx2/pig.c new file mode 100644 index 0000000..1ca57aa --- /dev/null +++ b/archive-sources/libfx2/pig.c @@ -0,0 +1,238 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +//#include + +#ifdef HAVE_TRIPLEDRAGON +// ugly, but works +int fx2_use_pig = 1; +extern FBFillRect(int x, int y, int dx, int dy, unsigned char col); + +void Fx2SetPig(int x, int y, int w, int h) +{ + return; +} + +void Fx2ShowPig(int x, int y, int width, int height) +{ + char command[64]; + FBFillRect(x, y, width, height, 0); // Fill transp. + sprintf(command, "pzapit --pig %d %d %d %d 0", x, y, width, height); + system(command); +} + +void Fx2StopPig(void) +{ + system("pzapit --pig 0 0 0 0 0"); +} + +void Fx2PigPause(void) +{ + return; +} + +void Fx2PigResume(void) +{ + return; +} +#else // !TRIPLEDRAGON + +static int fd = -1; + int fx2_use_pig = 1; +static int l_x = 0; +static int l_y = 0; +static int l_width = 0; +static int l_height = 0; +#ifndef i386 + +#if defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE + #include + #define PIGDEV "/dev/dbox/pig0" + extern FBFillRect( int x, int y, int dx, int dy, unsigned char col ); +#else + //Narf ... sucks + #define _LINUX_TIME_H + #define PIGDEV "/dev/v4l/video0" + #include + static struct v4l2_format format; +#endif + +void Fx2SetPig( int x, int y, int width, int height ) +{ +#ifdef HAVE_DBOX_HARDWARE + int overlay; +#endif + + if ( fd==-1 ) + return; + +#ifdef HAVE_DBOX_HARDWARE + if (( x == format.fmt.win.w.left ) && ( y == format.fmt.win.w.top ) && + ( width == format.fmt.win.w.width ) && ( height == format.fmt.win.w.height )) + return; + + overlay = 0; + + ioctl(fd, VIDIOC_OVERLAY, &overlay); + + format.fmt.win.w.left=x; + format.fmt.win.w.top=y; + format.fmt.win.w.width=width; + format.fmt.win.w.height=height; + + ioctl(fd, VIDIOC_S_FMT, &format); + + overlay = 1; + + ioctl(fd, VIDIOC_OVERLAY, &overlay); +#else + avia_pig_hide(fd); + avia_pig_set_pos(fd,x,y); + avia_pig_set_size(fd,width,height); + FBFillRect( x, y, width, height, 0 ); // Fill transp.. for dreambox + avia_pig_show(fd); + l_x=x; + l_y=y; + l_width=width; + l_height=height; +#endif +} + +void Fx2ShowPig( int x, int y, int width, int height ) +{ +#ifdef HAVE_DBOX_HARDWARE + int overlay; +#endif + if ( fd != -1 ) + { + Fx2SetPig(x,y,width,height); +#if defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE + l_x=x; + l_y=y; + l_width=width; + l_height=height; +#endif + return; + } + + if (( fd == -1 ) && fx2_use_pig ) + fd = open( PIGDEV, O_RDONLY ); + + if ( fd == -1 ) + return; + +#ifdef HAVE_DBOX_HARDWARE + ioctl(fd, VIDIOC_G_FMT, &format); + format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; + format.fmt.win.w.left=x; + format.fmt.win.w.top=y; + format.fmt.win.w.width=width; + format.fmt.win.w.height=height; + + ioctl(fd, VIDIOC_S_FMT, &format); + +//FIXME avia_pig_set_stack(fd,2); + + overlay = 1; + + ioctl(fd, VIDIOC_OVERLAY, &overlay); +#else + FBFillRect( x, y, width, height, 0 ); // fill transp for dreambox + l_x=x; + l_y=y; + l_width=width; + l_height=height; + avia_pig_set_pos(fd,x,y); + avia_pig_set_size(fd,width,height); + avia_pig_set_stack(fd,2); + avia_pig_show(fd); +#endif +} + +void Fx2StopPig( void ) +{ +#ifdef HAVE_DBOX_HARDWARE + int overlay; +#endif + if ( fd == -1 ) + return; + +#ifdef HAVE_DBOX_HARDWARE + overlay = 0; + ioctl(fd, VIDIOC_OVERLAY, &overlay); +#else + avia_pig_hide(fd); +#endif + + close(fd); + fd=-1; +} + +void Fx2PigPause( void ) +{ +#if defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE + if ( fd != -1 ) + avia_pig_hide(fd); +#else + int overlay; + + if ( fd != -1 ) { + overlay = 0; + ioctl(fd, VIDIOC_OVERLAY, &overlay); + } +#endif +} + +void Fx2PigResume( void ) +{ +#if defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE + if ( fd != -1 ) + avia_pig_show(fd); +#else + int overlay; + + if ( fd != -1 ) { + overlay = 1; + ioctl(fd, VIDIOC_OVERLAY, &overlay); + } +#endif +} + +#else + +#include "draw.h" + +void Fx2SetPig( int x, int y, int width, int height ) +{ + return; +} + +void Fx2ShowPig( int x, int y, int width, int height ) +{ + FBFillRect( x, y, width, height, 4 ); + l_x=x; + l_y=y; + l_width=width; + l_height=height; + return; +} +void Fx2StopPig( void ) +{ + FBFillRect( l_x, l_y, l_width, l_height, 1 ); + return; +} +void Fx2PigPause( void ) +{ + return; +} +void Fx2PigResume( void ) +{ + return; +} +#endif +#endif diff --git a/archive-sources/libfx2/pig.h b/archive-sources/libfx2/pig.h new file mode 100644 index 0000000..2ba2bfa --- /dev/null +++ b/archive-sources/libfx2/pig.h @@ -0,0 +1,11 @@ +#ifndef FX_PIG_H +#define FX_PIG_H +extern void Fx2SetPig( int x, int y, int width, int height ); +extern void Fx2ShowPig( int x, int y, int width, int height ); +extern void Fx2StopPig( void ); +extern void Fx2PigPause( void ); +extern void Fx2PigResume( void ); + +extern int fx2_use_pig; // set before first pig-use !!! def:1 + +#endif diff --git a/archive-sources/libfx2/rcinput.c b/archive-sources/libfx2/rcinput.c new file mode 100644 index 0000000..e3bac48 --- /dev/null +++ b/archive-sources/libfx2/rcinput.c @@ -0,0 +1,239 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "draw.h" +#include "rcinput.h" + +// #include +#define HAVE_DREAMBOX_HARDWARE 1 +#if defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE + static int fd_is_ext = 0; + static int keyboard = 0; + static int drop = 0; +#endif + +#define Debug if (debug) printf + +static int fd = -1; +static int kbfd = -1; +unsigned short realcode=0xee; +unsigned short actcode=0xee; +int doexit=0; +int debug=0; + +static struct termios tios; + +void KbInitialize( void ) +{ + struct termios ntios; + + kbfd = 0; + + if ( tcgetattr(kbfd,&tios) == -1 ) + { + kbfd=-1; + return; + } + memset(&ntios,0,sizeof(ntios)); + tcsetattr(kbfd,TCSANOW,&ntios); + + return; +} +static unsigned short translate( unsigned short code ) +{ + int rccode=-1; + + switch(code) + { + case KEY_UP: + rccode = RC_UP; + break; + case KEY_DOWN: + rccode = RC_DOWN; + break; + case KEY_LEFT: + rccode = RC_LEFT; + break; + case KEY_RIGHT: + rccode = RC_RIGHT; + break; + case KEY_OK: + rccode = RC_OK; + break; + case KEY_RED: + rccode = RC_RED; + break; + case KEY_GREEN: + rccode = RC_GREEN; + break; + case KEY_YELLOW: + rccode = RC_YELLOW; + break; + case KEY_BLUE: + rccode = RC_BLUE; + break; + case KEY_INFO: + rccode = RC_HELP; + break; + case KEY_MENU: + rccode = RC_DBOX; + break; + case KEY_EXIT: + rccode = RC_HOME; + break; + case KEY_POWER: + rccode = RC_STANDBY; + break; + default: + if( code > 0x7F ) + { + rccode = 0; + if( code == 0x110 ) + { + rccode = RC_ON; + } + } + else + { + int rctable[] = + { + 0x00, RC_ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 'ß', '´', RC_BS, 0x09, + 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', '+', RC_RET, RC_STRG, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ö', 'ä', '^', RC_LSHIFT, '#', 'y', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '-', RC_RSHIFT, 0x00, RC_ALT, 0x20, RC_CAPSLOCK,RC_F1,RC_F2,RC_F3,RC_F4,RC_F5, + RC_F6,RC_F7,RC_F8,RC_F9,RC_F10,RC_NUM,RC_ROLLEN,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, RC_STANDBY, 0x00, 0x00, 0x00, 0x00, '<', RC_OK, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, RC_ALTGR, 0x00, RC_POS1, RC_UP, RC_PAGEUP, RC_LEFT, RC_RIGHT, RC_END, RC_DOWN,RC_PAGEDOWN,RC_INS,RC_ENTF, + 0x00, RC_MUTE, RC_MINUS, RC_PLUS, RC_STANDBY, 0x00, 0x00, RC_PAUSE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + rccode = rctable[code & 0x7F]; + } + } + + return rccode; + +} + +int RcInitialize( int extfd ) +{ + char buf[32]; + if ( extfd == -1 ) + { + fd_is_ext = 0; + fd = open("/dev/input/nevis_ir", O_RDONLY ); + if ( fd == -1 ) + return kbfd; + fcntl(fd, F_SETFL, O_NONBLOCK ); + } + else + { + fd_is_ext = 1; + fd = extfd; + fcntl(fd, F_SETFL, O_NONBLOCK ); + } +/* clear rc-buffer */ + read( fd, buf, 32 ); + return 0; +} + + +void RcGetActCode( void ) +{ + int x=0; + unsigned short code = 0; + static unsigned short cw=0; + struct input_event ev; + + if ( fd != -1 ) { + + do { + + x = read(fd, &ev, sizeof(struct input_event)); + + if ((x == sizeof(struct input_event)) && ((ev.value == 1)||(ev.value == 2))) + break; + + } while (x == sizeof(struct input_event)); + + } + + if ( x % sizeof(struct input_event) ) + { + //KbGetActCode(); + realcode=0xee; + return; + } + + Debug("%d bytes from FB received ...\n",x); + Debug("ev.code=%04x\n",ev.code); + + code=translate(ev.code); + realcode=code; + if ( code == 0xee ) + { + drop = 0; + return; + } + + Debug("code=%04x\n",code); + + if ( cw == 2 ) + { + actcode=code; + return; + } + + switch(code) + { +#if 0 + case RC_HELP: + if ( !cw ) + FBPrintScreen(); + cw=1; + break; +#endif + case RC_MUTE: + if ( !cw ) + { + cw=2; + FBPause(); + cw=0; + } + break; + case RC_HOME: + doexit=3; + break; +#if 0 + case RC_UP: + case RC_DOWN: + case RC_RIGHT: + case RC_LEFT: + case RC_OK: +#endif + default : + cw=0; + actcode=code; + break; + } + Debug("actcode=%04x\n",actcode); + + return; +} + +void RcClose( void ) +{ + if ( fd == -1 ) + return; + if ( !fd_is_ext ) + close(fd); +} diff --git a/archive-sources/libfx2/rcinput.h b/archive-sources/libfx2/rcinput.h new file mode 100644 index 0000000..bfe41a5 --- /dev/null +++ b/archive-sources/libfx2/rcinput.h @@ -0,0 +1,74 @@ +#ifndef RC_INPUT_H +#define RC_INPUT_H +#include + +// rc codes +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +#define RC_RIGHT 0x0191 +#define RC_LEFT 0x0192 +#define RC_UP 0x0193 +#define RC_DOWN 0x0194 +#define RC_PLUS 0x0195 +#define RC_MINUS 0x0196 + +#define RC_OK 0x0D +#define RC_STANDBY 0x1C +#define RC_ESC RC_HOME + +#define RC_HOME 0x01B1 +#define RC_MUTE 0x01B2 +#define RC_HELP 0x01B3 +#define RC_DBOX 0x01B4 + +#define RC_GREEN 0x01A1 +#define RC_YELLOW 0x01A2 +#define RC_RED 0x01A3 +#define RC_BLUE 0x01A4 + +#define RC_PAUSE RC_HELP +#define RC_ALTGR 0x12 +#define RC_BS 0x7F +#define RC_POS1 RC_HOME +#define RC_END 0x13 +#define RC_INS 0x10 +#define RC_ENTF 0x11 +#define RC_STRG 0x00 +#define RC_LSHIFT 0x0E +#define RC_RSHIFT 0x0E +#define RC_ALT 0x0F +#define RC_NUM RC_DBOX +#define RC_ROLLEN 0x00 +#define RC_F5 RC_DBOX +#define RC_F6 RC_HELP +#define RC_F7 RC_MUTE +#define RC_F8 0x01C8 +#define RC_F9 0x01C9 +#define RC_F10 0x01CA +#define RC_RET 0x0D +#define RC_RET1 0x01CC +#define RC_CAPSLOCK 0x01CD +#define RC_ON 0x01CE + +#define RC_F1 RC_RED +#define RC_F2 RC_GREEN +#define RC_F3 RC_YELLOW +#define RC_F4 RC_BLUE +#define RC_PAGEUP RC_PLUS +#define RC_PAGEDOWN RC_MINUS + + +extern void RcGetActCode( void ); +extern int RcInitialize( int extfd ); +extern void RcClose( void ); + +#endif // RC_INPUT_H diff --git a/archive-sources/master/board.c b/archive-sources/master/board.c new file mode 100644 index 0000000..7bcb724 --- /dev/null +++ b/archive-sources/master/board.c @@ -0,0 +1,358 @@ +/* + Neutrino-GUI - DBoxII-Project + + Copyright (C) 2002 M. Langer + Copyright (C) 2013 bazi98 + + License: GPLv2 + + 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; + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include + +#include "rcinput.h" +#include "colors.h" +#include + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 500 +#define LOGO_Y 30 + +#define BOMBS 16 + +extern int doexit; + +extern unsigned short actcode; +extern unsigned short realcode; + +static int bx=0; +static int by=0; +static int f[5]; +static int of[5]; + +static char bvis=0; + +static char cnum[] = { + RED, GREEN, YELLOW, BLUE, + MAGENTA, CYAN, DARK, WHITE }; + +static char *levnam[] = { + "(1) very easy", + "(2) easy", + "(3) normal", + "(4) strong" }; + +static int level=2; +/* 0 - no brain - 5 colors, no doubles */ +/* 1 - pound brain - 8 colors, no doubles */ +/* 2 - normal brain - 6 colors, doubles */ +/* 3 - mega brain - 8 colors, doubles */ + +static char num_colors[] = { 5, 8, 6, 8 }; +static char use_double[] = { 0, 0, 1, 1 }; +static int seq[5]; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + + return tv.tv_usec % idx; +} + +static void GenCode( void ) +{ + int i; + int j; + struct timeval tv; + + for( i=0; i<5; i++ ) + { + f[i]=-1; + of[i]=-1; + tv.tv_sec=0; + tv.tv_usec = myrand(120)*100; + select(0,0,0,0,&tv); + seq[i] = myrand( num_colors[level] ); + if ( seq[i] >= num_colors[level] ) + seq[i]=myrand(num_colors[level]); + + if ( !use_double[level] ) + { + for( j=0; j 0 ) + { + int o; + o = f[bx-1]; + f[bx-1] = f[bx]; + f[bx] = o; + FBFillRect( 67+((bx-1)*34), 112+(by*50), 27, 27, + f[bx-1] == -1 ? GRAY : cnum[f[bx-1]]); + FBFillRect( 67+(bx*34), 112+(by*50), 27, 27, + f[bx] == -1 ? GRAY : cnum[f[bx]]); + } + return; + case RC_UP : + f[bx]--; + if ( f[bx] < 0 ) + f[bx] = num_colors[ level ]-1; + break; + case RC_DOWN : + f[bx]++; + if ( f[bx] == num_colors[ level ] ) + f[bx] = 0; + break; + case RC_LEFT : + if ( bx == 0 ) + return; + if ( bvis ) + { + FBDrawRect( 65+(bx*34), 110+(by*50), 30, 30, BLACK ); + FBDrawRect( 66+(bx*34), 111+(by*50), 28, 28, BLACK ); + } + lcount=4; + bvis=0; + bx--; + return; + case RC_RIGHT : + if ( bx == 4 ) + return; + if ( bvis ) + { + FBDrawRect( 65+(bx*34), 110+(by*50), 30, 30, BLACK ); + FBDrawRect( 66+(bx*34), 111+(by*50), 28, 28, BLACK ); + } + lcount=4; + bvis=0; + bx++; + return; + case RC_OK : + memcpy(xof,f,sizeof(int)*5); + for( i=0; i < 5; i++ ) + if ( f[i] == -1 ) + return; + if ( !use_double[ level ] ) + for( i=1; i < 5; i++ ) + for( j=0; j + + License: GPLv2 + + 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; + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef MAZE_H +#define MAZE_H + +extern void MasterInitialize( void ); +extern void Play( void ); + +#endif diff --git a/archive-sources/master/colors.h b/archive-sources/master/colors.h new file mode 100644 index 0000000..2ed1213 --- /dev/null +++ b/archive-sources/master/colors.h @@ -0,0 +1,34 @@ +/* + Neutrino-GUI - DBoxII-Project + + Copyright (C) 2002 M. Langer + Copyright (C) 2013 bazi98 + + License: GPLv2 + + 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; + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ +#define BNR0 0 +#define BLACK 1 +#define WHITE 2 +#define RED 3 +#define YELLOW 4 +#define GREEN 5 +#define BLUE 7 +#define STEELBLUE 6 +#define GRAY 8 +#define DARK 9 +#define MAGENTA 10 +#define CYAN 11 +#define RESERVED 254 diff --git a/archive-sources/master/master.cfg b/archive-sources/master/master.cfg new file mode 100644 index 0000000..a92a460 --- /dev/null +++ b/archive-sources/master/master.cfg @@ -0,0 +1,6 @@ +name=Mastermind +desc=food for brain +type=1 +needfb=1 +needrc=1 +needlcd=0 diff --git a/archive-sources/master/plugin.h b/archive-sources/master/plugin.h new file mode 100644 index 0000000..3e45c08 --- /dev/null +++ b/archive-sources/master/plugin.h @@ -0,0 +1,46 @@ + +#ifndef TPLUGIN_H +#define TPLUGIN_H + +typedef struct _PluginParam +{ + const char * id; + char * val; + struct _PluginParam * next; + +} PluginParam; + +typedef int (*PluginExec)( PluginParam *par ); +/* das dlsym kann auf PluginExec gecastet werden */ + +/* NOTE : alle Plugins haben uebergangs-weise neue und alte schnittstelle */ +/* neues Symbol : plugin_exec */ +/* es muessen nur benutzte ids gesetzt werden : nicht genannt = nicht benutzt */ + +/* fixed ID definitions */ +#define P_ID_FBUFFER "fd_framebuffer" +#define P_ID_RCINPUT "fd_rcinput" +#define P_ID_LCD "fd_lcd" +#define P_ID_NOPIG "no_pig" // 1: plugin dont show internal pig +#define P_ID_VTXTPID "pid_vtxt" +#define P_ID_PROXY "proxy" // set proxy for save into highscore +#define P_ID_PROXY_USER "proxy_user" // format "user:pass" +#define P_ID_HSCORE "hscore" // highscore-server (as url) +#define P_ID_VFORMAT "video_format" // videoformat (0 = auto, 1 = 16:9, 2 = 4:3) +#define P_ID_OFF_X "off_x" // screen-top-offset x +#define P_ID_OFF_Y "off_y" // screen-top-offset y +#define P_ID_END_X "end_x" // screen-end-offset x +#define P_ID_END_Y "end_y" // screen-end-offset y +#define P_ID_RCBLK_ANF "rcblk_anf" // Key-Repeatblocker Anfang +#define P_ID_RCBLK_REP "rcblk_rep" // Key-Repeatblocker Wiederholung + +typedef enum plugin_type +{ + PLUGIN_TYPE_DISABLED = 0, + PLUGIN_TYPE_GAME = 1, + PLUGIN_TYPE_TOOL = 2, + PLUGIN_TYPE_SCRIPT = 3 +} +plugin_type_t; + +#endif diff --git a/archive-sources/master/somain.c b/archive-sources/master/somain.c new file mode 100644 index 0000000..0210082 --- /dev/null +++ b/archive-sources/master/somain.c @@ -0,0 +1,148 @@ +/* + Neutrino-GUI - DBoxII-Project + + Copyright (C) 2002 M. Langer + Copyright (C) 2013 bazi98 + + License: GPLv2 + + 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; + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "board.h" +#include "colors.h" +#include "pig.h" +#include "fx2math.h" + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 30 ); + FBSetColor( GREEN, 30, 255, 30 ); + FBSetColor( STEELBLUE, 30, 30, 180 ); + FBSetColor( BLUE, 130, 130, 255 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 30, 30, 30 ); + FBSetColor( MAGENTA, 220, 30, 220 ); + FBSetColor( CYAN, 30, 220, 220 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int fdfb = -1, fdrc = -1; + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + + while( doexit != 3 ) + { + MasterInitialize(); + +#ifdef USEX + FBFlushGrafic(); +#endif + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 200000; + select( 0, 0, 0, 0, &tv ); + + actcode=0xee; + RcGetActCode( ); + Play(); +#ifdef USEX + FBFlushGrafic(); +#endif + while( realcode != 0xee ) + RcGetActCode( ); + } + if ( doexit == 4 ) // level changed + { + doexit=0; + continue; + } + + if ( doexit != 3 ) + { + actcode=0xee; +#ifdef USEX + FBFlushGrafic(); +#endif + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + if (( actcode > 0 ) && (actcode < 5 )) + { + Play(); + doexit=1; + } + } + } + } + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + diff --git a/archive-sources/mines/board.c b/archive-sources/mines/board.c new file mode 100644 index 0000000..95c30ab --- /dev/null +++ b/archive-sources/mines/board.c @@ -0,0 +1,391 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include + +#include "draw.h" +#include "rcinput.h" +#include "colors.h" +#include "pics.h" + +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 500 +#define LOGO_Y 30 + +#define BOMBS 16 +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern double sqrt( double in ); + +extern int doexit; + +extern unsigned short actcode; + +static int numflags=0; +static int failflags=0; +static long score = 0; +static int mouse_x = 3; +static int mouse_y = 3; + +static struct timeval starttv; + +static int ww2[10] = { 0, 5, 10, 9, 10, 9, 9, 9, 9, 9 }; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + + return tv.tv_usec % idx; +} + +void DrawScore( void ) +{ + char tscore[ 64 ]; + struct timeval tv; + gettimeofday(&tv,0); + + score = tv.tv_sec - starttv.tv_sec; + + if ( score > 36000 ) + score=36000; + +// score = 37000 - score; + score = 38000 - score; // mehr Zeit für Scoreanzeige die Coolie ist zu schnell + + sprintf(tscore,"%ld",score); +// FBDrawString( 190, 210, 64, "Score", WHITE, 0 ); //Orginalanzeige in der Mitte des Minenfeldes +// FBDrawString( 190, 290, 64, tscore, WHITE, 0 ); // + FBDrawString( 500, 210, 64, "Score", WHITE, 0 ); //Anzeige neben dem Minenfeld dort wo auch die "Game Over"-Anzeige erscheint! + FBDrawString( 500, 290, 64, tscore, WHITE, 0 ); // +} + +static void DrawMouse( void ) +{ +// FBDrawVLine( mouse_x * 32 + 15, mouse_y * 32 + 4, 24, GREEN ); +// FBDrawHLine( mouse_x * 32 + 4, mouse_y * 32 + 15, 24, GREEN ); + FBFillRect( mouse_x * 32 + 4, mouse_y * 32 + 15, 24, 2, GREEN ); + FBFillRect( mouse_x * 32 + 15, mouse_y * 32 + 4, 2, 24, GREEN ); +} + +static int DrawField( int x, int y ) +{ + unsigned char *p = maze + MAZEW * y + x; + unsigned char *p2; + int vx; + int vy; + int num; + int r; + char cnum[2] = { 48, 0 }; + + switch ( *p ) + { + case 'N' : + case 'B' : + FBCopyImage( x*32, y*32, 32, 32, dflag ); + break; + case 'n' : + case 'b' : + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'p' : + p2 = p - MAZEW - 1; + for( num=0, vy=y-1; vy < y+2; vy++ ) + { + for( vx=x-1; vx < x+2; vx++, p2++ ) + { + if (( *p2 == 'b' ) || ( *p2 == 'B' )) + num++; + } + p2 += MAZEW - 3; + } + FBFillRect( x*32+1, y*32+1, 31, 31, GRAY ); + FBDrawHLine( x*32, y*32, 32, WHITE ); + FBDrawVLine( x*32, y*32, 32, WHITE ); + if ( num ) + { + r = 16 - (ww2[num] / 2); + if ( r < 0 ) + r=0; + cnum[0]=num+48; + FBDrawString( x*32+r, y*32, 32, cnum, BLACK, 0 ); + } + return num; + } + return 0; +} + +void DrawBoard( int rbomb ) +{ + int x; + int y; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++, p++ ) + { + switch ( *p ) + { + case '#' : + FBFillRect( x*32, y*32, 32, 32, STEELBLUE ); + break; + case ' ' : + FBFillRect( x*32, y*32, 32, 32, BLACK ); + break; + case 'n' : + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'b' : + if ( rbomb ) + FBOverlayImage( x*32, y*32, 32, 32, 0, 0, WHITE, dbomb, dout, dout, dout ); + else + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'B' : + if ( rbomb ) + FBOverlayImage( x*32, y*32, 32, 32, 0, 0, WHITE, dbomb, dflag, dflag, dflag ); + else + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'N' : + FBCopyImage( x*32, y*32, 32, 32, dflag ); + break; + } + } + } + FBDrawRect( 3*32-3, 3*32-3, 10*32+5, 10*32+5, WHITE ); + FBDrawRect( 3*32-4, 3*32-4, 10*32+7, 10*32+7, WHITE ); + FBDrawFx2Logo( LOGO_X, LOGO_Y ); + gettimeofday(&starttv,0); + + DrawMouse(); +} + +static void Flag( int x, int y ) +{ + unsigned char *p = maze + MAZEW * y + x; + + switch( *p ) + { + case 'p' : + break; + case 'N' : + failflags--; + case 'B' : + numflags--; + *p |= 32; + DrawField( x, y ); + DrawMouse(); + break; + case 'n' : // nothing + if ( numflags == BOMBS ) + return; + failflags++; + case 'b' : // a bomb + if ( numflags == BOMBS ) + return; + numflags++; + *p &= ~32; + DrawField( x, y ); + DrawMouse(); + + if ( !failflags && (numflags == BOMBS )) + doexit=2; + break; + } +} + +void BoardInitialize( void ) +{ + int x; + int y; + int i; + int n; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++, p++ ) + { + if ( *p == 'b' ) + *p = 'n'; + if ( *p == 'p' ) + *p = 'n'; + if ( *p == 'B' ) + *p = 'n'; + if ( *p == 'N' ) + *p = 'n'; + } + } + actcode=0xee; + score=0; + mouse_x=3; + mouse_y=3; + numflags=0; + + // put in bombs + for( i=0; i < BOMBS; i++ ) + { + x = myrand(10)+3; + n = myrand(10); + for( y = myrand(10)+3; n>0; n-- ) + y=myrand(10)+3; + if ( maze[ y*MAZEW + x ] != 'n' ) + i--; + maze[ y * MAZEW + x ] = 'b'; + } +} + +void DrawGameOver( void ) +{ + DrawBoard(1); + FBDrawString( 500, 210, 64, "Game Over", RED, 0 ); +} + +static void rekSel( int x, int y ) +{ + unsigned char *p = maze + MAZEW * y + x; + int num; + + if (( x < 3 ) || ( x > 12 ) || ( y < 3 ) || ( y > 12 )) + return; + + *p = 'p'; + num=DrawField( x, y ); + + if ( num ) + return; + +#if 0 + p -= (MAZEW+1); + if ( *p == 'n' ) + rekSel( x-1,y-1 ); + p++; + if ( *p == 'n' ) + rekSel( x,y-1 ); + p++; + if ( *p == 'n' ) + rekSel( x+1,y-1 ); + p+=(MAZEW-2); + if ( *p == 'n' ) + rekSel( x-1,y ); + p++; + p++; + if ( *p == 'n' ) + rekSel( x+1,y ); + p+=(MAZEW-2); + if ( *p == 'n' ) + rekSel( x-1,y+1 ); + p++; + if ( *p == 'n' ) + rekSel( x,y+1 ); + p++; + if ( *p == 'n' ) + rekSel( x+1,y+1 ); +#else + p -= (MAZEW); + if ( *p == 'n' ) + rekSel( x,y-1 ); + p+=(MAZEW-1); + if ( *p == 'n' ) + rekSel( x-1,y ); + p+=2; + if ( *p == 'n' ) + rekSel( x+1,y ); + p+=(MAZEW-1); + if ( *p == 'n' ) + rekSel( x,y+1 ); +#endif +} + +static void SelectField( int x, int y ) +{ + unsigned char *p = maze + MAZEW * y + x; + + switch( *p ) + { + case 'p' : // is pressed + break; + case 'b' : // a bomb + doexit=1; + break; + case 'n' : // nothing + rekSel( x, y ); + DrawMouse(); + break; + } +} + +void MoveMouse( void ) +{ +static int locked = 0; + + if ( locked ) + { + locked--; + actcode=0xee; + return; + } + switch( actcode ) + { + case RC_RIGHT : + if ( mouse_x < 12 ) + { + DrawField( mouse_x, mouse_y ); + mouse_x++; + DrawMouse(); + locked=1; + } + break; + case RC_LEFT : + if ( mouse_x > 3 ) + { + DrawField( mouse_x, mouse_y ); + mouse_x--; + DrawMouse(); + locked=1; + } + break; + case RC_DOWN : + if ( mouse_y < 12 ) + { + DrawField( mouse_x, mouse_y ); + mouse_y++; + DrawMouse(); + locked=1; + } + break; + case RC_UP : + if ( mouse_y > 3 ) + { + DrawField( mouse_x, mouse_y ); + mouse_y--; + DrawMouse(); + locked=1; + } + break; + case RC_OK : + SelectField( mouse_x, mouse_y ); + locked=1; + break; + case RC_BLUE : + Flag( mouse_x, mouse_y ); + locked=1; + break; + } +} diff --git a/archive-sources/mines/board.h b/archive-sources/mines/board.h new file mode 100644 index 0000000..eca6bae --- /dev/null +++ b/archive-sources/mines/board.h @@ -0,0 +1,10 @@ +#ifndef MAZE_H +#define MAZE_H + +extern void DrawBoard( int rbomb ); +extern void BoardInitialize( void ); +extern void DrawGameOver( void ); +extern void MoveMouse( void ); +extern void DrawScore( void ); + +#endif diff --git a/archive-sources/mines/colors.h b/archive-sources/mines/colors.h new file mode 100644 index 0000000..bb6f90f --- /dev/null +++ b/archive-sources/mines/colors.h @@ -0,0 +1,11 @@ +#define BNR0 0 +#define BLACK 1 +#define WHITE 2 +#define RED 3 +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define DARK 9 +#define RESERVED 254 diff --git a/archive-sources/mines/mines.cfg b/archive-sources/mines/mines.cfg new file mode 100644 index 0000000..38099aa --- /dev/null +++ b/archive-sources/mines/mines.cfg @@ -0,0 +1,9 @@ +name=Minesweeper +desc=classic minesweeper +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 +pigsize=160x144 +pigpos=440,300 diff --git a/archive-sources/mines/pics.h b/archive-sources/mines/pics.h new file mode 100644 index 0000000..b769a6b --- /dev/null +++ b/archive-sources/mines/pics.h @@ -0,0 +1,152 @@ +#ifndef PICS_H +#define PICS_H + +#define MAZEW 22 +#define MAZEH 18 + +static unsigned char maze[] =\ +" "\ +" "\ +" ############ "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" #nnnnnnnnnn# "\ +" ############ "\ +" "\ +" "\ +" "\ +" "; + +#define g WHITE +#define _ GRAY +#define B BLACK + +static unsigned char dout[] = { +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B, +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B, +g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B }; + +#define R RED + +static unsigned char dflag[] = { +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B, +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,R,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,R,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,R,R,R,R,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,R,R,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,R,R,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B, +g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B }; + +#undef _ +#undef g +#undef B +#undef R + +#define _ BLACK +#define B DARK +#define W WHITE +#define R RED +#define Y YELLOW + +static unsigned char dbomb[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,B,B,B,B,B,B,B,_,_,_,B,B,B,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,B,B,B,W,B,B,B,B,B,_,B,B,B,B,B,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,B,B,B,W,W,B,B,B,B,B,B,B,_,_,_,B,B,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,B,B,_,_,_,_,_,_,_, +_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,B,B,_,_,_,_,_,_,_, +_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,B,B,R,Y,Y,_,_,_, +_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,R,R,Y,_,_,_,_, +_,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +#undef _ +#undef B +#undef W +#undef R +#undef Y + +#endif diff --git a/archive-sources/mines/plugin.h b/archive-sources/mines/plugin.h new file mode 100644 index 0000000..3e45c08 --- /dev/null +++ b/archive-sources/mines/plugin.h @@ -0,0 +1,46 @@ + +#ifndef TPLUGIN_H +#define TPLUGIN_H + +typedef struct _PluginParam +{ + const char * id; + char * val; + struct _PluginParam * next; + +} PluginParam; + +typedef int (*PluginExec)( PluginParam *par ); +/* das dlsym kann auf PluginExec gecastet werden */ + +/* NOTE : alle Plugins haben uebergangs-weise neue und alte schnittstelle */ +/* neues Symbol : plugin_exec */ +/* es muessen nur benutzte ids gesetzt werden : nicht genannt = nicht benutzt */ + +/* fixed ID definitions */ +#define P_ID_FBUFFER "fd_framebuffer" +#define P_ID_RCINPUT "fd_rcinput" +#define P_ID_LCD "fd_lcd" +#define P_ID_NOPIG "no_pig" // 1: plugin dont show internal pig +#define P_ID_VTXTPID "pid_vtxt" +#define P_ID_PROXY "proxy" // set proxy for save into highscore +#define P_ID_PROXY_USER "proxy_user" // format "user:pass" +#define P_ID_HSCORE "hscore" // highscore-server (as url) +#define P_ID_VFORMAT "video_format" // videoformat (0 = auto, 1 = 16:9, 2 = 4:3) +#define P_ID_OFF_X "off_x" // screen-top-offset x +#define P_ID_OFF_Y "off_y" // screen-top-offset y +#define P_ID_END_X "end_x" // screen-end-offset x +#define P_ID_END_Y "end_y" // screen-end-offset y +#define P_ID_RCBLK_ANF "rcblk_anf" // Key-Repeatblocker Anfang +#define P_ID_RCBLK_REP "rcblk_rep" // Key-Repeatblocker Wiederholung + +typedef enum plugin_type +{ + PLUGIN_TYPE_DISABLED = 0, + PLUGIN_TYPE_GAME = 1, + PLUGIN_TYPE_TOOL = 2, + PLUGIN_TYPE_SCRIPT = 3 +} +plugin_type_t; + +#endif diff --git a/archive-sources/mines/somain.c b/archive-sources/mines/somain.c new file mode 100644 index 0000000..05dac1c --- /dev/null +++ b/archive-sources/mines/somain.c @@ -0,0 +1,117 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "board.h" +#include "colors.h" +#include "pig.h" +#include "fx2math.h" +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 30 ); + FBSetColor( GREEN, 30, 255, 30 ); + FBSetColor( STEELBLUE, 30, 30, 180 ); + FBSetColor( BLUE, 130, 130, 255 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 30, 30, 30 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int fdfb = -1, fdrc = -1; + + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + + while( doexit != 3 ) + { + BoardInitialize(); + DrawBoard( 0 ); + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 10000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + + RcGetActCode( ); + MoveMouse(); +#ifdef USEX + FBFlushGrafic(); +#endif + } + + if ( doexit != 3 ) + { + actcode=0xee; + if ( doexit ==2 ) + DrawScore(); + else + DrawGameOver(); +#ifdef USEX + FBFlushGrafic(); +#endif + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + } + } + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + diff --git a/archive-sources/pac/colors.h b/archive-sources/pac/colors.h new file mode 100644 index 0000000..2ef9096 --- /dev/null +++ b/archive-sources/pac/colors.h @@ -0,0 +1,7 @@ + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define DARK 9 diff --git a/archive-sources/pac/level.h b/archive-sources/pac/level.h new file mode 100644 index 0000000..8f4e2fe --- /dev/null +++ b/archive-sources/pac/level.h @@ -0,0 +1,201 @@ + +static unsigned char maze0[] =\ +" "\ +" "\ +"######################"\ +"#....................#"\ +"#.###.###.#.########.#"\ +"#.#.#.#...#.#........#"\ +"#.#.#.#.###.#.######.#"\ +"#.....#.....#........#"\ +"#######.############.#"\ +"#....................#"\ +"#.#####.###.##########"\ +"#.#...#...#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.......#.##########"\ +"#.###.#####.##########"\ +"#...........##########"\ +"######################"; + +static unsigned char maze1[] =\ +" "\ +" "\ +"######################"\ +"#.........#.##########"\ +"#.#######.#.##########"\ +"#.#.....#.#.##########"\ +"#.#.###.#.#.##########"\ +"#.#.#...#.#.##########"\ +"#.#.#####.#.##########"\ +"#.#.........##########"\ +"#.#########..........#"\ +"#.#.......######.###.#"\ +"#.#.#####..........#.#"\ +"#.#.....##########.#.#"\ +"#.#####............#.#"\ +"#.#########.########.#"\ +"#....................#"\ +"######################"; + +static unsigned char maze2[] =\ +" "\ +" "\ +"######################"\ +"#....................#"\ +"#.#.#.########.#####.#"\ +"#.#.#.#......#.#.....#"\ +"#.###.#.######.#.###.#"\ +"#.....#..........###.#"\ +"##############.#####.#"\ +"#....................#"\ +"#.######.##.##########"\ +"#.######.#..##########"\ +"#......#.#.###########"\ +"######.#.#.###########"\ +"#......#.#..##########"\ +"#.######.##.##########"\ +"#...........##########"\ +"######################"; + +static unsigned char maze3[] =\ +" "\ +" "\ +"######################"\ +"#...............#....#"\ +"###############.#.##.#"\ +"#....................#"\ +"#.#############.#.####"\ +"#...#.....#..........#"\ +"###.#.###.#.###.#.##.#"\ +"#...............#....#"\ +"#.#.#.###.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#...#.##########"\ +"#.#.#.#####.##########"\ +"#...#.......##########"\ +"######################"; + +static unsigned char maze4[] =\ +" "\ +" "\ +"######################"\ +"#....................#"\ +"#.#.#.#.#.#.#.#.#.##.#"\ +"#....................#"\ +"#.#.#.#.#.#.#.#.#.##.#"\ +"#....................#"\ +"#.#.#.#.#.#.#.#.#.##.#"\ +"#....................#"\ +"#.#.#.#.#.#.##########"\ +"#...........##########"\ +"#.#.#.#.#.#.##########"\ +"#...........##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#...........##########"\ +"######################"; + +static unsigned char maze5[] =\ +" "\ +" "\ +"######################"\ +"#.####.#.#.#.#.####..#"\ +"#......#.....#.......#"\ +"#.######.#.#.#######.#"\ +"#........#.#.........#"\ +"##########.###########"\ +"##...####...#.####...#"\ +"#..#...............#.#"\ +"######.###############"\ +"#...#...#...##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#.#.#.#.#.#.##########"\ +"#...........##########"\ +"######################"; + +static unsigned char maze6[] =\ +" "\ +" "\ +"######################"\ +"#...#.#...#.#.#.#.#..#"\ +"#.#.#.#.#.#.#.#.#.##.#"\ +"#.#.#.#.###.#.#.####.#"\ +"#....................#"\ +"#.#.#.#.#########.##.#"\ +"#.#.#.#.##.#...#...#.#"\ +"#...#.#.#....#...#...#"\ +"#####.#.#.############"\ +"#.#...#.#.#.##########"\ +"#.#...#.#.#.##########"\ +"#.#...#.#.#.##########"\ +"#.#...#.#...##########"\ +"#.#########.##########"\ +"#...........##########"\ +"######################"; + + +static unsigned char maze7[] =\ +" "\ +" "\ +"######################"\ +"#....................#"\ +"#....................#"\ +"#....................#"\ +"#....................#"\ +"#....................#"\ +"#....................#"\ +"#....................#"\ +"#...........##########"\ +"#...........##########"\ +"#...........##########"\ +"#...........##########"\ +"#...........##########"\ +"#...........##########"\ +"#...........##########"\ +"######################"; + +static unsigned char maze8[] =\ +" "\ +" "\ +"######################"\ +"#.#.#................#"\ +"#.#.#.#.###.########.#"\ +"#.#.#.#.#.#..........#"\ +"#.#.#.#.#.#.########.#"\ +"#.#.#.###.#..........#"\ +"#.#.......#.########.#"\ +"#.#########..........#"\ +"#...........##########"\ +"#.#########.##########"\ +"#.#.....#...##########"\ +"#.#.###.#.#.##########"\ +"#.#.#.#...#.##########"\ +"#.#.#.#####.##########"\ +"#...........##########"\ +"######################"; + +static unsigned char maze9[] =\ +" "\ +" "\ +"######################"\ +"#.....#.#.#..........#"\ +"#####.#.#.#.#.#.#.#.##"\ +"#.....#.#.#.#.#.#.#..#"\ +"#.#####.....#.#.#.##.#"\ +"#.#...#######.###.#..#"\ +"#...#.........#...####"\ +"######.######.#.#....#"\ +"#...........##########"\ +"#.########..##########"\ +"#.#.........##########"\ +"#.####################"\ +"#.#.........##########"\ +"#.#########.##########"\ +"#...........##########"\ +"######################"; diff --git a/archive-sources/pac/maze.c b/archive-sources/pac/maze.c new file mode 100644 index 0000000..5d4c1a0 --- /dev/null +++ b/archive-sources/pac/maze.c @@ -0,0 +1,669 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include + +#include "colors.h" +#include "draw.h" +#include "level.h" +#include "pics.h" +#include "pig.h" +#include "rcinput.h" + +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 600 +#define LOGO_Y 30 +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +/* time per food */ +#define TPF 99 + +extern double sqrt( double in ); + +extern int doexit; + +int gametime=0; +extern unsigned short actcode; +int pices = 0; +int level = 0; +int score = 0; +static int timeleft=0; + +static int piccs[] = { 133, 126, 125, 133, 167, 123, 125, 217, 144, 126 }; + +typedef struct _Ghost +{ + int x; + int y; + int x_minor; + int y_minor; + unsigned char c1; + unsigned char look; + +} Ghost; + +typedef struct _Pac +{ + int x; + int y; + int x_minor; + int y_minor; + int look; + int step; + int c_step; + +} Pac; + +static Ghost ghost[4]; +static Ghost ighost0[4] = { +{ 16, 3, 0, 0, BLUE, 0 }, +{ 3, 3, 0, 0, GRAY, 0 }, +{ 11, 11, 0, 0, RED, 1 }, +{ 3, 12, 0, 0, DARK, 1 } }; + +static Ghost ighost1[4] = { +{ 1, 3, 0, 0, RED, 0 }, +{ 11, 3, 0, 0, RED, 0 }, +{ 16, 14, 0, 0, GREEN, 1 }, +{ 5, 7, 0, 0, GREEN, 1 } }; + +static Ghost ighost2[4] = { +{ 5, 3, 0, 0, RED, 1 }, +{ 16, 3, 0, 0, BLUE, 0 }, +{ 11, 14, 0, 0, BLUE, 1 }, +{ 8, 7, 0, 0, RED, 1 } }; + +static Ghost ighost3[4] = { +{ 1, 16, 0, 0, RED, 1 }, +{ 2, 16, 0, 0, BLUE, 1 }, +{ 8, 16, 0, 0, BLUE, 1 }, +{ 9, 16, 0, 0, RED, 1 } }; + +static Ghost ighost4[4] = { +{ 1, 3, 0, 0, RED, 1 }, +{ 20, 3, 0, 0, DARK, 1 }, +{ 1, 16, 0, 0, BLUE, 1 }, +{ 11, 16, 0, 0, GRAY, 1 } }; + +static Ghost ighost5[4] = { +{ 10, 9, 0, 0, RED, 1 }, +{ 1, 3, 0, 0, GREEN, 1 }, +{ 7, 13, 0, 0, BLUE, 1 }, +{ 20, 3, 0, 0, GRAY, 1 } }; + +static Ghost ighost6[4] = { +{ 1, 13, 0, 0, RED, 1 }, +{ 9, 4, 0, 0, DARK, 1 }, +{ 11, 9, 0, 0, GREEN, 1 }, +{ 20, 4, 0, 0, GREEN, 1 } }; + +static Ghost ighost7[4] = { +{ 5, 15, 0, 0, BLUE, 1 }, +{ 5, 7, 0, 0, DARK, 1 }, +{ 12, 3, 0, 0, RED, 1 }, +{ 17, 9, 0, 0, GRAY, 1 } }; + +static Ghost ighost8[4] = { +{ 16, 9, 0, 0, GREEN, 1 }, +{ 20, 5, 0, 0, RED, 1 }, +{ 1, 16, 0, 0, GRAY, 1 }, +{ 6, 3, 0, 0, BLUE, 1 } }; + +static Ghost ighost9[4] = { +{ 7, 8, 0, 0, GRAY, 1 }, +{ 15, 9, 0, 0, BLUE, 1 }, +{ 20, 5, 0, 0, DARK, 1 }, +{ 3, 14, 0, 0, RED, 1 } }; + +static unsigned char pig_x[] = { 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 }; +static unsigned char pig_y[] = { 11, 3, 11, 11, 11, 11, 11, 11, 11, 11 }; + +static Ghost *ighosts[] = { ighost0, ighost1, ighost2, ighost3, ighost4, ighost5, ighost6, ighost7, ighost8, ighost9 }; + +static Pac pac; +static Pac ipac[] = { +{ 10, 9, 0, 0, 0, 0, 0 }, +{ 7, 9, 0, 0, 1, 0, 0 }, +{ 1, 3, 0, 0, 3, 0, 0 }, +{ 1, 3, 0, 0, 0, 0, 0 }, +{ 2, 5, 0, 0, 2, 0, 0 }, +{ 9, 8, 0, 0, 1, 0, 0 }, +{ 1, 16, 0, 0, 1, 0, 0 }, +{ 10, 9, 0, 0, 2, 0, 0 }, +{ 1, 3, 0, 0, 3, 0, 0 }, +{ 1, 3, 0, 0, 0, 0, 0 }, + }; + +static unsigned char maze[ 22 * 20 ]; + +static unsigned char *mazes[] = { maze0, maze1, maze2, maze3, maze4, maze5, maze6, maze7, maze8, maze9 }; + +unsigned char *pacs[] = { + pac_0_1, pac_0_2, pac_0_3, pac_0_4, pac_0_5, + pac_1_1, pac_1_2, pac_1_3, pac_1_4, pac_1_5 +}; + +void DrawMaze( void ) +{ + int x; + int y; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++ ) + { + switch ( *p ) + { + case '#' : + FBFillRect( x*32, y*32, 32, 32, STEELBLUE ); + break; + case '.' : + FBCopyImage( x*32, y*32, 32, 32, futter ); + break; + case 'z' : + FBFillRect( x*32, y*32, 32, 32, 0 ); + break; + default : + FBFillRect( x*32, y*32, 32, 32, BLACK ); + break; + } + p++; + } + } + FBDrawFx2Logo( LOGO_X, LOGO_Y ); +} + +void MazeInitialize( void ) +{ + memcpy(maze,mazes[ level ],MAZEW*MAZEH); + + pac = ipac[ level ]; + gametime=0; + actcode=0xee; + maze[ pac.y * MAZEW + pac.x ] = ' '; + pices = piccs[ level ]-1; + timeleft=TPF*pices; + memcpy(ghost,ighosts[ level ],sizeof(Ghost)*4); +} + +void DrawPac( void ) +{ + int istep = pac.step % 10; + int lstep; + int rstep; + int opac_step = pac.step; + + pac.step = pac.look * 10 + istep; + if ( pac.step > 19 ) + pac.step = opac_step; + lstep = pac.step - istep; + rstep = lstep + 10; + FBCopyImage( pac.x*32+pac.x_minor, pac.y*32+pac.y_minor, 32, 32, pacs[ pac.step/2 ] ); + + if ( pac.c_step ) + { + pac.step--; + if ( pac.step < lstep ) + { + pac.step = lstep + 1; + pac.c_step = 0; + } + } + else + { + pac.step++; + if ( pac.step == rstep ) + { + pac.step = rstep - 2; + pac.c_step = 1; + } + } +} + +void DrawGhosts( void ) +{ + int i; + + for( i=0; i < 4; i++ ) + { + FBOverlayImage( ghost[i].x*32+ghost[i].x_minor, + ghost[i].y*32+ghost[i].y_minor, + 32, 32, ghost[i].x_minor, ghost[i].y_minor, + ghost[i].c1, + ghost_0_0, + maze[ghost[i].y * MAZEW + ghost[i].x] == '.' ? futter : 0, + ghost[i].x_minor && + (maze[ghost[i].y * MAZEW + ghost[i].x +1 ] == '.') ? + futter : 0, + ghost[i].y_minor && + (maze[(ghost[i].y+1)*MAZEW + ghost[i].x ] == '.' ) ? + futter : 0 ); + } +} + +static void DelOnePices( void ) +{ + pices--; + if ( pices < 0 ) + pices=0; + FBPaintPixel( STATUS_X+pices, STATUS_Y, BLACK ); + FBPaintPixel( STATUS_X+pices, STATUS_Y+1, BLACK ); + FBPaintPixel( STATUS_X+pices, STATUS_Y+2, BLACK ); + FBPaintPixel( STATUS_X+pices, STATUS_Y+3, BLACK ); + if ( !pices ) + { + gametime=timeleft; + score+=gametime; + } +} + +static int collghost(int x, int y, int x_minor, int y_minor ) +{ + int i; + int mx; + int my; + +#define ABS(a) ((a)<0?-(a):(a)) + for( i=0; i<4; i++ ) + { + mx=(ghost[i].x-x)*32+ghost[i].x_minor - x_minor; + my=(ghost[i].y-y)*32+ghost[i].y_minor - y_minor; + mx=ABS(mx); + my=ABS(my); + if (( mx == 0 ) && ( my < 30 )) + return 1; + if (( my == 0 ) && ( mx < 26 )) + return 1; + } + return 0; +} +void MovePac( void ) +{ +static int cd = 40; + if ( !pices ) + { + cd--; + if ( !cd ) + { + doexit=2; + return; + } + } + else + cd=40; + timeleft--; + if ( !(timeleft%TPF) ) + { + FBPaintPixel( STATUS_X+(timeleft/TPF), STATUS_Y+6, BLACK ); + FBPaintPixel( STATUS_X+(timeleft/TPF), STATUS_Y+7, BLACK ); + FBPaintPixel( STATUS_X+(timeleft/TPF), STATUS_Y+8, BLACK ); + FBPaintPixel( STATUS_X+(timeleft/TPF), STATUS_Y+9, BLACK ); + } + if ( !timeleft ) + { + doexit=1; + return; + } + if (( pac.x_minor == 0 ) && ( pac.y_minor == 0 )) + { + switch( actcode ) + { + case RC_UP : + if ( maze[ (pac.y-1) * MAZEW + pac.x ] != '#' ) + pac.look=2; + break; + case RC_DOWN : + if ( maze[ (pac.y+1) * MAZEW + pac.x ] != '#' ) + pac.look=3; + break; + case RC_RIGHT : + if ( maze[ pac.y * MAZEW + pac.x + 1 ] != '#' ) + pac.look=0; + break; + case RC_LEFT : + if ( maze[ pac.y * MAZEW + pac.x - 1 ] != '#' ) + pac.look=1; + break; + } + } + switch( pac.look ) + { + case 0 : /* right */ + if ( pac.x_minor == 30 ) + { + pac.x_minor = 0; + pac.x++; + } + else + { + if ( pac.x_minor == 0 ) /* next field */ + { + if ( maze[ pac.y * MAZEW + pac.x + 1 ] != '#' ) + { + pac.x_minor+=2; + } + } + else + { + if ( pac.x_minor == 16 ) + { + if ( maze[ pac.y * MAZEW + pac.x + 1 ] == '.' ) + { + DelOnePices(); + } + maze[ pac.y * MAZEW + pac.x + 1 ] = ' '; + } + pac.x_minor+=2; + } + } + break; + case 1 : /* left */ + if ( pac.x_minor > 0 ) + { + pac.x_minor-=2; + if ( pac.x_minor == 16 ) + { + if ( maze[ pac.y * MAZEW + pac.x ] == '.' ) + { + DelOnePices(); + } + maze[ pac.y * MAZEW + pac.x ] = ' '; + } + } + else + { + if ( maze[ pac.y * MAZEW + pac.x - 1 ] != '#' ) + { + pac.x_minor=30; + pac.x--; + } + } + break; + case 2 : /* up */ + if ( pac.y_minor > 0 ) + { + pac.y_minor-=2; + if ( pac.y_minor == 16 ) + { + if ( maze[ pac.y * MAZEW + pac.x ] == '.' ) + { + DelOnePices(); + } + maze[ pac.y * MAZEW + pac.x ] = ' '; + } + } + else + { + if ( maze[ (pac.y-1) * MAZEW + pac.x ] != '#' ) + { + pac.y_minor=30; + pac.y--; + } + } + break; + case 3 : /* down */ + if ( pac.y_minor == 30 ) + { + pac.y_minor = 0; + pac.y++; + } + else + { + if ( pac.y_minor == 0 ) /* next field */ + { + if ( maze[ (pac.y+1) * MAZEW + pac.x ] != '#' ) + { + pac.y_minor+=2; + } + } + else + { + if ( pac.y_minor == 16 ) + { + if ( maze[ (pac.y+1) * MAZEW + pac.x ] == '.' ) + { + DelOnePices(); + } + maze[ (pac.y+1) * MAZEW + pac.x ] = ' '; + } + pac.y_minor+=2; + } + } + break; + } +} + +static void RunGhostRandom( int nr ) +{ + struct timeval tv; + + gettimeofday(&tv,0); + + ghost[nr].look = tv.tv_usec % 4; +} + +static void RunGhostLikeFB( int nr ) +{ + if ( ghost[nr].x_minor || ghost[nr].y_minor ) + return; + switch( actcode ) + { + case RC_UP : + if ( maze[ (ghost[nr].y-1) * MAZEW + ghost[nr].x ] != '#' ) + ghost[nr].look=2; + break; + case RC_DOWN : + if ( maze[ (ghost[nr].y+1) * MAZEW + ghost[nr].x ] != '#' ) + ghost[nr].look=3; + break; + case RC_RIGHT : + if ( maze[ ghost[nr].y * MAZEW + ghost[nr].x + 1 ] != '#' ) + ghost[nr].look=0; + break; + case RC_LEFT : + if ( maze[ ghost[nr].y * MAZEW + ghost[nr].x - 1 ] != '#' ) + ghost[nr].look=1; + break; + } +} + +static void RunGhostLikePac( int nr ) +{ + if ( ghost[nr].x_minor || ghost[nr].y_minor ) + return; + switch( pac.look ) + { + case 2 : + if ( maze[ (ghost[nr].y-1) * MAZEW + ghost[nr].x ] != '#' ) + ghost[nr].look=2; + break; + case 3 : + if ( maze[ (ghost[nr].y+1) * MAZEW + ghost[nr].x ] != '#' ) + ghost[nr].look=3; + break; + case 0 : + if ( maze[ ghost[nr].y * MAZEW + ghost[nr].x + 1 ] != '#' ) + ghost[nr].look=0; + break; + case 1 : + if ( maze[ ghost[nr].y * MAZEW + ghost[nr].x - 1 ] != '#' ) + ghost[nr].look=1; + break; + } +} + +static int isghost(int y, int x ) +{ + int i; + + for( i=0; i<4; i++ ) + { + if (( ghost[i].y == y ) && ( ghost[i].x == x )) + return 1; + } + return 0; +} + +static int MoveAGhost( int nr ) +{ + switch( ghost[nr].look ) + { + case 0 : /* right */ + if ( ghost[nr].x_minor == 30 ) + { + ghost[nr].x_minor = 0; + ghost[nr].x++; + } + else + { + if ( ghost[nr].x_minor == 0 ) /* next field */ + { + if (( maze[ ghost[nr].y * MAZEW + ghost[nr].x + 1 ] != '#' ) && + !isghost(ghost[nr].y,ghost[nr].x + 1) ) + { + ghost[nr].x_minor+=2; + } + else + return 1; + } + else + { + ghost[nr].x_minor+=2; + } + } + break; + case 1 : /* left */ + if ( ghost[nr].x_minor > 0 ) + { + ghost[nr].x_minor-=2; + } + else + { + if (( maze[ ghost[nr].y * MAZEW + ghost[nr].x - 1 ] != '#' ) && + !isghost(ghost[nr].y,ghost[nr].x - 1) ) + { + ghost[nr].x_minor=30; + ghost[nr].x--; + } + else + return 1; + } + break; + case 2 : /* up */ + if ( ghost[nr].y_minor > 0 ) + { + ghost[nr].y_minor-=2; + } + else + { + if (( maze[ (ghost[nr].y-1) * MAZEW + ghost[nr].x ] != '#' ) && + !isghost(ghost[nr].y-1,ghost[nr].x) ) + { + ghost[nr].y_minor=30; + ghost[nr].y--; + } + else + return 1; + } + break; + case 3 : /* down */ + if ( ghost[nr].y_minor == 30 ) + { + ghost[nr].y_minor = 0; + ghost[nr].y++; + } + else + { + if ( ghost[nr].y_minor == 0 ) /* next field */ + { + if (( maze[ (ghost[nr].y+1) * MAZEW + ghost[nr].x ] != '#' ) && + !isghost(ghost[nr].y+1,ghost[nr].x) ) + { + ghost[nr].y_minor+=2; + } + else + return 1; + } + else + { + ghost[nr].y_minor+=2; + } + } + break; + } + return 0; +} + +void MoveGhosts( void ) +{ + MoveAGhost(0); + RunGhostLikePac( 0 ); + if ( MoveAGhost(1) ) + RunGhostRandom( 1 ); + if ( MoveAGhost(2) ) + RunGhostLikeFB( 2 ); + MoveAGhost(3); + RunGhostLikePac( 3 ); +} + +void CheckGhosts( void ) +{ + if ( collghost( pac.x, pac.y, pac.x_minor, pac.y_minor ) ) + doexit=1; +} + +void DrawFill( void ) +{ + FBFillRect( STATUS_X, STATUS_Y, pices, 4, GREEN ); + FBFillRect( STATUS_X, STATUS_Y+6, (timeleft/TPF), 4, RED ); +} + +void DrawGameOver( void ) +{ + FBDrawString( 250, 200, 64, "Game Over", RED, 0 ); +} + +void DrawScore( void ) +{ + char cscore[64]; + int x; + + sprintf(cscore,"%d",score); + x=FBDrawString(250,264,64,"Score",WHITE,0); + FBDrawString(250+x+18,264,64,cscore,WHITE,0); +} + +void InitLevel( int l ) +{ + level= (l == -1) ? 0 : l; + score=0; +} + +void NextLevel( void ) +{ + level++; + if ( level > 9 ) + level=0; +} + +void MazePig( void ) +{ +#ifdef USEX + Fx2ShowPig( (int)pig_x[ level ]*32, (int)pig_y[level]*32, 256, 208 ); +#endif +} diff --git a/archive-sources/pac/maze.h b/archive-sources/pac/maze.h new file mode 100644 index 0000000..0ada2c9 --- /dev/null +++ b/archive-sources/pac/maze.h @@ -0,0 +1,18 @@ +#ifndef MAZE_H +#define MAZE_H + +extern void DrawMaze( void ); +extern void DrawPac( void ); +extern void MovePac( void ); +extern void DrawFill( void ); +extern void DrawGhosts( void ); +extern void MoveGhosts( void ); +extern void MazeInitialize( void ); +extern void CheckGhosts( void ); +extern void DrawGameOver( void ); +extern void DrawScore( void ); +extern void InitLevel( int l ); +extern void NextLevel( void ); +extern void MazePig( void ); + +#endif diff --git a/archive-sources/pac/pacman.cfg b/archive-sources/pac/pacman.cfg new file mode 100644 index 0000000..5a05558 --- /dev/null +++ b/archive-sources/pac/pacman.cfg @@ -0,0 +1,8 @@ +pluginversion=1 +name=Pacman +desc=The good old pacman in new dboxII generation +depend=libfx2.so +type=1 +needfb=1 +needrc=1 +needlcd=0 diff --git a/archive-sources/pac/pacman.png b/archive-sources/pac/pacman.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e81c256d129f86b6bc5f6626ca686bb94b1a08 GIT binary patch literal 6816 zcmZ8`2|U!@_x~Lxjck)7p_oddvh*mFjI9(|5+U259n+Mph?#6@5oysAEff`HeXNC< z7LsU@ER&4nA-n9$%>3^CO!a*K|9X91Gd`bt@8{lg-sk;3=gc`9rM#Mh zz<_r_Cnn_{*Z%+t7Fh37d9O+X=08GaAj-QHQh4E-+thhM)LVa5`Fonc%F7 zCOlsB`vs}r*P*>!(np*0w*K`>@jGY@J?{qqaHb9xB&)XDJSeudh_{FDv{q!WFCCW; zx+o0vJi%@2V-AdWQE)g-1h*6(f|5&e99|5^alXG5h1*e1J^%nQ0j;-2pS?~PaPDU` zu#f3hFDr9x?Y^L?pv33ZMlY(^gg*pl-;Gy3{m>6LHKHFe90Ct-bl|%1@X^<964mhU zf8kEWSApVX?DV6GwI=Ye4{N+%x7oKjOt(Fjxkdquqmf#g-hr`_b3aGTRZ~y2mzSN8 z26Fpt-EWI{Qiq57<>mvU9mu8~HzaZ3eO`5))~011?rTd1rnBDpgi_gMFS7QmnA(zj zAb@$=4&0Ufcb?|Fj@sJ3Z#n=394kEf)bBw_*lluhTmL_!UyiCc5v+gQ;WaDEllFOP9Zegu+ky`9SChj=rx9y-JUy4>y-_sN6lgr6p<=Q2;xsokwK&x)K8J(= z2QOLY7RsIDK2>e6s5qUxI;l!I{VMNg6FCc-DdnD0_*B;`@~o!{D0qV~&^R?xJ%r~- zUiE@bX0~j;FaNB6yvs$^AHju|@!26<*CEp3Of=kpZL3hO`mn!#GDHdO`tr3EXLp?= zGT5SUm1`p3&6Pf{JG&YbuRTCQFYIQVTvli748Gn$fI1{k4gOo~ znd>}R#^g#k*q*Xy4g7jf8m_y2;*pR?1!%YoO)q}yLX@k}|i5pc*glV9h2Tk6?n-DX!$@a-h~XM0~o&bt+wC@y1F z9%NKl4EqL+_BRKFWQ7e(2Cd)BZ*8iWD9qvRpz~uEMdE<+jZBl_G8^OMOFka6)ng-_ z=G`8%*che3p?3fAx`i6)5AiSV1?pBf%Std#e$5vBQhC3nKgoF9ju0c8<%1VCGOO(f zUSnKRWaJ}acZn%}$pWhLd?X}nWbq-Bsg`bUXW=a@WwTy0a3b-p?;{-$)6sUuc)G1+ z;;~Evi5R52++~vcGYN<@bDvY$d4cVk^u|RDr4~qDj4S!hklV+QOex=pR_L73s5Wn! z43O(QHaD&`%u|RDM0mLofxT7_!3>Au=B1rHLeRl2wGhb> z-T?*BxA5ME=`V zA&S{4l}%Sp^9m#gB1$fVfQ4A>Zz~8w43mjfXldIM^~hqFVxo1me5p`nly9W?%QsD= z9V$pZR1LL5D>8#W(|(A5uXt!Cn2P|XR6iS!Hk)c+Yz@&(O1>l&$Lpit;l_Wh=xZNG zu%zn^k;O1G$1UrGnyUKX&A<3!E9RvW-m(AxP^Td>QqQPFe~anf-aS7?x4ngDx*b*X zee;h>p7{VhAe-JqCXRBuNBO*D^y0j$i70j>qB;AKgnlrgVcNbV65aiVQ3xj6FU44x z@vH*btDzdFVxHKEVJWf7TIglt8Pht%-ZhYrUkiu9(-11CH30RyVByj*E=p}XXxMHy$=KKg^E!QkvMB} zLJS9YqXEyc!h13r%sH7RkUaX==x*<+z(eo6sUaWChmb<4CIxETkl+C@Y(f%37@p*h+nVo$ENqTWrLyy-s3GaEd zmxL6{uxk{~nEgeZoRj!ol!RQ*SQtUN*vJnJyAvnh+}3L!8((R(PmeUVk4!ZebyXJ? z?!I8v$O*J;8^~Au3R4=jfsz!qM)ycUdIz-Ka_G#N_z|+#j#(O?%Dwq=$w1Db@yYf4 zOI_9b=#w!`V{)G_cZPHZH5ytfz~YH%WW@MFv)H2|{>BURkVhRLzNB*8y_EfdnS81CJYAR4tL zMIqT4>~>xzgiqC=n>Q)=Dh~@Qs?BS16un(Xy}c~i`WVzZVtqQl-MzX`={BCzX!Ipe z&!vf)?2R8uO5wXvUD+Go8Wz#-*p>O}&!2s}^!Bc7H%urad0Yq47_G7e(UVHy0UK;& zDki7hGFc$hjAPdlcN`gfWT#SJ8*9p4PzjTW_g?pwh0grx1aDA#7Aw##fDTd8-v($C`M&(1KBoQmq{ zgwgg_r`vYuGD7$tpk&j18|y?xB)dgQsV|N=cAuIqOfh}Mi`*D>=1i@l;~k4TniQCU zEEvleQc0UB<26NB7I6yIQvAfIeV-S89UswH&X!rNbSL;Nv-AnyEs7I1lh?YPJ{xm~@Km7UjzDZ!FQ4 z#CH^F6qGI_=iOOWMB~55>+dR{@E^ zk_ZPRi5S(&_@l2kBB1qQ@$#EyW7ZwoQic0f$E?Gs_J*A-;tQ4u&EiPEj?q?FCLwup zQ56An`UD3lqKR}w>NlH?-(264|uq{l4Sne2%BCR66g@L*sdKA4}RifspNV8*3c12jDd=xY|1K^5l z!I!R~K2tTMRD>a?Gvg_dh+}Q@hALeRN^#WjS@{>Ed0qa^+LD05>sQ$C@pI1KMH?&V z-v2z!X)I+`J863z-d=|aT8>_QU>yaM?iEvp5}1HSH8#fiZS?y)#m=G>sjJAq=&PiA zk7ake47+WTkAsI{w3-ZLRwsnMN&dDs>-ENHFXUGB;^uRHCfytvAd`FdghNg@RLYBq8Ljijf7Wey}g3_?!ZTd=;tl_!!o*h@gAtg<_y z2#Xn$;n%%Hh|6E$MQI=b5PQ&o`Vr==TYu-QRwgvA0=-k}y)l8h9RusfPesmEW$Ldp zI<;11(_y-dE8Be@MPKY{O=P`@101_v$d9^=67490E5E9JN;m-4A`tcKgpyp_rH^DT zH~V)+mj@K7m$8&_A0hlC(&pH%ruJ~uaft2eYsx{W%$qxioquk|0VPHI2)xDsn1e=4 z)3M-Q5<#D}LJzJ-V{H#HmKYY?@0-nbSDPb~&n)4W-tXXO(V^=<>eu!MEug z51s>R965bK4H2e{FG}yzYU0o-4bTx%_am=DUVMTYMLH_$F?>g3z9y)mZpKSHY_5)e zI;^|Bl6Pf?`q7~v5vr7cb*9rYAwhO3g#1G|kf)_uqMnpQE;J0H^UYNWfHMEH=<*#v z1W@9Mu5U$U6LH9d^IYMUaC#Wit;efg<79qm=a1A#(6ZWvL9SapW^f2Yv(~>|{#3yX z?#8+u*kP*b9{yMV`shT)8uDgx`0&7zx<}=)3caQ@zmfFW!FbcM_=7$EQTO6uHd#4I zX51w?J+%74ot;FNwIpC#n$n~rvho$f=XnA~l3IHHvd&g2ICsMPwFX!5=T$;y4u3|e zm=97-wbaT_jjl$QFA+9u^zaYtAyju~F7J!z@9MH?FWUK4g&=j@va82IlMCyt%>>q~ z6ps3fk?d>ki{awkvNZv*#MGsLkxqOpt+=ve!E*p=^N9vyKpZgrF=xnJoC+_ z_pOGqB&a&Ol&ZY{D93q2Q>Kls~4tjq?2xo_cx5B zexO5ZaN}F)42`WfFpyoaLm=}~D~#q8DHx@FkxS!4_su93@`2kvC)8UxY@s&3{<3U& zZz}dgirFD(eA?c;ih>YUUsx}5JsuG+SQweR2LPjWh<&gIDA8i)^&PNw+DEAWa}R5Z z=62}>NqZ%~8yfTA50wYbj=+GJFHRJ1fg3{oNAnJMH5k(yOoZ$&~Vm&SP|b z*rd{3P5wwbKMk=F7S_lt;?9CNT8{Zv(B8tZaaEAd2-?+uYIXuKvY~lrPt*Pr%gXq$ zT{9{LQuKtd5Z%>)X!;}Sc{MBvfu^^k=3yM&`=)?X#G}fv? zAP{q;xc^nlqkO3Q2xfitQpI{_fs9^!>O28P0fo(z?kxv5lwI=S5 z`;faBq}n(veb3m5)d834;Bk;IDa{re&`u~P^073)gof7p(=L&dLy5Q`^0yio+^@tr Xq?E2opYd1&;J=;Qtj)4bC=ve$3$**) literal 0 HcmV?d00001 diff --git a/archive-sources/pac/pics.h b/archive-sources/pac/pics.h new file mode 100644 index 0000000..17bfc54 --- /dev/null +++ b/archive-sources/pac/pics.h @@ -0,0 +1,424 @@ +#ifndef PICS_H +#define PICS_H + +#define MAZEW 22 +#define MAZEH 18 + +#define _ BLACK +#define Y YELLOW +#define W WHITE + +static unsigned char futter[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_0_1[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_0_2[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_0_3[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_0_4[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_0_5[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_1_1[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_1_2[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_1_3[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_1_4[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char pac_1_5[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_, +_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Y,Y,Y,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +static unsigned char ghost_0_0[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,W,W,_,_,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,W,W,_,_,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,W,W,W,W,W,_,_,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,W,W,W,W,_,W,W,_,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,W,_,_,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_, +_,_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_, +_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_, +_,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_, +_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_, +_,_,_,W,W,W,W,W,W,_,_,_,W,W,W,W,W,W,W,W,W,W,W,W,W,_,_,_,_,_,_,_, +_,_,_,_,W,W,W,W,_,_,_,_,_,W,W,W,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +#undef _ +#undef Y +#undef W + + +#endif diff --git a/archive-sources/pac/somain.c b/archive-sources/pac/somain.c new file mode 100644 index 0000000..49f00d4 --- /dev/null +++ b/archive-sources/pac/somain.c @@ -0,0 +1,157 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "pig.h" +#include "colors.h" +#include "maze.h" +#include "fx2math.h" + +extern int doexit; +extern int debug; +extern int gametime; +extern int pices; +extern int score; +extern unsigned short actcode; +extern unsigned short realcode; +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 20 ); + FBSetColor( GREEN, 20, 255, 20 ); + FBSetColor( STEELBLUE, 80, 80, 200 ); + FBSetColor( BLUE, 30, 30, 220 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 60, 60, 60 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int jumplevel=-1; + int fdfb = -1, fdrc = -1; + + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + InitLevel( 0 ); + + while( doexit != 3 ) + { + MazeInitialize(); + DrawMaze( ); /* 0 = all */ + DrawFill(); + DrawGhosts( ); + DrawPac( ); + MazePig(); + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; +#ifdef HAVE_DREAMBOX_HARDWARE + tv.tv_usec = 8000; +#else + tv.tv_usec = 1000; +#endif + x = select( 0, 0, 0, 0, &tv ); /* 10ms pause */ + + MovePac( ); + MoveGhosts( ); + DrawGhosts( ); + DrawPac( ); +#ifdef USEX + FBFlushGrafic(); +#endif + RcGetActCode( ); + CheckGhosts( ); + } + + if ( doexit != 3 ) + { + actcode=0xee; + if ( score ) + DrawScore(); + if ( !gametime ) + DrawGameOver(); +#ifdef USEX + FBFlushGrafic(); +#endif + doexit=0; + jumplevel=-1; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + if ( actcode == RC_HELP ) + { + while( realcode != 0xee ) + RcGetActCode( ); + actcode=0xee; + while(( actcode == 0xee ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + if ( actcode <= RC_9 ) + { + jumplevel=actcode; + actcode=RC_OK; + } + } + } + if ( gametime ) + NextLevel(); + else + InitLevel( jumplevel ); + } + } + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + diff --git a/archive-sources/snake/colors.h b/archive-sources/snake/colors.h new file mode 100644 index 0000000..ca2d09f --- /dev/null +++ b/archive-sources/snake/colors.h @@ -0,0 +1,8 @@ + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define DARK 9 +#define GREEN2 10 diff --git a/archive-sources/snake/pics.h b/archive-sources/snake/pics.h new file mode 100644 index 0000000..0415344 --- /dev/null +++ b/archive-sources/snake/pics.h @@ -0,0 +1,29 @@ +#ifndef PICS_H +#define PICS_H + +#define MAZEW 44 +#define MAZEH 36 + +#define _ BLACK +#define Y YELLOW +#define W WHITE + +static unsigned char futter[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_, +_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_, +_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_, +_,_,_,_,_,W,W,W,W,W,W,W,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_, +_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +#endif diff --git a/archive-sources/snake/snake.c b/archive-sources/snake/snake.c new file mode 100644 index 0000000..e7d1dde --- /dev/null +++ b/archive-sources/snake/snake.c @@ -0,0 +1,288 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include +#include + +#include "colors.h" +#include "draw.h" +#include "pics.h" +#include "rcinput.h" + +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 600 +#define LOGO_Y 30 + +extern double sqrt( double in ); + +extern int doexit; + +#define LEFT 0 +#define RIGHT 1 +#define UP 2 +#define DOWN 3 + +typedef struct _snake_ele +{ + unsigned char x; + unsigned char y; + unsigned char dir; +} snake_ele; + +extern unsigned short actcode; +static unsigned char maze[ 44 * 40 ]; +static int score = 0; +static int snake_len = 10; +static snake_ele *snake = 0; +static snake_ele last; +static snake_ele goodie; +static int count = 0; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + + return tv.tv_usec % idx; +} + +static void SetNewGoodi() +{ + int goodiok=0; + int i; + + while( !goodiok ) + { + goodie.x = myrand( MAZEW - 8 ) + 4; + goodie.y = myrand( MAZEH - 10 ) + 6; + goodiok=1; + for( i=0; i < snake_len; i++ ) + { + if (( snake[i].x == goodie.x ) && ( snake[i].y == goodie.y )) + { + goodiok=0; + break; + } + } + if ( goodiok && ( maze [ goodie.y * MAZEW + goodie.x ] != ' ' ) ) + goodiok=0; + } + FBCopyImage( goodie.x*16, goodie.y*16, 16, 16, futter ); + count = 100; +} + +void FreeSnake( void ) +{ + free( snake ); + snake = 0; +} + +static void InitSnake( void ) +{ + int i; + + if ( snake ) + free(snake); + snake_len = 10; + snake = malloc(sizeof(snake_ele)*snake_len); + for( i=0;i 15 ) ) + maze[ y*MAZEW+x ]='#'; + + if ( ( x == 8 ) && ( y < MAZEH - 6 ) && ( y > 22 ) ) + maze[ y*MAZEW+x ]='#'; + } + } + for( y = MAZEH-9; y < MAZEH-1; y++ ) + { + for( x = MAZEW-11; x < MAZEW-1; x++ ) + { + if ( (y==MAZEH-9) || (x==MAZEW-11) || (y==MAZEH-2) || ( x==MAZEW-2)) + maze[ y*MAZEW+x ]='#'; + else + maze[ y*MAZEW+x ]='z'; + } + } + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++ ) + { + switch ( *p ) + { + case '#' : + FBFillRect( x*16, y*16, 16, 16, STEELBLUE ); + break; + case '.' : + FBCopyImage( x*16, y*16, 16, 16, futter ); + break; + case 'z' : + FBFillRect( x*16, y*16, 16, 16, 0 ); + break; + default : + FBFillRect( x*16, y*16, 16, 16, BLACK ); + break; + } + p++; + } + } + FBDrawFx2Logo( LOGO_X, LOGO_Y ); + + SetNewGoodi(); + DrawSnake(); + DrawScore(); +} + +void DrawGameOver( void ) +{ + FBDrawString(250,200,64,"Game Over",RED,0); +} + +void DrawFinalScore( void ) +{ + char cscore[ 64 ]; + int x; + + sprintf(cscore,"%d",score); + x=FBDrawString(250,264,64,"Score",WHITE,0); + FBDrawString(250+x+18,264,64,cscore,WHITE,0); +} diff --git a/archive-sources/snake/snake.cfg b/archive-sources/snake/snake.cfg new file mode 100644 index 0000000..de02c51 --- /dev/null +++ b/archive-sources/snake/snake.cfg @@ -0,0 +1,7 @@ +pluginversion=1 +name=Snake +desc=a game for a short break +type=1 +needfb=1 +needrc=1 +needlcd=0 diff --git a/archive-sources/snake/snake.h b/archive-sources/snake/snake.h new file mode 100644 index 0000000..1b042ff --- /dev/null +++ b/archive-sources/snake/snake.h @@ -0,0 +1,10 @@ +#ifndef SNAKE_H +#define SNAKE_H + +extern void DrawMaze( void ); +extern void MoveSnake( void ); +extern void DrawGameOver( void ); +extern void DrawFinalScore( void ); +extern void FreeSnake( void ); + +#endif diff --git a/archive-sources/snake/somain.c b/archive-sources/snake/somain.c new file mode 100644 index 0000000..0f2c7d1 --- /dev/null +++ b/archive-sources/snake/somain.c @@ -0,0 +1,118 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "pig.h" +#include "colors.h" +#include "snake.h" +#include "fx2math.h" + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 30 ); + FBSetColor( GREEN, 30, 255, 30 ); + FBSetColor( STEELBLUE, 80, 80, 200 ); + FBSetColor( BLUE, 30, 30, 220 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 60, 60, 60 ); + FBSetColor( GREEN2, 30, 200, 30 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int fdfb = -1, fdrc = -1; + + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + while( doexit != 3 ) + { + DrawMaze( ); /* 0 = all */ + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 10ms pause */ + + RcGetActCode( ); + MoveSnake(); +#ifdef USEX + FBFlushGrafic(); +#endif + } + + FreeSnake(); + + if ( doexit != 3 ) + { + actcode=0xee; + DrawFinalScore(); + DrawGameOver(); +#ifdef USEX + FBFlushGrafic(); +#endif + + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 200000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + } + } + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + diff --git a/archive-sources/sokoban/1.xsb b/archive-sources/sokoban/1.xsb new file mode 100644 index 0000000..a7dc4ab --- /dev/null +++ b/archive-sources/sokoban/1.xsb @@ -0,0 +1,11 @@ + ####### + #.... ## +##.## $ # +#.. # # +# $ # +## ### ### + # # $ # + # $$$ # + # # $@### + # ### + ##### diff --git a/archive-sources/sokoban/11.xsb b/archive-sources/sokoban/11.xsb new file mode 100644 index 0000000..71b52e8 --- /dev/null +++ b/archive-sources/sokoban/11.xsb @@ -0,0 +1,15 @@ + #### + ###### ##### +#### .. $$ # # +# *$ # $ # +# # .## .## ### +## #*.##$### # + # @ # +## ###$##.*# ## +# ##. ##. # # +# # $* $ # +# # $$ .. #### +#### ###### + #### +Author: David Holland +Title: fizzgig1 diff --git a/archive-sources/sokoban/7.xsb b/archive-sources/sokoban/7.xsb new file mode 100644 index 0000000..6ab7248 --- /dev/null +++ b/archive-sources/sokoban/7.xsb @@ -0,0 +1,19 @@ +################### +## ## + ## $ $.$.$ $ ## + ## $.$.$.$ ## + ## .$.$.$. ## + ## .$.$. ## + ## .$. ## + ## . ## + ##@## + ## . ## + ## .$. ## + ## .$.$. ## + ## .$.$.$. ## + ## $.$.$.$ ## + ## $ $.$.$ $ ## +## ## +################### +Author: David Holland +Title: bowtie3 diff --git a/archive-sources/sokoban/8.xsb b/archive-sources/sokoban/8.xsb new file mode 100644 index 0000000..e050a89 --- /dev/null +++ b/archive-sources/sokoban/8.xsb @@ -0,0 +1,12 @@ + ####### + # # + ##.*$# # + # ..$ # +#####$# $### +# $ # .# +# #* * $# +#@ .. # # +### #### + ##### +Author: David Holland +Title: teapot3 diff --git a/archive-sources/sokoban/albe-01.xsb b/archive-sources/sokoban/albe-01.xsb new file mode 100644 index 0000000..eebe667 --- /dev/null +++ b/archive-sources/sokoban/albe-01.xsb @@ -0,0 +1,15 @@ + ######## + # ## #### + # @$ # #### + # ##$ $ # # + # ## #$ $ ### + # ##### #$ $ # + # # #### #$ # + # ## #### # +## .## # ## +#. .## # # +#.. .## # ## +### .####### # + # # . # + ############### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-02.xsb b/archive-sources/sokoban/albe-02.xsb new file mode 100644 index 0000000..d039a2c --- /dev/null +++ b/archive-sources/sokoban/albe-02.xsb @@ -0,0 +1,14 @@ + #### +## ## +# $ ###### +# $ # +## $ ## ### + ## $ # # + ## $ #$# # + ## $#@$ # + ### # ### + #.# # # + #... ..# + # #..# + ######## +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-03.xsb b/archive-sources/sokoban/albe-03.xsb new file mode 100644 index 0000000..7640169 --- /dev/null +++ b/archive-sources/sokoban/albe-03.xsb @@ -0,0 +1,17 @@ + ###### + # ### +##### ## # +# $ $ $ # +# # # ## +# $##### # +### # $ # + # # # # + # #$ # + # ### ### + ##$ # +## ###### +#...@....# +## # ##### + # # + ##### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-04.xsb b/archive-sources/sokoban/albe-04.xsb new file mode 100644 index 0000000..83a253c --- /dev/null +++ b/archive-sources/sokoban/albe-04.xsb @@ -0,0 +1,12 @@ +############# +# @ # +# $ ##### $ # +# $ ### $ # +## $ # $ ## + ## $#$ ## + ### # ### + # # # + #.. ..# + #..#..# + ####### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-05.xsb b/archive-sources/sokoban/albe-05.xsb new file mode 100644 index 0000000..808e467 --- /dev/null +++ b/archive-sources/sokoban/albe-05.xsb @@ -0,0 +1,16 @@ +##### +#...# +#...### +#.. # +#. # +## ####### + # ###@ ##### + # ## $# ## + # # $ ## $$ ## + # #$ ### $ ## + # # ### ## $ # + # ########$ # + # $ # + ## ######## ## + #### #### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-06.xsb b/archive-sources/sokoban/albe-06.xsb new file mode 100644 index 0000000..f72522a --- /dev/null +++ b/archive-sources/sokoban/albe-06.xsb @@ -0,0 +1,18 @@ +################# +# . . . . . # +#. # $ $ $ $ $ # +# $############ # +#. # # # +# $# #$ # +#. # # .# +# $# #$ # +#. # # .# +# $# #$ # +#. # # .# +# $# #$ # +# # # .# +# ############$ # +# $ $ $ $ $ # .# +#@. . . . . # +################# +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-07.xsb b/archive-sources/sokoban/albe-07.xsb new file mode 100644 index 0000000..55e5438 --- /dev/null +++ b/archive-sources/sokoban/albe-07.xsb @@ -0,0 +1,18 @@ +################# +# . . . . . . # +#. $ $ $ $ $ $ .# +# $###########$ # +#. # # .# +# $# #$ # +#. # # .# +# $# #$ # +# # # # +# $# #$ # +#. # # .# +# $# #$ # +#. # # .# +# $###########$ # +#.$ $ $ $ $ $.# +#@. . . # . . . # +################# +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-08.xsb b/archive-sources/sokoban/albe-08.xsb new file mode 100644 index 0000000..4602079 --- /dev/null +++ b/archive-sources/sokoban/albe-08.xsb @@ -0,0 +1,18 @@ +################# +# . . . . . . . # +#.$ $ $ $ $ $ $.# +# $###########$ # +#. # # .# +# $# #$ # +#. # # .# +# $# #$ # +#. # # .# +# $# #$ # +#. # # .# +# $# #$ # +#. # # .# +# $###########$ # +# $ $ $ $ $ # +#@ #. . . . . # +################# +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-09.xsb b/archive-sources/sokoban/albe-09.xsb new file mode 100644 index 0000000..d943f14 --- /dev/null +++ b/archive-sources/sokoban/albe-09.xsb @@ -0,0 +1,16 @@ + ##### + ##.#.## + # # # + ##$$$$$## +#####. . .### +# $ # # # $ ## +# * .#. * # +## #$.#####.$# ## + # * .#. * # + ## $ # # # $ # + ###. @. . #### + ##$$$$$### + # # # + ##.#.## + ##### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-10.xsb b/archive-sources/sokoban/albe-10.xsb new file mode 100644 index 0000000..7d4589d --- /dev/null +++ b/archive-sources/sokoban/albe-10.xsb @@ -0,0 +1,18 @@ + ##### ##### +##...## ##...## +#.$ $.###.$ $.# +#. $ $.#.$ $ .# +#.$ $ $@$ $ $.# +#. $ $ # $ $ .# +##. $ $#$ $ .## + ##. $ # $ .## + ##..$#$..## + ### # ### + ##.# # #.## + ##.$$ # $$.## + #. $ # $ .# + # $ $.#.$ $ # + # $$.###.$$ # + ##..## ##..## + #### #### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-12.xsb b/archive-sources/sokoban/albe-12.xsb new file mode 100644 index 0000000..5be73ee --- /dev/null +++ b/archive-sources/sokoban/albe-12.xsb @@ -0,0 +1,18 @@ + ### ### + ##.## ##.## + ##.$.## ##.$.## +##.$ $.###.$ $.## +#.$ $ $ .$$ $ $.# +##.$ $ # # $ $.## + ##.$ $. .$ $.## + #. #.#$#.# ## + ##.$.$@$.$.## + ## #.#$#.# .# + ##.$ $. .$ $.## +##.$ $ # # $ $.## +#.$ $ $$. $ $ $.# +##.$ $.###.$ $.## + ##.$.## ##.$.## + ##.## ##.## + ### ### +Author: Borella Alberto diff --git a/archive-sources/sokoban/albe-13.xsb b/archive-sources/sokoban/albe-13.xsb new file mode 100644 index 0000000..942ab28 --- /dev/null +++ b/archive-sources/sokoban/albe-13.xsb @@ -0,0 +1,18 @@ +################# +# # +# $ *.*.$.*.* $ # +# $ $ * * $ $ # +# * $ $.$.$ $ * # +# .$ *.*.*.* $. # +# * $.$.$.$.$ * # +# .*.*.* *.*.*. # +# $ $.$ @ $.$ $ # +# .*.*.* *.*.*. # +# * $.$.$.$.$ * # +# .$ *.*.*.* $. # +# * $ $.$.$ $ * # +# $ $ * * $ $ # +# $ *.*.$.*.* $ # +# # +################# +Author: Borella Alberto diff --git a/archive-sources/sokoban/board.c b/archive-sources/sokoban/board.c new file mode 100644 index 0000000..98aee36 --- /dev/null +++ b/archive-sources/sokoban/board.c @@ -0,0 +1,849 @@ +#include +#include "board.h" +#include "draw.h" +#include "rcinput.h" +#include "colors.h" +#include "pics.h" +#include +#include +#include +#include +#include + +#include + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; +extern unsigned short actcode; + +static int man_x = 1; +static int man_y = 1; +static int moves = 0; +static int pushes = 0; +static int ox,oy; +int level = 0; +int max_level = 1; +static char* levelname[500]; +static int levelverz[500]; +static int Rand = 0; +char Zuege[1500]; +static unsigned char board[22][18]; +static int MAZEW; +static int MAZEH; + +static int one (struct dirent *name) // Filter für ladeVerzeichnis +{ + char* ext = ".xsb"; + if (strstr(name->d_name,ext)!=NULL) { return 1;} + else { return 0;} +} + +void ladeVerzeichnis (void) +{ + struct dirent **eps; + int n; +// char* Verz2; + +// char* Verzeichnis = getcwd (NULL, 0); +// puts(Verzeichnis); + + +// Verz2 = (char*) malloc(strlen(Verzeichnis)+2); +// strcpy(Verz2,Verzeichnis); +// strcat(Verz2,"/"); +// puts(Verz2); + +// n = scandir (Verzeichnis, &eps, one, alphasort); + + max_level = 0; + n = scandir ( DATADIR "/sokoban/", &eps, one, alphasort); + if (n >= 0) + { + int cnt; + for (cnt = 0; cnt < n && cnt < 500; ++cnt) + { + levelname[cnt] = strdup(eps[cnt]->d_name); + levelverz[cnt] = 1; + } + max_level = n; + } + + n = scandir ( CONFIGDIR "/sokoban/", &eps, one, alphasort); + if (n >= 0) + { + int cnt; + for (cnt = 0; cnt < n && cnt < 500; ++cnt) + { + levelname[cnt+max_level] = strdup(eps[cnt]->d_name); + levelverz[cnt+max_level] = 2; + } + max_level = max_level + n; + } + + if (max_level == 0) + { + levelname[0]=strdup("Installation error"); + } + +// free(Verz2); +// free(Verzeichnis); +} + +void freeMem(void) +{ + int i; + for (i = 0; i < max_level; i++) + free(levelname[i]); +} + +void DrawScore( void ) +{ + char tmoves[ 64 ]; + char tpushes[ 64 ]; + sprintf(tmoves,"%d",moves); + + FBDrawString( 100, 480, 30, "Moves", WHITE, 0 ); + FBFillRect( 100, 510, 30, 30, BLACK ); + FBDrawString( 100, 510, 30, tmoves, WHITE, 0 ); + + sprintf(tpushes,"%d",pushes); + + FBDrawString( 160, 480, 30, "Pushes", WHITE, 0 ); + FBFillRect( 160, 510, 30, 30, BLACK ); + FBDrawString( 160, 510, 30, tpushes, WHITE, 0 ); +} + +char getField( int x, int y) +{ + return board[x][y]; +} + +void setField(int x, int y, char c) +{ + board[x][y] = c; +} + +int win( void ) +{ + int x; + int y; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++) + { + if (board[x][y] == '.' || board[x][y] == '+') // sind noch Zielfelder frei ? + { + return 0; // noch nicht gewonnen + } + } + } + return 1; // gewonnen +} + +void DrawField( int x, int y ) +{ + switch ( board[x][y] ) + { + case '#' : // Wand + FBCopyImage( x*32 + ox, y*28 + oy, 32, 28, wall ); + break; + case ' ' : // leeres Feld + FBCopyImage( x*32 + ox, y*28 + oy, 32, 28, empty ); + break; + case '@' : // Pinguin + FBCopyImage( man_x*32 + ox, man_y*28 + oy, 32, 28, man ); + break; + case '+' : // Pinguin auf Zielfeld + FBCopyImage( man_x*32 + ox, man_y*28 + oy, 32, 28, manongoal ); + break; + case '$' : // Kiste + FBCopyImage( x*32 + ox, y*28 + oy, 32, 28, box ); + break; + case '*' : // Kiste auf Zielfeld + FBCopyImage( x*32 + ox, y*28 + oy, 32, 28, boxongoal ); + break; + case '.' : // Zielfeld + FBCopyImage( x*32 + ox, y*28 + oy, 32, 28, goal ); + break; + case 'a' : // äußeres Feld (nicht xsb-konform) + if (Rand == 1) + { + FBCopyImage( x*32 + ox, y*28 + oy, 32, 28, test ); + } + break; + } +} + +void DrawBoard() +{ + int x; + int y; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++) + { + DrawField( x, y); + } + } +} + +void BoardInitialize() +{ + char* verz = DATADIR "/sokoban/"; + char* verz2 = CONFIGDIR "/sokoban/"; + FILE *Datei=0; + int x,y,z; + int i; + char* d; + + if (levelverz[level]==1) + { + d = malloc (strlen(verz)+strlen(levelname[level])+1); + strcpy (d,verz); + strcat (d,levelname[level]); + } + else + { + d = malloc (strlen(verz2)+strlen(levelname[level])+1); + strcpy (d,verz2); + strcat (d,levelname[level]); + } + + FBFillRect( 0, 0, 720, 576, BLACK ); + + Datei = fopen(d, "r"); + + free(d); + + if ( !Datei ) + { // installation error + doexit=4; + FBDrawString( 200, 510, 30, "Installation Error. Cant find Level", WHITE, 0 ); + return; + } + + MAZEW = 0; + MAZEH = 0; + + for (y=0; y<18; y++) + { + for (x=0; x<22; x++) + { + setField(x, y, 'a'); + } + } + + x=0; y=0; + while(!feof(Datei)) + { + z = fgetc(Datei); + + if (z!='#' && z!='.' && z!='$' && z!='@' && z!='+' && z!='*' && z!=' ' && z!=0x0d && z!=0x0a) + { + MAZEH=y; + break; + } + else if (z == 0x0d) + { + z=fgetc(Datei); + for (i=x; board[i][y] != '#' && i > 3; i--) {x=i;} + if (MAZEW < x) {MAZEW = x;} + y++; + x=0; + MAZEH=y; + } + else if (z == 0x0a) + { + for (i=x; board[i][y] != '#' && i > 3; i--) {x=i;} + if (MAZEW < x) {MAZEW = x;} + y++; + x=0; + MAZEH=y; + } + else + { + if (y<18 && x<22) + { + setField(x, y, z); + if ((z=='@') || (z=='+')) + { + man_x = x; + man_y = y; + } + } + x++; + } + } + + fclose(Datei); + + ox = (720 - (MAZEW*32))/2; + oy = (576 - (MAZEH*28))/2; + + for (y=0; y<18; y++) + { + for (x=0; x<22; x++) + { + if (getField(x, y) != '#') {setField (x, y, 'a');} + else break; + } + for (x=21; x>=0; x--) + { + if (getField(x, y) != '#') {setField (x, y, 'a');} + else break; + } + } + + for (x=0; x<22; x++) + { + for (y=0; y<18; y++) + { + if (getField(x, y) != '#') {setField (x, y, 'a');} + else break; + } + for (y=17; y>=0; y--) + { + if (getField(x, y) != '#') {setField (x, y, 'a');} + else break; + } + } + + moves = 0; + pushes = 0; + + DrawBoard(); + DrawScore(); + FBDrawString( 300, 510, 30, levelname[level], WHITE, 0 ); + + for (i=0; i<=1500;i++) + { + Zuege[i]=' '; + } +} + +void Startbildschirm() +{ + int i; + char tlevel[ 64 ]; + +// int x,y; +// for (y=0; y<576; y=y+56) +// { +// for (x=0; x<720; x=x+64) +// { +// FB2CopyImage( x, y, 32, 28, man, 2); +// } +// } + +static int bx[] = { +64,32,0,0,0,32,64,64,64,32,0,128,160,192,192,192,192,192,160,128,128,128, +128,256,256,256,256,256,288,320,320,320,320,384,416,448,448,448,448,448,416, +384,384,384,384,512,544,576,224,224,224,224,224,256,288,288,256,288,288,256, +352,352,352,352,352,384,416,416,416,416,416,384,480,480,480,480,480,512,512, +544,544,576,576,576,576,576 }; + +static int by[] = { +0,0,0,28,56,56,56,84,112,112,112,0,0,0,28,56,84,112,112,112,84,56,28,0,28,56, +84,112,56,0,28,84,112,0,0,0,28,56,84,112,112,112,84,56,28,56,56,56,312,284,256, +228,200,200,200,228,256,284,312,312,312,284,256,228,200,200,200,228,256,284,312, +256,200,228,256,284,312,228,256,256,284,200,228,256,284,312 }; + + for (i=0;i<86;i++) + { + FBCopyImage(bx[i]+56,by[i]+118, 32, 28, wall ); + } + + FBFillRect( 55, 365, 200 , 40, BLACK ); + sprintf(tlevel,"%d",max_level); + FBDrawString( 75,370, 30, tlevel, WHITE, BLACK ); + FBDrawString( 120,370, 30, "Level gefunden", WHITE, BLACK); + +#ifdef USEX + FBFlushGrafic(); +#endif + + while( actcode != RC_OK ) + { + if (i>87) { i=0;} else {i++;} + if (i<86) {FBCopyImage( bx[i]+56,by[i]+118, 32, 28, box );} + if (i>=1 && i-1<=85) { FBCopyImage( bx[i-1]+56,by[i-1]+118, 32, 28, man );} + if (i>=2 && i-2<=85) { FBCopyImage( bx[i-2]+56,by[i-2]+118, 32, 28, wall );} + +#ifdef USEX + FBFlushGrafic(); +#endif + RcGetActCode( ); + sleep(1); + } + FBFillRect( 0, 0, 720 , 576, BLACK ); +} + +void DrawGameOver() +{ + DrawScore(); + FBDrawString( 300, 210, 64, "Level geschaft!", RED, 0 ); +} + +void MoveMouse() +{ +static int locked = 0; +int dx=0; +int dy=0; +char zug=' '; + + if ( locked ) + { + locked--; + actcode=0xee; + return; + } + + switch( actcode ) + { + case RC_RIGHT : // Pinguin nach rechts + if ( man_x+1 < MAZEW ) + { + dx = 1; + dy = 0; + zug = 'r'; + locked=1; + } + break; + + case RC_LEFT : // Pinguin nach links + if ( man_x > 1 ) + { + dx = -1; + dy = 0; + zug = 'l'; + locked=1; + } + break; + + case RC_DOWN : // Pinguin nach unten + if ( man_y+1 < MAZEH ) + { + dx = 0; + dy = 1; + zug = 'd'; + locked=1; + } + break; + + case RC_UP : // Pinguin nach oben + if ( man_y > 1 ) + { + dx = 0; + dy = -1; + zug = 'u'; + locked=1; + } + break; + + case RC_MINUS : // letzte Züge rückgängig machen + if (moves>0) + { + if (getField(man_x,man_y)=='@') + { + setField(man_x,man_y,' '); + } + else + { + setField(man_x,man_y,'.'); + } + + if (Zuege[moves]=='r' || Zuege[moves]=='R') + { + man_x--; + dx=1; + } + else if (Zuege[moves]=='l' || Zuege[moves]=='L') + { + man_x++; + dx=-1; + } + else if (Zuege[moves]=='u' || Zuege[moves]=='U') + { + man_y++; + dy=-1; + } + else if (Zuege[moves]=='d' || Zuege[moves]=='D') + { + man_y--; + dy=1; + } + + if (getField(man_x,man_y)==' ') + { + setField(man_x,man_y,'@'); + } + else + { + setField(man_x,man_y,'+'); + } + + if (isupper(Zuege[moves])) + { + if (getField(man_x+2*dx,man_y+2*dy)=='$') + { + setField(man_x+2*dx,man_y+2*dy,' '); + } + else + { + setField(man_x+2*dx,man_y+2*dy,'.'); + } + + if (getField(man_x+dx,man_y+dy)==' ') + { + setField(man_x+dx,man_y+dy,'$'); + } + else + { + setField(man_x+dx,man_y+dy,'*'); + } + pushes--; + } + moves--; + dx=0; + dy=0; + DrawBoard(); + DrawScore(); + } + locked=1; + break; + + case RC_PLUS : // Rückgängig rückgängig machen + if (Zuege[moves+1]!=' ') + { + if (Zuege[moves+1]=='r' || Zuege[moves+1]=='R') + { + dx=1; + } + else if (Zuege[moves+1]=='l' || Zuege[moves+1]=='L') + { + dx=-1; + } + else if (Zuege[moves+1]=='u' || Zuege[moves+1]=='U') + { + dy=-1; + } + else if (Zuege[moves+1]=='d' || Zuege[moves+1]=='D') + { + dy=1; + } + } + locked=1; + break; + + case RC_RED : // vorheriges Level - bei angefangenem Level nachfragen, ob wirklich sicher + if (moves!=0) + { + FBFillRect( 160, 70, 400, 436, B ); + FBDrawString( 160,75, 30, "Das Level ist noch nicht beendet!", WHITE, 0 ); + FBDrawString( 160,110, 30, "ROT abbruch", WHITE, 0 ); + FBDrawString( 160,140, 30, "OK naechstes Level", WHITE, 0 ); +#ifdef USEX + FBFlushGrafic(); +#endif + + actcode=0xee; + while( actcode != RC_OK && actcode != RC_RED ) + { + RcGetActCode(); + } + } + if (actcode == RC_OK || moves==0) + { + if (level > 0) + { + level--; + BoardInitialize(); + } + else + { + level = max_level-1; + BoardInitialize(); + } + } + else + { + FBFillRect( 0, 0, 720, 576, BLACK ); + DrawBoard(); + DrawScore(); + } + + locked=1; + break; + + case RC_GREEN : // naechstes Level - bei angefangenem Level nachfragen, ob wirklich sicher + if (moves!=0) + { + FBFillRect( 160, 70, 400, 436, B ); + FBDrawString( 160,75, 30, "Das Level ist noch nicht beendet!", WHITE, 0 ); + FBDrawString( 160,110, 30, "ROT abbruch", WHITE, 0 ); + FBDrawString( 160,140, 30, "OK vorheriges Level", WHITE, 0 ); +#ifdef USEX + FBFlushGrafic(); +#endif + + actcode=0xee; + while( actcode != RC_OK && actcode != RC_RED ) + { + RcGetActCode(); + } + } + if (actcode == RC_OK || moves==0) + { + if (level+1 < max_level) + { + level++; + BoardInitialize(); + } + else + { + level = 0; + BoardInitialize(); + } + } + else + { + FBFillRect( 0, 0, 720, 576, BLACK ); + DrawBoard(); + DrawScore(); + } + + locked=1; + break; + + case RC_YELLOW : // Randfelder ('a') aus-/einblenden + if (Rand == 0) + { + Rand = 1; + } + else + { + Rand = 0; + } + locked=1; + FBFillRect( 0, 0, 720, 576, BLACK ); + DrawBoard(); + DrawScore(); + FBDrawString( 300, 510, 30, levelname[level], WHITE, 0 ); + break; + + case RC_BLUE : // Level von vorne beginnen - bei angefangenem Level nachfragen, ob wirklich sicher + if (moves!=0) + { + FBFillRect( 160, 70, 400, 436, B ); + FBDrawString( 160,75, 30, "Das Level ist noch nicht beendet!", WHITE, 0 ); + FBDrawString( 160,110, 30, "ROT abbruch", WHITE, 0 ); + FBDrawString( 160,140, 30, "OK vorheriges Level", WHITE, 0 ); +#ifdef USEX + FBFlushGrafic(); +#endif + actcode=0xee; + while( actcode != RC_OK && actcode != RC_RED ) + { + RcGetActCode(); + } + } + if (actcode == RC_OK || moves==0) + { + BoardInitialize(); + } + else + { + FBFillRect( 0, 0, 720, 576, BLACK ); + DrawBoard(); + DrawScore(); + } + locked=1; + break; + + case RC_HELP : // Hilfe anzeigen + locked=1; + FBFillRect( 160, 70, 400, 436, B ); + FBDrawString( 160, 70, 30, "ROT vorheriges Level", WHITE, 0 ); + FBDrawString( 160,100, 30, "GRUEN naechstes Level", WHITE, 0 ); + FBDrawString( 160,130, 30, "GELB Rand ein/aus", WHITE, 0 ); + FBDrawString( 160,160, 30, "BLAU Level neu starten", WHITE, 0 ); + FBDrawString( 160,190, 30, "MINUS Zug zurueck", WHITE, 0 ); + FBDrawString( 160,220, 30, "PLUS Zug vor", WHITE, 0 ); + FBDrawString( 160,260, 30, "HOME Spiel beenden", WHITE, 0 ); + FBDrawString( 160,290, 30, "STUMM Spiel aus-/einblenden", WHITE, 0 ); + FBDrawString( 160,330, 30, "HILFE diese Hilfe", WHITE, 0 ); + FBDrawString( 160,370, 30, "OK weiter", WHITE, 0 ); +#ifdef USEX + FBFlushGrafic(); +#endif + + actcode=0xee; + while( actcode != RC_OK ) + { + RcGetActCode( ); + } + FBFillRect( 0, 0, 720, 576, BLACK ); + DrawBoard(); + DrawScore(); + FBDrawString( 300, 510, 30, levelname[level], WHITE, 0 ); + break; + } + + if (dx != 0 || dy != 0) // Soll Pinguin verschoben werden? + { + if (getField(man_x+dx, man_y+dy) == ' ') // Zug auf leeres Feld - keine Kiste vorhanden + { + if (getField(man_x,man_y)=='@') {setField(man_x,man_y,' ');} + else {setField(man_x,man_y,'.');} + DrawField(man_x, man_y); + + man_x += dx; dx = 0; + man_y += dy; dy = 0; + setField(man_x,man_y,'@'); + + DrawField(man_x, man_y); + + moves++; + DrawScore(); + } + else if (getField(man_x+dx, man_y+dy) == '.') // Zug auf Zielfeld - keine Kiste vorhanden + { + if (getField(man_x,man_y)=='@') {setField(man_x,man_y,' ');} + else {setField(man_x,man_y,'.');} + DrawField(man_x, man_y); + + man_x += dx; dx = 0; + man_y += dy; dy = 0; + setField(man_x,man_y,'+'); + + DrawField(man_x, man_y); + + moves++; + DrawScore(); + } + else if (getField(man_x+dx, man_y+dy) == '$' && getField(man_x+(2*dx), man_y+(2*dy)) == ' ') // Zug auf Feld mit Kiste - Kiste auf leeres Feld + { + setField(man_x+(2*dx), man_y+(2*dy),'$'); + setField(man_x+dx, man_y+dy,' '); + DrawField(man_x+(2*dx), man_y+(2*dy)); + + if (getField(man_x,man_y)=='@') {setField(man_x,man_y,' ');} + else {setField(man_x,man_y,'.');} + DrawField(man_x, man_y); + + man_x += dx; dx = 0; + man_y += dy; dy = 0; + setField(man_x,man_y,'@'); + + DrawField(man_x, man_y); + + moves++; + pushes++; + zug = toupper (zug); + DrawScore(); + } + else if (getField(man_x+dx, man_y+dy) == '$' && getField(man_x+(2*dx), man_y+(2*dy)) == '.') // Zug auf Feld mit Kiste - Kiste auf Zielfeld + { + setField(man_x+(2*dx), man_y+(2*dy),'*'); + setField(man_x+dx, man_y+dy,' '); + DrawField(man_x+(2*dx), man_y+(2*dy)); + + if (getField(man_x,man_y)=='@') {setField(man_x,man_y,' ');} + else {setField(man_x,man_y,'.');} + DrawField(man_x, man_y); + + man_x += dx; dx = 0; + man_y += dy; dy = 0; + setField(man_x,man_y,'@'); + + DrawField(man_x, man_y); + + moves++; + pushes++; + zug = toupper (zug); + DrawScore(); + } + else if (getField(man_x+dx, man_y+dy) == '*' && getField(man_x+(2*dx), man_y+(2*dy)) == ' ') // Zug auf Zielfeld mit Kiste - Kiste auf leeres Feld + { + setField(man_x+(2*dx), man_y+(2*dy),'$'); + setField(man_x+dx, man_y+dy,'.'); + DrawField(man_x+(2*dx), man_y+(2*dy)); + + if (getField(man_x,man_y)=='@') {setField(man_x,man_y,' ');} + else {setField(man_x,man_y,'.');} + DrawField(man_x, man_y); + + man_x += dx; dx = 0; + man_y += dy; dy = 0; + setField(man_x,man_y,'+'); + + DrawField(man_x, man_y); + + moves++; + pushes++; + zug = toupper (zug); + DrawScore(); + } + else if (getField(man_x+dx, man_y+dy) == '*' && getField(man_x+(2*dx), man_y+(2*dy)) == '.') // Zug auf Zielfeld mit Kiste - Kiste auf Zielfeld + { + setField(man_x+(2*dx), man_y+(2*dy),'*'); + setField(man_x+dx, man_y+dy,'.'); + DrawField(man_x+(2*dx), man_y+(2*dy)); + + if (getField(man_x,man_y)=='@') {setField(man_x,man_y,' ');} + else {setField(man_x,man_y,'.');} + DrawField(man_x, man_y); + + man_x += dx; dx = 0; + man_y += dy; dy = 0; + setField(man_x,man_y,'+'); + + DrawField(man_x, man_y); + + moves++; + pushes++; + zug = toupper (zug); + DrawScore(); + } + else + { + zug = ' '; + } + } + + if (zug !=' ') + { + Zuege[moves]=zug; + } + + if (win() == 1) // durch letzten Zug gewonnen? + { + if (level+1 < max_level) + { + level++; + } + else + { + level = 0; + } + + doexit=1; + } +#ifdef USEX + FBFlushGrafic(); +#endif + return; +} + diff --git a/archive-sources/sokoban/board.h b/archive-sources/sokoban/board.h new file mode 100644 index 0000000..16aa6a0 --- /dev/null +++ b/archive-sources/sokoban/board.h @@ -0,0 +1,12 @@ +#ifndef MAZE_H +#define MAZE_H + +extern void DrawBoard( void ); +extern void BoardInitialize( void ); +extern void DrawGameOver( void ); +extern void DrawScore( void ); +extern void Startbildschirm( void ); + +extern int level; +extern int max_level; +#endif diff --git a/archive-sources/sokoban/colors.h b/archive-sources/sokoban/colors.h new file mode 100644 index 0000000..2fac1f3 --- /dev/null +++ b/archive-sources/sokoban/colors.h @@ -0,0 +1,6 @@ +#define BLACK 1 +#define WHITE 2 +#define R 3 +#define G 6 +#define B 4 +#define GRAY 5 diff --git a/archive-sources/sokoban/pics.h b/archive-sources/sokoban/pics.h new file mode 100644 index 0000000..d5e95b2 --- /dev/null +++ b/archive-sources/sokoban/pics.h @@ -0,0 +1,252 @@ +#ifndef PICS_H +#define PICS_H + +// 1 +static unsigned char empty[] = { +12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, +12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 }; + +// 2 +static unsigned char box[] = { +12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, +12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,12,14,14,15,15,15,15,11,11,11,11,15,15,15,15,15,11,11,11,11,15,15,15,15,14,14,14,14,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,15,14,14,14,14,13,13, +12,12,14,14,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,15,14,14,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,15,14,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,14,13,13, +12,12,14,14,15,15,15,15,11,11,11,11,15,15,15,15,15,11,11,11,11,15,15,15,15,18,18,18,15,14,13,13, +12,12,14,14,14,15,18,18,18,11,11,11,11,18,18,18,18,18,11,11,11,11,18,18,18,15,18,18,15,14,13,13, +12,12,14,14,14,14,15,18,18,18,11,11,11,11,18,18,18,18,18,11,11,11,11,18,18,18,15,18,15,14,13,13, +12,12,14,14,14,14,14,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,15,15,14,13,13, +12,12,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,13,13, +12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13,13, +12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, +13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 }; + +// 3 +static unsigned char goal[] = { +19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20, +19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; + +// 4 +static unsigned char boxongoal[] = { +19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20, +19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,19,21,21,15,15,15,15,11,11,11,11,15,15,15,15,15,11,11,11,11,15,15,15,15,21,21,21,21,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,15,21,21,21,21,20,20, +19,19,21,21,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,15,21,21,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,15,21,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,17,17,11,16,16,16,16,16,11,17,17,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,16,16,16,11,11,11,11,16,16,16,16,16,11,11,11,11,16,16,16,15,18,18,18,15,21,20,20, +19,19,21,21,15,15,15,15,11,11,11,11,15,15,15,15,15,11,11,11,11,15,15,15,15,18,18,18,15,21,20,20, +19,19,21,21,21,15,18,18,18,11,11,11,11,18,18,18,18,18,11,11,11,11,18,18,18,15,18,18,15,21,20,20, +19,19,21,21,21,21,15,18,18,18,11,11,11,11,18,18,18,18,18,11,11,11,11,18,18,18,15,18,15,21,20,20, +19,19,21,21,21,21,21,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,15,15,21,20,20, +19,19,21,21,21,21,21,21,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,21,20,20, +19,19,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,20, +19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20 }; + +// 5 +static unsigned char man[] = { +22,22,22,22,22,22,22,22,22,22,22,23,24,25,24,24,24,26,27,26,28,22,22,22,22,22,22,22,22,22,22,29, +22,22,22,22,22,22,22,22,22,23,28,30,31,31,30,30,30,22,22,28,26,11,28,22,22,22,22,22,22,22,29,29, +22,22,32,32,32,32,32,32,22,30,33,34,35,35,31,22,22,28,28,24,24,24,11,25,30,32,32,32,32,32,29,29, +22,22,32,32,32,32,32,23,31,33,36,17,17,17,17,34,28,22,30,30,30,22,24,11,27,32,32,32,32,32,29,29, +22,22,32,32,32,32,23,22,31,37,17,17,17,17,17,17,31,37,17,17,17,17,34,26,11,25,32,32,32,32,29,29, +22,22,32,32,32,30,26,31,31,17,17,17,17,17,38,35,35,36,17,17,17,17,17,31,11,11,28,32,32,32,29,29, +22,22,32,32,32,25,24,30,30,17,17,17,17,17,31,39,31,28,36,17,17,17,40,35,11,11,11,30,32,32,29,29, +22,22,32,32,32,11,24,30,30,40,17,17,17,41,34,42,43,43,44,17,40,40,45,30,11,11,11,24,32,32,29,29, +22,22,32,32,28,11,26,22,22,33,17,41,40,46,47,48,49,50,51,52,36,36,34,27,11,11,11,27,32,32,29,29, +22,22,32,32,25,11,27,22,22,28,31,53,36,54,55,55,56,57,58,59,40,22,11,11,11,11,11,11,22,32,29,29, +22,22,32,32,11,11,11,24,28,24,33,17,17,17,60,56,61,62,63,17,17,38,24,11,11,11,11,11,28,32,29,29, +22,22,32,27,11,11,11,11,24,33,17,17,17,17,17,64,65,66,17,17,41,41,53,24,11,11,27,27,11,23,29,29, +22,23,27,11,11,11,11,11,24,17,17,17,17,17,17,17,67,17,41,40,40,40,45,53,26,27,27,27,27,27,22,29, +23,11,11,11,11,11,11,11,36,17,17,17,17,17,17,17,17,41,40,40,45,45,36,36,68,27,27,26,26,26,25,22, +11,11,11,11,11,11,11,30,17,17,17,17,17,17,17,17,41,40,40,45,45,36,36,53,53,28,26,26,27,25,27,27, +24,25,24,24,27,11,11,36,17,17,17,17,17,17,41,40,40,40,45,36,36,53,53,53,38,34,26,26,24,23,31,31, +22,22,32,32,25,11,26,17,17,17,17,17,17,41,40,40,45,45,36,36,53,53,53,69,69,69,24,27,22,32,33,29, +22,22,32,32,22,11,30,17,17,17,17,17,41,40,40,45,45,36,53,53,53,38,69,69,69,70,71,26,22,32,29,29, +22,22,32,32,32,11,33,17,17,17,41,40,40,40,45,45,36,53,53,53,38,69,69,69,72,72,30,28,30,32,29,29, +22,22,32,32,32,28,35,17,17,41,40,40,40,45,36,36,53,53,53,69,69,69,69,72,72,72,28,22,32,32,29,29, +22,22,32,32,32,32,23,40,41,40,40,45,45,36,36,53,53,38,69,69,69,69,72,72,72,30,23,30,32,32,29,29, +22,22,32,32,32,32,30,71,41,73,45,45,45,36,53,53,38,69,69,69,70,70,70,74,75,24,30,32,32,32,29,29, +22,22,32,32,32,32,30,76,77,78,54,79,38,80,53,38,69,69,70,72,35,81,82,83,84,85,22,32,32,32,29,29, +22,22,32,32,22,86,87,88,89,47,90,91,91,92,93,69,69,70,94,95,96,96,97,98,99,99,100,101,30,32,29,29, +22,22,32,32,102,103,47,104,104,49,105,61,57,106,107,108,69,94,109,47,104,104,97,61,61,57,106,110,24,32,29,29, +22,22,32,32,111,112,55,55,56,61,61,57,106,113,114,115,116,102,55,55,55,56,61,61,57,117,113,118,24,30,29,29, +22,29,29,29,33,28,119,120,121,122,123,124,125,126,28,32,32,32,127,128,121,121,99,129,124,130,131,23,32,33,29,29, +29,29,29,29,29,33,33,31,32,32,32,32,32,32,31,33,29,29,33,31,31,32,32,32,32,32,32,31,33,29,29,29 }; + +// 6 +static unsigned char manongoal[] = { +132,132,132,132,132,132,132,132,132,132,132,133,134,135,24,24,24,26,27,136,137,132,132,132,132,132,132,132,132,132,132,138, +132,132,132,132,132,132,132,132,132,133,139,30,31,31,30,30,30,22,22,28,26,140,137,132,132,132,132,132,132,132,138,138, +132,132,141,141,141,141,141,141,142,143,33,34,35,35,31,22,22,28,28,24,24,24,11,134,144,141,141,141,141,141,138,138, +132,132,141,141,141,141,141,145,31,33,36,17,17,17,17,34,28,22,30,30,30,22,24,11,146,144,141,141,141,141,138,138, +132,132,141,141,141,141,147,22,31,37,17,17,17,17,17,17,31,37,17,17,17,17,34,26,11,148,141,141,141,141,138,138, +132,132,141,141,141,149,26,31,31,17,17,17,17,17,38,35,35,36,17,17,17,17,17,31,11,11,137,141,141,141,138,138, +132,132,141,141,141,148,24,30,30,17,17,17,17,17,31,39,31,28,36,17,17,17,40,35,11,11,11,150,141,141,138,138, +132,132,141,141,144,11,24,30,30,40,17,17,17,41,34,42,43,43,44,17,40,40,45,30,11,11,11,151,141,141,138,138, +132,132,141,141,152,11,26,22,22,33,17,41,40,46,47,48,49,50,51,52,36,36,34,27,11,11,11,153,144,141,138,138, +132,132,141,141,135,11,27,22,22,28,31,53,36,54,55,55,56,57,58,59,40,22,11,11,11,11,11,11,142,141,138,138, +132,132,141,144,11,11,11,24,28,24,33,17,17,17,60,56,61,62,63,17,17,38,24,11,11,11,11,11,137,141,138,138, +132,132,144,146,11,11,11,11,24,33,17,17,17,17,17,64,65,66,17,17,41,41,53,24,11,11,27,27,140,147,138,138, +132,133,27,11,11,11,11,11,24,17,17,17,17,17,17,17,67,17,41,40,40,40,45,53,26,27,27,27,27,153,142,138, +147,140,11,11,11,11,11,11,36,17,17,17,17,17,17,17,17,41,40,40,45,45,36,36,68,27,27,26,26,26,25,154, +11,11,11,11,11,11,11,30,17,17,17,17,17,17,17,17,41,40,40,45,45,36,36,53,53,28,26,26,27,25,27,27, +155,156,151,151,27,11,11,36,17,17,17,17,17,17,41,40,40,40,45,36,36,53,53,53,38,34,26,26,151,147,157,157, +132,132,141,141,148,11,26,17,17,17,17,17,17,41,40,40,45,45,36,36,53,53,53,69,69,69,24,27,132,141,158,138, +132,132,141,141,142,11,30,17,17,17,17,17,41,40,40,45,45,36,53,53,53,38,69,69,69,70,71,159,160,141,138,138, +132,132,141,141,141,140,33,17,17,17,41,40,40,40,45,45,36,53,53,53,38,69,69,69,72,72,30,137,150,141,138,138, +132,132,141,141,141,145,35,17,17,41,40,40,40,45,36,36,53,53,53,69,69,69,69,72,72,72,161,132,141,141,138,138, +132,132,141,141,141,141,162,40,41,40,40,45,45,36,36,53,53,38,69,69,69,69,72,72,72,30,145,150,141,141,138,138, +132,132,141,141,141,141,150,163,41,73,45,45,45,36,53,53,38,69,69,69,70,70,70,74,75,151,150,141,141,141,138,138, +132,132,141,141,141,141,150,164,77,78,54,79,38,80,53,38,69,69,70,72,35,81,82,83,165,166,132,141,141,141,138,138, +132,132,141,141,132,167,168,88,89,47,90,91,91,92,93,69,69,70,94,95,96,96,97,98,99,99,169,170,144,141,138,138, +132,132,141,141,171,103,47,104,104,49,105,61,57,106,107,108,69,94,109,47,104,104,97,61,61,57,106,110,151,141,138,138, +132,132,141,141,172,112,55,55,56,61,61,57,106,113,114,115,116,102,55,55,55,56,61,61,57,117,113,118,151,144,138,138, +132,138,138,138,158,137,173,120,121,122,123,124,125,174,137,175,175,175,166,176,121,121,99,129,124,130,101,145,175,177,138,138, +138,138,138,138,138,158,177,178,175,175,175,175,175,144,157,177,138,138,158,157,178,175,175,175,175,175,144,157,177,138,138,138 }; + +// 7 +static unsigned char wall[] = { +182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,183, +182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,183,183, +182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,183,183,183, +182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,182,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183, +182,182,182,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, +182,182,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, +182,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, +183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183 }; + +// 8 +static unsigned char test[] = { +179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,180, +179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,180,180, +179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,180,180,180, +179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,179,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,180,180,180,180, +179,179,179,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, +179,179,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, +179,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, +180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180 }; + +#endif diff --git a/archive-sources/sokoban/soko.cfg b/archive-sources/sokoban/soko.cfg new file mode 100644 index 0000000..dae6bc4 --- /dev/null +++ b/archive-sources/sokoban/soko.cfg @@ -0,0 +1,9 @@ +name=Sokoban +desc=Push it, baby! +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 +pigsize=160x144 +pigpos=440,300 diff --git a/archive-sources/sokoban/somain.c b/archive-sources/sokoban/somain.c new file mode 100644 index 0000000..794c3ae --- /dev/null +++ b/archive-sources/sokoban/somain.c @@ -0,0 +1,340 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "board.h" +#include "colors.h" +#include "pig.h" +//#include + + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; /* akt.taste : 0xee = zZ keine taste */ + + +extern void ladeVerzeichnis (void); +extern void MoveMouse(void); +extern void freeMem(void); +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +static void setup_colors( void ) +{ + FBSetColor( BLACK, 0, 0, 0); + FBSetColor( R, 255, 0, 0); + FBSetColor( G, 0, 255, 0); + FBSetColor( B, 0, 0, 255); + FBSetColor( GRAY, 80, 80, 80); + FBSetColor( WHITE, 255, 255, 255); + +FBSetColor(11,0,0,0); +FBSetColor(12,91,91,91); +FBSetColor(13,141,141,141); +FBSetColor(14,115,115,115); +FBSetColor(15,27,27,27); +FBSetColor(16,81,81,81); +FBSetColor(17,255,255,255); +FBSetColor(18,62,62,62); +FBSetColor(19,89,151,89); +FBSetColor(20,141,206,141); +FBSetColor(21,116,184,116); +FBSetColor(22,85,85,85); +FBSetColor(23,72,72,72); +FBSetColor(24,48,48,48); +FBSetColor(25,36,36,36); +FBSetColor(26,24,24,24); +FBSetColor(27,12,12,12); +FBSetColor(28,60,60,60); +FBSetColor(29,145,145,145); +FBSetColor(30,97,97,97); +FBSetColor(31,121,121,121); +FBSetColor(32,109,109,109); +FBSetColor(33,133,133,133); +FBSetColor(34,157,157,157); +FBSetColor(35,170,170,170); +FBSetColor(36,218,218,218); +FBSetColor(37,194,194,194); +FBSetColor(38,206,206,206); +FBSetColor(39,60,60,85); +FBSetColor(40,242,242,242); +FBSetColor(41,242,242,255); +FBSetColor(42,121,121,97); +FBSetColor(43,157,157,133); +FBSetColor(44,242,255,255); +FBSetColor(45,218,218,242); +FBSetColor(46,242,242,133); +FBSetColor(47,255,255,60); +FBSetColor(48,242,242,48); +FBSetColor(49,255,242,48); +FBSetColor(50,255,218,60); +FBSetColor(51,255,206,85); +FBSetColor(52,242,218,206); +FBSetColor(53,206,206,218); +FBSetColor(54,218,218,170); +FBSetColor(55,255,255,0); +FBSetColor(56,255,242,0); +FBSetColor(57,255,206,0); +FBSetColor(58,255,194,60); +FBSetColor(59,242,242,218); +FBSetColor(60,255,255,206); +FBSetColor(61,255,218,0); +FBSetColor(62,255,206,48); +FBSetColor(63,255,242,242); +FBSetColor(64,255,255,170); +FBSetColor(65,255,218,48); +FBSetColor(66,255,242,218); +FBSetColor(67,255,255,242); +FBSetColor(68,157,157,170); +FBSetColor(69,194,194,206); +FBSetColor(70,170,170,206); +FBSetColor(71,85,85,97); +FBSetColor(72,170,170,194); +FBSetColor(73,218,242,255); +FBSetColor(74,157,170,206); +FBSetColor(75,97,97,121); +FBSetColor(76,48,48,36); +FBSetColor(77,133,133,97); +FBSetColor(78,242,242,170); +FBSetColor(79,218,206,194); +FBSetColor(80,194,206,242); +FBSetColor(81,170,170,133); +FBSetColor(82,194,194,121); +FBSetColor(83,157,157,97); +FBSetColor(84,36,36,24); +FBSetColor(85,60,48,48); +FBSetColor(86,85,85,24); +FBSetColor(87,157,157,36); +FBSetColor(88,218,218,48); +FBSetColor(89,206,206,48); +FBSetColor(90,255,242,24); +FBSetColor(91,255,218,24); +FBSetColor(92,242,206,60); +FBSetColor(93,206,194,133); +FBSetColor(94,218,218,121); +FBSetColor(95,242,242,97); +FBSetColor(96,242,242,85); +FBSetColor(97,255,242,60); +FBSetColor(98,242,218,12); +FBSetColor(99,206,170,0); +FBSetColor(100,145,121,12); +FBSetColor(101,72,60,36); +FBSetColor(102,97,97,36); +FBSetColor(103,255,255,12); +FBSetColor(104,255,255,85); +FBSetColor(105,255,242,12); +FBSetColor(106,255,194,0); +FBSetColor(107,242,170,12); +FBSetColor(108,206,170,157); +FBSetColor(109,255,255,24); +FBSetColor(110,218,133,0); +FBSetColor(111,60,60,36); +FBSetColor(112,218,218,0); +FBSetColor(113,255,157,0); +FBSetColor(114,194,97,0); +FBSetColor(115,72,72,48); +FBSetColor(116,72,72,85); +FBSetColor(117,255,170,0); +FBSetColor(118,157,85,0); +FBSetColor(119,97,85,24); +FBSetColor(120,133,121,0); +FBSetColor(121,157,121,0); +FBSetColor(122,194,157,0); +FBSetColor(123,194,133,0); +FBSetColor(124,133,85,0); +FBSetColor(125,121,60,0); +FBSetColor(126,85,48,24); +FBSetColor(127,60,60,48); +FBSetColor(128,109,85,12); +FBSetColor(129,170,121,0); +FBSetColor(130,97,72,0); +FBSetColor(131,72,48,36); +FBSetColor(132,85,145,85); +FBSetColor(133,72,133,72); +FBSetColor(134,48,72,48); +FBSetColor(135,36,48,36); +FBSetColor(136,24,48,24); +FBSetColor(137,60,97,60); +FBSetColor(138,145,206,145); +FBSetColor(139,60,85,60); +FBSetColor(140,0,12,0); +FBSetColor(141,109,182,109); +FBSetColor(142,85,133,85); +FBSetColor(143,97,109,97); +FBSetColor(144,109,170,109); +FBSetColor(145,72,109,72); +FBSetColor(146,12,36,12); +FBSetColor(147,72,121,72); +FBSetColor(148,36,60,36); +FBSetColor(149,97,170,97); +FBSetColor(150,97,157,97); +FBSetColor(151,48,85,48); +FBSetColor(152,60,109,60); +FBSetColor(153,12,24,12); +FBSetColor(154,85,121,85); +FBSetColor(155,48,97,48); +FBSetColor(156,36,72,36); +FBSetColor(157,121,182,121); +FBSetColor(158,133,206,133); +FBSetColor(159,24,36,24); +FBSetColor(160,97,145,97); +FBSetColor(161,60,72,60); +FBSetColor(162,72,97,72); +FBSetColor(163,85,97,109); +FBSetColor(164,48,72,36); +FBSetColor(165,36,48,24); +FBSetColor(166,60,85,48); +FBSetColor(167,85,109,24); +FBSetColor(168,157,170,36); +FBSetColor(169,145,133,12); +FBSetColor(170,72,85,36); +FBSetColor(171,97,109,36); +FBSetColor(172,60,85,36); +FBSetColor(173,97,97,24); +FBSetColor(174,85,60,24); +FBSetColor(175,109,157,109); +FBSetColor(176,109,97,12); +FBSetColor(177,133,194,133); +FBSetColor(178,121,170,121); +FBSetColor(179,209,68,157); +FBSetColor(180,150,35,105); +FBSetColor(181,182,49,132); +FBSetColor(182,68,91,209); +FBSetColor(183,35,51,150); +FBSetColor(184,49,70,182); + + + FBSetupColors(); +} + +int main( ) +{ + struct timeval tv; + int x; + + int fdfb = -1, fdrc = -1; + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + +// Fx2ShowPig( 540, 450, 120, 90 ); + + ladeVerzeichnis(); + Startbildschirm(); + + while( doexit != 3 ) + { + doexit=0; + BoardInitialize(); +#ifdef USEX + FBFlushGrafic(); +#endif + + if ( doexit == 4 ) /* fx2 - install error: no level found */ + { + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + break; + } + + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 10000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + + RcGetActCode( ); + MoveMouse(); + } + + if ( doexit != 3 ) + { + actcode=0xee; + if ( doexit ==2 ) + DrawScore(); + else + DrawGameOver(); + if (level+1 < max_level) + { + level++; + } + else + { + level = 0; + } + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + } + } + +// Fx2StopPig(); + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + freeMem(); + + return 0; +} + +//int plugin_exec( PluginParam *par ) +//{ +// int fd_fb=-1; +// int fd_rc=-1; +// +// for( ; par; par=par->next ) +// { +// if ( !strcmp(par->id,P_ID_FBUFFER) ) +// fd_fb=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_RCINPUT) ) +// fd_rc=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_NOPIG) ) +// fx2_use_pig=!_atoi(par->val); +// } +// return soko_exec( fd_fb, fd_rc, -1, 0 ); +//} diff --git a/archive-sources/sol/colors.h b/archive-sources/sol/colors.h new file mode 100644 index 0000000..615176b --- /dev/null +++ b/archive-sources/sol/colors.h @@ -0,0 +1,16 @@ +/** + * defines some colors used in pics.h + */ + +#ifndef COLORS_H +#define COLORS_H + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define DARK 9 +#define ORANGE 10 + +#endif diff --git a/archive-sources/sol/pics.h b/archive-sources/sol/pics.h new file mode 100644 index 0000000..1590d05 --- /dev/null +++ b/archive-sources/sol/pics.h @@ -0,0 +1,188 @@ +#ifndef PICS_H +#define PICS_H + +// the width and height of the board +#define MAZEW 21 +#define MAZEH 18 + +// the board we are playing on +static unsigned char maze[] =\ +" "\ +" "\ +" ########### "\ +" ####xxx#### "\ +" ####xxx#### "\ +" ####xxx#### "\ +" #xxxxxxxxx# "\ +" #xxxxnxxxx# "\ +" #xxxxxxxxx# "\ +" ####xxx#### "\ +" ####xxx#### "\ +" ####xxx#### "\ +" ########### "\ +" "\ +" "\ +" "\ +" "\ +" "; + +#define g WHITE +#define _ GRAY +#define B BLACK + +// an empty board cell +static unsigned char dout[] = { +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B, +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B, +g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B }; + +#undef _ +#undef g +#undef B + +#define B DARK +#define W WHITE +#define R RED +#define _ GRAY +#define O ORANGE + +// a taken board cell +static unsigned char dtux[] = { +W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W, +W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,B,W,B,W,B,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,W,W,B,W,W,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,W,W,B,W,W,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,B,O,O,O,B,B,B,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,B,O,O,O,O,B,B,B,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,O,B,O,O,B,O,B,B,B,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,B,B,O,B,B,O,W,B,B,B,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,B,B,W,W,O,O,W,W,B,B,B,B,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,B,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,B,B,B,W,W,W,W,W,W,W,B,B,B,B,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,O,B,B,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,O,O,B,W,W,W,W,W,O,O,B,B,O,O,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,O,_,O,O,B,W,W,W,W,W,O,O,O,B,O,O,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,O,O,O,O,O,B,W,W,W,W,W,O,O,O,O,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,O,O,O,O,B,B,B,B,B,B,O,O,O,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,O,O,O,O,B,B,B,_,_,O,O,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +W,W,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B, +W,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B }; + +/* static unsigned char dpin[] = { */ +/* W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W, */ +/* W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,B,W,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,B,W,B,W,W,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,B,B,B,B,W,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,B,B,B,B,B,W,B,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,B,B,O,O,O,B,B,B,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,B,O,O,O,O,O,B,B,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,B,B,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,B,B,O,O,O,W,W,B,B,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,B,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,B,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,B,O,W,W,W,W,W,W,W,O,_,O,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,O,_,O,O,B,W,W,W,W,W,O,O,O,O,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,O,O,O,B,W,W,W,W,W,W,O,O,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,O,O,O,B,B,W,W,B,B,B,O,O,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,O,O,B,B,B,B,B,_,_,O,O,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, */ +/* W,W,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B, */ +/* W,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B }; */ + +// a marked (and therefore taken) board cell +static unsigned char dselectedtux[] = { +R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R, +R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,B,B,W,B,W,B,B,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,B,W,W,B,W,W,B,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,B,W,W,B,W,W,B,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,B,B,B,B,B,B,B,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,B,B,O,O,O,B,B,B,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,B,_,_,_,_,B,B,O,O,O,O,B,B,B,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,B,B,_,_,_,B,O,B,O,O,B,O,B,B,B,_,_,_,_,_,_,B,_,_,R,R, +R,R,_,_,_,_,B,B,B,_,_,B,B,O,B,B,O,W,B,B,B,B,_,_,B,B,B,B,_,_,R,R, +R,R,_,_,_,_,_,B,B,B,B,B,W,W,O,O,W,W,B,B,B,B,B,B,B,B,B,B,_,_,R,R, +R,R,_,_,_,_,_,_,B,B,B,B,W,W,W,W,W,W,W,B,B,B,B,B,B,B,B,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,B,B,B,W,W,W,W,W,W,W,B,B,B,B,B,B,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,B,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,B,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,B,B,W,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,O,B,B,W,W,W,W,W,W,B,B,B,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,O,O,B,W,W,W,W,W,O,O,B,B,O,O,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,O,_,O,O,B,W,W,W,W,W,O,O,O,B,O,O,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,O,O,O,O,O,B,W,W,W,W,W,O,O,O,O,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,O,O,O,O,B,B,B,B,B,B,O,O,O,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,O,O,O,O,B,B,B,_,_,O,O,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R, +R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R, +R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R }; + +#undef W +#undef O +#undef R +#undef _ +#undef B + +#endif diff --git a/archive-sources/sol/sol.cfg b/archive-sources/sol/sol.cfg new file mode 100644 index 0000000..c4a6c22 --- /dev/null +++ b/archive-sources/sol/sol.cfg @@ -0,0 +1,10 @@ +name=Sol +desc=a board game +depend=libfx2.so +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 +pigsize=160x144 +pigpos=440,300 diff --git a/archive-sources/sol/solboard.c b/archive-sources/sol/solboard.c new file mode 100644 index 0000000..a650620 --- /dev/null +++ b/archive-sources/sol/solboard.c @@ -0,0 +1,535 @@ +/* +** initial coding by fx2 +*/ + +// a hugh amount of debug output on stdout +//#define SOLBOARD_DEBUG + +// only 2 tuxes on the board +//#define SOLBOARD_BOARD_DEBUG + +#include +#include + +#include "draw.h" +#include +#include "rcinput.h" +#include "colors.h" +#include "pics.h" + +//#define STATUS_X 80 +//#define STATUS_Y 50 +#define LOGO_X 540 +#define LOGO_Y 80 +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern double sqrt( double in ); + +extern int doexit; + +extern unsigned short actcode; + +static long score = 0; // initial score +static int mouse_x = 7; // initial x coordinate +static int mouse_y = 7; // initial y coordinate +static int tuxes = 44; // initial tux count + +static int selected_x = 0; // x coord of current selection +static int selected_y = 0; // y coord of current selection +static int selection = 0; // if a cell is selected or not + +static struct timeval starttv; // starting time of game + +/** + * Draws the score on the screen + * Score depends on the time needed to end the game and the + * remaining tuxes on the board + */ +void DrawScore( void ) +{ + char tscore[ 64 ]; + struct timeval tv; + gettimeofday(&tv,0); + + score = tv.tv_sec - starttv.tv_sec; + + if ( score > 35000 ) + score=35000; + + score = 35000 - score; + score = score - tuxes *1000; + if (score < 0) { + score = 0; + } + if (tuxes == 1) { + score = 44444; + FBDrawString( 190, 130, 64, "You did it!", WHITE, 0 ); + } + sprintf(tscore,"%ld",score); + FBDrawString( 190, 210, 64, "Score", WHITE, 0 ); + FBDrawString( 190, 290, 64, tscore, WHITE, 0 ); +#ifdef SOLBOARD_DEBUG + printf("draw score %ld\n",score); +#endif + +} + +/** + * Highlights the currently active cell. + */ +static void DrawMouse( void ) +{ +// FBDrawVLine( mouse_x * 32 + 15, mouse_y * 32 + 4, 24, GREEN ); +// FBDrawHLine( mouse_x * 32 + 4, mouse_y * 32 + 15, 24, GREEN ); + FBFillRect( mouse_x * 32 + 4, mouse_y * 32 + 15, 24, 2, GREEN ); + FBFillRect( mouse_x * 32 + 15, mouse_y * 32 + 4, 2, 24, GREEN ); +} + +/** + * Draws a specific cell of the board. The look depends on the content + * of the cell which is stored in maze from pics.h. + * + * Possible values of a field: + * N : nothing + * n,b : empty board cell + * x : board cell with a tux + * s : board cell with a tux which is selected + * + * @param x x-coordinate of the field to draw + * @param y y-coordinate of the field to draw + * @return 0 + */ +static int DrawField( int x, int y ) +{ + unsigned char *p = maze + MAZEW * y + x; + + switch ( *p ) + { + case 'N' : + break; + case 'n' : + case 'b' : + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'x' : + FBCopyImage( x*32, y*32, 32, 32, dtux ); + break; + + case 's': + FBCopyImage( x*32, y*32, 32, 32, dselectedtux ); + break; + + } + return 0; +} + +/** + * Draws the complete board according to the values of the cells + * and the fx logo + * + * Possible field values: + * # : inactive cell (not reachable with mouse) + * ' ' : field which is not on the board + * n,b,B: empty field + * x : cell with a tux + * s : selected cell with a tux + */ +void DrawBoard(void) +{ + int x; + int y; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++, p++ ) + { + switch ( *p ) + { + case '#' : + FBFillRect( x*32, y*32, 32, 32, STEELBLUE ); + break; + case ' ' : + FBFillRect( x*32, y*32, 32, 32, BLACK ); + break; + case 'n' : + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'b' : + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'B' : + FBCopyImage( x*32, y*32, 32, 32, dout ); + break; + case 'x' : + FBCopyImage ( x*32, y*32, 32, 32, dtux ); + break; + case 's' : + FBCopyImage( x*32, y*32, 32, 32, dselectedtux ); + break; + } + } + } + // draw white frame around board + FBDrawRect( 3*32-3, 3*32-3, 9*32+5, 9*32+5, WHITE ); + FBDrawRect( 3*32-4, 3*32-4, 9*32+7, 9*32+7, WHITE ); + + FBDrawString( LOGO_X-90, LOGO_Y, 32, "powered by", WHITE, 0 ); + FBDrawFx2Logo( LOGO_X, LOGO_Y ); + FBDrawString( LOGO_X-90, LOGO_Y+70, 32, + "brought to you by", WHITE, 0 ); + FBDrawString( LOGO_X-80, LOGO_Y+110, 32, + "ChakaZulu", WHITE, 0 ); + gettimeofday(&starttv,0); + + DrawMouse(); +} + +/** + * Initializes the board with tuxes etc. + */ +void BoardInitialize( void ) +{ + int x; + int y; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++, p++ ) + { +#ifdef SOLBOARD_BOARD_DEBUG + // only the cells on the inner field can have + // one of the following values + if ((*p == 'x') || (*p == 's') || + (*p == 'n')) { + // we are on the inner field enclosed by #s + if ((x == 7) && ((y == 7)|| (y == 8))) { + // only put 2 tuxes on the field + *p = 'x'; + } else { + *p = 'n'; + } + } + } + } +#else + // only the cells on the inner field can have + // one of the following values + if ((*p == 'x') || (*p == 's') || + (*p == 'n')) { + // we are on the inner field enclosed by #s + if ((x == 7) && (y == 7)) { + // do not put a tux at the center + *p = 'n'; + } else { + *p = 'x'; + } + } + } + } +#endif + actcode=0xee; + score=0; + mouse_x=7; + mouse_y=7; + tuxes=44; + +} + +/** + * Returns the absolute value of an int + * should be the 34812485493 implementation ;-) + * @param i the value to return the absolute value of + * @return the absolute value of i + */ +int abs(int i) { + return (i > 0 ? i : -i); +} + +/** + * Returns if the field is on the board or not + * + * @param x x coordinate of the field + * @param y y coordinate of the field + * @return 1 if the field is on the board, 0 otherwise + */ +int isFieldOnBoard(int x, int y) { + //areas: + // 1 + // 234 + // 5 + + // areas 1,3,5 + if ( ((y > 2) && (y < 12)) && ((x > 5) && (x < 9)) ) { +#ifdef SOLBOARD_DEBUG + printf("field %d,%d is on board\n",x,y); +#endif + return 1; + } + // fields 2,3,4 + if ( ((y > 5) && (y < 9)) && ((x > 2) && (x < 12)) ) { +#ifdef SOLBOARD_DEBUG + printf("field %d,%d is on board\n",x,y); +#endif + return 1; + } +#ifdef SOLBOARD_DEBUG + printf("fieln %d,%d is *not* on board\n",x,y); +#endif + return 0; + +} + +/** + * Returns if it is allowed to jump with a tux on sel_x,sel_y to + * x,y. As the rules say this is only possible if the movement is + * either horizontal or vertical and if there is exactly one field + * with a tux between sel_x,sel_y and x,y and if x,y is empty. + * + * @precondition a tux is on field sel_x, sel_y + * @param x the x coordinate of the target field + * @param y the y coordinate of the target field + * @param sel_x the x coordinate of the source field + * @param sel_y the y coordinate of the source field + * @param r a pointer to the field between x,y and sel_x, sel_y + * @return 1 if the jump is valid, 0 otherwise + */ +int isValidJumpPtr(int x, int y, int sel_x, int sel_y, unsigned char *r) { + + unsigned char *p = maze + MAZEW*y + x; + + if (isFieldOnBoard(x, y)) { + if ( ( ((x == sel_x) && (abs(y - sel_y) == 2)) || + ((y == sel_y) && (abs(x - sel_x) == 2)) ) && + (*r == 'x') && (*p == 'n') ) { +#ifdef SOLBOARD_DEBUG + printf("jump from %d,%d to %d,%d is valid\n",sel_x,sel_y,x,y); +#endif + return 1; + } else { +#ifdef SOLBOARD_DEBUG + printf("jump from %d,%d to %d,%d *not* valid\n",sel_x,sel_y,x,y); +#endif + return 0; + } + } else { +#ifdef SOLBOARD_DEBUG + printf("jump from %d,%d to %d,%d *not* valid\n",sel_x,sel_y,x,y); +#endif + return 0; + } +} + +/** + * Returns if it is allowed to jump with a tux on sel_x,sel_y to + * x,y. As the rules say this is only possible if the movement is + * either horizontal or vertical and if there is exactly one field + * with a tux between sel_x,sel_y and x,y and if x,y is empty. + * + * @precondition a tux is on field sel_x, sel_y + * @param x the x coordinate of the target field + * @param y the y coordinate of the target field + * @param sel_x the x coordinate of the source field + * @param sel_y the y coordinate of the source field + * @param mid_x the x coordinate of the field between source and target + * @param mid_y the y coordinate of the field between source and target + * @return 1 if the jump is valid, 0 otherwise + */ +int isValidJump(int x, int y, int sel_x, int sel_y, int mid_x, int mid_y) { + + unsigned char *r = maze + MAZEW * mid_y + mid_x; + return isValidJumpPtr(x,y,sel_x,sel_y,r); +} + +/** + * Checks if the game is over (there is no move possible). + * + * @return 0 if there is at least one move to do, 1 otherwise + */ +int isGameOver() { + int result = 1; + int x,y; + if (tuxes == 1) { + return 1; + } else { + unsigned char *p = maze; + // for each tux on the field check if a jump + // in north,east,south,west direction is possible +#ifdef SOLBOARD_DEBUG + printf("begin gamover\n"); +#endif + for (y=0;y +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "solboard.h" +#include "colors.h" +#include "pig.h" +#include "fx2math.h" + +#define SOLBOARD_DEBUG + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +/** + * Sets framebuffer colors according to definitions in colors.h + */ +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 30 ); + FBSetColor( GREEN, 30, 255, 30 ); + FBSetColor( STEELBLUE, 30, 30, 180 ); + FBSetColor( BLUE, 130, 130, 255 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 30, 30, 30 ); + FBSetColor( ORANGE, 255, 199, 15); + + FBSetupColors( ); +} + +/** + * The main loop + * @param fdfb 1 if framebuffer should be used, 0 otherwise + * @param fdrc 1 if remote control should be used, 0 otherwise + * @param fdlcd 1 if lcd should be used, 0 otherwise + * @param cfgfile the config file + * @return 0 + */ +int main( ) +{ + struct timeval tv; + int x; + int fdfb = -1, fdrc = -1; + + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + // 228, 187 +// Fx2ShowPig( 420, 300, 228, 187 ); + + while( doexit != 3 ) + { +#ifdef SOLBOARD_DEBUG + printf("somain: board init\n"); +#endif + BoardInitialize(); + DrawBoard(); + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 10000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + + RcGetActCode( ); + MoveMouse(); +#ifdef USEX + FBFlushGrafic(); +#endif + } + + if ( doexit != 3 ) + { +#ifdef SOLBOARD_DEBUG + printf("somain: actcode=0xee\n"); +#endif + + actcode=0xee; + if ( doexit ==2 ) { +#ifdef SOLBOARD_DEBUG + printf("somain: before DrawScore\n"); +#endif + DrawScore(); + } + else { +#ifdef SOLBOARD_DEBUG + printf("somain: //DrawGameOver()\n"); +#endif + + //DrawGameOver(); + } +#ifdef USEX +#ifdef SOLBOARD_DEBUG + printf("somain: FBFlushGrafic()\n"); +#endif + + FBFlushGrafic(); +#endif + doexit=0; + while(( actcode != RC_GREEN ) && !doexit ) + { +#ifdef SOLBOARD_DEBUG + printf("somain: RC_loop\n"); +#endif + + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + } + } + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + diff --git a/archive-sources/solitair/Block.cpp b/archive-sources/solitair/Block.cpp new file mode 100644 index 0000000..41616d8 --- /dev/null +++ b/archive-sources/solitair/Block.cpp @@ -0,0 +1,72 @@ +// Block.cpp: implementation of the CBlock class. +// +////////////////////////////////////////////////////////////////////// + +#include "Block.h" +extern "C" +{ +#include "draw.h" +} + +#include "backbuffer.h" +#include "Card.h" + +extern int ShowCards; + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CBlock::CBlock() +{ + this->Init(); +} + +CBlock::~CBlock() +{ + +} + +bool CBlock::CheckPushPrecondition(const CCard &_card) +{ + return true; +} + +void CBlock::Init() +{ + RemoveAll(); + this->Fill(); + this->Shuffle(); +} + +void CBlock::Draw(unsigned int _x, unsigned int _y, bool selected ) +{ + BBFillRect( _x - 15, _y-15, 90, 120, BACK_C ); + + for( unsigned char i = 0; this->GetCardsStored() && i <= this->GetCardsStored() / 4; i++ ) + { + cardstack[0].Draw( _x - (i*2), _y - (i*2)); + } + + if( !cards_stored ) + { + CCard::DrawPNM( "fill.pnm", _x, _y ); + } + + /* draw hand */ + if( selected ) + { + CCard::DrawPNM( "pointer.ppm", _x+20, _y+10, false, 0, 0, true ); + } + +} + +bool CBlock::IncreaseSelection() +{ + if( cards_stored && cards_selected < ShowCards ) + { + cards_selected++; + return true; + } + return false; +} diff --git a/archive-sources/solitair/Block.h b/archive-sources/solitair/Block.h new file mode 100644 index 0000000..da9c302 --- /dev/null +++ b/archive-sources/solitair/Block.h @@ -0,0 +1,23 @@ +// Block.h: interface for the CBlock class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __BLOCK_H__ +#define __BLOCK_H__ + +#include "Slot.h" + +class CBlock : public CSlot +{ +public: + bool IncreaseSelection(); + void Draw( unsigned int _x, unsigned int _y, bool selected = false ); + void Init(); + CBlock(); + virtual ~CBlock(); + +private: + bool CheckPushPrecondition( const CCard& _card ); +}; + +#endif // __BLOCK_H__ diff --git a/archive-sources/solitair/Buffer.cpp b/archive-sources/solitair/Buffer.cpp new file mode 100644 index 0000000..8d633fc --- /dev/null +++ b/archive-sources/solitair/Buffer.cpp @@ -0,0 +1,34 @@ +// Buffer.cpp: implementation of the CBuffer class. +// +////////////////////////////////////////////////////////////////////// + +#include "Buffer.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CBuffer::CBuffer() +{ + +} + +CBuffer::~CBuffer() +{ + +} + +bool CBuffer::CheckPushPrecondition(const CCard &_card) +{ + return true; +} + +void CBuffer::Draw(unsigned int _x, unsigned int _y, bool selected ) +{ + /* empty */ +} + +bool CBuffer::IncreaseSelection() +{ +return false; +} diff --git a/archive-sources/solitair/Buffer.h b/archive-sources/solitair/Buffer.h new file mode 100644 index 0000000..c35d2e2 --- /dev/null +++ b/archive-sources/solitair/Buffer.h @@ -0,0 +1,21 @@ +// Buffer.h: interface for the CBuffer class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __BUFFER_H__ +#define __BUFFER_H__ + +#include "Slot.h" + +class CBuffer : public CSlot +{ +public: + bool IncreaseSelection(); + void Draw( unsigned int _x, unsigned int _y, bool selected ); + bool CheckPushPrecondition( const CCard& _card ); + CBuffer(); + virtual ~CBuffer(); + +}; + +#endif // __BUFFER_H__ diff --git a/archive-sources/solitair/Card.cpp b/archive-sources/solitair/Card.cpp new file mode 100644 index 0000000..0c98455 --- /dev/null +++ b/archive-sources/solitair/Card.cpp @@ -0,0 +1,374 @@ +// Card.cpp: implementation of the CCard class. +// +////////////////////////////////////////////////////////////////////// + +#include "Card.h" +#include "math.h" +#include "stdio.h" +#include "string.h" +#include "stdlib.h" +extern "C" +{ +#include "draw.h" +} +#include "colors.h" +#include "pnm_file.h" + +#include "backbuffer.h" + + +#define CARD_WIDTH 74 +#define CARD_HEIGHT 110 + +#define CARD_SPACE 5 +#define CARD_CORNER 15 + + + +char* suits[4] = { "h", "d", "c", "s" }; + +const char* terms[] = +{ + /* 0 */ + "small", + "large", + "face", + + /* 3 */ + "red", + "black", + + /* 5 */ + "border", + "box", + "back", + "ace", + + /* 9 */ + "a", + "k", + "q", + "j", + + /* 13 */ + "t", + "9", + "8", + "7", + "6", + + /* 18 */ + "5", + "4", + "3", + "2" +}; + +#define TRED 3 +#define TBLACK 4 + +#define TLARGE 1 +#define TFACE 2 + +#define TACE 9 + + + +struct card_element +{ + unsigned char term; + bool suit; + unsigned char value; //if suit is false, add value + int dx; + int dy; + bool invert; +}; + + +struct card_def +{ + unsigned char num_of_elements; + + card_element elements[10]; +}; + +card_def cards[13] = +{ + { /* ace */ + 1, + { TLARGE, true, 9, 30,40, false } + }, + { /* king */ + 2, + { + { TFACE, false, 10, 14,10, false }, + { TFACE, false, 10, 58,85, true }, + } + }, + { /* queen */ + 2, + { + { TFACE, false, 10, 14,10, false }, + { TFACE, false, 10, 58,85, true }, + } + }, + { /* jacke */ + 2, + { + { TFACE, false, 10, 14,10, false }, + { TFACE, false, 10, 58,85, true }, + } + }, + { /* 10 */ + 10, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 29,19, false }, + { TLARGE, true, 10, 14,30, false }, + { TLARGE, true, 10, 44,30, false }, + { TLARGE, true, 10, 28,64, true }, + { TLARGE, true, 10, 58,64, true }, + { TLARGE, true, 10, 43,75, true }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 9 */ + 9, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 14,30, false }, + { TLARGE, true, 10, 44,30, false }, + { TLARGE, true, 10, 29,41, false }, + { TLARGE, true, 10, 28,64, true }, + { TLARGE, true, 10, 58,64, true }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 8 */ + 8, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 14,30, false }, + { TLARGE, true, 10, 44,30, false }, + { TLARGE, true, 10, 28,64, true }, + { TLARGE, true, 10, 58,64, true }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 7 */ + 7, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 29,25, false }, + { TLARGE, true, 10, 14,40, false }, + { TLARGE, true, 10, 44,40, false }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 6 */ + 6, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 14,40, false }, + { TLARGE, true, 10, 44,40, false }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 5 */ + 5, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 29,40, false }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 4 */ + 4, + { + { TLARGE, true, 10, 14,10, false }, + { TLARGE, true, 10, 44,10, false }, + { TLARGE, true, 10, 28,84, true }, + { TLARGE, true, 10, 58,84, true }, + } + }, + { /* 3 */ + 3, + { + { TLARGE, true, 10, 29,10, false }, + { TLARGE, true, 10, 29,40, false }, + { TLARGE, true, 10, 43,84, true }, + } + }, + { /* 2 */ + 2, + { + { TLARGE, true, 10, 29,10, false }, + { TLARGE, true, 10, 43,84, true }, + } + }, +}; + + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CCard::CCard() +{ + this->suit = 4; + this->value = 14; + this->face_down = true; +} + +CCard::~CCard() +{ + +} + +/* + returns zerro if values are equal + returns negative for this.value less than parameter.value, + returns positive for this.value greater than parameter.value + + return value is the difference between values +*/ + +int CCard::CompareValue( const CCard& _card ) +{ + return this->value - _card.value; +} + + +bool CCard::IsValid() const +{ + if( 3 >= this->suit ) + if( 12>= this->value ) + return true; + + return false; +} + + + +void CCard::Draw( unsigned int _x, unsigned int _y, bool draw_selected, unsigned char _width, unsigned char _height ) +{ + char filename[255]; + + if( false == this->IsValid() ) return; + + //Draw border + DrawPNM( "border.pnm", _x,_y, false, _width, _height ); + + if( true == face_down ) + { + DrawPNM( "back.pnm", _x+4,_y+4, false, _width, _height ); + return; + } + +/* Draw Corners */ + + strcpy( filename, suit<2?terms[TRED]:terms[TBLACK] ); + strcat( filename, "-" ); + strcat( filename, terms[ 9 + this->value ] ); + strcat( filename, ".pnm" ); + DrawPNM( filename, _x + 3, _y + 4, false ); + DrawPNM( filename, _x + 73 - 3, _y + 97- 4, true ); + + strcpy( filename, "small-" ); + strcat( filename, suits[ suit ] ); + strcat( filename, ".pnm" ); + DrawPNM( filename, _x + 3, _y + 19, false ); + DrawPNM( filename, _x + 73 - 3, _y + 97- 19, true ); + + +/* Draw middle part */ +#define CARD_DEF cards[this->value].elements[i] + + unsigned char i = 0; + + for( i = 0; i < cards[this->value].num_of_elements; i++ ) + { + strcpy( filename, terms[CARD_DEF.term] ); + strcat( filename, "-" ); + if( false == CARD_DEF.suit ) + { + strcat( filename, terms[ 9 + this->value ] ); + } + + strcat( filename, suits[ suit ] ); + + strcat( filename, ".pnm" ); + + DrawPNM( filename, _x + CARD_DEF.dx,_y + CARD_DEF.dy, CARD_DEF.invert ); + } + +} + +int CCard::DrawPNM( + const char* _file_name, + int _x, int _y, + bool invert, /* flip vertical */ + unsigned char _width, unsigned char _height, + bool pbp /* pixel by pixel */ ) +{ + IMAGE* ci = read_image( _file_name ); + + if( ci == NULL ) return 0; + + int current_row = 0; + int drow = ci->width; + int mod = invert?-1:1; + unsigned char transparent = Convert_24_8( 0x20, 0xFF, 0xFF ); + + for( int i = 0; i < ci->height; i++, current_row += drow ) + { + if( pbp ) + { + for( int ipx = 0; ipx < ci->width; ipx++ ) + { + if( transparent != ci->raw_data[current_row + ipx] ) + BBPutPixel( ci->raw_data[current_row + ipx], _x + ipx * mod, _y + i * mod ); + } + + } + else + { + if( !invert ) + { + memcpy( &BBGetData()[(_y + i ) * WIDTH + _x], ci->raw_data + current_row, ci->width ); + } + else + { + for( int ipx = 0; ipx < ci->width; ipx++ ) + { + BBPutPixel( ci->raw_data[current_row + ipx], _x + ipx * mod, _y + i * mod ); + } + } + } + } + + return 0; +} + +bool CCard::Flip() +{ + return this->face_down = !this->face_down; +} + +bool CCard::IsFaceDown() const +{ + return this->face_down; +} diff --git a/archive-sources/solitair/Card.h b/archive-sources/solitair/Card.h new file mode 100644 index 0000000..02e0e30 --- /dev/null +++ b/archive-sources/solitair/Card.h @@ -0,0 +1,53 @@ +// Card.h: interface for the CCard class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __CARD_H__ +#define __CARD_H__ + +#include "pnm_file.h" + +#define BACK_C (Convert_24_8( 0, 100, 70 )) + +class CCard +{ +public: + void Draw(unsigned int _x, unsigned int _y, bool draw_selected = false, unsigned char _width = 0, unsigned char _height = 0 ); + bool IsValid() const; + CCard(); + CCard( unsigned char _suit, unsigned char _value, bool _face_down = true ) + { + this->SetValue( _value ); + this->SetSuit( _suit ); + this->face_down = _face_down; + } + + virtual ~CCard(); + + void SetSuit( unsigned char _suit ) { suit = _suit; } + char GetSuit( ) const { return suit; } + + void SetValue( unsigned char _value ) { value = _value; } + unsigned char GetValue( ) const { return value; } + + int CompareValue( const CCard& _card ); + +private: + + unsigned char suit; + unsigned char value; + bool face_down; + +public: + bool IsFaceDown() const; + bool Flip(); + static int DrawPNM( + const char* _file_name, + int _x, int _y, + bool invert = false, /* flip vertical */ + unsigned char _width = 0, unsigned char _height = 0, + bool pbp = false /* pixel by pixel */ ); + +}; + +#endif // __CARD_H__ diff --git a/archive-sources/solitair/Foundation.cpp b/archive-sources/solitair/Foundation.cpp new file mode 100644 index 0000000..c58bfe1 --- /dev/null +++ b/archive-sources/solitair/Foundation.cpp @@ -0,0 +1,88 @@ +// Foundation.cpp: implementation of the CFoundation class. +// +////////////////////////////////////////////////////////////////////// + + +#include "Foundation.h" +extern "C" +{ +#include "draw.h" +} + +#include "backbuffer.h" + + +CFoundation::CFoundation() +{ + +} + +CFoundation::~CFoundation() +{ + +} + +bool CFoundation::CheckPushPrecondition( const CCard &_card ) +{ + + if( false == CSlot::CheckPushPrecondition( _card ) ) return false; + + if( _card.IsFaceDown() ) return false; + + if( 0 == this->GetCardsStored() && 0 == _card.GetValue() /* ace */ ) + return true; + else + { + /* Get Card from top and put it back */ + CCard tmp = this->PeekCard(); + + if ( + tmp.GetSuit() == _card.GetSuit() && + ( + ( tmp.GetValue() == 0 && -12 == tmp.CompareValue( _card ) ) || + ( tmp.GetValue() != 0 && 1 == tmp.CompareValue( _card ) ) + ) + ) + return true; + else + return false; + } +} + +void CFoundation::Draw(unsigned int _x, unsigned int _y, bool selected ) +{ +// FBFillRect( _x -2, _y, 80, 100, 15 ); + + BBFillRect( _x -2, _y, 80, 100, BACK_C ); + + if( cards_stored ) + { + + for( unsigned char i = 0; i < cards_stored; i++ ) + { + cardstack[ i ].Draw( _x, _y + ( i * 2 ) ); + + } + } + else + { + CCard::DrawPNM( "fill.pnm", _x, _y ); + } + + /* draw hand */ + + if( selected ) + { + CCard::DrawPNM( "pointer.ppm", _x+20, _y+10, false, 0, 0, true ); + } +} + +bool CFoundation::IncreaseSelection() +{ + if( cards_stored && cards_selected == 0 ) + { + cards_selected = 1; + return true; + } + return false; +} diff --git a/archive-sources/solitair/Foundation.h b/archive-sources/solitair/Foundation.h new file mode 100644 index 0000000..9142e8c --- /dev/null +++ b/archive-sources/solitair/Foundation.h @@ -0,0 +1,21 @@ +// Foundation.h: interface for the CFoundation class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __FOUNDATION_H__ +#define __FOUNDATION_H__ + +#include "Slot.h" + +class CFoundation : public CSlot +{ +public: + bool IncreaseSelection(); + void Draw( unsigned _x, unsigned int _y, bool selected = false ); + bool CheckPushPrecondition( const CCard& _card ); + CFoundation(); + virtual ~CFoundation(); + +}; + +#endif // __FOUNDATION_H__ diff --git a/archive-sources/solitair/Hand.cpp b/archive-sources/solitair/Hand.cpp new file mode 100644 index 0000000..89c57ff --- /dev/null +++ b/archive-sources/solitair/Hand.cpp @@ -0,0 +1,70 @@ +// Hand.cpp: implementation of the CHand class. +// +////////////////////////////////////////////////////////////////////// + + +#include "Hand.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +extern "C" +{ +#include "draw.h" +} + +#include "backbuffer.h" + +CHand::CHand() +{ + +} + +CHand::~CHand() +{ + +} + +bool CHand::CheckPushPrecondition(const CCard &_card) +{ + return true; +} + +void CHand::Draw(unsigned int _x, unsigned int _y, bool selected ) +{ +// FBFillRect( _x , _y, 80, 300, 15 ); + + BBFillRect( _x , _y, 80, 300, BACK_C ); + + if( cards_stored ) + { + + for( unsigned char i = 0; i < cards_stored; i++ ) + { + cardstack[ i ].Draw( _x, _y + ( i * 14 ) ); + } + } + else + { + CCard::DrawPNM( "fill.ppm", _x, _y ); + } + +} + +bool CHand::IncreaseSelection() +{ + if( cards_stored && cards_selected < cards_stored ) + { + cards_selected++; + return true; + } + + return false; +} diff --git a/archive-sources/solitair/Hand.h b/archive-sources/solitair/Hand.h new file mode 100644 index 0000000..9c58679 --- /dev/null +++ b/archive-sources/solitair/Hand.h @@ -0,0 +1,29 @@ +// Hand.h: interface for the CHand class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __HAND_H__ +#define __HAND_H__ + +#include "Slot.h" + +class CHand : public CSlot +{ +public: + bool IncreaseSelection(); + void Draw( unsigned int _x, unsigned int _y, bool selected =false ); + bool CheckPushPrecondition( const CCard& _card ); + CHand(); + virtual ~CHand(); + + CSlot* GetSource() { return taken_from;}; + void SetSource( CSlot* _taken_from ) { this->taken_from = _taken_from; } + + +private: + + CSlot* taken_from; + +}; + +#endif // __HAND_H__ diff --git a/archive-sources/solitair/Slot.cpp b/archive-sources/solitair/Slot.cpp new file mode 100644 index 0000000..2b7dd5d --- /dev/null +++ b/archive-sources/solitair/Slot.cpp @@ -0,0 +1,256 @@ +/******************************************************* +* +* Author: the_moon +* Software: Solitair for D-Box +* Created in 2003 +* +********************************************************/ + +#include "Slot.h" +#include +#include "stdlib.h" +#include + +CSlot::CSlot() +{ + this->cards_stored = 0; + this->cards_selected = 0; + this->cardstack = NULL; +} + +CSlot::~CSlot() +{ + if( cardstack ) + { + free(cardstack); + cardstack = NULL; + } + +} + + +/************************************************************ +* +* Function : PushCard +* +* Description: Stored a card in a array +* +* +*************************************************************/ +bool CSlot::PushCard( const CCard& _card, bool no_check ) +{ + + + if( false == _card.IsValid() ) return false; + + + + if( false == no_check ) + if( false == this->CheckPushPrecondition( _card ) ) + return false; + + + + if( 0 == cards_stored ) + { + + cardstack = (CCard*)malloc( sizeof( CCard) ); + } + else + { + + cardstack = (CCard*)realloc( cardstack, sizeof( CCard ) * ( cards_stored + 1 ) ); + } + + cardstack[cards_stored++] = _card; + + return true; + +} + +/************************************************************ +* +* Function : PopCard +* +* Description: removes a card from the array +* if the slot is empty the return value a card +* with illegal values of suit and value +* +* +*************************************************************/ +CCard CSlot::PopCard() +{ + CCard tmp; + + + + if( 0 == cards_stored ) return CCard(); + + + if( cards_selected ) + this->cards_selected--; + + + this->cards_stored--; + + + tmp = this->cardstack[ cards_stored ]; + + if( cards_stored ) + { + + cardstack = (CCard*)realloc( cardstack, sizeof( CCard ) * ( cards_stored ) ); + } + else + { + + free( cardstack ); + cardstack = NULL; + } + + return tmp; +} + + +/************************************************************ +* +* Function : Fill +* +* Description: fills a slot with a full deck +* +* +*************************************************************/ +void CSlot::Fill() +{ + unsigned char suit = 0; + unsigned char value = 0; + + unsigned char i; + + for( i = 0; i < 52; i++ ) + { + if( 13 == value ) + { + value = 0; + suit ++; + } + + this->PushCard( CCard( suit, value++ ), true ); + } +} + +void CSlot::Shuffle() +{ + unsigned char i; + + + srand((unsigned)time(NULL)); + + for( i = 0; i < cards_stored; i++ ) + { + unsigned char pair = rand()%cards_stored; + + CCard tmp = cardstack[pair]; + cardstack[pair] = cardstack[i]; + cardstack[i] = tmp; + } +} + + +/************************************************************ +* +* Function : RemoveAll +* +* Description: Cleans up the slot, frees memory allocated +* +* +*************************************************************/ +void CSlot::RemoveAll() +{ + + + + + this->cards_stored = 0; + if( cardstack ) + { + + free( cardstack ); + cardstack = NULL; + } + + cards_selected = 0; + +} + +/************************************************************ +* +* Function : PeekCard +* +* Description: Retrieves a card on top of the stack whithout +* to remove it from the stack +* +* +*************************************************************/ +CCard CSlot::PeekCard() +{ + if( 0 == cards_stored ) + return CCard(); + + return this->cardstack[ cards_stored - 1 ]; +} + +/************************************************************ +* +* Function : Frcrease selection +* +* Description: Decreases the count of selected cards +* +* +*************************************************************/ +bool CSlot::DecreaseSelection() +{ + if( 0 == cards_selected ) + return false; + + cards_selected--; + return true; +} + +/************************************************************ +* +* Function : GetSelectedCards pops all selected cards +* +* Description: +* +* +*************************************************************/ +void CSlot::GetSelectedCards( CSlot *buffer ) +{ + if( NULL == buffer || 0 == cards_stored ) return; + + buffer->RemoveAll(); + + while( cards_stored && 0 != cards_selected ) + { + CCard tmp = this->PopCard(); + buffer->PushCard( tmp ); + } +} + +void CSlot::PeekAllCards( CSlot *buffer ) +{ + + if( NULL == buffer ) return; + + + buffer->RemoveAll(); + + int i = cards_stored-1; + + + while( 0 <= i ) + { + buffer->PushCard( cardstack[i--] ); + } +} diff --git a/archive-sources/solitair/Slot.h b/archive-sources/solitair/Slot.h new file mode 100644 index 0000000..ac04cd9 --- /dev/null +++ b/archive-sources/solitair/Slot.h @@ -0,0 +1,46 @@ +// Slot.h: interface for the CSlot class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __SLOT_H__ +#define __SLOT_H__ + + +#include "Card.h" + +class CSlot +{ +public: + CSlot(); + virtual ~CSlot(); + +public: + virtual void Draw( unsigned int _x, unsigned int _y, bool selected ) = 0; + + void GetSelectedCards( CSlot* buffer ); + void PeekAllCards( CSlot *buffer ); + virtual bool DecreaseSelection() ; + virtual bool IncreaseSelection()= 0; + + CCard PeekCard(); + void RemoveAll(); + void Shuffle(); + void Fill(); + CCard PopCard(); + bool PushCard( const CCard& _card, bool no_check = false ); + + unsigned char GetCardsStored() { return this->cards_stored; } + + +protected: + + virtual bool CheckPushPrecondition( const CCard& _card ) + { return _card.IsValid(); }; + + unsigned char cards_stored; + unsigned char cards_selected; + CCard* cardstack; + +}; + +#endif // __SLOT_H__ diff --git a/archive-sources/solitair/Table.cpp b/archive-sources/solitair/Table.cpp new file mode 100644 index 0000000..9e0a13b --- /dev/null +++ b/archive-sources/solitair/Table.cpp @@ -0,0 +1,1319 @@ +// Table.cpp: implementation of the CTable class. +// +////////////////////////////////////////////////////////////////////// + + +#include "Table.h" + +extern "C" +{ +#include "rcinput.h" +#include "draw.h" +} + +#include +#include +#include + +#include "pnm_file.h" + +#include "Buffer.h" +#include "backbuffer.h" +#include + +#include + +extern unsigned short actcode; //from rcinput +extern unsigned short realcode; //from rcinput +extern int doexit; + +#define T_ROWS 2 +#define T_COLS 9 + +#define D_LEFT 0 +#define D_UP 1 +#define D_RIGHT 2 +#define D_DOWN 3 + + +#define BLOCK 1 +#define WASTEPILE 2 + +#define HAND 3 + +#define FOUNDATION1 4 +#define FOUNDATION2 5 +#define FOUNDATION3 6 +#define FOUNDATION4 7 + +#define TABLEAU1 8 +#define TABLEAU2 9 +#define TABLEAU3 10 +#define TABLEAU4 11 +#define TABLEAU5 12 +#define TABLEAU6 13 +#define TABLEAU7 14 + +static int win_counter = 0; +int ShowCards = 3; + +CTable::CTable() +{ + this->act_slot = BLOCK; + memset( changed, 0xFF, sizeof( changed ) ); + + Load(); + + BBCreate(); +} + +CTable::~CTable() +{ + Save(); + BBFree(); +} + +void CTable::Init() +{ + + + unsigned char i = 0; + + win_counter = 0; + + BBSetBackground( BACK_C ); + + this->act_slot = BLOCK; + memset( changed, 0xFF, sizeof( changed ) ); + + + block.RemoveAll(); + block.Fill(); + + for( i = 0; i < 7; i++ ) + block.Shuffle(); + + for( i = 0; i < 7; i++ ) + tableau[i].RemoveAll(); + + for( i = 0; i < 4; i++ ) + foundation[i].RemoveAll(); + + hand.RemoveAll(); + + wastepile.RemoveAll(); + + unsigned char filled; + + for( filled = 1; filled < 7; filled++ ) + { + for( i = filled; i < 7 ; i++ ) + { + CCard tmp = block.PopCard(); + tableau[i].PushCard( tmp, true ); + } + } + + for( i = 0; i < 7 ; i++ ) + { + CCard tmp = block.PopCard(); + tmp.Flip(); + tableau[i].PushCard( tmp, true ); + } + + act_slot = BLOCK; + + ChangeSelection( true ); + +} + +void CTable::MoveCursor(unsigned char _direction) +{ + this->ChangeSelection( false ); + + switch( act_slot ) + { + case BLOCK : + switch( _direction ) + { + case D_LEFT: act_slot = FOUNDATION4; break; + case D_RIGHT: act_slot = WASTEPILE; break; + case D_UP: act_slot = TABLEAU1; break; + case D_DOWN: act_slot = TABLEAU1; break; + } break; + case WASTEPILE : + switch( _direction ) + { + case D_LEFT: act_slot = BLOCK; break; + case D_RIGHT: act_slot = FOUNDATION1; break; + case D_UP: act_slot = TABLEAU1; break; + case D_DOWN: act_slot = TABLEAU1; break; + } break; + case FOUNDATION1 : + switch( _direction ) + { + case D_LEFT: act_slot = WASTEPILE; break; + case D_RIGHT: act_slot = FOUNDATION2; break; + case D_UP: act_slot = TABLEAU4; break; + case D_DOWN: act_slot = TABLEAU4; break; + } break; + case FOUNDATION2 : + switch( _direction ) + { + case D_LEFT: act_slot = FOUNDATION1; break; + case D_RIGHT: act_slot = FOUNDATION3; break; + case D_UP: act_slot = TABLEAU5; break; + case D_DOWN: act_slot = TABLEAU5; break; + } break; + case FOUNDATION3 : + switch( _direction ) + { + case D_LEFT: act_slot = FOUNDATION2; break; + case D_RIGHT: act_slot = FOUNDATION4; break; + case D_UP: act_slot = TABLEAU6; break; + case D_DOWN: act_slot = TABLEAU6; break; + } break; + case FOUNDATION4 : + switch( _direction ) + { + case D_LEFT: act_slot = FOUNDATION3; break; + case D_RIGHT: act_slot = BLOCK; break; + case D_UP: act_slot = TABLEAU7; break; + case D_DOWN: act_slot = TABLEAU7; break; + } break; + case TABLEAU1 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU7; break; + case D_RIGHT: act_slot = TABLEAU2; break; + case D_UP: act_slot = WASTEPILE; break; + case D_DOWN: act_slot = WASTEPILE; break; + } break; + case TABLEAU2 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU1; break; + case D_RIGHT: act_slot = TABLEAU3; break; + case D_UP: act_slot = WASTEPILE; break; + case D_DOWN: act_slot = WASTEPILE; break; + } break; + case TABLEAU3 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU2; break; + case D_RIGHT: act_slot = TABLEAU4; break; + case D_UP: act_slot = FOUNDATION1; break; + case D_DOWN: act_slot = FOUNDATION1; break; + } break; + case TABLEAU4 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU3; break; + case D_RIGHT: act_slot = TABLEAU5; break; + case D_UP: act_slot = FOUNDATION1; break; + case D_DOWN: act_slot = FOUNDATION1; break; + } break; + case TABLEAU5 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU4; break; + case D_RIGHT: act_slot = TABLEAU6; break; + case D_UP: act_slot = FOUNDATION2; break; + case D_DOWN: act_slot = FOUNDATION2; break; + } break; + case TABLEAU6 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU5; break; + case D_RIGHT: act_slot = TABLEAU7; break; + case D_UP: act_slot = FOUNDATION3; break; + case D_DOWN: act_slot = FOUNDATION3; break; + } break; + case TABLEAU7 : + switch( _direction ) + { + case D_LEFT: act_slot = TABLEAU6; break; + case D_RIGHT: act_slot = TABLEAU1; break; + case D_UP: act_slot = FOUNDATION4; break; + case D_DOWN: act_slot = FOUNDATION4; break; + } break; + } + + + this->ChangeSelection( true ); +} + +void CTable::Save() +{ + FILE* sav = fopen( GAMESDIR "/solitair.sav", "wb" ); + + if( sav == NULL ) return; + + fwrite( &ShowCards, 1, sizeof( ShowCards ), sav ); + + fwrite( &win_counter, 1, sizeof( win_counter ), sav ); + + //Save BLOCK + unsigned char CardsStored = block.GetCardsStored(); + + fwrite( &CardsStored, 1, sizeof( CardsStored ), sav ); + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + CCard card = block.PopCard(); + fwrite( &card, 1, sizeof( card ), sav ); + } + + //save WASTEPILE + CardsStored = wastepile.GetCardsStored(); + + fwrite( &CardsStored, 1, sizeof( CardsStored ), sav ); + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + CCard card = wastepile.PopCard(); + fwrite( &card, 1, sizeof( card ), sav ); + } + + //Save HAND + int HSource = 0; + + if( &block == hand.GetSource() ) + { + HSource = BLOCK; + } + else + if( &wastepile == hand.GetSource() ) + { + HSource = WASTEPILE; + } + else + if( &foundation[0] == hand.GetSource() ) + { + HSource = FOUNDATION1; + } + else + if( &foundation[1] == hand.GetSource() ) + { + HSource = FOUNDATION2; + } + else + if( &foundation[2] == hand.GetSource() ) + { + HSource = FOUNDATION3; + } + else + if( &foundation[3] == hand.GetSource() ) + { + HSource = FOUNDATION4; + } + else + if( &tableau[0] == hand.GetSource() ) + { + HSource = TABLEAU1; + } + else + if( &tableau[1] == hand.GetSource() ) + { + HSource = TABLEAU2; + } + else + if( &tableau[2] == hand.GetSource() ) + { + HSource = TABLEAU3; + } + else + if( &tableau[3] == hand.GetSource() ) + { + HSource = TABLEAU4; + } + else + if( &tableau[4] == hand.GetSource() ) + { + HSource = TABLEAU5; + } + else + if( &tableau[5] == hand.GetSource() ) + { + HSource = TABLEAU6; + } + else + if( &tableau[6] == hand.GetSource() ) + { + HSource = TABLEAU7; + } + + fwrite( &HSource, 1, sizeof( HSource ), sav ); + + CardsStored = hand.GetCardsStored(); + + fwrite( &CardsStored, 1, sizeof( CardsStored ), sav ); + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + CCard card = hand.PopCard(); + fwrite( &card, 1, sizeof( card ), sav ); + } + + //Save Tableaus + for( int j = 0; j < 7; j++ ) + { + CardsStored = tableau[j].GetCardsStored(); + + fwrite( &CardsStored, 1, sizeof( CardsStored ), sav ); + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + CCard card = tableau[j].PopCard(); + fwrite( &card, 1, sizeof( card ), sav ); + } + } + + //Save Foundations + for( int j = 0; j < 4; j++ ) + { + CardsStored = foundation[j].GetCardsStored(); + + fwrite( &CardsStored, 1, sizeof( CardsStored ), sav ); + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + CCard card = foundation[j].PopCard(); + fwrite( &card, 1, sizeof( card ), sav ); + } + } + + fclose( sav ); + +} + +void CTable::Load() +{ + int SavShowCards = 0; + + FILE* sav = fopen( GAMESDIR "/solitair.sav", "rb" ); + + if( sav == NULL ) return; + + fread( &SavShowCards, 1, sizeof( SavShowCards ), sav ); + + if( ( SavShowCards != 3 ) && ( SavShowCards != 1 ) ) + { + return; + } + + ShowCards = SavShowCards; + + fread( &win_counter, 1, sizeof( win_counter ), sav ); + + CCard card; + unsigned char CardsStored; + CBuffer buffer; + + +//Restore BLOCK + + block.RemoveAll(); + + fread( &CardsStored, 1, sizeof( CardsStored ), sav ); + + buffer.RemoveAll(); + for( unsigned char i = 0; i < CardsStored; i++ ) + { + fread( &card, 1, sizeof( card ), sav ); + buffer.PushCard( card, true ); + } + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + block.PushCard( buffer.PopCard(), true ); + } + +//Restore Wastepile + fread( &CardsStored, 1, sizeof( CardsStored ), sav ); + + buffer.RemoveAll(); + for( unsigned char i = 0; i < CardsStored; i++ ) + { + fread( &card, 1, sizeof( card ), sav ); + buffer.PushCard( card, true ); + } + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + wastepile.PushCard( buffer.PopCard(), true ); + } +//Restore HAND + int HSource; + fread( &HSource, 1, sizeof( HSource ), sav ); + + switch( HSource ) + { + case 0: + hand.SetSource(NULL); + break; + case BLOCK: + hand.SetSource(&block); + break; + case WASTEPILE: + hand.SetSource(&wastepile); + break; + case FOUNDATION1: + hand.SetSource(&foundation[0]); + break; + case FOUNDATION2: + hand.SetSource(&foundation[1]); + break; + case FOUNDATION3: + hand.SetSource(&foundation[2]); + break; + case FOUNDATION4: + hand.SetSource(&foundation[3]); + break; + case TABLEAU1: + hand.SetSource(&tableau[0]); + break; + case TABLEAU2: + hand.SetSource(&tableau[1]); + break; + case TABLEAU3: + hand.SetSource(&tableau[2]); + break; + case TABLEAU4: + hand.SetSource(&tableau[3]); + break; + case TABLEAU5: + hand.SetSource(&tableau[4]); + break; + case TABLEAU6: + hand.SetSource(&tableau[5]); + break; + case TABLEAU7: + hand.SetSource(&tableau[6]); + break; + } + + + fread( &CardsStored, 1, sizeof( CardsStored ), sav ); + + buffer.RemoveAll(); + for( unsigned char i = 0; i < CardsStored; i++ ) + { + fread( &card, 1, sizeof( card ), sav ); + buffer.PushCard( card, true ); + } + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + hand.PushCard( buffer.PopCard(), true ); + } + +//Restore Tableaus + for( int j = 0; j < 7; j++ ) + { + fread( &CardsStored, 1, sizeof( CardsStored ), sav ); + + buffer.RemoveAll(); + for( unsigned char i = 0; i < CardsStored; i++ ) + { + fread( &card, 1, sizeof( card ), sav ); + buffer.PushCard( card, true ); + } + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + tableau[j].PushCard( buffer.PopCard(), true ); + } + } +//Restore Foundations + for( int j = 0; j < 4; j++ ) + { + fread( &CardsStored, 1, sizeof( CardsStored ), sav ); + + buffer.RemoveAll(); + for( unsigned char i = 0; i < CardsStored; i++ ) + { + fread( &card, 1, sizeof( card ), sav ); + buffer.PushCard( card, true ); + } + + for( unsigned char i = 0; i < CardsStored; i++ ) + { + foundation[j].PushCard( buffer.PopCard(), true ); + } + } + + + fclose( sav ); + +} + + +int CTable::Run() +{ + + BBSetBackground( BACK_C ); + + FBCopyImage( 0, 0, WIDTH, HEIGHT, BBGetData() ); + + FBDrawString( 300, 255, 42, "Loading...", 250, 0 ); + + //Outer loop for initialization + while( 0 == doexit ) + { + +// this->Init(); + + this->Display(); + + //Inner loop for game controlling + while( 0 == doexit ) + { + //Handle keys + this->HandleKeysPressed(); + + if( 0 != doexit ) break; + + //Display changes + } + } + + return 0; +} + +void CTable::ShowHelp() +{ + + const int Hx = 100; + const int Hy = 100; + const int Hwidth = 520; + const int Hheight = 376; + + FBFillRect( Hx+8, Hy+8, Hwidth, Hheight, Convert_24_8( 0,0,0) ); + FBFillRect( Hx, Hy, Hwidth, Hheight, 19 ); + + FBDrawHLine( Hx + 5, Hy + 55, 400, Convert_24_8( 255,255,255) ); + FBDrawHLine( Hx + 5, Hy + 56, 400, Convert_24_8( 255,255,255) ); + + FBDrawString( Hx + 5, Hy + 5, 48, "Solitair for D-BOX", Convert_24_8( 255,255,255), 0 ); + + FBDrawString( Hx + 5, Hy + 60, 32, "TheMoon, 2003", Convert_24_8( 255,255,255), 0 ); + + FBDrawString( Hx + 5, Hy + 102, 32, "Key mappings:", Convert_24_8( 255,255,255), 0 ); + + FBDrawString( Hx + 5, Hy + 135, 32, "(Red)", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 135, 32, "- Restart game", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 5, Hy + 168, 32, "(Blue)", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 168, 32, "- Wizard", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 5, Hy + 201, 32, "(?)", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 201, 32, "- Help screen", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 5, Hy + 234, 32, "(Home)", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 234, 32, "- Exit", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 5, Hy + 267, 32, "(1 - 7)", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 267, 32, "- Tableau", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 5, Hy + 300, 32, "(-) (+)", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 300, 32, "- Change selection", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 5, Hy + 333, 32, "DBOX", Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 105, Hy + 333, 32, "- Setup menu", Convert_24_8( 255,255,255), 0 ); + + + +} + +bool CTable::Setup() +{ + const int Hx = 100; + const int Hy = 100; + const int Hwidth = 520; + const int Hheight = 376; + + bool SomeChanges = true; + bool FirstRun = true; + + int loiShowCards = ShowCards; + + while( 1 ) + { + timeval tv; + + tv.tv_sec = 0; + tv.tv_usec = 60000; + select( 0, 0, 0, 0, &tv ); /* 60ms pause */ + + RcGetActCode(); + + if( false == FirstRun && realcode == 0xee ) continue; + + switch( actcode ) + { + case RC_OK : + ShowCards = loiShowCards; + return true; + break; + case RC_RIGHT : + case RC_LEFT : + if( 3 == loiShowCards ) + loiShowCards = 1; + else + loiShowCards = 3; + + SomeChanges = true; + break; + case RC_SETUP : + if( FirstRun ) break; + RcGetActCode(); + return false; + break; + } + + if( SomeChanges ) + { + unsigned char FC = Convert_24_8( 0,0,128); + unsigned char BC = Convert_24_8( 255,255,0); + + if( FirstRun ) + { + FBFillRect( Hx+8, Hy+8, Hwidth, Hheight, Convert_24_8( 0,0,0) ); + FBFillRect( Hx, Hy, Hwidth, Hheight, 19 ); + } + + FBDrawHLine( Hx + 5, Hy + 55, 400, Convert_24_8( 255,255,255) ); + FBDrawHLine( Hx + 5, Hy + 56, 400, Convert_24_8( 255,255,255) ); + + FBDrawString( Hx + 5, Hy + 5, 48, "Setup", Convert_24_8( 255,255,255), 0 ); + + FBDrawString( Hx + 5, Hy + 102, 32, "Open cards:", Convert_24_8( 255,255,255), 0 ); + + + FBFillRect( Hx + 150, Hy + 102, 100, 32, loiShowCards==3?BC:19 ); + FBFillRect( Hx + 260, Hy + 102, 100, 32, loiShowCards==1?BC:19 ); + + FBDrawString( Hx + 160, Hy + 102, 32, "3 Cards", + loiShowCards==3?FC:Convert_24_8( 255,255,255), 0 ); + FBDrawString( Hx + 270, Hy + 102, 32, "1 Card", + loiShowCards==1?FC:Convert_24_8( 255,255,255), 0 ); + + FBDrawString( Hx + 5, Hy + 333, 24, "(OK) - Accept changes, (DBOX) - Cancel", Convert_24_8( 255,255,255), 0 ); + + } + + SomeChanges = false; + FirstRun = false; + } + return false; +} + +void CTable::HandleKeysPressed() +{ + static bool HelpOnScreen = false; + static bool MenuOnScreen = false; + + timeval tv; + + tv.tv_sec = 0; + tv.tv_usec = 60000; + select( 0, 0, 0, 0, &tv ); /* 60ms pause */ + + RcGetActCode(); + + if( realcode == 0xee ) return; + + if( true == HelpOnScreen ) + { + FBCopyImage( 0, 0, WIDTH, HEIGHT, BBGetData() ); + HelpOnScreen = false; + return; + } + + switch( actcode ) + { + case RC_0 : + + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ BLOCK ] = true; + act_slot = BLOCK; + ChangeSelection( ); + + + break; + case RC_1 : + + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU1 ] = true; + act_slot = TABLEAU1; + ChangeSelection( true, false ); + + break; + case RC_2 : + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU2 ] = true; + act_slot = TABLEAU2; + ChangeSelection( true, false ); + + break; + case RC_3 : + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU3 ] = true; + act_slot = TABLEAU3; + ChangeSelection( true, false ); + + break; + case RC_4 : + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU4 ] = true; + act_slot = TABLEAU4; + ChangeSelection( true, false ); + + break; + case RC_5 : + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU5 ] = true; + act_slot = TABLEAU5; + ChangeSelection( true, false ); + + break; + case RC_6 : + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU6 ] = true; + act_slot = TABLEAU6; + ChangeSelection( true, false ); + + break; + case RC_7 : + ChangeSelection( false ); + changed[ act_slot ] = true; + changed[ TABLEAU7 ] = true; + act_slot = TABLEAU7; + ChangeSelection( true, false ); + + break; + case RC_8 : + + break; + case RC_9 : + + break; + case RC_RIGHT : + this->MoveCursor( 2 ); + break; + case RC_LEFT : + this->MoveCursor( 0 ); + break; + case RC_UP : + this->MoveCursor( 1 ); + break; + case RC_DOWN : + this->MoveCursor( 3 ); + break; + case RC_OK : + this->DoAction(); + break; + case RC_SPKR : + break; + + case RC_STANDBY : + + break; + case RC_GREEN : + + break; + case RC_YELLOW : +// FBPrintScreen(); + break; + case RC_RED : + this->Init(); + break; + case RC_BLUE : + Wizard(); + break; + case RC_PLUS : + changed[ act_slot ] = true; + ChangeSelection( true, false ); + break; + case RC_MINUS : + changed[ act_slot ] = true; + ChangeSelection( false, false ); + break; + case RC_HELP : + + this->ShowHelp(); + HelpOnScreen = true; + + break; + case RC_SETUP : + if( this->Setup() ) + this->Init(); + FBCopyImage( 0, 0, WIDTH, HEIGHT, BBGetData() ); + break; + case RC_HOME : + + + break; + case RC_PAGE_DOWN : + + break; + case RC_PAGE_UP : + + break; + + default: +// + return; + + break; + } + +this->Display(); + +actcode = 0; + +} + + +#define TOP 50 +#define LEFT 50 + +void CTable::Display() +{ + + bool some_changes = false; + + if( changed[ BLOCK ] ) + { +// + some_changes = true; + block.Draw( LEFT + 15, TOP, BLOCK == act_slot ); + } + + if( changed[ WASTEPILE ] ) + { + wastepile.Draw( LEFT + 95, TOP, WASTEPILE == act_slot ); + some_changes = true; + } + + int i; + + for( i = 0; i < 4; i++ ) + { + if( changed[ FOUNDATION1 + i ] ) + { + foundation[i].Draw( LEFT+(4+i)*80, TOP, (FOUNDATION1 + i) == act_slot ); + some_changes = true; + } + } + + if( changed[ HAND ] ) + { + hand.Draw( LEFT, TOP + 150 ); + some_changes = true; + } + + for( i = 0; i < 7; i++ ) + { + if( changed[ TABLEAU1 + i ] ) + { + tableau[i].Draw( LEFT+(1+i)*80, TOP + 150, (TABLEAU1 + i) == act_slot ); + some_changes = true; + } + } + + memset( changed, 0, sizeof( changed ) ); + + if( some_changes ) + FBCopyImage( 0, 0, WIDTH, HEIGHT, BBGetData() ); +} + +//automaticly select all possible cards or deselect all cards +void CTable::ChangeSelection(bool select, bool select_all ) +{ + + CSlot* sel_slot = NULL; + + changed[ act_slot ] = true; + + switch( act_slot ) + { + case BLOCK : sel_slot = █ break; + case WASTEPILE : sel_slot = &wastepile; break; + case FOUNDATION1 : + case FOUNDATION2 : + case FOUNDATION3 : + case FOUNDATION4 : sel_slot = &foundation[act_slot - FOUNDATION1]; break; + case TABLEAU1 : + case TABLEAU2 : + case TABLEAU3 : + case TABLEAU4 : + case TABLEAU5 : + case TABLEAU6 : + case TABLEAU7 : sel_slot = &tableau[act_slot - TABLEAU1]; break; + } + + if( sel_slot ) + { + if( select_all ) + { + if( select ) + while( sel_slot->IncreaseSelection() ); + else + while( sel_slot->DecreaseSelection() ); + } + else + { + if( select ) + sel_slot->IncreaseSelection(); + else + sel_slot->DecreaseSelection(); + } + } +} + +void CTable::DoAction() +{ + + CBuffer buffer; + CCard tmp; + + CSlot* fnd = NULL; + CSlot* tab = NULL; + + switch( act_slot ) + { + case BLOCK : + /* move 3 cards to wastepile */ + + //check IncreaseSelection and DecreaseSelection + //regarding increaseSelection (all) or (+1) + + if( 0 != hand.GetCardsStored() ) return; + + buffer.RemoveAll(); + + if( block.GetCardsStored() != 0 ) + { + tmp = block.PopCard(); + tmp.Flip(); + wastepile.PushCard( tmp ); + + if( 3 == ShowCards ) + { + tmp = block.PopCard(); + tmp.Flip(); + wastepile.PushCard( tmp ); + + tmp = block.PopCard(); + tmp.Flip(); + wastepile.PushCard( tmp ); + } + + act_slot = WASTEPILE; + + } + else + { + if( wastepile.GetCardsStored() ) + { + tmp = wastepile.PopCard(); + + while( tmp.IsValid() ) + { + tmp.Flip(); + block.PushCard( tmp, true ); + tmp = wastepile.PopCard(); + } + + } + } + changed[ WASTEPILE ] = true; + changed[ BLOCK ] = true; + + ChangeSelection( ); + + return; + + case WASTEPILE : + /* put one card to hand */ + /* or put back from the hand */ + + if( hand.GetCardsStored() ) + { + if( hand.GetSource() == &wastepile ) + { + tmp = hand.PopCard(); + wastepile.PushCard( tmp, true ); + + hand.SetSource( NULL ); + } + + } + else + { + tmp = wastepile.PopCard(); + if( false == tmp.IsValid() ) break; + + if( false == hand.PushCard( tmp ) ) + { + wastepile.PushCard( tmp, true ); + } + + hand.SetSource( &wastepile ); + } + + changed[ WASTEPILE ] = true; + changed[ HAND ] = true; + + return; + + case FOUNDATION1 : + case FOUNDATION2 : + case FOUNDATION3 : + case FOUNDATION4 : fnd = &foundation[act_slot - FOUNDATION1]; break; + case TABLEAU1 : + case TABLEAU2 : + case TABLEAU3 : + case TABLEAU4 : + case TABLEAU5 : + case TABLEAU6 : + case TABLEAU7 : tab = &tableau[act_slot - TABLEAU1]; break; + } + + if( fnd ) + { + if( 0 == hand.GetCardsStored() ) + { + + tmp = fnd->PopCard(); + + if( false == tmp.IsValid() ) return; + + hand.PushCard( tmp ); + + hand.SetSource( fnd ); + changed[ act_slot ] = true; + changed[ HAND ] = true; + + CheckWin( false ); + + ChangeSelection( ); + + return; + } + else + { + if( fnd == hand.GetSource() ) + { + tmp = hand.PopCard(); + + fnd->PushCard( tmp, true ); + + changed[ act_slot ] = true; + changed[ HAND ] = true; + + CheckWin( true ); + + ChangeSelection( ); + + return; + } + else + { + tmp = hand.PeekCard(); + + + if( false == fnd->PushCard( tmp ) ) return; + + hand.RemoveAll(); + + changed[HAND] = true; + changed[act_slot] = true; + + CheckWin( true ); + + + ChangeSelection(); + + return; + } + } + + } + + if( tab ) + { + if( 0 == hand.GetCardsStored() ) + { + tmp = tab->PeekCard(); + + if( tmp.IsValid() && tmp.IsFaceDown() ) + { + tmp = tab->PopCard(); + tmp.Flip(); + tab->PushCard( tmp, true ); + changed[ act_slot ] = true; + ChangeSelection(); + return; + } + + tab->GetSelectedCards( &buffer ); + + tmp = buffer.PopCard(); + + while( tmp.IsValid() ) + { + hand.PushCard( tmp ); + tmp = buffer.PopCard(); + } + + hand.SetSource( tab ); + changed[ act_slot ] = true; + changed[ HAND ] = true; + + ChangeSelection( ); + + return; + } + else + { + + if( tab == hand.GetSource() ) + { + + + hand.PeekAllCards( &buffer ); + + hand.RemoveAll(); + + + tmp = buffer.PopCard(); + + while( tmp.IsValid() ) + { + + tab->PushCard( tmp, true ); + + tmp = buffer.PopCard(); + } + changed[ act_slot ] = true; + changed[ HAND ] = true; + + + ChangeSelection( ); + + + return; + } + else + { + + + hand.PeekAllCards( &buffer ); + + + tmp = buffer.PopCard(); + + + if( false == tab->PushCard( tmp ) ) return; + + + tmp = buffer.PopCard(); + + while( tmp.IsValid() ) + { + + tab->PushCard( tmp ); + + tmp = buffer.PopCard(); + } + + + hand.RemoveAll(); + + changed[HAND] = true; + changed[act_slot] = true; + + ChangeSelection(); + + return; + } + } + } + +} + +/* takes top card from the slot and movies it (if possible) to the foundation */ +void CTable::Wizard() +{ + + CBuffer buffer; + CCard tmp; + + CSlot* slot = NULL; + + if( hand.GetCardsStored() ) return; + + + unsigned char prev_slot = act_slot; + + switch( act_slot ) + { + case BLOCK : this->DoAction(); break; + case WASTEPILE : slot = &wastepile; break; + case FOUNDATION1 : slot = &foundation[0]; break; + case FOUNDATION2 : slot = &foundation[1]; break; + case FOUNDATION3 : slot = &foundation[2]; break; + case FOUNDATION4 : slot = &foundation[3]; break; + case TABLEAU1 : slot = &tableau[0]; break; + case TABLEAU2 : slot = &tableau[1]; break; + case TABLEAU3 : slot = &tableau[2]; break; + case TABLEAU4 : slot = &tableau[3]; break; + case TABLEAU5 : slot = &tableau[4]; break; + case TABLEAU6 : slot = &tableau[5]; break; + case TABLEAU7 : slot = &tableau[6]; break; + } + + if( slot ) + { + tmp = slot->PeekCard(); + + if( false == tmp.IsValid() ) return; + + for( unsigned char i = 0; i < 4; i++ ) + { + if( foundation[i].PushCard( tmp ) ) + { + changed[ FOUNDATION1 + i ] = true; + changed[ prev_slot ] = true; + + slot->PopCard(); + + CheckWin( true ); + + return; + } + } + } +} + + +void CTable::CheckWin( bool _add ) +{ + + if( _add ) + win_counter++; + else + win_counter--; + + + + if( win_counter == 52 ) + { + this->Init(); + } +} + diff --git a/archive-sources/solitair/Table.h b/archive-sources/solitair/Table.h new file mode 100644 index 0000000..5bfa6eb --- /dev/null +++ b/archive-sources/solitair/Table.h @@ -0,0 +1,56 @@ +// Table.h: interface for the CTable class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __TABLE_H__ +#define __TABLE_H__ + +#include "Block.h" +#include "Hand.h" +#include "Tableau.h" +#include "Foundation.h" +#include "Wastepile.h" + + +class CTable +{ +public: + int Run(); + CTable(); + virtual ~CTable(); + +private: + + void ShowHelp(); + void CheckWin( bool _add ); + void Wizard(); + void DoAction(); + void MoveCursor( unsigned char _direction ); + void Init(); + void Display(); + bool Setup(); + void Save(); + void Load(); + + + + unsigned char act_slot; + void HandleKeysPressed(); + + CHand hand; + + CBlock block; + + CWastepile wastepile; + + CFoundation foundation[4]; + + CTableau tableau[7]; + + bool changed[15]; + +protected: + void ChangeSelection( bool select = true, bool select_all = true ); +}; + +#endif // __TABLE_H__ diff --git a/archive-sources/solitair/Tableau.cpp b/archive-sources/solitair/Tableau.cpp new file mode 100644 index 0000000..222ffe0 --- /dev/null +++ b/archive-sources/solitair/Tableau.cpp @@ -0,0 +1,171 @@ +// Tableau.cpp: implementation of the CTableau class. +// +////////////////////////////////////////////////////////////////////// + + +#include "Tableau.h" +#include "Buffer.h" +extern "C" +{ +#include "draw.h" +} + +#include "backbuffer.h" + +CTableau::CTableau() +{ + +} + +CTableau::~CTableau() +{ + +} + +bool CTableau::CheckPushPrecondition(const CCard &_card) +{ + + if( false == CSlot::CheckPushPrecondition( _card ) ) return false; + + + /* 0 and 1 - red suit */ + /* 2 and 3 - black suit */ + + /* + 0 - ace + 1 - king + 2 - queen + 3 - jack + 4 - 10 + 5 - 9 + 6 - 8 + 7 - 7 + 8 - 6 + */ + + //Get a card from the top + if( this->cards_stored == 0 ) + { + if( _card.IsFaceDown() ) + return true; + + if( 1 == _card.GetValue() ) /* king */ + return true; + else + return false; + } + else + { + CCard tmp = this->PeekCard(); + + if + ( false == _card.IsFaceDown() && + -1 == tmp.CompareValue( _card ) && + ( + ( tmp.GetSuit() < 2 && _card.GetSuit() > 1 ) || + ( tmp.GetSuit() > 1 && _card.GetSuit() < 2 ) + ) + ) + return true; + else + return false; + } +} + +void CTableau::OpenCard() +{ + if( this->cardstack[ cards_stored-1 ].IsFaceDown() ) + this->cardstack[ cards_stored-1 ].Flip(); +} + +void CTableau::Draw( unsigned int _x, unsigned int _y, bool selected ) +{ + + unsigned char i = 0; + unsigned char closed = 0; + + BBFillRect( _x -2, _y, 80, 350, BACK_C ); + + for( i = 0; i < cards_stored; i++ ) + { + cardstack[i].Draw( _x , _y + (5 * closed ) + (20 * (i - closed )), false, 0,cardstack[i].IsFaceDown()?5:0 ); + if( cardstack[i].IsFaceDown() ) closed ++; + } + + i--; + + if( cards_stored && cards_stored == closed-- ) + { + cardstack[i].Draw( _x , _y + (5 * closed ) + (20 * (i - closed )), false, 0,0 ); + } + + if( !cards_stored ) + { + CCard::DrawPNM( "fill.pnm", _x, _y ); + } + + /* draw hand */ + + if( selected ) + { + + closed = 0; + for( i = 0; cards_stored && i < cards_stored - cards_selected + 1 ; i++ ) + { + if( cardstack[i].IsFaceDown() ) closed ++; + } + + if( cards_stored ) + CCard::DrawPNM( "pointer.ppm", + _x + 20, + _y + ( 5 * closed ) + ( 20 * ( i - 1 - closed ) ), + false, 0, 0, true ); + else + CCard::DrawPNM( "pointer.ppm", _x + 20, _y + 2, false, 0, 0, true ); + + + } +// else +// CCard::DrawPNM( "pointer.ppm", _x + 20, _y + 2, false, 0, 0, true ); + +} + +bool CTableau::IncreaseSelection() +{ + if( cards_stored == 0 || cards_selected == cards_stored ) return false; + + if( false == cardstack[ cards_stored - cards_selected - 1].IsFaceDown() ) + { + cards_selected++; + return true; + } + + return false; + +} + +bool CTableau::DecreaseSelection() +{ + if( cards_stored == 0 ) + { + cards_selected = 0; + return false; + } + + if( cardstack[ cards_stored - 1 ].IsFaceDown() ) + { + cards_selected = 0; + return false; + } + + if( 1 == cards_selected ) + return false; + + cards_selected--; + return true; +} + + +//End of file + + diff --git a/archive-sources/solitair/Tableau.h b/archive-sources/solitair/Tableau.h new file mode 100644 index 0000000..eac8cc3 --- /dev/null +++ b/archive-sources/solitair/Tableau.h @@ -0,0 +1,23 @@ +// Tableau.h: interface for the CTableau class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __TABLEAU_H__ +#define __TABLEAU_H__ + +#include "Slot.h" + +class CTableau : public CSlot +{ +public: + bool DecreaseSelection() ; + bool IncreaseSelection(); + void Draw( unsigned int _x, unsigned int _y, bool selected = false ); + void OpenCard(); + bool CheckPushPrecondition( const CCard& _card ); + CTableau(); + virtual ~CTableau(); + +}; + +#endif // __TABLEAU_H__ diff --git a/archive-sources/solitair/Wastepile.cpp b/archive-sources/solitair/Wastepile.cpp new file mode 100644 index 0000000..22ae126 --- /dev/null +++ b/archive-sources/solitair/Wastepile.cpp @@ -0,0 +1,76 @@ +// Wastepile.cpp: implementation of the CWastepile class. +// +////////////////////////////////////////////////////////////////////// + + +#include "Wastepile.h" +extern "C" +{ +#include "draw.h" +} + +#include "backbuffer.h" + +extern int ShowCards; + +CWastepile::CWastepile() +{ + +} + +CWastepile::~CWastepile() +{ + +} + +bool CWastepile::CheckPushPrecondition(const CCard &_card) +{ + if( false == CSlot::CheckPushPrecondition( _card ) ) return false; + + if( _card.IsFaceDown() ) return false; + + return true; +} + +void CWastepile::Draw(unsigned int _x, unsigned int _y, bool selected ) +{ + unsigned char i = 0; + + BBFillRect( _x - 1, _y-1, 105, 100, BACK_C ); + + if( this->cards_stored ) + { + for( ; i < cards_stored ; i++ ) + { + unsigned char modificator = ( (i%ShowCards)?(i%ShowCards):0 ); + cardstack[i].Draw( _x + ( 15 * modificator ), _y ); + } + } + else + { + CCard::DrawPNM( "fill.pnm", _x, _y ); + } + + /* draw hand */ + + if( selected ) + { + if( 0 == this->cards_stored ) + CCard::DrawPNM( "pointer.ppm", _x + 20, _y+10, false, 0, 0, true ); + else + CCard::DrawPNM( "pointer.ppm", _x + ( 15 * ( ((i-1)%ShowCards)?((i-1)%ShowCards):0 ) ) + 20, _y+10, false, 0, 0, true ); + } +} + +bool CWastepile::IncreaseSelection() +{ + if( cards_stored && 0 == cards_selected ) + { + cards_selected = 1; + return true; + } + else + return false; +} + + diff --git a/archive-sources/solitair/Wastepile.h b/archive-sources/solitair/Wastepile.h new file mode 100644 index 0000000..0b3256f --- /dev/null +++ b/archive-sources/solitair/Wastepile.h @@ -0,0 +1,23 @@ +// Wastepile.h: interface for the CWastepile class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef __WASTEPILE_H__ +#define __WASTEPILE_H__ + + +#include "Slot.h" + +class CWastepile : public CSlot +{ +public: + bool IncreaseSelection(); + void Draw( unsigned int _x, unsigned int _y, bool selected = false ); + CWastepile(); + virtual ~CWastepile(); + +private: + bool CheckPushPrecondition( const CCard& _card ); +}; + +#endif //__WASTEPILE_H__ diff --git a/archive-sources/solitair/backbuffer.cpp b/archive-sources/solitair/backbuffer.cpp new file mode 100644 index 0000000..33d5fae --- /dev/null +++ b/archive-sources/solitair/backbuffer.cpp @@ -0,0 +1,38 @@ +#include "backbuffer.h" +#include "string.h" + + +unsigned char* backbuffer = NULL; + +void BBCreate() +{ + backbuffer = new unsigned char[WIDTH * HEIGHT]; +} + +void BBFree() +{ + delete [] backbuffer; +} + + +void BBSetBackground( unsigned char color ) +{ + memset( backbuffer, color, WIDTH*HEIGHT ); +} + +void BBFillRect( int _x, int _y, int _width, int _height, unsigned char color ) +{ + int spos = _y * WIDTH + _x; + + for( int i = 0; i < _height; i++, spos += WIDTH ) + { + if( spos >= (WIDTH*HEIGHT) || (spos + _width) >= ( WIDTH*HEIGHT ) ) return; + + memset( backbuffer + spos, color, _width ); + } +} + +unsigned char* BBGetData( ) +{ + return backbuffer; +} diff --git a/archive-sources/solitair/backbuffer.h b/archive-sources/solitair/backbuffer.h new file mode 100644 index 0000000..6446204 --- /dev/null +++ b/archive-sources/solitair/backbuffer.h @@ -0,0 +1,21 @@ +#ifndef __BACKBUFFER__ +#define __BACKBUFFER__ + +#define WIDTH 720 +#define HEIGHT 576 + +void BBCreate(); +void BBFree(); + +extern unsigned char* backbuffer; + +inline void BBPutPixel( unsigned char color, int x, int y ) +{ + backbuffer[ y * WIDTH + x ] = color; +} + +void BBSetBackground( unsigned char color ); +void BBFillRect( int _x, int _y, int _width, int _height, unsigned char color ); +unsigned char* BBGetData( ); + +#endif /*__BACKBUFFER__*/ diff --git a/archive-sources/solitair/colors.h b/archive-sources/solitair/colors.h new file mode 100644 index 0000000..f6d4db1 --- /dev/null +++ b/archive-sources/solitair/colors.h @@ -0,0 +1,14 @@ +#ifndef __COLORS_H__ +#define __COLORS_H__ + + +#define COL_TABLE 1 + +#define COL_BLACK 2 +#define COL_WHITE 3 +#define COL_RED 4 + + + +#endif //__COLORS_H__ + diff --git a/archive-sources/solitair/pnm_file.cpp b/archive-sources/solitair/pnm_file.cpp new file mode 100644 index 0000000..6d426e9 --- /dev/null +++ b/archive-sources/solitair/pnm_file.cpp @@ -0,0 +1,224 @@ +#include "pnm_file.h" + +#include +#include +#include +extern "C" +{ +#include "draw.h" +} + +static int n_images = 0; +static int n_last_empty = 0; +static IMAGE* images = NULL; + +static unsigned char Index[6][7][6]; + +void Set_8Bit_Pal(void) +{ + int r,g,b; + int ctr=0; + for (r=0;r<6;r++) + for (g=0;g<7;g++) + for (b=0;b<6;b++) + { + FBSetColorEx( ctr, (r*51),(unsigned char)(g*42.5),(b*51), + ( r == ((int)(0/57)) && g == ((int)(100/42.5)) && b == ((int)(70/51)) )?60:0 ); + Index[r][g][b]=ctr; + ctr++; + } + + FBSetupColors(); + +} + + +unsigned char Convert_24_8(unsigned char r, unsigned char g, unsigned char b) +{ + r/=51; + g = (unsigned char)(g / 42.5); + b/=51; + return Index[r][g][b]; +} + +static PNM_FILE* pnm_open( const char* _file_name ) +{ + unsigned char i = 0; + + for( i = 0; pnm_files[i].file_name; i++ ) + { + if( 0 == strcmp( _file_name, pnm_files[i].file_name ) ) + { + PNM_FILE* file = (PNM_FILE*)malloc( sizeof( PNM_FILE ) ); + + *file = pnm_files[i]; + + return file; + } + } + + return NULL; +} + + +int pnm_getc( PNM_FILE* _file ) +{ + int tmp_counter = _file->rle_counter > 0x80?_file->rle_counter-0x80:_file->rle_counter; + + + if( NULL == _file ) return -2; + + if( _file->lenght == _file->current_position ) + { + return PNM_EOF; + } + + if( tmp_counter == _file->current_rle_pos ) + { + if( _file->rle_counter > 0x80 ) + _file->current_position++; + + if( _file->lenght == _file->current_position ) + { + return PNM_EOF; + } + + _file->rle_counter = (int)_file->body[ _file->current_position++ ]; + _file->current_rle_pos = 0; + } + + if( _file->rle_counter > 0x80 ) + { + _file->current_rle_pos++; + return (int)_file->body[ _file->current_position ]; + } + else + { + _file->current_rle_pos++; + return (int)_file->body[ _file->current_position++ ]; + } +} + + +int pnm_close( PNM_FILE* _file ) +{ + if( NULL == _file ) return -2; + + free( _file ); + + return 0; +} + +IMAGE* read_image( const char* _file_name ) +{ + + if( n_images == 0 ) + { + + for( n_images = 0; pnm_files[n_images].file_name; n_images++ ); + + images = new IMAGE[n_images]; + } + + PNM_FILE* pf = pnm_open( _file_name ); + + if( pf == NULL ) return NULL; + + //search in image pool + for( int i = 0; i < n_last_empty; i++ ) + { + if( 0 == strcmp(pf->file_name, images[i].pnm_file->file_name ) ) + { + return &images[i]; + } + } + + memset( &images[n_last_empty], 0, sizeof( IMAGE ) ); + + images[n_last_empty].pnm_file = pf; + + unsigned char i, j; + long cur = 0; + long file_size = 0; + int buffer, r,g,b; + + char str[5]; + + i = 0; + while( PNM_EOF != ( buffer = pnm_getc( pf ) ) ) + { + if( buffer <= 0x20 || i == 5 ) + { + str[i] = '\0'; + break; + } + + str[i++] = buffer; + } + + if( strcmp( "P6", str ) ) + { + pnm_close( pf ); + return NULL; // error, expected "P6" + } + + //read WIDTH value + i = 0; + while( PNM_EOF != ( buffer = pnm_getc( pf ) ) ) + { + if( buffer <= 0x20 || i == 5 ) + { + str[i] = '\0'; +// some_changes = true; + break; + } + str[i++] = buffer; + } + + images[n_last_empty].width = atoi( str ); + + //read HEIGHT value + i = 0; + while( PNM_EOF != ( buffer = pnm_getc( pf ) ) ) + { + if( buffer <= 0x20 || i == 5 ) + { + str[i] = '\0'; + break; + } + str[i++] = buffer; + } + + images[n_last_empty].height = atoi( str ); + + //read MAXCOLOR value + i = 0; + while( PNM_EOF != ( buffer = pnm_getc( pf ) ) ) + { + if( buffer <= 0x20 || i == 5 ) + { + str[i] = '\0'; + break; + } + str[i++] = buffer; + } + + if( false == images[n_last_empty].AllocateRawData() ) + { + return NULL; + } + + cur = 0; + while( PNM_EOF != ( r = pnm_getc( pf ) ) && + PNM_EOF != ( g = pnm_getc( pf ) ) && + PNM_EOF != ( b = pnm_getc( pf ) ) + ) + { + unsigned char cidx = Convert_24_8( r,g,b ); + images[n_last_empty].raw_data[ cur++ ] = cidx; + } + + return &images[n_last_empty++]; +} + + diff --git a/archive-sources/solitair/pnm_file.h b/archive-sources/solitair/pnm_file.h new file mode 100644 index 0000000..7870796 --- /dev/null +++ b/archive-sources/solitair/pnm_file.h @@ -0,0 +1,68 @@ +#ifndef __PNM_FILE_H__ +#define __PNM_FILE_H__ + +#define PNM_EOF -1 + +#include + + + +struct PNM_FILE +{ + char* file_name; + unsigned char* body; + unsigned int lenght; + unsigned int current_position; + unsigned char current_rle_pos; + unsigned char rle_counter; +}; + +struct IMAGE +{ + int width; + int height; + unsigned char* raw_data; + PNM_FILE* pnm_file; + + IMAGE( ) + { + width = 0; + height = 0; + raw_data = NULL; + pnm_file = NULL; + } + + ~IMAGE( ) + { + if( raw_data != NULL ) + { + delete [] raw_data; + + } + } + + bool AllocateRawData() + { + if( width == 0 || height == 0 ) return false; + + if( raw_data != NULL ) + { + delete [] raw_data; + + } + + raw_data = new unsigned char[ width*height]; + + if( raw_data == NULL ) return false; + } +}; + +int pnm_getc( PNM_FILE* _file ); +int pnm_close( PNM_FILE* _file ); +IMAGE* read_image( const char* file_name ); + +extern PNM_FILE pnm_files[]; +void Set_8Bit_Pal(void); +unsigned char Convert_24_8(unsigned char r, unsigned char g, unsigned char b); + +#endif /* __CARDS_H__ */ diff --git a/archive-sources/solitair/pnm_res.cpp b/archive-sources/solitair/pnm_res.cpp new file mode 100644 index 0000000..fd040a4 --- /dev/null +++ b/archive-sources/solitair/pnm_res.cpp @@ -0,0 +1,5347 @@ +#include "pnm_file.h" + +//this file is generated by build_c.pl + +PNM_FILE pnm_files[] = +{ + { + "ace.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x31\x20\x34\x39\x0A\x32\x82\x35\x01\x0A\xBC\xFF" + "\x83\x00\xF5\xFF\x83\xC0\x83\x00\x83\xC0\xF2\xFF\x83\x80\x83\x00\x83" + "\x80\xEF\xFF\x83\xC0\x89\x00\x83\xC0\xEC\xFF\x83\x80\x89\x00\x83\x80" + "\xEC\xFF\x8F\x00\xE9\xFF\x83\x80\x8F\x00\x83\x80\xE3\xFF\x83\xC0\x95" + "\x00\x83\xC0\xE0\xFF\x83\x80\x95\x00\x83\x80\xDD\xFF\x83\x80\x9B\x00" + "\x83\x80\xD7\xFF\x83\x80\xA1\x00\x83\x80\xD1\xFF\x83\xC0\xA7\x00\x83" + "\xC0\xCE\xFF\x83\x80\xA7\x00\x83\x80\xCB\xFF\x83\x80\xAD\x00\x83\x80" + "\xC5\xFF\x83\x80\xB3\x00\x83\x80\xBF\xFF\x83\x80\xB9\x00\x83\x80\xB9" + "\xFF\x83\x80\xBF\x00\x83\x80\xB3\xFF\x83\x80\xC5\x00\x83\x80\xAD\xFF" + "\x83\x80\xCB\x00\x83\x80\xA7\xFF\x83\xC0\xD1\x00\x83\xC0\xA1\xFF\x83" + "\xC0\x92\x00\x83\xC0\x89\xFF\x89\x00\x83\xC0\x89\xFF\x83\xC0\x86\x00" + "\x83\xFF\x98\x00\x83\xC0\x9B\xFF\x83\xC0\x95\x00\x83\xFF\x92\x00\x83" + "\xFF\x89\x00\x83\xFF\x86\x00\x83\xFF\x9B\x00\x83\xC0\x95\xFF\x83\xC0" + "\x98\x00\x83\xFF\x92\x00\x83\xFF\x89\x00\x83\xFF\x86\x00\x83\xFF\x9E" + "\x00\x83\xC0\x92\xFF\x83\x80\x98\x00\x83\xFF\x92\x00\x83\xFF\x89\x00" + "\x83\xFF\x86\x00\x83\xFF\x9E\x00\x83\x80\x8F\xFF\x83\xC0\x9B\x00\x83" + "\xFF\x86\x00\x83\xFF\x83\xC0\x86\x00\x8C\xFF\x83\xC0\x86\x00\x83\xFF" + "\xA1\x00\x83\xC0\x8C\xFF\x83\x80\x9B\x00\x83\xFF\x89\x00\x83\xFF\x86" + "\x00\x83\xFF\x92\x00\x83\xFF\xA1\x00\x83\x80\x89\xFF\x83\xC0\x9E\x00" + "\x83\xFF\x89\x00\x83\xFF\x86\x00\x83\xFF\x92\x00\x83\xFF\xA4\x00\x83" + "\xC0\x86\xFF\x83\x80\x9E\x00\x83\xC0\x89\xFF\x83\xC0\x86\x00\x83\xFF" + "\x92\x00\x83\xC0\x89\xFF\x9B\x00\x83\x80\x86\xFF\xF5\x00\x83\xFF\x83" + "\xC0\xF5\x00\x83\xC0\x83\x80\xF5\x00\x83\x80\xFF\x00\xFF\x00\xFF\x00" + "\xA7\x00\x83\x80\x8F\x00\x83\x80\xB3\x00\x83\x80\xAD\x00\x83\x80\x83" + "\xFF\x8F\x00\x83\xFF\x83\x80\xAD\x00\x83\x80\x83\xC0\xAD\x00\x83\xC0" + "\x83\xFF\x8F\x00\x83\xFF\x83\xC0\xAD\x00\x83\xC0\x83\xFF\xAA\x00\x83" + "\x80\x86\xFF\x8F\x00\x86\xFF\x83\x80\xAA\x00\x86\xFF\x83\xC0\xA7\x00" + "\x83\xC0\x86\xFF\x8F\x00\x86\xFF\x83\xC0\xA7\x00\x83\xC0\x89\xFF\x83" + "\x80\xA1\x00\x83\x80\x86\xFF\x83\xC0\x8F\x00\x83\xC0\x86\xFF\x83\x80" + "\xA1\x00\x83\x80\x8F\xFF\x83\x80\x9B\x00\x83\x80\x89\xFF\x83\xC0\x8F" + "\x00\x83\xC0\x89\xFF\x83\x80\x9B\x00\x83\x80\x95\xFF\x83\x80\x95\x00" + "\x83\x80\x8C\xFF\x83\x80\x8F\x00\x83\x80\x8C\xFF\x83\x80\x95\x00\x83" + "\x80\x9B\xFF\x83\xC0\x83\x80\x89\x00\x83\x80\x83\xC0\x8F\xFF\x95\x00" + "\x8F\xFF\x83\xC0\x83\x80\x89\x00\x83\x80\x83\xC0\xBF\xFF\x83\xC0\x95" + "\x00\x83\xC0\xE0\xFF\x83\x80\x95\x00\x83\x80\xE0\xFF\x9B\x00\xDD\xFF" + "\x83\x80\x9B\x00\x83\x80\xD7\xFF\x83\x80\xA1\x00\x83\x80\xD1\xFF\x83" + "\x80\xA7\x00\x83\x80\xA7\xFF" + , //body + 619, //lenght + 0, + 0, + 0, + }, + { + "back.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x36\x35\x20\x38\x39\x0A\x32\x82\x35\x7F\x0A\xDE\x84" + "\x52\xFF\xA5\x6B\xDE\x84\x42\xDE\x73\x42\xCE\x7B\x4A\xBD\x63\x29\xC6" + "\x73\x42\xBD\x63\x29\xA5\x52\x21\xA5\x52\x21\x9C\x63\x39\xA5\x52\x10" + "\x8C\x5A\x31\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x8C\x39" + "\x08\x7B\x42\x18\x8C\x39\x08\xA5\x52\x10\xA5\x52\x21\xA5\x52\x10\x8C" + "\x5A\x31\xA5\x52\x21\xBD\x6B\x21\xBD\x6B\x39\xB5\x7B\x52\xBD\x63\x29" + "\xB5\x7B\x52\xC6\x73\x42\xE7\x94\x5A\xE7\x94\x5A\xCE\x8C\x63\x7B\x42" + "\x18\x52\x21\x08\xE7\x8C\x52\xF7\x8C\x52\xE7\x8C\x52\xDE\x73\x42\xDE" + "\x73\x42\xF7\x8C\x52\x7F\xFF\x9C\x52\xF7\x8C\x52\xD6\x7B\x5A\xB5\x7B" + "\x52\x8C\x39\x08\xBD\x6B\x39\xBD\x6B\x39\xF7\x8C\x63\xE7\x7B\x52\xE7" + "\x8C\x52\xE7\x94\x5A\xE7\x8C\x52\xDE\x73\x42\xE7\x7B\x52\xE7\x94\x5A" + "\xE7\x7B\x52\xDE\x73\x42\xDE\x73\x42\xDE\x84\x52\xEF\x94\x5A\xE7\x8C" + "\x52\xE7\x94\x5A\x9C\x63\x39\xCE\x7B\x4A\xEF\xA5\x6B\xEF\x94\x5A\xFF" + "\xA5\x5A\xDE\x84\x42\xE7\x94\x5A\xC6\x73\x42\xFF\xB5\x7B\xFF\xA5\x6B" + "\xCE\x8C\x63\xFF\xC6\x73\xFF\xC6\x73\xDE\xA5\x52\xFF\xAD\x73\xFF\xC6" + "\x73\xD6\x9C\x73\xFF\xA5\x6B\xEF\x9C\x63\xFF\xA5\x5A\xDE\x2B\x84\x52" + "\xFF\xB5\x6B\xFF\xB5\x7B\xEF\xA5\x6B\xFF\xA5\x5A\xFF\xB5\x7B\xFF\xB5" + "\x7B\xEF\x9C\x63\xFF\xA5\x6B\xE7\x8C\x52\xE7\x8C\x52\xDE\x84\x42\xD6" + "\x9C\x73\xBD\x6B\x39\xFF\xB5\x82\x7B\x7F\x42\x18\x9C\x63\x39\xE7\x94" + "\x5A\xD6\x73\x29\xBD\x5A\x18\xDE\x73\x42\xE7\x7F\x42\xD6\x73\x29\xF7" + "\x9C\x73\xDE\x73\x42\xE7\x7F\x42\xDE\x73\x42\xAD\x6B\x42\x7B\x42\x18" + "\xBD\x63\x29\xE7\x7B\x52\xBD\x5A\x18\xF7\x9C\x73\xDE\x73\x42\xE7\x8C" + "\x52\xEF\x94\x5A\xCE\x7B\x4A\xE7\x8C\x52\xE7\x8C\x52\xE7\x8C\x52\xE7" + "\x8C\x52\xDE\x84\x42\xE7\x8C\x52\xC6\x73\x42\xF7\x9C\x63\x9C\x63\x39" + "\xFF\xA5\x6B\xE7\x7F\x42\xEF\x94\x5A\xEF\x9C\x63\xE7\x7F\x42\xDE\x84" + "\x42\xFF\xC6\x73\xF7\xB5\x84\xEF\xA5\x6B\xF7\x9C\x63\xFF\xA5\x6B\xFF" + "\xB5\x7F\x7B\xCE\x7B\x4A\xFF\xCE\x8C\xFF\xCE\x8C\xFF\xC6\x63\xEF\xA5" + "\x6B\xFF\xC6\x73\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xC6\x63\xEF\xA5\x6B\xFF" + "\xCE\x8C\xA5\x52\x10\xFF\xCE\x8C\x52\x21\x08\xF7\x9C\x63\xDE\x84\x42" + "\xE7\x8C\x52\xE7\x8C\x52\xFF\xB5\x7B\xE7\x8C\x52\xD6\x73\x29\xCE\x7B" + "\x4A\xA5\x52\x21\x7B\x42\x18\xE7\x7B\x52\xDE\x73\x42\xD6\x73\x29\xDE" + "\x73\x42\xF7\x8C\x52\xF7\x8C\x42\xF7\x9C\x63\xF7\x8C\x63\xF7\x8C\x63" + "\xBD\x6B\x39\xB5\x7B\x52\x7B\x42\x18\xC6\x7B\x5A\xE7\x7B\x52\xDE\x73" + "\x42\xF7\x9C\x73\xDE\x73\x42\xDE\x84\x52\x7F\xF7\x8C\x52\xE7\x7F\x42" + "\xFF\x9C\x52\xDE\x84\x52\xF7\x9C\x63\xE7\x8C\x52\xE7\x8C\x52\xFF\x9C" + "\x52\xDE\x73\x42\xEF\xA5\x73\xAD\x6B\x42\xCE\x7B\x4A\xDE\x73\x42\xDE" + "\x84\x52\xBD\x63\x29\xE7\x7F\x42\xEF\x94\x5A\xBD\x6B\x21\xBD\x6B\x21" + "\xE7\x8C\x52\xDE\x84\x42\xFF\xC6\x73\xF7\xB5\x84\xFF\xC6\x73\xBD\x7B" + "\x29\xBD\x63\x29\xDE\x84\x52\xDE\x84\x52\xE7\x94\x5A\xFF\xB5\x7B\xD6" + "\x7B\x39\xDE\x84\x42\xCE\x7B\x31\xE7\xA5\x5A\xD6\x9C\x73\xA5\x52\x21" + "\xF7\x9C\x73\xFF\xAD\x73\xBD\x63\x29\xD6\x9C\x73\xA5\x52\x21\x8C\x5A" + "\x31\xFF\x04\xB5\x7B\xFF\xCE\x82\x8C\x7F\x39\x08\x8C\x5A\x31\x8C\x39" + "\x08\xF7\x8C\x52\xBD\x6B\x39\xBD\x6B\x39\xF7\x8C\x63\xE7\x7F\x42\xF7" + "\x8C\x52\xF7\x8C\x52\xE7\x7F\x42\xF7\x8C\x52\xFF\x9C\x52\xD6\x9C\x73" + "\x8C\x39\x08\xE7\x94\x5A\xE7\x8C\x52\xBD\x5A\x18\xD6\x73\x29\xD6\x73" + "\x29\xF7\x8C\x63\xE7\x7F\x42\xE7\x7F\x42\xFF\x9C\x52\xF7\x8C\x52\xDE" + "\x84\x52\xDE\x84\x42\xE7\x8C\x52\xEF\x94\x42\xEF\x94\x5A\xF7\x9C\x63" + "\xBD\x6B\x39\xE7\xA5\x5A\xB5\x7B\x52\xA5\x52\x21\xFF\xCE\x8C\xDE\x84" + "\x42\xDE\x84\x42\xEF\x9C\x63\xFF\xA5\x6B\xEF\x94\x5A\xEF\xA5\x6B\xEF" + "\x94\x7F\x5A\xFF\xA5\x6B\xFF\xCE\x8C\xC6\x73\x42\xF7\xDE\xB1\xC6\x73" + "\x42\xF7\xB5\x84\x52\x21\x08\xE7\x8C\x52\xDE\x73\x42\xFF\xB5\x6B\xFF" + "\xB5\x7B\x9C\x63\x39\xEF\x9C\x63\xA5\x52\x21\xB5\x7B\x52\xCE\x7B\x4A" + "\x9C\x63\x39\xE7\x8C\x52\xCE\x8C\x63\x8C\x39\x08\xD6\x9C\x73\xCE\x7B" + "\x4A\x7B\x42\x18\x8C\x39\x08\x9C\x63\x39\xD6\x7B\x5A\xAD\x6B\x42\xA5" + "\x52\x21\xA5\x52\x21\xA5\x52\x21\xEF\x94\x5A\xDE\x84\x52\xE7\x8C\x52" + "\xDE\x73\x42\xD6\x7B\x5A\xE7\x7F\x42\x7B\x42\x18\xBD\x6B\x39\xE7\x7B" + "\x52\xBD\x6B\x39\xBD\x63\x29\xDE\x73\x42\x7F\xBD\x63\x29\xFF\x9C\x52" + "\xE7\x7B\x52\xF7\x8C\x52\xEF\x94\x5A\xDE\x84\x42\xEF\xA5\x6B\xEF\x94" + "\x5A\xFF\xA5\x6B\xC6\x73\x42\xEF\x9C\x63\xCE\x8C\x63\xEF\xA5\x6B\x7B" + "\x42\x18\x8C\x39\x08\xA5\x52\x21\xEF\xA5\x73\xE7\x94\x5A\xCE\x7B\x4A" + "\x9C\x63\x39\xEF\x94\x5A\xEF\x9C\x63\xEF\x9C\x63\xE7\x94\x5A\x8C\x39" + "\x08\xBD\x63\x29\xFF\xC6\x73\x9C\x63\x39\xEF\x9C\x63\x7B\x42\x18\xFF" + "\xA5\x6B\xBD\x6B\x39\xCE\x8C\x63\xDE\xA5\x52\xBD\x7B\x29\xDE\x84\x52" + "\x9C\x63\x39\xBD\x7B\x29\xEF\xA5\x73\xA5\x52\x21\xFF\xB5\x7B\x9C\x63" + "\x39\xFF\x7F\xC6\x73\x7B\x42\x18\xF7\xDE\xB1\x52\x21\x08\xB5\x7B\x52" + "\x7B\x42\x18\xC6\x7B\x5A\x9C\x63\x39\xBD\x9C\x6B\xCE\x8C\x63\xFF\xF7" + "\xDE\x9C\x63\x39\x7B\x42\x18\xCE\x7B\x4A\xCE\x7B\x4A\xD6\x73\x29\xE7" + "\x7B\x52\xB5\x7B\x52\xCE\x7B\x4A\xCE\x7B\x4A\xC6\x73\x42\xBD\x63\x29" + "\xC6\x73\x42\xE7\x7F\x42\xD6\x73\x29\xBD\x63\x29\xC6\x73\x42\xBD\x63" + "\x29\xDE\x84\x52\xC6\x73\x42\xC6\x73\x42\xC6\x73\x42\xC6\x73\x42\xC6" + "\x73\x42\xCE\x7B\x4A\xCE\x7B\x4A\xC6\x7B\x5A\xB5\x7B\x52\xE7\x94\x5A" + "\xA5\x52\x21\xFF\xCE\x8C\xA5\x52\x21\xFF\xCE\x82\x8C\x7F\x39\x08\xEF" + "\xA5\x73\xE7\x94\x5A\xCE\x8C\x63\xEF\x94\x5A\xC6\x73\x42\xDE\x84\x52" + "\xDE\x84\x52\xE7\x8C\x52\xEF\x9C\x63\xEF\xA5\x73\xBD\x7B\x29\xBD\x6B" + "\x39\xD6\x73\x29\xBD\x6B\x21\xF7\x9C\x63\xDE\x84\x52\xCE\x7B\x4A\xE7" + "\x8C\x52\xE7\x7F\x42\xEF\x9C\x63\xFF\xA5\x5A\xDE\x73\x42\xF7\x8C\x52" + "\xCE\x7B\x4A\xDE\x84\x52\x9C\x63\x39\xBD\x9C\x6B\xAD\x6B\x42\xD6\x9C" + "\x73\xF7\xDE\xB1\xFF\xF7\xDE\xF7\xDE\xB1\xF7\xDE\xB1\xFF\xF7\xDE\xD6" + "\x9C\x73\xBD\x6B\x39\xFF\xA5\x6B\xF7\xB5\x84\x9C\x63\x39\x52\x21\x08" + "\xDE\x84\x52\xDE\x84\x7F\x52\xFF\xAD\x73\xEF\xA5\x6B\xFF\xAD\x73\xFF" + "\xAD\x73\xFF\xB5\x7B\xEF\x9C\x63\xF7\x9C\x63\xDE\x84\x52\xE7\x8C\x52" + "\xF7\x9C\x63\xDE\x73\x42\xBD\x6B\x39\xC6\x73\x42\x9C\x63\x39\xAD\x6B" + "\x42\xBD\x6B\x39\xBD\x6B\x39\xEF\x94\x5A\xF7\x8C\x52\xEF\x94\x5A\xA5" + "\x52\x21\xF7\x8C\x63\xF7\x8C\x63\x9C\x42\x08\xFF\x9C\x52\xE7\x7F\x42" + "\xE7\x7B\x52\xEF\x94\x5A\xBD\x63\x29\xFF\xA5\x5A\xFF\xA5\x6B\xFF\x9C" + "\x52\xD6\x7B\x39\xDE\x84\x52\xDE\x73\x42\xCE\x7B\x4A\xE7\x7B\x52\xDE" + "\x84\x52\xE7\x8C\x52\xEF\x9C\x63\xE7\x94\x5A\xE7\x8C\x52\x27\xDE\x73" + "\x42\xF7\x9C\x63\xF7\x9C\x63\xE7\x94\x5A\xFF\xA5\x6B\xEF\xA5\x73\x8C" + "\x5A\x31\x8C\x5A\x31\x7B\x42\x18\x7B\x42\x18\xF7\xDE\xB1\xFF\xF7\xDE" + "\xF7\xDE\xB1\x83\xC0\x03\xF7\xDE\xB1\x82\xFF\x09\xFB\xF7\xDE\xB1\xB5" + "\x7B\x52\xB5\x7B\x82\x52\x7F\x21\x08\xF7\x9C\x73\x8C\x39\x08\x8C\x39" + "\x08\x8C\x39\x08\xBD\x6B\x39\xD6\x9C\x73\xE7\x94\x5A\xCE\x7B\x4A\xDE" + "\x73\x42\xDE\x73\x42\xE7\x8C\x52\xE7\x8C\x52\xDE\x73\x42\xDE\x73\x42" + "\xD6\x73\x29\xBD\x63\x29\xAD\x6B\x42\xA5\x52\x21\xF7\x8C\x63\xF7\x8C" + "\x63\xF7\x8C\x63\xE7\x8C\x52\xF7\x8C\x63\xC6\x73\x42\xEF\x94\x5A\xDE" + "\x84\x42\xF7\x8C\x63\xEF\x9C\x63\xE7\x8C\x52\xEF\x9C\x63\xF7\x9C\x73" + "\xEF\x94\x5A\xF7\x9C\x63\xE7\x94\x5A\xE7\x8C\x52\xF7\x9C\x63\xEF\x9C" + "\x63\xEF\xA5\x6B\xCE\x8C\x63\xF7\x9C\x73\xE7\x94\x5A\xCE\x8C\x7F\x63" + "\xC6\x73\x42\xE7\x94\x5A\xBD\x6B\x39\xBD\x6B\x39\x9C\x63\x39\xA5\x52" + "\x21\xA5\x52\x10\x8C\x39\x08\x7B\x42\x18\x52\x21\x08\x8C\x5A\x31\xF7" + "\xB5\x84\x7B\x42\x18\xFF\xF7\xDE\xD6\xAD\x84\xF7\xDE\xB1\xFF\xF7\xDE" + "\xFF\xF7\xDE\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\x7B\x42" + "\x18\xCE\x8C\x63\xD6\x7B\x5A\xF7\x8C\x63\xD6\x9C\x73\xC6\x73\x42\x7B" + "\x42\x18\x7B\x42\x18\x7B\x42\x18\xD6\x9C\x73\xDE\x84\x52\xEF\x94\x5A" + "\xE7\x8C\x52\xCE\x7B\x4A\xDE\x73\x42\xE7\x8C\x52\xDE\x73\x42\xA5\x52" + "\x21\xC6\x7B\x5A\xAD\x6B\x42\x6F\xBD\x63\x29\x8C\x39\x08\xBD\x63\x29" + "\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x7B\x42\x18\x8C\x39" + "\x08\x8C\x39\x08\x7B\x42\x18\x52\x21\x08\x9C\x42\x08\xA5\x52\x21\xA5" + "\x52\x10\xA5\x52\x21\xC6\x73\x42\xBD\x63\x29\x8C\x5A\x31\xBD\x6B\x39" + "\xBD\x6B\x39\xF7\x8C\x63\xB5\x7B\x52\xCE\x7B\x4A\xDE\x84\x52\xDE\x84" + "\x52\xEF\x9C\x63\xCE\x8C\x63\xC6\x7B\x5A\xDE\xA5\x52\xE7\xA5\x5A\xF7" + "\xB5\x84\xCE\x8C\x63\x8C\x5A\x31\xE7\x94\x5A\x9C\x63\x39\xFF\xF7\xDE" + "\x83\xC0\x7F\xFF\xF7\xDE\xF7\xDE\xB1\xF7\xDE\xB1\xFF\xF7\xDE\xFF\xF7" + "\xDE\xF7\xDE\xB1\xFF\xF7\xDE\x7B\x42\x18\xFF\xF7\xDE\xD6\x7B\x5A\xD6" + "\x7B\x5A\xB5\x7B\x52\x8C\x5A\x31\x7B\x42\x18\x52\x21\x08\x52\x21\x08" + "\xC6\x7B\x5A\x52\x21\x08\xAD\x6B\x42\xE7\x94\x5A\xDE\x73\x42\xE7\x8C" + "\x52\xDE\x73\x42\xDE\x73\x42\xBD\x63\x29\x9C\x63\x39\xA5\x52\x21\xBD" + "\x63\x29\xF7\x9C\x63\xDE\x73\x42\xE7\x94\x5A\xF7\x9C\x73\xE7\x8C\x52" + "\xF7\x8C\x63\xEF\x94\x5A\xF7\x8C\x63\xEF\xA5\x6B\xBD\x6B\x21\xFF\xB5" + "\x7B\xF7\x8C\x63\xE7\x8C\x52\xF7\x9C\x63\xFF\x7F\xA5\x5A\xD6\x7B\x39" + "\xE7\x8C\x52\xE7\x94\x5A\xF7\x9C\x73\xF7\xB5\x84\xFF\xCE\x8C\xC6\x73" + "\x42\xF7\x8C\x63\xF7\x9C\x63\xEF\x94\x5A\xDE\x84\x52\xDE\x84\x42\xCE" + "\x8C\x63\xDE\x84\x42\xD6\x7B\x39\xB5\x7B\x52\xBD\x6B\x39\x7B\x42\x18" + "\xEF\xA5\x73\xA5\x52\x21\xFF\xF7\xDE\x9C\x63\x39\xFF\xF7\xDE\xF7\xDE" + "\xB1\xD6\xAD\x84\xF7\xDE\xB1\xF7\xDE\xB1\xD6\xAD\x84\xD6\xAD\x84\x52" + "\x21\x08\xF7\xDE\xB1\x8C\x5A\x31\x52\x21\x08\x8C\x39\x08\x52\x21\x08" + "\x8C\x5A\x31\x52\x21\x08\x52\x21\x08\xB5\x7B\x52\x7B\x42\x18\x7B\x42" + "\x18\x8C\x39\x7F\x08\xCE\x8C\x63\xE7\x8C\x52\xDE\x73\x42\xE7\x8C\x52" + "\xAD\x6B\x42\xBD\x63\x29\xBD\x6B\x39\xDE\x73\x42\xE7\x7B\x52\xD6\x73" + "\x29\xE7\x8C\x52\xE7\x7B\x52\xEF\x9C\x63\xEF\x94\x5A\xEF\xA5\x6B\xFF" + "\x9C\x52\xE7\x8C\x52\xE7\x94\x5A\xBD\x6B\x21\xE7\x94\x5A\xEF\x94\x5A" + "\xE7\x7F\x42\xF7\x8C\x52\xF7\x8C\x52\xEF\x9C\x63\xE7\x94\x5A\xDE\x84" + "\x52\xE7\x94\x5A\x52\x21\x08\xE7\x94\x5A\xA5\x52\x21\x9C\x42\x08\xEF" + "\x9C\x63\xD6\x9C\x73\xDE\x84\x42\xE7\x94\x5A\xCE\x7B\x4A\xEF\xA5\x6B" + "\xBD\x6B\x21\xB5\x7B\x52\x9C\x63\x39\xCE\x8C\x63\x06\x8C\x5A\x31\xFF" + "\xF7\xDE\x83\x80\x83\xC0\x15\xF7\xDE\xB1\xF7\xDE\xB1\xD6\xAD\x84\xF7" + "\xDE\xB1\xD6\x7B\x5A\xF7\xDE\xB1\x8C\x5A\x31\x82\xFF\x7F\xFB\xF7\xDE" + "\xB1\x7B\x42\x18\x52\x21\x08\x7B\x42\x18\x52\x21\x08\x8C\x5A\x31\x52" + "\x21\x08\x52\x21\x08\x7B\x42\x18\x7B\x42\x18\xB5\x7B\x52\xD6\x7B\x5A" + "\xE7\x7F\x42\xE7\x7F\x42\xDE\x84\x52\xBD\x6B\x39\x8C\x39\x08\xAD\x6B" + "\x42\xC6\x73\x42\xD6\x73\x29\xEF\x94\x5A\xBD\x5A\x18\xF7\x8C\x63\xA5" + "\x52\x21\xBD\x6B\x21\x8C\x39\x08\xA5\x52\x21\xF7\x9C\x73\xCE\x7B\x4A" + "\xFF\xCE\x8C\xDE\x84\x52\xA5\x52\x21\xFF\xA5\x5A\xEF\x9C\x63\xD6\x7B" + "\x39\xDE\x73\x42\x8C\x39\x08\xA5\x52\x21\xF7\xB5\x84\xCE\x7B\x4A\xDE" + "\x84\x52\xC6\x73\x42\x7F\xA5\x52\x21\xCE\x7B\x4A\xEF\x94\x5A\xE7\x8C" + "\x52\xFF\xC6\x73\x8C\x39\x08\xDE\x84\x42\xEF\xA5\x73\xBD\x6B\x39\x9C" + "\x63\x39\x9C\x63\x39\xAD\x6B\x42\xF7\x9C\x73\xF7\xDE\xB1\xF7\x9C\x73" + "\xF7\xB5\x84\xF7\xDE\xB1\xF7\xDE\xB1\xD6\xAD\x84\xF7\xDE\xB1\xF7\xDE" + "\xB1\x7B\x42\x18\xD6\xAD\x84\x9C\x63\x39\x9C\x63\x39\xAD\x6B\x42\x8C" + "\x5A\x31\x7B\x42\x18\x7B\x42\x18\x52\x21\x08\xF7\xDE\xB1\xC6\x7B\x5A" + "\xB5\x7B\x52\xAD\x6B\x42\xAD\x6B\x42\xF7\x8C\x63\xD6\x73\x29\xDE\x73" + "\x42\x9C\x63\x39\xDE\x84\x52\x8C\x39\x08\xAD\x6B\x42\xF7\x7F\xDE\xB1" + "\xCE\x8C\x63\xA5\x52\x21\xEF\x9C\x63\xF7\xB5\x84\xCE\x7B\x4A\xE7\x94" + "\x5A\xDE\x73\x42\xDE\x73\x42\xBD\x63\x29\x52\x21\x08\xE7\x8C\x52\xCE" + "\x7B\x31\xE7\x94\x5A\xBD\x5A\x18\xD6\x7B\x39\xDE\x84\x52\xF7\xB5\x84" + "\xD6\x9C\x73\x9C\x63\x39\xBD\x6B\x21\xBD\x5A\x18\xFF\xB5\x6B\xFF\xA5" + "\x5A\xFF\xB5\x6B\xFF\xA5\x52\xCE\x7B\x31\xFF\xA5\x6B\xBD\x6B\x21\xFF" + "\xA5\x6B\xDE\x84\x42\x9C\x63\x39\x9C\x63\x39\x8C\x5A\x31\xAD\x6B\x42" + "\xE7\x94\x5A\xC6\x7B\x5A\xC6\x7B\x5A\xC6\x7B\x5A\x8C\x5A\x31\x8C\x5A" + "\x31\xC6\x7B\x5A\xC6\x7B\x7F\x5A\xAD\x6B\x42\x7B\x42\x18\xD6\xAD\x84" + "\xF7\x9C\x73\xF7\xB5\x84\xE7\x94\x5A\xCE\x8C\x63\xF7\xDE\xB1\x9C\x63" + "\x39\x7B\x42\x18\xF7\xB5\x84\xE7\x94\x5A\xBD\x63\x29\x9C\x42\x08\xCE" + "\x7B\x4A\xBD\x6B\x39\xDE\x73\x42\xC6\x73\x42\x9C\x63\x39\xBD\x63\x29" + "\xBD\x6B\x39\xAD\x6B\x42\xF7\xDE\xB1\xE7\x94\x5A\xE7\x8C\x52\xFF\xAD" + "\x73\xE7\x8C\x52\xD6\x73\x29\xE7\x94\x5A\xFF\xA5\x6B\xFF\xB5\x7B\xBD" + "\x7B\x29\xFF\xC6\x73\x9C\x42\x08\xF7\x8C\x63\xF7\x8C\x52\xE7\x7B\x52" + "\xE7\x94\x5A\xC6\x73\x42\x7B\x42\x18\xA5\x52\x21\xA5\x52\x10\x7F\xFF" + "\xC6\x73\xFF\xB5\x6B\xDE\xA5\x52\xFF\xCE\x8C\xB5\x7B\x52\xFF\xAD\x73" + "\xFF\xCE\x8C\xF7\xDE\xB1\xFF\xA5\x5A\xDE\xA5\x52\xEF\xA5\x6B\xD6\x9C" + "\x73\xB5\x7B\x52\xF7\x9C\x73\xFF\xA5\x6B\xE7\x7B\x52\xF7\x9C\x73\xF7" + "\x9C\x63\xF7\x8C\x63\xFF\xB5\x7B\xE7\x7B\x52\xF7\x8C\x63\xF7\x9C\x73" + "\xDE\x73\x42\x52\x21\x08\xC6\x73\x42\x52\x21\x08\x52\x21\x08\x52\x21" + "\x08\x52\x21\x08\x8C\x39\x08\x8C\x39\x08\x8C\x5A\x31\xBD\x5A\x18\xE7" + "\x7B\x52\xD6\x7B\x5A\xDE\x73\x42\xE7\x7B\x52\xE7\x8C\x52\xBD\x6B\x21" + "\xD6\x73\x29\xAD\x6B\x42\xFF\x7F\x9C\x52\xF7\x9C\x63\xE7\xA5\x5A\xFF" + "\xF7\xDE\xD6\x9C\x73\xFF\xA5\x5A\xE7\x94\x5A\xDE\xA5\x52\xBD\x63\x29" + "\x8C\x39\x08\xE7\x8C\x52\xE7\x94\x5A\xBD\x7B\x29\xFF\xAD\x73\xF7\x8C" + "\x63\xEF\x94\x5A\xDE\x73\x42\xFF\x9C\x52\xFF\xA5\x6B\xA5\x52\x10\xA5" + "\x52\x21\xCE\x7B\x4A\xBD\x6B\x21\xC6\x73\x42\xF7\x8C\x52\xEF\x94\x5A" + "\xBD\x7B\x29\xC6\x73\x42\xEF\x94\x5A\xFF\xA5\x5A\x8C\x5A\x31\xEF\x94" + "\x5A\xEF\xA5\x73\xBD\x6B\x39\xCE\x7B\x4A\x8C\x5A\x31\xD6\x7B\x39\xEF" + "\x9C\x63\xF7\x9C\x63\xFF\x9C\x52\xF7\x8C\x52\xFF\xA5\x6B\xEF\xA5\x7F" + "\x73\xEF\x94\x42\xEF\x94\x42\xFF\xA5\x52\xBD\x6B\x21\xE7\x94\x5A\xF7" + "\x8C\x52\xDE\x73\x42\xF7\x9C\x73\xF7\x9C\x63\xFF\xAD\x73\xD6\x7B\x5A" + "\xF7\x9C\x73\xFF\x9C\x52\xDE\x73\x42\xF7\x8C\x52\xBD\x6B\x39\xBD\x5A" + "\x18\xE7\x8C\x52\xBD\x5A\x18\xDE\x73\x42\xBD\x63\x29\x8C\x5A\x31\xE7" + "\x7F\x42\xFF\xA5\x6B\xB5\x7B\x52\xFF\xF7\xDE\xCE\x8C\x63\xFF\xB5\x6B" + "\xFF\xB5\x7B\xFF\xA5\x5A\xFF\xB5\x6B\xFF\xCE\x8C\xDE\x84\x42\xF7\xB5" + "\x84\xFF\xA5\x6B\xF7\x9C\x63\xFF\xA5\x6B\xFF\xA5\x6B\xFF\xC6\x63\xEF" + "\xA5\x73\xFF\xC6\x73\xEF\xA5\x73\x7F\xEF\xA5\x73\xFF\xCE\x8C\xFF\xB5" + "\x7B\xEF\xA5\x73\xEF\x94\x42\xCE\x7B\x4A\xF7\x9C\x63\xF7\x9C\x63\xDE" + "\x84\x42\xFF\xB5\x6B\xEF\x9C\x63\xEF\xA5\x73\xB5\x7B\x52\xEF\xA5\x6B" + "\xFF\xB5\x6B\xB5\x7B\x52\xEF\x94\x5A\xBD\x6B\x21\xE7\x7F\x42\xF7\x8C" + "\x52\xEF\x9C\x63\xBD\x6B\x39\xBD\x6B\x21\xFF\xC6\x63\xFF\xC6\x63\xFF" + "\xB5\x6B\xFF\xC6\x63\xFF\xB5\x6B\xFF\xA5\x5A\xEF\x94\x5A\xE7\x7F\x42" + "\xF7\x9C\x63\xDE\x73\x42\xF7\x9C\x63\xF7\x8C\x52\xF7\x8C\x63\xF7\x8C" + "\x52\xF7\x9C\x63\xDE\x73\x42\xF7\x9C\x73\xF7\x8C\x63\xDE\x73\x42\xD6" + "\x7F\x7B\x5A\xDE\x73\x42\xBD\x6B\x39\xEF\x94\x5A\xEF\x94\x5A\xF7\xDE" + "\xB1\xFF\xF7\xDE\xD6\xAD\x84\xCE\x8C\x63\xCE\x7B\x4A\xD6\x7B\x39\xCE" + "\x7B\x4A\xBD\x6B\x21\xCE\x8C\x63\xBD\x6B\x21\xC6\x73\x42\xD6\x73\x29" + "\xBD\x63\x29\xA5\x52\x21\xA5\x52\x21\xA5\x52\x21\xA5\x52\x21\xA5\x52" + "\x10\x8C\x39\x08\x9C\x63\x39\x7B\x42\x18\xD6\x7B\x39\xEF\x9C\x63\xBD" + "\x5A\x18\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x8C\x5A\x31\x8C\x39\x08" + "\xA5\x52\x10\xA5\x52\x21\x8C\x39\x08\x8C\x5A\x31\x9C\x63\x39\xAD\x6B" + "\x42\xEF\x94\x5A\xD6\x7B\x39\xE7\x7F\x7F\x42\xF7\x9C\x63\xFF\xA5\x5A" + "\xE7\x94\x5A\xE7\x8C\x52\xFF\xA5\x5A\xFF\x9C\x52\xCE\x7B\x31\xFF\xCE" + "\x8C\xBD\x6B\x21\xE7\x7F\x42\xF7\x8C\x63\xD6\x73\x29\xE7\x7F\x42\xE7" + "\x7B\x52\xBD\x6B\x21\xD6\x73\x29\xBD\x63\x29\xA5\x52\x21\xE7\x7F\x42" + "\xA5\x52\x21\xDE\x73\x42\xF7\x9C\x63\xE7\x7F\x42\xF7\x9C\x63\xCE\x7B" + "\x4A\xCE\x7B\x4A\xDE\x84\x42\xD6\x9C\x73\xF7\xDE\xB1\xF7\xB5\x84\xEF" + "\x94\x5A\xEF\x94\x5A\xE7\x94\x5A\xEF\x9C\x63\xF7\x9C\x63\xEF\x94\x5A" + "\xFF\xB5\x6B\xEF\x9C\x63\xFF\xAD\x73\xE7\x94\x5A\xFF\xB5\x6B\xFF\xB5" + "\x6B\x7F\xFF\xB5\x7B\xFF\xA5\x6B\xEF\xA5\x73\xFF\xAD\x73\xEF\x94\x5A" + "\xE7\x8C\x52\xFF\xA5\x5A\xF7\x8C\x52\xDE\x84\x52\xFF\xA5\x6B\xF7\x9C" + "\x63\xFF\x9C\x52\xF7\x8C\x52\xFF\xA5\x6B\xE7\x94\x5A\xEF\xA5\x6B\xEF" + "\xA5\x6B\xEF\xA5\x6B\x8C\x5A\x31\xC6\x73\x42\xBD\x7B\x29\xEF\x94\x5A" + "\xEF\x94\x5A\xF7\x9C\x63\xD6\x73\x29\x8C\x39\x08\x8C\x39\x08\x9C\x42" + "\x08\xF7\x8C\x63\xF7\x8C\x52\xFF\xC6\x63\xEB\x77\x39\xEB\x77\x39\xEF" + "\x94\x5A\xF7\x8C\x63\xF7\x8C\x52\xFF\xA5\x5A\xFF\xAD\x73\xE7\x7B\x52" + "\xFF\xAD\x73\xC6\x73\x42\xE7\x94\x5A\xC6\x7F\x73\x42\xBD\x6B\x21\xE7" + "\x8C\x52\xF7\x9C\x63\xFF\xA5\x6B\xEF\xA5\x73\xEF\xA5\x6B\xFF\xB5\x6B" + "\xFF\xA5\x5A\xAD\x6B\x42\xF7\xB5\x84\xDE\x84\x42\xF7\x8C\x52\xE7\x8C" + "\x52\xFF\x9C\x52\xBD\x5A\x18\xFF\xAD\x73\xFF\xA5\x5A\xEF\x94\x5A\xF7" + "\x9C\x63\xFF\xA5\x5A\xD6\x73\x29\xFF\xA5\x5A\xDE\x84\x52\xE7\x94\x5A" + "\x8C\x39\x08\xDE\x73\x42\xF7\x9C\x63\xEF\x94\x5A\xEF\xA5\x73\x9C\x42" + "\x08\xFF\xA5\x6B\x8C\x39\x08\xEF\x94\x5A\xEF\x9C\x63\xFF\xA5\x6B\xDE" + "\x84\x42\xCE\x7B\x4A\x9C\x63\x39\xDE\xA5\x52\xFF\xAD\x73\x9C\x63\x39" + "\x9C\x63\x7F\x39\xCE\x7B\x4A\x7B\x42\x18\x7B\x42\x18\x7B\x42\x18\xBD" + "\x63\x29\xDE\x73\x42\xE7\x7B\x52\xDE\x73\x42\xEF\x94\x5A\xD6\x73\x29" + "\xFF\xB5\x6B\xFF\xA5\x52\xDE\x84\x42\xFF\x9C\x52\xF7\x8C\x52\xF7\x8C" + "\x42\xEF\x94\x42\xEB\x77\x39\xFF\x9C\x52\xF7\x8C\x52\xBD\x5A\x18\xD6" + "\x73\x29\xD6\x7B\x39\xC6\x73\x42\xBD\x6B\x39\xBD\x6B\x39\xD6\x73\x29" + "\xAD\x6B\x42\xDE\x73\x42\xBD\x7B\x29\xFF\xB5\x7B\xCE\x7B\x4A\xB5\x7B" + "\x52\xBD\x63\x29\xFF\xAD\x73\x8C\x39\x08\xFF\xA5\x6B\xBD\x6B\x21\xFF" + "\xB5\x7B\xCE\x7B\x4A\xD6\x7B\x39\xFF\xB5\x7B\x7F\xFF\xB5\x6B\xE7\x8C" + "\x52\xFF\xB5\x7B\xEF\x9C\x63\xFF\xC6\x73\xBD\x63\x29\xE7\x7B\x52\xFF" + "\xA5\x52\xDE\x84\x52\xFF\xC6\x73\x9C\x42\x08\xFF\xB5\x7B\xEF\xA5\x6B" + "\xBD\x7B\x29\xDE\x84\x52\xBD\x6B\x39\xFF\xC6\x73\xFF\xCE\x8C\xFF\xC6" + "\x73\xF7\xDE\xB1\xFF\xCE\x8C\xAD\x6B\x42\xC6\x73\x42\xA5\x52\x10\xFF" + "\xC6\x73\xDE\x84\x42\xFF\x94\x42\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xB5\x6B" + "\xFF\xB5\x6B\xEF\x9C\x63\xFF\xC6\x63\xEF\x9C\x63\xF7\x9C\x63\xF7\x8C" + "\x52\xF7\x8C\x42\xF7\x8C\x42\xEB\x77\x39\xF7\x8C\x52\xE7\x7F\x42\xF7" + "\x8C\x52\xF7\x7F\x9C\x63\xEF\x94\x5A\xF7\x8C\x52\xF7\x8C\x52\xF7\x8C" + "\x52\xD6\x73\x29\xDE\x73\x42\xE7\x7B\x52\xCE\x7B\x4A\xE7\x8C\x52\xF7" + "\x9C\x63\xE7\x94\x5A\xEF\xA5\x73\xF7\xDE\xB1\xF7\xB5\x84\xDE\x84\x42" + "\xBD\x6B\x39\xC6\x73\x42\xF7\x9C\x63\xEF\xA5\x73\xA5\x52\x10\x9C\x63" + "\x39\xEF\xA5\x6B\xBD\x6B\x39\xEF\x94\x42\xFF\xC6\x73\xBD\x5A\x18\xFF" + "\xB5\x7B\xEF\x9C\x63\xFF\xB5\x6B\xFF\x9C\x52\xFF\xA5\x6B\xEF\x94\x5A" + "\xCE\x7B\x4A\xEF\x9C\x63\xFF\xB5\x7B\xDE\x84\x52\xFF\xCE\x8C\xEF\xA5" + "\x6B\xA5\x52\x10\xFF\xCE\x8C\xFF\xCE\x8C\x52\x21\x7F\x08\xF7\xDE\xB1" + "\x7B\x42\x18\xCE\x8C\x63\xD6\x7B\x39\xD6\x7B\x39\xF7\x9C\x63\xFF\xA5" + "\x6B\xE7\x94\x5A\xEF\x94\x42\xE7\x94\x5A\xBD\x7B\x29\xDE\x84\x52\xDE" + "\x84\x42\xE7\x7F\x42\xE7\x7F\x42\xF7\x8C\x52\xF7\x8C\x52\xE7\x7F\x42" + "\xE7\x8C\x52\xFF\xA5\x6B\xFF\xA5\x6B\xBD\x6B\x39\xDE\x73\x42\xC6\x73" + "\x42\xDE\x73\x42\xF7\x8C\x52\xF7\x9C\x63\xDE\x73\x42\xDE\x73\x42\xDE" + "\x73\x42\xBD\x6B\x39\xEF\x9C\x63\xD6\x9C\x73\xA5\x52\x21\xA5\x52\x10" + "\xBD\x9C\x6B\xFF\xAD\x73\xA5\x52\x21\xFF\xAD\x73\xBD\x6B\x39\xF7\x9C" + "\x73\xE7\x94\x5A\x7F\xDE\x84\x52\xAD\x6B\x42\xFF\xB5\x7B\xFF\xB5\x6B" + "\xEF\x94\x42\xE7\xA5\x5A\xFF\xB5\x6B\x8C\x39\x08\xBD\x5A\x18\xFF\xB5" + "\x6B\xD6\x7B\x39\xA5\x52\x10\xDE\x73\x42\xD6\x73\x29\xFF\xC6\x73\x52" + "\x21\x08\xBD\x5A\x18\xDE\x84\x42\xFF\x9C\x52\xDE\xA5\x52\xDE\xA5\x52" + "\xA5\x52\x10\xEF\xA5\x6B\xFF\xC6\x73\xB5\x7B\x52\xCE\x7B\x4A\xA5\x52" + "\x10\xA5\x52\x21\xD6\x73\x29\xC6\x73\x42\xBD\x63\x29\xBD\x63\x29\xBD" + "\x6B\x21\xBD\x63\x29\xBD\x63\x29\xBD\x63\x29\xD6\x7B\x39\xA5\x52\x10" + "\xBD\x63\x29\xA5\x52\x21\xBD\x63\x29\xBD\x5A\x18\xBD\x7F\x63\x29\xA5" + "\x52\x10\xA5\x52\x21\x9C\x63\x39\xBD\x63\x29\xA5\x52\x21\xCE\x7B\x4A" + "\xDE\x73\x42\xDE\x73\x42\xF7\x8C\x63\xDE\x73\x42\xB5\x7B\x52\xE7\x94" + "\x5A\xDE\x73\x42\xA5\x52\x21\xCE\x7B\x4A\xAD\x6B\x42\xFF\xAD\x73\xA5" + "\x52\x21\xF7\x9C\x63\xF7\x9C\x63\xBD\x5A\x18\xEF\x9C\x63\xBD\x63\x29" + "\xBD\x5A\x18\xFF\xA5\x6B\x9C\x42\x08\xFF\x9C\x52\xF7\x8C\x52\xE7\x7F" + "\x42\xF7\x8C\x63\xCE\x7B\x4A\xFF\xA5\x52\xEF\x9C\x63\xFF\xA5\x5A\xBD" + "\x6B\x21\xFF\xAD\x73\xFF\xB5\x6B\xBD\x6B\x21\xFF\xA5\x6B\xEF\x94\x5A" + "\xFF\xA5\x6B\xD6\x73\x7F\x29\xE7\xA5\x5A\xEF\xA5\x73\xCE\x7B\x4A\xFF" + "\xC6\x63\xAD\x6B\x42\xC6\x7B\x5A\xA5\x52\x21\xE7\x8C\x52\xC6\x73\x42" + "\xDE\x84\x42\xC6\x73\x42\xDE\x73\x42\xCE\x7B\x4A\xE7\x7B\x52\xDE\x73" + "\x42\xDE\x84\x52\xBD\x6B\x39\xDE\x84\x42\xCE\x7B\x4A\xC6\x73\x42\xC6" + "\x73\x42\xDE\x73\x42\xC6\x73\x42\xCE\x7B\x4A\xD6\x7B\x39\x8C\x5A\x31" + "\x8C\x39\x08\xFF\xC6\x73\xEF\xA5\x6B\xFF\x9C\x52\xF7\x8C\x52\xFF\xA5" + "\x6B\xE7\x8C\x52\xB5\x7B\x52\xF7\x8C\x63\xDE\x84\x52\xBD\x6B\x21\xE7" + "\x94\x5A\xEF\xA5\x73\xEF\xA5\x73\xBD\x5A\x18\xFF\xAD\x73\x7F\xF7\x8C" + "\x63\xF7\x9C\x63\xF7\x9C\x63\xFF\xA5\x6B\xDE\x73\x42\xFF\xA5\x6B\xEF" + "\xA5\x6B\xEF\x9C\x63\xF7\x8C\x63\xF7\x9C\x63\xEF\x9C\x63\xF7\x8C\x52" + "\xEF\xA5\x73\xFF\x9C\x52\xFF\xA5\x6B\xEF\xA5\x6B\xFF\xCE\x8C\xFF\xAD" + "\x73\xFF\xA5\x6B\xFF\xA5\x5A\xFF\xA5\x6B\xEF\x9C\x63\xEF\x94\x5A\xFF" + "\xA5\x6B\xF7\x9C\x63\xFF\xA5\x6B\xFF\xC6\x73\x7B\x42\x18\xCE\x8C\x63" + "\xBD\x6B\x21\xD6\x7B\x39\xDE\x84\x42\xDE\x84\x52\xDE\x84\x42\xDE\x73" + "\x42\xDE\x84\x52\xD6\x73\x29\xDE\x73\x42\xDE\x84\x42\xD6\x7B\x39\xDE" + "\x84\x52\xD6\x7B\x39\xCE\x7F\x7B\x4A\xBD\x6B\x39\xBD\x7B\x29\xDE\x84" + "\x52\xBD\x6B\x39\x9C\x63\x39\x8C\x39\x08\xB5\x7B\x52\xBD\x7B\x29\xCE" + "\x7B\x4A\xFF\x94\x42\xEF\x94\x42\xE7\x7F\x42\xE7\x8C\x52\xB5\x7B\x52" + "\xE7\x7B\x52\xCE\x8C\x63\xE7\x8C\x52\xD6\x9C\x73\xBD\x9C\x6B\xAD\x6B" + "\x42\xC6\x73\x42\xA5\x52\x21\xBD\x7B\x29\xA5\x52\x21\xBD\x63\x29\xA5" + "\x52\x10\xBD\x63\x29\xA5\x52\x10\x8C\x39\x08\x9C\x42\x08\x8C\x39\x08" + "\x9C\x42\x08\xA5\x52\x21\xA5\x52\x10\xA5\x52\x21\xA5\x52\x21\xA5\x52" + "\x10\xBD\x5A\x18\x8C\x39\x08\x9C\x42\x08\x8C\x39\x08\x8C\x39\x7F\x08" + "\x8C\x39\x08\x7B\x42\x18\xA5\x52\x10\x8C\x39\x08\x7B\x42\x18\x9C\x42" + "\x08\x8C\x39\x08\x8C\x5A\x31\xCE\x8C\x63\xA5\x52\x10\xBD\x63\x29\xBD" + "\x6B\x39\xBD\x6B\x21\xBD\x6B\x21\xBD\x6B\x21\xD6\x73\x29\xBD\x5A\x18" + "\xBD\x6B\x21\xBD\x63\x29\xBD\x5A\x18\xBD\x63\x29\xBD\x6B\x21\xBD\x7B" + "\x29\xAD\x6B\x42\xBD\x6B\x21\xA5\x52\x21\xCE\x7B\x4A\xC6\x73\x42\x8C" + "\x5A\x31\x8C\x5A\x31\x7B\x42\x18\xEF\x94\x42\xF7\x8C\x52\xE7\x7F\x42" + "\xFF\xA5\x5A\xD6\x7B\x39\xC6\x7B\x5A\xFF\xA5\x6B\xEF\x94\x5A\xEF\x9C" + "\x63\xF7\xB5\x84\xD6\x9C\x73\x7F\xFF\xAD\x73\xF7\xB5\x84\xF7\x8C\x52" + "\xFF\xB5\x7B\xFF\xB5\x7B\xFF\xB5\x7B\xFF\xC6\x73\xEF\x94\x5A\xFF\xC6" + "\x73\xFF\xAD\x73\xFF\xA5\x6B\xFF\xB5\x6B\xFF\xB5\x7B\xFF\xB5\x6B\xFF" + "\xB5\x6B\xFF\xAD\x73\xFF\xCE\x8C\xF7\x9C\x63\xFF\xA5\x5A\xFF\xB5\x7B" + "\xEF\xA5\x6B\xE7\x7F\x42\xFF\xA5\x5A\xFF\xA5\x5A\xFF\xB5\x6B\xFF\xB5" + "\x6B\xFF\xB5\x6B\xFF\xA5\x5A\xFF\xA5\x5A\xF7\xB5\x84\x9C\x63\x39\xCE" + "\x8C\x63\xA5\x52\x21\xCE\x7B\x4A\xD6\x73\x29\xE7\x8C\x52\xDE\x73\x42" + "\xDE\x84\x42\xD6\x7B\x39\xE7\x7F\x42\xC6\x73\x42\xBD\x6B\x21\xC6\x7F" + "\x73\x42\xC6\x73\x42\xBD\x63\x29\xBD\x6B\x39\xD6\x73\x29\xBD\x7B\x29" + "\xC6\x73\x42\xD6\x7B\x39\xA5\x52\x10\xA5\x52\x10\x9C\x63\x39\xBD\x7B" + "\x29\xCE\x7B\x4A\xEF\x94\x5A\xE7\x7F\x42\xFF\xA5\x5A\xE7\x8C\x52\xC6" + "\x73\x42\xEF\x94\x5A\xDE\x84\x52\xE7\x8C\x52\xFF\xCE\x8C\xBD\x6B\x39" + "\xDE\x73\x42\xDE\x73\x42\xE7\x8C\x52\xFF\x9C\x52\xBD\x5A\x18\xF7\x9C" + "\x63\xE7\x7F\x42\xE7\x7F\x42\xF7\x8C\x42\xFF\xA5\x5A\xD6\x73\x29\xEF" + "\x9C\x63\xBD\x6B\x21\xFF\xB5\x7B\xD6\x73\x29\xF7\x9C\x63\xFF\xA5\x6B" + "\xFF\x9C\x52\xD6\x73\x29\xF7\x9C\x1E\x63\xFF\x9C\x52\xD6\x73\x29\xEF" + "\x94\x5A\xDE\x84\x42\xEF\x94\x5A\xFF\x9C\x52\xCE\x7B\x31\xFF\xB5\x7B" + "\xD6\x7B\x39\xFF\xCE\x82\x8C\x7F\x5A\x31\xCE\x8C\x63\xBD\x6B\x39\xDE" + "\x84\x42\xE7\x8C\x52\xE7\x8C\x52\xEF\x94\x5A\xDE\x84\x52\xE7\x7F\x42" + "\xE7\x7F\x42\xDE\x84\x42\xE7\x8C\x52\xDE\x73\x42\xDE\x84\x52\xC6\x73" + "\x42\xD6\x7B\x39\xD6\x7B\x39\xDE\x84\x52\xCE\x7B\x4A\xDE\xA5\x52\xDE" + "\xA5\x52\x7B\x42\x18\x9C\x63\x39\xB5\x7B\x52\x9C\x63\x39\xF7\x9C\x73" + "\xFF\x9C\x52\xEF\x94\x42\xEF\x94\x42\xCE\x7B\x4A\xDE\x84\x42\x9C\x42" + "\x08\xF7\x9C\x63\xFF\xCE\x8C\xCE\x7B\x4A\xE7\x8C\x52\xBD\x5A\x18\xF7" + "\x9C\x73\xD6\x73\x29\xFF\xB5\x7B\xE7\x7F\x42\xFF\xAD\x73\xEF\x94\x7F" + "\x42\xEF\xA5\x6B\xF7\x8C\x52\xF7\x9C\x63\xF7\x9C\x63\xD6\x73\x29\xFF" + "\x9C\x52\xEF\x94\x5A\xE7\x7F\x42\xE7\x7F\x42\xDE\x73\x42\xF7\x8C\x52" + "\xF7\x8C\x52\xFF\x9C\x52\xE7\x7F\x42\xEF\x9C\x63\xFF\xA5\x6B\xFF\xB5" + "\x6B\xE7\x8C\x52\xFF\xA5\x5A\xFF\x9C\x52\xFF\xA5\x6B\xFF\xB5\x7B\x9C" + "\x63\x39\xE7\x94\x5A\xA5\x52\x10\xEF\x94\x42\xD6\x73\x29\xDE\x84\x42" + "\xD6\x7B\x39\xDE\x73\x42\xD6\x73\x29\xDE\x73\x42\xD6\x73\x29\xDE\x73" + "\x42\xC6\x73\x42\xD6\x7B\x39\xD6\x7B\x39\xBD\x6B\x21\xDE\x84\x52\xEF" + "\x94\x42\xCE\x7B\x4A\xEF\x94\x5A\x7F\xFF\xA5\x6B\x9C\x63\x39\x8C\x5A" + "\x31\xB5\x7B\x52\xA5\x52\x10\xEF\x9C\x63\xD6\x73\x29\xE7\x8C\x52\xDE" + "\x84\x52\xCE\x7B\x4A\xBD\x6B\x21\xFF\xAD\x73\xF7\x9C\x63\xFF\xCE\x8C" + "\xCE\x8C\x63\xE7\x7F\x42\xFF\x9C\x52\xF7\x8C\x52\xFF\xA5\x6B\xF7\x8C" + "\x42\xF7\x8C\x63\xCE\x7B\x31\xFF\xA5\x5A\xFF\xB5\x6B\xFF\xA5\x5A\xEB" + "\x77\x39\xFF\xA5\x6B\xFF\xA5\x5A\xF7\xB5\x84\xD6\x73\x29\xFF\xAD\x73" + "\xFF\xA5\x6B\xD6\x73\x29\xE7\x7B\x52\xFF\xA5\x5A\xDE\x73\x42\xF7\x9C" + "\x63\xFF\x9C\x52\xFF\xA5\x6B\xFF\xB5\x6B\xFF\xB5\x6B\xE7\xA5\x5A\xFF" + "\x7F\x9C\x52\xEF\xA5\x6B\xEF\xA5\x6B\xBD\x6B\x39\xEF\xA5\x73\xA5\x52" + "\x10\xDE\x73\x42\xDE\x73\x42\xD6\x7B\x39\xD6\x73\x29\xD6\x7B\x39\xC6" + "\x73\x42\xDE\x73\x42\xD6\x73\x29\xD6\x7B\x39\xDE\x73\x42\xD6\x73\x29" + "\xCE\x7B\x4A\xDE\x84\x42\xBD\x7B\x29\xD6\x73\x29\xCE\x7B\x4A\xCE\x7B" + "\x4A\xBD\x7B\x29\x7B\x42\x18\x9C\x63\x39\x8C\x5A\x31\xA5\x52\x21\xEF" + "\xA5\x6B\xF7\x9C\x63\xF7\x8C\x52\xE7\x8C\x52\xD6\x7B\x5A\xEF\xA5\x73" + "\xEF\x94\x42\xFF\xAD\x73\xF7\xB5\x84\xEF\x94\x5A\xFF\x9C\x52\xEF\x94" + "\x5A\xFF\xA5\x5A\xFF\xA5\x6B\xFF\xA5\x7F\x5A\xDE\x73\x42\xE7\x8C\x52" + "\xDE\x84\x42\xFF\xC6\x73\xFF\xB5\x6B\xFF\xB5\x6B\xEF\x9C\x63\xFF\xA5" + "\x6B\xFF\xC6\x73\xE7\x7F\x42\xFF\xB5\x6B\xFF\xA5\x6B\xF7\x8C\x52\xEF" + "\xA5\x6B\xFF\x9C\x52\xE7\x7F\x42\xFF\x9C\x52\xBD\x5A\x18\xFF\xA5\x6B" + "\xDE\x84\x42\xDE\x84\x52\xDE\x84\x42\xA5\x52\x10\xBD\x6B\x39\xFF\xAD" + "\x73\x8C\x5A\x31\xEF\x94\x5A\x9C\x42\x08\xE7\x7F\x42\xBD\x5A\x18\xD6" + "\x73\x29\xBD\x6B\x39\xD6\x73\x29\xBD\x6B\x21\xD6\x73\x29\xBD\x63\x29" + "\xD6\x73\x29\xBD\x5A\x18\xDE\x73\x42\xD6\x73\x29\xBD\x6B\x21\xBD\x6B" + "\x21\x7F\xBD\x6B\x21\xA5\x52\x21\xBD\x7B\x29\xA5\x52\x21\x8C\x5A\x31" + "\x8C\x5A\x31\x9C\x63\x39\xA5\x52\x10\xE7\x94\x5A\xE7\x7F\x42\xE7\x7F" + "\x42\xE7\x7B\x52\xBD\x6B\x39\xEF\x94\x42\xFF\xB5\x7B\xDE\x73\x42\xFF" + "\xCE\x8C\xCE\x7B\x4A\x9C\x42\x08\xD6\x7B\x39\x8C\x39\x08\xBD\x5A\x18" + "\xEF\x94\x42\xDE\x84\x52\xFF\xA5\x52\xFF\xA5\x6B\xD6\x7B\x39\xFF\x9C" + "\x52\xA5\x52\x21\xBD\x5A\x18\x8C\x39\x08\xD6\x73\x29\xF7\x8C\x52\xBD" + "\x5A\x18\x9C\x42\x08\xFF\xA5\x52\x8C\x39\x08\xFF\x9C\x52\xFF\xA5\x6B" + "\xEF\x94\x5A\xFF\x9C\x52\xDE\x84\x52\xEF\x7F\xA5\x6B\xFF\xA5\x6B\xFF" + "\xB5\x6B\xE7\x94\x5A\xD6\x7B\x39\xDE\xA5\x52\xAD\x6B\x42\xEF\x9C\x63" + "\xBD\x63\x29\xFF\x9C\x52\xE7\x8C\x52\xE7\x8C\x52\xE7\x8C\x52\xDE\x73" + "\x42\xE7\x8C\x52\xE7\x8C\x52\xE7\x8C\x52\xF7\x8C\x52\xE7\x8C\x52\xDE" + "\x84\x42\xE7\x7F\x42\xE7\x7F\x42\xDE\x73\x42\xDE\x73\x42\xDE\x84\x52" + "\xCE\x7B\x4A\xCE\x7B\x4A\x9C\x63\x39\xA5\x52\x10\x9C\x63\x39\xA5\x52" + "\x10\xFF\xA5\x6B\xEF\x94\x42\xF7\x8C\x52\xDE\x84\x52\xCE\x7B\x4A\xFF" + "\xB5\x6B\xFF\xA5\x52\xFF\xC6\x73\xF7\xDE\xB1\xDE\x84\x52\xEF\x9C\x63" + "\xFF\xAD\x7F\x73\xEF\x94\x5A\xE7\x8C\x52\xF7\x9C\x63\xF7\x8C\x52\xEF" + "\x94\x5A\xFF\x9C\x52\xEF\x94\x5A\xFF\xA5\x5A\xFF\x9C\x52\xEF\xA5\x6B" + "\xFF\xA5\x6B\xFF\xA5\x6B\xFF\x9C\x52\xFF\xB5\x7B\xFF\xAD\x73\xFF\xAD" + "\x73\xFF\xB5\x7B\xEF\xA5\x73\xFF\xC6\x73\xFF\xB5\x7B\xFF\xA5\x6B\xF7" + "\xB5\x84\xFF\xC6\x73\xF7\xB5\x84\xFF\xC6\x73\xFF\xCE\x8C\xF7\xB5\x84" + "\xF7\xB5\x84\xB5\x7B\x52\xC6\x7B\x5A\xA5\x52\x21\xC6\x73\x42\xDE\x84" + "\x42\xDE\x84\x52\xE7\x8C\x52\xDE\x84\x52\xDE\x84\x42\xE7\x8C\x52\xE7" + "\x8C\x52\xE7\x8C\x52\xE7\x7B\x52\xDE\x84\x52\x7F\xDE\x73\x42\xDE\x84" + "\x52\xDE\x84\x52\xDE\x84\x52\xC6\x73\x42\xCE\x7B\x4A\xCE\x8C\x63\x9C" + "\x63\x39\x8C\x5A\x31\x8C\x5A\x31\xD6\x7B\x39\xE7\xA5\x5A\xE7\x7F\x42" + "\xF7\x8C\x52\xEF\x94\x42\xB5\x7B\x52\xDE\xA5\x52\xDE\x84\x42\xD6\x7B" + "\x5A\xF7\xDE\xB1\xB5\x7B\x52\xCE\x7B\x31\xDE\x84\x42\xC6\x73\x42\xC6" + "\x73\x42\xBD\x63\x29\xBD\x6B\x21\xC6\x73\x42\xBD\x63\x29\xBD\x63\x29" + "\xBD\x63\x29\xA5\x52\x21\xA5\x52\x10\xA5\x52\x21\xA5\x52\x10\xBD\x6B" + "\x21\xA5\x52\x10\xA5\x52\x21\xBD\x63\x29\x8C\x39\x08\x8C\x39\x08\xA5" + "\x52\x21\xA5\x7F\x52\x21\xA5\x52\x21\xA5\x52\x21\x8C\x5A\x31\xA5\x52" + "\x10\x7B\x42\x18\x9C\x42\x08\xA5\x52\x21\x7B\x42\x18\xB5\x7B\x52\xC6" + "\x7B\x5A\xA5\x52\x21\xBD\x7B\x29\xD6\x73\x29\xBD\x63\x29\xD6\x73\x29" + "\xDE\x73\x42\xD6\x73\x29\xDE\x73\x42\xD6\x73\x29\xBD\x63\x29\xD6\x7B" + "\x39\xBD\x6B\x21\xBD\x63\x29\xBD\x63\x29\x9C\x63\x39\xBD\x6B\x21\xAD" + "\x6B\x42\xBD\x63\x29\x9C\x63\x39\x7B\x42\x18\x9C\x63\x39\x7B\x42\x18" + "\xDE\xA5\x52\xE7\x7F\x42\xE7\x7F\x42\xFF\x94\x42\xD6\x7B\x39\xBD\x7B" + "\x29\xBD\x7B\x29\xA5\x52\x21\xDE\x84\x52\xFF\xCE\x7F\x8C\xC6\x73\x42" + "\xFF\x9C\x52\xDE\x84\x52\xCE\x7B\x31\xF7\x9C\x63\xEF\x94\x5A\xF7\x9C" + "\x63\xFF\x9C\x52\xFF\xC6\x73\xFF\xC6\x73\xEF\xA5\x6B\xFF\xAD\x73\xFF" + "\xA5\x6B\xFF\xB5\x6B\xFF\xCE\x8C\xF7\x9C\x63\xFF\xA5\x6B\xFF\xB5\x7B" + "\xFF\xA5\x5A\xFF\xB5\x6B\xFF\xB5\x6B\xEF\xA5\x6B\xFF\xC6\x73\xFF\xB5" + "\x6B\xFF\xAD\x73\xFF\xB5\x7B\xFF\xB5\x6B\xFF\x9C\x52\xFF\xB5\x6B\xFF" + "\xB5\x7B\xDE\x84\x52\xB5\x7B\x52\xC6\x7B\x5A\xBD\x6B\x39\xBD\x6B\x21" + "\xF7\x9C\x63\xDE\x73\x42\xDE\x73\x42\xD6\x73\x29\xE7\x8C\x52\xE7\x7F" + "\x42\xD6\x73\x29\x7F\xC6\x73\x42\xD6\x7B\x39\xBD\x6B\x39\xBD\x6B\x21" + "\xBD\x7B\x29\xDE\x73\x42\xA5\x52\x21\xBD\x63\x29\xC6\x73\x42\xBD\x7B" + "\x29\x9C\x63\x39\x9C\x63\x39\xB5\x7B\x52\xEF\x94\x42\xFF\xAD\x73\xEF" + "\x94\x42\xFF\xCE\x8C\xFF\xCE\x8C\xD6\x9C\x73\xF7\x8C\x52\xE7\x94\x5A" + "\xE7\x94\x5A\xF7\xDE\xB1\xEF\xA5\x6B\xEF\x9C\x63\xFF\xC6\x73\xFF\xA5" + "\x6B\xF7\x8C\x52\xF7\x8C\x63\xFF\xA5\x6B\xFF\xA5\x5A\xFF\xC6\x73\xF7" + "\xB5\x84\xF7\x9C\x63\xF7\x8C\x52\xFF\xA5\x52\xF7\x8C\x52\x8C\x39\x08" + "\xFF\xA5\x5A\xBD\x6B\x21\xCE\x7B\x4A\xFF\xA5\x5A\xDE\x7F\x84\x42\xF7" + "\x8C\x52\xFF\xA5\x5A\xFF\xB5\x6B\xBD\x7B\x29\xFF\x9C\x52\xDE\x84\x42" + "\xFF\xB5\x6B\xBD\x6B\x21\xDE\x84\x52\xBD\x6B\x21\xEF\xA5\x73\xB5\x7B" + "\x52\xC6\x7B\x5A\xC6\x73\x42\xFF\xA5\x6B\xE7\x8C\x52\xE7\x7F\x42\xE7" + "\x8C\x52\xDE\x73\x42\xDE\x73\x42\xC6\x73\x42\xE7\x8C\x52\xDE\x73\x42" + "\xC6\x73\x42\xCE\x7B\x4A\xC6\x73\x42\xDE\x73\x42\xCE\x7B\x4A\xCE\x7B" + "\x4A\xCE\x7B\x4A\xDE\x73\x42\xA5\x52\x21\xF7\xB5\x84\x7B\x42\x18\xDE" + "\x84\x42\xEF\x94\x5A\xF7\x8C\x42\xF7\x8C\x52\xFF\x9C\x52\xDE\x84\x52" + "\xBD\x7B\x29\xDE\x84\x7F\x52\xEF\x94\x5A\xC6\x73\x42\xFF\xF7\xDE\xCE" + "\x8C\x63\xBD\x6B\x21\xDE\x73\x42\xEF\x94\x5A\xEB\x77\x39\xDE\x73\x42" + "\xDE\x84\x42\xEF\x94\x5A\xCE\x7B\x31\xFF\x9C\x52\xFF\xA5\x5A\xFF\xA5" + "\x52\xFF\xA5\x5A\xEF\x94\x42\xEF\x94\x5A\xFF\xA5\x5A\xCE\x7B\x4A\xFF" + "\xAD\x73\xFF\xA5\x5A\xFF\xA5\x5A\xEF\x9C\x63\xCE\x7B\x31\xFF\xA5\x6B" + "\xBD\x5A\x18\xEF\x9C\x63\xFF\xB5\x6B\x52\x21\x08\xDE\x73\x42\xE7\xA5" + "\x5A\xBD\x63\x29\xF7\xB5\x84\x9C\x63\x39\xDE\x84\x52\x8C\x39\x08\xBD" + "\x63\x29\xBD\x6B\x21\xD6\x73\x29\xBD\x63\x29\xBD\x63\x29\x7F\xBD\x5A" + "\x18\xA5\x52\x21\xBD\x63\x29\xBD\x5A\x18\xBD\x5A\x18\xE7\x8C\x52\xD6" + "\x73\x29\xA5\x52\x21\xBD\x63\x29\xBD\x63\x29\xDE\x73\x42\xBD\x6B\x39" + "\xA5\x52\x10\x9C\x63\x39\x8C\x39\x08\x8C\x39\x08\xE7\x94\x5A\xE7\x7F" + "\x42\xF7\x8C\x52\xF7\x8C\x52\xE7\x7F\x42\xB5\x7B\x52\xFF\xAD\x73\x9C" + "\x42\x08\xF7\xB5\x84\xF7\xDE\xB1\xF7\xDE\xB1\xA5\x52\x21\xF7\x8C\x52" + "\xF7\x8C\x42\xFF\xA5\x5A\xBD\x7B\x29\xE7\x7B\x52\xF7\x8C\x52\xFF\xA5" + "\x5A\xFF\xA5\x5A\xEF\x94\x42\xFF\x9C\x52\xEF\x94\x5A\xEF\xA5\x6B\xBD" + "\x6B\x21\xFF\xAD\x73\xDE\x7F\x73\x42\x8C\x39\x08\xE7\x7F\x42\xFF\xA5" + "\x52\xEF\x94\x5A\xD6\x7B\x39\xDE\x84\x52\xDE\x73\x42\xEF\x94\x5A\xE7" + "\x8C\x52\xFF\xB5\x7B\xBD\x6B\x21\xCE\x8C\x63\xA5\x52\x10\xDE\xA5\x52" + "\xC6\x73\x42\x8C\x39\x08\x8C\x39\x08\xF7\x9C\x63\xE7\x7F\x42\xFF\x9C" + "\x52\xF7\x8C\x52\xF7\x8C\x63\xF7\x8C\x52\xF7\x8C\x52\xF7\x9C\x63\xFF" + "\x9C\x52\xDE\x84\x52\xEB\x77\x39\xF7\x8C\x52\xFF\xA5\x5A\xF7\x8C\x52" + "\xDE\x84\x42\xE7\x8C\x52\xF7\x8C\x52\xFF\x9C\x52\xF7\x9C\x63\xEF\x9C" + "\x63\xF7\x9C\x63\xFF\x9C\x52\xF7\x8C\x42\xE7\x7F\x42\xF7\x8C\x7F\x52" + "\xE7\x7F\x42\xBD\x6B\x39\xFF\xA5\x6B\x8C\x39\x08\xF7\xB5\x84\xD6\x9C" + "\x73\xBD\x9C\x6B\xA5\x52\x10\xFF\xC6\x73\xEF\x94\x5A\xFF\xA5\x52\xDE" + "\x84\x42\xD6\x7B\x39\xF7\x9C\x63\xEF\x94\x42\xEF\xA5\x6B\xFF\xA5\x5A" + "\xDE\x84\x42\xFF\xA5\x6B\xFF\xA5\x6B\xD6\x73\x29\xFF\xB5\x6B\xA5\x52" + "\x10\xFF\xA5\x6B\xBD\x6B\x39\xFF\x9C\x52\xF7\x8C\x52\xFF\x9C\x52\xDE" + "\x84\x52\xDE\x84\x42\xFF\xB5\x6B\xE7\x94\x5A\xFF\xC6\x63\xFF\xA5\x6B" + "\xFF\xCE\x8C\xFF\xB5\x6B\xF7\xDE\xB1\x9C\x63\x39\xFF\xB5\x7B\xFF\xB5" + "\x7B\xDE\x84\x42\xF7\x8C\x52\x7F\xE7\x7F\x42\xEF\x94\x42\xF7\x8C\x52" + "\xEF\x94\x5A\xEF\x94\x42\xDE\x84\x52\xFF\xA5\x5A\xFF\xA5\x5A\xEF\x94" + "\x42\xEF\x94\x5A\xFF\x94\x42\xF7\x8C\x42\xFF\xB5\x6B\xFF\xA5\x5A\xFF" + "\xA5\x5A\xEF\x94\x42\xF7\x8C\x52\xFF\xA5\x5A\xE7\x7F\x42\xF7\x8C\x52" + "\xFF\xA5\x6B\xF7\x8C\x52\xEF\xA5\x6B\xF7\x8C\x52\xE7\x94\x5A\xFF\xB5" + "\x7B\xA5\x52\x10\xEF\xA5\x6B\xF7\xDE\xB1\xEF\xA5\x6B\xE7\x8C\x52\xBD" + "\x6B\x39\xEB\x77\x39\xE7\x8C\x52\xEF\x9C\x63\xFF\xAD\x73\xE7\x7B\x52" + "\xE7\x8C\x52\xEF\x9C\x63\xFF\xA5\x6B\xCE\x7B\x4A\xBD\x6B\x21\xBD\x7F" + "\x7B\x29\xDE\x84\x42\xEF\x94\x42\xFF\xC6\x73\xFF\xCE\x8C\xFF\xA5\x5A" + "\xEF\x9C\x63\xD6\x7B\x39\xBD\x6B\x21\xDE\x73\x42\xBD\x6B\x21\xD6\x73" + "\x29\xEF\x94\x42\xDE\x84\x42\xDE\x84\x42\xDE\x84\x42\xA5\x52\x10\xE7" + "\x94\x5A\xBD\x6B\x21\xE7\x8C\x52\xD6\x73\x29\xEF\x94\x5A\xBD\x7B\x29" + "\xEF\x94\x5A\xBD\x6B\x39\xDE\x84\x52\xBD\x6B\x39\xE7\x8C\x52\xEF\x94" + "\x5A\xCE\x7B\x4A\xDE\x73\x42\xE7\x8C\x52\xCE\x7B\x4A\xEF\x94\x5A\xE7" + "\x8C\x52\xF7\x8C\x52\xEB\x77\x39\xE7\x7F\x42\xFF\x9C\x52\xEF\x94\x5A" + "\xF7\x8C\x52\xFF\x9C\x52\xE7\x7F\x2D\x42\xF7\x8C\x42\xE7\x7F\x42\xDE" + "\x84\x42\xEF\x94\x42\xCE\x7B\x4A\xFF\xCE\x8C\xFF\xB5\x6B\xFF\xCE\x8C" + "\xFF\xC6\x73\xD6\x9C\x73\xEF\x94\x42\xDE\x73\x42\xBD\x6B\x39\xF7\x8C" + "\x52\xFF\x9C\x82\x52\x7F\x21\x08\xF7\xB5\x84\xC6\x73\x42\x8C\x39\x08" + "\xF7\x9C\x63\xEF\x94\x42\xBD\x7B\x29\xEF\xA5\x73\x8C\x39\x08\xFF\xB5" + "\x7B\xBD\x6B\x21\xFF\xCE\x8C\xFF\xCE\x8C\xA5\x52\x10\xFF\xB5\x7B\x8C" + "\x39\x08\xEF\x94\x5A\xEF\x9C\x63\xDE\x84\x52\xEF\x9C\x63\xDE\xA5\x52" + "\xEF\x94\x42\xE7\x8C\x52\xE7\x94\x5A\xD6\x9C\x73\x8C\x5A\x31\xD6\x7B" + "\x39\xA5\x52\x10\xF7\xB5\x84\xCE\x8C\x63\xF7\xDE\xB1\xF7\xDE\xB1\xF7" + "\xDE\xB1\xFF\xF7\xDE\xF7\xDE\xB1\xFF\xF7\xDE\xFF\xF7\xDE\xFF\xF7\xDE" + "\xF7\xDE\xB1\xFF\xF7\xDE\xF7\xDE\xB1\x9C\x63\x39\xF7\xB5\x7F\x84\xDE" + "\x84\x42\xFF\xC6\x63\xF7\x9C\x63\xFF\xA5\x5A\xFF\x9C\x52\xDE\x73\x42" + "\xE7\x7F\x42\xE7\x7F\x42\xD6\x7B\x39\xE7\x7F\x42\xE7\x7F\x42\xD6\x7B" + "\x5A\xE7\x8C\x52\xF7\x9C\x63\xF7\x9C\x63\xF7\xDE\xB1\xDE\xA5\x52\xE7" + "\x7F\x42\xF7\x9C\x63\xF7\x8C\x42\xFF\x9C\x52\xE7\x7F\x42\xFF\x9C\x52" + "\xFF\x9C\x52\xE7\x7F\x42\xE7\x8C\x52\xE7\x7F\x42\xCE\x7B\x31\xEF\x94" + "\x42\xE7\x8C\x52\xEF\x9C\x63\xEF\x9C\x63\xFF\xA5\x5A\xE7\xA5\x5A\xF7" + "\x8C\x52\xFF\xC6\x63\xF7\x8C\x52\xEF\x9C\x63\xFF\xAD\x73\xFF\xB5\x7B" + "\xFF\xB5\x6B\xFF\xB5\x6B\x36\xFF\xB5\x6B\xF7\xB5\x84\xEF\xA5\x6B\xF7" + "\xB5\x84\xF7\x9C\x63\x9C\x63\x39\x9C\x63\x39\xAD\x6B\x42\xBD\x6B\x39" + "\xC6\x7B\x5A\xB5\x7B\x52\xAD\x6B\x42\xB5\x7B\x52\xB5\x7B\x52\xF7\xDE" + "\xB1\xD6\xAD\x84\xD6\xAD\x84\xF7\xDE\xB1\x82\xFF\x01\xFB\x82\xFF\x01" + "\xFB\x83\xFF\x7F\xF7\xDE\xB1\xCE\x8C\x63\xBD\x5A\x18\xFF\xB5\x6B\xFF" + "\xA5\x5A\xEF\x94\x42\xFF\xA5\x5A\xFF\xA5\x5A\xFF\xA5\x6B\xFF\xA5\x5A" + "\xFF\xC6\x63\xEF\xA5\x6B\xFF\x9C\x52\xC6\x7B\x5A\xD6\x73\x29\xA5\x52" + "\x21\x9C\x42\x08\xF7\xDE\xB1\xBD\x7B\x29\xEF\x94\x5A\xD6\x9C\x73\xF7" + "\x8C\x52\xE7\x8C\x52\xBD\x7B\x29\xDE\x73\x42\xC6\x73\x42\xDE\x73\x42" + "\xD6\x7B\x39\xBD\x63\x29\xD6\x73\x29\xA5\x52\x21\xBD\x6B\x21\xD6\x73" + "\x29\x9C\x42\x08\xA5\x52\x21\xA5\x52\x21\xA5\x52\x21\xBD\x6B\x39\xBD" + "\x63\x29\x9C\x42\x08\x8C\x39\x08\x9C\x42\x08\x8C\x3E\x39\x08\x8C\x39" + "\x08\xA5\x52\x10\xBD\x63\x29\x8C\x39\x08\x9C\x63\x39\x7B\x42\x18\x8C" + "\x5A\x31\xBD\x63\x29\xEF\xA5\x73\xFF\xB5\x6B\xFF\xC6\x63\xFF\xA5\x6B" + "\xFF\xB5\x6B\xFF\xCE\x8C\xEF\xA5\x73\xE7\xA5\x5A\xCE\x8C\x63\xD6\x9C" + "\x73\xFF\xF7\xDE\xFF\xF7\xDE\x83\xC0\x7F\xF7\xDE\xB1\xFF\xF7\xDE\xFF" + "\xF7\xDE\xF7\xDE\xB1\x8C\x5A\x31\xB5\x7B\x52\xFF\xB5\x6B\xFF\xAD\x73" + "\xFF\xA5\x6B\xEF\x9C\x63\xE7\x7F\x42\xFF\xA5\x5A\xEF\x94\x42\xE7\x8C" + "\x52\xCE\x7B\x4A\xEF\x9C\x63\xFF\xB5\x7B\xF7\xB5\x84\xF7\xDE\xB1\xA5" + "\x52\x21\xDE\x84\x42\xBD\x6B\x21\xE7\x8C\x52\xDE\x73\x42\xF7\x9C\x73" + "\xDE\x73\x42\xFF\xA5\x52\xE7\x8C\x52\xFF\xA5\x6B\xEF\x9C\x63\xEF\x94" + "\x5A\xF7\x9C\x63\xFF\x9C\x52\xFF\xAD\x73\xF7\xDE\xB1\xF7\x9C\x63\xFF" + "\xC6\x73\xFF\xA5\x6B\xFF\xA5\x6B\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xB5\x6B" + "\xF7\x59\xB5\x84\xFF\xB5\x7B\xEF\x9C\x63\xFF\xB5\x6B\xEF\x9C\x63\xE7" + "\xA5\x5A\xDE\x84\x42\xE7\xA5\x5A\x8C\x5A\x31\xEF\x94\x5A\xF7\x8C\x52" + "\xFF\xC6\x73\xFF\xA5\x52\xE7\xA5\x5A\xFF\xA5\x52\xFF\xA5\x5A\xFF\xA5" + "\x5A\xFF\xA5\x5A\xEF\x94\x5A\xEF\xA5\x73\x8C\x39\x08\xA5\x52\x21\xD6" + "\xAD\x84\xF7\xDE\xB1\xD6\xAD\x84\xD6\xAD\x84\xFF\xF7\xDE\x8C\x5A\x31" + "\xF7\xB5\x84\x52\x21\x08\x83\x00\x7F\x52\x21\x08\x9C\x63\x39\xFF\xA5" + "\x6B\xF7\x8C\x42\xE7\x7F\x42\xEF\x94\x42\xB5\x7B\x52\xFF\xAD\x73\xEF" + "\x94\x42\xFF\xB5\x6B\xF7\xB5\x84\xCE\x7B\x31\xFF\xB5\x7B\xF7\x9C\x63" + "\xFF\xB5\x6B\xFF\xCE\x8C\xDE\xA5\x52\xFF\xCE\x8C\xFF\xA5\x5A\xFF\xB5" + "\x6B\xEF\x94\x5A\xFF\xB5\x6B\xBD\x6B\x21\xFF\x9C\x52\xFF\xA5\x6B\xFF" + "\xA5\x5A\xBD\x6B\x21\xFF\xC6\x73\xF7\x9C\x63\xD6\x7B\x39\xBD\x5A\x18" + "\xFF\xB5\x6B\xDE\x84\x42\xBD\x7B\x29\xFF\xA5\x6B\xBD\x7B\x29\x7B\x42" + "\x18\xFF\xA5\x52\xFF\xC6\x73\xC6\x73\x42\xBD\x5A\x18\xF7\xB5\x84\x7B" + "\x7F\x42\x18\xDE\xA5\x52\xF7\x8C\x42\xF7\x8C\x42\xE7\x8C\x52\xFF\x94" + "\x42\xF7\x8C\x42\xE7\x7F\x42\xFF\x9C\x52\xE7\x8C\x52\xEB\x77\x39\xEB" + "\x77\x39\xF7\x8C\x52\xE7\x8C\x52\xF7\x8C\x42\xF7\x8C\x63\xF7\x8C\x63" + "\xD6\x7B\x5A\xF7\x9C\x73\x9C\x63\x39\xAD\x6B\x42\x8C\x39\x08\xD6\xAD" + "\x84\x9C\x63\x39\x52\x21\x08\x8C\x5A\x31\xFF\x9C\x52\xF7\x8C\x63\xF7" + "\x8C\x52\xCE\x8C\x63\xDE\x84\x52\xEF\xA5\x6B\xEF\x9C\x63\xF7\xDE\xB1" + "\xE7\x7F\x42\xD6\x73\x29\xD6\x7B\x39\xBD\x6B\x21\xCE\x7B\x31\xBD\x5A" + "\x18\xDE\xA5\x52\xFF\xA5\x5A\xFF\xB5\x7F\x6B\xFF\xA5\x5A\xFF\xA5\x5A" + "\xA5\x52\x10\xE7\x94\x5A\xFF\xA5\x5A\xFF\xA5\x5A\xBD\x6B\x21\xEF\xA5" + "\x73\xFF\xA5\x6B\xBD\x63\x29\xF7\xB5\x84\xBD\x63\x29\xEF\x9C\x63\xBD" + "\x63\x29\xE7\xA5\x5A\xBD\x7B\x29\xFF\xAD\x73\xCE\x7B\x31\xE7\x94\x5A" + "\xCE\x7B\x4A\xDE\x84\x42\xCE\x8C\x63\x8C\x5A\x31\xF7\x8C\x52\xEF\x94" + "\x5A\xFF\x9C\x52\xF7\x8C\x42\xF7\x8C\x52\xEF\x94\x42\xF7\x8C\x42\xEF" + "\x94\x42\xF7\x8C\x42\xFF\x94\x42\xEF\x94\x5A\xFF\x9C\x52\xFF\x9C\x52" + "\xF7\x8C\x52\xF7\x8C\x52\xEF\x94\x42\xF7\x8C\x52\xE7\x8C\x52\xA5\x52" + "\x21\x7F\xA5\x52\x21\xD6\x9C\x73\xA5\x52\x21\x52\x21\x08\x7B\x42\x18" + "\xF7\x8C\x63\xE7\x7F\x42\xDE\x73\x42\xE7\x7F\x42\xB5\x7B\x52\xA5\x52" + "\x10\xEF\x94\x5A\x8C\x39\x08\xF7\xDE\xB1\xE7\x94\x5A\xEF\x9C\x63\xF7" + "\x9C\x63\xF7\x9C\x63\xE7\x8C\x52\xEF\x9C\x63\xA5\x52\x21\xEF\xA5\x6B" + "\xEF\x9C\x63\xE7\x7F\x42\xEF\xA5\x73\x8C\x39\x08\xEF\x9C\x63\x9C\x42" + "\x08\xF7\x8C\x52\xBD\x7B\x29\xDE\x84\x52\xFF\xAD\x73\xA5\x52\x21\xE7" + "\x94\x5A\xBD\x7B\x29\xFF\xAD\x73\x8C\x39\x08\xE7\x94\x5A\xCE\x7B\x4A" + "\xFF\xA5\x6B\x8C\x39\x08\xD6\x7B\x5A\xCE\x7F\x7B\x4A\xDE\x84\x42\xD6" + "\x9C\x73\x8C\x39\x08\xEF\x9C\x63\xF7\x8C\x42\xE7\x7F\x42\x9C\x42\x08" + "\xF7\x9C\x63\xE7\x7F\x42\xFF\x94\x42\xFF\x94\x42\xEF\x94\x5A\xFF\x94" + "\x42\xFF\x94\x42\xEF\x94\x5A\xF7\x8C\x42\xF7\x8C\x52\xF7\x8C\x42\xE7" + "\x7F\x42\xEB\x77\x39\xBD\x63\x29\xBD\x6B\x39\xCE\x8C\x63\xEF\x94\x5A" + "\xFF\x9C\x52\xF7\x8C\x63\xF7\x8C\x42\xE7\x8C\x52\xD6\x7B\x39\xE7\x7F" + "\x42\xDE\x84\x52\xCE\x7B\x4A\xDE\x84\x42\xFF\x9C\x52\xEF\xA5\x73\xF7" + "\xDE\xB1\xFF\xC6\x73\xDE\x84\x52\xD6\x73\x29\xF7\x9C\x63\xD6\x73\x29" + "\xC6\x73\x7F\x42\xFF\xC6\x63\xA5\x52\x21\xFF\x9C\x52\xDE\x84\x42\xF7" + "\x9C\x63\x8C\x39\x08\xF7\x9C\x63\xE7\x8C\x52\xBD\x6B\x21\xC6\x73\x42" + "\xE7\x94\x5A\xF7\x9C\x73\xBD\x63\x29\xFF\xAD\x73\xBD\x63\x29\xDE\x73" + "\x42\xBD\x63\x29\xCE\x8C\x63\xD6\x73\x29\xEF\x9C\x63\xEF\x94\x5A\xEF" + "\xA5\x73\xA5\x52\x10\xFF\xA5\x6B\xCE\x7B\x4A\x7B\x42\x18\xFF\xA5\x5A" + "\xF7\x8C\x42\xF7\x8C\x42\xEF\x94\x42\xF7\x8C\x52\xF7\x8C\x52\xF7\x8C" + "\x52\xEF\x94\x42\xFF\x94\x42\xEF\x94\x42\xEB\x77\x39\xFF\x9C\x52\xF7" + "\x8C\x42\xF7\x8C\x42\xFF\x9C\x52\xE7\x8C\x52\x7F\xFF\xB5\x7B\xD6\x7B" + "\x5A\xC6\x7B\x5A\xF7\x9C\x73\xBD\x63\x29\xDE\x73\x42\xD6\x73\x29\xF7" + "\x9C\x63\xE7\x7F\x42\xF7\x8C\x42\xE7\x8C\x52\xD6\x73\x29\xBD\x6B\x39" + "\xE7\x8C\x52\xD6\x73\x29\xE7\x8C\x52\xF7\xDE\xB1\xD6\xAD\x84\xBD\x6B" + "\x21\xDE\x84\x42\xBD\x6B\x21\xF7\x8C\x42\xDE\x73\x42\xD6\x73\x29\xFF" + "\xB5\x7B\xFF\xB5\x6B\xCE\x7B\x31\xFF\xC6\x73\x8C\x39\x08\xE7\x7B\x52" + "\xF7\x8C\x52\xE7\x8C\x52\xE7\x7F\x42\xEF\x94\x5A\xFF\xA5\x6B\xBD\x5A" + "\x18\xE7\x8C\x52\xFF\xAD\x73\xDE\x84\x42\xFF\xB5\x7B\xE7\x8C\x52\xE7" + "\x8C\x52\xFF\x7F\xA5\x5A\xFF\xA5\x5A\xFF\xA5\x6B\xFF\xB5\x7B\xDE\x84" + "\x42\xB5\x7B\x52\x8C\x39\x08\xFF\xC6\x73\xF7\x8C\x52\xF7\x8C\x52\xFF" + "\xA5\x52\xF7\x9C\x63\xFF\x94\x42\xEF\x94\x5A\xFF\x94\x42\xF7\x9C\x63" + "\xFF\x94\x42\xEF\x94\x42\xFF\x94\x42\xEF\xA5\x6B\xFF\x94\x42\xEF\x94" + "\x42\xF7\x8C\x42\xBD\x5A\x18\xBD\x63\x29\xBD\x6B\x39\xBD\x5A\x18\xE7" + "\x7F\x42\xBD\x6B\x21\xA5\x52\x21\xE7\x7F\x42\xE7\x7F\x42\xE7\x7F\x42" + "\xE7\x7B\x52\xDE\x73\x42\xC6\x73\x42\xEF\x9C\x63\xFF\xAD\x73\xF7\x9C" + "\x73\xF7\xDE\xB1\xFF\xCE\x8C\xE7\x8C\x52\xFF\xA5\x7F\x52\xFF\x9C\x52" + "\xF7\x8C\x42\xFF\xA5\x52\xFF\xA5\x6B\xFF\x9C\x52\xFF\xA5\x5A\xFF\xC6" + "\x73\xEF\xA5\x73\xFF\xAD\x73\xFF\xA5\x6B\xFF\xB5\x7B\xFF\xA5\x5A\xFF" + "\xA5\x6B\xEF\xA5\x6B\xFF\xA5\x6B\xEF\xA5\x6B\xFF\xA5\x6B\xF7\x8C\x52" + "\xE7\x94\x5A\xEF\xA5\x6B\xFF\xAD\x73\xFF\xC6\x73\xEF\xA5\x73\xFF\xB5" + "\x6B\xFF\xC6\x73\xEF\xA5\x73\xFF\xC6\x73\xD6\x9C\x73\x7B\x42\x18\xE7" + "\x94\x5A\xE7\x94\x5A\xE7\x94\x5A\xBD\x6B\x21\xD6\x7B\x39\xFF\xA5\x5A" + "\xFF\xA5\x6B\xDE\x73\x42\xFF\xA5\x52\xEF\x94\x42\xFF\xA5\x52\xE7\x7F" + "\x42\xBD\x6B\x21\x7F\xFF\xCE\x8C\xDE\x84\x52\xF7\x8C\x52\xF7\x8C\x42" + "\xF7\x9C\x63\xF7\x9C\x63\xF7\x9C\x63\xFF\x9C\x52\xDE\x73\x42\xE7\x7F" + "\x42\xDE\x73\x42\xF7\x8C\x52\xD6\x73\x29\xC6\x73\x42\xC6\x73\x42\xBD" + "\x7B\x29\x9C\x42\x08\xA5\x52\x21\x8C\x39\x08\xF7\xDE\xB1\xF7\xDE\xB1" + "\xAD\x6B\x42\xDE\x73\x42\xBD\x6B\x21\xC6\x73\x42\xBD\x7B\x29\xBD\x63" + "\x29\xA5\x52\x10\xBD\x7B\x29\xBD\x6B\x21\xBD\x63\x29\xBD\x63\x29\xBD" + "\x63\x29\xBD\x63\x29\xA5\x52\x10\xBD\x63\x29\x8C\x39\x08\xA5\x52\x21" + "\xA5\x52\x10\xA5\x52\x21\xA5\x52\x10\xA5\x52\x10\xA5\x40\x52\x21\xA5" + "\x52\x10\xA5\x52\x21\xA5\x52\x10\xA5\x52\x10\x8C\x39\x08\xA5\x52\x21" + "\xA5\x52\x21\x52\x21\x08\x8C\x5A\x31\xC6\x73\x42\xF7\xDE\xB1\xF7\xDE" + "\xB1\xFF\xF7\xDE\xF7\xDE\xB1\xD6\xAD\x84\xF7\x9C\x63\xD6\x7B\x39\xFF" + "\xA5\x5A\xF7\x8C\x42\xE7\x7F\x42\xE7\x7B\x82\x52\x7F\x21\x08\x52\x21" + "\x08\xE7\x7B\x52\xF7\x9C\x63\xFF\x94\x42\xF7\x8C\x42\xF7\x8C\x42\xF7" + "\x8C\x52\xDE\x73\x42\xF7\x8C\x42\xF7\x8C\x52\xF7\x8C\x42\xE7\x7F\x42" + "\xDE\x73\x42\xDE\x84\x42\xDE\x84\x52\xB5\x7B\x52\xFF\xA5\x6B\xEF\xA5" + "\x6B\xFF\xA5\x6B\xF7\xB5\x84\xB5\x7B\x52\xDE\x84\x42\xE7\x8C\x52\xDE" + "\x84\x42\xD6\x7B\x39\xDE\x84\x42\xF7\x9C\x63\xEF\x9C\x63\xFF\xA5\x6B" + "\xFF\xB5\x6B\xEF\x9C\x63\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xA5" + "\x5A\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xB5\x6B\xFF\xB5\x6B\xEF\xA5\x6B\xF7" + "\x8C\x52\xEF\xA5\x2B\x73\xFF\xAD\x73\xEF\xA5\x73\xEF\xA5\x6B\xFF\xB5" + "\x7B\xFF\xA5\x6B\xEF\xA5\x73\xF7\xB5\x84\xFF\xAD\x73\xCE\x8C\x63\xA5" + "\x52\x21\xBD\x6B\x21\xCE\x8C\x63\xF7\xDE\xB1\xF7\xDE\xB1\x82\xFF\x7F" + "\xFB\xF7\xDE\xB1\xFF\xF7\xDE\xF7\xDE\xB1\xCE\x8C\x63\xAD\x6B\x42\xEF" + "\x9C\x63\xF7\x9C\x73\xC6\x73\x42\xFF\xCE\x8C\x7B\x42\x18\xBD\x6B\x39" + "\xBD\x6B\x39\xE7\x7B\x52\xF7\x8C\x52\xFF\x9C\x52\xF7\x8C\x42\xF7\x8C" + "\x42\xF7\x8C\x52\xF7\x8C\x42\xD6\x73\x29\xDE\x84\x52\xBD\x7B\x29\xC6" + "\x73\x42\xAD\x6B\x42\xF7\x8C\x52\xF7\x8C\x52\xF7\x8C\x52\xBD\x63\x29" + "\xD6\x7B\x39\xF7\x8C\x52\xE7\x7F\x42\xFF\x9C\x52\xE7\x7F\x42\xEF\x9C" + "\x63\xFF\x9C\x52\xF7\x8C\x52\xF7\x9C\x63\xEF\x94\x5A\xF7\x9C\x63\xFF" + "\x9C\x52\xE7\x8C\x52\xF7\x8C\x52\x56\xF7\x8C\x52\xE7\x8C\x52\xFF\x94" + "\x42\xD6\x73\x29\xE7\x8C\x52\xE7\x7F\x42\xF7\x8C\x52\xEF\x94\x5A\xE7" + "\x8C\x52\xF7\x9C\x63\xF7\x9C\x63\xEF\x94\x5A\xEF\xA5\x6B\xFF\xA5\x6B" + "\xBD\x6B\x39\xCE\x7B\x4A\xCE\x8C\x63\xA5\x52\x10\xEF\xA5\x73\xCE\x7B" + "\x4A\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xFF\xF7\xDE\xFF\xF7\xDE\xF7" + "\xDE\xB1\xD6\xAD\x84\xD6\xAD\x84\xB5\x7B\x82\x52\x7F\x21\x08\x8C\x5A" + "\x31\x52\x21\x08\x7B\x42\x18\x7B\x42\x18\x52\x21\x08\xD6\x7B\x5A\xFF" + "\x9C\x52\xF7\x8C\x42\xEF\x94\x42\xF7\x9C\x63\xFF\xAD\x73\xF7\x8C\x42" + "\xF7\x8C\x52\xCE\x7B\x4A\xDE\x73\x42\xDE\x73\x42\xB5\x7B\x52\xEF\x94" + "\x5A\xF7\x8C\x63\xEF\x9C\x63\xBD\x6B\x39\xFF\xC6\x73\xE7\x7B\x52\xEF" + "\x94\x42\xDE\x84\x42\xE7\x8C\x52\x9C\x42\x08\xF7\x8C\x63\xE7\x8C\x52" + "\xD6\x73\x29\xF7\x9C\x73\xDE\x73\x42\xFF\xAD\x73\xA5\x52\x21\xFF\xAD" + "\x73\xA5\x52\x10\xF7\x9C\x63\xCE\x7B\x4A\xEF\xA5\x6B\xDE\x73\x42\xCE" + "\x7B\x4A\xE7\x7F\x37\x42\xEF\x94\x5A\xA5\x52\x10\xE7\x8C\x52\xE7\x94" + "\x5A\xEF\xA5\x6B\x8C\x39\x08\xBD\x7B\x29\xA5\x52\x21\xBD\x6B\x21\xCE" + "\x8C\x63\x7B\x42\x18\xF7\xB5\x84\xD6\x9C\x73\xF7\xDE\xB1\xF7\xB5\x84" + "\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\x82\xFF\x7F\xFB\xF7\xDE\xB1\xD6" + "\xAD\x84\xC6\x7B\x5A\x8C\x39\x08\x7B\x42\x18\x52\x21\x08\x7B\x42\x18" + "\x52\x21\x08\x52\x21\x08\xE7\x7B\x52\xF7\x9C\x63\xFF\x9C\x52\xEF\x94" + "\x42\xFF\x94\x42\xE7\x7B\x52\xD6\x73\x29\xE7\x7F\x42\xDE\x73\x42\xDE" + "\x73\x42\xE7\x8C\x52\xB5\x7B\x52\x8C\x39\x08\xEF\x94\x5A\xDE\x73\x42" + "\xEF\x9C\x63\xDE\x73\x42\xFF\xA5\x5A\xE7\x94\x5A\x8C\x39\x08\xF7\x9C" + "\x63\xA5\x52\x21\xF7\xB5\x84\xFF\xAD\x73\xBD\x63\x29\xF7\x9C\x63\xDE" + "\x84\x42\xE7\x94\x5A\xC6\x73\x42\xF7\xB5\x84\xDE\x84\x52\xEF\xA5\x6B" + "\xBD\x63\x29\x54\xF7\x9C\x63\xA5\x52\x21\x9C\x42\x08\xEF\x94\x5A\xD6" + "\x9C\x73\xCE\x7B\x4A\xE7\x94\x5A\xFF\xA5\x6B\xEF\x9C\x63\xEF\xA5\x6B" + "\xEF\x9C\x63\xFF\xA5\x6B\xA5\x52\x21\xCE\x7B\x4A\x9C\x63\x39\x9C\x42" + "\x08\xA5\x52\x21\xCE\x7B\x4A\xA5\x52\x10\xE7\x94\x5A\xE7\x94\x5A\xFF" + "\xA5\x6B\xE7\x94\x5A\xE7\x94\x5A\xF7\x9C\x73\xFF\xAD\x73\xF7\x9C\x73" + "\xAD\x6B\x42\x82\xFF\x7F\xFB\x52\x21\x08\xF7\xB5\x84\xFF\xA5\x6B\xFF" + "\x94\x42\xFF\xA5\x5A\xFF\xA5\x5A\xFF\xA5\x52\xEF\x94\x42\xF7\x8C\x42" + "\xFF\x9C\x52\xF7\x9C\x63\xE7\x7F\x42\xD6\x73\x29\xE7\x8C\x52\xAD\x6B" + "\x42\xDE\x84\x52\xF7\x9C\x63\xBD\x5A\x18\xBD\x6B\x21\xDE\x73\x42\xBD" + "\x5A\x18\xEF\x94\x5A\xFF\xB5\x7B\xFF\xAD\x73\xA5\x52\x10\x8C\x39\x08" + "\xEF\x94\x5A\xBD\x63\x29\xDE\x84\x52\xFF\x9C\x52\xDE\x84\x52\xFF\xAD" + "\x73\xF7\x9C\x73\xF7\x9C\x63\xDE\x84\x52\xBD\x6B\x21\xFF\x9C\x52\xF7" + "\x8C\x52\xFF\xAD\x73\xEF\xA5\x6B\xDE\x73\x42\xF7\x9C\x63\x7F\xCE\x7B" + "\x31\xA5\x52\x10\xEF\x9C\x63\xFF\xA5\x5A\xF7\xB5\x84\xFF\xB5\x6B\xFF" + "\xB5\x6B\xCE\x7B\x4A\xA5\x52\x10\xFF\xCE\x8C\xFF\xB5\x6B\xFF\xB5\x6B" + "\xFF\xC6\x73\xFF\xC6\x63\xFF\xC6\x73\xFF\xB5\x6B\xFF\xC6\x63\xEF\xA5" + "\x6B\xFF\x94\x42\xEB\x77\x39\xFF\xB5\x6B\x8C\x39\x08\x8C\x39\x08\xFF" + "\x9C\x52\xFF\xB5\x6B\xFF\x94\x42\xEF\x94\x42\xFF\xA5\x5A\xEF\x94\x42" + "\xEF\x94\x42\xF7\x8C\x52\xFF\xA5\x5A\xEF\x94\x42\xFF\xA5\x5A\xF7\x8C" + "\x52\xE7\x7F\x42\xE7\x7F\x42\xCE\x8C\x63\xCE\x7B\x31\xF7\x9C\x63\xE7" + "\x7F\x42\x9C\x42\x08\xEF\x7F\x9C\x63\xF7\x8C\x52\xF7\x9C\x63\xD6\x7B" + "\x39\xFF\xB5\x7B\xBD\x5A\x18\xFF\xCE\x8C\xEF\xA5\x73\xA5\x52\x10\xFF" + "\xC6\x73\xF7\x8C\x63\xD6\x7B\x39\x8C\x39\x08\xAD\x6B\x42\xD6\x7B\x39" + "\xFF\xCE\x8C\x9C\x42\x08\xF7\x9C\x63\xFF\xA5\x5A\xBD\x7B\x29\xBD\x6B" + "\x21\xD6\x73\x29\xCE\x7B\x4A\xD6\x73\x29\xDE\x84\x42\xFF\xCE\x8C\xA5" + "\x52\x10\xCE\x7B\x4A\xBD\x6B\x21\xEF\x94\x42\xB5\x7B\x52\xAD\x6B\x42" + "\xFF\xA5\x5A\xFF\xC6\x63\xFF\xB5\x6B\xFF\xC6\x73\xFF\xB5\x6B\xEF\xA5" + "\x6B\xFF\xA5\x5A\xEF\xA5\x6B\xFF\x9C\x52\xEF\x94\x42\xFF\xA5\x7F\x52" + "\xEF\x94\x42\xFF\xA5\x6B\xEF\xA5\x73\xF7\x8C\x42\xF7\x8C\x52\xFF\xA5" + "\x6B\xDE\x84\x42\xE7\x94\x5A\xFF\xA5\x6B\xFF\xA5\x6B\xEF\x9C\x63\xFF" + "\xA5\x5A\xF7\x9C\x63\xE7\x7F\x42\xE7\x94\x5A\xFF\x9C\x52\xF7\x8C\x52" + "\xC6\x73\x42\xFF\xAD\x73\xFF\x9C\x52\xBD\x5A\x18\xF7\x9C\x73\xF7\x9C" + "\x63\xF7\x8C\x52\xF7\x9C\x63\xFF\xB5\x6B\xF7\x9C\x63\xBD\x6B\x21\xFF" + "\xB5\x7B\xFF\xA5\x5A\xDE\x84\x42\xEF\xA5\x73\xE7\x8C\x52\xF7\x9C\x73" + "\xE7\x8C\x52\xFF\xAD\x73\xEF\x9C\x63\xEF\xA5\x73\xFF\xA5\x6B\xFF\xA5" + "\x6B\xFF\xA5\x6B\xFF\xA5\x6B\x7F\xE7\x8C\x52\xEF\x94\x5A\xEF\x9C\x63" + "\xFF\xA5\x6B\xFF\xC6\x73\xFF\xA5\x6B\xFF\xC6\x73\xF7\xB5\x84\xFF\xCE" + "\x8C\xCE\x7B\x4A\xFF\xC6\x73\xAD\x6B\x42\xEF\xA5\x6B\xFF\xC6\x63\xFF" + "\xC6\x63\xEF\xA5\x6B\xFF\xA5\x5A\xEF\x94\x42\xEF\x9C\x63\xF7\x8C\x52" + "\xEF\x94\x42\xFF\x9C\x52\xDE\x84\x42\xFF\xA5\x5A\xFF\xB5\x6B\xDE\x84" + "\x42\xE7\x7F\x42\xF7\x8C\x52\xEF\xA5\x73\x7B\x42\x18\xAD\x6B\x42\xBD" + "\x6B\x21\xA5\x52\x21\xA5\x52\x10\x8C\x39\x08\xA5\x52\x21\xEF\x9C\x63" + "\xEF\x94\x5A\xD6\x73\x29\xE7\x7F\x42\xD6\x7B\x5A\xFF\xB5\x6B\xFF\x7F" + "\xB5\x6B\xEF\xA5\x73\xEF\x9C\x63\xFF\xA5\x5A\xE7\x7F\x42\xF7\x8C\x52" + "\xFF\xA5\x5A\xFF\x9C\x52\xFF\xB5\x6B\xFF\xB5\x7B\xFF\xB5\x6B\xFF\xCE" + "\x8C\xEF\x9C\x63\xFF\xB5\x6B\xFF\xC6\x63\xFF\xB5\x6B\xEF\x94\x5A\xFF" + "\xB5\x7B\xFF\xA5\x6B\xFF\xB5\x6B\xFF\xA5\x5A\xEF\x9C\x63\xF7\x9C\x63" + "\xFF\xA5\x6B\xF7\xB5\x84\xFF\xA5\x6B\xFF\xA5\x6B\xFF\xA5\x6B\xFF\xB5" + "\x7B\xFF\xA5\x6B\xFF\xA5\x6B\xE7\x8C\x52\xD6\x9C\x73\xAD\x6B\x42\x7B" + "\x42\x18\xE7\xA5\x5A\xFF\xA5\x52\xEF\x94\x42\xD6\x73\x29\xD6\x73\x29" + "\xF7\x8C\x52\xF7\x8C\x52\xE7\x7F\x7F\x42\xFF\xA5\x5A\xEF\x94\x5A\xFF" + "\xA5\x52\xFF\xC6\x73\xDE\x84\x42\xBD\x6B\x21\xE7\x7F\x42\xE7\x7F\x42" + "\xFF\xA5\x52\xBD\x63\x29\xA5\x52\x21\xF7\x9C\x63\xEF\x9C\x63\xEF\xA5" + "\x73\xF7\xB5\x84\xE7\x94\x5A\xD6\x7B\x5A\xF7\x8C\x52\xDE\x84\x42\xE7" + "\x8C\x52\xBD\x6B\x39\xC6\x73\x42\xBD\x7B\x29\xC6\x73\x42\xDE\x73\x42" + "\xCE\x7B\x4A\xA5\x52\x10\xA5\x52\x10\xA5\x52\x21\xA5\x52\x10\xA5\x52" + "\x21\x9C\x42\x08\xBD\x5A\x18\x9C\x42\x08\xA5\x52\x21\xA5\x52\x21\xA5" + "\x52\x21\xA5\x52\x21\xBD\x63\x29\xA5\x52\x21\xBD\x6B\x21\xA5\x52\x21" + "\x7F\xBD\x6B\x21\xBD\x63\x29\xBD\x63\x29\xBD\x5A\x18\xFF\xA5\x5A\xBD" + "\x63\x29\xD6\x73\x29\xAD\x6B\x42\xBD\x7B\x29\xC6\x73\x42\xDE\x84\x42" + "\xC6\x73\x42\xC6\x73\x42\xAD\x6B\x42\x8C\x5A\x31\xE7\x8C\x52\xEF\x94" + "\x5A\xFF\x9C\x52\xDE\x73\x42\xE7\x7B\x52\xCE\x7B\x4A\xDE\x73\x42\xBD" + "\x63\x29\xE7\x7F\x42\xF7\x8C\x63\xF7\x9C\x63\xE7\x94\x5A\xFF\xCE\x8C" + "\xEF\x9C\x63\xFF\x9C\x52\xF7\x8C\x52\xDE\x84\x42\xF7\xB5\x84\xE7\x94" + "\x5A\xCE\x7B\x4A\xD6\x9C\x73\x8C\x39\x08\x52\x21\x08\xD6\x7B\x5A\xC6" + "\x7B\x5A\xFF\xC6\x73\xFF\xAD\x73\xFF\x7F\xA5\x6B\xE7\x94\x5A\xEF\x94" + "\x5A\xFF\xA5\x5A\xFF\x9C\x52\xDE\x84\x42\xF7\xB5\x84\xFF\xB5\x7B\xFF" + "\xC6\x63\xFF\xB5\x7B\xF7\x9C\x63\xFF\xB5\x7B\xF7\x9C\x63\xFF\xC6\x73" + "\xFF\xA5\x6B\xF7\xB5\x84\xFF\xA5\x6B\xFF\xC6\x63\xFF\xA5\x6B\xFF\xA5" + "\x6B\xFF\xA5\x6B\xEF\xA5\x73\xFF\xAD\x73\xFF\xAD\x73\xEF\xA5\x73\xFF" + "\xAD\x73\xFF\xA5\x6B\xFF\xA5\x6B\xEF\xA5\x6B\xEF\xA5\x6B\xFF\xB5\x7B" + "\xEF\x94\x5A\xE7\xA5\x5A\xE7\x94\x5A\xE7\x8C\x52\xEF\x94\x5A\xAD\x6B" + "\x42\xA5\x52\x10\xDE\xA5\x52\xDE\x84\x42\xFF\xA5\x52\xEF\x9C\x63\xF7" + "\x8C\x7F\x63\xE7\x7B\x52\xE7\x8C\x52\xFF\x9C\x52\xF7\x9C\x63\xEF\x94" + "\x5A\xE7\x8C\x52\xE7\x8C\x52\xEF\x94\x5A\xFF\xAD\x73\xEF\x94\x5A\xF7" + "\x9C\x63\xE7\x8C\x52\xBD\x63\x29\xC6\x73\x42\xAD\x6B\x42\x7B\x42\x18" + "\xC6\x73\x42\xD6\x7B\x5A\x7B\x42\x18\x52\x21\x08\xE7\x94\x5A\xE7\x7F" + "\x42\xD6\x73\x29\xBD\x6B\x39\xBD\x6B\x21\xF7\xB5\x84\xF7\x9C\x63\xEF" + "\x94\x42\xF7\xDE\xB1\xBD\x7B\x29\xFF\x9C\x52\xA5\x52\x10\xFF\xB5\x6B" + "\xA5\x52\x21\xFF\xC6\x63\xDE\x73\x42\xFF\xC6\x73\xBD\x63\x29\xF7\x8C" + "\x63\xFF\xA5\x5A\xEF\x94\x5A\xF7\x8C\x52\x78\xFF\x9C\x52\xD6\x7B\x39" + "\xFF\x9C\x52\xD6\x73\x29\xD6\x73\x29\xCE\x7B\x31\xEF\x9C\x63\xBD\x7B" + "\x29\xDE\x84\x42\xE7\x8C\x52\xBD\x6B\x21\xFF\xC6\x63\xCE\x8C\x63\xFF" + "\xAD\x73\xEF\x9C\x63\xFF\xC6\x73\xF7\xB5\x84\xAD\x6B\x42\xCE\x8C\x63" + "\xF7\xB5\x84\xFF\xC6\x73\xEF\xA5\x6B\xFF\xC6\x73\xFF\xA5\x52\xEF\x94" + "\x5A\xEF\x94\x42\xFF\xA5\x5A\xE7\x8C\x52\xEF\x9C\x63\xC6\x73\x42\xDE" + "\x73\x42\xBD\x7B\x29\x9C\x63\x39\xDE\x84\x52\xBD\x6B\x39\x8C\x5A\x31" + "\xBD\x63\x29\xBD\x6B\x39\x8C\x5A\x31\x52\x21\x08\x83\x00\x7F\x52\x21" + "\x08\x7B\x42\x18\xFF\xA5\x6B\xDE\x73\x42\xE7\x8C\x52\xCE\x7B\x4A\xEF" + "\x94\x42\xFF\xB5\x6B\xFF\xAD\x73\xFF\xC6\x63\xF7\xDE\xB1\xCE\x7B\x31" + "\xE7\x7F\x42\xFF\x9C\x52\xDE\x84\x52\xE7\x8C\x52\xF7\x9C\x63\xFF\xA5" + "\x5A\xF7\xDE\xB1\xFF\xCE\x8C\xE7\x8C\x52\xFF\xB5\x6B\xFF\xCE\x8C\xFF" + "\xCE\x8C\xDE\x84\x52\xDE\x84\x52\xF7\x9C\x63\xEF\xA5\x73\xEF\x9C\x63" + "\xFF\xB5\x7B\xBD\x5A\x18\xFF\xB5\x6B\xFF\xA5\x5A\xE7\x8C\x52\xEF\xA5" + "\x6B\xEF\xA5\x6B\xA5\x52\x10\xBD\x63\x29\xD6\x9C\x73\xF7\x9C\x63\xCE" + "\x7B\x4A\x8C\x5A\x31\xAD\x7F\x6B\x42\xE7\x94\x5A\xE7\x8C\x52\xE7\x8C" + "\x52\xF7\x9C\x63\xDE\x84\x52\xE7\x8C\x52\xCE\x7B\x4A\xB5\x7B\x52\xE7" + "\x8C\x52\xCE\x8C\x63\xCE\x7B\x4A\xAD\x6B\x42\xF7\xDE\xB1\xCE\x8C\x63" + "\xD6\xAD\x84\xD6\x9C\x73\x9C\x63\x39\xD6\xAD\x84\xF7\x9C\x73\x8C\x5A" + "\x31\x52\x21\x08\x52\x21\x08\xB5\x7B\x52\xF7\x9C\x73\xD6\x73\x29\xF7" + "\x9C\x63\xE7\x7F\x42\xBD\x6B\x39\xBD\x6B\x21\xFF\xB5\x7B\xFF\xA5\x6B" + "\xBD\x6B\x21\xF7\xDE\xB1\xD6\x9C\x73\xFF\xA5\x6B\x7B\x42\x18\xFF\xA5" + "\x6B\xBD\x7B\x29\xE7\x7F\x42\xFF\xA5\x6B\xDE\x84\x42\xF7\xB5\x7F\x84" + "\x8C\x39\x08\xCE\x7B\x4A\xCE\x7B\x4A\xEF\x9C\x63\xAD\x6B\x42\xBD\x63" + "\x29\xE7\x94\x5A\xFF\xB5\x7B\xD6\x9C\x73\xEF\x94\x5A\xEF\x9C\x63\xA5" + "\x52\x21\xC6\x73\x42\xEF\x94\x5A\xCE\x7B\x31\xD6\x9C\x73\xAD\x6B\x42" + "\xF7\x8C\x63\xBD\x63\x29\xBD\x6B\x39\xC6\x7B\x5A\x9C\x63\x39\xAD\x6B" + "\x42\x9C\x63\x39\xBD\x6B\x39\xC6\x7B\x5A\xA5\x52\x21\xF7\xB5\x84\xF7" + "\xDE\xB1\xF7\xB5\x84\xF7\xB5\x84\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1" + "\xF7\xDE\xB1\xEF\xA5\x6B\xF7\xDE\xB1\xFF\xF7\xDE\xFF\xF7\xDE\xC6\x7B" + "\x5A\xA5\x52\x21\x52\x21\x08\x7F\x8C\x5A\x31\xCE\x8C\x63\xF7\x8C\x63" + "\xDE\x73\x42\xF7\x9C\x63\xF7\x8C\x52\xFF\x9C\x52\xF7\x8C\x52\xC6\x73" + "\x42\xBD\x63\x29\xEF\x94\x5A\x7B\x42\x18\xEF\x9C\x63\xF7\xDE\xB1\xBD" + "\x63\x29\xDE\x84\x42\xD6\x7B\x39\xBD\x6B\x39\xEF\x94\x5A\xDE\x73\x42" + "\xF7\x8C\x52\xEF\xA5\x73\xEF\x94\x5A\xCE\x7B\x4A\xE7\x8C\x52\x9C\x63" + "\x39\xBD\x63\x29\xD6\x7B\x5A\xAD\x6B\x42\xCE\x7B\x4A\xFF\xAD\x73\xA5" + "\x52\x21\xA5\x52\x21\xE7\x94\x5A\xFF\xC6\x73\xB5\x7B\x52\xEF\x9C\x63" + "\xA5\x52\x10\xFF\xB5\x7B\xDE\x84\x52\xEF\x9C\x63\xF7\x8C\x63\xBD\x7F" + "\x6B\x39\xCE\x8C\x63\x9C\x63\x39\xAD\x6B\x42\xA5\x52\x21\xB5\x7B\x52" + "\x9C\x63\x39\xAD\x6B\x42\xF7\xB5\x84\xF7\xB5\x84\xCE\x8C\x63\xD6\xAD" + "\x84\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xFF\xB5\x7B\xF7\xB5\x84\xF7" + "\xDE\xB1\xB5\x7B\x52\x9C\x42\x08\xF7\x9C\x63\xF7\x9C\x73\xF7\x9C\x73" + "\xE7\x94\x5A\xCE\x7B\x4A\xF7\x8C\x52\xFF\x94\x42\xF7\x8C\x42\xF7\x8C" + "\x52\xD6\x7B\x39\xE7\x7F\x42\xC6\x73\x42\xA5\x52\x21\x9C\x63\x39\xE7" + "\x8C\x52\xCE\x7B\x4A\xF7\xB5\x84\xD6\x9C\x73\xF7\x9C\x63\xBD\x7B\x29" + "\xDE\x73\x42\xDE\x84\x52\xE7\x8C\x7F\x52\xF7\x8C\x52\x8C\x39\x08\xE7" + "\x8C\x52\xA5\x52\x21\xF7\x8C\x63\xFF\xA5\x6B\xE7\x94\x5A\xEF\x9C\x63" + "\xF7\x9C\x73\xEF\x9C\x63\xFF\xAD\x73\xBD\x63\x29\xFF\xB5\x6B\xDE\x84" + "\x42\xDE\x73\x42\xDE\x84\x52\xDE\x84\x52\xE7\x94\x5A\xEF\x9C\x63\xE7" + "\x94\x5A\xEF\x9C\x63\xE7\x94\x5A\xFF\xA5\x6B\xD6\x7B\x5A\x8C\x5A\x31" + "\xE7\x94\x5A\xEF\x94\x5A\xF7\x9C\x63\xF7\x9C\x63\xF7\x9C\x63\xD6\x7B" + "\x39\xE7\x8C\x52\xFF\xA5\x5A\xE7\x8C\x52\xBD\x6B\x39\xDE\x73\x42\xAD" + "\x6B\x42\x8C\x39\x08\xBD\x63\x29\xBD\x5A\x18\xFF\xB5\x6B\xE7\x8C\x52" + "\x7F\xF7\x8C\x52\xF7\x8C\x42\xE7\x8C\x52\xFF\x9C\x52\xDE\x73\x42\xF7" + "\x8C\x42\xF7\x8C\x52\xEF\x94\x5A\xF7\x8C\x52\xF7\x8C\x42\xE7\x7B\x52" + "\xCE\x7B\x4A\xD6\x7B\x5A\xE7\x94\x5A\xCE\x7B\x4A\xEF\x94\x42\xF7\xDE" + "\xB1\xF7\xB5\x84\xD6\x7B\x5A\xF7\x8C\x52\xF7\x8C\x52\xEF\x94\x5A\xF7" + "\x8C\x52\xEF\x9C\x63\xF7\x9C\x73\xEF\x9C\x63\xF7\x9C\x73\xF7\x9C\x63" + "\xFF\xAD\x73\xE7\x94\x5A\xFF\xB5\x7B\xF7\x8C\x63\xFF\xA5\x6B\xEF\xA5" + "\x6B\xFF\x9C\x52\xEF\x9C\x63\xEF\x9C\x63\xFF\xA5\x6B\xEF\x9C\x63\xEF" + "\x9C\x63\xDE\x84\x42\xCE\x7B\x4A\xCE\x77\x7B\x4A\xAD\x6B\x42\xBD\x6B" + "\x39\xA5\x52\x21\x7B\x42\x18\x9C\x63\x39\xE7\x94\x5A\xF7\x8C\x52\xDE" + "\x84\x42\xF7\x8C\x52\xF7\x8C\x52\xF7\x8C\x42\xF7\x8C\x52\xE7\x8C\x52" + "\xEB\x77\x39\xE7\x7F\x42\xE7\x7F\x42\xF7\x8C\x52\xBD\x5A\x18\xEF\x9C" + "\x63\xDE\x84\x42\xEF\x94\x42\xF7\x8C\x52\xF7\x8C\x42\xF7\x8C\x52\xFF" + "\x9C\x52\xEF\x94\x5A\xE7\x7B\x52\xF7\x8C\x42\xF7\x8C\x42\xF7\x8C\x52" + "\xF7\x8C\x52\xF7\x8C\x42\xE7\x7F\x42\xCE\x7B\x4A\x8C\x39\x08\x8C\x39" + "\x08\xA5\x52\x21\x9C\x42\x08\xCE\x8C\x63\x82\xFF\x7F\xFB\xA5\x52\x21" + "\xA5\x52\x10\x7B\x42\x18\x8C\x39\x08\xA5\x52\x21\x8C\x39\x08\x8C\x39" + "\x08\x8C\x39\x08\xA5\x52\x21\xA5\x52\x21\xA5\x52\x21\xA5\x52\x21\xBD" + "\x63\x29\xDE\x84\x52\x9C\x63\x39\xBD\x6B\x39\xBD\x6B\x21\xC6\x73\x42" + "\xCE\x7B\x4A\xBD\x6B\x39\xCE\x7B\x4A\xC6\x7B\x5A\xE7\x94\x5A\xD6\x7B" + "\x39\xFF\xAD\x73\xEF\xA5\x6B\xEF\xA5\x73\xCE\x7B\x4A\xCE\x7B\x4A\x8C" + "\x5A\x31\xE7\x94\x5A\xFF\x9C\x52\xF7\x8C\x52\xE7\x7F\x42\xE7\x7F\x42" + "\xE7\x7F\x42\xE7\x8C\x52\xE7\x7F\x42\xE7\x7B\x52\xFF\x9C\x52\xF7\x8C" + "\x52\xDE\x84\x52\x42\xBD\x6B\x39\xE7\x7F\x42\xDE\x73\x42\xE7\x7F\x42" + "\xD6\x73\x29\xF7\x8C\x52\xE7\x7B\x52\xEB\x77\x39\xE7\x7F\x42\xE7\x7F" + "\x42\xE7\x7F\x42\xD6\x73\x29\xF7\x8C\x52\xE7\x8C\x52\xD6\x73\x29\xDE" + "\x84\x52\xBD\x63\x29\xC6\x73\x42\xE7\x8C\x52\xE7\x8C\x52\xCE\x7B\x4A" + "\xF7\xDE\xB1\x82\xFF\x7F\xFB\xBD\x9C\x6B\xEF\xA5\x73\xCE\x7B\x4A\xDE" + "\x84\x52\xF7\x8C\x63\xBD\x6B\x39\xE7\x8C\x52\xD6\x73\x29\xA5\x52\x21" + "\xF7\x8C\x63\xBD\x63\x29\xC6\x73\x42\xDE\x73\x42\xF7\x8C\x63\xD6\x7B" + "\x39\xF7\x8C\x52\xC6\x73\x42\xC6\x7B\x5A\xCE\x7B\x4A\xAD\x6B\x42\xFF" + "\xAD\x73\xBD\x63\x29\xE7\x94\x5A\xDE\x73\x42\xD6\x9C\x73\xD6\x73\x29" + "\xBD\x63\x29\xFF\xA5\x6B\xE7\xA5\x5A\xCE\x7B\x4A\xD6\x7B\x5A\xD6\x73" + "\x29\xE7\x7B\x52\xD6\x73\x29\xD6\x73\x29\xE7\x7B\x52\xF7\x8C\x52\xE7" + "\x7F\x42\xF7\x8C\x42\xEF\x94\x42\xDE\x84\x52\xEF\x94\x5A\x7F\xBD\x63" + "\x29\xF7\x8C\x63\xF7\x8C\x52\xF7\x8C\x52\xE7\x7F\x42\xA5\x52\x21\xD6" + "\x7B\x5A\xCE\x7B\x4A\xE7\x8C\x52\xFF\x9C\x52\xE7\x8C\x52\xDE\x73\x42" + "\xDE\x84\x52\xDE\x73\x42\xDE\x73\x42\xDE\x73\x42\xB5\x7B\x52\xBD\x7B" + "\x29\xFF\xAD\x73\xDE\x73\x42\xF7\x8C\x63\xF7\xDE\xB1\xFF\xF7\xDE\xF7" + "\xDE\xB1\x52\x21\x08\xE7\x7F\x42\xBD\x63\x29\xFF\xA5\x6B\xD6\x7B\x39" + "\xA5\x52\x21\xDE\x73\x42\xC6\x73\x42\xFF\xAD\x73\xBD\x6B\x39\xEF\x9C" + "\x63\xD6\x7B\x39\xEF\x9C\x63\x9C\x42\x08\xF7\x9C\x63\xF7\x8C\x63\xC6" + "\x73\x42\xC6\x73\x42\xBD\x7F\x63\x29\x8C\x5A\x31\xC6\x73\x42\xEF\xA5" + "\x6B\xE7\xA5\x5A\xE7\x8C\x52\xFF\xAD\x73\xBD\x6B\x39\xEF\x94\x5A\xF7" + "\xB5\x84\x8C\x5A\x31\xAD\x6B\x42\xDE\x84\x52\xDE\x73\x42\xF7\x8C\x52" + "\xFF\x9C\x52\xF7\x8C\x52\xE7\x8C\x52\xF7\x8C\x52\xFF\x9C\x52\xEF\x94" + "\x5A\xFF\x94\x42\xFF\xA5\x6B\xBD\x5A\x18\xF7\x9C\x63\xF7\x8C\x52\xF7" + "\x8C\x52\xF7\x8C\x63\xC6\x73\x42\xA5\x52\x21\xC6\x73\x42\xD6\x73\x29" + "\xEF\x94\x5A\xDE\x73\x42\xE7\x8C\x52\xE7\x8C\x52\xF7\x8C\x52\xDE\x73" + "\x42\xDE\x73\x42\x8C\x5A\x31\xA5\x52\x21\xCE\x7B\x4A\xA5\x52\x7F\x21" + "\xE7\x7B\x52\xBD\x5A\x18\xFF\xCE\x8C\xF7\xDE\xB1\xBD\x5A\x18\xFF\xA5" + "\x5A\xBD\x63\x29\xEF\xA5\x6B\xD6\x73\x29\xE7\x94\x5A\xE7\x8C\x52\xBD" + "\x63\x29\xBD\x6B\x21\xA5\x52\x21\xCE\x8C\x63\x9C\x42\x08\xDE\x73\x42" + "\xC6\x73\x42\xDE\x73\x42\xD6\x73\x29\xFF\xA5\x52\xDE\x73\x42\xDE\x84" + "\x52\xDE\x84\x52\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\xE7\x94\x5A\xC6" + "\x73\x42\xDE\x73\x42\xD6\x73\x29\xCE\x7B\x4A\xAD\x6B\x42\x8C\x5A\x31" + "\xE7\x8C\x52\xF7\x8C\x63\xF7\x8C\x52\xE7\x7B\x52\xCE\x7B\x31\xF7\x8C" + "\x52\xF7\x8C\x52\xDE\x84\x52\x7F\xF7\x8C\x52\xFF\xA5\x6B\xE7\x94\x5A" + "\xD6\x7B\x39\xDE\x84\x52\xEF\x9C\x63\xF7\x9C\x63\xE7\x94\x5A\xD6\x7B" + "\x5A\xAD\x6B\x42\x9C\x63\x39\xC6\x73\x42\xBD\x63\x29\xE7\x8C\x52\xBD" + "\x63\x29\xD6\x9C\x73\xD6\x7B\x39\xD6\x73\x29\xD6\x73\x29\xB5\x7B\x52" + "\xDE\x84\x52\xCE\x8C\x63\xBD\x5A\x18\xF7\x8C\x52\xFF\xB5\x6B\xDE\xA5" + "\x52\xF7\xDE\xB1\xBD\x6B\x21\xCE\x7B\x31\xD6\x7B\x39\xDE\x84\x52\xA5" + "\x52\x21\xE7\x8C\x52\xE7\x94\x5A\xBD\x6B\x39\xF7\x9C\x73\xA5\x52\x21" + "\xF7\x9C\x73\xBD\x6B\x21\xE7\x94\x5A\xBD\x63\x29\xE7\x7B\x52\xEF\x71" + "\x94\x5A\xF7\x9C\x63\xCE\x7B\x4A\xEF\xA5\x73\xF7\xB5\x84\xD6\x7B\x5A" + "\xE7\x94\x5A\xDE\x84\x52\xEF\xA5\x73\xBD\x6B\x39\xE7\x8C\x52\xE7\x94" + "\x5A\xEF\x9C\x63\x8C\x5A\x31\x9C\x63\x39\xC6\x73\x42\xCE\x7B\x4A\xC6" + "\x73\x42\xDE\x73\x42\xBD\x6B\x39\xAD\x6B\x42\xA5\x52\x21\x8C\x5A\x31" + "\xE7\x94\x5A\xCE\x8C\x63\xFF\xAD\x73\xE7\x94\x5A\xE7\xA5\x5A\xEF\x9C" + "\x63\xAD\x6B\x42\xC6\x73\x42\xAD\x6B\x42\x8C\x5A\x31\xF7\xDE\xB1\xD6" + "\x7B\x5A\xAD\x6B\x42\x8C\x39\x08\xC6\x7B\x5A\x83\x00\x7F\xBD\x6B\x39" + "\xCE\x7B\x4A\xDE\x73\x42\xAD\x6B\x42\xBD\x5A\x18\xFF\xB5\x6B\xBD\x6B" + "\x39\xE7\x8C\x52\x8C\x39\x08\xC6\x73\x42\xFF\xCE\x8C\xA5\x52\x10\xE7" + "\x7F\x42\xDE\x73\x42\xEF\x9C\x63\xDE\x84\x52\xDE\x84\x52\xBD\x6B\x39" + "\xEF\x94\x5A\x8C\x39\x08\xDE\x84\x52\xFF\xA5\x6B\xCE\x7B\x4A\xD6\x7B" + "\x5A\xBD\x6B\x21\xDE\x73\x42\xF7\x8C\x52\x8C\x39\x08\xF7\x8C\x63\xA5" + "\x52\x21\xA5\x52\x21\xDE\x84\x42\xBD\x5A\x18\xFF\xA5\x5A\xEF\x9C\x63" + "\xBD\x6B\x21\xA5\x52\x21\xFF\xA5\x6B\xD6\x9C\x73\x9C\x63\x39\x8C\x5A" + "\x31\xAD\x6B\x42\xFF\x7F\xAD\x73\xD6\x9C\x73\xB5\x7B\x52\xD6\x9C\x73" + "\xF7\xDE\xB1\xD6\xAD\x84\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xB5\x84\xD6\x9C" + "\x73\x8C\x5A\x31\xAD\x6B\x42\xF7\xB5\x84\xEF\xA5\x73\xD6\x9C\x73\xC6" + "\x7B\x5A\xAD\x6B\x42\xA5\x52\x21\xAD\x6B\x42\x8C\x5A\x31\xC6\x7B\x5A" + "\x8C\x5A\x31\x9C\x63\x39\x52\x21\x08\xD6\x9C\x73\xDE\x73\x42\xCE\x7B" + "\x4A\xBD\x6B\x39\xEF\x94\x5A\x8C\x39\x08\xFF\xA5\x6B\xCE\x7B\x4A\xEF" + "\x94\x5A\xE7\x94\x5A\x9C\x42\x08\xF7\x8C\x52\xF7\x8C\x63\x8C\x39\x08" + "\xEF\xA5\x73\xBD\x6B\x21\xDE\x73\x42\xF7\x8C\x63\xE7\x94\x7F\x5A\xBD" + "\x5A\x18\xEF\x9C\x63\xA5\x52\x21\xE7\x8C\x52\xEF\x9C\x63\xBD\x6B\x39" + "\xF7\x8C\x63\xEF\x9C\x63\xDE\x73\x42\xEF\xA5\x73\xF7\x9C\x63\xF7\x9C" + "\x63\xDE\x84\x52\xF7\x9C\x63\xF7\x9C\x73\xE7\x94\x5A\xEF\xA5\x73\xEF" + "\x94\x5A\xCE\x8C\x63\x9C\x63\x39\x9C\x63\x39\x8C\x39\x08\xF7\xB5\x84" + "\xD6\x9C\x73\xAD\x6B\x42\xFF\xCE\x8C\xF7\xB5\x84\xEF\xA5\x73\xD6\xAD" + "\x84\xF7\xB5\x84\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xFF" + "\xCE\x8C\xEF\xA5\x73\xF7\xB5\x84\xC6\x7B\x5A\x7B\x42\x18\xD6\x7B\x5A" + "\x8C\x39\x08\x8C\x5A\x31\x83\x00\x03\x52\x21\x08\x83\x00\x7F\x7B\x42" + "\x18\xCE\x8C\x63\xE7\x8C\x52\xC6\x73\x42\xE7\x8C\x52\xFF\x9C\x52\xEF" + "\x9C\x63\xF7\x8C\x52\xEF\xA5\x6B\xDE\x84\x42\xFF\x9C\x52\xF7\x8C\x63" + "\xDE\x84\x52\xE7\x94\x5A\xF7\x9C\x63\xFF\xAD\x73\xEF\xA5\x73\xEF\x94" + "\x5A\xD6\x9C\x73\xFF\xAD\x73\xE7\x94\x5A\xE7\x94\x5A\xF7\x9C\x73\xF7" + "\x9C\x73\xE7\x94\x5A\xD6\x9C\x73\xE7\x94\x5A\xCE\x7B\x4A\xB5\x7B\x52" + "\xE7\x94\x5A\xBD\x6B\x39\xC6\x73\x42\xCE\x7B\x4A\xBD\x6B\x39\xA5\x52" + "\x21\x9C\x63\x39\xA5\x52\x10\x8C\x39\x08\x7B\x42\x18\x8C\x5A\x31\xF7" + "\xB5\x84\xE7\x94\x5A\xDE\x7F\x73\x42\xBD\x6B\x39\xC6\x73\x42\xBD\x63" + "\x29\xBD\x5A\x18\xE7\x8C\x52\xC6\x73\x42\xBD\x6B\x39\xAD\x6B\x42\x9C" + "\x63\x39\x52\x21\x08\xB5\x7B\x52\xA5\x52\x21\xAD\x6B\x42\xE7\x94\x5A" + "\xC6\x7B\x5A\xA5\x52\x21\xAD\x6B\x42\x7B\x42\x18\xC6\x7B\x5A\x52\x21" + "\x08\x52\x21\x08\xB5\x7B\x52\xD6\x9C\x73\xE7\x7F\x42\xD6\x7B\x39\xDE" + "\x73\x42\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08\x8C\x39\x08" + "\xBD\x5A\x18\xBD\x6B\x21\x7B\x42\x18\x9C\x42\x08\x8C\x39\x08\x8C\x39" + "\x08\x8C\x39\x08\xBD\x63\x29\xBD\x63\x29\x8C\x39\x08\x8C\x39\x60\x08" + "\xA5\x52\x21\xC6\x73\x42\xC6\x73\x42\xC6\x73\x42\xD6\x7B\x5A\xE7\x7B" + "\x52\xE7\x94\x5A\xD6\x7B\x5A\xEF\xA5\x73\xD6\x7B\x5A\xF7\x9C\x73\xEF" + "\x9C\x63\xD6\x9C\x73\xEF\x9C\x63\xEF\x94\x5A\xEF\xA5\x6B\xF7\x9C\x73" + "\xEF\xA5\x6B\xE7\x94\x5A\x8C\x5A\x31\xCE\x7B\x4A\xE7\x7F\x42\xE7\x7B" + "\x52\xE7\x7B\x52\xD6\x7B\x39\xC6\x73\x42\xE7\x7F\x42\xDE\x73\x42\xDE" + "\x73\x42\xF7\x8C\x63\xDE\x84\x52\xDE\x84\x82\x52\x1A\x21\x08\xF7\x9C" + "\x63\xEF\x9C\x63\xDE\x73\x42\xC6\x73\x42\xDE\x73\x42\xA5\x52\x21\xC6" + "\x7B\x5A\x7B\x42\x18\x83\x00\x7F\xC6\x7B\x5A\xAD\x6B\x42\xC6\x7B\x5A" + "\xDE\x73\x42\xF7\x8C\x52\xD6\x73\x29\xD6\x7B\x5A\xF7\x8C\x63\xDE\x73" + "\x42\xD6\x73\x29\xF7\x8C\x63\xF7\x8C\x63\xDE\x84\x42\xE7\x94\x5A\xF7" + "\x8C\x52\xFF\x9C\x52\xF7\x8C\x52\xE7\x7F\x42\xFF\xAD\x73\xE7\x7B\x52" + "\xE7\x94\x5A\xCE\x7B\x4A\xFF\xA5\x6B\xDE\x84\x52\xE7\x7B\x52\xF7\x9C" + "\x73\xEF\x94\x5A\xEF\x94\x5A\xEF\xA5\x6B\xEF\x94\x5A\xFF\xAD\x73\xEF" + "\x94\x5A\xF7\x8C\x63\xE7\x8C\x52\xF7\x9C\x63\xEF\x94\x5A\xF7\x8C\x63" + "\xFF\xA5\x6B\xBD\x6B\x39\xDE\x73\x42\xDE\x84\x42\xF7\xB5\x84\x8C\x7F" + "\x5A\x31\xD6\x9C\x73\xF7\x8C\x42\xF7\x8C\x42\xE7\x7F\x42\xF7\x8C\x52" + "\xE7\x7F\x42\xDE\x73\x42\xDE\x73\x42\xDE\x84\x42\xFF\xA5\x6B\xF7\x9C" + "\x63\xD6\x73\x29\xDE\x73\x42\xDE\x73\x42\xF7\x9C\x63\xF7\x9C\x63\xFF" + "\x9C\x52\xCE\x7B\x4A\xBD\x6B\x39\xF7\x9C\x73\xE7\x7B\x52\xFF\xAD\x73" + "\xE7\x94\x5A\xBD\x63\x29\xCE\x7B\x4A\xD6\x73\x29\xF7\x8C\x52\xBD\x63" + "\x29\xBD\x63\x29\xE7\x94\x5A\xDE\x73\x42\xF7\x8C\x63\xE7\x94\x5A\xDE" + "\x84\x52\xD6\x73\x29\xFF\xC6\x73\xBD\x63\x29\xE7\x94\x5A\xFF\x9C\x52" + "\xEF\x94\x5A\x8C\x39\x08\xF7\x9C\x7F\x63\xBD\x63\x29\xF7\x8C\x63\xEF" + "\xA5\x6B\xF7\x8C\x52\xF7\x8C\x63\xCE\x7B\x31\xFF\xA5\x6B\xA5\x52\x21" + "\xDE\x84\x42\xEF\x9C\x63\x9C\x42\x08\xBD\x63\x29\xEF\x9C\x63\xE7\x7B" + "\x52\xD6\x7B\x39\xBD\x6B\x21\xE7\x94\x5A\xD6\x7B\x5A\xBD\x63\x29\xE7" + "\x7B\x52\xE7\x94\x5A\xCE\x7B\x4A\x8C\x5A\x31\xEF\x9C\x63\xF7\x8C\x52" + "\xF7\x8C\x42\xD6\x73\x29\xE7\x94\x5A\xDE\x84\x52\xEF\x9C\x63\xDE\x73" + "\x42\xBD\x63\x29\x8C\x39\x08\x9C\x42\x08\xA5\x52\x21\xE7\x8C\x52\xDE" + "\x73\x42\xE7\x7F\x42\xE7\x7F\x42\xE7\x7F\x42\xDE\x73\x42\xF7\x8C\x63" + "\x7F\xDE\x73\x42\xBD\x6B\x39\xBD\x63\x29\xE7\x8C\x52\xBD\x63\x29\xDE" + "\x73\x42\xD6\x7B\x39\xD6\x73\x29\xDE\x73\x42\xC6\x7B\x5A\xDE\x73\x42" + "\xDE\x73\x42\xBD\x63\x29\x8C\x39\x08\xBD\x6B\x39\xF7\x8C\x52\xBD\x63" + "\x29\xBD\x63\x29\xDE\x73\x42\xD6\x73\x29\xD6\x73\x29\xE7\x7B\x52\xDE" + "\x73\x42\xE7\x94\x5A\x8C\x39\x08\xE7\x94\x5A\xF7\x8C\x63\xD6\x7B\x5A" + "\xD6\x73\x29\xDE\x84\x52\xE7\x7F\x42\x8C\x39\x08\xEF\x9C\x63\xBD\x63" + "\x29\xFF\xAD\x73\xE7\x7B\x52\xBD\x63\x29\xDE\x84\x52\xB5\x7B\x52\xBD" + "\x63\x29\xFF\xAD\x73\xBD\x63\x29\xDE\x7F\x84\x52\xDE\x73\x42\xD6\x9C" + "\x73\xBD\x7B\x29\xB5\x7B\x52\xE7\x7F\x42\xF7\x8C\x52\xE7\x7B\x52\xDE" + "\x84\x52\xDE\x73\x42\xA5\x52\x21\xBD\x5A\x18\xC6\x73\x42\xDE\x84\x52" + "\xFF\x9C\x52\xF7\x8C\x52\xDE\x73\x42\xE7\x7B\x52\xE7\x8C\x52\xF7\x8C" + "\x52\xF7\x8C\x52\xE7\x94\x5A\xE7\x94\x5A\xDE\x84\x52\xDE\x84\x52\xDE" + "\x73\x42\xDE\x73\x42\xEB\x77\x39\xBD\x63\x29\xC6\x73\x42\xDE\x73\x42" + "\xE7\x7B\x52\xC6\x73\x42\xBD\x6B\x39\xDE\x73\x42\xF7\x8C\x63\xF7\x9C" + "\x73\xD6\x73\x29\xDE\x73\x42\xBD\x6B\x21\xEF\x9C\x63\xA5\x52\x21\xE7" + "\x94\x7F\x5A\xDE\x73\x42\xA5\x52\x21\xE7\x7B\x52\xA5\x52\x21\xAD\x6B" + "\x42\x7B\x42\x18\xEF\xA5\x6B\xCE\x8C\x63\xE7\x7F\x42\xE7\x7B\x52\xE7" + "\x7B\x52\xEF\xA5\x73\xE7\x94\x5A\xC6\x73\x42\xE7\x8C\x52\xDE\x84\x52" + "\x8C\x39\x08\xE7\x8C\x52\xBD\x63\x29\x8C\x39\x08\xEF\x94\x5A\xA5\x52" + "\x21\xD6\x9C\x73\xE7\x8C\x52\xEF\xA5\x73\xAD\x6B\x42\xAD\x6B\x42\xDE" + "\x73\x42\xDE\x73\x42\xDE\x73\x42\xE7\x94\x5A\xA5\x52\x21\xD6\x7B\x5A" + "\xF7\x9C\x63\xE7\x8C\x52\xD6\x73\x29\xDE\x73\x42\xDE\x73\x42\xE7\x8C" + "\x52\xE7\x94\x5A\xE7\x7F\x42\xF7\x8C\x52\x7F\xEF\x9C\x63\xBD\x63\x29" + "\xA5\x52\x21\xCE\x7B\x4A\xDE\x84\x52\xCE\x7B\x4A\xE7\x7F\x42\xE7\x7F" + "\x42\xD6\x73\x29\xDE\x73\x42\xE7\x7B\x52\xDE\x73\x42\xD6\x7B\x5A\xE7" + "\x94\x5A\xA5\x52\x21\xC6\x73\x42\xBD\x6B\x39\xDE\x73\x42\xBD\x63\x29" + "\xDE\x84\x52\xCE\x7B\x4A\xE7\x94\x5A\x7B\x42\x18\xD6\x9C\x73\x8C\x39" + "\x08\xD6\x9C\x73\xBD\x63\x29\xE7\x94\x5A\xEF\x94\x5A\x52\x21\x08\xE7" + "\x8C\x52\xCE\x7B\x4A\xE7\x8C\x52\xBD\x63\x29\xA5\x52\x21\xF7\x9C\x63" + "\xBD\x63\x29\xFF\x9C\x52\xDE\x73\x42\xDE\x73\x42\xE7\x94\x5A\xD6\x73" + "\x29\xE7\x7F\x7F\x42\xC6\x73\x42\x8C\x39\x08\x9C\x42\x08\x8C\x39\x08" + "\xD6\xAD\x84\xB5\x7B\x52\x9C\x63\x39\xF7\x8C\x52\xF7\x8C\x52\xCE\x7B" + "\x4A\xEF\x94\x5A\xBD\x63\x29\xA5\x52\x21\xE7\x94\x5A\xF7\x8C\x52\xE7" + "\x7B\x52\xE7\x7F\x42\xF7\x8C\x52\xE7\x7B\x52\xBD\x63\x29\xDE\x84\x52" + "\xE7\x7F\x42\xE7\x8C\x52\xCE\x7B\x4A\xAD\x6B\x42\xCE\x8C\x63\xA5\x52" + "\x21\xF7\x8C\x63\xC6\x73\x42\xDE\x73\x42\xCE\x7B\x4A\xDE\x73\x42\xD6" + "\x7B\x39\xD6\x7B\x39\xD6\x7B\x5A\xF7\x9C\x63\xFF\xA5\x6B\xD6\x73\x29" + "\xBD\x63\x29\xCE\x7B\x4A\xFF\x9C\x52\xEF\x94\x7F\x5A\xCE\x7B\x4A\x8C" + "\x39\x08\xFF\xA5\x6B\xF7\x9C\x73\x9C\x42\x08\xFF\xAD\x73\xA5\x52\x21" + "\xFF\x9C\x52\xDE\x73\x42\xDE\x73\x42\xDE\x73\x42\xCE\x7B\x4A\xDE\x73" + "\x42\xBD\x63\x29\xA5\x52\x21\xDE\x84\x52\xCE\x7B\x4A\xDE\x84\x52\xDE" + "\x73\x42\xDE\x84\x42\xD6\x9C\x73\xCE\x7B\x4A\xDE\x84\x52\xDE\x84\x52" + "\xEF\x94\x5A\xE7\xA5\x5A\xD6\x9C\x73\xDE\x84\x52\xB5\x7B\x52\x7B\x42" + "\x18\xDE\x84\x52\xE7\x7F\x42\xE7\x8C\x52\xBD\x5A\x18\xDE\x84\x52\xDE" + "\x73\x42\xDE\x84\x52\xE7\x8C\x52\xDE\x84\x52\xCE\x7B\x4A\xBD\x63\x29" + "\xA5\x52\x21\x7F\xCE\x7B\x4A\xD6\x73\x29\xC6\x73\x42\xE7\x8C\x52\xD6" + "\x7B\x5A\xBD\x5A\x18\xBD\x6B\x39\xC6\x7B\x5A\x7B\x42\x18\xD6\x7B\x5A" + "\x8C\x5A\x31\x8C\x39\x08\xEF\x9C\x63\xE7\x7F\x42\xDE\x84\x52\xD6\x7B" + "\x5A\xDE\x84\x52\xF7\x9C\x73\xFF\xAD\x73\xF7\x8C\x52\xFF\x9C\x52\xE7" + "\x7F\x42\xE7\x8C\x52\xDE\x84\x52\xF7\x9C\x63\xF7\x8C\x63\xE7\x94\x5A" + "\xE7\x94\x5A\xDE\x84\x52\xD6\x9C\x73\xEF\x94\x5A\xE7\x8C\x52\xE7\x8C" + "\x52\xE7\x94\x5A\xDE\x84\x52\xFF\xA5\x5A\xE7\x94\x5A\xF7\x8C\x63\xDE" + "\x84\x52\xD6\x7B\x5A\xEF\x94\x5A\xC6\x73\x42\xDE\x7F\x73\x42\xCE\x7B" + "\x4A\xDE\x73\x42\xBD\x6B\x39\xD6\x7B\x5A\xAD\x6B\x42\xD6\x7B\x39\xA5" + "\x52\x21\xA5\x52\x21\xB5\x7B\x52\x7B\x42\x18\xC6\x73\x42\xAD\x6B\x42" + "\xBD\x6B\x39\xD6\x7B\x5A\xC6\x73\x42\xBD\x6B\x39\xAD\x6B\x42\xC6\x73" + "\x42\xBD\x63\x29\xD6\x7B\x5A\xF7\xB5\x84\xF7\xDE\xB1\xD6\x9C\x73\xD6" + "\xAD\x84\xD6\x9C\x73\xAD\x6B\x42\xC6\x7B\x5A\xAD\x6B\x42\xD6\xAD\x84" + "\xD6\xAD\x84\x8C\x5A\x31\xC6\x7B\x5A\xCE\x8C\x63\x52\x21\x08\xB5\x7B" + "\x52\xD6\x7B\x5A\xDE\x73\x42\xC6\x73\x42\xBD\x5A\x18\xA5\x52\x21\x8C" + "\x39\x08\xA5\x52\x7F\x10\xA5\x52\x21\x8C\x39\x08\xFF\xCE\x8C\x52\x21" + "\x08\xBD\x6B\x21\xA5\x52\x10\xA5\x52\x10\x8C\x39\x08\x8C\x39\x08\x9C" + "\x42\x08\x8C\x39\x08\x8C\x39\x08\xA5\x52\x21\xA5\x52\x21\x8C\x39\x08" + "\x8C\x39\x08\xBD\x63\x29\xBD\x6B\x39\xA5\x52\x10\xBD\x63\x29\xBD\x63" + "\x29\xC6\x73\x42\xC6\x73\x42\xC6\x73\x42\xDE\x84\x52\xDE\x84\x52\xE7" + "\x94\x5A\xE7\x7B\x52\xFF\xA5\x6B\xE7\x94\x5A\xEF\xA5\x73\x9C\x63\x39" + "\x9C\x63\x39\x7B\x42\x18\xD6\x9C\x73\xF7\xDE\xB1\xC6\x7B\x5A\xF7\xB5" + "\x84\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xB5\x84\x7F\xD6\x9C\x73" + "\xF7\xDE\xB1\xF7\xDE\xB1\xF7\xDE\xB1\xD6\xAD\x84\xD6\xAD\x84\xF7\xDE" + "\xB1\xF7\xDE\xB1\x7B\x42\x18\xC6\x7B\x5A\x52\x21\x08\x52\x21\x08\x8C" + "\x5A\x31\x9C\x63\x39\x9C\x63\x39\xB5\x7B\x52\xC6\x73\x42\xDE\x73\x42" + "\xC6\x73\x42\xFF\xA5\x6B\xFF\xA5\x5A\xDE\xA5\x52\xEF\x94\x42\xEF\x94" + "\x5A\xDE\xA5\x52\xF7\xB5\x84\xF7\xDE\xB1\xD6\x9C\x73\xFF\xA5\x5A\xC6" + "\x73\x42\xEF\x94\x5A\xF7\x9C\x63\xDE\x84\x52\xFF\xA5\x6B\xDE\x84\x52" + "\xEF\x94\x5A\xEF\x94\x5A\xFF\xB5\x7B\xC6\x73\x42\xDE\x73\x42\xF7\x8C" + "\x63\xE7\x94\x5A\xEF\x7F\x9C\x63\xBD\x6B\x39\xD6\x7B\x39\xE7\x94\x5A" + "\xE7\x8C\x52\xEF\x9C\x63\xC6\x7B\x5A\xAD\x6B\x42\xF7\x8C\x63\xBD\x6B" + "\x39\xBD\x63\x29\xC6\x73\x42\xB5\x7B\x52\x8C\x5A\x31\x8C\x39\x08\xA5" + "\x52\x21\xCE\x8C\x63\x8C\x5A\x31\xF7\xB5\x84\xB5\x7B\x52\xCE\x8C\x63" + "\xAD\x6B\x42\xC6\x7B\x5A\xBD\x9C\x6B\xFF\xCE\x8C\xF7\xDE\xB1\xFF\xF7" + "\xDE\xF7\xDE\xB1\xF7\xDE\xB1\x9C\x63\x39\xD6\x7B\x5A\xAD\x6B\x42\x8C" + "\x5A\x31\xF7\xB5\x84\xD6\xAD\x84\x52\x21\x08\x52\x21\x08\xCE\x8C\x63" + "\xEF\x9C\x63\xFF\xAD\x73\xCE\x7B\x4A\xBD\x6B\x39\xCE\x8C\x10\x63\xE7" + "\x94\x5A\xB5\x7B\x52\xDE\xA5\x52\xC6\x7B\x5A\xFF\xCE\x8C\x82\xFF\x7F" + "\xFB\xFF\xF7\xDE\xFF\xF7\xDE\x9C\x63\x39\xCE\x7B\x4A\xAD\x6B\x42\xCE" + "\x7B\x4A\xC6\x73\x42\xB5\x7B\x52\xE7\x94\x5A\xFF\xCE\x8C\xBD\x63\x29" + "\xE7\x8C\x52\xCE\x8C\x63\xA5\x52\x21\x8C\x39\x08\xDE\x73\x42\xBD\x63" + "\x29\xB5\x7B\x52\xCE\x7B\x31\xBD\x6B\x39\xD6\x73\x29\xE7\x94\x5A\x8C" + "\x39\x08\xE7\xA5\x5A\xA5\x52\x21\xE7\x94\x5A\xE7\x8C\x52\xC6\x7B\x5A" + "\xB5\x7B\x52\xC6\x7B\x5A\xCE\x8C\x63\xE7\x8C\x52\xE7\x8C\x52\xFF\x9C" + "\x52\xDE\x84\x52\xF7\x9C\x73\xF7\x9C\x63\xF7\x9C\x63\xE7\x94\x5A\xE7" + "\x8C\x52\xDE\x73\x42\xE7\x8C\x52\x30\xBD\x63\x29\xAD\x6B\x42\xCE\x7B" + "\x4A\xD6\x9C\x73\xF7\x9C\x63\xBD\x63\x29\xAD\x6B\x42\xC6\x7B\x5A\x52" + "\x21\x08\x52\x21\x08\xF7\xB5\x84\xD6\x7B\x5A\xE7\x7F\x42\xC6\x73\x42" + "\xF7\xDE\xB1\xBD\x9C\x6B\x82\xFF\x04\xFB\xFF\xF7\xDE\x82\xFF\x01\xFB" + "\x85\xFF\x01\xFB\x85\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x0A\xFB\xFF" + "\xF7\xDE\xFF\xF7\xDE\xFF\xF7\xDE\x82\xFF\x04\xFB\xFF\xF7\xDE\x85\xFF" + "\x7F\xFB\xFF\xF7\xDE\xF7\xDE\xB1\xEF\x94\x42\xE7\x8C\x52\xBD\x6B\x21" + "\xF7\x9C\x63\xA5\x52\x21\xC6\x73\x42\xDE\xA5\x52\xA5\x52\x21\xA5\x52" + "\x10\xFF\xB5\x7B\xBD\x6B\x39\xDE\x84\x52\xBD\x6B\x39\xD6\x7B\x39\xCE" + "\x7B\x4A\xBD\x6B\x21\xD6\x9C\x73\xB5\x7B\x52\xEF\x94\x5A\xDE\x73\x42" + "\xE7\x8C\x52\xEF\x94\x42\xDE\x84\x42\xF7\x9C\x63\xFF\xA5\x52\xFF\x9C" + "\x52\xEF\x94\x5A\xFF\x9C\x52\xEF\x94\x5A\xEB\x77\x39\xF7\x8C\x52\xF7" + "\x8C\x52\xF7\x8C\x52\xE7\x8C\x52\xDE\x73\x42\xE7\x7F\x42\x9C\x42\x08" + "\xC6\x73\x42\x8C\x39\x08\xD6\x7B\x5A\x15\xFF\x9C\x52\xE7\x7F\x42\xF7" + "\x8C\x42\xE7\x8C\x52\xF7\xDE\xB1\xFF\xF7\xDE\xFF\xF7\xDE\x82\xFF\x01" + "\xFB\x88\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB" + "\x85\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB\x82" + "\xFF\x01\xFB\x82\xFF\x01\xFB\x85\xFF\x7F\xFB\xFF\xF7\xDE\xE7\x94\x5A" + "\xF7\x8C\x42\x8C\x39\x08\xDE\x73\x42\xBD\x63\x29\xD6\x7B\x39\xD6\x7B" + "\x39\xBD\x7B\x29\xDE\x84\x52\xBD\x6B\x39\x52\x21\x08\xFF\xAD\x73\xFF" + "\xAD\x73\xEF\x9C\x63\xFF\xCE\x8C\xFF\xAD\x73\x52\x21\x08\xFF\xCE\x8C" + "\xB5\x7B\x52\xEF\x9C\x63\xEF\x94\x5A\xFF\xA5\x6B\xFF\xA5\x5A\xFF\x9C" + "\x52\xFF\xA5\x5A\xEF\x9C\x63\xFF\xA5\x5A\xF7\x8C\x52\xF7\x8C\x52\xFF" + "\x9C\x52\xF7\x8C\x42\xF7\x8C\x52\xF7\x8C\x52\xF7\x8C\x42\xEF\x94\x5A" + "\xFF\x94\x42\xFF\xA5\x5A\xFF\xA5\x6B\xF7\x8C\x63\xE7\x7B\x52\xDE\x73" + "\x42\x0F\xE7\x7F\x42\xFF\xA5\x52\xDE\xA5\x52\xBD\x9C\x6B\xFF\xF7\xDE" + "\x8B\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB\x85\xFF\x01\xFB\x85" + "\xFF\x01\xFB\x82\xFF\x04\xFB\xFF\xF7\xDE\x82\xFF\x01\xFB\x82\xFF\x01" + "\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB\x82\xFF\x01\xFB\x83\xFF\x7F\xF7" + "\xDE\xB1\xF7\x8C\x42\xF7\x8C\x42\xF7\x8C\x63\xE7\x94\x5A\xBD\x63\x29" + "\x7B\x42\x18\xCE\x7B\x4A\xFF\xAD\x73\xBD\x6B\x39\xBD\x63\x29\xDE\x73" + "\x42\xD6\x9C\x73\x52\x21\x08\x8C\x39\x08\x8C\x39\x08\xFF\xAD\x73\xBD" + "\x63\x29\xFF\xCE\x8C\xC6\x7B\x5A\xCE\x8C\x63\xEF\x9C\x63\xFF\x94\x42" + "\xEF\x94\x5A\xEF\x94\x5A\xFF\x94\x42\xEF\x94\x42\xF7\x9C\x63\xFF\x9C" + "\x52\xF7\x8C\x42\xEB\x77\x39\xFF\x9C\x52\xEF\x94\x5A\xFF\xA5\x5A\xEF" + "\x94\x42\xF7\x8C\x42\xDE\x73\x42\xD6\x7B\x39\xBD\x6B\x21\xF7\x9C\x73" + "\xF7\xDE\xB1\xFF\xF7\xDE\xFF\x08\xFF\xFB\xFF\xF7\xDE\xFF\xF7\xDE\x88" + "\xFF\x01\xFB\x82\xFF\x01\xFB" + , //body + 17500, //lenght + 0, + 0, + 0, + }, + { + "black-2.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\x80\x89\x00\x83\x80\x8F\xFF\x83\x80\x8F\x00\x83\x80\x8C\xFF" + "\x86\x00\x89\xFF\x86\x00\x9B\xFF\x86\x00\x98\xFF\x83\x80\x83\x00\x83" + "\x80\x95\xFF\x83\x80\x83\x00\x83\x80\x95\xFF\x83\x80\x83\x00\x83\x80" + "\x95\xFF\x83\x80\x83\x00\x83\x80\x95\xFF\x83\xC0\x83\x00\x83\x80\x89" + "\xFF\x83\x00\x8C\xFF\x83\x80\x83\x00\x83\xC0\x86\xFF\x83\x80\x83\x00" + "\x8C\xFF\x95\x00\x8C\xFF\x95\x00\xA7\xFF" + , //body + 112, //lenght + 0, + 0, + 0, + }, + { + "black-3.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x86" + "\xFF\x95\x00\x8C\xFF\x92\x00\x83\x80\x8C\xFF\x83\x00\x83\x80\x86\xFF" + "\x83\x80\x83\x00\x98\xFF\x83\x80\x83\x00\x98\xFF\x83\x80\x83\x00\x98" + "\xFF\x83\x80\x89\x00\x83\x80\x92\xFF\x8F\x00\x83\x80\x98\xFF\x83\xC0" + "\x86\x00\x8C\xFF\x83\xC0\x8C\xFF\x86\x00\x8C\xFF\x86\x00\x83\xC0\x83" + "\xFF\x83\xC0\x86\x00\x8C\xFF\x83\x80\x8F\x00\x83\x80\x8F\xFF\x83\x80" + "\x89\x00\x83\x80\xAA\xFF" + , //body + 108, //lenght + 0, + 0, + 0, + }, + { + "black-4.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x92" + "\xFF\x83\xC0\x83\x00\x98\xFF\x83\xC0\x86\x00\x95\xFF\x83\xC0\x89\x00" + "\x92\xFF\x83\xC0\x83\x00\x83\x80\x86\x00\x8F\xFF\x83\xC0\x83\x00\x83" + "\x80\x83\xFF\x86\x00\x8C\xFF\x83\xC0\x83\x00\x83\x80\x86\xFF\x86\x00" + "\x8C\xFF\x9B\x00\x86\xFF\x9B\x00\x95\xFF\x86\x00\x9B\xFF\x86\x00\x98" + "\xFF\x83\x80\x86\x00\x83\x80\x95\xFF\x8C\x00\xA7\xFF" + , //body + 98, //lenght + 0, + 0, + 0, + }, + { + "black-5.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x86" + "\xFF\x95\x00\x8C\xFF\x92\x00\x83\x80\x8C\xFF\x86\x00\x9B\xFF\x86\x00" + "\x9B\xFF\x8F\x00\x83\x80\x8F\xFF\x83\x80\x8F\x00\x83\x80\x98\xFF\x83" + "\xC0\x86\x00\x9B\xFF\x86\x00\x8C\xFF\x83\x00\x83\x80\x89\xFF\x86\x00" + "\x8C\xFF\x86\x00\x83\xC0\x83\xFF\x83\xC0\x86\x00\x8C\xFF\x83\x80\x8F" + "\x00\x83\x80\x8F\xFF\x83\x80\x89\x00\x83\x80\xAA\xFF" + , //body + 98, //lenght + 0, + 0, + 0, + }, + { + "black-6.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x8C" + "\xFF\x83\x80\x89\x00\x92\xFF\x83\x80\x8C\x00\x8F\xFF\x83\xC0\x83\x00" + "\x83\x80\x98\xFF\x83\x80\x83\x00\x9B\xFF\x86\x00\x83\x80\x86\x00\x83" + "\x80\x8F\xFF\x92\x00\x83\x80\x8C\xFF\x86\x00\x83\xC0\x86\xFF\x86\x00" + "\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C" + "\xFF\x83\x80\x83\x00\x86\xFF\x83\xC0\x86\x00\x8C\xFF\x83\xC0\x8F\x00" + "\x83\x80\x8F\xFF\x83\x80\x89\x00\x83\x80\xAA\xFF" + , //body + 114, //lenght + 0, + 0, + 0, + }, + { + "black-7.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x86" + "\xFF\x95\x00\x83\xC0\x89\xFF\x95\x00\x8C\xFF\x83\x00\x83\xC0\x89\xFF" + "\x83\x00\x83\x80\x98\xFF\x83\x80\x83\x00\x9B\xFF\x83\x00\x83\x80\x98" + "\xFF\x83\x80\x83\x00\x9B\xFF\x83\x00\x83\x80\x98\xFF\x83\xC0\x83\x00" + "\x83\x80\x98\xFF\x83\x80\x83\x00\x83\xC0\x95\xFF\x83\xC0\x86\x00\x98" + "\xFF\x83\xC0\x86\x00\x98\xFF\x83\x80\x86\x00\xB0\xFF" + , //body + 98, //lenght + 0, + 0, + 0, + }, + { + "black-8.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\x80\x89\x00\x83\x80\x8F\xFF\x83\x80\x8F\x00\x83\x80\x8C\xFF" + "\x86\x00\x83\xC0\x83\xFF\x83\xC0\x86\x00\x8C\xFF\x86\x00\x89\xFF\x86" + "\x00\x8C\xFF\x83\x80\x83\x00\x83\xC0\x83\xFF\x83\xC0\x83\x00\x83\x80" + "\x8F\xFF\x83\x80\x89\x00\x83\x80\x8F\xFF\x83\x80\x83\x00\x89\x80\x83" + "\x00\x83\x80\x89\xFF\x83\xC0\x83\x00\x83\x80\x89\xFF\x83\x80\x83\x00" + "\x83\xC0\x86\xFF\x83\xC0\x83\x00\x83\xC0\x89\xFF\x83\xC0\x83\x00\x83" + "\xC0\x86\xFF\x83\xC0\x83\x00\x83\x80\x89\xFF\x83\x80\x83\x00\x83\xC0" + "\x89\xFF\x83\x80\x8F\x00\x83\x80\x8F\xFF\x83\x80\x89\x00\x83\x80\xAA" + "\xFF" + , //body + 154, //lenght + 0, + 0, + 0, + }, + { + "black-9.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\x80\x89\x00\x83\x80\x8F\xFF\x83\x80\x8F\x00\x83\xC0\x8C\xFF" + "\x86\x00\x86\xFF\x83\xC0\x83\x00\x83\x80\x8C\xFF\x86\x00\x89\xFF\x86" + "\x00\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C\xFF\x86\x00\x83\xC0\x86\xFF" + "\x86\x00\x8C\xFF\x83\x80\x92\x00\x8F\xFF\x83\x80\x86\x00\x83\x80\x86" + "\x00\x9B\xFF\x83\x00\x83\x80\x98\xFF\x83\x80\x83\x00\x83\xC0\x8F\xFF" + "\x8C\x00\x83\x80\x92\xFF\x89\x00\x83\x80\xAD\xFF" + , //body + 114, //lenght + 0, + 0, + 0, + }, + { + "black-a.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x8F" + "\xFF\x83\x80\x9E\xFF\x83\x00\x9B\xFF\x83\x80\x83\x00\x83\x80\x98\xFF" + "\x89\x00\x95\xFF\x83\x80\x83\x00\x83\xFF\x83\x00\x83\x80\x92\xFF\x83" + "\x00\x83\x80\x83\xFF\x83\x80\x83\x00\x8F\xFF\x83\x80\x83\x00\x89\xFF" + "\x83\x00\x83\x80\x8C\xFF\x95\x00\x89\xFF\x83\x80\x95\x00\x83\x80\x86" + "\xFF\x86\x00\x8F\xFF\x86\x00\x83\xFF\x83\x80\x86\x00\x83\x80\x89\xFF" + "\x83\x80\x86\x00\x83\x80\x8C\x00\x89\xFF\x8C\x00\xA1\xFF" + , //body + 116, //lenght + 0, + 0, + 0, + }, + { + "black-j.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x8F" + "\xFF\x8C\x00\x95\xFF\x83\x80\x86\x00\x83\x80\x98\xFF\x86\x00\x9B\xFF" + "\x86\x00\x9B\xFF\x86\x00\x9B\xFF\x86\x00\x9B\xFF\x86\x00\x9B\xFF\x86" + "\x00\x8F\xFF\x83\x00\x83\xC0\x86\xFF\x86\x00\x8F\xFF\x86\x00\x86\xFF" + "\x86\x00\x8F\xFF\x83\x80\x8C\x00\x83\x80\x92\xFF\x83\x80\x86\x00\x83" + "\x80\xAD\xFF" + , //body + 88, //lenght + 0, + 0, + 0, + }, + { + "black-k.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x83" + "\xFF\x8C\x00\x83\xFF\x8C\x00\x86\xFF\x83\x80\x86\x00\x83\x80\x83\xFF" + "\x83\x80\x86\x00\x83\x80\x89\xFF\x86\x00\x86\xFF\x86\x00\x8F\xFF\x86" + "\x00\x83\xFF\x86\x00\x92\xFF\x8C\x00\x95\xFF\x89\x00\x98\xFF\x8C\x00" + "\x95\xFF\x86\x00\x83\xFF\x86\x00\x92\xFF\x86\x00\x86\xFF\x86\x00\x8F" + "\xFF\x86\x00\x89\xFF\x86\x00\x89\xFF\x83\x80\x86\x00\x83\x80\x83\xFF" + "\x83\x80\x86\x00\x83\x80\x86\xFF\x8C\x00\x83\xFF\x8C\x00\xA4\xFF" + , //body + 118, //lenght + 0, + 0, + 0, + }, + { + "black-q.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\x80\x89\x00\x83\x80\x8F\xFF\x83\xC0\x8F\x00\x83\xC0\x8C\xFF" + "\x86\x00\x89\xFF\x86\x00\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C\xFF\x86" + "\x00\x89\xFF\x86\x00\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C\xFF\x86\x00" + "\x89\xFF\x86\x00\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C\xFF\x86\x00\x89" + "\xFF\x86\x00\x8C\xFF\x86\x00\x89\xFF\x86\x00\x8C\xFF\x83\xC0\x8F\x00" + "\x83\xC0\x8F\xFF\x83\x80\x89\x00\x83\x80\x9B\xFF\x86\x00\x89\xFF" + , //body + 118, //lenght + 0, + 0, + 0, + }, + { + "black-t.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x83" + "\xFF\x83\xC0\x83\x00\x86\xFF\x83\x80\x86\x00\x83\x80\x89\xFF\x86\x00" + "\x83\xFF\x83\xC0\x8C\x00\x83\xC0\x86\xFF\x86\x00\x83\xFF\x86\x00\x86" + "\xFF\x86\x00\x86\xFF\x86\x00\x83\xFF\x86\x00\x86\xFF\x86\x00\x86\xFF" + "\x86\x00\x83\xFF\x86\x00\x86\xFF\x86\x00\x86\xFF\x86\x00\x83\xFF\x86" + "\x00\x86\xFF\x86\x00\x86\xFF\x86\x00\x83\xFF\x86\x00\x86\xFF\x86\x00" + "\x86\xFF\x86\x00\x83\xFF\x86\x00\x86\xFF\x86\x00\x86\xFF\x86\x00\x83" + "\xFF\x86\x00\x86\xFF\x86\x00\x86\xFF\x86\x00\x83\xFF\x86\x00\x86\xFF" + "\x86\x00\x86\xFF\x86\x00\x83\xFF\x83\xC0\x8C\x00\x83\xC0\x86\xFF\x86" + "\x00\x86\xFF\x83\x80\x86\x00\x83\x80\xA7\xFF" + , //body + 164, //lenght + 0, + 0, + 0, + }, + { + "border.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x37\x33\x20\x39\x37\x0A\x32\x82\x35\x01\x0A\x82\xFE" + "\x01\xE7\xFF\x79\xD6\x79\x82\xFE\x01\xE7\xFF\x79\xDF\x79\x83\xCD\xFF" + "\xE8\xD0\xE8\x83\xCD\x83\x79\x82\x8A\x01\x87\x83\xF3\xFF\xFE\xD0\xFE" + "\x83\xF3\x82\x8A\x01\x87\x83\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6" + "\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF" + "\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF" + "\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79" + "\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86" + "\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF" + "\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6" + "\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF" + "\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF" + "\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79" + "\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86" + "\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF" + "\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6" + "\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF" + "\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF" + "\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79" + "\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86" + "\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF" + "\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6" + "\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF" + "\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF" + "\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79" + "\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86" + "\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF" + "\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6" + "\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF" + "\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF" + "\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79" + "\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86" + "\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF" + "\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6" + "\xFF\x86\x79\xFF\xFF\xD6\xFF\x86\x79\xFF\xFF\xD6\xFF\x83\x79\x82\x8A" + "\x01\x87\x83\xF3\xFF\xFE\xD0\xFE\x83\xF3\x82\x8A\x01\x87\x83\x79\x83" + "\xCD\xFF\xE8\xD0\xE8\x83\xCD\xFF\x79\xDF\x79\x82\xFE\x01\xE7\xFF\x79" + "\xD6\x79\x82\xFE\x01\xE7" + , //body + 635, //lenght + 0, + 0, + 0, + }, + { + "box.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x37\x20\x37\x35\x0A\x32\x82\x35\x01\x0A\xFF\x00" + "\x91\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88" + "\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF" + "\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF" + "\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00" + "\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86" + "\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF" + "\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88" + "\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF" + "\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF" + "\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00" + "\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86" + "\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF" + "\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88" + "\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF" + "\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF" + "\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00" + "\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86" + "\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF" + "\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88" + "\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF" + "\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF" + "\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00" + "\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86" + "\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF" + "\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88" + "\xFF\x86\x00\xFF\xFF\x88\xFF\x86\x00\xFF\xFF\x88\xFF\xFF\x00\x91\x00" + "" + , //body + 459, //lenght + 0, + 0, + 0, + }, + { + "face-jc.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x98\xFF" + "\x83\x00\x83\xC0\x86\x80\x83\xC0\x89\x80\x83\xC0\x83\x80\x83\xC0\x86" + "\x80\x83\xC0\x83\x80\x83\xC0\x89\x80\x83\xC0\x83\x80\x83\xC0\xAD\xFF" + "\x83\x00\x98\xFF\x83\x00\x83\xC0\x86\x80\x83\xC0\x86\x80\x83\xC0\x83" + "\x80\x83\xC0\x86\x80\x83\xC0\x83\x80\x83\xC0\x86\x80\x83\xC0\x83\x80" + "\x83\xC0\xB0\xFF\x83\x80\x83\x00\x95\xFF\x86\x00\x83\xC0\x86\x80\x89" + "\xC0\x83\x80\x8C\xC0\x83\x80\x89\xC0\x83\x80\x83\xC0\xB3\xFF\x86\x80" + "\x83\x00\x8F\xFF\x83\x80\x86\xC0\x83\x00\xAA\x80\x83\x00\x83\xC0\x92" + "\xFF\x83\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x92\xFF\x89\x80\x83\x00" + "\x8C\xFF\x83\x80\x83\xC0\xB0\x00\x83\x80\x95\xFF\x83\x80\x89\x00\x83" + "\x80\x92\xFF\x8C\x00\x83\x80\x89\xFF\x86\xC0\x86\x00\x98\xFF\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x95\xFF\x8F\x00\x92" + "\xFF\x89\xC0\x83\x00\x89\xFF\x83\x80\x86\xC0\x86\x00\x98\xFF\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x95\xFF\x8F\x00\x92" + "\xFF\x83\x00\x86\xC0\x83\x00\x89\xFF\x89\x80\x83\xC0\x8C\x00\x83\xFF" + "\x89\x00\x83\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x8C\xFF\x83\xC0\x83\x80\x83\x00\x83\xC0\x89\x00\x83\xC0\x83\x00" + "\x83\x80\x83\xC0\x89\xFF\x89\xC0\x83\x00\x8F\xFF\x83\x80\x83\xC0\x89" + "\x00\x83\xFF\x89\x00\x83\xFF\x83\x00\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x8C\xFF\x83\x80\x9B\x00\x83\x80\x89\xFF\x83" + "\x00\x86\xC0\x83\x00\x8F\xFF\x83\x80\x83\xC0\x83\x00\x89\xFF\x83\x00" + "\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x8C" + "\xFF\xA1\x00\x89\xFF\x89\xC0\x83\x00\x8C\xFF\x86\x80\x83\xC0\x83\x00" + "\x89\xFF\x83\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x8C\xFF\x83\x80\x9B\x00\x83\x80\x89\xFF\x83\x00\x86\xC0" + "\x83\x00\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x00\x89\xFF\x83" + "\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x8C\xFF\x83\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x83\x00\x83\xC0\x83" + "\x80\x83\x00\x83\x80\x83\xC0\x89\xFF\x89\xC0\x83\x00\x89\xFF\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x00\x86\xFF\x89\x00\x89\xFF\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x86\x80\x95\xFF\x83\x80\x83\x00" + "\x83\x80\x95\xFF\x86\x00\x83\xC0\x83\x00\x89\xFF\x89\x80\x83\xC0\x83" + "\x00\x98\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x86\x80\x86\xC0\x83\x00" + "\x8F\xFF\x83\xC0\x89\x00\x83\xC0\x92\xFF\x89\xC0\x83\x00\x86\xFF\x83" + "\x80\x86\xC0\x83\x80\x83\xC0\x83\xFF\x83\x00\x83\xFF\x89\x00\x89\xFF" + "\x83\x80\x83\xC0\x89\x80\x86\xC0\x86\x00\xB0\xFF\x86\x00\x83\xC0\x83" + "\x00\x86\xFF\x83\x80\x83\xC0\x83\x80\x86\xC0\x83\x80\x83\x00\x92\xFF" + "\x83\x00\x83\x80\x83\xC0\x83\x80\x86\xC0\x92\x00\xAA\xFF\x89\xC0\x83" + "\x00\x86\xFF\x83\x80\x89\xC0\x83\x80\x83\x00\x83\x80\x83\x00\x8C\xFF" + "\x83\x00\x86\x80\x83\xC0\x86\x80\x83\xC0\x89\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\xA7\xFF\x89\xC0\x86\x00\x86\xFF\x8C\x80\x83\x00\x86\x80" + "\x8C\x00\x89\x80\x83\x00\x89\xC0\x86\x00\x83\xFF\x86\x00\x83\xFF\x83" + "\x80\x86\x00\x9E\xFF\x86\x00\x83\xC0\x83\x00\x86\xFF\x86\x00\x83\x80" + "\x83\x00\x83\x80\x86\x00\x8C\x80\x86\x00\x89\x80\x95\x00\x83\xC0\x83" + "\x00\x83\xFF\x89\x80\x86\x00\x95\xFF\x83\x00\x83\xC0\x83\xFF\x83\x80" + "\x8C\xFF\x86\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x86\xC0\x83" + "\x80\x89\x00\x83\x80\x86\x00\x86\xFF\x86\x00\x83\xFF\x83\x00\x83\xC0" + "\x83\x00\x83\xFF\x86\x80\x83\xC0\x83\x80\x83\xFF\x86\x00\x8C\xFF\x83" + "\x00\x86\xC0\x8F\x80\x83\xFF\x83\x00\x83\x80\x83\x00\x83\x80\x86\x00" + "\x8C\x80\x83\x00\x83\xFF\x89\x00\x86\xFF\x86\x00\x83\xFF\x83\x00\x86" + "\xC0\x83\x00\x83\xFF\x83\x80\x89\xC0\x83\x80\x83\xFF\x8F\x00\x89\xC0" + "\x86\xFF\x86\x00\x86\xFF\x86\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83" + "\x80\x86\xC0\x83\x80\x83\x00\x86\xFF\x83\x00\x86\xFF\x86\x00\x83\xFF" + "\x83\x00\x89\xC0\x83\x00\x83\xFF\x86\xC0\x83\x80\x86\xC0\x83\xFF\x8F" + "\x00\x89\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x86\xFF\x83\x00\x83\x80" + "\x83\x00\x83\x80\x86\x00\x8C\x80\x86\x00\x89\xFF\x86\x00\x83\xFF\x83" + "\x00\x86\xC0\x89\x00\x83\xFF\x83\x80\x89\xC0\x83\x80\x83\xFF\x8F\x00" + "\x89\xC0\x83\xFF\x83\x00\x83\xC0\x83\x00\x86\xFF\x86\x00\x83\x80\x83" + "\x00\x83\x80\x83\x00\x83\x80\x86\xC0\x83\x80\x89\x00\x83\xFF\x86\x00" + "\x83\xFF\x83\x80\x83\x00\x8C\xC0\x83\x00\x83\xFF\x86\x80\x83\xC0\x86" + "\x80\x83\xFF\x8F\x00\x89\xC0\x83\x80\x86\xC0\x83\x00\x86\xFF\x83\x00" + "\x83\x80\x83\x00\x83\x80\x86\x00\x8C\x80\x83\x00\x83\xFF\x89\x00\x83" + "\xFF\x83\x80\x83\x00\x86\xC0\x8C\x00\x83\xFF\x8F\x80\x83\xFF\x8F\x00" + "\x89\xC0\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\x80\x83" + "\x00\x83\x80\x89\x00\x83\x80\x86\xC0\x83\x80\x86\x00\x83\xFF\x83\x00" + "\x83\xFF\x86\x00\x92\xC0\x83\x00\x83\xFF\x86\x80\x83\xC0\x86\x80\x83" + "\xFF\x8F\x00\x89\xC0\x83\x00\x86\xC0\x8C\x00\x83\x80\x8C\x00\x8C\x80" + "\x83\x00\x83\x80\x83\x00\x83\xFF\x83\x00\x83\x80\x83\x00\x83\xC0\x83" + "\x00\x83\xC0\x8C\x00\x83\xFF\x83\x80\x89\xC0\x83\x80\x83\xFF\x8F\x00" + "\x92\xC0\x98\x00\x83\x80\x86\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x83" + "\x80\x83\x00\x83\x80\x83\x00\x95\xC0\x83\x00\x83\xFF\x86\xC0\x83\x80" + "\x86\xC0\x83\xFF\x8F\x00\x92\xC0\x86\x00\x83\xFF\x89\x00\x83\xFF\x83" + "\x00\x8C\x80\x86\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x83\xC0\x83\x00" + "\x83\xC0\x92\x00\x83\xFF\x83\x80\x89\xC0\x83\x80\x89\x00\x86\x80\x83" + "\x00\x92\xC0\x83\x00\x89\xFF\x83\x00\x86\xFF\x83\x00\x83\x80\x86\xC0" + "\x83\x80\x83\x00\x89\xC0\x83\x00\x9B\xC0\x83\x00\x83\xFF\x86\x80\x83" + "\xC0\x86\x80\x83\x00\x86\x80\x86\xC0\x83\x00\x92\xC0\x83\x00\x83\xFF" + "\x83\x80\x89\xFF\x83\x80\x83\x00\x8C\x80\x8C\x00\x86\xC0\x83\x00\x83" + "\xC0\x95\x00\x83\xFF\x8C\x00\x92\x80\x83\x00\x92\xC0\x83\x00\x83\x80" + "\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x00\x83\x80\x86\xC0\x83" + "\x80\x83\x00\xA7\xC0\x86\x00\x86\xFF\x83\x00\x86\x80\x86\xC0\x89\x80" + "\x83\x00\x92\xC0\x83\x00\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83" + "\x80\x83\x00\x8C\x80\x86\x00\x83\xC0\x83\x80\x83\x00\x83\xC0\x89\x00" + "\x83\xC0\x83\x00\x83\x80\x83\xC0\x83\x00\x89\xFF\x83\x00\x92\x80\x89" + "\x00\x92\xC0\x83\x00\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF" + "\x83\x80\x86\xC0\x83\x80\x83\x00\x89\xC0\x83\x00\x83\x80\x83\x00\x89" + "\xFF\x83\x00\x83\x80\x86\x00\x8C\xFF\x83\x00\x83\x80\x86\xC0\x86\x80" + "\x86\x00\x83\xFF\x83\x00\x92\xC0\x83\x00\x83\xFF\x83\x80\x83\xFF\x83" + "\x80\x83\xFF\x83\x00\x8C\x80\x86\x00\x89\xC0\x83\x00\x83\xFF\x89\x00" + "\x83\xFF\x83\x00\x8F\xFF\x83\x00\x8F\x80\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\x92\xC0\x86\x00\x83\xFF\x83\x80\x83\xFF\x86\x00\x83\x80" + "\x86\xC0\x83\x80\x83\x00\x83\xC0\x89\x00\x83\xFF\x83\x00\x89\x80\x83" + "\x00\x83\xFF\x83\x00\x89\xFF\x86\x00\x83\x80\x86\xC0\x83\x80\x83\x00" + "\x83\xFF\x83\x00\x83\xFF\x86\x00\x92\xC0\x95\x00\x8C\x80\x83\x00\x86" + "\xC0\x86\x00\x83\xFF\x83\x00\x89\x80\x83\x00\x83\xFF\x86\x00\x83\xC0" + "\x89\x00\x8C\x80\x92\x00\x89\xC0" + , //body + 1623, //lenght + 0, + 0, + 0, + }, + { + "face-jd.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x9B\xFF" + "\x86\x80\x83\xC0\x89\x80\x83\xC0\x86\x80\x83\xC0\x86\x80\x83\xC0\x86" + "\x80\x83\xC0\x86\x80\x83\xC0\x83\x80\x83\x00\x83\x80\xC8\xFF\x86\x80" + "\x83\xC0\x86\x80\x83\xC0\x86\x80\x83\xC0\x86\x80\x83\xC0\x86\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\x00\x83\x80\xCE\xFF\x86\x80\x89\xC0" + "\x86\x80\x8C\xC0\x86\x80\x86\xC0\x83\x80\x83\x00\x83\x80\xB0\xFF\x83" + "\x80\xA1\xFF\xB0\x80\x9F\xFF\x82\x00\x92\xFF\x83\x00\x83\x80\x9E\xFF" + "\xB0\x00\x9B\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x83\x00\x83" + "\xC0\x83\x80\x9B\xFF\x83\x80\x89\x00\x83\x80\x83\xC0\x83\x80\x98\xFF" + "\x83\x00\x83\xC0\x95\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x8C\xFF\x83\x00\x83\xC0\x83\x00\x9B\xFF\x86\x00" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x80\x83\xC0\x92" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x83\xC0\x89\xFF\x83\x00\x83\xC0\x83\x00\x9B" + "\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xFF" + "\x89\x00\x83\xFF\x89\x00\x83\x80\x83\xC0\x83\x80\x8D\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x86\xFF\x83" + "\x00\x83\xC0\x83\x00\x8C\xFF\x83\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\x00\x83\xFF\x89\x80\x83\xFF\x89" + "\x80\x83\xC0\x83\x80\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x89\xFF\x83" + "\x00\x83\xC0\x83\x00\x89\xFF\x83\x80\x83\x00\x8C\xFF\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x8C\xFF\x83\x00\x89\xFF\x83" + "\x80\x83\xC0\x83\x80\x92\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x83\xC0\x8C\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x86" + "\x80\x83\xFF\x83\x80\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x8C\xFF\x83\x00\x89\xFF\x83\x80\x83\xC0\x83\x80\x95" + "\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x89\x00\x83\x80\x86\xFF" + "\x83\xC0\x83\x80\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x8C\xFF\x83\x00\x83\xC0\x86\xFF\x83\x80\x83\xC0\x83\x80" + "\x99\xFF\x82\x00\x92\xFF\x83\x80\x86\xC0\x83\xFF\x86\xC0\x83\x80\x8F" + "\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF" + "\x83\x80\x83\x00\x83\x80\x86\xFF\x83\x80\x83\xC0\x83\x80\xAD\xFF\x83" + "\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\x80\x92\xFF\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x80\x83\xC0\x89" + "\x80\xA7\xFF\x83\x80\x83\xC0\x86\x00\x92\xFF\x86\x80\x86\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF\x86\x00\x83\x80\x83\xFF\x83" + "\x80\x83\xFF\x83\xC0\x83\x80\x86\xC0\x83\x80\xA4\xFF\x83\x00\x83\xC0" + "\x83\x00\x92\xFF\x83\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x00\x83\xC0\x92\xFF\x86\x80\x86\xC0\x83\x80\x83\xC0" + "\x83\x80\xA4\xFF\x83\x80\x83\xC0\x83\x00\x92\xFF\x83\x80\x83\xC0\x86" + "\x80\x83\xC0\x86\x80\x83\xC0\x83\x00\x83\x80\x83\xFF\x83\xC0\x8C\xFF" + "\x83\xC0\x83\xFF\x83\x80\x83\x00\x89\xC0\x83\x80\xA1\xFF\x86\x00\x83" + "\xC0\x83\x00\x92\xFF\x83\x80\x89\xC0\x83\x00\x86\xC0\x83\x00\x8C\x80" + "\x8C\xC0\x95\x80\x86\x00\x9B\xFF\x86\x00\x83\x80\x83\xC0\x83\x00\x92" + "\xFF\x98\x00\xA1\x80\x86\x00\x83\xFF\x83\x00\x83\xC0\x89\x00\x92\xFF" + "\x83\x80\x83\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x8C\xFF\x83\x80\x83" + "\x00\x83\x80\x89\x00\x83\xFF\x8F\x00\x95\x80\x92\x00\x83\xC0\x83\x00" + "\x83\xFF\x89\x00\x8C\xFF\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x83" + "\x00\x86\xFF\x83\x80\x86\x00\x83\xC0\x83\x00\x83\x80\x8C\x00\x83\xFF" + "\xA7\x00\x83\xFF\x86\x00\x83\xC0\x89\x00\x86\xC0\x86\x00\x86\xFF\x83" + "\x00\x83\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x83\x80\x8F\x00\x83\xC0" + "\x83\x00\x83\x80\x8F\x00\x83\xFF\x9B\x00\x83\xFF\x8C\x00\x83\xC0\x83" + "\x00\x83\xFF\x83\x00\x86\xC0\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00" + "\x83\xC0\x83\x00\x83\x80\x83\xC0\x98\x00\x83\xC0\x83\x00\x83\x80\x92" + "\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x89\x00" + "\x83\x80\x86\x00\x83\xC0\x8C\x00\x83\xC0\x83\x00\x89\x80\x83\x00\x83" + "\xC0\x83\x80\x83\x00\x83\xC0\x89\x00\x83\x80\x8F\x00\x83\xC0\x83\x00" + "\x83\x80\xA7\x00\x83\x80\x83\x00\x83\x80\x86\x00\x86\xC0\x83\x00\x83" + "\xFF\x83\x00\x86\xC0\x86\x00\x83\x80\x83\x00\x83\xC0\x89\x00\x83\x80" + "\x83\xFF\x86\x00\x83\x80\x8F\x00\x83\xC0\x83\x00\x83\x80\x86\x00\x83" + "\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80" + "\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\xFF\x83\x00\x83\xC0\x8C" + "\x00\x89\xC0\x86\x00\x83\xC0\x83\x80\x86\xFF\x83\x80\x83\xFF\x83\x00" + "\x83\xC0\x83\x00\x83\x80\x8F\x00\x83\xC0\x83\x00\x83\x80\x86\x00\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x00\x83\xFF\x83\x00\x86\xC0\x83\x00\x83" + "\xFF\x89\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x89\x80\x83\xFF\x86\x00" + "\x83\xC0\x83\x00\x83\x80\x8F\x00\x83\xC0\x83\x00\x83\x80\x86\x00\x83" + "\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80" + "\x83\x00\x83\x80\x83\x00\x83\xFF\x86\x00\x86\xC0\x86\x00\x83\xFF\x8C" + "\x00\x83\xC0\x83\x80\x86\xFF\x89\x00\x83\xC0\x83\x00\x83\xC0\x83\x00" + "\x83\x80\x8F\x00\x83\xC0\x83\x00\x83\x80\x89\x00\x83\x80\x83\x00\x83" + "\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\xFF" + "\x89\x00\x89\xC0\x89\x00\x83\xFF\x83\x00\x83\xC0\x83\x00\x86\x80\x83" + "\x00\x86\x80\x83\x00\x83\xC0\x89\x00\x83\xC0\x8F\x00\x83\xC0\x83\x00" + "\x83\x80\x86\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83" + "\x80\x83\x00\x83\x80\x83\x00\x83\xFF\x86\x00\x83\xFF\x86\x00\x89\xC0" + "\x89\x00\x83\xC0\x83\x80\x83\xFF\x86\x00\x83\xFF\x83\x80\x83\x00\x83" + "\xC0\x83\x00\x86\xC0\x83\x00\x83\x80\x8F\x00\x83\xC0\x83\x00\x83\x80" + "\x86\x00\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x00\x83\xFF\x86\x00\x83\xFF\x83\x00\x83\xFF\x86\x00\x89\xC0" + "\x83\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\x89\x80\x83\x00\x83\xC0\x89" + "\x00\x83\x80\x83\xC0\x8F\x00\x83\xC0\x83\x00\x83\x80\x86\x00\x83\x80" + "\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\xFF\x86" + "\x00\x83\xFF\x86\x00\x83\xC0\x8F\x00\x83\xC0\x83\x80\x83\x00\x83\xC0" + "\x83\x00\x86\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83" + "\x80\x83\xC0\x83\x80\x8F\x00\x83\xC0\x83\x00\x83\x80\x89\x00\x83\x80" + "\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\xFF\x86\x00\x83\xFF\x8C" + "\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0" + "\x83\x00\x89\x80\x83\x00\x83\xC0\x89\x00\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x86\x00\x83\xFF\x86\x00\x83\xC0\x83\x00\x83\x80\x86\x00\x83\x80" + "\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\xFF\x86\x00\x83\xFF\x83" + "\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x83\xC0\x83\x80" + "\x83\x00\x83\xC0\x83\x00\x86\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83" + "\xC0\x83\x00\x83\x80\x83\xC0\x83\x80\x92\x00\x86\xC0\x83\x00\x83\x80" + "\x86\x00\x83\x80\x83\xC0\x83\x80\x83\xC0\x8C\x00\x83\xFF\x89\x00\x83" + "\xC0\x83\x00\x83\x80\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0" + "\x83\x00\x89\x80\x83\x00\x83\xC0\x89\x00\x83\x80\x83\xC0\x86\x00\x83" + "\xFF\x89\x00\x83\xC0\x83\x80\x86\xC0\x83\x00\x83\x80\x86\x00\x83\x80" + "\x83\x00\x83\x80\x8F\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x86\x80\x83" + "\x00\x83\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x86\xFF\x83\x80\x83\x00" + "\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\x80\x95\x00\x86\xC0\x83\x80\x86" + "\xC0\x83\x00\x83\x80\x86\x00\x83\x80\x86\x00\x83\xFF\x8F\x00\x83\xC0" + "\x83\x00\x86\x80\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x83" + "\x00\x89\x80\x83\x00\x83\xFF\x89\x00\x83\x80\x92\x00\x83\x80\x83\x00" + "\x86\xC0\x83\x80\x86\xC0\x83\x00\x83\x80\x92\x00\x83\x80\x89\x00\x83" + "\xFF\x83\x00\x89\x80\x83\x00\x83\xC0\x83\x80" + , //body + 1847, //lenght + 0, + 0, + 0, + }, + { + "face-jh.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x9B\xFF" + "\x83\x00\x86\x80\x83\xFF\x89\x80\x83\xFF\x83\x80\x83\xFF\x86\x80\x83" + "\xFF\x83\x80\x83\xFF\x89\x80\x83\xFF\x83\x80\x83\x00\xAD\xFF\x83\x00" + "\x86\xFF\x89\x00\x8C\xFF\x83\x00\x86\x80\x83\xFF\x86\x80\x83\xFF\x83" + "\x80\x83\xFF\x86\x80\x83\xFF\x83\x80\x83\xFF\x86\x80\x83\xFF\x83\x80" + "\x83\x00\xB0\xFF\x83\x80\x83\x00\x86\xFF\x83\x00\x83\xC0\x83\x00\x8C" + "\xFF\x83\x00\x86\x80\x89\xFF\x83\x80\x8C\xFF\x83\x80\x89\xFF\x83\x80" + "\x86\x00\xB0\xFF\x83\x80\x83\x00\x86\xFF\x83\x00\x86\xC0\x83\x80\x89" + "\xFF\x83\x00\xAA\x80\x86\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0" + "\x83\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x83\x80\x83\x00\x86" + "\xFF\x83\x00\x86\xC0\x83\x00\x89\xFF\xB3\x00\x8C\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8C\xFF\x8C\x00\x83\xFF\x83\x00" + "\x86\xC0\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x8F\xFF\x83\x00\x90\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF\x83\x80" + "\x83\xFF\x83\x80\x86\xFF\x83\x00\x83\xC0\x83\x00\x89\xFF\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xFF" + "\x83\x00\x83\x80\x83\xFF\x83\x00\x90\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF\x83\x80\x83\xFF\x83" + "\x80\x89\xFF\x86\x00\x86\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xFF\x83\xC0\x83\x80\x83\xFF\x83" + "\x00\x83\xFF\x83\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x8C\xFF\x83\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0" + "\x83\x00\x83\xC0\x83\x00\x86\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x80\x93\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF\x8C\x00\x83\xC0\x83\x00\x86\xC0" + "\x83\x80\x86\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x95\xFF\x83\x00\x92\xFF\x83\xC0\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x92\xFF\x83\x80\x83\x00\x86" + "\xFF\x83\x00\x86\xC0\x83\x00\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x00\x92\xFF\x83" + "\xC0\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\x80\x83\x00\x86\xFF\x83\x00" + "\x86\xC0\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF\x86\x00\x83\xFF\x83\x80\x86\x00" + "\x96\xFF\x82\x00\x98\xFF\x83\x80\x83\x00\x86\xFF\x83\x00\x83\xC0\x83" + "\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xFF\x83\xC0\x83\x00\x83\x80\x86\xFF\x83\x00\xB6" + "\xFF\x83\x80\x83\x00\x83\xFF\x89\x00\x89\xFF\x89\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\xB6" + "\xFF\x83\x80\x83\x00\x92\xFF\x83\x80\x89\xC0\x86\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x8C\xFF\x89\x00\xAA\xFF\x83\x00\x89" + "\xFF\x83\x80\x83\x00\x8F\xFF\x83\x80\x86\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x86\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\xA4" + "\xFF\x86\x00\x83\x80\x86\x00\x83\xFF\x83\x80\x83\x00\x8F\xFF\x83\x80" + "\x83\xC0\x83\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\x00\x86\x80\x8C\xFF\x92\x00\x95\xFF\x83\x00\x89\x80" + "\x83\x00\x83\xFF\x83\x80\x83\x00\x8F\xFF\x83\x80\x86\xC0\x86\x80\x86" + "\xC0\x83\x80\x83\xC0\x86\x80\x83\x00\x8C\x80\x89\x00\x86\xC0\x83\x00" + "\x89\xC0\x83\x00\x95\xFF\x83\x00\x83\x80\x83\x00\x86\xFF\x83\x80\x83" + "\x00\x92\xFF\x83\x80\x8C\xC0\x83\x80\x83\xC0\x86\x80\x83\x00\x98\x80" + "\x83\x00\x86\xC0\x86\x00\x83\xC0\x83\x00\x8C\xFF\x8C\x00\x83\x80\x83" + "\x00\x86\xFF\x83\x80\x83\x00\x92\xFF\x95\x80\x86\xC0\x86\x00\x95\x80" + "\x86\x00\x8C\xC0\x83\x00\x89\xFF\x83\x00\x89\xFF\x83\x00\x83\x80\x83" + "\x00\x86\xFF\x83\x80\x83\x00\x8C\xFF\x86\x00\x83\x80\x83\xFF\x83\x80" + "\x83\x00\x95\xC0\x92\x00\x89\xC0\x83\x00\x86\xC0\x86\x00\x86\xFF\x83" + "\x00\x8F\xFF\x89\x00\x83\xFF\x83\x80\x83\x00\x86\xFF\x92\x00\x83\x80" + "\x83\xFF\x86\x00\xAD\xC0\x86\x00\x83\xFF\x83\x80\x89\x00\x86\xFF\x86" + "\x80\x83\xFF\x83\x80\x83\xFF\x83\x00\x83\xFF\x83\x80\x89\x00\x86\xFF" + "\x86\x80\x8C\x00\x83\x80\x83\xFF\x89\x00\x9B\xC0\x89\x00\x83\xFF\x89" + "\x80\x8C\x00\x86\xFF\x8C\x80\x83\x00\x83\xFF\x83\x80\x83\x00\x86\x80" + "\x8C\xFF\x86\x80\x8C\x00\x83\x80\x83\xFF\x83\x80\x9B\x00\x83\x80\x83" + "\xFF\x89\x80\x8C\x00\x86\x80\x83\x00\x86\xFF\x83\x80\x86\xFF\x83\x00" + "\x83\xFF\x8C\x00\x86\x80\x8C\xFF\x86\x80\x8C\x00\x83\x80\x83\xFF\x83" + "\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x89\x80" + "\x8C\x00\x86\x80\x89\xFF\x92\x00\x83\xFF\x89\xC0\x89\x00\x86\x80\x8C" + "\xFF\x86\x80\x8C\x00\x83\x80\x95\x00\x83\x80\x8C\x00\x86\x80\x8C\xFF" + "\x83\x80\x89\x00\x83\xFF\x83\x00\x86\xFF\x86\xC0\x83\x00\x89\xC0\x86" + "\x00\x86\x80\x8C\xFF\x86\x80\x89\x00\x83\x80\x83\x00\x89\xFF\x83\x00" + "\x83\x80\x89\x00\x86\x80\x8C\xFF\x86\x80\x86\x00\x86\xFF\x86\x00\x86" + "\xFF\x83\xC0\x83\x00\x89\xC0\x83\x00\x86\xC0\x86\x00\x86\x80\x8C\xFF" + "\x86\x80\x86\x00\x83\x80\x83\x00\x83\xFF\x83\x00\x83\x80\x86\x00\x86" + "\x80\x8C\xFF\x86\x80\x86\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF" + "\x86\x00\x83\xFF\x89\x00\x83\xC0\x83\x00\x86\xC0\x83\x80\x8C\x00\x86" + "\x80\x8C\xFF\x83\x80\x86\x00\x83\x80\x83\x00\x83\x80\x86\x00\x83\x80" + "\x8C\xFF\x86\x80\x86\x00\x89\xC0\x83\x00\x8C\xFF\x86\x00\x89\xFF\x83" + "\x00\x86\xC0\x83\x80\x86\x00\x89\xC0\x86\x00\x86\x80\x89\xFF\x83\x80" + "\x86\x00\x83\x80\x86\x00\x83\x80\x8C\xFF\x83\x80\x86\x00\x8F\xC0\x83" + "\x00\x83\xFF\x83\x00\x83\xFF\x8C\x00\x89\xFF\x83\x00\x83\x80\x86\x00" + "\x92\xC0\x83\x00\x86\x80\x89\xFF\x83\x80\x89\x00\x83\x80\x89\xFF\x86" + "\x80\x83\x00\x95\xC0\x83\x00\x8C\xFF\x86\x00\x86\xFF\x83\x00\x83\xFF" + "\x89\x00\x83\xC0\x9B\x00\x83\x80\x89\xFF\x83\x80\x83\x00\x83\x80\x89" + "\xFF\x83\x80\x9B\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x8C\x00" + "\x8C\xFF\x83\x00\x86\xC0\x83\x00\x95\xFF\x83\x00\x86\x80\x86\xFF\x89" + "\x00\x86\xFF\x86\x80\x83\x00\x95\xFF\x83\x00\x83\xC0\x83\x00\x8C\xFF" + "\x8C\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x86\xC0\x83\x00\x83\xFF\x8F" + "\x00\x83\xFF\x86\x00\x86\x80\x83\x00\x89\xFF\x83\x00\x86\x80\x86\x00" + "\x83\xFF\x8F\x00\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x8F\x00\x8C\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x86\xC0" + "\x8C\x00\x83\xFF\x86\x00\x83\xFF\x89\x00\x83\xFF\x86\x00\x83\xFF\x8C" + "\x00\x86\xC0\x83\x00\x83\xFF\x83\x00\x83\xC0\x83\x00\x8C\xFF\x8F\x00" + "\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x86" + "\xC0\x86\x00\x86\xFF\x86\x00\x83\xFF\x83\x00\x89\x80\x83\x00\x83\xFF" + "\x86\x00\x86\xFF\x86\x00\x86\xC0\x83\x00\x83\xFF\x83\x00\x83\xC0\x83" + "\x00\x83\xFF\x83\x00\x83\xFF\x8F\x00\x8C\xFF\x83\x00\x83\xC0\x83\x00" + "\x83\xFF\x83\x00\x86\xC0\x86\x00\x86\xFF\x86\x00\x83\xFF\x83\x00\x89" + "\x80\x83\x00\x83\xFF\x86\x00\x86\xFF\x86\x00\x86\xC0\x83\x00\x83\xFF" + "\x83\x00\x83\xC0\x83\x00\x8C\xFF\x86\x00" + , //body + 1727, //lenght + 0, + 0, + 0, + }, + { + "face-js.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x89\xFF" + "\x83\x00\x83\x80\x89\xFF\x83\x00\x83\x80\x83\xC0\x89\x80\x83\xC0\x83" + "\x80\x83\xC0\x86\x80\x83\xC0\x83\x80\x83\xC0\x89\x80\x83\xC0\x86\x80" + "\x83\x00\xB6\xFF\x83\x00\x86\xC0\x83\x80\x89\xFF\x83\x00\x83\x80\x83" + "\xC0\x86\x80\x83\xC0\x83\x80\x83\xC0\x86\x80\x83\xC0\x83\x80\x83\xC0" + "\x86\x80\x83\xC0\x86\x80\x83\x00\xB6\xFF\x83\x00\x83\xC0\x83\x00\x83" + "\x80\x83\xC0\x83\x80\x89\xFF\x83\x00\x83\x80\x89\xC0\x83\x80\x8C\xC0" + "\x83\x80\x89\xC0\x86\x80\x83\x00\xB9\xFF\x83\x00\x83\xC0\x83\x00\x83" + "\x80\x83\xC0\x83\x80\x8C\xFF\x83\x00\xAA\x80\x83\x00\xB9\xFF\x83\x00" + "\x83\xC0\x83\x00\x83\x80\x83\xC0\x83\x80\x8C\xFF\xB0\x00\x9B\xFF\x83" + "\x00\x9E\xFF\x83\x00\x86\xC0\x83\x80\x8F\xFF\x83\x00\x8F\xFF\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x9B" + "\xFF\x83\x80\x83\x00\x83\x80\x9E\xFF\x83\x00\x83\x80\x92\xFF\x83\x00" + "\x83\xFF\x86\x00\x86\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x80\x89\x00\x83\x80\x98\xFF" + "\x83\x00\x86\xC0\x83\x80\x8F\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83" + "\x80\x83\xC0\x83\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x80\x8F\x00\x83\x80\x92\xFF\x83" + "\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x83\x80\x8C\xFF\x83\x80\x92\xFF" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x8F\xFF\x83\xC0\x95\x00\x83\xC0\x92\xFF\x83\x00\x86\xC0\x83\x80" + "\x8C\xFF\x83\x00\x95\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x8F\xFF\x83\x80\x95\x00\x83\x80\x95\xFF" + "\x83\x00\x83\x80\x8C\xFF\x83\x00\x98\xFF\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x8F\xFF\x83\x80\x95\x00" + "\x83\x80\x92\xFF\x83\x00\x86\xC0\x83\x80\x89\xFF\x86\x00\x86\xFF\x86" + "\x00\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x80\x83\x00\x83\xC0\x83" + "\x00\x83\xC0\x83\x00\x83\x80\x92\xFF\x83\x00\x83\xC0\x83\x00\x83\x80" + "\x83\xC0\x83\x80\x8C\xFF\x83\x00\x86\xFF\x83\x00\x83\x80\x83\xC0\x83" + "\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x98\xFF\x83\x80\x83\x00\x83\x80\x98\xFF\x83\x00\x83\xC0\x83" + "\x00\x83\x80\x83\xC0\x83\x80\x8C\xFF\x83\x00\x92\xFF\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xC0\x86\x80\x8F\xFF\x83" + "\xC0\x89\x00\x83\xC0\x95\xFF\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0" + "\x83\x80\x8C\xFF\x86\x00\x83\x80\x89\xFF\x83\x80\x86\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x8C\xC0\x83\x80\xB3\xFF\x83\x00\x86\xC0" + "\x83\x80\x8F\xFF\x83\x00\x8F\xFF\x83\x80\x86\xC0\x83\x80\x86\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xC0\x83\x80\xAD\xFF\x8F\x00" + "\x8C\xFF\x86\x00\x8F\xFF\x89\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\xAD\xFF\x83\x00\x89\xFF" + "\x86\x00\x83\xFF\x8C\x00\x83\x80\x86\xFF\x8F\x80\x83\xC0\x86\x80\x83" + "\xC0\x83\x80\x83\xC0\x86\x80\x86\xC0\x83\x80\xB0\xFF\x86\x80\x86\xFF" + "\x98\x00\x95\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\x89\xC0\x86\x80\xAD" + "\xFF\x83\x00\x86\xFF\x86\x80\x86\x00\x83\xFF\xC8\x00\xA7\xFF\x83\x00" + "\x83\xFF\x89\x00\x83\xFF\x83\x00\x83\xFF\xBC\x00\x83\xFF\x83\x00\x83" + "\xFF\x89\x00\xA1\xFF\x89\x00\x83\xFF\x8C\x00\x83\xFF\x83\x00\x83\xC0" + "\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83" + "\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00" + "\x83\xFF\x89\x00\x83\xFF\x89\x00\x98\xFF\x83\x00\x83\x80\x89\x00\x83" + "\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\xB9\x00\x83\xFF\x83\x00\x83\xFF" + "\x83\x00\x83\xFF\x86\x00\x83\x80\x86\x00\x92\xFF\x83\x80\x86\x00\x83" + "\x80\x83\x00\x83\xFF\x8C\x00\x83\xFF\x83\x00\xB0\x80\x83\x00\x83\xFF" + "\x89\x00\x83\xFF\x83\x00\x89\x80\x89\x00\x86\xFF\x8C\x00\x83\x80\x89" + "\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x86\x00\x83\x80\x83\xC0" + "\x86\x80\x83\xC0\x86\x80\x83\xC0\x86\x80\x83\xC0\x86\x80\x83\xC0\x83" + "\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\x80" + "\x89\x00\x86\x80\x86\x00\x83\xC0\x86\x00\x83\x80\x86\x00\x83\xC0\x83" + "\x00\x83\xFF\x8C\x00\x83\xFF\x83\x00\x89\x80\x83\xC0\x83\x00\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x00\x83\xC0\x89\x80\x83\x00\x83" + "\xFF\x89\x00\x83\xFF\x89\x00\x86\x80\x86\x00\x89\xC0\x83\x00\x83\x80" + "\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x83" + "\x00\x83\xFF\x86\x00\x83\x80\x83\xC0\x83\x00\x83\xC0\x83\x80\x89\xC0" + "\x83\x80\x83\xC0\x83\x00\x83\xC0\x86\x80\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\x83\xFF\x83\x00\x86\x80\x86\x00\x86\xC0\x92\x00\x83\xC0" + "\x83\x00\x83\xC0\x86\x00\x83\xFF\x8F\x00\x83\xC0\x83\x00\x83\x80\x83" + "\xC0\x86\x80\x83\xC0\x83\x00\x83\xC0\x86\x80\x83\xC0\x89\x80\x83\x00" + "\x83\xFF\x89\x00\x83\xFF\x8C\x00\x8F\xC0\x89\x00\x83\xC0\x83\x00\x83" + "\xC0\x83\x00\x83\xC0\x86\x00\x83\xFF\x86\x00\x83\xC0\x92\x00\x83\xFF" + "\x89\x00\x83\xFF\x89\x00\x83\xFF\x86\x00\x83\xFF\x83\x00\x83\xFF\x83" + "\x00\x83\xFF\x89\x00\x86\xC0\x8F\x00\x86\xC0\x83\x00\x83\xC0\x83\x00" + "\x83\xC0\x8F\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF" + "\x83\x00\x83\xFF\x83\x00\x83\xFF\x92\x00\x92\xC0\x86\x00\x83\xC0\x83" + "\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x83\x80\x86\x00\x83\xC0\x86\x00" + "\x86\xC0\x86\x00\x83\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF\x8C\x00\x83" + "\xFF\x83\x00\x83\xFF\x89\x00\x86\xC0\x83\x00\x83\xC0\x8C\x00\x83\xC0" + "\x83\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x83\xC0\x83\x80\x83\x00\x83" + "\xC0\x86\x00\x89\xC0\xBC\x00\x95\xC0\x86\x00\x83\xC0\x83\x00\x83\xC0" + "\x89\x00\x86\x80\x83\x00\x83\xC0\x8F\x00\x83\xC0\x83\x00\xB6\xFF\x83" + "\x00\x86\xC0\x83\x00\x83\xC0\x8C\x00\x83\xC0\x83\x00\x83\x80\x89\x00" + "\x83\xC0\x83\x80\x83\x00\x83\xC0\x86\x00\x8F\xC0\x83\x00\xB3\x80\x83" + "\x00\x95\xC0\x86\x00\x83\xC0\x86\x80\x86\x00\x86\x80\x83\x00\x83\xC0" + "\x8F\x00\x89\xC0\xB9\x00\x83\xC0\x83\x00\x83\xC0\x8F\x00\x83\xC0\x83" + "\x00\x86\x80\x83\x00\x83\xC0\x83\x80\x83\x00\x83\xC0\x86\x00\x92\xC0" + "\x89\x00\x83\xFF\x86\x00\x83\xFF\x83\x00\x83\xC0\x86\xFF\x86\x00\x83" + "\xFF\x86\x00\x83\xFF\x89\x00\x92\xC0\x83\x00\x83\xC0\x83\x00\x89\x80" + "\x83\x00\x86\x80\x83\x00\x83\xC0\x8C\x00\x86\xC0\x83\x00\x83\xC0\x86" + "\x00\x86\xC0\x83\x00\x86\xC0\x83\x00\x83\xC0\x83\xFF\x83\xC0\x83\x00" + "\x86\xC0\x83\x00\x86\xC0\x86\x00\x8C\xC0\x8C\x00\x83\xC0\x83\x00\x86" + "\x80\x83\x00" + , //body + 1533, //lenght + 0, + 0, + 0, + }, + { + "face-kc.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\xAD\xFF" + "\x83\xC0\x83\x00\x83\xC0\x83\xFF\x83\xC0\x83\x80\x83\xC0\x83\xFF\x83" + "\xC0\x83\x80\x83\xC0\x83\xFF\x83\xC0\x83\x80\x83\xC0\x83\xFF\x92\xC0" + "\x83\x00\x83\xC0\xC2\xFF\x83\xC0\x83\x00\x83\xC0\x83\x80\x83\x00\x83" + "\x80\x83\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x83\x80\x83\x00\x83\x80" + "\x86\xC0\x83\x80\x89\xC0\x83\x00\x83\xC0\xC8\xFF\x83\xC0\x83\x00\xA7" + "\x80\x83\x00\x83\x80\x83\xC0\x83\x00\x83\xC0\xCE\xFF\x83\xC0\xA4\x00" + "\x89\x80\x83\x00\x83\xC0\x95\xFF\x83\x80\x92\xFF\x83\xC0\x83\x80\x83" + "\x00\x83\x80\x83\xC0\x9B\xFF\xB0\x00\x95\xFF\x89\x80\x8F\xFF\x83\x80" + "\x89\x00\x83\x80\x95\xFF\x83\xC0\x83\x00\x83\x80\x98\xFF\x83\x80\x83" + "\xC0\x8F\x00\x92\xFF\x83\x80\x83\xC0\x86\x80\x8F\xFF\x8F\x00\x95\xFF" + "\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x89" + "\x00\x92\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\x8F\xFF\x8F\x00\x95\xFF" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x86\x00\x83\xFF\x83\xC0\x89\x00\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00" + "\x83\xFF\x83\x80\x83\xC0\x86\xFF\x83\xC0\x83\x80\x83\x00\x83\xC0\x89" + "\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x8C\xFF\x83\x80\x83\x00\x83\x80" + "\x83\x00\x83\x80\x83\xFF\x83\x80\x83\x00\x83\x80\x83\xFF\x83\x00\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00" + "\x83\xFF\x83\x80\x83\xC0\x86\xFF\x83\x80\x9B\x00\x83\x80\x8C\xFF\x83" + "\x80\x83\xC0\x83\x80\x89\xFF\x83\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83\xFF\x83\x80\x83" + "\xC0\x86\xFF\xA1\x00\x8C\xFF\x83\x80\x86\xC0\x89\xFF\x83\x00\x8C\xFF" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83" + "\x00\x83\xFF\x83\x80\x83\xC0\x86\xFF\x83\x80\x9B\x00\x83\x80\x8C\xFF" + "\x83\x80\x86\xC0\x86\xFF\x83\xC0\x83\x80\x8C\xFF\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83\xFF\x83\x80" + "\x83\xC0\x86\xFF\x83\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x83\x00\x83" + "\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x89\xFF\x83\xC0\x83\x80\x86\xC0" + "\x86\xFF\x86\x00\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\x92\xFF" + "\x83\x80\x83\x00\x83\x80\x95\xFF\x83\x00\x8C\xC0\x83\x80\x89\xFF\x83" + "\x80\x83\xC0\x83\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x89\x80\x8C\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\x8F\xFF\x83\xC0\x89" + "\x00\x83\xC0\x92\xFF\x89\x00\x83\xC0\x86\xFF\x89\x00\x89\xFF\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xFF\x83\x00\x89" + "\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\xB3\xFF\x83\x80\x86\xC0\x98\xFF" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\xFF\x83\x80\x83\xFF\x83\x00\x83" + "\xFF\x86\x00\x86\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\xAA\xFF\x83\xC0" + "\x86\x00\x83\x80\x8C\xC0\x89\xFF\x83\xC0\x83\xFF\x86\x80\x83\xFF\x83" + "\x80\x83\xC0\x89\x80\x83\xFF\x86\x00\x83\x80\x89\x00\x83\xFF\x83\x80" + "\x83\xC0\xAA\xFF\x83\x00\x86\xC0\x83\x80\x89\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xFF\x86\x80\x83\xC0\x83\x80" + "\x83\xFF\x83\x80\x83\xFF\x83\x00\x8C\x80\x83\x00\x83\xFF\x83\x80\x83" + "\xC0\xAA\xFF\x83\x00\x83\xC0\x83\x80\x89\xC0\x83\xFF\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x86\x80\x83\xFF\x83\x80\x89\xFF\x86" + "\x00\x83\x80\x83\xC0\x89\x80\x83\x00\x83\xFF\x83\x80\x83\xC0\x9E\xFF" + "\x83\xC0\x83\x80\x89\x00\x89\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x89" + "\xC0\x83\xFF\x83\x00\x86\xFF\x83\x00\x83\x80\x89\x00\x86\x80\x86\xC0" + "\x89\x80\x83\x00\x83\xFF\x83\x80\x83\xC0\x95\xFF\x83\xC0\x83\x80\xA1" + "\x00\x83\x80\x83\x00\x83\x80\x83\xC0\x83\x80\x83\x00\x83\x80\x86\x00" + "\x8C\x80\x83\x00\x8F\x80\x83\xC0\x86\x00\x83\xFF\x83\x80\x83\xC0\x8C" + "\xFF\x83\xC0\x83\x80\x86\x00\x86\x80\x83\x00\x86\xC0\x86\x00\x83\xFF" + "\x86\x00\x83\xC0\x83\x00\x01\x80\x82\x00\x9F\x80\x85\x00\x83\x80\x83" + "\xC0\x8C\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\x89\xFF" + "\x83\xC0\x83\x00\x92\x80\x83\x00\x86\xC0\x8F\x00\x83\xC0\x83\x80\x83" + "\x00\x01\x80\x82\x00\x93\x80\x88\x00\x83\x80\x86\xC0\x86\x80\x83\xC0" + "\x83\x00\x86\xFF\x83\x00\x83\xFF\x83\x80\x83\xC0\x86\xFF\x83\x80\x83" + "\x00\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF" + "\x83\x00\x86\xC0\x86\x00\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xC0\x83" + "\x80\x83\x00\x01\x80\x82\x00\x87\x80\x85\x00\x83\x80\x83\xC0\x83\x00" + "\x8F\x80\x83\x00\x86\xFF\x83\xC0\x83\x00\x83\xFF\x83\x80\x83\xC0\x83" + "\xFF\x83\x80\x86\x00\x9B\x80\x83\x00\x86\xC0\x8C\x00\x83\xC0\x83\x00" + "\x83\xC0\x83\x80\x83\x00\x01\x80\x82\x00\x01\x80\x85\x00\x83\x80\x83" + "\xC0\x83\x00\x8C\x80\x83\xC0\x83\x00\x83\xC0\x83\xFF\x83\x80\x86\x00" + "\x83\xFF\x83\x80\x86\xC0\x89\x00\x83\xFF\x83\x80\x83\xFF\x83\x80\x83" + "\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\x00\x86\xC0\x89\x00" + "\x83\xC0\x83\x00\x86\xC0\x83\x80\x86\x00\x83\x80\x86\xC0\x83\x00\x83" + "\x80\x83\xC0\x8C\x80\x83\xFF\x83\xC0\x89\x00\x83\xFF\x83\x80\x83\xC0" + "\x83\x80\x89\x00\x9E\x80\x86\x00\x83\xC0\x83\x80\x89\x00\x83\xC0\x86" + "\x00\x83\xC0\x86\x80\x83\xC0\x86\x00\x83\x80\x86\xC0\x86\x80\x83\x00" + "\x83\xC0\x83\xFF\x8C\x00\x83\xFF\x83\x80\x83\xC0\x83\x80\x89\x00\x83" + "\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80" + "\x83\xFF\x89\x00\x83\xC0\x83\x80\x86\x00\x83\xC0\x83\x00\x92\xC0\x83" + "\x00\x8C\x80\x83\xC0\x83\x00\x83\xFF\x83\xC0\x83\x00\x83\x80\x86\x00" + "\x83\xFF\x83\x80\x83\xC0\x83\x80\x89\x00\x8F\x80\x8C\x00\x83\x80\x86" + "\x00\x83\x80\x83\x00\x83\xC0\x89\x00\x83\xC0\x89\x00\x83\x80\x89\x00" + "\x92\x80\x83\xFF\x83\x80\x8C\x00\x83\xFF\x83\x80\x83\xC0\x83\x00\x86" + "\xC0\x86\x00\x83\x80\x83\xFF\x83\x80\x83\x00\x8C\xFF\x92\x00\x83\x80" + "\x86\x00\x83\xC0\x83\x00\x8F\xC0\x83\x00\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\xFF\x86\x00\x83\x80\x86\x00\x83\xFF\x83\x80" + "\x8F\xC0\x83\x00\x86\x80\x83\x00\x83\xFF\x83\xC0\x86\x00\x83\xC0\x83" + "\xFF\x86\x00\x86\x80\x83\x00\x83\xC0\x86\x00\x83\xC0\x89\x00\x83\x80" + "\x86\x00\x83\x80\x86\xC0\x86\x80\x83\x00\x83\xFF\x83\xC0\x8F\x00\x83" + "\xFF\x83\x80\x83\xC0\x83\x00\x86\xC0\x89\x00\x83\x80\x83\x00\x83\xFF" + "\x83\x00\x86\x80\x83\x00\x83\xFF\x92\x00\x83\x80\x86\x00\x83\xC0\x83" + "\x00\x89\xC0\x83\x00\x8C\x80\x83\xC0\x83\x00\x83\xFF\x83\x80\x95\x00" + "\x83\xC0\x98\x00\x83\xFF\x83\x00\x86\x80\x83\x00\x83\xFF\x86\x00\x89" + "\x80\x83\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x83\x80\x86\x00\x92\x80" + "\x83\xFF\x83\x80\x86\x00\x86\xFF\x83\x80\x86\xFF\x86\x00\x86\x80\x8F" + "\x00\x83\xFF\x83\xC0\x86\x00\x83\xC0\x83\xFF\x95\x00\x83\xC0\x83\x00" + "\x83\xC0\x83\x00\x89\xC0\x83\x00\x86\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xFF\x86\x00\x8C\xFF\x86\x80\x9E\x00\x8C\xFF\xB0\x00\x83\x80" + "\x86\xC0\x83\x80\x83\x00\x83\xC0\x83\xFF\x86\x00\x83\xFF\x86\x80\x89" + "\xFF\x86\x00\x86\xFF\x83\x00\x86\xFF\x95\x00\x86\x80\x83\x00\x8C\xFF" + "\x83\x00\x89\x80\x92\x00\x89\x80\x83\x00\x83\xC0\x83\xFF\x86\x00\x89" + "\xFF\x89\x80\x86\x00\x92\xFF\x86\x00\x86\xFF\x83\x00\x89\x80\x83\x00" + "\x8C\xFF\x83\x00\x89\x80\x83\x00\x8C\xFF\x83\x00\x89\x80\x83\x00\x86" + "\xFF\x86\x00\x92\xFF\x83\x00" + , //body + 1673, //lenght + 0, + 0, + 0, + }, + { + "face-kd.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\xA7\xFF" + "\x83\x80\x8C\xC0\x83\x80\x89\xC0\x83\x80\xA7\xC0\x83\x80\xC2\xFF\x83" + "\x80\x86\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x83\x80\x83\x00\x83\x80" + "\x86\xC0\x83\x80\x98\xC0\x83\x80\x89\xFF\x83\x80\x83\x00\x83\x80\x86" + "\xFF\x83\x00\xAD\xFF\x9B\x80\x83\xC0\x83\x80\x83\x00\x83\x80\x86\xC0" + "\x83\x80\x89\xC0\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x00\x86\xFF\x83" + "\x00\x83\x80\xAD\xFF\x9B\x00\x8C\x80\x83\xC0\x83\x80\x83\x00\x83\x80" + "\x83\xC0\x83\x80\x89\xFF\x83\x80\x86\xC0\x83\x00\x86\xFF\x83\x00\x83" + "\x80\x96\xFF\x82\x00\x98\xFF\xA4\x00\x8F\x80\x83\x00\x89\xFF\x83\x00" + "\x86\xC0\x83\x00\x86\xFF\x83\x00\x83\x80\x92\xFF\x83\xC0\x01\xFF\x82" + "\x00\x83\xC0\x95\xFF\x83\x00\x92\xFF\x86\x00\x83\xC0\x98\x00\x86\xFF" + "\x83\x80\x86\xC0\x83\x00\x83\xFF\x8C\x00\x8F\xFF\x83\xC0\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x92\xFF\x83\x00\x83\xFF" + "\x86\x00\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x95\x00\x86\xFF\x83" + "\x00\x83\xC0\x83\x00\x86\xFF\x83\x80\x83\xFF\x83\x80\x8F\xFF\x83\xC0" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x8F\xFF\x86\x00\x83\x80\x83\xFF\x83\x80\x86\xFF" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x86\xFF\x86\x00\x89\xFF\x83\x80\x83\xFF\x83\x80" + "\x8D\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x8C\xFF\x83\x80\x92\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xFF\x83\x00" + "\x83\xC0\x83\x00\x86\xFF\x83\x00\x83\xC0\x83\x00\x83\xC0\x8C\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x83\xC0\x8C\xFF\x83\x00\x95\xFF\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x86\xFF\x83\x80\x86\xC0\x83\x00\x83\xFF\x8C\x00\x8F\xFF\x83\xC0\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8C\xFF\x83\x00" + "\x98\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF\x83\x00\x86\xC0\x83\x00\x86\xFF" + "\x83\x00\x83\x80\x92\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x86" + "\x00\x83\xC0\x95\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xFF\x83\x80\x86\xC0\x83" + "\x00\x86\xFF\x83\x00\x83\x80\x96\xFF\x82\x00\x98\xFF\x86\x00\x86\x80" + "\x83\xFF\x83\xC0\x86\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF\x83\x80\x83\xC0" + "\x83\x00\x86\xFF\x83\x00\x83\x80\xB0\xFF\x83\x00\x86\xFF\x83\x80\x83" + "\x00\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF\x83\x80\x83\x00\x83" + "\x80\x83\xFF\x83\x00\x83\x80\xB3\xFF\x86\x00\x95\xFF\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x92\xFF\x83\x00\x83\x80\xB0\xFF\x83\x00\x86\xFF\x83\x80\x89\xFF" + "\x89\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83\x80\x86\xFF\x89\x00\xA1\xFF" + "\x83\x00\x83\x80\x8C\xFF\x83\x80\x89\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x92\xFF" + "\x83\x00\x83\x80\x83\xFF\x83\x00\x83\xFF\x83\x80\x83\xFF\x89\x00\x8F" + "\xFF\x86\x00\x83\xFF\x83\x00\x8F\xFF\x83\x80\x83\xC0\x86\x80\x86\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x92\xFF\x83\x00\x83\x80\x83\xFF\x83\x00\x83\x80\x83\xFF\x83\x80" + "\x83\xFF\x83\x80\x83\xFF\x83\x00\x89\xFF\x83\x00\x83\xFF\x83\x80\x83" + "\x00\x92\xFF\x86\x80\x89\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x95\xFF\x83\x00\x83\x80\x83\x00\x83" + "\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x00" + "\x86\xFF\x83\x00\x9E\xFF\xAD\x00\x83\x80\x8C\xFF\x83\x00\x83\x80\x83" + "\x00\x83\xFF\x83\x80\x83\xFF\x83\x80\x8F\xFF\x86\x00\x83\xC0\x83\x00" + "\x8F\xFF\x98\x00\x86\xC0\x83\x00\x89\xFF\x83\x00\x86\xC0\x83\x00\x86" + "\xFF\x83\x80\x8F\x00\x83\xFF\x83\x00\x83\xFF\x83\x80\x8C\xFF\x83\x80" + "\x8C\x00\x83\xC0\xA1\x00\x83\xFF\x86\x00\x86\xC0\x83\x00\x83\xFF\x89" + "\x00\x86\xC0\x83\x00\x86\xFF\x83\x00\x86\xC0\x83\x00\x89\xFF\x83\x00" + "\x86\xFF\x83\x80\x8C\x00\x86\x80\x86\x00\x83\xC0\x89\x00\x86\x80\x8C" + "\x00\x83\xFF\x86\x00\x83\xFF\x83\x00\x86\xC0\x89\x00\x83\xFF\x83\x00" + "\x86\xC0\x83\x00\x83\xFF\x86\x00\x86\xC0\x83\x00\x89\xFF\x83\x80\x83" + "\x00\x83\x80\x86\x00\x83\xC0\x83\x00\x86\x80\x89\x00\x83\xC0\x83\x00" + "\x83\x80\x83\x00\x86\x80\xBC\x00\x83\xFF\x83\x00\x83\xC0\x86\xFF\x83" + "\x80\x83\x00\x8F\x80\x83\x00\x83\xC0\x86\x00\x83\xFF\x86\x00\x83\xC0" + "\x83\x00\x86\x80\x83\x00\x83\x80\x86\x00\xAA\xC0\x98\x00\x92\x80\x86" + "\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x86\x80\x89\x00\x86\x80\x86\x00" + "\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\x83\xFF\x83\x00\x86\xFF\x01\x80\x82\x00\x83\xC0\x95\x00" + "\x8C\x80\x86\x00\x8C\xC0\x83\x00\x83\xC0\x83\x00\x86\x80\x83\x00\x83" + "\xC0\x89\x00\xAD\xFF\x01\x80\x82\x00\x83\xC0\x83\x00\x86\x80\x86\x00" + "\x86\xFF\x83\x00\x86\x80\x86\x00\x8C\xC0\x8C\x00\x83\xC0\x89\x00\x83" + "\xC0\x83\x00\x89\xFF\x83\x80\x9E\x00\x86\xFF\x01\x80\x82\x00\x83\xC0" + "\x83\x00\x83\xC0\x83\x00\x86\x80\x86\x00\x83\xFF\x83\x00\x83\x80\x83" + "\x00\x8C\xC0\x92\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xC0\x83\x00" + "\x83\xFF\x83\x80\x83\x00\x9E\xC0\x83\x80\x83\xFF\x01\x80\x82\x00\x83" + "\xC0\x86\x00\x83\x80\x83\xC0\x83\x00\x86\x80\x8C\x00\x89\xC0\x8C\x00" + "\x83\xC0\x83\xFF\x83\x80\x83\x00\x83\xC0\x89\x00\x83\xC0\x86\x00\x86" + "\xC0\x98\x00\x83\xC0\x83\x00\x83\xFF\x83\x80\x83\xC0\x83\x00\x86\xC0" + "\x83\x00\x83\x80\x83\xC0\x83\x00\x86\x80\x86\x00\x89\xC0\x8C\x00\x89" + "\xFF\x83\xC0\x86\x00\x83\xC0\x8C\x00\x83\xC0\x8C\x00\x8C\x80\x83\x00" + "\x83\xC0\x83\x00\x86\xFF\x83\x00\x83\xC0\x86\x00\x86\xC0\x83\x00\x83" + "\x80\x83\xC0\x83\x00\x86\x80\x83\x00\x86\xC0\x83\x00\x86\x80\x86\x00" + "\x83\x80\x89\xFF\x86\x00\x83\xC0\x89\x00\x83\xC0\x89\x00\x92\x80\x83" + "\x00\x83\xC0\x83\x80\x83\xFF\x83\x80\x83\xC0\x8C\x00\x83\xC0\x95\x00" + "\x83\xC0\x83\x00\x83\x80\x83\x00\x86\x80\x86\x00\x83\x80\x86\xFF\x83" + "\x80\x83\x00\x83\xC0\x89\x00\x83\xC0\x9B\x00\x83\xC0\x83\x00\x86\xFF" + "\x83\x00\x83\xC0\x8F\x00\x83\x80\x83\xC0\x83\x00\x83\x80\x83\xC0\x83" + "\x00\x83\x80\x83\x00\x86\xC0\x83\x80\x83\x00\x86\x80\x86\x00\x83\x80" + "\x83\xFF\x83\xC0\x86\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\x95\x80\x83" + "\x00\x83\xC0\x83\x80\x83\xFF\x83\x80\x83\xC0\x8C\x00\x83\xC0\x83\x00" + "\x83\x80\x83\xC0\x83\x00\x83\x80\x83\xC0\x83\x00\x83\x80\x83\x00\x83" + "\x80\x86\xC0\x83\x80\x83\x00\x86\x80\x86\x00\x83\x80\x83\xFF\x86\x00" + "\x83\xC0\x86\x00\x83\xC0\x98\x00\x83\xC0\x83\x00\x86\xFF\x83\x00\x83" + "\xC0\x86\x00\x86\x80\x83\xC0\x83\x00\x83\x80\x92\x00\x86\x80\x83\x00" + "\x83\x80\x86\xC0\x83\x80\x95\x00\x83\xC0\x89\x00\x83\xC0\x83\x00\x8F" + "\xFF\x83\x00\x83\xC0\x83\x00\x89\xC0\x95\x00\x83\x80\x86\xC0\x83\x80" + "\x83\x00\x8C\x80\x83\x00\x83\x80\x86\xC0\x83\x80\x95\x00\x83\xC0\x89" + "\x00\x83\xC0\x83\x00\x8F\xFF\x83\x00\x83\xC0\x89\x00\x83\xC0\x95\x00" + "\x83\x80\x86\xC0\x83\x80\x83\x00\x86\x80" + , //body + 1727, //lenght + 0, + 0, + 0, + }, + { + "face-kh.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\xAD\xFF" + "\x83\x00\x83\xC0\x83\x00\x89\xC0\x83\x00\x89\xC0\x83\x00\x89\xC0\x83" + "\x00\x92\xC0\x83\x00\xC8\xFF\x89\x00\x83\xC0\x89\x00\x83\xC0\x89\x00" + "\x83\xC0\x89\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\xCE\xFF\x83\x00\xA4" + "\xC0\x83\x00\x86\xC0\x86\x00\x86\xFF\x86\x00\xC8\xFF\x83\x00\x9B\x80" + "\x8F\xC0\x83\x00\x86\xFF\x83\x00\x86\xC0\x83\x00\x9B\xFF\x83\xC0\x01" + "\xFF\x82\x00\x83\xC0\x83\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x95\xFF" + "\x9E\x00\x8F\x80\x83\x00\x86\xFF\x83\x00\x86\xC0\x89\x00\x92\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x92\xFF\x83\x00\x98" + "\xFF\x9E\x00\x83\xC0\x83\x00\x86\xFF\x86\x00\x90\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x92\xFF\x83\x00" + "\x98\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x00\x86" + "\xFF\x83\x00\x83\xC0\x83\x00\x86\xFF\x83\x00\x83\xC0\x83\x00\x8D\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x8F\xFF\x86\x80\x89\x00\x83\xFF\x8C\x00\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x89\x00\x86\xC0\x8C\x00\x83\xC0\x83\x00\x8C\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8C\xFF" + "\x83\x80\x83\xC0\x83\x80\x86\x00\x83\xFF\x89\x00\x83\xFF\x83\x00\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x89\x00\x86\xC0\x86\x00" + "\x86\xFF\x83\x00\x93\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF" + "\x83\x80\x83\xC0\x83\x80\x89\xFF\x83\x00\x8C\xFF\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0\x83\x00" + "\x89\xFF\x83\x00\x95\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x92\xFF\x83\x80\x83\xC0\x83\x80\x89\xFF\x83\x00" + "\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x00\x86" + "\xC0\x95\x00\x98\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\x80" + "\x83\xC0\x83\x80\x89\xFF\x83\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x86\xC0\x83\x80\x86\xC0\x83\x00\x8C\x80\x83\x00\x9C\xFF" + "\x82\x00\x95\xFF\x83\x80\x83\xC0\x83\x80\x89\xFF\x89\x00\x8C\xFF\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x98\x00" + "\xB0\xFF\x83\x80\x83\xC0\x83\x80\x9E\xFF\x83\x80\x86\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x86\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80" + "\x83\x00\x83\x80\x83\x00\xB0\xFF\x86\x80\x83\xC0\x83\x80\x83\xFF\x89" + "\x00\x89\xFF\x86\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x00\x95\x80\x86\x00\xA4\xFF\x8C\x00\x83\x80\x86\xC0\x83\x80\x92" + "\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\xC0" + "\x86\x00\x8F\x80\x83\x00\xA4\xFF\x89\x00\x83\x80\x86\x00\x86\xC0\x83" + "\x80\x83\xC0\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x89\xC0\x83\x00\x86\xFF\x89\x00\x83\x80\x83\x00\x83" + "\xFF\x86\x80\x95\xFF\x95\x00\x83\x80\x86\x00\x83\x80\x86\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x89\x80\x89\xC0\x86\x00\x83" + "\xFF\x83\x00\x89\xFF\x89\x00\x86\x80\x83\x00\x8F\xFF\x89\x00\x83\x80" + "\x83\x00\x86\xFF\x86\x00\x86\x80\x83\x00\x83\xC0\x86\x80\x86\xC0\x83" + "\x80\x83\xC0\x83\x80\x86\xC0\x83\x80\x83\xC0\x89\x00\x8F\xFF\x86\x00" + "\x83\x80\x8F\x00\x89\xFF\x86\x00\x86\xFF\x83\x00\x83\x80\x83\x00\x89" + "\xFF\x86\x00\x86\x80\x86\x00\x86\xC0\x86\x00\x83\xC0\x86\x80\x83\xC0" + "\x83\x00\x86\xC0\x83\x00\x86\xFF\x83\x00\x86\xFF\x83\x00\x83\x80\x83" + "\x00\x83\x80\x83\x00\x83\xC0\x89\x00\x83\xFF\x89\x00\x83\xFF\x83\x00" + "\x83\xFF\x83\x00\x83\x80\x83\x00\x83\xFF\x83\x00\x86\xFF\x86\x00\x86" + "\x80\x89\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x89\xC0\x83\x00\x83\xFF" + "\x83\x00\x86\xFF\x83\x00\x83\x80\x83\xC0\x83\x00\x83\x80\x89\x00\x83" + "\xC0\x86\x00\x86\xC0\x83\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00" + "\x83\x80\x83\x00\x83\xFF\x83\x00\x86\xFF\x83\x00\x86\x80\x86\x00\x83" + "\xC0\x83\x00\x83\xC0\x86\x00\x8C\xC0\x83\x00\x8C\xFF\x83\x00\x83\x80" + "\x83\xC0\x83\x00\x83\x80\x8F\x00\x86\xC0\x89\x80\x86\x00\x86\xFF\x83" + "\x00\x83\x80\x83\x00\x8C\xFF\x86\x00\x86\x80\x86\x00\x83\xC0\x86\x00" + "\x8F\xC0\x86\x00\x89\xFF\x83\x00\x83\xC0\x83\x80\x83\x00\x83\x80\x83" + "\x00\x83\xC0\x8C\x00\x86\x80\x8F\x00\x86\xFF\x83\x00\x83\x80\x83\x00" + "\x83\xFF\x83\x00\x86\xFF\x83\x00\x89\x80\x89\x00\x92\xC0\x83\x00\x89" + "\xFF\x83\x00\x83\xC0\x83\x80\x83\x00\x83\x80\x86\x00\x83\x80\x86\xC0" + "\x86\x00\x83\x80\x8F\x00\x83\x80\x83\x00\x83\xFF\x83\x00\x86\x80\x83" + "\x00\x83\xFF\x83\x00\x83\xFF\x86\x00\x86\x80\x86\x00\x92\xC0\x83\x00" + "\x86\xFF\x83\x00\x83\xFF\x83\x00\x83\x80\x83\x00\x86\x80\x8C\x00\x86" + "\xC0\x86\x00\x83\xC0\x89\x00\x89\x80\x83\x00\x83\xFF\x83\x00\x86\x80" + "\x83\x00\x89\xFF\x83\x00\x89\x80\x83\x00\x8F\xC0\x86\x00\x83\xFF\x83" + "\x00\x86\xFF\x86\x00\x86\x80\x8C\x00\x86\x80\x89\xC0\x86\x80\x83\xC0" + "\x89\x00\x86\x80\x83\x00\x83\xFF\x83\x00\x89\x80\x83\x00\x83\xFF\x86" + "\x00\x83\x80\x83\x00\x8F\xC0\x83\x00\x83\x80\x83\x00\x89\xFF\x86\x00" + "\x86\x80\x8C\x00\x8C\x80\x83\xC0\x86\x80\x89\xC0\x83\x80\x8F\x00\x83" + "\xFF\x86\x00\x86\x80\x86\x00\x83\xFF\x86\x00\x8F\xC0\x86\x00\x86\xFF" + "\x86\x00\x86\x80\x8F\x00\x86\x80\x83\xC0\x83\x80\x83\x00\x83\xC0\x83" + "\x80\x89\xC0\x83\x00\x83\x80\x86\xC0\x8C\x00\x86\xFF\xB0\x00\x86\x80" + "\x92\x00\x8F\x80\x8F\xC0\x83\x00\x83\x80\x89\x00\x83\xC0\x8F\x00\x8F" + "\xFF\xA1\x80\x95\x00\x86\x80\x83\xC0\x83\x80\x83\x00\x86\xC0\x83\x00" + "\x89\xC0\x83\x00\x83\x80\x8C\xC0\x83\x00\x83\xC0\x83\x00\x8C\xFF\x83" + "\x80\xA7\x00\x83\xFF\x8F\x00\x8F\x80\x89\xC0\x83\x00\x89\xC0\x83\x00" + "\x83\x80\x89\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x9B\xFF\x83\x00\x8C" + "\x80\x83\x00\x8C\xFF\x8C\x00\x86\x80\x83\xC0\x83\x80\x83\x00\x89\xC0" + "\x86\x00\x89\xC0\x83\x00\x83\x80\x8C\xC0\x83\x00\x83\xC0\x83\x00\x95" + "\xFF\x89\x00\x83\xFF\x89\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x8C\x00" + "\x83\x80\x83\xC0\x89\x80\x89\xC0\x8C\x00\x89\xC0\x83\x00\x83\x80\x86" + "\xC0\xA1\x00\x83\xFF\x8F\x00\x83\x80\x86\x00\x83\xFF\x95\x00\x83\x80" + "\x83\x00\x89\xC0\x89\x00\x83\x80\x86\x00\x8C\xC0\x9B\x00\x89\xFF\x86" + "\x00\x8F\xC0\x86\x00\x86\xFF\x8C\x00\x86\x80\x83\x00\x8C\xC0\x89\x00" + "\x83\x80\x83\x00\x83\x80\x86\x00\x83\xC0\x8F\x00\x8F\xC0\x83\x00\x89" + "\xFF\x86\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x83\xC0\x83\x00\x86\xFF" + "\x83\x00\x83\xFF\x83\x00\x98\xC0\x8C\x00\x8C\x80\x8F\x00\x83\x80\x92" + "\xC0\x83\x00\x8C\xFF\x83\x00\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x00\x8C\xFF\x83\x00\x92\xC0\x83\x80\x8F\x00\x86\x80" + , //body + 1595, //lenght + 0, + 0, + 0, + }, + { + "face-ks.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\xAD\xFF" + "\x83\x00\xBC\xC0\x83\x00\xC8\xFF\x83\x00\x95\xC0\x83\x00\x83\xC0\x83" + "\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x86\x00" + "\xCE\xFF\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83" + "\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80" + "\x83\x00\xD1\xFF\x83\x80\x83\x00\x83\x80\x83\x00\x83\x80\x83\x00\x9E" + "\x80\x83\x00\x9E\xFF\x83\x00\x98\xFF\x83\x00\x9B\xFF\x83\x00\x8F\x80" + "\x9E\x00\x9B\xFF\x83\x00\x83\x80\x95\xFF\x83\x80\x83\x00\x83\x80\x98" + "\xFF\x92\x00\x83\x80\x98\xFF\x86\x80\x95\xFF\x83\x00\x83\xC0\x83\x80" + "\x92\xFF\x83\x80\x89\x00\x83\x80\x95\xFF\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x80\x83\xC0\x83\x80\x92\xFF" + "\x83\x00\x83\xC0\x83\x80\x8F\xFF\x83\x80\x8F\x00\x83\x80\x92\xFF\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x86\x00" + "\x83\x80\x83\xFF\x86\x00\x86\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83" + "\xC0\x83\x80\x8C\xFF\x83\xC0\x95\x00\x83\xC0\x8F\xFF\x83\x80\x83\xC0" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x86\x80\x83\xFF\x83\x80\x83\x00\x83" + "\xC0\x83\xFF\x83\x80\x83\x00\x86\x80\x95\xFF\x83\x00\x83\xC0\x83\x80" + "\x8C\xFF\x83\x80\x95\x00\x83\x80\x8F\xFF\x83\x80\x83\xC0\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x8C\xFF\x83\x00\x89\xFF\x83\x80\x83\xC0" + "\x83\x80\x92\xFF\x83\x00\x83\xC0\x83\x80\x8C\xFF\x83\x80\x95\x00\x83" + "\x80\x8F\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80" + "\x8C\xFF\x83\x00\x89\xFF\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83" + "\xC0\x83\x80\x8F\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00" + "\x83\x80\x92\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x8C\xFF\x83\x00\x89\xFF\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00" + "\x83\xC0\x83\x80\x95\xFF\x83\x80\x83\x00\x83\x80\x98\xFF\x83\x80\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x89\xFF\x83\xC0\x83\x00" + "\x83\x80\x86\xFF\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83\xC0\x83" + "\x80\x92\xFF\x83\xC0\x89\x00\x83\xC0\x95\xFF\x83\x80\x83\xC0\x83\x80" + "\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xFF\x83\xC0\x83\x80\x89\xFF\x83" + "\x80\x83\xFF\x83\x80\x83\xC0\x83\x80\x92\xFF\x83\x00\x83\xC0\x83\x80" + "\xB0\xFF\x89\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83" + "\xFF\x83\xC0\x83\xFF\x89\x00\x86\xFF\x86\x80\x83\xFF\x86\x80\x8C\xFF" + "\x83\x00\x83\xC0\x83\x80\xAD\xFF\x83\x80\x86\xC0\x83\x80\x83\xC0\x83" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x98\xFF\x83\x80\x83\xC0\x83\x80" + "\x86\xC0\x83\x80\x89\xFF\x83\x00\x83\xC0\x83\x80\xAA\xFF\x83\x00\x83" + "\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0" + "\x83\x80\x86\xFF\x83\x80\x89\xFF\x83\x80\x83\xC0\x83\x80\x83\xC0\x83" + "\x80\x86\xC0\x83\x80\x89\xFF\x83\x00\x83\xC0\x83\x80\xA4\xFF\x83\x80" + "\x86\x00\x83\xC0\x86\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x86" + "\x80\x83\xC0\x83\x80\x83\xC0\x83\x80\x83\xFF\x83\x80\x83\xC0\x83\x80" + "\x86\xC0\x86\x00\x83\xC0\x83\x00\x83\x80\x83\xFF\x83\x00\x83\xC0\x83" + "\x80\x9E\xFF\x83\x80\x86\x00\x83\xC0\x86\x00\x89\xC0\x83\x80\x86\xC0" + "\x83\x80\x83\xC0\x83\x80\x86\xC0\x83\x80\x83\xC0\x89\x80\x86\xC0\x89" + "\x00\x83\xC0\x86\x00\x83\xFF\x86\x00\x83\xC0\x83\x80\x98\xFF\x83\x80" + "\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x83\x80\x8C\x00\x83\xC0\x86" + "\x80\x83\xC0\x83\x80\x86\xC0\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x00" + "\x83\xC0\x83\x00\x83\x80\x86\x00\x83\xC0\x86\x00\x83\xFF\x83\x00\x83" + "\x80\x83\x00\x83\xC0\x83\x80\x92\xFF\x83\x80\x89\x00\x83\xC0\x83\x80" + "\x83\x00\x83\x80\x83\xC0\x86\x00\x83\xC0\x98\x00\x83\xC0\x83\x80\x83" + "\xC0\x83\x00\x83\x80\x83\xC0\x89\x00\x83\xC0\x86\x00\x83\xFF\x8C\x00" + "\x83\xC0\x83\x80\x8C\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x83" + "\x00\x83\x80\x83\xC0\x86\x00\x83\xC0\x86\x80\x86\x00\x83\xC0\x83\x00" + "\x83\xC0\x83\x00\x83\xC0\x92\x00\x83\xC0\x86\x80\x83\x00\x83\xC0\x86" + "\x00\x83\xFF\x83\x00\x89\x80\x83\x00\x83\xC0\x83\x80\x86\xFF\x83\x80" + "\x83\x00\x86\x80\x8F\x00\x83\xC0\x83\x00\x86\x80\x83\xC0\x83\x00\x86" + "\x80\x92\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x86\x00" + "\x83\x80\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\x80\x89\x00\x83\xC0\x83" + "\x80\x83\xFF\x83\x00\x83\x80\x86\xC0\x86\x00\x83\xC0\x89\x00\x83\xC0" + "\x83\x80\x86\x00\x83\xC0\x83\x00\x89\x80\x8C\xC0\x8F\x00\x83\xC0\x86" + "\x80\x83\x00\x83\xC0\x83\x80\x83\x00\x83\xFF\x83\x00\x8C\x80\x83\x00" + "\x83\xC0\x83\x80\x83\x00\x83\xC0\x86\x80\x8F\x00\x83\xC0\x83\x00\x83" + "\x80\x83\xC0\x86\x00\x83\xC0\x8C\x80\x83\xC0\x89\x00\x86\xC0\x86\x80" + "\x83\x00\x83\xC0\x86\x00\x83\x80\x83\xC0\x86\x00\x83\xFF\x83\x00\x83" + "\x80\x8C\x00\x83\xC0\x86\x80\x86\xC0\x83\x80\x86\x00\x83\xC0\x83\x00" + "\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x86\x80\x83\xC0\x83" + "\x00\x86\x80\x92\xC0\x89\x80\x83\xC0\x86\x00\x83\xC0\x83\x80\x83\x00" + "\x83\xFF\x83\x00\x8F\x80\x83\x00\x83\xC0\x89\x80\x83\xC0\x8F\x00\x83" + "\xC0\x89\x00\x83\xC0\x83\x80\x86\x00\x83\xC0\xA1\x00\x83\xC0\x86\x80" + "\x83\x00\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\x80\x95\x00\x83\xC0\x86" + "\x80\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x89\xC0\x83\x80\x83\xC0" + "\x86\x00\x83\xC0\x86\x00\x89\xFF\x83\x00\x89\xFF\x86\x00\x83\xC0\x86" + "\x00\x83\x80\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\x80\x83\x00\x8C\xC0" + "\x86\x00\x86\xC0\x83\x80\x8C\x00\x83\xC0\x83\x00\x83\xC0\x89\x00\x83" + "\xC0\x86\x00\x83\xC0\x83\x80\x86\xFF\x83\x00\x89\xFF\x83\x00\x86\xFF" + "\x83\x00\x83\xC0\x86\x00\x83\xC0\x83\x80\x83\x00\x83\xFF\x83\x00\x83" + "\x80\x83\x00\x83\xC0\x89\x00\x89\xC0\x83\x80\x86\xC0\x86\x00\x83\xC0" + "\x83\x00\x83\xC0\x83\x00\x8F\xC0\x83\x00\x86\x80\x83\xC0\x83\x00\x83" + "\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x86\xFF\x83\x80\x83\xC0" + "\x86\x00\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\x80\x83\x00\x86\xC0\x83" + "\x00\x83\xFF\x83\x00\x86\xC0\x86\x80\x83\xC0\x8C\x00\x83\xC0\x83\x00" + "\x83\xC0\x89\x00\x83\xC0\x83\x80\x86\x00\x83\xC0\x83\x00\x89\xFF\x83" + "\x00\x89\xFF\x83\x00\x83\xC0\x89\x80\x83\xC0\x8C\x00\x86\x80\x8C\x00" + "\x83\xFF\x86\x00\x83\xC0\x86\x80\x86\x00\x83\xC0\x83\x00\x83\xC0\x83" + "\x00\x8C\xC0\x83\x80\x83\xC0\x86\x00\x83\xC0\x83\x00\x83\xFF\x83\x00" + "\x89\xFF\x83\x00\x83\xFF\x83\x00\x83\xC0\x83\x80\x83\x00\x83\x80\x83" + "\xC0\x83\x00\x83\xC0\x89\x00\x98\x80\x86\xC0\x83\x80\x8C\x00\x83\xC0" + "\x83\x00\x83\xC0\x8C\x00\x83\xC0\x86\x00\x83\xC0\x9B\x00\x83\xC0\x86" + "\x00\x83\xC0\x83\x80\x89\x00\x83\xC0\x92\x00\x89\xFF\x83\x80\x86\xC0" + "\x86\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\x8F\xC0\x86\x00\x83\xC0\x83" + "\x00\x9B\xC0\x83\x00\x83\x80\x83\xC0\x98\x00\x89\xFF\x8F\x80\x83\xC0" + "\x8F\x00\x83\xC0\x83\x00\x83\xC0\x89\x00\x83\xC0\x83\x80\x83\x00\x83" + "\xC0\x83\x80\x98\x00\x83\xC0\x83\x00\x83\x80\x89\xC0\x8C\x00\x83\xC0" + "\x86\x00\x83\xFF\x83\x80\x89\xFF\x92\x00\x83\xC0\x86\x00\x8F\xC0\x83" + "\x00\x83\xC0\x83\x80\x83\xC0\x83\x80\x86\x00\x83\x80\x83\xC0\x83\x80" + "\x86\x00\x83\x80\x86\xC0\x83\x00\x83\xC0\x86\x00\x86\xC0\x8F\x00\x89" + "\xFF\x86\x80\x8F\xFF\x8C\x00\x83\xC0\x8F\x00\x83\xC0\x83\x00\x83\xC0" + "\x83\x80\x86\x00\x83\xC0\x83\xFF\x83\xC0\x86\x00\x83\x80\x83\xC0\x83" + "\x00\x83\xC0\x8F\x00\x83\xC0\x8C\x00\x8F\xFF" + , //body + 1677, //lenght + 0, + 0, + 0, + }, + { + "face-qc.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x9E\xC0" + "\x83\x80\x86\x00\x83\x80\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x86" + "\x00\x83\xFF\x83\x00\xC2\xFF\x83\x80\x9B\xC0\x83\x80\x86\x00\x83\x80" + "\x83\xFF\x86\x00\x83\xFF\x83\x00\x83\xFF\x89\x00\xC5\xFF\x83\x80\x8F" + "\xC0\x86\x00\x83\xC0\x83\x80\x86\x00\x83\x80\x83\xFF\x83\x00\x86\xFF" + "\x86\x00\x83\xFF\x86\x00\x9E\xFF\x83\xC0\x83\x80\x83\x00\x83\x80\x83" + "\xC0\x9B\xFF\x83\x80\x8C\xC0\x83\x00\x83\xC0\x86\x80\x86\x00\x83\x80" + "\x83\xFF\x83\x00\x83\xFF\x83\x00\x86\xFF\x83\x00\x83\xFF\x83\x00\x9E" + "\xFF\x83\x80\x89\x00\x83\x80\x9B\xFF\x83\x80\x8F\xC0\x86\x80\x86\x00" + "\x86\x80\x83\xFF\x86\x00\x8C\xFF\x89\x00\x9B\xFF\x8F\x00\x9E\xFF\x83" + "\x80\x8C\xC0\x86\x80\x86\x00\x83\x80\x86\xFF\x83\x00\x92\xFF\x86\x00" + "\x9B\xFF\x8F\x00\x9E\xFF\x83\x80\x83\xC0\x86\x00\x83\xC0\x83\x80\x89" + "\x00\x83\x80\x86\xFF\x86\x00\x83\x80\x83\xFF\x86\x00\x83\x80\x83\x00" + "\x83\x80\x83\x00\x8F\xFF\x83\xC0\x83\x80\x83\x00\x83\xC0\x89\x00\x83" + "\xC0\x83\x00\x83\x80\x83\xC0\x95\xFF\x83\x80\x83\xC0\x83\x00\x83\xC0" + "\x86\x80\x86\x00\x86\x80\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\x00\x86" + "\xFF\x83\x80\x86\x00\x83\x80\x83\x00\x8F\xFF\x83\x80\x9B\x00\x83\x80" + "\x92\xFF\x83\x80\x89\xC0\x86\x80\x89\x00\x83\x80\x86\xFF\x83\x80\x89" + "\xFF\x83\x80\x89\xFF\x86\x00\x83\x80\x83\x00\x8C\xFF\xA1\x00\x92\xFF" + "\x83\x80\x89\xC0\x86\x80\x86\x00\x86\x80\x83\xFF\x83\x80\x8C\xFF\x83" + "\x00\x89\xFF\x86\x00\x83\x80\x83\x00\x8C\xFF\x83\x80\x9B\x00\x83\x80" + "\x8F\xFF\x83\x80\x83\xC0\x86\x00\x86\x80\x86\x00\x86\x80\x86\xFF\x83" + "\x80\x8C\xFF\x83\x00\x89\xFF\x89\x00\x83\x80\x83\x00\x89\xFF\x83\xC0" + "\x83\x80\x83\x00\x83\x80\x83\xC0\x83\x00\x83\xC0\x83\x80\x83\x00\x83" + "\x80\x83\xC0\x8C\xFF\x83\x80\x86\xC0\x83\x00\x86\x80\x89\x00\x83\x80" + "\x86\xFF\x83\x80\x8C\xFF\x83\x80\x83\x00\x83\xC0\x86\xFF\x83\x00\x83" + "\x80\x83\x00\x86\x80\x83\x00\x92\xFF\x83\x80\x83\x00\x83\x80\x9B\xFF" + "\x86\x00\x86\x80\x89\x00\x86\x80\x86\xFF\x83\x80\x9B\xFF\x83\x00\x86" + "\x80\x83\x00\x86\x80\x83\x00\x8C\xFF\x83\xC0\x89\x00\x83\xC0\x9E\xFF" + "\x8C\x00\x86\x80\x86\xFF\x86\x80\x83\xC0\x89\xFF\x89\x00\x83\xFF\x83" + "\xC0\x86\x00\x83\x80\x86\x00\x86\x80\x83\x00\xB9\xFF\x89\x00\x83\x80" + "\x89\xFF\x83\x80\x83\x00\x83\x80\x83\xC0\x89\xFF\x83\xC0\x86\xFF\x83" + "\xC0\x89\x00\x83\x80\x86\x00\x86\x80\x83\x00\xB3\xFF\x89\x00\x86\x80" + "\x86\xFF\x86\x00\x83\xC0\x86\x00\x83\xC0\x8C\xFF\x86\xC0\x8C\x00\x83" + "\x80\x86\x00\x86\x80\x83\x00\xAD\xFF\x89\x00\x86\x80\x83\xFF\x86\x00" + "\x83\x80\x83\xC0\x83\x80\x83\xC0\x83\x00\x92\xC0\x83\x00\x83\x80\x86" + "\xC0\x83\x80\x83\x00\x86\x80\x86\x00\x83\x80\x83\x00\xA7\xFF\x89\x00" + "\x86\x80\x83\xFF\x83\x00\x86\xFF\x83\x00\x83\x80\x83\xC0\x86\x80\x83" + "\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x86\x80\x86\xC0\x83\x80\x83\x00" + "\x83\xFF\x83\x00\x86\x80\x86\x00\x83\x80\x83\x00\x89\xFF\x86\x00\x92" + "\xFF\x89\x00\x83\x80\x98\x00\x83\x80\x86\xC0\x8F\x80\x89\xC0\x83\x80" + "\x8F\x00\x86\x80\x83\x00\x83\x80\x83\x00\x86\xFF\x83\x00\x86\x80\x86" + "\x00\x8C\xFF\x86\x00\x83\x80\x89\xC0\x8F\x00\x83\xFF\x86\x00\x83\x80" + "\x92\xC0\x86\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xC0\x83" + "\x00\x83\x80\x83\x00\x83\x80\x83\x00\x83\xFF\x83\x00\x83\x80\x86\x00" + "\x86\x80\x83\x00\x89\xFF\x83\x00\x86\xC0\x83\x00\x89\xC0\x83\x00\x86" + "\xFF\x83\x00\x86\xFF\x89\x00\x83\x80\x89\x00\x83\x80\x86\x00\x86\xFF" + "\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x83\xFF\x83" + "\x00\x8F\x80\x83\x00\x8C\xFF\x8C\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0" + "\x83\x00\x83\xFF\x83\x00\x83\xFF\x89\x00\x83\xFF\x83\x00\x89\x80\x83" + "\x00\x83\xFF\x8C\x00\x89\xC0\x89\x00\x89\xFF\x89\x00\x83\x80\x83\x00" + "\x83\xFF\x89\x80\x83\xFF\x8F\x80\x83\x00\x89\xC0\x8C\x00\x83\xFF\x83" + "\x00\x83\xFF\x83\x00\x83\x80\x83\xC0\x83\x80\x83\x00\x83\xFF\x83\x00" + "\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xC0\x89\x00\x83\xC0\x83\x00\x8F" + "\xFF\x83\x00\x83\xFF\x83\x80\x8C\xC0\x92\x80\x83\x00\x86\xC0\x83\x00" + "\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\x80\x83\xC0\x83" + "\x80\x83\x00\x83\xFF\x86\x00\x89\xC0\x83\x00\x83\x80\x86\x00\x83\xC0" + "\x86\x00\x83\xFF\x89\x80\x83\xFF\x83\x00\x8C\xC0\x83\xFF\x95\x80\x86" + "\x00\x8C\xC0\x8F\x00\x83\x80\x8C\x00\x83\xC0\x83\x00\x83\xC0\x83\x00" + "\x86\x80\x86\x00\x83\xC0\x86\x00\x83\x80\x89\xC0\x86\x00\x89\xC0\x86" + "\xFF\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x89\x80\x86\x00" + "\x83\xC0\x83\x00\x8C\xC0\x89\x00\x8C\xC0\x89\x00\x83\xC0\x83\x80\x86" + "\x00\x83\xC0\x86\x00\x89\xC0\x83\x00\x83\xFF\x83\x00\x89\xFF\x83\x00" + "\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83" + "\xC0\x83\x00\x86\x80\x89\x00\x98\xC0\x8F\x00\x83\xC0\x86\x80\x86\x00" + "\x83\xC0\x8F\x00\x86\xFF\x89\x80\x83\x00\x83\xFF\x83\xC0\x83\x00\x83" + "\xC0\x98\x00\x86\x80\x83\xC0\x9E\x00\x83\xC0\x86\x00\x83\xC0\x86\x80" + "\x89\x00\x86\x80\x83\x00\x83\x80\x86\x00\x83\xFF\x83\x80\x86\xFF\x83" + "\x00\x83\xFF\x83\x00\x83\xC0\x86\x00\x95\xC0\x86\x00\x86\x80\x83\xC0" + "\x8C\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x83\xC0\x8C\x80\x83\x00\x83" + "\x80\x86\xFF\x83\x80\x89\x00\x8C\x80\x83\x00\x83\xFF\x83\xC0\x83\x00" + "\x89\xC0\x8F\x00\x89\xC0\x83\x00\x86\x80\x8F\x00\x83\xC0\x83\x00\x83" + "\xC0\x86\x00\x83\xC0\x89\x80\x83\x00\x83\xC0\x83\x00\x83\x80\x83\xFF" + "\x86\x80\x83\x00\x83\x80\x83\x00\x89\xFF\x83\x00\x83\xFF\x83\x00\x86" + "\xC0\x89\x00\x83\xC0\x83\x00\x83\xC0\x89\x00\x86\xC0\x83\x00\x83\x80" + "\x83\xC0\x8F\x00\x83\xC0\x89\x00\x83\xC0\x86\x80\x83\x00\x86\xC0\x86" + "\x00\x8C\x80\x8F\x00\x86\xFF\x83\x80\x89\x00\x83\xC0\x83\x00\x83\xC0" + "\x83\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x86\xC0\x83\x00\x83\x80\x8C" + "\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x83\xC0\x86\x80\x83\x00\x83\xC0" + "\x83\x00\x86\xC0\x83\x00\x83\x80\x86\xFF\x83\x80\x83\x00\x83\x80\x83" + "\x00\x89\xFF\x86\x80\x86\x00\x83\xC0\x92\x00\x86\xC0\x83\x00\x83\xC0" + "\x83\x00\x83\x80\x83\xC0\x86\x00\x83\xC0\x89\x00\x83\xC0\x83\x00\x83" + "\xC0\x83\x80\x83\x00\x86\xC0\x8F\x00\x83\x80\x83\xFF\x86\x80\x89\x00" + "\x86\xFF\x83\x80\x83\xFF\x83\x80\x86\x00\x8F\x80\x8C\x00\x86\xC0\x83" + "\x00\x83\x80\x83\x00\x83\xC0\x92\x00\x83\xC0\x83\x80\x83\x00\x83\xC0" + "\x83\x00\x86\xC0\x83\x00\x86\x80\x83\x00\x8C\x80\x83\x00\x83\x80\x83" + "\x00\x83\xFF\x83\x80\x86\xFF\x83\x80\x83\x00\x83\x80\x89\xFF\x86\x80" + "\x83\x00\x86\xC0\x83\x00\x83\xC0\x92\x00\x86\xC0\x8F\x00\x83\xC0\x8C" + "\x00\x83\x80\x86\xFF\x83\x00\x83\x80\x86\xFF\x83\x80\x8C\x00\x8C\x80" + "\x83\x00\x83\xFF\x86\x00\x83\xFF\x83\x80\x8C\x00\x83\xC0\x83\x00\x89" + "\x80\x83\x00\x8C\x80\x83\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0" + "\x83\x00\x83\x80\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\x80\x83\xFF\x86" + "\x80\x83\x00\x86\x80\x83\x00\x89\xFF\x83\x00\x86\xFF\x83\x00\x83\xFF" + "\x83\x80\x83\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0\x83\x00\x8F" + "\x80\x83\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0\x83\x00\x83\x80" + "\x83\xFF\x83\x00\x86\xFF\x83\x00\x89\xFF\x83\x00\x83\x80" + , //body + 1629, //lenght + 0, + 0, + 0, + }, + { + "face-qd.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x83\xFF" + "\x83\x80\x9B\xC0\x83\x00\x86\x80\x83\x00\x86\xFF\x83\x00\x83\xFF\x83" + "\x00\x83\xFF\x86\x00\x83\xC0\x83\x00\xC2\xFF\x83\x80\x8F\xC0\x86\x00" + "\x83\xC0\x83\x00\x86\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\x83\xFF\x83\x00\x86\xC0\x83\x00\xBF\xFF\x83\x80\x98\xC0" + "\x83\x00\x86\x80\x83\x00\x89\xFF\x86\x00\x83\xFF\x89\x00\x83\xC0\x83" + "\x00\xC2\xFF\x83\x80\x8C\xC0\x86\x00\x83\xC0\x83\x00\x86\x80\x83\x00" + "\x86\xFF\x83\x00\x86\xFF\x83\x00\x83\xFF\x89\x00\x83\xC0\x83\x00\xBF" + "\xFF\x83\x80\x92\xC0\x86\x00\x83\x80\x83\x00\x83\xFF\x86\x00\x8C\xFF" + "\x8F\x00\x83\xC0\x83\x00\x9C\xFF\x82\x00\x9E\xFF\x83\x80\x89\xC0\x86" + "\x00\x83\xC0\x83\x00\x86\x80\x86\x00\x95\xFF\x83\x00\x83\x80\x86\x00" + "\x83\xC0\x83\x00\x98\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x9B\xFF\x83" + "\x80\x8F\xC0\x86\x00\x83\x80\x83\x00\x86\xFF\x89\x00\x83\xFF\x8C\x00" + "\x83\x80\x89\x00\x83\xC0\x83\x00\x92\xFF\x83\xC0\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x98\xFF\x83\x80\x86\xC0\x86\x00" + "\x83\xC0\x83\x00\x86\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x86\x80\x83" + "\x00\x83\xFF\x86\x80\x83\x00\x86\x80\x86\x00\x83\xC0\x83\x00\x8F\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\x80\x8C\xC0\x86\x00\x83\x80" + "\x86\x00\x8F\xFF\x83\x00\x89\xFF\x83\x00\x86\x80\x89\x00\x83\xC0\x83" + "\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x8F\xFF\x83\x80\x86\xC0\x86\x00\x83\xC0\x83\x00\x86\x80" + "\x83\x00\x83\xFF\x83\xC0\x8C\xFF\x83\x00\x89\xFF\x83\x00\x89\x80\x86" + "\x00\x83\xC0\x83\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x92\xFF\x83" + "\x80\x8C\xC0\x86\x00\x83\x80\x83\x00\x83\xFF\x83\xC0\x83\xFF\x83\xC0" + "\x89\xFF\x83\x00\x89\xFF\x83\x00\x89\x80\x86\x00\x83\xC0\x83\x00\x8F" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x92\xFF\x83\x80\x86\xC0\x83\x00\x83\xC0\x86\x00\x86\x80\x83\x00\x83" + "\xFF\x83\x80\x83\xC0\x89\xFF\x83\x80\x83\x00\x83\x80\x86\xFF\x83\x00" + "\x89\x80\x86\x00\x83\xC0\x83\x00\x92\xFF\x83\xC0\x01\xFF\x82\x00\x83" + "\xC0\x98\xFF\x83\x80\x86\xC0\x86\x00\x86\x80\x83\x00\x86\xFF\x83\x80" + "\x9B\xFF\x83\x00\x8C\x80\x86\x00\x83\xC0\x83\x00\x93\xFF\x82\x00\x9E" + "\xFF\x83\x80\x86\x00\x86\x80\x83\x00\x86\xFF\x86\x80\x83\xC0\x86\xFF" + "\x83\xC0\x89\x00\x83\xFF\x83\x00\x83\xC0\x83\x00\x89\x80\x86\x00\x83" + "\xC0\x83\x00\xB6\xFF\x83\x00\x86\x80\x83\x00\x89\xFF\x83\x80\x83\x00" + "\x83\x80\x83\xC0\x89\xFF\x83\x80\x86\xFF\x83\x00\x83\xC0\x86\x00\x86" + "\x80\x86\x00\x83\xC0\x83\x00\xB3\xFF\x83\x00\x86\x80\x83\x00\x89\xFF" + "\x83\x80\x86\xC0\x86\x00\x83\xC0\x8C\xFF\x83\x00\x86\xC0\x83\x00\x83" + "\xFF\x83\x00\x83\x80\x86\x00\x83\xC0\x83\x00\xB0\xFF\x83\x00\x86\x80" + "\x8F\x00\x83\xFF\x83\x00\x89\xC0\x92\x00\x86\xC0\x83\x00\x83\xFF\x8C" + "\x00\x83\xC0\x83\x00\xAD\xFF\x83\x00\x86\x80\x86\x00\x83\xFF\x8C\x00" + "\x83\xFF\x8C\x00\x8C\xC0\x89\x00\x83\xFF\x8F\x00\x83\xC0\x83\x00\x92" + "\xFF\x86\x00\x83\x80\x8F\xFF\x83\x00\x86\x80\x86\x00\x83\xFF\x83\x00" + "\x83\xFF\x8C\x00\x8C\xFF\x8C\x00\x89\xFF\x89\x00\x83\xFF\x86\x00\x83" + "\xC0\x83\x00\x8C\xFF\x83\x80\x83\x00\x86\xC0\x86\x00\x8C\xFF\x86\x80" + "\x83\x00\x83\xFF\x86\x00\x83\xFF\x98\x00\x92\xFF\x89\x00\x83\xFF\x89" + "\x00\x83\xC0\x86\x00\x8C\xFF\x83\x00\x83\xC0\x86\x00\x86\xC0\x83\x80" + "\x83\xFF\x83\x80\x83\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xFF\x8C" + "\x00\x83\xFF\x86\x00\x83\xFF\x9E\x00\x83\xFF\x83\x00\x83\xFF\x89\x00" + "\x83\xC0\x83\x00\x89\xFF\x83\x80\x8F\xC0\x83\x00\x86\xFF\x83\x80\x83" + "\xC0\x89\x00\x83\xC0\x83\x00\x83\xFF\x8F\x00\x83\xFF\x83\x00\x83\xFF" + "\x8C\x00\x83\xFF\x8F\x00\x83\xFF\x89\x00\x83\xFF\x83\x00\x83\xC0\x83" + "\x00\x89\xFF\x83\x80\x86\x00\x83\xC0\x83\x00\x86\xFF\x83\x80\x86\xC0" + "\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xFF\x8C\x00\x83\xFF\x83" + "\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00" + "\x83\xFF\x8F\x00\x83\xFF\x83\x00\x86\xC0\x86\x00\x8F\xFF\x83\x80\x83" + "\x00\x83\xFF\x83\x80\x89\xC0\x83\x00\x83\xC0\x89\x00\x83\xC0\x83\x00" + "\x86\xFF\x89\x00\x83\xFF\x8C\x00\x83\xFF\x83\x00\x83\xFF\x92\x00\x83" + "\xFF\x83\x00\x86\xC0\x8C\x00\x8F\xFF\x83\x80\x83\x00\x89\xC0\x83\xFF" + "\x83\xC0\x86\x00\x83\x80\x86\x00\x83\xC0\x86\x00\x83\xFF\x98\x00\x83" + "\xFF\x8F\x00\x86\xFF\x83\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x83\xFF" + "\x86\x00\x89\xFF\x8F\x00\x86\xFF\x86\x00\x83\x80\x86\x00\x83\xC0\x83" + "\x00\x86\xC0\x89\x00\x83\xC0\x9B\x00\x86\xFF\x86\x00\x83\xC0\x86\x00" + "\x83\xC0\x83\x00\x83\xFF\x8C\x00\x83\xFF\x83\x00\x89\xFF\x83\x80\x86" + "\x00\x83\xFF\x83\x00\x83\x80\x86\x00\x83\xC0\x83\x00\x83\x80\x86\x00" + "\x86\xC0\x8C\x00\x95\xFF\x86\x00\x86\xC0\x89\x00\x83\xC0\x83\x00\x83" + "\xFF\x8F\x00\x86\xFF\x89\x80\x83\xFF\x83\x00\x83\xFF\x83\x80\x86\x00" + "\x83\xC0\x89\x00\x83\x80\x83\xFF\x86\x00\x89\xC0\x98\x00\x86\xC0\x89" + "\x00\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xFF\x8C\x00\x83\xC0\x83\x00" + "\x86\xFF\x83\x80\x83\xFF\x83\x80\x83\x00\x83\xFF\x86\x00\x83\xC0\x86" + "\x00\x83\x80\x86\x00\x83\x80\x83\xFF\x8C\x00\x98\xC0\x86\x00\x83\xC0" + "\x86\x00\x83\x80\x83\x00\x83\xC0\x86\x00\x83\xFF\x86\x00\x86\xC0\x86" + "\x00\x86\xFF\x83\x80\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xC0\x86\x00" + "\x83\xC0\x83\x00\x83\x80\x86\x00\x83\x80\x83\xFF\x83\x80\x83\x00\x83" + "\xC0\x98\x00\x89\xC0\x86\x00\x83\x80\x83\xFF\x83\x00\x83\xC0\x89\x00" + "\x86\xC0\x8C\x00\x83\xFF\x83\x80\x83\xFF\x83\x00\x83\xFF\x83\xC0\x89" + "\x00\x83\xC0\x86\x00\x83\x80\x83\x00\x83\xFF\x83\x80\x83\xFF\x86\x00" + "\x83\xC0\x8F\x00\x86\xC0\x86\x00\x83\xC0\x86\x00\x83\x80\x83\xFF\x83" + "\x00\x86\xC0\x83\x00\x86\xC0\x92\x00\x83\xFF\x83\x00\x89\xFF\x83\x00" + "\x83\xFF\x86\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x83\x80\x83\xFF\x83" + "\x80\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x80\x86\x00\x8F\xC0" + "\x86\x00\x83\x80\x83\xFF\x83\x80\x83\x00\x89\xC0\x86\x00\x83\xFF\x83" + "\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x89\xFF\x8F\x00\x83\xC0\x83\x00" + "\x83\x80\x83\x00\x83\xFF\x83\x80\x83\xFF\x86\x00\x83\xC0\x83\x00\x83" + "\xFF\x83\x80\x86\x00\x83\xC0\x89\x00\x83\xC0\x86\x00\x83\x80\x86\x00" + "\x83\x80\x83\x00\x83\xC0\x9E\x00\x89\xFF\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x83\x00\x83\xC0\x86\x00\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x00" + "\x83\xC0\x83\x00\x83\xFF\x83\x80\x86\x00\x8F\xC0\x89\x00\x86\x80\x83" + "\x00\x83\xC0\x86\x00\x83\xC0\x89\x00\x83\xFF\x83\x00\x83\xFF\x89\x00" + "\x83\xFF\x92\x00\x83\xC0\x83\x00\x83\x80\x83\xFF\x83\x80\x83\xFF\x86" + "\x00\x83\xC0\x9E\x00\x89\x80\x83\xC0\x83\x80\x83\x00\x83\xC0\x83\x00" + "\x83\x80\x83\x00\x83\xC0\x9B\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83" + "\xFF\x86\x00\x83\xC0\x83\x00\x83\x80\x83\xFF\x83\x80\x83\xFF\x83\x00" + "\x83\xC0\x83\x00\x9B\x80\x89\xC0\x83\x80\x83\x00\x83\xC0\x86\x00\x83" + "\x80\x83\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00" + "\x83\xFF\x9B\x00\x83\xC0\x83\x00\x83\xFF\x83\x80\x83\xFF\x86\x00\x83" + "\xC0\x83\x00\x83\x80\x89\xC0\x8F\x80\x89\xC0\x83\x80\x83\x00\x83\xC0" + "\x86\x00\x83\xFF\x83\x80\x83\x00\x83\xC0\x98\x00" + , //body + 1695, //lenght + 0, + 0, + 0, + }, + { + "face-qh.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\xA1\xFF" + "\x86\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x86\xFF\x89\x00\x83\x80\x8F" + "\xC0\x83\x00\xCE\xFF\x86\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF" + "\x83\x00\x83\xFF\x89\x00\x83\x80\x83\xC0\x83\x00\x86\xC0\x83\x00\xCE" + "\xFF\x83\x80\x89\x00\x83\xFF\x86\x00\x89\xFF\x89\x00\x83\x80\x8C\xC0" + "\x83\x00\xCE\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x86\xFF\x83" + "\x00\x89\xFF\x86\x00\x83\x80\x83\xC0\x83\x00\x83\xC0\x83\x00\xCE\xFF" + "\x83\x80\x83\x00\x83\xC0\x86\x00\x8C\xFF\x86\x00\x83\xFF\x86\x00\x86" + "\x80\x86\xC0\x83\x00\x95\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x83\xFF" + "\x83\xC0\x01\xFF\x82\x00\x83\xC0\xA4\xFF\x83\x00\x83\xC0\x83\x80\x83" + "\x00\x95\xFF\x8C\x00\x83\x80\x86\xC0\x83\x00\x92\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x9E\xFF\x83\x80\x83\x00\x83\xC0" + "\x83\x80\x83\x00\x83\x80\x86\x00\x83\xFF\x83\x80\x86\x00\x83\xFF\x89" + "\x00\x86\x80\x86\xC0\x83\x00\x90\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x9E\xFF\x83\x00\x83\xC0\x86\x80" + "\x86\x00\x83\x80\x83\xFF\x83\xC0\x83\x00\x83\x80\x83\xFF\x8F\x00\x86" + "\x80\x83\xC0\x83\x00\x90\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x9B\xFF\x83\x80\x83\x00\x83\xC0\x86\x80" + "\x83\x00\x89\xFF\x83\x00\x8C\xFF\x83\x00\x83\xFF\x89\x00\x83\x80\x83" + "\x00\x92\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83" + "\xC0\x9B\xFF\x83\x00\x83\xC0\x86\x80\x83\xC0\x83\x00\x89\xFF\x83\x00" + "\x8C\xFF\x83\x00\x83\xFF\x8C\x00\x99\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x9E\xFF\x83\x00\x83\xC0\x86\x80\x83\xC0\x83\x00\x89\xFF\x83" + "\x00\x8C\xFF\x83\x00\x86\xFF\x89\x00\x83\x80\x98\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\xA1\xFF\x83\x00\x83" + "\xC0\x86\x80\x83\xC0\x83\x00\x86\xFF\x83\x80\x83\x00\x83\xC0\x8C\xFF" + "\x83\x00\x83\xFF\x8C\x00\x83\x80\x98\xFF\x83\xC0\x01\xFF\x82\x00\x83" + "\xC0\xA1\xFF\x83\x80\x83\xC0\x86\x80\x86\xC0\x83\x00\x9B\xFF\x83\x00" + "\x86\xFF\x8C\x00\x83\x80\x99\xFF\x82\x00\xA4\xFF\x83\x80\x83\xC0\x86" + "\x80\x83\xC0\x89\x00\x83\xFF\x89\x00\x89\xFF\x83\x00\x83\xC0\x83\x00" + "\x86\xFF\x8C\x00\x83\x80\xBC\xFF\x83\x00\x83\xC0\x86\x80\x86\x00\x83" + "\xC0\x83\x00\x86\xFF\x83\xC0\x89\xFF\x83\x00\x86\xC0\x83\x00\x89\xFF" + "\x8F\x00\x83\x80\xB6\xFF\x83\x00\x83\xC0\x83\x80\x83\x00\x83\xC0\x86" + "\x00\x83\xC0\x83\x00\x8C\xFF\x83\x00\x86\xC0\x89\x00\x89\xFF\x92\x00" + "\x83\x80\xB0\xFF\x83\x00\x83\xC0\x83\x00\x83\xFF\x83\xC0\x89\x00\x83" + "\xC0\x8C\x00\x86\xC0\x89\x00\x83\xC0\x83\x00\x89\xFF\x8F\x00\x83\x80" + "\xB0\xFF\x86\x00\x83\xC0\x83\xFF\x83\x00\x83\xC0\x89\x00\x8C\xC0\x8C" + "\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x89\xFF\x8C\x00\x8C\xFF\x86\x80" + "\x83\xFF\x86\x80\x95\xFF\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x80\x83" + "\xFF\x83\xC0\x9B\x00\x83\xC0\x83\x80\x83\xFF\x83\xC0\x89\x00\x89\xFF" + "\x83\x00\x8C\xFF\x83\x80\x86\xC0\x83\x80\x86\xC0\x83\x80\x8F\xFF\x83" + "\x00\x8C\xC0\x83\x00\x83\xC0\x83\xFF\x83\x00\x86\xC0\x8C\x00\x89\xC0" + "\x83\x00\x83\xFF\x83\xC0\x98\x00\x8C\xFF\x83\x80\x83\xC0\x8C\x80\x8F" + "\xFF\x89\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x80\x83\xFF" + "\x83\x00\x8C\xC0\x83\x00\x83\xFF\x83\x80\x86\xC0\x8C\x00\x8F\xFF\x83" + "\x00\x8C\xFF\x83\x80\x83\xC0\x83\x80\x86\xC0\x83\x80\x89\xFF\x83\x00" + "\x98\xC0\x83\x00\x89\xC0\x83\x80\x83\xFF\x83\x00\x83\x80\x89\xC0\x86" + "\x00\x83\xFF\x86\x00\x86\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x86\x00" + "\x83\xFF\x89\x00\x83\x80\x86\xC0\x83\x80\x83\xFF\x83\x80\x83\xFF\x8C" + "\x00\x83\xC0\x89\x00\x86\xC0\x8C\x00\x8C\xC0\x8C\x00\x83\xC0\x86\x00" + "\x83\xFF\x83\x00\x8C\xFF\x83\x00\x86\x80\x83\x00\x89\xC0\x89\x00\x83" + "\xC0\x83\x80\x83\xC0\x83\xFF\x9B\xC0\x86\x00\x86\xFF\x8F\x00\x83\xC0" + "\x89\x00\x83\xC0\x86\x00\x8C\xFF\x86\x00\x86\x80\x83\x00\x89\xC0\x83" + "\x00\x86\xFF\x83\x00\x83\x80\x86\xC0\x83\xFF\x89\x00\x83\xC0\x8C\x00" + "\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x92\x00\x83\xC0\x83\x00\x83" + "\xC0\x86\x00\x83\xFF\x83\x00\x83\xFF\x86\x00\x86\x80\x92\x00\x89\xFF" + "\x83\x00\x89\xC0\x83\xFF\x98\xC0\x86\x00\x83\xFF\x8C\x00\x86\xFF\x86" + "\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x86\xFF\x83\x00\x89\x80\x83\x00" + "\x89\xC0\x83\x00\x83\xFF\x8F\x00\x86\xC0\x86\xFF\x83\x00\x83\xC0\x83" + "\x00\x83\xC0\x89\x00\x83\xC0\x89\x00\x83\xFF\x86\x00\x86\xFF\x83\x00" + "\x83\xFF\x86\x00\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x86" + "\x80\x83\x00\x83\xC0\x89\x80\x83\x00\x83\xFF\x83\x00\x83\x80\x83\x00" + "\x83\xFF\x86\x00\x89\xFF\x98\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x83" + "\x00\x83\x80\x86\x00\x86\xFF\x86\x00\x83\xC0\x86\x00\x86\xFF\x83\x00" + "\x86\x80\x83\x00\x83\xC0\x86\x80\x83\xC0\x83\x80\x86\x00\x83\xFF\x86" + "\x00\x83\xFF\x86\x80\x89\xFF\x86\x00\x83\xC0\x83\x00\x83\xC0\x86\x00" + "\x83\xC0\x89\x00\x83\xFF\x83\x00\x83\xC0\x86\x80\x83\x00\x86\xFF\x83" + "\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x86\x80\x83\x00" + "\x83\xC0\x89\x80\x89\x00\x83\xFF\x83\x00\x83\xFF\x83\x80\x86\xFF\x83" + "\x80\x86\xFF\x98\xC0\x86\x00\x83\xFF\x86\x00\x86\xC0\x86\x80\x83\x00" + "\x83\xFF\x89\x00\x86\xFF\x83\x00\x86\x80\x83\x00\x83\xC0\x86\x80\x83" + "\xC0\x83\x80\x86\x00\x83\xFF\x86\x00\x83\xFF\x83\x80\x86\xFF\x83\x80" + "\x86\xFF\x83\x00\x83\xC0\x8C\x00\x83\xC0\x86\x00\x83\xFF\x86\x00\x83" + "\xC0\x83\x00\x86\xC0\x83\x80\x8F\x00\x86\xFF\x83\x00\x86\x80\x83\x00" + "\x83\xC0\x8C\x80\x83\x00\x83\xFF\x89\x00\x86\xFF\x86\x80\x83\x00\x86" + "\xFF\x95\xC0\x86\x00\x83\xFF\x86\x00\x83\xC0\x86\x00\x83\xC0\x83\x80" + "\x86\x00\x86\xC0\x8C\x00\x86\x80\x83\x00\x83\xC0\x83\x80\x83\xC0\x86" + "\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x89\xFF\x83\x00\x83\x80" + "\x83\x00\x83\xFF\x83\x00\x83\xC0\x86\x00\x86\xC0\x89\x00\x83\xFF\x86" + "\x00\x83\xC0\x83\x80\x83\x00\x86\xC0\x83\x80\x89\x00\x89\xC0\x86\x00" + "\x83\x80\x83\x00\x83\xC0\x86\x80\x89\x00\x83\xFF\x89\x00\x83\xFF\x86" + "\x00\x89\x80\x83\x00\x8F\xC0\x83\x00\x83\x80\x89\x00\x83\xFF\x83\x00" + "\x83\xC0\x83\x80\x83\x00\x86\xC0\x83\x80\x83\x00\x83\xC0\x8C\x00\x86" + "\xC0\x8F\x00\x86\x80\x86\x00\x83\xFF\x89\x00\x92\x80\x89\x00\x83\xC0" + "\x83\x00\x86\x80\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xC0\x86" + "\x00\x86\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x89\xC0\x86\x00\x86\xC0" + "\x83\x00\x89\x80\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x92" + "\x80\x83\x00\x89\xC0\x83\x00\x89\x80\x86\x00\x83\xFF\x86\x00\x83\xC0" + "\x83\x00\x86\xC0\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x89\x80\x83" + "\xC0\x89\x00\x86\x80\x89\xC0\x89\x00\x83\xFF\x83\x00\x8C\x80\x86\x00" + "\x89\xC0\x83\x00\x8C\x80\x83\x00\x89\xFF\x83\x00\x8C\xC0\x83\x80\x83" + "\x00\x83\xC0\x83\x00\x83\xC0\x83\x80\x83\xFF\x83\x80\x83\xC0\x83\x00" + "\x83\xC0\x83\x00\x83\x80\x8C\xC0\x83\x00\x89\xFF\x83\x00\x8C\x80\x83" + "\x00\x86\xC0" + , //body + 1669, //lenght + 0, + 0, + 0, + }, + { + "face-qs.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x34\x35\x20\x33\x37\x0A\x32\x82\x35\x01\x0A\x9E\xFF" + "\x86\x00\x83\xFF\x86\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xFF\x83" + "\x80\x83\x00\x83\xC0\x86\x00\x8C\xC0\x83\x00\xB3\xFF\x83\x80\x92\xFF" + "\x83\xC0\x8C\x00\x83\xFF\x83\x00\x83\xFF\x86\x00\x83\xFF\x83\x80\x83" + "\x00\x86\xC0\x83\x00\x89\xC0\x83\x00\xB6\xFF\x83\x00\x92\xFF\x83\x80" + "\x83\x00\x83\xFF\x83\x00\x83\xFF\x86\x00\x86\xFF\x83\x00\x83\xFF\x83" + "\x80\x83\x00\x92\xC0\x83\x00\x95\xFF\x83\x00\x9E\xFF\x83\x00\x92\xFF" + "\x89\x00\x83\xFF\x83\x00\x86\xFF\x83\x00\x86\xFF\x83\x00\x83\x80\x83" + "\x00\x83\xC0\x86\x00\x86\xC0\x83\x00\x95\xFF\x83\x80\x83\x00\x83\x80" + "\x98\xFF\x89\x80\x8F\xFF\x83\x00\x83\xFF\x86\x00\x8C\xFF\x83\x00\x83" + "\xFF\x83\x00\x83\x80\x83\x00\x86\xC0\x83\x00\x86\xC0\x83\x00\x92\xFF" + "\x83\x80\x89\x00\x83\x80\x95\xFF\x83\x00\x83\xC0\x83\x00\x8C\xFF\x83" + "\xC0\x83\x00\x83\xFF\x83\x00\x92\xFF\x86\x00\x86\x80\x83\x00\x8F\xC0" + "\x83\x00\x8C\xFF\x83\x80\x8F\x00\x83\x80\x92\xFF\x83\x00\x83\xC0\x83" + "\x00\x8C\xFF\x86\x80\x83\xFF\x83\x00\x83\x80\x86\x00\x83\xFF\x83\x80" + "\x89\x00\x86\x80\x83\x00\x83\xC0\x86\x00\x86\xC0\x83\x00\x89\xFF\x83" + "\xC0\x95\x00\x83\xC0\x8F\xFF\x83\x00\x83\xC0\x83\x00\x8C\xFF\x83\x00" + "\x83\x80\x83\xFF\x86\x00\x83\x80\x83\xFF\x83\xC0\x83\x00\x83\x80\x83" + "\xFF\x83\x00\x89\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x8C\xFF" + "\x83\x80\x95\x00\x83\x80\x8C\xFF\x83\x80\x89\xC0\x83\x80\x89\xFF\x83" + "\x00\x83\x80\x83\xFF\x83\x00\x89\xFF\x83\x00\x89\xFF\x83\x00\x83\xFF" + "\x86\x80\x83\x00\x86\xC0\x83\x00\x8F\xFF\x83\x80\x95\x00\x83\x80\x8C" + "\xFF\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x89\xFF\x83\x00\x83\x80" + "\x83\xFF\x83\x00\x89\xFF\x83\x00\x8C\xFF\x83\x00\x89\x80\x83\x00\x83" + "\xC0\x83\x00\x92\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00" + "\x83\x80\x8F\xFF\x83\x80\x89\xC0\x83\x80\x86\xFF\x83\xC0\x86\x80\x83" + "\xFF\x83\x00\x89\xFF\x83\x00\x8C\xFF\x83\x00\x83\xFF\x89\x80\x86\x00" + "\x98\xFF\x83\x80\x83\x00\x83\x80\x98\xFF\x83\x00\x83\xC0\x83\x00\x89" + "\xFF\x86\x80\x83\xFF\x86\x00\x86\xFF\x83\x80\x83\x00\x83\xC0\x8C\xFF" + "\x83\x00\x89\x80\x86\x00\x95\xFF\x83\xC0\x89\x00\x83\xC0\x95\xFF\x83" + "\x00\x83\xC0\x83\x00\x89\xFF\x83\x00\x83\x80\x83\xFF\x86\x00\x9B\xFF" + "\x83\x00\x83\xFF\x89\x80\x83\x00\xB6\xFF\x8F\x00\x86\xFF\x83\x00\x83" + "\xFF\x8C\x00\x83\xFF\x89\x00\x89\xFF\x83\x00\x83\x80\x83\x00\x83\xFF" + "\x89\x80\x83\xC0\xB3\xFF\x83\x00\x89\xC0\x83\x00\x83\xFF\x83\xC0\x83" + "\x80\x83\xFF\x8C\x00\x86\xFF\x83\xC0\x89\xFF\x83\x00\x83\x80\x86\x00" + "\x83\xFF\x89\x80\x83\x00\x83\xC0\xB3\xFF\x89\x00\x86\xFF\x86\x80\x83" + "\xFF\x89\x00\x83\xC0\x83\x00\x8C\xFF\x89\x00\x83\xC0\x86\x00\x83\xFF" + "\x89\x80\x83\x00\x83\xC0\xAD\xFF\x83\x00\x89\xC0\x83\x00\x83\xFF\x83" + "\x00\x83\x80\x83\xFF\x83\x00\x83\xC0\x86\x00\x83\xC0\x8C\x00\x83\xC0" + "\x83\x00\x83\xC0\x83\x00\x86\xC0\x83\x00\x83\xFF\x89\x80\x83\x00\x83" + "\xC0\xAA\xFF\x83\x00\x89\xC0\x83\x00\x83\xFF\x8C\x00\x86\xC0\x86\x00" + "\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x86\x00\x86\xC0\x89\x00\x8C" + "\xFF\x83\x00\x83\xC0\x95\xFF\x86\x80\x8F\xFF\x89\x00\x86\xFF\x8C\x00" + "\x8C\xC0\x8F\x00\x89\xC0\x98\x00\x83\x80\x83\x00\x83\xC0\x8C\xFF\x86" + "\x80\x86\x00\x86\x80\x89\xFF\x83\x00\x83\x80\x83\x00\x83\xFF\x89\x00" + "\x83\xFF\x86\x00\x83\xC0\x83\x00\x92\xC0\x83\x00\x83\xC0\x89\x00\x86" + "\xFF\x86\x00\x8C\x80\x83\x00\x83\xC0\x86\xFF\x86\x80\x83\x00\x86\xC0" + "\x83\x00\x86\x80\x86\xFF\x83\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x83" + "\xFF\x86\x00\x86\xC0\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0" + "\x86\x00\x86\xFF\x89\x00\x89\x80\x83\xFF\x83\x00\x83\xC0\x86\x00\x86" + "\xFF\x86\x80\x86\x00\x86\x80\x83\xFF\x83\x00\x83\xFF\x83\x00\x83\xC0" + "\x83\x00\x83\x80\x86\xC0\x8F\x00\x95\xC0\x86\x00\x83\xFF\x89\x00\x8C" + "\x80\x83\xFF\x83\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x86\xFF\x86\x80" + "\x86\xFF\x83\x00\x83\x80\x86\x00\x83\xC0\x83\x00\x86\x80\x83\xC0\x86" + "\x00\x83\xFF\x86\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x86\xC0\x86\x00" + "\x83\xFF\x89\x00\x89\x80\x86\xFF\x83\x00\x83\xC0\x89\x00\x89\xC0\x83" + "\x00\x83\xFF\x83\x00\x86\xFF\x83\x00\x83\xC0\x83\x80\x86\x00\x83\xC0" + "\x83\x00\x86\x80\x83\xC0\x92\x00\x8C\xC0\x86\x00\x83\xFF\x86\x00\x8C" + "\x80\x86\xFF\x83\x00\x83\xC0\x83\x00\x83\x80\x89\x00\x89\xC0\x86\x00" + "\x83\xFF\x89\x00\x83\xC0\x86\x00\x83\xC0\x83\x00\x86\x80\x86\xC0\x86" + "\x00\x83\xFF\x86\x00\x89\xC0\x86\x00\x83\xFF\x86\x00\x8C\x80\x83\xFF" + "\x86\x80\x83\x00\x83\xC0\x98\x00\x83\xC0\x8F\x00\x83\xC0\x86\x00\x83" + "\xC0\x83\x00\x83\xFF\x86\x80\x83\xC0\x89\x00\x83\xFF\x89\x00\x83\xC0" + "\x83\x00\x83\xFF\x86\x00\x89\x80\x86\xFF\x89\x80\x83\x00\x83\xC0\x83" + "\x00\x89\x80\x8F\x00\x8C\xFF\x83\x00\x83\xC0\x86\x00\x83\xC0\x86\x00" + "\x86\x80\x86\xC0\x8C\x00\x86\xC0\x83\x00\x83\xFF\x86\x00\x89\x80\x83" + "\xFF\x89\x80\x89\x00\x83\xC0\x98\x00\x8F\xFF\x83\x00\x83\xC0\x86\x00" + "\x83\xC0\x83\x00\x83\xFF\x83\x00\x86\x80\x83\xC0\x89\x00\x83\xC0\x86" + "\x80\x83\xC0\x86\x00\x89\x80\x83\xFF\x86\x80\x8F\x00\x86\xC0\x83\x00" + "\x8C\x80\x83\x00\x92\xFF\x83\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x83" + "\xFF\x86\x80\x86\xC0\x86\x00\x83\xC0\x86\x80\x83\xC0\x83\x00\x89\x80" + "\x83\xFF\x83\x80\x89\x00\x83\xFF\x83\xC0\x89\x00\x83\xC0\x8F\x00\x86" + "\xFF\x83\x00\x86\xFF\x86\x00\x83\xC0\x83\x80\x86\x00\x83\xC0\x83\x00" + "\x83\xFF\x86\x00\x86\x80\x86\xC0\x83\x00\x83\xC0\x86\x80\x83\xC0\x83" + "\x00\x86\x80\x83\xFF\x83\x80\x89\x00\x83\xC0\x86\xFF\x83\xC0\x89\x00" + "\x83\xC0\x83\x00\x86\x80\x83\x00\x83\xFF\x95\x00\x83\x80\x86\x00\x83" + "\xC0\x86\x00\x83\xFF\x83\x00\x89\x80\x86\xC0\x83\x00\x86\xC0\x83\x00" + "\x86\x80\x83\xFF\x89\x00\x83\x80\x83\xFF\x83\xC0\x83\x00\x83\x80\x83" + "\xFF\x83\xC0\x89\x00\x83\xC0\x8F\x00\x83\xC0\x98\x00\x83\xC0\x83\x00" + "\x83\xFF\x83\x00\x83\xFF\x83\x00\x89\x80\x86\xC0\x89\x00\x83\x80\x83" + "\xFF\x89\x00\x83\xC0\x83\xFF\x83\xC0\x83\x80\x86\x00\x83\x80\x83\xFF" + "\x83\xC0\x89\x00\x83\xC0\x83\x00\x83\x80\x83\x00\x86\xC0\x83\x00\x83" + "\xC0\x89\x00\x83\xC0\x86\x00\x83\xC0\x86\x00\x83\xFF\x83\x00\x83\xFF" + "\x83\x00\x98\x80\x89\x00\x9E\xFF\x83\xC0\x89\x00\x83\xC0\x83\x00\x89" + "\xC0\x83\x00\x8C\xC0\x89\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF" + "\x83\x00\x83\xFF\xD4\x00\x8F\xC0\x86\x00\x83\xC0\x86\x00\x83\xC0\x86" + "\x00\x83\xFF\x83\x00\x83\xFF\x83\x00\xD1\x80\x83\x00\x83\xC0\x8C\x00" + "\x86\xC0\x89\x00\x83\xC0\x83\x00\x83\xFF\x83\x00\x83\xFF\x89\x00\x83" + "\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF" + "\x89\x00\x83\xFF\x89\x00\x83\xFF\x89\x00\x8C\xC0\x8F\x00\x83\xC0\x95" + "\x00\x83\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF\x89\x00" + "\x83\xFF\x89\x00\x83\xFF\x89\x00\x83\xFF\x95\x00\x83\xC0\x86\x00" + , //body + 1563, //lenght + 0, + 0, + 0, + }, + { + "fill.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x37\x33\x20\x39\x37\x0A\x32\x82\x35\x7F\x0A\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x7F\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x7F\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\x7F\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x7F\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x20\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x06\x35\x5E\x83\x00\x7F\x1E\x2A\x35\x4C\x6A\x86\x7E\xBB" + "\xF2\x76\xB7\xF1\x69\xB0\xF0\x60\xAC\xEF\x56\xA7\xEE\x4E\xA3\xED\x48" + "\x9F\xEC\x41\x9C\xEC\x3C\x99\xEB\x3A\x98\xEB\x35\x95\xEA\x30\x93\xEA" + "\x2C\x91\xE9\x27\x8E\xE9\x1E\x8A\xE8\x19\x86\xE5\x18\x80\xDC\x17\x7B" + "\xD3\x11\x5A\x9A\x12\x24\x34\x4D\xA2\xED\x48\x9F\xEC\x3E\x9A\xEB\x36" + "\x96\xEA\x2F\x92\xEA\x27\x8E\xE9\x24\x8C\xE9\x21\x8B\xE8\x1E\x89\xE8" + "\x1B\x88\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x85\xE4\x19\x82\xDF\x18\x80\xDB\x18" + "\x7F\x7D\xD6\x17\x7A\xD1\x17\x77\xCD\x16\x75\xC8\x15\x72\xC3\x09\x30" + "\x53\x31\x5D\x82\x59\xA6\xEB\x50\xA2\xEA\x49\x9E\xE9\x42\x9B\xE9\x3B" + "\x97\xE8\x35\x94\xE8\x30\x91\xE8\x2C\x8F\xE7\x27\x8D\xE7\x23\x8A\xE6" + "\x21\x89\xE6\x21\x89\xE6\x21\x89\xE6\x1E\x88\xE6\x1C\x87\xE5\x19\x86" + "\xE5\x17\x84\xE5\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x06\x33\x5B\x30\x41\x51\x8D\xC3\xF3\x85\xBF\xF2\x77\xB8\xF1" + "\x6D\xB3\xF0\x64\xAE\xEF\x5B\xA9\xEE\x51\xA4\xED\x49\xA0\xEC\x42\x9C" + "\xEC\x3C\x99\xEB\x37\x96\xEB\x35\x95\x1C\xEA\x31\x93\xEA\x2C\x91\xE9" + "\x28\x8E\xE9\x23\x8C\xE9\x1A\x87\xE8\x19\x83\xE1\x18\x7E\xD8\x17\x78" + "\xCE\x16\x73\xC5\x83\x00\x7F\x47\x9F\xEC\x42\x9C\xEC\x39\x98\xEB\x32" + "\x94\xEA\x2B\x90\xE9\x26\x8E\xE9\x24\x8C\xE9\x22\x8B\xE8\x1F\x8A\xE8" + "\x1C\x88\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x85\xE4\x18\x82\xDF\x18\x7F\xDB\x18" + "\x7D\xD6\x17\x7A\xD1\x17\x77\xCD\x16\x75\xC8\x15\x72\xC3\x07\x24\x3E" + "\x3A\x6F\x9D\x55\xA5\xEB\x4C\xA0\xEA\x46\x9C\xE9\x3F\x99\xE8\x38\x95" + "\xE8\x31\x92\xE8\x2C\x8F\xE7\x27\x8C\xE7\x23\x8A\xE6\x1F\x88\xE6\x1D" + "\x87\xE5\x1D\x87\xE5\x1D\x87\xE5\x1B\x87\xE5\x19\x85\xE5\x16\x7F\x84" + "\xE5\x16\x83\xE4\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x06\x32\x58\x2E\x40\x51\x86\xBF\xF2\x7B\xBA\xF1\x72\xB5\xF0" + "\x69\xB0\xF0\x5F\xAB\xEF\x56\xA7\xEE\x4D\xA2\xED\x43\x9D\xEC\x3D\x99" + "\xEB\x36\x96\xEA\x32\x94\xEA\x30\x93\xEA\x2C\x91\xE9\x28\x8F\xE9\x23" + "\x8C\xE9\x1E\x8A\xE8\x19\x86\xE5\x18\x80\xDC\x17\x7B\xD3\x16\x76\xCA" + "\x15\x70\xC1\x06\x23\x3C\x2A\x67\x9C\x3B\x99\xEB\x33\x94\xEA\x2C\x91" + "\xE9\x26\x8D\xE9\x23\x8C\xE9\x21\x8B\xE8\x1F\x8A\xE8\x1C\x88\xE8\x1A" + "\x87\xE8\x19\x87\xE7\x19\x86\x7F\xE6\x19\x86\xE6\x19\x86\xE7\x19\x87" + "\xE7\x19\x87\xE7\x19\x87\xE7\x19\x84\xE3\x18\x82\xDF\x18\x7F\xDA\x18" + "\x7D\xD6\x17\x7A\xD1\x17\x77\xCD\x16\x75\xC8\x15\x72\xC3\x07\x24\x3E" + "\x37\x6E\x9D\x52\xA3\xEA\x49\x9E\xE9\x42\x9B\xE9\x3B\x97\xE8\x34\x93" + "\xE8\x2D\x90\xE7\x27\x8C\xE7\x23\x8A\xE6\x1E\x88\xE6\x1A\x86\xE5\x19" + "\x86\xE5\x19\x86\xE5\x19\x86\xE5\x18\x85\xE5\x16\x84\xE5\x16\x83\xE3" + "\x16\x82\xE0\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x03\x17\x2B\x2C\x40\x50\x81\xBD\xF2\x77\xB8\xF1\x6D\xB3\xF0\x7F" + "\x64\xAE\xEF\x5B\xA9\xEE\x51\xA4\xED\x48\x9F\xEC\x3F\x9A\xEB\x37\x96" + "\xEB\x31\x93\xEA\x2D\x91\xEA\x2B\x90\xE9\x28\x8F\xE9\x24\x8C\xE9\x1F" + "\x8A\xE8\x1A\x87\xE8\x19\x83\xE1\x18\x7E\xD7\x17\x78\xCE\x16\x73\xC5" + "\x15\x6E\xBC\x0D\x44\x76\x13\x32\x4E\x34\x95\xEA\x2D\x91\xEA\x25\x8D" + "\xE9\x23\x8C\xE9\x20\x8B\xE8\x1E\x89\xE8\x1C\x88\xE8\x19\x87\xE8\x19" + "\x86\xE7\x19\x85\xE4\x19\x84\xE2\x19\x84\xE2\x19\x84\xE3\x19\x84\xE3" + "\x19\x85\xE3\x19\x84\xE3\x18\x82\xDF\x18\x7F\xDB\x18\x7D\xD7\x17\x7B" + "\xD2\x17\x78\xCE\x16\x76\xCA\x16\x7F\x73\xC6\x15\x71\xC1\x07\x24\x3E" + "\x35\x6C\x9C\x4E\xA1\xEA\x45\x9C\xE9\x3E\x99\xE8\x37\x95\xE8\x31\x91" + "\xE8\x2A\x8E\xE7\x23\x8A\xE6\x1E\x88\xE6\x1A\x86\xE5\x17\x84\xE5\x16" + "\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x83\xE2\x16\x81\xE0" + "\x16\x80\xDD\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x03\x17\x29\x56\x7E\xA1\x7D\xBB\xF2\x72\xB5\xF0\x68\xB0\xEF\x5F" + "\xAB\xEF\x56\xA6\xEE\x4C\xA2\xED\x43\x9D\xEC\x3A\x98\xEB\x32\x94\xEA" + "\x2B\x90\xE9\x28\x8E\xE9\x26\x8D\xE9\x24\x8C\xE9\x1F\x8A\xE8\x1B\x88" + "\x7F\xE8\x19\x86\xE5\x18\x80\xDC\x17\x7B\xD3\x16\x76\xCA\x15\x71\xC2" + "\x15\x6D\xBB\x11\x5D\x9F\x05\x10\x19\x2D\x91\xEA\x29\x8F\xE9\x22\x8C" + "\xE8\x20\x8A\xE8\x1D\x89\xE8\x1B\x88\xE8\x19\x87\xE8\x19\x86\xE6\x19" + "\x85\xE4\x19\x83\xE1\x18\x82\xDF\x18\x82\xDF\x18\x82\xDF\x19\x82\xDF" + "\x19\x82\xE0\x18\x82\xDF\x18\x7F\xDB\x18\x7D\xD7\x17\x7B\xD3\x17\x78" + "\xCE\x16\x76\xCA\x16\x74\xC6\x15\x71\xC2\x15\x6F\xBE\x06\x23\x3D\x36" + "\x6D\x9C\x4F\xA1\xEA\x46\x9C\xE9\x3F\x99\xE8\x38\x95\xE8\x31\x92\xE8" + "\x2A\x8E\xE7\x23\x8A\xE6\x1E\x88\xE6\x7F\x1A\x86\xE5\x16\x84\xE5\x16" + "\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x83\xE3\x16\x82\xE0" + "\x16\x80\xDE\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x02\x16\x28\x53\x7C\xA1\x79\xB9\xF1\x6D\xB3\xF0\x64\xAE\xEF\x5A" + "\xA9\xEE\x51\xA4\xED\x48\x9F\xEC\x3E\x9A\xEB\x35\x95\xEA\x2C\x91\xE9" + "\x26\x8D\xE9\x23\x8C\xE9\x21\x8B\xE8\x1F\x8A\xE8\x1B\x88\xE8\x19\x86" + "\xE6\x19\x83\xE0\x18\x7E\xD8\x17\x7A\xD1\x16\x76\xCA\x15\x71\xC3\x15" + "\x6D\xBB\x14\x69\xB4\x04\x15\x25\x1D\x6D\xB4\x23\x8C\xE9\x1F\x8A\xE8" + "\x1D\x7F\x89\xE8\x1A\x87\xE8\x19\x87\xE8\x19\x86\xE6\x19\x84\xE3\x19" + "\x83\xE1\x18\x82\xDE\x18\x80\xDC\x18\x80\xDB\x18\x80\xDB\x18\x80\xDC" + "\x18\x80\xDC\x18\x80\xDB\x18\x7D\xD7\x17\x7B\xD3\x17\x78\xCE\x16\x76" + "\xCA\x16\x74\xC6\x15\x71\xC2\x15\x6F\xBE\x14\x6C\xBA\x06\x23\x3C\x36" + "\x6D\x9C\x50\xA2\xEA\x46\x9D\xE9\x3F\x99\xE8\x39\x96\xE8\x32\x92\xE8" + "\x2B\x8E\xE7\x24\x8B\xE6\x1E\x87\xE6\x19\x86\xE5\x16\x84\xE5\x16\x84" + "\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE4\x16\x82\xE1\x16" + "\x80\xDE\x17\x96\xEA\x17\x96\xEA\x17\x96\x07\xEA\x17\x96\xEA\x17\x96" + "\xEA\x83\x00\x7F\x52\x7C\xA0\x74\xB6\xF1\x68\xB0\xEF\x5F\xAB\xEF\x55" + "\xA6\xEE\x4C\xA1\xED\x43\x9D\xEC\x39\x98\xEB\x30\x93\xEA\x27\x8E\xE9" + "\x20\x8A\xE8\x1D\x89\xE8\x1C\x88\xE8\x1A\x87\xE8\x19\x87\xE7\x19\x85" + "\xE5\x19\x83\xE0\x18\x7E\xD9\x17\x7A\xD2\x16\x76\xCA\x15\x72\xC3\x15" + "\x6D\xBC\x14\x69\xB5\x0A\x37\x5E\x0D\x3D\x66\x1F\x8A\xE8\x1C\x88\xE8" + "\x1A\x87\xE8\x19\x87\xE7\x19\x85\xE5\x19\x84\xE3\x19\x83\xE0\x18\x81" + "\xDE\x18\x80\xDB\x18\x7E\xD9\x18\x7D\xD7\x18\x7E\xD7\x18\x7E\xD8\x18" + "\x7E\xD8\x18\x7D\xD7\x17\x7B\xD3\x17\x78\xCF\x16\x59\x76\xCA\x16\x74" + "\xC6\x15\x71\xC2\x15\x6F\xBE\x14\x6C\xBA\x14\x6A\xB6\x04\x16\x26\x40" + "\x80\xB7\x51\xA2\xEA\x47\x9D\xE9\x40\x9A\xE8\x39\x96\xE8\x32\x92\xE8" + "\x2B\x8F\xE7\x25\x8B\xE6\x1E\x87\xE6\x19\x86\xE5\x16\x84\xE5\x16\x84" + "\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x82\xE2\x16" + "\x81\xDF\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x83\x00\x7F\x77\xB8\xF1\x70\xB4\xF0\x63\xAE\xEF\x5A\xA9\xEE\x51\xA4" + "\xED\x47\x9F\xEC\x3E\x9A\xEB\x35\x95\xEA\x2B\x90\xE9\x22\x8B\xE8\x1A" + "\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x86\xE6" + "\x19\x83\xE1\x18\x7F\xD9\x17\x7A\xD2\x16\x76\xCB\x16\x72\xC4\x15\x6E" + "\xBC\x14\x6A\xB5\x0E\x4D\x84\x05\x1D\x32\x1B\x88\xE8\x1C\x88\xE8\x19" + "\x86\xE7\x19\x85\xE4\x1A\x84\xE2\x1A\x82\xE0\x18\x81\xDD\x18\x80\xDB" + "\x18\x7E\xD8\x18\x7D\xD6\x18\x7C\xD4\x17\x7B\xD4\x17\x7C\xD4\x1A\x7D" + "\xD4\x17\x7B\xD3\x17\x78\xCF\x16\x76\xCA\x16\x11\x74\xC6\x15\x71\xC2" + "\x15\x6F\xBE\x15\x6D\xBA\x14\x6A\xB6\x14\x68\xB2\x83\x00\x45\x54\xA4" + "\xEB\x52\xA3\xEA\x48\x9D\xE9\x41\x9A\xE8\x3A\x96\xE8\x33\x93\xE8\x2C" + "\x8F\xE7\x25\x8B\xE6\x1E\x88\xE6\x19\x86\xE5\x16\x84\xE5\x16\x84\xE5" + "\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x83\xE3\x16\x81" + "\xE0\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x83" + "\x00\x7F\x72\xB5\xF0\x6C\xB2\xF0\x5F\xAB\xEF\x55\xA6\xEE\x4C\xA1\xED" + "\x43\x9C\xEC\x39\x98\xEB\x30\x93\xEA\x27\x8E\xE9\x1F\x8A\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x86\xE6\x19" + "\x83\xE1\x18\x7F\xDA\x17\x7B\xD3\x16\x76\xCB\x16\x72\xC4\x15\x6E\xBD" + "\x14\x6A\xB5\x13\x66\xAE\x01\x0A\x12\x16\x77\xCD\x19\x87\xE8\x1A\x85" + "\xE4\x19\x83\xE1\x1A\x83\xDF\x18\x81\xDD\x18\x7F\xDA\x19\x7E\xD8\x17" + "\x7C\xD5\x17\x7B\xD3\x19\x7B\xD1\x17\x79\xD0\x18\x7A\xD0\x19\x7A\xD0" + "\x19\x79\xCF\x16\x76\xCB\x16\x74\xC6\x15\x11\x71\xC2\x15\x6F\xBE\x15" + "\x6D\xBA\x14\x6A\xB6\x14\x68\xB2\x13\x65\xAE\x83\x00\x45\x55\xA5\xEB" + "\x53\xA3\xEA\x48\x9E\xE9\x41\x9A\xE9\x3A\x97\xE8\x34\x93\xE8\x2D\x8F" + "\xE7\x26\x8C\xE6\x1F\x88\xE6\x19\x86\xE5\x16\x84\xE5\x16\x84\xE5\x16" + "\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x83\xE4\x16\x82\xE1" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x83\x00" + "\x7F\x6D\xB2\xF0\x68\xB0\xEF\x5A\xA9\xEE\x50\xA4\xED\x47\x9F\xEC\x3E" + "\x9A\xEB\x35\x96\xEA\x2E\x92\xEA\x26\x8E\xE9\x1F\x8A\xE8\x19\x87\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE7\x19\x83" + "\xE2\x18\x7F\xDA\x17\x7B\xD3\x16\x77\xCC\x16\x73\xC4\x15\x6E\xBD\x14" + "\x6A\xB6\x13\x66\xAF\x06\x20\x37\x10\x58\x98\x19\x85\xE4\x1A\x83\xE1" + "\x19\x82\xDE\x1E\x83\xDC\x2C\x88\xDA\x41\x8B\xCE\x47\x84\xBA\x47\x83" + "\xB7\x47\x82\xB6\x43\x87\xC2\x35\x86\xCC\x20\x7C\xCD\x18\x78\xCD\x18" + "\x77\xCB\x17\x75\xC6\x16\x72\xC2\x15\x11\x6F\xBE\x15\x6D\xBA\x14\x6A" + "\xB6\x14\x68\xB2\x13\x65\xAE\x13\x63\xAA\x83\x00\x45\x56\xA5\xEB\x53" + "\xA4\xEB\x49\x9E\xE9\x42\x9B\xE9\x3B\x97\xE8\x34\x93\xE8\x2D\x90\xE7" + "\x26\x8C\xE7\x20\x88\xE6\x19\x86\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84" + "\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE4\x16\x82\xE0\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x83\x00\x7F" + "\x67\xB0\xEF\x61\xAC\xEF\x55\xA6\xEE\x4C\xA1\xED\x44\x9D\xEC\x3D\x9A" + "\xEB\x36\x96\xEA\x2E\x92\xEA\x27\x8E\xE9\x1F\x8A\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x84\xE2" + "\x18\x7F\xDB\x17\x7B\xD3\x16\x77\xCC\x16\x73\xC5\x15\x6F\xBE\x14\x6A" + "\xB6\x13\x66\xAF\x0C\x40\x6E\x08\x2B\x4A\x18\x82\xDF\x1D\x82\xDC\x38" + "\x8C\xD7\x42\x6F\x97\x1D\x30\x41\x0D\x19\x23\x03\x0C\x13\x04\x0D\x15" + "\x04\x0D\x15\x0A\x14\x1E\x14\x22\x2E\x2B\x44\x5A\x46\x79\xA6\x2F\x81" + "\xC9\x17\x72\xC2\x17\x70\xBE\x15\x11\x6D\xBA\x14\x6A\xB6\x14\x68\xB2" + "\x13\x65\xAE\x13\x63\xAA\x12\x61\xA6\x83\x00\x7F\x59\xA7\xEB\x54\xA4" + "\xEB\x4A\x9E\xE9\x43\x9B\xE9\x3C\x97\xE8\x35\x94\xE8\x2E\x90\xE7\x27" + "\x8C\xE7\x20\x89\xE6\x19\x86\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5" + "\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x83\xE3\x15\x7E\xDA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x03\x1B\x31\x4C" + "\x86\xB9\x5D\xAA\xEE\x54\xA5\xED\x4C\xA1\xED\x45\x9E\xEC\x3D\x9A\xEB" + "\x36\x96\xEA\x2E\x92\xEA\x27\x8E\xE9\x1F\x8A\xE8\x1A\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x84\xE2\x18" + "\x80\xDB\x17\x14\x7C\xD4\x16\x77\xCD\x16\x73\xC5\x15\x6F\xBE\x14\x6B" + "\xB7\x13\x66\xB0\x0C\x40\x6D\x83\x01\x83\x12\x3F\x3B\x41\x46\x15\x1A" + "\x1F\x02\x05\x08\x01\x04\x07\x00\x05\x09\x01\x06\x0A\x01\x06\x0A\x01" + "\x06\x0A\x02\x0A\x11\x02\x0A\x11\x03\x0B\x12\x05\x0E\x15\x2B\x43\x58" + "\x40\x80\xB9\x1B\x6F\xB9\x17\x6A\xB4\x15\x67\xAF\x13\x63\xAA\x13\x63" + "\xAA\x12\x61\xA6\x12\x5E\xA2\x83\x00\x7F\x59\xA7\xEB\x55\xA5\xEB\x4A" + "\x9F\xE9\x43\x9B\xE9\x3C\x98\xE8\x36\x94\xE8\x2F\x90\xE7\x28\x8D\xE7" + "\x21\x89\xE6\x1A\x86\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84" + "\xE5\x16\x84\xE5\x16\x81\xDF\x15\x7D\xD9\x15\x79\xD1\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x09\x45\x78\x36\x5F\x84" + "\x5C\xAA\xEE\x54\xA6\xED\x4C\xA2\xED\x45\x9E\xEC\x3E\x9A\xEB\x36\x96" + "\xEA\x2F\x92\xEA\x27\x8E\xE9\x20\x8A\xE8\x1B\x88\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x84\xE3\x18\x80\xDC" + "\x17\x32\x7C\xD4\x17\x78\xCD\x16\x73\xC6\x15\x6F\xBF\x14\x6B\xB7\x13" + "\x67\xB0\x0C\x40\x6E\x39\x4C\x5D\x5E\x76\x8B\x10\x17\x1C\x07\x0B\x0F" + "\x08\x0D\x11\x07\x0B\x0F\x02\x05\x08\x02\x04\x06\x01\x04\x06\x01\x04" + "\x06\x83\x00\x83\x02\x83\x15\x01\x21\x82\x22\x1B\x0B\x0E\x10\x0D\x10" + "\x13\x39\x46\x51\x1D\x48\x6D\x0E\x46\x75\x0C\x42\x71\x0C\x40\x6E\x12" + "\x5E\xA1\x11\x5B\x9D\x83\x00\x7F\x59\xA7\xEB\x56\xA5\xEB\x4B\x9F\xEA" + "\x44\x9C\xE9\x3D\x98\xE8\x36\x94\xE8\x2F\x91\xE7\x28\x8D\xE7\x21\x89" + "\xE6\x1B\x87\xE5\x16\x84\xE5\x16\x84\xE5\x16\x84\xE5\x16\x82\xE2\x16" + "\x7F\xDC\x15\x7B\xD6\x14\x78\xD0\x14\x74\xC8\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0D\x5D\xA4\x15\x25\x34\x5C\xAA" + "\xEE\x57\xA7\xEE\x4D\xA2\xED\x45\x9E\xEC\x3E\x9A\xEB\x36\x96\xEA\x2F" + "\x92\xEA\x27\x8E\xE9\x20\x8A\xE8\x1B\x88\xE8\x19\x87\xE8\x19\x87\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x85\xE3\x18\x80\xDC\x17\x53" + "\x7C\xD5\x17\x78\xCE\x16\x74\xC6\x15\x6F\xBF\x14\x6B\xB8\x13\x67\xB0" + "\x10\x43\x70\x4D\x58\x63\x0E\x15\x1B\x0C\x12\x18\x09\x0F\x14\x08\x0E" + "\x14\x09\x10\x16\x06\x0C\x12\x05\x0C\x12\x05\x0C\x12\x05\x0C\x12\x06" + "\x0D\x14\x0B\x13\x19\x32\x3A\x40\x5E\x64\x6A\x39\x3E\x42\x12\x18\x1C" + "\x08\x0F\x15\x40\x52\x62\x17\x37\x53\x0F\x30\x4E\x0E\x30\x4D\x89\x00" + "\x48\x59\xA7\xEB\x54\xA4\xEB\x4B\x9F\xEA\x45\x9C\xE9\x3E\x98\xE8\x37" + "\x95\xE8\x30\x91\xE8\x29\x8D\xE7\x22\x8A\xE6\x1B\x87\xE5\x17\x84\xE5" + "\x16\x83\xE3\x16\x80\xDE\x15\x7D\xD8\x15\x79\xD2\x14\x76\xCC\x13\x72" + "\xC6\x13\x6E\xBF\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x11\x77\xD0\x83\x00\x7F\x5B\xA9\xEE\x57\xA7\xEE\x4D\xA2\xED" + "\x46\x9E\xEC\x3E\x9A\xEB\x37\x96\xEB\x2F\x92\xEA\x28\x8E\xE9\x20\x8A" + "\xE8\x1C\x88\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x85\xE4\x18\x80\xDC\x17\x7C\xD5\x17\x78\xCD\x16\x73\xC6" + "\x15\x6F\xBE\x14\x6B\xB7\x13\x66\xAF\x2B\x57\x7D\x20\x24\x28\x0A\x11" + "\x16\x09\x0F\x14\x0A\x10\x16\x09\x10\x16\x07\x0E\x14\x05\x0C\x12\x05" + "\x0C\x12\x05\x0C\x12\x04\x0C\x12\x05\x0C\x13\x0A\x12\x18\x3C\x43\x4A" + "\x6A\x72\x79\x45\x4E\x57\x23\x2B\x32\x0C\x16\x1F\x13\x20\x2D\x51\x0E" + "\x9A\xDD\x2D\x90\xE9\x2D\x91\xEA\x2B\x90\xE9\x25\x8D\xE9\x83\x00\x7F" + "\x3B\x70\x9D\x54\xA4\xEB\x4C\xA0\xEA\x45\x9C\xE9\x3E\x99\xE8\x37\x95" + "\xE8\x31\x91\xE8\x2A\x8E\xE7\x23\x8A\xE6\x19\x86\xE5\x16\x83\xE2\x15" + "\x7E\xDA\x15\x7B\xD4\x14\x77\xCE\x14\x74\xC8\x13\x70\xC2\x13\x6D\xBC" + "\x12\x69\xB6\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x11\x74\xCB\x05\x26\x41\x3C\x70\x9E\x55\xA6\xEE\x4C\xA1\xED\x44" + "\x9D\xEC\x3C\x99\xEB\x35\x95\xEA\x2D\x91\xEA\x25\x8D\xE9\x1E\x89\xE8" + "\x1A\x87\xE8\x19\x87\xE7\x19\x85\xE5\x19\x85\xE5\x19\x85\xE5\x19\x85" + "\xE4\x19\x82\xDF\x18\x7E\xD8\x17\x7F\x7A\xD1\x16\x75\xC9\x15\x71\xC2" + "\x15\x6D\xBA\x14\x68\xB3\x13\x64\xAB\x38\x49\x59\x05\x07\x09\x0A\x10" + "\x16\x07\x0D\x12\x07\x0D\x12\x08\x0E\x14\x07\x0E\x14\x05\x0C\x12\x05" + "\x0C\x12\x04\x0C\x12\x04\x0B\x12\x05\x0C\x13\x0A\x12\x18\x2E\x36\x3C" + "\x32\x39\x40\x19\x24\x2E\x0F\x19\x22\x07\x11\x19\x04\x0D\x15\x42\x6A" + "\x8C\x30\x92\xE9\x27\x8E\xE9\x25\x8D\xE9\x1E\x89\xE8\x0B\x3B\x65\x13" + "\x24\x33\x54\xA4\xEB\x4F\xA1\xEA\x46\x9D\xE9\x3F\x99\xE8\x38\x95\xE8" + "\x31\x92\xE8\x28\x8D\xE7\x1E\x88\xE6\x16\x84\xE4\x15\x7E\xDA\x15\x79" + "\x7F\xD1\x14\x75\xCB\x13\x71\xC5\x13\x6E\xBF\x12\x6B\xB9\x12\x67\xB2" + "\x11\x64\xAC\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x10\x71\xC6\x08\x3C\x69\x25\x49\x69\x50\xA3\xED\x48\x9F\xEC\x40" + "\x9B\xEB\x38\x97\xEB\x31\x93\xEA\x29\x8F\xE9\x21\x8B\xE8\x1A\x87\xE8" + "\x19\x86\xE6\x19\x84\xE3\x19\x83\xE1\x19\x83\xE0\x19\x83\xE0\x18\x82" + "\xDF\x18\x7F\xDA\x17\x7C\xD4\x17\x77\xCD\x16\x73\xC6\x15\x6F\xBE\x14" + "\x6A\xB7\x13\x66\xAF\x12\x62\xA8\x24\x2C\x34\x06\x0A\x0E\x0B\x12\x19" + "\x08\x0F\x14\x06\x0D\x12\x07\x0E\x14\x39\x05\x0C\x12\x05\x0C\x12\x04" + "\x0C\x12\x04\x0B\x12\x04\x0B\x12\x04\x0C\x13\x06\x0E\x15\x0C\x14\x1B" + "\x08\x10\x16\x04\x0C\x13\x04\x0D\x16\x04\x0C\x14\x03\x0C\x14\x10\x1E" + "\x2B\x4E\x94\xD2\x24\x8C\xE9\x21\x8B\xE8\x1A\x87\xE8\x13\x65\xAD\x83" + "\x00\x7F\x49\x91\xD1\x4F\xA1\xEA\x46\x9D\xE9\x3F\x99\xE8\x36\x94\xE8" + "\x2D\x8F\xE7\x23\x8A\xE6\x18\x85\xE5\x16\x7F\xDB\x15\x79\xD1\x14\x74" + "\xC8\x13\x6F\xC1\x12\x6C\xBB\x12\x68\xB5\x11\x65\xAF\x11\x62\xA9\x10" + "\x5E\xA3\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x10\x6E\xC1\x0B\x53\x90\x10\x23\x34\x4B\xA1\xED\x46\x9E\xEC\x3C\x99" + "\xEB\x34\x95\xEA\x2C\x91\xE9\x25\x8D\xE9\x1D\x89\xE8\x19\x86\xE6\x19" + "\x84\xE3\x19\x82\xE0\x18\x80\xDC\x18\x80\xDC\x18\x80\xDC\x18\x7F\xDA" + "\x17\x7D\xD6\x17\x7A\xD1\x16\x75\xC9\x15\x7F\x71\xC2\x14\x6C\xBA\x14" + "\x68\xB3\x13\x64\xAB\x14\x60\xA4\x1C\x23\x29\x0A\x0F\x15\x09\x0F\x14" + "\x08\x0E\x13\x07\x0E\x13\x07\x0D\x13\x06\x0D\x13\x05\x0C\x12\x04\x0C" + "\x12\x04\x0B\x12\x03\x0B\x12\x04\x0C\x13\x04\x0C\x13\x03\x0B\x12\x04" + "\x0C\x13\x03\x0B\x12\x03\x0B\x12\x05\x0E\x15\x04\x0D\x15\x05\x10\x19" + "\x3D\x64\x86\x22\x8B\xE8\x1C\x89\xE8\x19\x86\xE5\x18\x82\xDF\x05\x1B" + "\x2F\x2D\x5B\x81\x4F\xA1\xEA\x44\x9C\xE9\x3B\x97\xE8\x32\x92\xE8\x28" + "\x8D\xE7\x1B\x87\xE5\x16\x81\xDF\x15\x79\xD2\x14\x73\xC8\x13\x6F\xBF" + "\x12\x6A\x7F\xB7\x11\x66\xB1\x11\x63\xAB\x10\x5F\xA5\x10\x5C\x9F\x0F" + "\x58\x99\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x10\x6B\xBD\x0F\x67\xB5\x01\x0A\x12\x3E\x8C\xD1\x41\x9C\xEC\x38\x97" + "\xEB\x30\x93\xEA\x28\x8F\xE9\x21\x8B\xE8\x19\x87\xE8\x19\x84\xE2\x18" + "\x82\xDF\x18\x80\xDC\x18\x7E\xD9\x18\x7E\xD8\x18\x7E\xD7\x17\x7D\xD6" + "\x17\x7A\xD1\x16\x77\xCC\x16\x73\xC5\x15\x6F\xBE\x14\x6A\xB6\x13\x66" + "\xAF\x12\x61\xA7\x17\x60\xA1\x10\x15\x1A\x06\x0A\x0E\x0B\x11\x17\x0A" + "\x12\x16\x0E\x17\x1A\x0C\x13\x19\x06\x0C\x14\x7F\x04\x0C\x12\x04\x0B" + "\x12\x03\x0B\x12\x03\x0C\x12\x04\x0C\x13\x06\x0E\x15\x0D\x15\x1A\x11" + "\x1A\x20\x0B\x15\x1E\x03\x0B\x15\x04\x0C\x15\x04\x0D\x18\x04\x0E\x16" + "\x1B\x2F\x40\x2B\x8E\xE7\x19\x87\xE8\x19\x83\xE1\x18\x7F\xDA\x0C\x43" + "\x74\x11\x23\x33\x49\x9E\xE9\x42\x9B\xE9\x37\x94\xE8\x2C\x8F\xE7\x1F" + "\x88\xE6\x16\x83\xE3\x15\x7C\xD6\x14\x74\xC9\x13\x6E\xBF\x12\x69\xB7" + "\x11\x65\xAE\x11\x61\xA7\x10\x5D\xA1\x0F\x5A\x9B\x0F\x56\x95\x0E\x53" + "\x8F\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F" + "\x68\xB8\x0E\x51\x64\xB0\x04\x1F\x38\x2B\x68\x9D\x3C\x99\xEB\x34\x95" + "\xEA\x2C\x91\xE9\x24\x8D\xE9\x1C\x89\xE8\x19\x85\xE5\x18\x82\xDE\x18" + "\x80\xDB\x18\x7E\xD8\x17\x7C\xD5\x17\x7B\xD3\x17\x7B\xD3\x17\x7A\xD1" + "\x16\x77\xCC\x16\x74\xC7\x15\x71\xC1\x14\x6C\xBA\x14\x68\xB2\x13\x63" + "\xAB\x12\x5F\xA3\x12\x5B\x9C\x0E\x12\x16\x08\x0D\x11\x10\x18\x1D\x1A" + "\x82\x25\x42\x1D\x28\x2A\x24\x2B\x35\x0E\x14\x1F\x05\x0C\x14\x05\x0C" + "\x12\x04\x0C\x12\x09\x12\x18\x29\x32\x3C\x4F\x58\x5E\x4E\x57\x59\x31" + "\x39\x3D\x2C\x37\x44\x0A\x14\x21\x04\x0C\x1A\x05\x0F\x1D\x07\x12\x1C" + "\x10\x1E\x2B\x2E\x8E\xE3\x19\x85\xE4\x18\x81\xDD\x18\x7D\xD6\x14\x6B" + "\xB7\x83\x00\x7F\x3C\x8A\xCF\x3D\x98\xE8\x2F\x91\xE8\x23\x8A\xE6\x17" + "\x84\xE5\x15\x7E\xDA\x14\x76\xCD\x13\x6F\xC0\x12\x69\xB6\x11\x64\xAE" + "\x10\x60\xA5\x10\x5B\x9E\x0F\x58\x98\x0E\x54\x92\x0E\x51\x8C\x0D\x4D" + "\x86\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F" + "\x68\xB7\x0E\x63\xAF\x09\x3F\x6E\x14\x33\x4E\x38\x97\xEB\x2F\x92\xEA" + "\x28\x8E\xE9\x20\x8A\xE8\x19\x87\xE8\x19\x83\xE1\x18\x80\xDB\x18\x7E" + "\xD8\x17\x7C\xD5\x17\x7A\xD1\x17\x78\xCF\x17\x78\xCE\x16\x77\xCC\x16" + "\x74\xC7\x15\x71\xC3\x15\x6E\xBD\x14\x6A\xB6\x13\x0B\x66\xAE\x12\x61" + "\xA7\x12\x5D\x9F\x11\x58\x98\x83\x0D\x7F\x0C\x12\x18\x48\x4E\x56\x93" + "\x99\xA0\x8A\x90\x99\x38\x3E\x48\x13\x19\x23\x06\x0C\x15\x05\x0C\x13" + "\x07\x0E\x15\x46\x4D\x54\x8A\x95\x9E\x9B\xA5\xAD\xAB\xB4\xBD\x94\x9C" + "\xA6\x21\x29\x34\x0C\x16\x1E\x03\x0E\x13\x03\x0F\x16\x06\x10\x19\x06" + "\x11\x1B\x2F\x8C\xDF\x19\x82\xE0\x18\x7E\xD9\x17\x7A\xD2\x16\x76\xCB" + "\x07\x25\x41\x1A\x44\x68\x34\x93\xE8\x26\x8C\xE6\x19\x86\xE5\x16\x80" + "\xDD\x14\x78\xD1\x13\x71\xC4\x12\x6A\xB7\x11\x64\xAD\x10\x5F\xA5\x0F" + "\x5A\x9D\x0F\x56\x94\x0E\x52\x8E\x0E\x4F\x88\x0D\x49\x7E\x09\x35\x5D" + "\x17\x59\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F" + "\x67\xB6\x0E\x63\xAE\x0C\x54\x94\x05\x10\x19\x33\x94\xEA\x2E\x92\xEA" + "\x24\x8C\xE9\x1C\x88\xE8\x19\x85\xE4\x18\x80\xDC\x18\x7D\xD7\x17\x7C" + "\xD4\x17\x7A\xD1\x17\x78\xCE\x16\x76\xCB\x16\x76\xCA\x16\x74\xC7\x15" + "\x71\xC3\x15\x6F\xBE\x14\x6C\xB9\x14\x68\xB2\x13\x63\xAA\x12\x5F\xA3" + "\x11\x5B\x9B\x10\x56\x94\x83\x0E\x0D\x25\x2F\x38\x91\x96\x9D\xC5\xC6" + "\xD5\xCD\xCF\xD8\x9F\x82\xA4\x7F\x14\x1B\x1F\x05\x0D\x16\x03\x0C\x17" + "\x1C\x24\x2D\x9B\xA4\xA6\xCC\xD8\xD9\xCE\xDB\xDF\xD1\xDC\xE8\xB4\xBD" + "\xCB\x52\x5B\x67\x08\x11\x17\x03\x0C\x12\x04\x0E\x14\x06\x11\x1A\x06" + "\x10\x1A\x34\x87\xD0\x18\x80\xDB\x17\x7C\xD4\x17\x78\xCD\x16\x74\xC7" + "\x10\x55\x92\x05\x10\x19\x2A\x8E\xE7\x1F\x88\xE6\x16\x82\xE1\x15\x7B" + "\xD4\x14\x73\xC8\x12\x6C\xBB\x11\x65\xAE\x10\x5F\xA5\x0F\x5A\x9C\x0F" + "\x55\x94\x0E\x51\x8B\x0D\x4A\x80\x09\x37\x62\x02\x0F\x1A\x0F\x22\x33" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F\x4A" + "\x67\xB5\x0E\x62\xAD\x0E\x5E\xA5\x01\x09\x11\x28\x81\xCF\x29\x8F\xE9" + "\x1F\x8A\xE8\x19\x87\xE8\x19\x83\xE0\x18\x7E\xD8\x17\x7B\xD4\x17\x79" + "\xD0\x17\x78\xCD\x16\x76\xCA\x16\x74\xC7\x16\x73\xC6\x15\x71\xC3\x15" + "\x6F\xBE\x14\x6C\xB9\x14\x69\xB4\x13\x65\xAE\x12\x61\xA6\x12\x5D\x9F" + "\x11\x58\x97\x13\x55\x91\x83\x0E\x10\x3E\x45\x4C\xB9\xC0\xC6\x7B\x7F" + "\x8D\x9C\xA2\xAB\xDC\xE5\xE4\x38\x82\x43\x7F\x04\x0F\x14\x06\x0F\x19" + "\x49\x53\x61\xD4\xDF\xEB\xB7\xC2\xC4\x5E\x6A\x6D\x7E\x8A\x92\xC3\xCE" + "\xD7\xA1\xAB\xB4\x11\x1A\x23\x04\x0C\x18\x05\x0E\x1D\x03\x0C\x16\x04" + "\x0D\x16\x3A\x7C\xB6\x18\x7D\xD7\x17\x79\xD0\x16\x75\xC9\x15\x71\xC2" + "\x15\x6D\xBB\x02\x0B\x13\x19\x6A\xB2\x16\x84\xE5\x15\x7D\xD8\x14\x75" + "\xCB\x13\x6E\xBF\x12\x67\xB2\x10\x5F\xA5\x0F\x5A\x9C\x0F\x55\x93\x0D" + "\x4E\x87\x0A\x39\x65\x02\x0F\x1A\x11\x23\x34\x39\x7C\xB7\x46\x9E\xEC" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F\x66" + "\xB4\x0E\x47\x62\xAC\x0E\x5D\xA4\x05\x27\x45\x16\x4F\x80\x24\x8D\xE9" + "\x1B\x88\xE8\x19\x85\xE4\x18\x80\xDC\x17\x7C\xD4\x17\x79\xD0\x17\x77" + "\xCD\x16\x73\xC5\x15\x71\xC2\x15\x70\xBF\x15\x6E\xBD\x15\x6D\xBA\x14" + "\x6A\xB6\x14\x67\xB1\x13\x65\xAD\x12\x61\xA7\x12\x5D\xA0\x11\x59\x99" + "\x10\x55\x91\x0F\x51\x8A\x83\x16\x7F\x54\x5B\x61\x69\x6F\x75\x1D\x26" + "\x2A\x5C\x65\x68\xAB\xB3\xB8\x68\x6B\x77\x15\x18\x29\x1B\x21\x2F\x54" + "\x5E\x65\xCE\xD9\xDC\x3A\x40\x4D\x0C\x12\x21\x48\x50\x5D\x65\x70\x76" + "\xD9\xE5\xE6\x38\x42\x45\x04\x0B\x17\x05\x0D\x20\x03\x0C\x16\x03\x0C" + "\x15\x3C\x7B\xB1\x17\x7B\xD3\x16\x77\xCC\x16\x73\xC5\x15\x6F\xBE\x14" + "\x6B\xB7\x08\x2D\x4D\x0A\x3A\x66\x16\x7F\xDC\x14\x78\xCF\x13\x70\xC2" + "\x12\x69\xB5\x11\x61\xA9\x0F\x5A\x9C\x0E\x52\x8F\x0A\x3D\x6A\x02\x10" + "\x1C\x13\x25\x34\x42\x80\xB8\x4F\xA3\xED\x43\x9D\xEC\x3E\x9A\xEB\x17" + "\x50\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F\x65" + "\xB3\x0E\x61\xAB\x0D\x5D\xA3\x08\x3B\x67\x0B\x2E\x4D\x1E\x89\xE8\x19" + "\x86\xE6\x18\x82\xDE\x12\x61\xA6\x0F\x50\x8A\x0E\x4F\x88\x0E\x4E\x86" + "\x0E\x4C\x84\x0E\x4C\x82\x0E\x4A\x80\x07\x24\x3F\x06\x24\x3E\x06\x23" + "\x3C\x06\x22\x3B\x06\x21\x39\x06\x20\x38\x03\x14\x23\x89\x00\x83\x17" + "\x1B\x50\x59\x61\x5F\x65\x6A\x0C\x17\x18\x40\x45\x47\x7C\x77\x7B\x72" + "\x67\x62\x2A\x1F\x16\x2D\x26\x1A\x4B\x49\x39\x82\xC0\x01\xBA\x82\x1B" + "\x79\x26\x07\x0B\x1A\x0A\x10\x20\x38\x41\x4A\xE2\xED\xEB\x4C\x59\x57" + "\x03\x0D\x14\x04\x0C\x19\x04\x0D\x16\x05\x0F\x18\x41\x7A\xAC\x17\x7B" + "\xD3\x16\x77\xCB\x16\x72\xC4\x15\x6E\xBD\x14\x6A\xB6\x10\x5A\x9A\x02" + "\x0D\x17\x15\x79\xD2\x14\x73\xC8\x12\x6B\xB9\x11\x64\xAC\x0F\x5A\x9B" + "\x0A\x41\x70\x03\x11\x1E\x16\x26\x34\x4B\x85\xB9\x5B\xA9\xEE\x4F\xA3" + "\xED\x46\x9E\xEC\x3D\x9A\xEB\x3A\x98\xEB\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F\x65\xB2\x0E\x60\xAA\x0D\x5D\xA2" + "\x08\x39\x66\x8C\x00\x33\x17\x26\x34\x21\x3A\x4F\x20\x39\x4F\x1E\x38" + "\x4F\x1C\x37\x4F\x1B\x36\x4F\x19\x35\x4F\x2F\x6A\x9D\x2B\x67\x9D\x29" + "\x66\x9C\x27\x66\x9C\x26\x64\x9C\x24\x64\x9C\x28\x73\xB5\x31\x93\xEA" + "\x2E\x92\xEA\x2C\x90\xE9\x83\x18\x21\x2D\x36\x3E\x92\x97\x9C\x1C\x20" + "\x24\x1C\x16\x13\x79\x67\x3B\xB7\x9D\x3F\xB6\x9B\x23\xAD\x95\x25\x96" + "\x82\x34\xA8\x99\x6C\x2F\x2A\x1C\x82\x0E\x7F\x12\x0A\x0D\x17\x4C\x52" + "\x60\xE0\xEA\xF1\x4A\x57\x5B\x02\x0C\x14\x04\x0D\x18\x02\x0B\x13\x03" + "\x0C\x14\x42\x79\xA9\x17\x7B\xD2\x16\x76\xCB\x16\x72\xC4\x15\x6E\xBC" + "\x14\x6A\xB5\x13\x65\xAE\x03\x15\x24\x0D\x4D\x85\x13\x6E\xBE\x11\x63" + "\xAC\x0C\x48\x7E\x03\x13\x21\x19\x27\x34\x53\x8A\xBA\x66\xAF\xEF\x5A" + "\xA9\xEE\x52\xA4\xED\x49\xA0\xEC\x40\x9B\xEB\x39\x97\xEB\x35\x95\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0F\x64" + "\xB1\x0E\x60\xA9\x0D\x5B\xA1\x04\x1C\x33\x35\x51\x6A\x79\xB9\xF1\x72" + "\xB5\xF0\x7F\x6D\xB3\xF0\x68\xB0\xEF\x63\xAD\xEF\x5E\xAB\xEE\x59\xA8" + "\xEE\x4F\xA3\xED\x4A\xA0\xEC\x45\x9E\xEC\x40\x9B\xEB\x3C\x99\xEB\x39" + "\x98\xEB\x36\x96\xEA\x34\x95\xEA\x31\x93\xEA\x2E\x92\xEA\x2B\x90\xE9" + "\x28\x8F\xE9\x25\x8D\xE9\x1F\x30\x3E\x0E\x12\x18\xAA\xAD\xB1\x81\x75" + "\x68\x77\x62\x23\xBF\xA4\x23\xE0\xBC\x1F\xE5\xBE\x25\xDA\xB6\x2C\xBF" + "\xA5\x20\xCC\xBA\x38\xAA\xA2\x44\x52\x4C\x1A\x5C\x58\x37\xC4\xC5\xBE" + "\xB4\xB6\xC3\x1C\x23\x2F\x04\x0D\x1B\x03\x0D\x1D\x04\x0F\x19\x03\x0C" + "\x15\x37\x5A\x7A\x17\x7A\xD2\x16\x76\xCB\x15\x50\x72\xC3\x15\x6E\xBC" + "\x14\x69\xB5\x13\x65\xAD\x0C\x40\x6D\x06\x24\x3E\x0D\x4F\x8B\x03\x15" + "\x24\x1C\x29\x35\x5E\x8F\xBB\x71\xB5\xF0\x64\xAE\xEF\x5D\xAA\xEE\x54" + "\xA6\xED\x4C\xA1\xED\x43\x9D\xEC\x3B\x98\xEB\x35\x95\xEA\x31\x93\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0E\x64" + "\xB0\x0E\x5F\xA8\x0B\x4E\x89\x83\x00\x6F\x58\x8C\xBA\x71\xB5\xF0\x68" + "\xB0\xEF\x63\xAD\xEF\x5E\xAB\xEE\x59\xA8\xEE\x53\xA5\xED\x4E\xA2\xED" + "\x49\xA0\xEC\x43\x9D\xEC\x3E\x9A\xEB\x3A\x98\xEB\x39\x97\xEB\x36\x96" + "\xEA\x33\x94\xEA\x30\x93\xEA\x2D\x91\xEA\x2A\x90\xE9\x27\x8E\xE9\x25" + "\x8D\xE9\x22\x8B\xE8\x32\x5D\x80\x0C\x07\x09\x5F\x55\x49\xBC\x98\x4C" + "\xCE\xA3\x29\xE3\xBA\x1E\xE4\xBF\x19\xE3\xC4\x23\xE1\xC9\x2F\xDE\xC8" + "\x38\xDE\xC7\x41\xD9\xC6\x3D\xD2\xC1\x27\xC8\xB5\x2A\xC2\xB1\x53\x6B" + "\x5F\x44\x82\x0F\x25\x14\x04\x0A\x14\x02\x0C\x15\x03\x0D\x16\x04\x10" + "\x1A\x30\x4E\x68\x1D\x7D\xD2\x16\x76\xCA\x15\x72\xC3\x15\x6D\xBC\x14" + "\x69\xB4\x13\x65\xAD\x0C\x3E\x6C\x83\x00\x7F\x20\x2B\x35\x6F\x98\xBC" + "\x82\xBE\xF2\x73\xB6\xF1\x68\xB0\xEF\x5E\xAB\xEE\x56\xA7\xEE\x4F\xA3" + "\xED\x46\x9E\xEC\x3D\x9A\xEB\x35\x95\xEA\x30\x93\xEA\x2D\x91\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0E\x63\xAF" + "\x0E\x5F\xA7\x07\x31\x56\x17\x27\x34\x6D\xB3\xF0\x67\xAF\xEF\x62\xAD" + "\xEF\x5D\xAA\xEE\x57\xA7\xEE\x52\xA4\xED\x4D\xA2\xED\x47\x9F\xEC\x42" + "\x9C\xEC\x3D\x99\xEB\x38\x97\xEB\x35\x95\xEA\x35\x95\xEA\x32\x94\xEA" + "\x2F\x92\xEA\x2C\x91\xE9\x2A\x8F\xE9\x27\x8E\xE9\x24\x8C\xE9\x21\x8B" + "\xE8\x1E\x7F\x89\xE8\x33\x70\xA9\x2B\x1A\x0B\x87\x6E\x2A\xC5\x9B\x20" + "\xDF\xB0\x25\xE6\xBA\x22\xE5\xC2\x1E\xE0\xC5\x23\xDE\xC8\x35\xDF\xC8" + "\x44\xDC\xC7\x3F\xCF\xCA\x20\xD2\xC2\x1D\xD9\xC1\x1C\xD0\xB6\x27\xBB" + "\xAA\x46\x32\x2E\x1E\x04\x0D\x14\x02\x10\x14\x02\x0B\x13\x03\x0D\x15" + "\x1D\x32\x44\x32\x87\xD1\x16\x76\xCA\x15\x71\xC2\x15\x6D\xBB\x14\x69" + "\xB4\x13\x65\xAD\x07\x2A\x47\x32\x43\x51\x93\xC7\xF4\x84\xBE\xF2\x78" + "\xB9\xF1\x6D\xB3\xF0\x62\xAD\xEF\x58\xA7\xEE\x50\xA3\xED\x49\xA0\xEC" + "\x40\x9B\xEB\x38\x97\xEB\x30\x93\xEA\x2C\x91\x7F\xE9\x28\x8F\xE9\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0E\x63\xAE" + "\x0E\x5E\xA6\x02\x13\x23\x51\x89\xBA\x69\xB0\xF0\x60\xAC\xEF\x5B\xA9" + "\xEE\x56\xA7\xEE\x51\xA4\xED\x4B\xA1\xED\x46\x9E\xEC\x41\x9C\xEC\x3C" + "\x99\xEB\x36\x96\xEA\x31\x93\xEA\x31\x93\xEA\x31\x93\xEA\x2F\x92\xEA" + "\x2C\x91\xE9\x29\x8F\xE9\x26\x8E\xE9\x23\x8C\xE9\x20\x8B\xE8\x1D\x89" + "\xE8\x1B\x88\xE8\x38\x79\xB8\x4B\x33\x12\xAD\x8C\x22\xD0\xA2\x1D\xE4" + "\xB3\x24\xE8\xBD\x1D\xE4\xC5\x16\xDF\xC9\x22\xDE\xCA\x39\xDE\xC9\x3D" + "\xD4\xC3\x24\x0E\xCD\xC7\x1B\xCF\xB8\x2A\xC9\xA2\x1C\xBB\x93\x16\xBD" + "\xA1\x82\x35\x7F\x2E\x1D\x05\x0E\x14\x02\x0F\x14\x01\x0B\x12\x02\x0B" + "\x13\x18\x2A\x39\x3A\x88\xCD\x16\x75\xC9\x15\x71\xC2\x15\x6D\xBB\x14" + "\x69\xB3\x13\x64\xAC\x03\x14\x23\x50\x6D\x86\x8B\xC2\xF3\x7E\xBB\xF2" + "\x72\xB5\xF0\x67\xAF\xEF\x5C\xA9\xEE\x51\xA4\xED\x4A\xA0\xEC\x42\x9C" + "\xEC\x3B\x98\xEB\x32\x94\xEA\x2B\x90\xE9\x28\x8E\xE9\x24\x8C\xE9\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0E\x62\xAD" + "\x0B\x51\x8D\x0B\x13\x1A\x65\xAE\xEF\x64\xAE\xEF\x5A\xA9\xEE\x55\xA6" + "\xEE\x4F\xA3\xED\x4A\xA0\xEC\x45\x9E\xEC\x3F\x9B\x7F\xEB\x3A\x98\xEB" + "\x35\x95\xEA\x30\x93\xEA\x2D\x91\xEA\x2C\x91\xE9\x2C\x91\xE9\x2B\x90" + "\xE9\x28\x8F\xE9\x25\x8D\xE9\x22\x8C\xE8\x20\x8A\xE8\x1D\x89\xE8\x1A" + "\x87\xE8\x19\x87\xE7\x43\x74\xA6\x33\x21\x0D\x81\x63\x10\xCE\xA5\x23" + "\xE4\xB8\x25\xE4\xBC\x1E\xE7\xC8\x26\xDF\xC7\x31\xDB\xC7\x3A\xD8\xC3" + "\x32\xD3\xBB\x27\xBF\xA0\x26\xB3\x89\x1F\xC7\x9B\x1D\xC7\xA4\x18\xA1" + "\x8B\x2A\x27\x1F\x17\x07\x0D\x1E\x0F\x1D\x25\x0C\x17\x1F\x04\x0D\x15" + "\x03\x0C\x14\x46\x79\xA6\x17\x76\xC9\x15\x71\xC1\x15\x6D\xBA\x14\x68" + "\xB3\x0F\x55\x93\x83\x00\x7F\x7C\xAC\xD7\x87\xC0\xF3\x77\xB8\xF1\x6C" + "\xB2\xF0\x61\xAC\xEF\x55\xA6\xEE\x4B\xA1\xED\x43\x9D\xEC\x3C\x99\xEB" + "\x34\x95\xEA\x2C\x91\xE9\x27\x8E\xE9\x23\x8C\xE9\x20\x8A\xE8\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0E\x61\xAC\x07" + "\x33\x59\x35\x5F\x84\x60\xAC\xEF\x59\xA8\xEE\x53\xA5\xED\x4E\xA2\xED" + "\x49\xA0\xEC\x43\x9D\xEC\x3E\x9A\xEB\x39\x97\xEB\x34\x95\xEA\x2E\x92" + "\xEA\x29\x8F\xE9\x28\x8F\xE9\x28\x8F\xE9\x28\x8F\xE9\x27\x8E\xE9\x25" + "\x8D\xE9\x22\x8B\xE8\x1F\x8A\xE8\x1C\x88\xE8\x19\x87\xE8\x19\x7F\x86" + "\xE6\x1B\x86\xE3\x42\x71\x9B\x15\x12\x16\x5B\x47\x24\x8C\x6D\x1D\xC7" + "\xA3\x29\xE1\xBC\x32\xE7\xC5\x3B\xDC\xC0\x39\xCA\xB1\x2E\xAF\x94\x25" + "\x9A\x76\x1E\xAF\x7E\x1D\xCA\x9B\x25\xC2\x9E\x22\xB1\x9B\x2B\x8D\x82" + "\x51\x24\x22\x25\x06\x0A\x1B\x3E\x45\x4B\x5D\x65\x6C\x30\x3B\x45\x04" + "\x0D\x15\x2C\x46\x5D\x2A\x80\xCA\x16\x71\xC1\x14\x6C\xBA\x14\x68\xB2" + "\x0C\x41\x6F\x0F\x15\x1A\x88\xC1\xF3\x7D\xBB\xF2\x71\xB5\xF0\x66\xAF" + "\xEF\x5B\xA9\xEE\x4F\xA3\xED\x44\x9D\xEC\x3D\x99\xEB\x35\x95\xEA\x2E" + "\x92\xEA\x26\x8E\xE9\x23\x8C\x7F\xE9\x1F\x8A\xE8\x1B\x88\xE8\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0E\x60\xAA\x02" + "\x14\x24\x5C\xAA\xEE\x5C\xAA\xEE\x52\xA4\xED\x4D\xA2\xED\x47\x9F\xEC" + "\x42\x9C\xEC\x3D\x99\xEB\x38\x97\xEB\x32\x94\xEA\x2D\x91\xEA\x28\x8E" + "\xE9\x24\x8D\xE9\x24\x8C\xE9\x24\x8C\xE9\x23\x8C\xE9\x23\x8C\xE9\x21" + "\x8B\xE8\x1E\x89\xE8\x1C\x88\xE8\x19\x87\xE8\x19\x86\xE6\x19\x84\xE3" + "\x1C\x83\xE0\x46\x89\xC2\x27\x2E\x3A\xA4\x9B\x99\x8D\x78\x53\x85\x6A" + "\x23\xA9\x89\x23\xB8\x92\x27\xAE\x88\x23\xA2\x82\x18\xA8\x88\x1F\x7F" + "\xB7\x94\x27\xBB\x96\x23\xB2\x92\x2E\xB5\x9C\x5F\xBD\xB2\x93\xB5\xB6" + "\xB9\x49\x51\x5A\x06\x0C\x19\x1D\x22\x29\x6F\x76\x7E\x6F\x77\x7F\x1B" + "\x25\x2D\x06\x10\x19\x46\x7A\xA9\x17\x70\xBF\x14\x6B\xB8\x13\x67\xB1" + "\x06\x20\x37\x3D\x55\x6B\x83\xBE\xF2\x76\xB8\xF1\x6B\xB2\xF0\x60\xAC" + "\xEF\x54\xA6\xED\x49\xA0\xEC\x3E\x9A\xEB\x36\x96\xEA\x2F\x92\xEA\x27" + "\x8E\xE9\x21\x8B\xE8\x1E\x8A\xE8\x1B\x88\xE8\x19\x87\xE7\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x0A\x48\x7F\x26\x4A" + "\x69\x58\xA7\xEE\x51\xA4\xED\x4B\x7F\xA1\xED\x46\x9E\xEC\x41\x9C\xEC" + "\x3C\x99\xEB\x36\x96\xEA\x31\x93\xEA\x2C\x91\xE9\x26\x8E\xE9\x21\x8B" + "\xE8\x20\x8A\xE8\x20\x8A\xE8\x1F\x8A\xE8\x1F\x8A\xE8\x1F\x8A\xE8\x1D" + "\x89\xE8\x1B\x88\xE8\x19\x87\xE8\x19\x85\xE5\x19\x84\xE2\x19\x82\xDF" + "\x1C\x82\xDB\x44\x85\xBD\x25\x2D\x38\xAA\xA9\xAE\xB5\xAB\xA0\x9D\x8D" + "\x61\x92\x78\x23\xB8\x95\x1B\xBD\x96\x19\xBB\x94\x21\xB1\x8B\x20\xA7" + "\x87\x22\xA7\x9A\x51\xB9\xAC\x8E\xC0\xB7\xB4\xD4\xD5\xDB\xC8\xD4\xDA" + "\x9A\xA8\xB6\x1C\x25\x31\x06\x0D\x15\x36\x3D\x44\x58\x60\x67\x15\x1D" + "\x7F\x24\x03\x0B\x13\x2B\x43\x58\x24\x75\xBD\x17\x6A\xB4\x13\x64\xAC" + "\x01\x0A\x12\x58\x7F\xA1\x7F\xBC\xF2\x70\xB4\xF0\x65\xAE\xEF\x5A\xA8" + "\xEE\x4E\xA3\xED\x43\x9D\xEC\x38\x97\xEB\x30\x93\xEA\x28\x8F\xE9\x21" + "\x8B\xE8\x1C\x88\xE8\x19\x87\xE8\x19\x87\xE8\x19\x86\xE7\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x05\x29\x47\x4A\x92" + "\xD2\x53\xA5\xED\x4A\xA0\xEC\x45\x9E\xEC\x3F\x9B\xEB\x3A\x98\xEB\x35" + "\x95\xEA\x30\x93\xEA\x2A\x90\xE9\x25\x8D\xE9\x20\x8A\xE8\x1C\x88\xE8" + "\x1B\x88\xE8\x1B\x88\xE8\x1B\x88\xE8\x22\x1B\x88\xE8\x1A\x88\xE8\x1A" + "\x87\xE8\x19\x87\xE7\x19\x85\xE4\x19\x83\xE1\x18\x82\xDE\x19\x7F\xDA" + "\x30\x87\xD3\x25\x39\x4A\x25\x2C\x32\xAF\x82\xB4\x2B\xBC\xB9\xB7\xBB" + "\xB3\xAE\xA0\x8E\x6F\x8E\x72\x34\x90\x72\x2B\x90\x74\x38\x93\x79\x49" + "\xAD\x99\x72\xB4\xB5\xAC\xBB\xBE\xC3\xD5\xDB\xDF\xE6\xEE\xF7\xE3\xF0" + "\xF6\xD3\xDF\xE9\x5B\x82\x67\x1B\x03\x0D\x10\x04\x0C\x13\x08\x0F\x16" + "\x03\x0C\x13\x03\x0B\x12\x09\x13\x1B\x45\x79\xA8\x14\x67\xAF\x0F\x54" + "\x90\x83\x00\x3E\x80\xBD\xF2\x7A\xB9\xF1\x6A\xB1\xF0\x5F\xAB\xEF\x53" + "\xA5\xED\x48\x9F\xEC\x3D\x99\xEB\x31\x94\xEA\x29\x8F\xE9\x22\x8B\xE8" + "\x1A\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE7\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x1A\x36\x82\x4F" + "\x50\xA3\xED\x49\xA0\xEC\x43\x9D\xEC\x3E\x9A\xEB\x39\x97\xEB\x34\x95" + "\xEA\x2F\x92\xEA\x29\x8F\xE9\x24\x8D\xE9\x1F\x8A\xE8\x1A\x87\xE8\x19" + "\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8" + "\x19\x87\xE8\x19\x86\xE6\x19\x85\xE4\x19\x83\xE1\x19\x80\xDC\x21\x81" + "\xD6\x3E\x66\x89\x05\x0D\x14\x2C\x34\x3A\xCF\xD6\xDC\x82\xCC\x7F\xD0" + "\xB6\xBA\xBF\xB7\xB8\xB4\xB0\xAE\xA1\xAD\xAC\x9B\xAE\xB0\xA2\xB0\xB5" + "\xAD\xB3\xBB\xB9\xC0\xC8\xCD\xD4\xDC\xE3\xE5\xED\xF4\xE5\xED\xF5\xE6" + "\xEE\xF5\xE5\xED\xF4\xB4\xBC\xC2\x15\x1D\x23\x02\x0A\x11\x04\x0B\x12" + "\x02\x0A\x11\x03\x0B\x11\x03\x0B\x11\x26\x3A\x4B\x2C\x72\xB0\x0A\x34" + "\x59\x2B\x3F\x50\x7C\xBA\xF1\x6F\xB4\xF0\x64\xAE\xEF\x59\xA8\xEE\x4D" + "\xA2\xED\x42\x9C\xEC\x37\x96\xEB\x2B\x90\xE9\x23\x8C\xE9\x1D\x89\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x67\x17\x96\xEA\x17\x96\xEA\x3C\x7D\xB8" + "\x4E\xA2\xED\x46\x9E\xEC\x41\x9B\xEC\x3C\x99\xEB\x36\x96\xEA\x31\x93" + "\xEA\x2C\x91\xE9\x27\x8E\xE9\x22\x8C\xE8\x1D\x89\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8" + "\x19\x87\xE8\x19\x87\xE7\x19\x85\xE4\x19\x82\xDF\x1D\x80\xD9\x47\x80" + "\xB3\x18\x28\x37\x08\x11\x19\x65\x6C\x72\xE3\xEA\xF1\xE0\xE4\xEA\xC9" + "\xCC\xD3\xB4\xB8\xBD\xB7\xB9\xBA\xB7\x82\xB9\x7F\xB4\xB8\xB9\xB3\xBC" + "\xC0\xCB\xD5\xDA\xDE\xE6\xED\xE6\xEE\xF5\xE5\xED\xF4\xE7\xEF\xF6\xE6" + "\xEE\xF5\xE5\xED\xF4\xE2\xEA\xF1\x58\x60\x66\x04\x0B\x12\x03\x0B\x11" + "\x02\x0A\x11\x03\x0B\x12\x04\x0C\x12\x07\x0F\x17\x41\x66\x86\x0D\x25" + "\x3A\x46\x68\x85\x77\xB8\xF1\x69\xB1\xF0\x5E\xAB\xEE\x52\xA5\xED\x47" + "\x9F\xEC\x3C\x99\xEB\x30\x93\xEA\x27\x8E\xE9\x21\x8B\xE8\x1C\x88\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE7\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x4E\xA2\xED\x48" + "\xA0\xEC\x43\x7F\x9D\xEC\x3E\x9A\xEB\x39\x98\xEB\x34\x95\xEA\x2F\x92" + "\xEA\x2A\x90\xE9\x25\x8D\xE9\x20\x8A\xE8\x1B\x88\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x84\xE2\x1C\x82\xDC\x3D\x8B\xD0\x1E\x30" + "\x41\x06\x0F\x18\x2E\x3B\x46\xBF\xC6\xCC\xE6\xEC\xF3\xE4\xEB\xF1\xDD" + "\xDE\xE3\xBE\xC6\xD3\xB7\xBA\xC6\xB7\xBA\xC5\xBC\xC1\xCC\xD5\xDE\xE8" + "\xE2\xEE\xF5\xE5\xED\xF4\xE6\xEE\xF5\xE7\xEF\xF6\xE5\xED\xF4\xE6\xEE" + "\xF4\xE6\xEE\xF4\xE8\xEF\xF6\xAD\xB4\xBB\x0F\x16\x13\x1D\x02\x09\x0F" + "\x02\x09\x10\x02\x09\x0F\x03\x0A\x11\x02\x08\x0E\x0B\x14\x1C\x83\x33" + "\x7F\x6D\xA4\xD5\x73\xB5\xF0\x63\xAD\xEF\x58\xA7\xEE\x4C\xA2\xED\x41" + "\x9C\xEC\x37\x97\xEB\x2E\x92\xEA\x26\x8D\xE9\x1F\x8A\xE8\x1A\x87\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x84\xE3\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x4E\xA2\xED\x46" + "\x9E\xEC\x41\x9C\xEC\x3C\x99\xEB\x37\x96\xEB\x32\x94\xEA\x2D\x91\xEA" + "\x28\x8F\xE9\x23\x8C\xE9\x1E\x89\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x86\xE5\x19\x82\xDF\x29\x7F\x87\xD9\x29\x42\x58\x02\x0A" + "\x11\x0D\x18\x21\xA8\xAF\xB5\xE5\xEC\xF1\xE6\xEC\xF2\xE4\xED\xEF\xE3" + "\xE4\xE3\xE2\xEB\xF5\xDA\xE0\xED\xDC\xE2\xF1\xE2\xEA\xF6\xE4\xED\xF7" + "\xE5\xEF\xF6\xE6\xEE\xF5\xE5\xED\xF4\xE7\xEF\xF6\xE6\xEE\xF4\xE7\xEE" + "\xF5\xE7\xEE\xF5\xE5\xEC\xF3\xDA\xE1\xE7\x39\x40\x47\x02\x09\x0F\x03" + "\x0A\x11\x02\x09\x0F\x02\x09\x0F\x02\x08\x0E\x02\x07\x0C\x20\x22\x23" + "\x83\xBA\xEB\x69\xB0\xEF\x5E\xAA\xEE\x52\xA4\xED\x48\x9F\xEC\x3F\x9B" + "\xEB\x36\x96\xEA\x2D\x91\xEA\x24\x8D\xE9\x1E\x89\xE8\x19\x87\xE8\x19" + "\x87\x7F\xE8\x19\x87\xE8\x19\x87\xE8\x19\x85\xE4\x19\x82\xDF\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x4E\xA2\xED\x44" + "\x9D\xEC\x3F\x9B\xEB\x3A\x98\xEB\x35\x95\xEA\x30\x93\xEA\x2B\x90\xE9" + "\x26\x8D\xE9\x21\x8B\xE8\x1C\x88\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19" + "\x85\xE5\x1B\x84\xE1\x19\x80\xDB\x46\x87\xBF\x08\x12\x1B\x03\x0B\x12" + "\x57\x5F\x67\xDF\xE6\xEC\xE6\xEC\xF2\xE6\xEC\xF1\xE5\xED\xEC\xE4\xE7" + "\xE4\xE7\xEC\xEF\xE7\xEF\xF9\xE6\xEF\xF9\x7F\xE6\xEE\xF8\xE6\xEF\xF4" + "\xE7\xF0\xF3\xE7\xEF\xF6\xE5\xED\xF4\xE6\xEE\xF4\xE5\xED\xF3\xE6\xED" + "\xF4\xE7\xEE\xF5\xE6\xED\xF3\xE5\xEC\xF2\x61\x68\x6E\x03\x0A\x0F\x02" + "\x09\x0F\x01\x07\x0D\x01\x07\x0D\x01\x07\x0C\x00\x03\x06\x05\x07\x09" + "\x4B\x60\x72\x6E\xB2\xED\x59\xA8\xEE\x50\xA3\xED\x47\x9F\xEC\x3E\x9A" + "\xEB\x35\x95\xEA\x2C\x91\xE9\x23\x8C\xE9\x1C\x88\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x87\xE8\x19\x85\xE5\x19\x83\xE0\x18\x7F\xDA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x47\x9F\xEC\x42\x9C" + "\xEC\x3D\x51\x99\xEB\x38\x97\xEB\x33\x94\xEA\x2E\x92\xEA\x29\x8F\xE9" + "\x23\x8C\xE9\x1E\x8A\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x85\xE4\x19" + "\x83\xE0\x1C\x82\xDC\x40\x8C\xCE\x18\x29\x38\x05\x0E\x15\x0F\x17\x1E" + "\x98\x9F\xA5\xE4\xEB\xF0\xE5\xEB\xF1\xE6\xED\xF2\xE6\xED\xEF\xE5\x82" + "\xE8\x7F\xE5\xE9\xE8\xE5\xEE\xF4\xE6\xEF\xF5\xE6\xEF\xF4\xE6\xEF\xF2" + "\xE6\xEE\xF2\xE6\xEE\xF4\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF4\xE6\xED" + "\xF4\xE6\xED\xF3\xE5\xEC\xF2\xE7\xED\xF3\x98\x9F\xA5\x09\x10\x16\x03" + "\x0A\x10\x02\x08\x0E\x01\x07\x0C\x01\x07\x0C\x00\x01\x02\x07\x0A\x0E" + "\x0F\x15\x1C\x6C\x93\xB6\x5D\xAA\xEE\x4E\xA3\xED\x46\x9E\xEC\x3D\x99" + "\xEB\x34\x95\xEA\x2B\x90\xE9\x22\x8C\xE8\x1B\x88\xE8\x19\x87\xE8\x19" + "\x87\xE8\x19\x85\xE4\x18\x81\xDE\x18\x7E\xD8\x17\x7A\xD1\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x4F\x96\xEA\x45\x9E\xEC\x40" + "\x9B\xEB\x3B\x98\xEB\x35\x96\xEA\x30\x93\xEA\x2B\x90\xE9\x26\x8E\xE9" + "\x21\x8B\xE8\x1C\x88\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87" + "\xE8\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x84\xE3\x18\x82\xDF\x19" + "\x7F\xDA\x3B\x8B\xD2\x25\x3C\x51\x05\x0E\x16\x04\x0C\x12\x28\x2F\x35" + "\xA1\xA7\xAD\xD9\xDF\x82\xE5\x08\xEC\xF1\xE5\xEB\xF1\xE6\xEA\xF2\x82" + "\xE4\x02\xE8\xE1\x82\xE0\x06\xDD\xDE\xD9\xDE\xDF\xDA\x82\xE3\x04\xDF" + "\xE7\xE9\xEA\x82\xE6\x2B\xEA\xE5\xE7\xE9\xE6\xE8\xEA\xE3\xE5\xE7\xE3" + "\xE5\xE7\xE0\xE4\xE8\xDB\xE0\xE4\xD4\xD8\xDC\xD6\xDB\xDF\xC9\xCE\xD2" + "\x23\x27\x2A\x01\x06\x0A\x02\x08\x0D\x01\x07\x0C\x01\x06\x0B\x83\x00" + "\x7F\x0A\x0F\x14\x0F\x15\x1C\x18\x22\x2B\x6F\xA5\xD5\x4D\xA2\xED\x44" + "\x9D\xEC\x3C\x99\xEB\x33\x94\xEA\x2A\x90\xE9\x21\x8B\xE8\x19\x87\xE8" + "\x19\x86\xE6\x19\x84\xE2\x18\x80\xDC\x17\x7C\xD5\x17\x79\xCF\x16\x75" + "\xC8\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x42" + "\x9C\xEC\x3D\x9A\xEB\x38\x97\xEB\x33\x94\xEA\x2E\x92\xEA\x29\x8F\xE9" + "\x23\x8C\xE9\x1E\x89\xE8\x19\x87\xE8\x19\x86\xE6\x19\x86\xE6\x19\x86" + "\xE5\x19\x85\xE5\x19\x85\xE5\x19\x84\xE3\x18\x82\xDF\x18\x7F\xDA\x17" + "\x7D\xD6\x27\x82\xD2\x2F\x4C\x65\x02\x25\x0A\x11\x04\x0C\x14\x04\x0B" + "\x11\x51\x58\x5E\x98\x9F\xA4\xB6\xBD\xC2\xD4\xDA\xDF\xE2\xE7\xEC\xE4" + "\xE5\xEB\xE5\xE3\xE7\xE1\xE4\xE7\xDB\xE0\xE3\xE2\xE7\x82\xE9\x29\xED" + "\xF0\xEA\xED\xF2\xEA\xED\xF1\xEA\xEE\xF1\xE3\xE7\xEB\xD6\xDA\xDE\xCA" + "\xCE\xD2\xBE\xC1\xC4\xBA\xBC\xBE\xB8\xBA\xBC\xB7\xBA\xBC\xCE\xD1\xD3" + "\x71\x74\x76\x05\x07\x08\x83\x05\x83\x0B\x86\x00\x7F\x09\x0F\x13\x09" + "\x0E\x13\x09\x10\x16\x3B\x51\x64\x62\xA8\xE8\x43\x9D\xEC\x3A\x98\xEB" + "\x31\x93\xEA\x27\x8E\xE9\x1C\x88\xE8\x19\x84\xE3\x19\x82\xDF\x18\x7E" + "\xD9\x17\x7B\xD3\x16\x77\xCC\x16\x73\xC6\x15\x70\xC0\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x3D\x9A\xEB\x38\x97\xEB" + "\x32\x94\xEA\x2D\x91\xEA\x27\x8E\xE9\x22\x8B\xE8\x1C\x89\xE8\x19\x87" + "\xE7\x19\x84\xE2\x19\x84\xE2\x19\x83\xE1\x19\x83\xE1\x19\x83\xE0\x18" + "\x82\xDF\x18\x7F\xDA\x17\x7D\xD6\x17\x7A\xD1\x17\x77\xCD\x46\x7D\xAC" + "\x05\x0E\x16\x03\x15\x0B\x11\x03\x0A\x11\x0D\x14\x1A\x7E\x85\x8A\xB3" + "\xB9\xBE\xD4\xDA\xDF\xE3\xE8\xEC\xE4\x82\xE5\x82\xE6\x40\xE7\xEA\xED" + "\xF1\xEB\xF0\xF5\xE5\xEB\xF0\xEB\xF1\xF6\xEC\xF2\xF7\xEC\xF1\xF7\xEB" + "\xF1\xF7\xEB\xF1\xF7\xEB\xF1\xF7\xEA\xF1\xF7\xE5\xEC\xF2\xDC\xE3\xE9" + "\xD0\xD7\xDE\xC4\xCB\xD2\xB9\xC1\xC7\xBC\xC3\xCA\xD1\xD9\xE0\x38\x40" + "\x47\x09\x11\x18\x23\x2C\x33\x14\x1C\x24\x83\x06\x7F\x0C\x11\x16\x09" + "\x0E\x13\x08\x0E\x13\x0A\x11\x18\x4F\x6F\x8C\x47\x9E\xEB\x36\x96\xEA" + "\x2B\x90\xE9\x20\x8B\xE8\x19\x86\xE6\x18\x81\xDD\x18\x7D\xD6\x17\x79" + "\xD0\x16\x76\xCA\x15\x72\xC3\x15\x6E\xBD\x14\x6A\xB7\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x24\x64\x9C\x31\x93\xEA" + "\x2B\x90\xE9\x26\x8E\xE9\x21\x8B\xE8\x1B\x88\xE8\x19\x86\xE6\x19\x83" + "\xE0\x18\x81\xDD\x18\x81\xDD\x18\x81\xDD\x18\x80\xDC\x18\x7F\xDA\x17" + "\x7C\xD6\x17\x7A\xD1\x17\x77\xCD\x16\x75\xC8\x1C\x76\xC5\x33\x4F\x68" + "\x03\x0B\x11\x10\x12\x1A\x22\x0E\x15\x1A\x30\x36\x3C\xB1\xB7\xBC\xDD" + "\xE3\xE8\xE6\xEB\xEF\xE4\x83\xE5\x82\xE6\x42\xED\xF1\xF6\xEC\xF1\xF6" + "\xED\xF3\xF8\xEB\xF1\xF6\xEB\xF1\xF7\xEB\xF1\xF7\xEB\xF1\xF7\xEB\xF1" + "\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE8\xEF\xF6\xEA\xF1\xF7\xEA" + "\xF1\xF7\xE3\xEA\xF1\xD6\xDE\xE5\xC1\xC9\xD0\xC7\xCF\xD6\x90\x98\xA0" + "\x08\x11\x18\x05\x0F\x17\x15\x1D\x24\x83\x1C\x7F\x0C\x11\x16\x09\x0E" + "\x13\x0A\x10\x16\x08\x0F\x15\x14\x1F\x28\x59\xA0\xDF\x31\x93\xEA\x25" + "\x8D\xE9\x1A\x87\xE8\x19\x82\xE0\x17\x7C\xD4\x17\x78\xCE\x16\x74\xC7" + "\x15\x70\xC1\x15\x6D\xBA\x14\x69\xB4\x13\x65\xAE\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x04\x0F\x19\x1C\x60\x9B\x25" + "\x8D\xE9\x1F\x8A\xE8\x1A\x87\xE8\x19\x85\xE4\x18\x82\xDF\x18\x7F\xD9" + "\x18\x7E\xD9\x18\x7E\xD8\x18\x7E\xD8\x17\x7C\xD5\x17\x7A\xD1\x16\x77" + "\xCD\x16\x75\xC8\x16\x72\xC4\x15\x70\xBF\x31\x7C\xBE\x1C\x2C\x3A\x0B" + "\x13\x1B\x25\x0F\x2C\x32\x07\x0D\x12\x7B\x82\x87\xDF\xE5\xEA\xE5\xEA" + "\xEE\xE3\x82\xE4\x01\xE5\x82\xE6\x45\xED\xF2\xF7\xEC\xF2\xF7\xEC\xF2" + "\xF7\xEC\xF2\xF8\xEA\xF0\xF6\xEB\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xEA" + "\xF1\xF7\xE9\xF0\xF6\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE8\xEF\xF6" + "\xE8\xF0\xF6\xE9\xF0\xF7\xE6\xEE\xF5\xDB\xE3\xEA\xC0\xC8\xD0\xC4\xCD" + "\xD4\x3C\x44\x4C\x04\x0C\x14\x05\x0D\x14\x83\x12\x7F\x19\x1F\x24\x0A" + "\x10\x15\x08\x0E\x14\x06\x0D\x13\x05\x0D\x13\x46\x6A\x8A\x30\x92\xE9" + "\x1F\x8A\xE8\x19\x85\xE4\x17\x7C\xD6\x16\x76\xCB\x16\x73\xC5\x15\x6F" + "\xBE\x14\x6B\xB8\x14\x68\xB2\x13\x64\xAB\x12\x60\xA5\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x1F\x7C\xCE\x03\x0F\x19" + "\x14\x5B\x9A\x19\x87\xE8\x19\x84\xE3\x18\x81\xDD\x18\x7E\xD8\x17\x7C" + "\xD5\x17\x7C\xD4\x17\x7C\xD4\x17\x7A\xD1\x16\x77\xCC\x16\x75\xC8\x16" + "\x72\xC4\x15\x6F\xBF\x15\x6D\xBB\x15\x6B\xB6\x41\x7A\xAD\x09\x11\x18" + "\x15\x1D\x23\x10\x0B\x16\x1B\x1A\x20\x25\xCA\xCF\xD5\xE5\xE8\xEC\x83" + "\xE4\x82\xE6\x49\xE7\xEB\xF0\xF5\xEB\xF1\xF6\xEB\xF1\xF7\xEA\xF0\xF6" + "\xEA\xF0\xF6\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF0\xF7\xE9\xF0" + "\xF7\xE9\xF0\xF6\xE9\xF0\xF6\xE8\xF0\xF6\xE9\xF1\xF7\xE9\xF1\xF7\xE7" + "\xEF\xF5\xE7\xEF\xF6\xE7\xEF\xF6\xE8\xF0\xF7\xDB\xE3\xEA\xCA\xD3\xDB" + "\x8F\x98\x9F\x0A\x12\x19\x1A\x22\x29\x83\x1C\x7F\x25\x29\x2D\x0F\x15" + "\x1A\x07\x0D\x13\x06\x0D\x13\x05\x0C\x13\x14\x21\x2D\x3C\x96\xE6\x19" + "\x87\xE8\x18\x80\xDB\x17\x77\xCD\x15\x71\xC2\x15\x6D\xBC\x14\x6A\xB5" + "\x13\x66\xAF\x13\x62\xA9\x12\x5F\xA2\x11\x5B\x9C\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x1F\x8A\xE8\x17\x77\xCD\x02" + "\x0E\x19\x10\x58\x96\x18\x80\xDC\x18\x7D\xD7\x17\x7A\xD1\x17\x79\xD0" + "\x17\x79\xD0\x16\x77\xCC\x16\x75\xC8\x16\x72\xC3\x15\x6F\xBF\x15\x6D" + "\xBB\x14\x6A\xB6\x14\x68\xB2\x16\x67\xAE\x3F\x65\x86\x0D\x15\x1B\x1F" + "\x25\x2A\x05\x08\x0B\x10\x68\x6E\x73\xE0\xE4\xE7\x83\xE5\x7F\xE6\xE8" + "\xE9\xEC\xF2\xF7\xEC\xF2\xF7\xEB\xF1\xF7\xEB\xF1\xF7\xEA\xF1\xF7\xEA" + "\xF1\xF7\xE9\xF0\xF6\xE9\xF0\xF7\xE9\xF0\xF7\xE9\xF0\xF6\xE9\xF0\xF6" + "\xE8\xF0\xF6\xE8\xF0\xF6\xE8\xF0\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF" + "\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE6\xEF\xF6\xE7\xF0\xF7\xE2\xEB\xF2\xCE" + "\xD6\xDD\x31\x39\x40\x2C\x33\x39\x30\x32\x34\x17\x1B\x1E\x25\x2B\x31" + "\x0A\x11\x17\x05\x0C\x13\x04\x0C\x13\x0B\x15\x1E\x4A\x91\xCF\x19\x83" + "\xE0\x17\x7A\xD1\x16\x72\xC4\x14\x6C\xBA\x14\x68\xB3\x13\x65\xAC\x12" + "\x61\xA6\x12\x5D\xA0\x11\x1D\x59\x99\x10\x56\x93\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x19\x87\xE8\x19\x86\xE5\x10" + "\x57\x96\x83\x00\x36\x0F\x52\x8E\x17\x79\xD0\x16\x77\xCC\x16\x77\xCC" + "\x16\x74\xC8\x15\x72\xC3\x15\x6F\xBF\x15\x6D\xBA\x14\x6A\xB6\x14\x68" + "\xB2\x13\x65\xAD\x13\x62\xA9\x2F\x71\xAB\x19\x27\x33\x1A\x20\x25\x0E" + "\x13\x18\x1B\x21\x26\xC0\xC3\xC6\x83\xE4\x7F\xE7\xE9\xEB\xEC\xF2\xF7" + "\xEC\xF2\xF7\xEB\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE9\xF0\xF6\xE6\xED" + "\xF3\xE9\xF0\xF7\xE9\xF0\xF6\xE9\xF0\xF6\xE8\xF0\xF6\xE8\xF0\xF6\xE8" + "\xF0\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6" + "\xE7\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE7\xEF\xF7\xE5\xED\xF4\xE5\xED" + "\xF3\x63\x6B\x73\x13\x1A\x20\x0D\x0F\x11\x06\x0A\x0E\x27\x2D\x33\x10" + "\x17\x1D\x05\x0C\x13\x04\x0C\x13\x04\x0C\x14\x44\x72\x9A\x1D\x7F\xD6" + "\x16\x74\xC7\x15\x6D\xBC\x14\x67\xB1\x13\x63\xAA\x12\x5F\xA4\x11\x5C" + "\x9D\x11\x23\x58\x97\x10\x54\x90\x0F\x4E\x85\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x19\x85\xE4\x19\x82\xE0\x18\x80" + "\xDC\x10\x53\x8F\x83\x00\x30\x0E\x4E\x86\x16\x74\xC7\x15\x72\xC3\x15" + "\x6F\xBF\x15\x6D\xBA\x14\x6A\xB6\x14\x67\xB1\x13\x65\xAD\x13\x62\xA9" + "\x12\x60\xA4\x12\x5D\xA0\x43\x6F\x96\x08\x10\x17\x1C\x22\x27\x08\x0D" + "\x12\x63\x65\x67\x83\xDF\x02\xE7\xE9\x82\xEB\x7F\xF1\xF7\xEB\xF1\xF7" + "\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE9\xF0\xF7\xE5\xED\xF3\xDF\xE6" + "\xEC\xE9\xF1\xF7\xE8\xF0\xF6\xE8\xF0\xF6\xE8\xEF\xF6\xE7\xEF\xF6\xE7" + "\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6" + "\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEE\xF6\xE7\xEF\xF6\xE6\xEE\xF4\xE8\xEF" + "\xF6\x7F\x87\x8D\x02\x09\x0F\x02\x04\x06\x04\x08\x0C\x10\x17\x1D\x13" + "\x1A\x21\x03\x0B\x12\x02\x0B\x12\x02\x0B\x13\x1C\x2B\x38\x27\x80\xCE" + "\x15\x6E\xBD\x14\x68\xB3\x13\x62\xA9\x12\x5E\xA1\x11\x5A\x9B\x10\x57" + "\x94\x0F\x51\x25\x8A\x0B\x3C\x68\x06\x21\x39\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x18\x82\xDE\x18\x7F\xDA\x18\x7D" + "\xD6\x17\x7A\xD2\x0F\x50\x89\x83\x00\x7F\x0E\x4A\x7F\x15\x6D\xBA\x14" + "\x6A\xB6\x14\x67\xB1\x13\x65\xAD\x13\x62\xA8\x12\x5D\xA0\x11\x5B\x9C" + "\x11\x58\x98\x1B\x5D\x98\x30\x46\x59\x0F\x17\x1F\x0F\x13\x18\x11\x12" + "\x16\xB3\xB2\xB3\xE9\xEC\xEF\xEB\xF1\xF7\xEB\xF2\xF8\xEA\xF1\xF7\xEA" + "\xF1\xF7\xEA\xF0\xF7\xE9\xF0\xF7\xE9\xF0\xF6\xE3\xEA\xF1\xDF\xE7\xED" + "\xE8\xF0\xF6\xE8\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE6\xEF" + "\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6" + "\xEF\xF6\xE6\xEE\xF6\xE6\xEE\xF5\xE5\xED\xF4\xE6\xED\xF4\xE7\xEE\xF4" + "\x8C\x5C\x93\x99\x04\x0A\x10\x02\x04\x06\x03\x07\x0B\x0C\x13\x19\x17" + "\x1F\x25\x04\x0C\x13\x04\x0C\x14\x03\x0C\x13\x05\x0D\x14\x3D\x82\xC0" + "\x14\x69\xB5\x13\x63\xAA\x12\x5D\xA0\x10\x56\x94\x0E\x4A\x7F\x08\x2C" + "\x4C\x03\x11\x1D\x0F\x22\x33\x22\x55\x81\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x18\x7E\xD9\x17\x7C\xD5\x17\x7A\xD1" + "\x16\x77\xCD\x16\x75\xC9\x09\x32\x56\x83\x00\x1F\x0C\x44\x74\x13\x64" + "\xAB\x0F\x56\x94\x0C\x3F\x6C\x0C\x3E\x6A\x0B\x3C\x67\x07\x26\x42\x08" + "\x1F\x34\x32\x42\x51\x0A\x0C\x0E\x0D\x82\x0C\x7F\x06\x05\x06\x2F\x2D" + "\x2F\xDA\xDE\xE3\xEB\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE9" + "\xF0\xF7\xE9\xF0\xF6\xE9\xF0\xF6\xE8\xF0\xF6\xDF\xE6\xED\xDE\xE6\xED" + "\xE6\xEE\xF5\xE7\xEF\xF6\xE7\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF" + "\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6" + "\xEE\xF6\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xED\xF4\xE6\xED\xF3\xE7\xEE\xF4" + "\x95\x9C\xA2\x02\x08\x0E\x01\x05\x09\x02\x05\x07\x0B\x13\x19\x17\x1E" + "\x25\x03\x0B\x13\x03\x0C\x13\x04\x0C\x13\x03\x0B\x12\x41\x6C\x92\x13" + "\x62\xA8\x0F\x3B\x52\x8C\x09\x30\x53\x03\x12\x1F\x09\x12\x1A\x24\x49" + "\x69\x3A\x7D\xB8\x44\x9D\xEC\x3C\x99\xEB\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x7B\xD3\x17\x79\xCF\x16\x76\xCB" + "\x16\x74\xC7\x15\x72\xC3\x15\x6F\xBF\x07\x24\x3E\x86\x00\x7F\x0D\x14" + "\x1A\x26\x3D\x50\x24\x3C\x50\x22\x3B\x4F\x39\x62\x85\x4C\x7C\xA4\x3C" + "\x4D\x5A\x07\x0C\x10\x16\x1E\x24\x07\x0E\x13\x64\x66\x64\xEB\xF0\xF3" + "\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE9\xF0\xF7\xE9\xF0\xF6\xE9\xF0" + "\xF6\xE8\xF0\xF6\xE9\xF1\xF7\xDD\xE4\xEB\xDF\xE7\xEE\xE7\xEF\xF6\xE7" + "\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6" + "\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEE\xF5\xE6\xEE" + "\xF5\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF3\xE7\xED\xF3\xA9\xAF\xB5\x05" + "\x0B\x10\x02\x06\x09\x02\x7D\x04\x07\x0A\x12\x18\x0E\x16\x1D\x03\x0B" + "\x13\x03\x0B\x13\x02\x0A\x10\x04\x0B\x11\x1F\x2D\x39\x0B\x24\x3A\x0B" + "\x13\x1A\x2C\x4D\x69\x48\x84\xB8\x57\xA7\xEE\x4F\xA3\xED\x42\x9C\xEC" + "\x39\x97\xEB\x2F\x92\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x78\xCE\x16\x76\xCA\x16\x73\xC6\x15\x71\xC2\x15" + "\x6F\xBE\x14\x6C\xBA\x08\x2E\x4F\x45\x68\x85\x7D\xBD\xF2\x75\xB9\xF1" + "\x70\xB6\xF0\x6A\xB3\xF0\x60\xAE\xEF\x5C\xAC\xEE\x69\x97\xBE\x0F\x18" + "\x21\x0A\x11\x1A\x1C\x23\x2A\x09\x10\x16\x94\x9D\x9E\x82\xE7\x6D\xE6" + "\xE9\xEF\xF5\xEA\xF1\xF7\xE9\xF0\xF7\xE9\xF0\xF6\xE9\xF0\xF6\xE8\xF0" + "\xF6\xE8\xF0\xF6\xE8\xF0\xF6\xD9\xE1\xE8\xDD\xE5\xEC\xE7\xEF\xF6\xE6" + "\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6" + "\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEE\xF6\xE6\xEE\xF5\xE6\xEE" + "\xF5\xE6\xED\xF4\xE6\xED\xF3\xE6\xED\xF3\xE6\xED\xF3\xAE\xB4\xBA\x05" + "\x0A\x10\x01\x05\x08\x02\x04\x07\x0B\x13\x1A\x09\x12\x19\x01\x0A\x11" + "\x02\x07\x0B\x01\x03\x06\x83\x01\x7F\x14\x18\x1C\x4B\x78\xA0\x6A\xB1" + "\xF0\x62\xAD\xEF\x55\xA6\xEE\x4C\xA1\xED\x43\x9D\xEC\x3A\x98\xEB\x31" + "\x93\xEA\x2A\x90\xE9\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x16\x75\xC9\x16\x73\xC4\x15\x70\xC0\x15\x6E\xBC\x14\x6B" + "\xB8\x0C\x44\x76\x27\x3E\x50\x76\xB9\xF1\x75\xB9\xF1\x6A\xB3\xF0\x64" + "\xB0\xEF\x5F\xAD\xEF\x59\xAA\xEE\x61\xA9\xE6\x1D\x2E\x3E\x08\x0F\x1A" + "\x0B\x12\x1D\x20\x26\x31\x08\x10\x18\x97\xA1\xA7\xE5\xEB\xEF\xE5\xE7" + "\xE8\xE9\xF0\xF7\xE9\xF0\xF6\xE9\xF0\xF6\xE8\xF0\xF6\xE8\xF0\xF6\xE8" + "\x50\xF0\xF6\xE7\xEF\xF6\xD7\xDF\xE7\xDF\xE8\xEF\xE6\xEF\xF6\xE6\xEF" + "\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6" + "\xEF\xF6\xE6\xEF\xF6\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF5\xE6\xEE\xF4" + "\xE6\xED\xF4\xE6\xED\xF3\xE6\xEC\xF2\xE6\xED\xF3\xAF\xB5\xBB\x04\x09" + "\x0F\x01\x05\x08\x02\x05\x07\x0F\x16\x1B\x0B\x0E\x12\x82\x01\x7F\x02" + "\x05\x06\x08\x07\x0A\x0D\x0B\x12\x17\x15\x1F\x27\x67\xAD\xEC\x5F\xAB" + "\xEF\x56\xA7\xEE\x4D\xA2\xED\x44\x9D\xEC\x3B\x98\xEB\x32\x94\xEA\x2A" + "\x90\xE9\x26\x8D\xE9\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x16\x73\xC6\x15\x70\xC1\x15\x6E\xBC\x14\x6B\xB7\x10\x59" + "\x9A\x0C\x14\x1A\x65\xA2\xD4\x71\xB7\xF0\x67\xB2\xEF\x62\xAF\xEF\x5D" + "\xAD\xEE\x57\xAA\xEE\x51\xA7\xED\x51\x95\xCE\x0B\x15\x1F\x0A\x10\x18" + "\x1A\x1D\x25\x33\x39\x40\x0F\x16\x20\x9E\xA8\xB2\xE7\xF1\xF8\xE5\xE8" + "\xEA\xE6\xE9\xEC\xE8\xF0\xF6\x51\xE8\xF0\xF6\xE8\xF0\xF6\xE8\xEF\xF6" + "\xE7\xEF\xF6\xE7\xEF\xF6\xD7\xDF\xE7\xE1\xE9\xF1\xE6\xEF\xF6\xE6\xEF" + "\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6" + "\xEF\xF6\xE6\xEF\xF6\xE6\xEE\xF6\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xED\xF4" + "\xE6\xED\xF3\xE6\xED\xF3\xE6\xEC\xF2\xE6\xED\xF2\xBE\xC4\xC9\x11\x17" + "\x1C\x03\x05\x07\x83\x01\x7F\x1F\x20\x21\x0D\x0F\x11\x09\x0D\x11\x0A" + "\x0F\x13\x08\x0E\x12\x0A\x11\x16\x12\x1B\x24\x5D\xA9\xEC\x56\xA6\xEE" + "\x4E\xA2\xED\x45\x9E\xEC\x3C\x99\xEB\x33\x94\xEA\x2B\x90\xE9\x26\x8E" + "\xE9\x21\x8B\xE8\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x15\x71\xC3\x15\x6F\xBE\x14\x6C\xB9\x14\x69\xB4\x04\x16\x26" + "\x55\x8C\xBA\x6D\xB5\xF0\x64\xB0\xEF\x5F\xAE\xEF\x5A\xAB\xEE\x55\xA9" + "\xEE\x50\xA6\xED\x4A\xA3\xEC\x4E\x88\xB9\x0B\x10\x16\x0C\x10\x15\x12" + "\x15\x17\x39\x3E\x3D\x26\x2C\x32\xB7\xC0\xCA\xE5\xEE\xF6\xE7\x56\xEE" + "\xF4\xE4\xE5\xE6\xE7\xEC\xF0\xE8\xEF\xF6\xE7\xEF\xF6\xE7\xEF\xF6\xE7" + "\xEF\xF6\xE6\xEF\xF6\xD7\xE0\xE8\xE1\xEA\xF2\xE6\xEF\xF6\xE6\xEF\xF6" + "\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF\xF6\xE6\xEF" + "\xF6\xE6\xEE\xF6\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF4\xE6\xED\xF4\xE6" + "\xED\xF3\xE6\xEC\xF2\xE6\xEC\xF2\xE5\xEC\xF1\xC7\xCD\xD2\x16\x1A\x1D" + "\x83\x01\x72\x11\x14\x16\x21\x26\x2A\x0C\x11\x15\x0A\x10\x14\x09\x0E" + "\x13\x08\x0E\x13\x08\x0E\x13\x14\x1D\x25\x56\xA5\xEB\x4D\xA2\xED\x46" + "\x9E\xEC\x3D\x9A\xEB\x34\x95\xEA\x2B\x90\xE9\x26\x8E\xE9\x22\x8B\xE8" + "\x1D\x89\xE8\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x15\x6F\xBF\x14\x6C\xB9\x14\x68\xB3\x08\x2C\x4B\x3A\x62\x84\x69" + "\xB3\xF0\x62\xAF\xEF\x5C\xAC\xEE\x57\xAA\xEE\x52\xA7\xED\x4D\xA5\xED" + "\x48\xA2\xEC\x42\x9F\xEC\x50\x7D\xA0\x0A\x0E\x13\x1C\x1E\x19\x82\x22" + "\x15\x1B\x1E\x21\x1F\x48\x4F\x4E\xBE\xC8\xCF\xE7\xEF\xF7\xE7\xEF\xF6" + "\xE6\xED\xF2\xE4\xE5\x82\xE7\x4A\xEE\xF4\xE7\xEF\xF6\xE6\xEF\xF6\xE6" + "\xEF\xF6\xE6\xEE\xF6\xD7\xE0\xE7\xE2\xEB\xF2\xE6\xEE\xF6\xE6\xEE\xF6" + "\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE" + "\xF6\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xED\xF4\xE6\xED\xF4\xE6" + "\xED\xF3\xE6\xEC\xF2\xE6\xEC\xF2\xE6\xEC\xF2\xB1\xB6\xBA\x82\x09\x7F" + "\x0A\x12\x13\x15\x23\x28\x2C\x16\x1B\x1F\x1C\x21\x26\x1E\x24\x28\x13" + "\x19\x1E\x0C\x12\x17\x0A\x11\x18\x1A\x25\x30\x4F\xA2\xEC\x44\x9D\xEC" + "\x3E\x9A\xEB\x35\x95\xEA\x2C\x91\xE9\x27\x8E\xE9\x22\x8B\xE8\x1D\x89" + "\xE8\x19\x87\xE8\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x14\x6B\xB7\x14\x67\xB1\x0C\x41\x6F\x21\x3B\x4F\x65\xB1\xEF" + "\x64\xB0\xEF\x59\xAB\xEE\x54\xA8\xEE\x4F\xA6\xED\x4A\xA3\xED\x45\xA1" + "\xEC\x41\x9E\xEC\x3E\x9C\xEB\x60\x94\xB8\x54\x4F\x2D\xB3\x9C\x3E\xC4" + "\xAC\x45\x6C\x60\x2A\x35\x37\x32\x7F\xB7\xC5\xCB\xE3\xF2\xFA\xE4\xEF" + "\xF4\xE8\xF0\xF8\xE5\xE6\xF1\xE4\xE5\xE7\xE6\xF0\xF3\xE6\xEE\xFA\xE7" + "\xEE\xF5\xE6\xEE\xF5\xD7\xE0\xE7\xE3\xEC\xF3\xE5\xED\xF5\xE6\xEE\xF6" + "\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF6\xE6\xEE\xF5\xE6\xEE" + "\xF5\xE6\xEE\xF5\xE6\xEE\xF4\xE6\xED\xF4\xE6\xED\xF4\xE5\xEE\xF3\xE4" + "\xED\xF5\xE6\xEA\xF3\xEA\xEB\xEC\xEA\xEB\xEC\x94\x97\x90\x0F\x12\x13" + "\x14\x1B\x20\x0C\x10\x16\x09\x0E\x12\x0A\x0F\x14\x11\x17\x1D\x1B\x22" + "\x25\x3D\x43\x42\x15\x1C\x2C\x17\x26\x31\x46\x9E\xEB\x3B\x99\xEB\x35" + "\x6F\x95\xEA\x2D\x91\xEA\x27\x8E\xE9\x22\x8C\xE8\x1E\x89\xE8\x19\x87" + "\xE8\x19\x85\xE5\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x13\x66\xAF\x0F\x55\x91\x0A\x13\x1A\x55\x9B\xD3\x60\xAE\xEF" + "\x56\xA9\xEE\x51\xA7\xED\x4C\xA4\xED\x47\xA2\xEC\x42\x9F\xEC\x40\x9D" + "\xEB\x3A\x9B\xEB\x37\x99\xEA\x5F\xA2\xCC\xC4\xB0\x3C\xE2\xBA\x27\xE2" + "\xB7\x2C\xC9\xB2\x3A\x56\x51\x1F\x46\x4D\x4F\xB4\xC2\xD0\xE3\xF0\xF2" + "\xE6\xEF\xF4\xE6\xEC\xF8\xE4\xE6\xE7\xE4\x82\xE8\x45\xE6\xEE\xF7\xE8" + "\xED\xF7\xE7\xEE\xF6\xD6\xDF\xE6\xE2\xEA\xF2\xE6\xEE\xF5\xE6\xEE\xF5" + "\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE" + "\xF4\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF3\xE5\xED\xF2\xE4" + "\xED\xEE\xE5\xE1\xC6\xD4\xC5\x7A\xD5\xC1\x63\x9A\x8D\x40\x82\x21\x7F" + "\x19\x0B\x11\x15\x09\x0E\x17\x09\x0D\x15\x07\x0E\x14\x06\x0F\x14\x08" + "\x10\x14\x2B\x2F\x32\x26\x28\x29\x57\x5D\x57\x3D\x99\xEA\x33\x94\xEA" + "\x2C\x91\xE9\x27\x8E\xE9\x23\x8C\xE9\x1E\x89\xE8\x1A\x87\xE8\x19\x85" + "\xE5\x19\x83\xE0\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x12\x61\xA7\x03\x14\x22\x48\x85\xB8\x5C\xAC\xEE\x54\xA8\xED" + "\x4E\xA5\xED\x49\xA3\xEC\x45\xA0\xEC\x41\x9F\xEB\x3C\x9C\xEB\x35\x98" + "\xEA\x31\x96\xEA\x3E\x9B\xE6\x79\x9A\x8F\xD1\xB3\x1B\xE0\xB7\x1D\xE3" + "\xB8\x2B\xDA\xBC\x27\xC7\xB5\x37\x7F\x55\x48\x22\x35\x36\x3E\xA2\xAA" + "\xAB\xE5\xED\xEE\xE5\xEE\xF0\xE4\xED\xF0\xE3\xE5\xE4\xE5\xEC\xEB\xE8" + "\xEB\xFA\xE6\xED\xF7\xD7\xDF\xE6\xE1\xE9\xF1\xE6\xEE\xF5\xE6\xEE\xF5" + "\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF4\xE6\xED" + "\xF4\xE6\xED\xF4\xE6\xED\xF3\xE6\xED\xF3\xE6\xED\xF3\xE6\xEC\xED\xE9" + "\xED\xDA\xCB\xBC\x75\xD1\xB4\x1E\xD9\xB6\x0C\xCF\xB9\x43\x3B\x31\x22" + "\x0D\x0F\x12\x09\x0E\x16\x09\x0D\x1C\x06\x0E\x16\x06\x11\x13\x0A\x13" + "\x1B\x1F\x1D\x23\x68\x62\x2B\xCA\xC0\x65\x3D\x99\xE6\x2A\x90\xE9\x25" + "\x62\x8D\xE9\x23\x8C\xE9\x1E\x8A\xE8\x1A\x87\xE8\x19\x86\xE5\x19\x83" + "\xE1\x18\x80\xDC\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x07\x28\x45\x30\x5E\x83\x57\xAA\xEE\x51\xA6\xED\x4B\xA4\xED" + "\x46\xA1\xEC\x41\x9F\xEC\x3C\x9C\xEB\x37\x99\xEB\x32\x97\xEA\x2D\x94" + "\xEA\x36\x98\xE8\x71\x9D\xAF\xB2\x97\x34\xD5\xAD\x1A\xE0\xB9\x19\xE2" + "\xBB\x1D\xDF\xBB\x1F\xDD\xBC\x2A\xC8\xA8\x37\x46\x3A\x1B\x82\x23\x43" + "\x27\x94\x99\x9D\xDB\xE5\xE6\xE4\xEF\xF4\xE4\xEC\xE9\xE5\xE4\xE0\xE7" + "\xEA\xF9\xE6\xED\xF8\xDE\xE6\xED\xE0\xE8\xEF\xE7\xEF\xF6\xE6\xEE\xF5" + "\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xED\xF4\xE6\xED\xF4\xE6\xED" + "\xF3\xE6\xED\xF3\xE6\xED\xF3\xE6\xEC\xF2\xE6\xEC\xF2\xE6\xEB\xF0\x82" + "\xEB\x7F\xDC\xC6\xB5\x67\xD2\xAD\x10\xE2\xC0\x1C\xC5\xAB\x42\x36\x29" + "\x20\x0F\x11\x17\x07\x0F\x14\x06\x0E\x15\x06\x0F\x12\x06\x0E\x18\x0F" + "\x0E\x19\x45\x3A\x17\xBD\xAC\x24\xDA\xC1\x2B\x55\xA0\xD1\x22\x8B\xE8" + "\x20\x8A\xE8\x1E\x89\xE8\x1A\x87\xE8\x19\x86\xE6\x19\x83\xE1\x18\x81" + "\xDE\x18\x80\xDB\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x1B\x37\x4F\x51\xA7\xED\x4C\xA4\xED\x47\xA2\xEC\x43\xA0\xEC" + "\x3E\x9D\xEB\x39\x9B\xEB\x34\x98\xEA\x2F\x95\xEA\x2A\x93\xE9\x4B\x9C" + "\xDD\x83\x96\x81\xB8\x93\x26\xD4\xA4\x1D\x27\xDE\xB5\x20\xDF\xBC\x20" + "\xDD\xBC\x1E\xDE\xBB\x22\xE0\xB8\x1E\xE5\xBB\x25\xB1\x9F\x32\x2B\x23" + "\x14\x10\x12\x1B\x60\x6A\x74\xCF\xD9\xE2\xE6\xEF\xEE\xE5\xE7\xE6\x82" + "\xE4\x7F\xE8\xE6\xED\xF3\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE" + "\xF5\xE6\xEE\xF5\xE6\xEE\xF4\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF3\xE6" + "\xED\xF3\xE6\xED\xF3\xE6\xEC\xF2\xE6\xEC\xF2\xE5\xEB\xF1\xE5\xEC\xF4" + "\xDA\xDF\xDB\xC0\xAD\x5F\xD9\xAF\x1A\xE8\xB6\x24\xBF\x99\x2B\x53\x42" + "\x1B\x12\x15\x13\x06\x10\x17\x06\x0F\x13\x0A\x0E\x12\x13\x0D\x14\x45" + "\x2F\x1C\xB0\x93\x25\xE2\xC2\x24\xDF\xBB\x27\x54\x9E\xCD\x1F\x8A\xE8" + "\x1B\x88\xE8\x19\x87\xE8\x19\x87\xE7\x19\x85\xE4\x19\x83\xE2\x18\x82" + "\xDF\x18\x80\xDC\x17\x96\xEA\x17\x96\xEA\x58\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x43\x91\xD2\x4D\xA4\xED\x44\xA0\xEC\x40\x9E\xEC\x3C\x9C" + "\xEB\x39\x9A\xEB\x3F\x9D\xE9\x4D\xA1\xE2\x50\xA1\xDC\x80\xA5\xA9\xA2" + "\x90\x45\xBC\x97\x1F\xCE\x9F\x18\xDD\xAE\x20\xDF\xB9\x23\xDB\xBB\x23" + "\xDA\xBB\x26\xD9\xB9\x28\xE1\xB9\x1E\xE4\xB9\x18\xDC\xBF\x27\x84\x72" + "\x2C\x12\x0D\x12\x05\x0E\x19\x4B\x55\x5C\xCE\xD5\xDB\xE7\x82\xED\x7F" + "\xE3\xE5\xE2\xE5\xE7\xE9\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE\xF5\xE6\xEE" + "\xF5\xE6\xEE\xF4\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF3\xE6\xED\xF3\xE6" + "\xEC\xF2\xE6\xEC\xF2\xE6\xEC\xF2\xE6\xEC\xF1\xE5\xEC\xF1\xD9\xE0\xE7" + "\xBE\xBC\xB3\xBF\xA7\x58\xE2\xB2\x2B\xEC\xAE\x27\xC9\x94\x18\x9A\x7B" + "\x1A\x5B\x4C\x16\x2C\x25\x18\x1F\x19\x16\x2E\x22\x14\x5C\x43\x19\xA4" + "\x7A\x27\xD3\xA4\x27\xE1\xB6\x20\xDF\xBC\x1A\x5B\x9F\xBD\x1B\x88\xE8" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x86\xE5\x19\x84\xE2\x19\x82" + "\xE0\x18\x81\xDD\x17\x96\xEA\x17\x5F\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x4A\xA3\xED\x43\xA0\xEC\x3F\x9E\xEB\x3B\x9C\xEB\x37\x9A" + "\xEB\x3B\x9C\xE8\x80\x9F\x9B\xA4\x9E\x5A\xB9\xA8\x40\xC5\xA7\x1F\xCE" + "\xA8\x1C\xD8\xA8\x20\xDF\xAE\x21\xE1\xB7\x23\xDF\xB9\x26\xDD\xBA\x20" + "\xDE\xBC\x24\xDD\xBA\x28\xE0\xBA\x25\xE1\xBA\x1B\xE4\xBC\x1D\xC4\xAA" + "\x2F\x27\x20\x12\x06\x0E\x12\x03\x0D\x15\x39\x40\x4A\xBE\xC5\xC8\xE4" + "\xEB\xED\x83\xE4\x2A\xE5\xE9\xED\xE6\xED\xF4\xE6\xED\xF4\xE6\xED\xF4" + "\xE6\xED\xF4\xE6\xED\xF3\xE6\xED\xF3\xE6\xED\xF3\xE6\xEC\xF2\xE6\xEC" + "\xF2\xE6\xEC\xF2\xE5\xEC\xF1\xE5\xEC\xF1\xE6\xEC\xF1\x82\xD4\x7F\xDB" + "\xC3\xB3\xAD\xC4\xAA\x67\xD6\xAC\x2C\xE0\xAC\x23\xCF\x9E\x13\xB9\x8C" + "\x13\xAB\x7D\x1F\x9B\x71\x2D\x8E\x72\x23\x99\x7C\x1E\xAC\x87\x1C\xC9" + "\x9B\x1E\xDD\xAB\x26\xE3\xB6\x1F\xDE\xBC\x19\x75\x9E\x90\x30\x91\xE5" + "\x19\x87\xE8\x19\x87\xE8\x19\x87\xE8\x19\x86\xE6\x19\x84\xE3\x19\x83" + "\xE0\x18\x81\xDE\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x42\x9F\xEC\x3E\x9D\xEB\x3A\x9B\xEB\x36\x99\xEB\x33\x97\xEA" + "\x41\x9A\xDF\xB8\x9C\x3D\xDF\xAD\x22\xE1\xAE\x1C\xE1\xB4\x1E\xE1\xB8" + "\x20\xE4\xB5\x23\xE2\xB6\x25\x1F\xDB\xB6\x25\xE0\xB9\x1E\xE1\xBB\x1E" + "\xE0\xBA\x22\xDF\xB9\x23\xE0\xBB\x25\xDE\xB8\x20\xE4\xB4\x1F\xDD\xBB" + "\x2A\x70\x69\x1E\x0C\x82\x11\x0F\x04\x0C\x17\x04\x0B\x13\x2B\x33\x3A" + "\xAC\xB5\xBD\xE4\xE8\xEA\x86\xE4\x24\xE5\xE7\xE9\xE5\xE7\xE9\xE5\xEA" + "\xEE\xE5\xEA\xEE\xE6\xEC\xF2\xE6\xEC\xF2\xE6\xEC\xF2\xE6\xEC\xF1\xE5" + "\xEC\xF1\xE5\xEB\xF0\xE4\xEA\xEF\xE6\xEB\xEF\x82\xD3\x7F\xD4\xC2\xC1" + "\xB8\xB6\xA5\x64\xC7\xA3\x29\xDE\xAD\x22\xD4\xA3\x15\xC9\x97\x18\xC5" + "\x92\x1B\xC3\x8C\x21\xC1\x8D\x1F\xC1\x94\x16\xC8\xA0\x14\xDA\xB0\x20" + "\xE2\xB7\x23\xE2\xB8\x20\xE0\xB9\x26\xCA\xB4\x3D\x7A\xA5\xA3\x25\x8D" + "\xE7\x19\x87\xE8\x19\x87\xE8\x19\x87\xE7\x19\x85\xE4\x19\x83\xE1\x18" + "\x81\xDD\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x3D\x9D\xEB\x39\x9B\xEB\x35\x99\xEA\x31\x97\xEA\x2D\x95\xEA\x3B\x97" + "\xDE\xCB\xA4\x35\xE5\xB4\x23\xE7\xB9\x20\xE2\xB8\x22\xDF\xBB\x20\xDF" + "\xB8\x23\xE1\xB9\x24\x42\xDF\xB9\x20\xE0\xBB\x1F\xE0\xBA\x20\xE0\xBA" + "\x21\xDF\xBA\x21\xDF\xBB\x21\xDF\xBA\x21\xE0\xB8\x1D\xE0\xBA\x1E\xCC" + "\xB0\x2C\x51\x3F\x1A\x0B\x0A\x11\x03\x0F\x10\x03\x0E\x13\x32\x39\x44" + "\xD6\xD9\xDF\xE9\xEB\xEC\xEE\xF3\xF7\xEA\xEE\xF1\xE9\xED\xF1\xE6\xE9" + "\xEA\xE6\xE8\xEA\x86\xE4\x7F\xE5\xE7\xE8\xE5\xE7\xE8\xE5\xE9\xEC\xE6" + "\xEA\xED\xE4\xEA\xEE\xE4\xE5\xE6\xDE\xE3\xE7\xC4\xC7\xC0\xA8\x92\x58" + "\xB9\x8E\x20\xD4\xA5\x20\xD6\xA9\x1B\xD8\xA6\x1B\xD3\xA2\x18\xCF\x9E" + "\x18\xD2\x9E\x18\xD4\xA5\x16\xDB\xAF\x1A\xE1\xB7\x22\xE1\xB9\x21\xE0" + "\xB9\x20\xE0\xB9\x24\xE0\xBA\x21\xDA\xBB\x2C\xB3\xC0\x90\x46\x9D\xE5" + "\x1B\x88\xE8\x19\x87\xE8\x19\x85\xE5\x19\x83\xE0\x18\x7F\xD9\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x37\x99\xEB\x33" + "\x97\xEA\x2F\x95\xEA\x2B\x93\xE9\x27\x91\xE9\x32\x94\xE2\xC6\x41\x9E" + "\x30\xE1\xB3\x24\xE1\xB9\x20\xDD\xB9\x23\xDD\xBD\x1F\xDF\xBB\x23\xE0" + "\xB9\x23\xDF\xBA\x20\xE0\xBB\x21\xDF\xBA\x20\xE0\xBB\x21\xDF\xBA\x20" + "\xDF\xBA\x20\xDF\xBA\x20\xDF\xBB\x1D\xE1\xB8\x1D\xE3\xB8\x28\xAF\x91" + "\x31\x28\x20\x11\x04\x0B\x0F\x01\x0C\x0F\x1A\x1F\x29\x82\xC9\x25\xCC" + "\xEE\xF2\xF5\xED\xF2\xF6\xEC\xF2\xF7\xEC\xF2\xF7\xEB\xF2\xF7\xEB\xF1" + "\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xE8\xEC\xF0\xE7\xEC\xF0\xE5\xE8\xEA\xE5" + "\xE8\xEA\x83\xE3\x83\xE5\x03\xE4\xE9\xEE\x82\xC1\x7F\xBD\x98\x7E\x46" + "\xB6\x88\x1C\xCF\xA2\x1D\xD8\xAD\x1F\xE0\xB0\x1D\xDD\xAC\x1C\xD9\xAB" + "\x1C\xDA\xAD\x19\xDC\xAF\x1B\xE0\xB5\x20\xE0\xB8\x22\xE0\xB9\x21\xE0" + "\xBA\x20\xE0\xBA\x20\xE0\xBB\x20\xDE\xBB\x20\xD6\xBB\x2E\xA4\xB7\x93" + "\x2D\x90\xE4\x19\x87\xE8\x19\x85\xE4\x18\x81\xDD\x17\x7C\xD5\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x2E\x95\xEA\x2A" + "\x93\xE9\x26\x91\xE9\x22\x8F\xE9\x1E\x8D\xE8\x2B\x91\xE2\xBB\x98\x30" + "\xDA\xAE\x23\xDF\xB8\x20\xD9\xB7\x25\xD8\xBA\x23\xDF\xBA\x21\xE0\xB9" + "\x22\xDF\xBA\x20\x22\xE0\xBB\x21\xDF\xBA\x20\xE0\xBB\x21\xDF\xBA\x20" + "\xDF\xBA\x20\xDF\xBA\x20\xDF\xBA\x22\xE1\xB6\x1E\xE5\xB8\x23\xD9\xB8" + "\x2A\x7D\x6E\x23\x12\x82\x0F\x07\x0E\x14\x19\x52\x57\x5A\xD7\x82\xD8" + "\x2D\xED\xF3\xF7\xED\xF2\xF7\xED\xF3\xF8\xEB\xF2\xF7\xEB\xF1\xF7\xEA" + "\xF1\xF7\xEA\xF1\xF7\xE9\xF1\xF7\xE9\xF0\xF6\xE8\xF0\xF6\xE8\xF0\xF6" + "\xE9\xF1\xF7\xE8\xF0\xF6\xE4\xE6\xE7\xD6\xD7\xD8\x82\x6A\x7F\x67\x7A" + "\x5C\x25\xBB\x8C\x1D\xCF\xA2\x1A\xDD\xB2\x21\xE6\xB8\x20\xE5\xB7\x22" + "\xE1\xB6\x22\xE2\xB7\x21\xE1\xB7\x21\xE1\xB8\x22\xE0\xB9\x22\xE0\xBA" + "\x22\xDF\xBB\x21\xDC\xBB\x22\xDC\xBA\x20\xDF\xBC\x20\xDE\xB9\x26\xA3" + "\xAB\x68\x35\x8F\xD0\x19\x85\xE3\x18\x81\xDD\x17\x7C\xD5\x17\x77\xCD" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x24\x90" + "\xE9\x21\x8E\xE8\x1D\x8C\xE8\x19\x8A\xE8\x18\x89\xE6\x2B\x8E\xDC\xB3" + "\x92\x30\xD7\xAD\x23\xDF\xB8\x21\xDF\xB9\x20\xDD\xBC\x1E\xDF\xBA\x1E" + "\xE0\xB9\x20\xDF\xBA\x20\x7F\xE0\xBB\x20\xDF\xBA\x20\xE0\xBB\x21\xDF" + "\xBA\x20\xDF\xBA\x1F\xDF\xB9\x20\xDE\xB6\x27\xE1\xB7\x1B\xE4\xB6\x19" + "\xE2\xBC\x1B\xC3\xAC\x22\x7A\x6A\x3B\xA7\xA4\xA8\xD8\xD9\xD7\xEA\xED" + "\xEE\xEC\xF2\xF6\xEC\xF2\xF7\xEB\xF1\xF6\xEB\xF1\xF7\xEA\xF1\xF7\xEA" + "\xF1\xF7\xE9\xF1\xF7\xE9\xF0\xF6\xE8\xF0\xF6\xE8\xF0\xF6\xE8\xF0\xF6" + "\xE7\xEF\xF5\xE8\xF0\xF6\xE0\xE7\xED\x67\x68\x69\x1B\x15\x0F\x7A\x5B" + "\x1F\xBC\x8D\x1B\xD1\xA5\x1A\xDE\xB5\x20\xE4\xB8\x1D\xE4\xB9\x1F\xE2" + "\xBA\x22\xE1\xBA\x22\xE1\xBA\x22\xE0\xB9\x22\xDF\xBA\x22\xDE\x7F\xBB" + "\x22\xDE\xBB\x22\xDD\xBB\x21\xDA\xBA\x27\xC1\xB1\x3D\x7A\x9D\x84\x2B" + "\x88\xD1\x1B\x82\xDD\x18\x80\xDB\x17\x7C\xD4\x16\x77\xCD\x16\x73\xC5" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x1B\x8B" + "\xE8\x18\x8A\xE8\x18\x88\xE4\x18\x86\xE1\x17\x83\xDD\x2A\x89\xD4\xB1" + "\x91\x31\xD2\xA7\x1F\xDE\xB7\x21\xE0\xB8\x20\xDD\xBA\x1B\xDF\xB9\x1C" + "\xE1\xB9\x1F\xDF\xB9\x1F\xDF\xBA\x1F\xDF\xBA\x1F\xDF\xBA\x1F\xDF\xB9" + "\x1F\xE0\xBA\x20\xDF\xB9\x1F\xE0\xB8\x26\xE0\xB7\x1B\xE4\xB7\x16\xE3" + "\xB7\x15\xDE\xBB\x18\xBA\xA1\x7F\x37\xD4\xC9\xB4\xE9\xE4\xE1\xED\xF3" + "\xF6\xED\xF2\xF7\xEB\xF1\xF6\xEC\xF3\xF8\xEB\xF1\xF7\xEA\xF1\xF7\xE9" + "\xF1\xF7\xEA\xF1\xF7\xE7\xEF\xF6\xE8\xF0\xF6\xE7\xEF\xF5\xE8\xF1\xF7" + "\xE4\xEC\xF3\xC1\xCA\xD1\x5A\x63\x6A\x08\x0D\x11\x1C\x10\x01\x83\x60" + "\x1D\xC2\x91\x1C\xD4\xA7\x1A\xE0\xB8\x21\xE5\xBA\x1E\xE3\xBB\x1D\xDF" + "\xBB\x21\xE0\xBA\x22\xDF\xBA\x22\xDE\xBB\x22\xDE\xBA\x21\xDE\xBB\x22" + "\xDB\xBA\x24\x9C\xA8\x61\x59\x95\xA1\x31\x88\xC7\x21\x84\xD5\x18\x80" + "\xDB\x18\x7D\xD7\x17\x7A\xD2\x16\x77\xCC\x16\x72\xC4\x15\x6E\xBC\x7F" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x10\x5A" + "\x98\x18\x85\xDF\x17\x82\xDA\x17\x80\xD7\x16\x7E\xD3\x24\x82\xCC\xA2" + "\x91\x44\xD4\xA7\x1D\xE0\xB5\x21\xE1\xB7\x21\xDD\xB9\x1D\xDF\xB8\x1D" + "\xE1\xB7\x1F\xDF\xB9\x1F\xDF\xB9\x1F\xDF\xB9\x1F\xDE\xB8\x1E\xDF\xB9" + "\x1E\xE0\xBA\x1F\xDF\xB9\x1E\xE0\xB8\x1D\xDF\xB6\x21\xE0\xB8\x18\xE1" + "\xB3\x14\xE2\xB4\x15\xCD\xA8\x21\xA5\x8B\x4B\xE3\xDA\xD2\xEE\xF2\xF6" + "\xEB\xF1\xF6\xEB\xF1\xF6\xEB\xF1\xF7\xEA\xF1\xF7\xEA\xF1\xF7\xEA\xF1" + "\xF7\xE7\xEF\xF6\xE7\xEF\xF5\xE9\x6B\xF1\xF7\xE6\xEF\xF5\xD4\xDD\xE4" + "\x67\x71\x78\x1B\x25\x2C\x06\x0F\x16\x06\x0E\x15\x26\x1C\x09\x88\x5E" + "\x12\xC7\x92\x1A\xD5\xA7\x19\xDF\xB6\x21\xE3\xBA\x1E\xE1\xBA\x1E\xDE" + "\xBB\x21\xDE\xBB\x20\xDE\xBB\x21\xDE\xBB\x22\xDE\xBB\x22\xD1\xB7\x30" + "\x91\xA4\x6C\x43\x8C\xB2\x29\x85\xCA\x26\x83\xCC\x25\x81\xCB\x23\x7E" + "\xC8\x1D\x7A\xC8\x17\x75\xC8\x16\x72\xC4\x15\x6E\xBC\x14\x69\xB4\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x83\x00\x7F" + "\x05\x1C\x2F\x11\x61\xA3\x16\x7B\xCE\x15\x78\xC9\x1E\x7A\xC3\x51\x80" + "\x8B\xA1\x9A\x4E\xCB\xAE\x31\xCD\xB0\x31\xD1\xB5\x2A\xDB\xB7\x24\xDE" + "\xB7\x22\xDF\xB9\x1E\xDF\xB9\x1E\xDF\xB9\x1E\xDE\xB8\x1D\xDF\xB9\x1E" + "\xE0\xB9\x1E\xE0\xB8\x1D\xE0\xB7\x18\xDD\xB6\x22\xDC\xB8\x1F\xDE\xB3" + "\x16\xD9\xA6\x12\xCE\x9E\x15\x96\x72\x13\x88\x7B\x5F\xD4\xD8\xDA\xEA" + "\xF1\xF6\xE9\xF0\xF7\xE7\xF0\xF7\xE3\xEE\xF7\xE2\xEE\xF7\xE4\xEF\xF9" + "\xE3\xEF\xF9\xDC\xE8\xF2\xC4\xD0\xDA\x91\x9E\xA8\x39\x46\x50\x07\x14" + "\x1E\x06\x13\x1E\x06\x12\x1C\x06\x5F\x0F\x16\x2E\x29\x17\x8D\x63\x12" + "\xC5\x8B\x0E\xD4\xA6\x18\xDE\xB6\x21\xE1\xB9\x20\xDF\xBA\x20\xDD\xBA" + "\x22\xDF\xBA\x20\xE0\xBA\x20\xDE\xB9\x22\xC5\xB2\x3A\x79\x9C\x81\x3D" + "\x89\xB7\x34\x86\xBD\x33\x85\xBD\x2F\x83\xBE\x2E\x80\xBA\x27\x7B\xBE" + "\x1B\x75\xC4\x15\x70\xC0\x15\x6D\xBB\x14\x69\xB4\x13\x64\xAC\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x4E\x95\xC6\x14" + "\x29\x38\x83\x00\x7F\x09\x34\x57\x11\x65\xAB\x1E\x75\xBA\x33\x77\xA2" + "\x38\x7C\x9F\x3C\x7E\x9E\x40\x81\x9E\x49\x85\x97\x5C\x8C\x89\x7D\x96" + "\x71\x9F\xA3\x54\xC0\xAE\x38\xD6\xB6\x27\xDD\xB7\x1F\xDF\xB8\x1E\xDF" + "\xB9\x1E\xDF\xB9\x1C\xE1\xB7\x1B\xDC\xB8\x1D\xD9\xB7\x24\xDE\xB5\x1C" + "\xDD\xA8\x15\xCF\x97\x16\xA3\x7B\x15\x56\x4D\x28\x3D\x4C\x57\x63\x88" + "\xA5\x72\xA4\xCD\x71\xAA\xD8\x5F\xA5\xDD\x53\x9D\xD8\x49\x93\xCE\x3A" + "\x86\xC4\x2D\x79\xB7\x20\x6E\xAD\x19\x68\xA7\x17\x65\xA4\x17\x64\xA3" + "\x17\x65\xA4\x14\x5B\x93\x13\x4D\x7C\x35\x42\x3D\x8F\x60\x6F\x28\xC5" + "\x8A\x0A\xD5\xA3\x15\xDE\xB7\x23\xE1\xBA\x22\xDF\xBB\x22\xDD\xBB\x23" + "\xD5\xB7\x2A\xD2\xB6\x2D\xB0\xAB\x4D\x5A\x91\x9B\x3E\x88\xB4\x3B\x86" + "\xB4\x41\x87\xAE\x3E\x83\xAE\x35\x7E\xB2\x27\x7A\xBE\x18\x71\xC1\x15" + "\x6D\xBC\x14\x6A\xB7\x14\x67\xB1\x13\x64\xAB\x12\x5F\xA4\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x57\xBC\xFF\x50\xB9" + "\xFF\x29\x65\x8D\x07\x13\x1C\x01\x82\x00\x7F\x15\x43\x67\x31\x75\xA0" + "\x34\x75\x9B\x36\x77\x9D\x34\x78\x9F\x38\x7B\x9B\x35\x7A\xA1\x37\x7B" + "\xA3\x40\x7F\x9C\x4E\x85\x91\x6B\x8D\x79\x84\x96\x66\xAF\xA5\x45\xCE" + "\xB4\x29\xD7\xB8\x1C\xDD\xB9\x1B\xDC\xB7\x1D\xDD\xB6\x1D\xE3\xB6\x19" + "\xDD\xAA\x0D\xC7\x91\x09\x9C\x85\x3C\x6C\x88\x8E\x52\x91\xC4\x51\x9F" + "\xDD\x49\x98\xD8\x40\x91\xD2\x36\x86\xC7\x2E\x7F\xC2\x25\x78\xBB\x1F" + "\x74\xB8\x1B\x70\xB6\x17\x6D\xB3\x17\x6C\xB1\x16\x69\xAC\x15\x65\xA4" + "\x14\x61\x9E\x14\x5D\x98\x15\x5D\x98\x35\x54\x60\x86\x76\x3A\xC2\x8C" + "\x15\xD4\x5C\x97\x0E\xDF\xB2\x26\xDF\xBB\x20\xDF\xBB\x17\xE0\xBA\x1C" + "\xC1\xAF\x3D\xA3\xA7\x5B\x5F\x91\x96\x44\x88\xAB\x48\x88\xA8\x44\x85" + "\xA8\x33\x7F\xB5\x25\x7B\xC1\x1B\x74\xC2\x17\x6F\xBD\x14\x6B\xB8\x14" + "\x68\xB3\x13\x65\xAE\x13\x62\xA8\x12\x5F\xA3\x11\x5B\x9B\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x49\xB7\xFF\x43\xB4" + "\xFF\x3C\xB1\xFF\x38\xB0\xFF\x16\x4D\x71\x82\x06\x7F\x05\x1B\x1F\x1B" + "\x26\x51\x6A\x2E\x6F\x9C\x2B\x70\x9E\x2E\x72\x9E\x2E\x72\xA0\x2E\x73" + "\xA1\x2E\x75\xA2\x2C\x75\xA4\x27\x72\xA4\x24\x6F\xA4\x2A\x6F\x9C\x4D" + "\x7B\x82\x89\x92\x58\xBD\xA7\x30\xD4\xB1\x23\xD8\xAE\x23\xD7\xA9\x20" + "\xC4\x94\x14\xA1\x75\x0D\x82\x9C\x98\x6A\xAC\xDE\x53\x99\xD0\x46\x8D" + "\xC8\x3D\x86\xC1\x33\x7D\xB9\x2B\x73\xAE\x24\x6E\xA9\x1C\x67\xA3\x17" + "\x61\x9E\x13\x5C\x97\x10\x57\x91\x10\x54\x8B\x0F\x4E\x82\x0E\x49\x79" + "\x0E\x46\x74\x0D\x42\x6E\x0F\x43\x6C\x2F\x56\x6A\x76\x72\x42\xB0\x88" + "\x22\xC5\x8E\x15\x7F\xCE\x9C\x1A\xDA\xB4\x26\xDC\xB5\x21\xD7\xB4\x25" + "\xB7\xAA\x3C\x69\x90\x83\x4C\x86\x9F\x4E\x83\x99\x43\x7E\xA2\x31\x7C" + "\xB4\x21\x78\xC3\x17\x71\xBF\x14\x6C\xB9\x14\x69\xB4\x13\x66\xAF\x13" + "\x63\xAA\x12\x60\xA4\x12\x5D\x9F\x11\x5A\x9A\x10\x56\x93\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x3C\xB1\xFF\x37\xAF" + "\xFF\x33\xAE\xFF\x32\xAA\xF9\x31\xA6\xF4\x2A\x91\xD3\x17\x3B\x52\x16" + "\x14\x11\x1C\x29\x32\x21\x59\x83\x22\x6B\xA2\x21\x6A\xA1\x22\x6B\xA2" + "\x1E\x6C\xA6\x1C\x6B\xA7\x18\x68\xA7\x16\x64\xA5\x13\x7F\x62\xA1\x14" + "\x60\x9D\x1C\x60\x94\x3A\x6A\x7B\x55\x73\x68\x65\x76\x5C\x6A\x72\x54" + "\x56\x3E\x0E\x60\x6A\x60\x74\xA4\xC1\x62\x96\xB6\x47\x81\xAE\x39\x76" + "\xA6\x32\x70\xA2\x2C\x6C\x9F\x27\x66\x9A\x20\x5E\x90\x19\x57\x88\x15" + "\x51\x81\x12\x4C\x7B\x12\x48\x74\x11\x44\x6D\x11\x40\x67\x12\x3F\x63" + "\x12\x3E\x61\x0F\x3B\x5F\x0F\x38\x5A\x2B\x4F\x62\x52\x6A\x5E\x79\x7D" + "\x51\x89\x82\x4C\x87\x68\x17\x8C\x7D\x34\x8B\x92\x61\x81\x8F\x68\x66" + "\x8A\x7F\x57\x82\x89\x4F\x7B\x8E\x3D\x76\x9C\x2A\x7A\xBC\x1B\x75\xC3" + "\x17\x6F\xBD\x14\x6B\x43\xB7\x14\x67\xB1\x13\x64\xAB\x12\x61\xA6\x12" + "\x5E\xA0\x11\x5B\x9B\x11\x58\x96\x10\x52\x8D\x0F\x4F\x88\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x33\xAE\xFF\x32\xAA" + "\xFA\x31\xA7\xF4\x30\xA3\xEE\x2F\x9F\xE9\x2E\x9C\xE4\x2D\x99\xE0\x22" + "\x75\xAB\x09\x1F\x2D\x86\x00\x83\x01\x89\x00\x01\x01\x82\x00\x82\x01" + "\x01\x00\x82\x01\x7F\x00\x05\x03\x00\x0D\x09\x00\x13\x0D\x00\x18\x11" + "\x00\x1F\x16\x01\x23\x18\x01\x27\x1A\x02\x73\x91\x9B\x70\x94\xA7\x56" + "\x82\x9F\x4A\x7F\xA9\x56\x95\xC8\x56\x9F\xD9\x51\x9F\xDE\x44\x9E\xE7" + "\x3C\x9B\xE7\x34\x96\xE7\x2E\x93\xE6\x2C\x93\xE6\x2C\x93\xE6\x2C\x93" + "\xE6\x2D\x93\xE5\x2E\x92\xE5\x2D\x91\xE2\x34\x8F\xD9\x3A\x89\xC9\x38" + "\x67\x85\x48\x62\x5D\x67\x73\x57\x6C\x78\x5B\x6E\x76\x52\x67\x4D\x0C" + "\x6C\x7B\x67\x66\x81\x7C\x59\x7C\x83\x4B\x75\x89\x37\x73\xA2\x25\x7B" + "\xC4\x19\x72\xC0\x16\x6E\xBA\x14\x69\xB5\x13\x66\xAF\x7F\x12\x60\xA4" + "\x12\x5D\x9F\x12\x5B\x9A\x11\x57\x96\x0A\x38\x60\x0A\x36\x5E\x05\x1A" + "\x2D\x04\x18\x2A\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x31\xA7\xF4\x30\xA4\xEF\x2F\xA1\xEB\x2F\x9E\xE7\x2E\x9B\xE3" + "\x2D\x98\xDE\x2C\x95\xDA\x2B\x92\xD6\x12\x3E\x5B\x42\x6A\x85\x79\xC0" + "\xF1\x72\xBD\xF1\x6D\xBB\xF0\x69\xB9\xEF\x65\xB7\xEE\x60\xB2\xEA\x59" + "\xAC\xE5\x53\xA2\xD5\x4E\x9A\xC6\x4B\x94\xB9\x47\x90\xB0\x40\x8A\xAA" + "\x3F\x85\x9F\x46\x7D\x89\x3B\x28\x01\x73\x85\x83\x67\x85\x96\x6F\xA7" + "\xD1\x64\xAE\xEA\x50\x65\xA7\xED\x45\xA1\xEC\x3C\x9D\xEB\x35\x99\xEA" + "\x2E\x95\xE9\x25\x91\xE8\x1D\x8D\xE8\x1C\x8D\xE8\x1C\x8D\xE8\x1C\x8D" + "\xE8\x1C\x8D\xE8\x1C\x8C\xE6\x1C\x89\xE1\x1A\x85\xDC\x1C\x83\xD6\x40" + "\x80\xB4\x38\x57\x5E\x5F\x64\x46\x6D\x6F\x4E\x72\x74\x4E\x6B\x65\x37" + "\x5F\x4C\x1A\x60\x75\x70\x47\x71\x88\x33\x6F\x9E\x25\x76\xBE\x16\x6D" + "\xBA\x16\x6B\xB5\x13\x67\xB0\x0E\x4D\x84\x0C\x40\x6E\x07\x29\x47\x06" + "\x1F\x34\x02\x0A\x11\x83\x00\x7F\x17\x35\x4E\x15\x34\x4E\x27\x66\x9C" + "\x26\x65\x9C\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x30\xA3\xEE\x2F\xA0\xEA\x2E\x9D\xE6\x2D\x9A\xE1\x2D\x97\xDD\x2C" + "\x94\xD9\x2B\x91\xD5\x1B\x5D\x88\x26\x3F\x50\x72\xBD\xF1\x6C\xBA\xF0" + "\x67\xB8\xF0\x63\xB6\xEF\x5E\xB4\xEF\x5A\xB2\xEE\x53\xAE\xED\x4C\xAA" + "\xED\x45\xA7\xEB\x45\xA4\xE4\x3E\x92\xC8\x39\x7D\xA3\x3D\x73\x89\x45" + "\x71\x75\x45\x6A\x65\x36\x27\x04\x62\x75\x77\x7A\xAC\xD3\x62\xAF\xEE" + "\x58\xAA\xEE\x4E\xA6\xED\x43\xA0\xEC\x3A\x9C\xEB\x31\x97\xEA\x2C\x47" + "\x94\xE9\x23\x90\xE8\x1C\x8D\xE8\x1C\x8D\xE8\x1C\x8D\xE8\x1C\x8D\xE8" + "\x1D\x8D\xE8\x1D\x8A\xE3\x1B\x87\xDE\x1B\x84\xD9\x1A\x81\xD3\x29\x84" + "\xCE\x41\x6E\x89\x3B\x4C\x47\x4F\x57\x48\x5A\x63\x51\x5B\x66\x4F\x4B" + "\x46\x27\x3F\x49\x3D\x35\x61\x7A\x22\x57\x84\x0E\x3E\x69\x08\x25\x3E" + "\x06\x18\x28\x83\x01\x7F\x16\x26\x34\x21\x3A\x4F\x33\x5E\x83\x3A\x6F" + "\x9E\x47\x91\xD2\x4A\xA1\xED\x44\x9E\xEC\x3E\x9A\xEB\x36\x97\xEB\x34" + "\x95\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x2F\x9F\xE9\x2E\x9C\xE4\x2D\x99\xE0\x2C\x96\xDC\x2C\x93\xD8\x2B\x90" + "\xD3\x24\x7A\xB3\x0C\x14\x1A\x6E\xBB\xF0\x6E\xBB\xF0\x64\xB7\xEF\x5F" + "\xB4\xEF\x5B\xB2\xEE\x57\xB0\xEE\x52\xAE\xED\x4C\xAB\xED\x43\xA7\xEC" + "\x3B\xA3\xEB\x30\x9E\xEA\x26\x9A\xE9\x2D\x99\xE1\x38\x92\xCD\x3D\x8D" + "\xBC\x3F\x87\xB0\x30\x2C\x25\x7D\xB7\xE7\x6D\xB5\xEF\x5E\x7F\xAE\xEE" + "\x54\xA8\xED\x4B\xA4\xED\x42\x9F\xEC\x38\x9B\xEB\x2F\x96\xEA\x27\x92" + "\xE9\x1E\x8D\xE8\x19\x8B\xE8\x19\x8B\xE8\x19\x8B\xE8\x19\x8B\xE8\x19" + "\x8A\xE6\x19\x87\xE0\x18\x83\xDB\x18\x80\xD6\x18\x7E\xD0\x17\x7B\xCB" + "\x26\x7F\xC6\x3A\x82\xB8\x3E\x7C\xAA\x3D\x79\xA4\x3C\x76\x9E\x2D\x47" + "\x55\x1F\x1E\x19\x1D\x22\x26\x2D\x41\x52\x38\x53\x6C\x4E\x7A\xA1\x56" + "\x8B\xBA\x6B\xB1\xF0\x65\xAF\xEF\x60\xAC\xEF\x55\xA7\xEE\x4E\xA3\xED" + "\x47\x9F\xEC\x40\x9C\xEC\x39\x98\xEB\x35\x96\xEA\x32\x94\xEA\x30\x93" + "\xEA\x17\x96\xEA\x17\x96\x52\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x2E\x9B\xE3\x2D\x98\xDF\x2C\x95\xDB\x2B\x92\xD6\x2A\x8F\xD2\x23\x79" + "\xB1\x0B\x14\x1A\x5D\xA3\xD4\x6A\xB9\xF0\x61\xB5\xEF\x5C\xB3\xEE\x57" + "\xB1\xEE\x53\xAF\xED\x4E\xAC\xED\x49\xAA\xED\x43\xA7\xEC\x3B\xA3\xEB" + "\x32\x9F\xEA\x28\x9B\xE9\x1C\x95\xE8\x19\x8F\xE0\x17\x88\xD7\x17\x84" + "\xCE\x15\x7E\xC5\x83\x01\x4B\x6C\xB4\xF0\x66\xB2\xEF\x5B\xAC\xEE\x52" + "\xA7\xED\x48\xA3\xEC\x3F\x9E\xEB\x36\x9A\xEB\x2D\x95\xEA\x24\x91\xE9" + "\x1B\x8C\xE8\x18\x8B\xE8\x18\x8B\xE8\x18\x8B\xE8\x18\x8A\xE7\x18\x88" + "\xE2\x17\x85\xDD\x17\x82\xD8\x16\x7E\xD3\x16\x7B\xCD\x16\x79\xC8\x19" + "\x77\xC3\x16\x72\xBD\x14\x6F\xB7\x13\x6B\xB2\x0E\x46\x71\x83\x01\x7F" + "\x46\x68\x85\x80\xBD\xF2\x79\xB9\xF1\x6F\xB4\xF0\x6A\xB1\xF0\x64\xAE" + "\xEF\x5F\xAB\xEF\x59\xA9\xEE\x53\xA6\xED\x4E\xA3\xED\x47\x9F\xEC\x40" + "\x9B\xEB\x39\x98\xEB\x33\x95\xEA\x31\x94\xEA\x2E\x92\xEA\x2C\x91\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x2C\x95" + "\xDB\x2B\x92\xD6\x2A\x8F\xD1\x29\x8C\xCC\x28\x88\xC8\x0D\x2C\x40\x43" + "\x7A\x9F\x65\xB7\xEF\x5D\xB3\xEF\x59\xB1\xEE\x54\xAF\xEE\x50\xAD\xED" + "\x4B\xAB\xED\x46\xA9\xEC\x42\xA7\xEC\x3B\xA4\xEB\x33\xA0\xEA\x2A\x9C" + "\xE9\x1E\x96\xE8\x17\x90\xE4\x16\x7F\x8B\xDB\x15\x85\xD2\x14\x80\xC9" + "\x14\x7A\xC0\x01\x00\x01\x5B\x9E\xD3\x62\xB0\xEF\x58\xAA\xEE\x4E\xA6" + "\xED\x45\xA1\xEC\x3C\x9D\xEB\x33\x98\xEA\x2A\x94\xE9\x21\x8F\xE8\x1A" + "\x8C\xE8\x19\x8B\xE7\x1B\x8C\xE7\x19\x8A\xE6\x18\x87\xE2\x18\x85\xDD" + "\x18\x82\xD8\x16\x7F\xD3\x16\x7C\xCE\x16\x79\xC9\x16\x76\xC3\x15\x73" + "\xBE\x14\x6F\xB8\x13\x6B\xB3\x0F\x59\x95\x01\x0B\x12\x28\x3D\x50\x79" + "\xB9\xF1\x72\xB6\xF1\x6D\xB3\xF0\x67\xB0\xEF\x61\xAD\xEF\x5C\xAA\xEE" + "\x56\xA7\xEE\x51\xA4\xED\x4B\xA1\xED\x46\x9E\xEC\x3F\x9B\xEB\x38\x97" + "\x7F\xEB\x32\x94\xEA\x2F\x93\xEA\x2D\x92\xEA\x2A\x90\xE9\x28\x8F\xE9" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x2A\x8E" + "\xD0\x29\x8B\xCB\x28\x88\xC7\x27\x84\xC2\x15\x46\x66\x35\x64\x84\x61" + "\xB5\xEF\x5A\xB2\xEE\x56\xB0\xEE\x52\xAE\xED\x4D\xAB\xED\x49\xA9\xEC" + "\x43\xA7\xEC\x3E\xA5\xEB\x3A\xA3\xEB\x34\xA0\xEA\x2B\x9C\xEA\x22\x98" + "\xE9\x17\x93\xE7\x17\x8D\xDF\x16\x88\xD6\x15\x82\xCD\x14\x7C\xC4\x13" + "\x77\xBB\x06\x25\x3B\x40\x74\x9F\x5C\xAD\xEE\x51\xA7\xED\x48\xA3\xEC" + "\x3F\x9E\xEB\x36\x9A\xEB\x2D\x95\xEA\x7F\x24\x91\xE9\x1B\x8C\xE8\x18" + "\x8B\xE7\x18\x88\xE3\x18\x88\xE3\x17\x86\xDF\x18\x83\xDA\x18\x81\xD5" + "\x18\x7E\xD0\x17\x7B\xCC\x16\x78\xC7\x15\x75\xC1\x16\x72\xBC\x15\x6E" + "\xB6\x13\x6A\xB1\x12\x63\xA6\x04\x16\x25\x0C\x14\x1A\x67\xA2\xD5\x74" + "\xB7\xF1\x6A\xB1\xF0\x64\xAE\xEF\x5F\xAB\xEF\x59\xA9\xEE\x53\xA6\xED" + "\x4E\xA3\xED\x48\xA0\xEC\x43\x9D\xEC\x3D\x9A\xEB\x38\x97\xEB\x31\x94" + "\xEA\x2E\x92\xEA\x2B\x91\xE9\x29\x90\xE9\x26\x8E\xE9\x24\x8D\xE9\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x28\x88\xC6" + "\x27\x7F\x84\xC1\x26\x80\xBC\x18\x52\x77\x1F\x3B\x4F\x5D\xB3\xEE\x57" + "\xB0\xEE\x52\xAE\xED\x4F\xAC\xED\x4B\xAB\xEC\x46\xA9\xEC\x42\xA7\xEC" + "\x3B\xA3\xEB\x36\xA1\xEB\x32\x9F\xEA\x2C\x9C\xEA\x23\x98\xE9\x1A\x94" + "\xE8\x17\x90\xE2\x16\x8A\xDA\x15\x85\xD1\x14\x7F\xC8\x13\x79\xBF\x13" + "\x74\xB6\x05\x24\x39\x3C\x72\x9E\x56\xAA\xEE\x4D\xA5\xED\x42\xA0\xEC" + "\x39\x9B\xEB\x30\x97\xEA\x27\x92\xE9\x1E\x8E\xE8\x18\x8B\xE7\x18\x88" + "\xE3\x18\x86\xDF\x17\x84\xDC\x17\x81\xD7\x17\x7F\xD2\x19\x7D\xCD\x19" + "\x7A\xC9\x18\x78\xC4\x15\x74\xBF\x15\x71\x0D\xBA\x13\x6C\xB5\x13\x69" + "\xAF\x12\x66\xAA\x07\x2A\x47\x83\x00\x7F\x57\x8C\xBA\x70\xB5\xF0\x67" + "\xB0\xEF\x61\xAD\xEF\x5C\xAA\xEE\x56\xA7\xEE\x51\xA4\xED\x4B\xA1\xED" + "\x46\x9E\xEC\x40\x9C\xEC\x3A\x99\xEB\x35\x96\xEA\x2F\x93\xEA\x2C\x91" + "\xEA\x2A\x90\xE9\x27\x8F\xE9\x25\x8D\xE9\x22\x8C\xE9\x20\x8B\xE8\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x26\x81\xBD" + "\x25\x7E\xB8\x1F\x68\x99\x09\x13\x1A\x59\xB1\xEE\x59\xB1\xEE\x4F\xAD" + "\xED\x4A\xAB\xED\x46\xA8\xEC\x41\xA6\xEC\x3D\xA4\xEB\x39\xA2\xEB\x33" + "\xA0\xEA\x2E\x9E\xEA\x2A\x9B\xE9\x24\x99\xE9\x1C\x95\xE8\x17\x92\xE6" + "\x16\x56\x8D\xDE\x16\x87\xD5\x15\x81\xCC\x14\x7C\xC3\x13\x76\xBA\x12" + "\x71\xB1\x05\x23\x37\x38\x70\x9E\x4F\xA6\xED\x46\xA1\xEC\x3C\x9D\xEB" + "\x33\x98\xEA\x2A\x94\xE9\x21\x8F\xE8\x18\x8B\xE8\x18\x88\xE3\x18\x86" + "\xDF\x17\x83\xDA\x17\x80\xD4\x17\x7D\xCF\x15\x79\xCA\x15\x77\xC6\x14" + "\x74\xC1\x14\x71\xBC\x13\x6E\xB7\x13\x6B\xB3\x12\x68\xAD\x12\x65\xA8" + "\x0C\x40\x6B\x83\x00\x7F\x3C\x63\x84\x6D\xB3\xF0\x64\xAE\xEF\x5F\xAB" + "\xEF\x59\xA9\xEE\x54\xA6\xED\x4E\xA3\xED\x48\xA0\xEC\x43\x9D\xEC\x3D" + "\x9A\xEB\x38\x97\xEB\x32\x94\xEA\x2D\x91\xEA\x29\x8F\xE9\x28\x8F\xE9" + "\x26\x8E\xE9\x23\x8D\xE9\x21\x8B\xE8\x1E\x8A\xE8\x1C\x89\xE8\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x24\x7B\xB4\x22" + "\x73\xA9\x09\x13\x1A\x4B\x9B\xD2\x55\xB0\xEE\x4C\xAB\xED\x47\xA9\xEC" + "\x42\xA7\xEC\x3F\xA5\xEB\x3A\xA3\xEB\x35\xA0\xEA\x31\x9E\xEA\x2B\x9C" + "\xEA\x26\x9A\xE9\x22\x98\xE9\x1D\x95\xE8\x17\x93\xE8\x17\x7F\x8F\xE1" + "\x16\x89\xD9\x15\x84\xD0\x14\x7E\xC7\x13\x79\xBE\x12\x73\xB5\x12\x6E" + "\xAD\x05\x22\x35\x34\x6E\x9E\x49\xA3\xEC\x3E\x9E\xEB\x35\x9A\xEA\x2D" + "\x95\xEA\x24\x91\xE9\x1B\x8C\xE8\x18\x88\xE3\x18\x86\xDF\x17\x83\xDB" + "\x16\x7E\xD2\x16\x7A\xCC\x15\x78\xC7\x15\x75\xC3\x14\x72\xBE\x14\x6F" + "\xB9\x13\x6C\xB4\x13\x69\xB0\x12\x67\xAB\x12\x64\xA6\x0F\x53\x8A\x01" + "\x0A\x11\x23\x3B\x50\x6A\xB1\xF0\x62\xAD\xEF\x5C\xAA\xEE\x56\xA7\xEE" + "\x51\xA4\xED\x4B\xA1\xED\x46\x9E\xEC\x40\x9C\xEC\x3A\x99\xEB\x35\x96" + "\xEA\x2F\x93\xEA\x2A\x90\x2D\xE9\x25\x8D\xE9\x24\x8D\xE9\x23\x8D\xE9" + "\x22\x8C\xE9\x1F\x8B\xE8\x1D\x89\xE8\x1A\x88\xE8\x18\x87\xE8\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x23\x75\xAB\x0B" + "\x25\x82\x36\x7F\x74\x9E\x51\xAE\xED\x49\xAA\xED\x44\xA8\xEC\x3F\xA5" + "\xEC\x3A\xA3\xEB\x36\xA1\xEB\x31\x9F\xEA\x2C\x9D\xEA\x28\x9B\xE9\x23" + "\x98\xE9\x1E\x96\xE8\x1A\x94\xE8\x17\x93\xE8\x17\x91\xE4\x16\x8C\xDC" + "\x15\x86\xD4\x15\x81\xCB\x14\x7B\xC2\x13\x76\xB9\x12\x70\xB0\x11\x6A" + "\xA8\x05\x21\x34\x1F\x48\x68\x43\xA0\xEC\x38\x9B\xEB\x2F\x97\xEA\x26" + "\x92\xE9\x1D\x8E\xE8\x18\x8A\xE6\x18\x86\xDF\x17\x84\xDB\x16\x7F\xD3" + "\x15\x7A\xCB\x15\x76\xC4\x14\x73\xBF\x14\x70\xBB\x13\x6D\xB6\x13\x6A" + "\xB1\x12\x68\xAD\x12\x65\xA8\x11\x62\xA3\x10\x5C\x7F\x98\x03\x13\x21" + "\x0B\x13\x1A\x5B\x9B\xD3\x66\xAF\xEF\x5B\xA9\xEE\x54\xA6\xEE\x4E\xA3" + "\xED\x48\xA0\xEC\x43\x9D\xEC\x3D\x9A\xEB\x38\x97\xEB\x32\x94\xEA\x2D" + "\x91\xEA\x27\x8F\xE9\x21\x8C\xE8\x20\x8B\xE8\x1F\x8A\xE8\x1E\x8A\xE8" + "\x1D\x8A\xE8\x1B\x88\xE8\x19\x87\xE8\x18\x87\xE7\x18\x86\xE5\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x15\x48\x6A\x2E" + "\x61\x83\x52\xAE\xED\x4B\xAB\xED\x46\xA8\xEC\x41\xA6\xEC\x3C\xA4\xEB" + "\x36\xA1\xEB\x32\x9F\xEA\x2D\x9D\xEA\x29\x9B\xE9\x24\x99\xE9\x1F\x97" + "\xE8\x1B\x94\xE8\x5D\x17\x93\xE8\x17\x93\xE8\x17\x91\xE4\x16\x8B\xDC" + "\x15\x86\xD3\x14\x80\xCA\x14\x7B\xC1\x13\x75\xB8\x12\x6F\xB0\x11\x6A" + "\xA7\x0A\x41\x67\x15\x35\x4E\x3C\x9D\xEB\x32\x98\xEA\x29\x93\xE9\x20" + "\x8F\xE8\x18\x8B\xE8\x18\x86\xDF\x17\x84\xDB\x16\x7F\xD4\x16\x7A\xCC" + "\x15\x75\xC3\x14\x71\xBC\x13\x6E\xB8\x13\x6B\xB3\x12\x69\xAE\x12\x66" + "\xA9\x11\x63\xA5\x11\x60\xA0\x11\x5D\x9B\x07\x27\x41\x83\x00\x7F\x4E" + "\x87\xB9\x63\xAE\xEF\x59\xA9\xEE\x53\xA5\xED\x4D\xA2\xED\x46\x9F\xEC" + "\x40\x9C\xEC\x3A\x99\xEB\x35\x96\xEA\x2F\x93\xEA\x2A\x90\xE9\x24\x8D" + "\xE9\x1F\x8A\xE8\x1C\x89\xE8\x1B\x88\xE8\x1A\x88\xE8\x1A\x88\xE8\x19" + "\x87\xE8\x18\x87\xE8\x18\x86\xE6\x18\x85\xE5\x18\x84\xE3\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x1B\x3A\x4F\x53\xAF" + "\xED\x4C\xAB\xED\x47\xA9\xEC\x42\xA7\xEC\x3D\xA4\xEB\x38\xA2\xEB\x34" + "\xA0\xEA\x30\x9E\xEA\x29\x9B\xE9\x25\x99\xE9\x20\x97\xE8\x1C\x95\xE8" + "\x17\x93\xE8\x17\x93\xE8\x17\x56\x93\xE8\x17\x90\xE4\x16\x8B\xDB\x15" + "\x85\xD2\x14\x80\xC9\x14\x7A\xC0\x13\x75\xB8\x12\x6F\xAF\x11\x69\xA6" + "\x0A\x41\x66\x13\x34\x4E\x36\x9A\xEB\x2C\x95\xEA\x23\x90\xE9\x1A\x8C" + "\xE8\x18\x88\xE2\x17\x84\xDB\x17\x80\xD5\x16\x7B\xCD\x15\x76\xC4\x14" + "\x71\xBC\x13\x6C\xB5\x13\x6A\xB0\x12\x67\xAB\x12\x64\xA6\x11\x61\xA2" + "\x11\x5E\x9D\x10\x5B\x98\x0A\x39\x60\x83\x00\x7F\x36\x5F\x84\x60\xAC" + "\xEF\x58\xA8\xEE\x51\xA5\xED\x4B\xA1\xED\x45\x9E\xEC\x3E\x9B\xEB\x38" + "\x97\xEB\x32\x94\xEA\x2D\x91\xEA\x27\x8F\xE9\x21\x8C\xE8\x1C\x89\xE8" + "\x18\x87\xE8\x18\x87\xE8\x18\x87\xE8\x18\x87\xE8\x18\x87\xE8\x18\x87" + "\xE8\x18\x87\xE8\x18\x87\xE7\x18\x86\xE6\x18\x85\xE4\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x53\xAF\xEE\x53\xAF\xEE" + "\x49\xAA\xEC\x44\xA8\xEC\x3F\xA5\xEB\x3A\xA3\xEB\x35\xA1\xEA\x30\x9E" + "\xEA\x2B\x9C\xEA\x26\x9A\xE9\x21\x97\xE9\x1C\x95\xE8\x18\x93\xE8\x17" + "\x93\xE8\x17\x7F\x93\xE8\x17\x93\xE8\x17\x90\xE3\x16\x8A\xDA\x15\x85" + "\xD1\x14\x7F\xC9\x13\x7A\xC0\x13\x74\xB7\x12\x6F\xAE\x11\x69\xA5\x0A" + "\x40\x66\x11\x33\x4E\x30\x97\xEA\x26\x92\xE9\x1D\x8D\xE8\x18\x8A\xE5" + "\x17\x84\xDC\x17\x81\xD7\x16\x7C\xCE\x15\x76\xC5\x14\x71\xBD\x13\x6C" + "\xB4\x12\x68\xAD\x12\x65\xA8\x11\x62\xA3\x11\x5F\x9F\x10\x5C\x9A\x10" + "\x5A\x95\x0D\x4A\x7C\x01\x09\x0F\x1F\x39\x4F\x5E\xAB\xEE\x56\xA7\xEE" + "\x50\xA4\xED\x49\xA0\xEC\x43\x9D\xEC\x3D\x9A\xEB\x37\x97\xEB\x30\x93" + "\xEA\x2A\x90\xE9\x25\x8E\xE9\x20\x8B\xE8\x1C\x89\x7F\xE8\x18\x87\xE8" + "\x18\x87\xE8\x18\x87\xE8\x18\x87\xE8\x18\x87\xE8\x18\x87\xE8\x18\x87" + "\xE8\x18\x87\xE8\x18\x87\xE8\x18\x86\xE7\x18\x85\xE5\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x7F\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x7F\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\x7F\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x7F\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x41\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17" + "\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA" + "\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96\xEA\x17\x96" + "\xEA\x17\x96\xEA" + , //body + 21373, //lenght + 0, + 0, + 0, + }, + { + "large-c.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x31\x35\x20\x31\x35\x0A\x32\x82\x35\x01\x0A\x8F\xFF" + "\x83\xC0\x89\x00\x83\xC0\x9B\xFF\x83\xC0\x8F\x00\x83\xC0\x98\xFF\x95" + "\x00\x98\xFF\x95\x00\x98\xFF\x95\x00\x98\xFF\x83\xC0\x8F\x00\x83\xC0" + "\x8F\xFF\x83\xC0\x89\x00\x83\x80\x89\x00\x83\x80\x89\x00\x83\xC0\x83" + "\xFF\x83\xC0\xA7\x00\x83\xC0\xFF\x00\x88\x00\x83\xC0\x8F\x00\x83\xC0" + "\x83\x00\x83\xC0\x8F\x00\x83\xC0\x83\xFF\x83\xC0\x89\x00\x83\xC0\x83" + "\x80\x83\x00\x83\x80\x83\xC0\x89\x00\x83\xC0\x95\xFF\x89\x00\xA1\xFF" + "\x83\x80\x89\x00\x83\x80\x8F\xFF" + , //body + 127, //lenght + 0, + 0, + 0, + }, + { + "large-d.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x31\x35\x20\x31\x35\x0A\x32\x82\x35\x01\x0A\xC3\xFF" + "\x82\x00\xA8\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\xA1\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x9B\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x90\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x8A\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x83\xC0\x9B\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\xA2\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\xA8" + "\xFF\x82\x00\xC2\xFF" + , //body + 345, //lenght + 0, + 0, + 0, + }, + { + "large-h.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x31\x35\x20\x31\x35\x0A\x32\x82\x35\x01\x0A\x86\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x89\xFF\x83\xC0\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x89\xFF\x83\xC0\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x83\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x83\xC0\x83\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x83\xC0\x84\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x86\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x83\xC0\x89\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x83\xC0\x9B\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\xA1\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\xA8\xFF\x82" + "\x00\x95\xFF" + , //body + 615, //lenght + 0, + 0, + 0, + }, + { + "large-s.pnm", + (unsigned char*) + "\x0A\x50\x36\x0A\x31\x35\x20\x31\x35\x0A\x32\x82\x35\x01\x0A\x95\xFF" + "\x83\x00\xA7\xFF\x83\x80\x83\x00\x83\x80\xA1\xFF\x83\x80\x89\x00\x83" + "\x80\x9B\xFF\x83\xC0\x8F\x00\x83\xC0\x95\xFF\x83\xC0\x95\x00\x83\xC0" + "\x8F\xFF\x83\xC0\x9B\x00\x83\xC0\x89\xFF\x83\xC0\xA1\x00\x83\xC0\x86" + "\xFF\xA7\x00\x83\xFF\x83\xC0\xA7\x00\x83\xC0\x83\x80\xA7\x00\x86\x80" + "\xA7\x00\x83\x80\x83\xC0\x8F\x00\x83\xC0\x83\x00\x83\xC0\x8F\x00\x83" + "\xC0\x83\xFF\x83\x80\x86\x00\x83\x80\x83\xFF\x83\x80\x83\x00\x83\x80" + "\x83\xFF\x83\x80\x86\x00\x83\x80\x95\xFF\x89\x00\xA1\xFF\x83\x80\x89" + "\x00\x83\x80\x8F\xFF" + , //body + 141, //lenght + 0, + 0, + 0, + }, + { + "pointer.ppm", + (unsigned char*) + "\x0A\x50\x36\x0A\x35\x30\x20\x38\x37\x0A\x32\x82\x35\x02\x0A\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x0A\xBE\x9B\x98\x96\x74\x6C\xAD\x95\x84\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x10\xD4\xB0\xAB\xC0\xAA\xA3\xC6" + "\x8E\x90\x8B\x53\x41\xA8\x8A\x81\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xEC\xCC\xCE" + "\xC7\x9D\x98\xD3\xC2\xB9\xDA\xAB\xAA\x9A\x6F\x58\x7B\x4C\x43\xC2\xA6" + "\xA2\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x16\xDA\xB6\xB7\xC8\x9A\x94\xD3\xC2\xB9\xD3\xA6\xA4\x96\x71" + "\x58\x89\x4E\x43\xAE\x88\x86\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xC7\x9A\x98\xCD\x95\x8F\xCD\xB2" + "\xAA\xC6\x8E\x90\xA3\x73\x60\x9A\x51\x41\x8D\x5D\x57\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xC9\x99" + "\x96\xD0\x94\x8D\xD2\xB0\xA8\xCC\x8C\x91\xB0\x75\x68\xA2\x5A\x45\x8B" + "\x59\x4F\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x16\xD0\x9D\x99\xD2\x94\x8C\xD6\xB0\xAA\xD3\x8F\x95\xB6" + "\x75\x6A\xAB\x63\x4C\x8B\x59\x4F\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xC5\x9E\x92\xDF\xA4\x99\xD3" + "\x92\x7D\xC9\x88\x71\xC2\x6F\x5E\xA2\x5F\x46\x91\x5B\x4A\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xC4" + "\x9D\x91\xE5\xAA\x9D\xD3\x92\x7B\xCD\x8C\x73\xC2\x72\x5E\xA7\x64\x4B" + "\x8D\x57\x46\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x16\xC0\x95\x88\xE0\xA4\x95\xD5\x94\x7B\xD3\x95\x79" + "\xB8\x6D\x56\xA2\x5F\x46\x84\x4E\x3D\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xC2\x95\x87\xE0\xA1\x93" + "\xD4\x93\x7A\xCD\x90\x74\xB5\x6C\x54\xA0\x5D\x44\x87\x51\x40\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16" + "\xBD\x8F\x80\xDF\xA0\x90\xD2\x94\x78\xC5\x89\x6A\xCC\x85\x6A\xA3\x60" + "\x47\x98\x62\x51\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x16\xBC\x95\x89\xDA\xAF\x96\xC9\x8F\x7B\xDA\x9B" + "\x8D\xC7\x86\x6D\xA1\x63\x4D\x89\x59\x46\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xC0\x9B\x8F\xDB\xB2" + "\x98\xCE\x98\x85\xD7\x9C\x8D\xC4\x85\x6B\xA2\x64\x4E\x8A\x5A\x47\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x16\xC8\xAA\x97\xD7\xB8\x9B\xD7\xAD\x9A\xD2\x9F\x92\xC0\x86\x69\xA9" + "\x6B\x55\x91\x61\x4E\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x16\xCA\xAD\x96\xD5\xB9\x9B\xD7\xB1\x9F\xD0" + "\x9F\x92\xC4\x87\x6B\xAD\x6F\x59\x95\x65\x52\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xD8\xB7\x9D\xDD" + "\xBF\xA0\xD2\xAB\x9F\xD0\x9C\x95\xCC\x89\x6F\xB4\x76\x60\x9B\x6B\x58" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x16\xDE\xBC\xA0\xE2\xC2\xA4\xD1\xA8\x9D\xCF\x9B\x94\xD0\x89\x70" + "\xB6\x78\x62\x9D\x6D\x5A\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x16\xDA\xBC\x9D\xDF\xC0\xA5\xD3\xAC\x96" + "\xD9\xA9\x94\xCC\x91\x7A\xAB\x83\x60\xAC\x6C\x5A\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xDB\xB9\x9C" + "\xDE\xBC\xA0\xD5\xAA\x93\xDB\xAA\x93\xCF\x94\x7D\xB3\x81\x61\xB1\x6C" + "\x5C\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x0D\xBF\xAB\xA4\x8A" + "\x68\x60\x84\x65\x5A\x82\x64\x5B\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xD8" + "\xAC\x90\xDB\xAA\x92\xD6\x9C\x88\xDC\xA1\x8C\xCE\x91\x76\xAB\x71\x52" + "\xB6\x6E\x5B\x20\x82\xFF\x01\x20\x82\xFF\x16\xB0\x7E\x76\xAB\x7A\x6D" + "\x86\x44\x32\x90\x52\x3E\x9F\x65\x51\x5C\x35\x27\x7E\x5F\x54\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x07\xD2\xBE\xB7\xD8\xC6\xC1\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xDA\xA7\x8B\xD9" + "\xA2\x8C\xD4\x94\x82\xDB\x9B\x88\xCB\x8E\x73\xAC\x7A\x58\xB1\x6B\x58" + "\x20\x82\xFF\x01\x20\x82\xFF\x16\xB0\x78\x6A\xB4\x7E\x69\x95\x57\x43" + "\x92\x54\x40\x9B\x60\x4B\x75\x47\x36\x67\x40\x32\x20\x82\xFF\x01\x20" + "\x82\xFF\x10\x94\x75\x69\x7D\x5A\x4B\x7B\x5A\x4C\x70\x51\x45\x90\x79" + "\x6B\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x16\xDA\xA4\x87\xDB\x9D\x87\xD4\x90\x7E\xDC" + "\x98\x84\xC9\x8C\x70\xAD\x86\x60\xAB\x67\x51\x20\x82\xFF\x01\x20\x82" + "\xFF\x16\xAE\x72\x5F\x95\x62\x46\x86\x51\x40\x7C\x46\x33\x7F\x48\x33" + "\x8B\x59\x49\x7A\x4B\x3E\x20\x82\xFF\x01\x20\x82\xFF\x10\x9D\x71\x5D" + "\xA2\x71\x59\x9E\x6F\x57\x8E\x62\x4E\x67\x44\x2D\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x16\xD9\xA6\x8C\xDC\x9E\x88\xCD\x87\x74\xD9\x98\x83\xC8\x93\x7A\xBE" + "\x7B\x61\xB1\x76\x5F\x20\x82\xFF\x01\x20\x82\xFF\x2E\x8E\x60\x4F\x8D" + "\x5B\x47\x81\x4D\x39\x7B\x47\x33\x88\x56\x44\x88\x57\x47\x83\x52\x42" + "\x3D\x18\x17\x80\x59\x4B\xA4\x76\x58\xAB\x7A\x63\x9A\x6A\x57\x91\x64" + "\x4C\x99\x5E\x45\x84\x69\x5D\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xDA\xA9\x8F\xDC\xA1\x8A\xCD\x89" + "\x75\xD8\x98\x83\xCB\x96\x7D\xBF\x7F\x64\xB1\x78\x60\x20\x82\xFF\x01" + "\x20\x82\xFF\x31\x89\x5B\x4A\x87\x53\x3F\x84\x50\x3C\x80\x4C\x38\x89" + "\x57\x45\x8B\x5A\x4A\x84\x53\x43\x3B\x16\x15\x81\x5A\x4C\xA6\x78\x5A" + "\xAB\x7A\x63\x9B\x6B\x58\x94\x65\x4C\x98\x5F\x47\x6D\x50\x43\xAC\x9E" + "\x97\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x07\xD9\xC8\xC9\xAB\x87\x76\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x16\xDA\xB4\x98" + "\xDD\xAE\x95\xD0\x99\x83\xD8\xA1\x8B\xCE\x99\x82\xCE\x90\x74\xB1\x7A" + "\x62\x20\x82\xFF\x01\x20\x82\xFF\x40\x76\x45\x35\x7B\x43\x31\x8B\x57" + "\x43\x8B\x57\x43\x8D\x5B\x49\x90\x5F\x4F\x86\x55\x45\x38\x12\x10\x88" + "\x60\x50\xB0\x80\x61\xB0\x7C\x65\x9F\x6D\x59\x9A\x69\x4F\x96\x65\x4E" + "\x78\x55\x48\xAF\x91\x88\x81\x63\x5A\x75\x54\x46\x8B\x59\x47\x7A\x4E" + "\x3E\xBF\xA5\x9D\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x0D\xC0\xAA\xA6\xAD\x72\x63\x8B\x4C\x4E\xCD\xA1\xA7" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x5E\xD9\xB7\x9B\xDD\xB6" + "\x9C\xD5\xA4\x8D\xDA\xA6\x90\xCB\x97\x81\xCD\x90\x74\xAF\x7A\x61\x98" + "\x74\x63\xCA\xA5\x99\x6B\x39\x29\x78\x3E\x2C\x8D\x59\x45\x8E\x5A\x46" + "\x8F\x5D\x4B\x90\x5F\x4F\x87\x56\x46\x3A\x11\x0E\x8E\x63\x53\xB5\x86" + "\x65\xB5\x80\x67\xA5\x71\x5B\x9C\x6B\x51\x9A\x6B\x53\x77\x50\x42\x9B" + "\x77\x6E\x64\x3D\x31\x8E\x62\x52\xB5\x77\x63\x8B\x54\x3F\x83\x60\x53" + "\xCE\xB8\xB1\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x10" + "\xC4\xA5\x9A\xDD\xBF\xB0\xC0\x57\x4D\x9C\x35\x27\x88\x47\x32\x20\x82" + "\xFF\x01\x20\x82\xFF\x5E\xD6\xBE\xA1\xDB\xC0\xA4\xD6\xB1\x98\xD7\xAC" + "\x95\xCB\x97\x83\xC4\x8C\x6E\xB0\x7D\x63\xA0\x7C\x6B\xC0\x9B\x8F\x62" + "\x2B\x1D\x81\x45\x34\x92\x5E\x4A\x91\x5D\x49\x98\x66\x54\x91\x60\x50" + "\x8D\x5C\x4C\x40\x16\x11\x96\x6A\x58\xBF\x8D\x6B\xC1\x8B\x70\xAE\x79" + "\x62\x9F\x6C\x50\x95\x69\x4F\x7C\x4F\x41\x49\x1D\x15\x81\x52\x49\x9E" + "\x6D\x5F\x9B\x61\x4D\x9D\x66\x51\x78\x4C\x3C\x62\x40\x35\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x13\xC9\xA7\x9C\xCD\xC9\xB7" + "\xD9\x6F\x60\xC5\x52\x3A\x74\x20\x03\xBB\x9B\x9D\x20\x82\xFF\x61\xD7" + "\xC1\xA3\xD9\xC1\xA4\xD3\xB0\x97\xD5\xAB\x94\xCD\x99\x85\xC9\x91\x73" + "\xB0\x7F\x65\x95\x71\x60\xB0\x8B\x7F\x61\x2A\x1C\x8F\x50\x40\x95\x61" + "\x4D\x92\x5E\x4A\x9C\x6A\x58\x92\x61\x51\x91\x60\x50\x42\x18\x13\x98" + "\x6C\x5A\xC2\x8E\x6D\xC4\x8E\x73\xB1\x7C\x65\x9F\x6C\x50\x9E\x72\x58" + "\x84\x57\x49\x3E\x10\x09\x89\x59\x53\x92\x61\x54\x9F\x69\x58\x89\x54" + "\x43\x86\x5A\x4A\x7A\x57\x4C\x94\x7E\x78\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x76\xC2\xAB\x9C\xD1\xAE\x9F\xD7\x8C\x76\xC6\x68\x53\xA5\x47" + "\x32\x68\x30\x28\xBD\x97\x93\xE2\xC3\xA6\xDA\xC2\xA7\xD4\xBB\xA6\xD3" + "\xAF\x9D\xD1\x99\x89\xCA\x91\x79\xA9\x75\x61\xAB\x82\x77\x9F\x76\x6D" + "\x6C\x37\x28\x87\x4D\x3B\x96\x69\x55\xA4\x72\x60\x9F\x72\x5E\x91\x6A" + "\x52\x91\x5D\x47\x48\x19\x0C\xA1\x6E\x61\xC9\x91\x81\xC6\x8F\x7A\xAE" + "\x84\x65\x9D\x77\x57\xA4\x74\x5F\x86\x5E\x4D\x49\x22\x12\x7B\x4E\x40" + "\xAE\x7B\x6E\x94\x63\x4C\x9D\x69\x52\x8A\x56\x40\x79\x51\x41\x89\x71" + "\x68\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x76\xD5\xC4\xB9\xCB\xB2\xA5" + "\xCC\x8C\x7A\xCB\x77\x64\xCC\x70\x5E\x72\x27\x1B\x56\x15\x0A\xDE\xBD" + "\xA1\xE8\xD0\xB5\xD2\xB9\xA3\xD3\xAD\x99\xCE\x94\x82\xC0\x87\x6D\xB4" + "\x7E\x69\x73\x48\x3B\x67\x3B\x31\x89\x52\x44\x9C\x62\x50\xA5\x75\x60" + "\xAD\x79\x65\xA6\x76\x61\x96\x6F\x57\x96\x64\x50\x59\x26\x19\xA7\x75" + "\x65\xCE\x98\x85\xCF\x9B\x85\xB4\x88\x6C\xA2\x78\x5B\x93\x66\x50\x8D" + "\x62\x52\xA0\x75\x66\x9E\x70\x61\x9D\x6B\x59\xA3\x72\x5B\x9E\x6A\x53" + "\x96\x62\x4C\x88\x60\x50\xC4\xAC\xA3\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x76\xE2\xD6\xCF\xB6\x9E\x93\xCE\x96\x88\xD1\x85\x76\xCB\x72\x63" + "\x93\x3D\x2D\x7A\x27\x18\xDD\xBD\x9F\xEB\xD0\xB4\xD5\xBA\xA2\xD7\xB1" + "\x9D\xCD\x91\x80\xBE\x88\x6D\xB3\x7E\x67\x5F\x30\x25\x54\x25\x1C\x92" + "\x5C\x4B\xA9\x72\x5D\xAE\x7A\x63\xB1\x7A\x64\xA9\x78\x61\x96\x6F\x57" + "\x97\x65\x51\x58\x23\x14\xA8\x73\x64\xD2\x9E\x8A\xD2\xA1\x8A\xB4\x88" + "\x6E\xA3\x77\x5D\x9B\x70\x59\x86\x5A\x4A\x79\x4B\x3C\xA0\x6F\x5F\xAD" + "\x7B\x67\xA8\x77\x60\xA0\x6C\x55\x98\x64\x4E\x85\x5D\x4D\xD1\xB9\xB0" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x73\xD5\xAA\x9B" + "\xCB\x92\x88\xD8\x95\x8B\xDC\x8F\x84\xB6\x5A\x48\x99\x3B\x28\xE0\xBC" + "\x9D\xE3\xC7\xA9\xD8\xBB\xA2\xDB\xB4\x9E\xCC\x8E\x7B\xC1\x8D\x6F\xAD" + "\x78\x5F\x62\x2B\x20\x5D\x26\x1B\x9F\x69\x56\xBF\x8A\x73\xB9\x80\x64" + "\xB6\x7B\x62\xAC\x79\x5F\x94\x6D\x55\x93\x63\x4E\x5E\x26\x14\xAA\x74" + "\x61\xD5\xA5\x90\xD2\xA5\x8F\xB2\x82\x6D\xA5\x73\x5F\x8E\x64\x4F\x8C" + "\x5B\x4D\x62\x2D\x20\xB0\x7C\x66\xC0\x8F\x75\xAF\x7E\x67\xAB\x77\x60" + "\x9D\x69\x53\x80\x58\x48\xB2\x9A\x91\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x73\xC8\x90\x80\xD3\x98\x8D\xD5\x93\x8C\xD2\x8B" + "\x82\xB8\x60\x4E\xA2\x46\x32\xDE\xBA\x99\xE1\xC5\xA6\xDA\xBB\xA2\xD6" + "\xAC\x95\xCB\x8D\x79\xBD\x89\x6A\xAE\x79\x60\x64\x2B\x20\x64\x2B\x21" + "\xAD\x77\x62\xC5\x90\x77\xBD\x83\x66\xB9\x7C\x61\xAF\x7A\x61\x94\x6D" + "\x55\x91\x61\x4E\x74\x3A\x26\xB3\x7D\x68\xD0\xA3\x8D\xD3\xA8\x91\xB4" + "\x82\x6E\xA4\x6F\x5E\x8D\x63\x50\x87\x54\x47\x61\x2A\x1C\xAE\x79\x62" + "\xB9\x89\x6C\xAC\x7B\x64\xAB\x77\x60\x9F\x6B\x55\x86\x5E\x4E\x9C\x84" + "\x7B\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x73\xD8\xA8" + "\x93\xD4\xAE\x92\xD0\xA9\x93\xD2\x9F\x95\xC7\x73\x5F\xB1\x53\x34\xDC" + "\xC1\x9F\xDD\xC5\xAA\xDD\xC0\xA9\xD9\xAE\x95\xCA\x8B\x69\xB5\x82\x66" + "\xB9\x84\x6B\x85\x47\x31\x6A\x2F\x18\xC4\x91\x77\xD1\xA2\x87\xC3\x8A" + "\x70\xB2\x7D\x62\xAB\x78\x5E\xA5\x76\x5D\x95\x66\x4D\x93\x64\x4C\xB1" + "\x82\x6A\xD2\xA3\x8B\xD7\xA8\x90\xB3\x84\x6C\xA8\x79\x61\x90\x60\x4D" + "\x78\x46\x32\x47\x13\x20\xAC\x77\x60\xBC\x87\x70\xAD\x77\x5C\xA0\x6F" + "\x58\x95\x65\x52\x8D\x60\x4A\x8E\x6C\x5A\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x73\xDB\xAB\x96\xDD\xB7\x99\xD5\xAB\x96\xD0" + "\x9D\x91\xCD\x79\x65\xBA\x5E\x3E\xDD\xC2\xA0\xDD\xC5\xA8\xDD\xC0\xA9" + "\xD9\xB0\x96\xCA\x8A\x6B\xB6\x81\x66\xB6\x80\x65\x88\x4D\x36\x78\x3F" + "\x27\xCF\x9E\x84\xD7\xAB\x91\xC4\x8A\x6E\xB3\x7A\x60\xAA\x75\x5A\xA5" + "\x74\x5C\x97\x66\x4E\x9B\x6A\x53\xB6\x85\x6E\xD0\x9F\x88\xD4\xA3\x8C" + "\xB2\x81\x6A\xA9\x78\x61\x91\x61\x4E\x79\x47\x33\x52\x1E\x08\xAC\x77" + "\x60\xBA\x85\x6E\xAC\x76\x5B\xA1\x70\x59\x95\x65\x52\x8F\x5F\x4A\x87" + "\x65\x53\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x73\xCB" + "\x9B\x88\xEB\xC1\xA0\xDC\xB0\x96\xCF\x99\x88\xCE\x7F\x69\xC2\x6C\x4C" + "\xDF\xC5\xA5\xDC\xC6\xA8\xDF\xC4\xA8\xDB\xB5\x99\xCC\x8E\x72\xC2\x86" + "\x67\xB2\x78\x59\x98\x62\x45\xA5\x72\x56\xE1\xB6\x9C\xD9\xB0\x95\xC6" + "\x86\x6B\xB5\x74\x5B\xAF\x6E\x55\xA4\x69\x52\x9B\x64\x4C\xA5\x71\x5A" + "\xBB\x87\x70\xD1\x9D\x86\xD3\x9F\x88\xB1\x7D\x66\xAC\x78\x61\x9E\x6F" + "\x57\x86\x55\x3E\x7E\x4A\x33\xAC\x77\x5E\xB1\x7C\x63\xB1\x78\x5C\xA9" + "\x75\x5E\x98\x66\x52\x90\x5F\x48\x77\x53\x41\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x73\xC5\x95\x82\xE7\xBC\x9A\xE1\xB3\x95" + "\xD6\x9F\x8A\xCC\x81\x6A\xC1\x6F\x4E\xDF\xC5\xA5\xDB\xC7\xA6\xE1\xC7" + "\xA8\xDE\xB8\x9A\xD0\x91\x77\xCB\x89\x68\xB5\x77\x57\xA4\x70\x51\xB8" + "\x8A\x6C\xE1\xBB\x9F\xD0\xAB\x90\xC7\x87\x6C\xBA\x77\x5D\xB4\x6F\x57" + "\xA3\x66\x4D\x98\x62\x47\xA0\x6D\x53\xB6\x83\x69\xD4\xA1\x87\xD8\xA5" + "\x8B\xB2\x7F\x65\xAE\x7B\x61\xA1\x72\x5A\x8D\x5C\x44\x91\x5D\x46\xA9" + "\x74\x59\xA8\x73\x58\xAD\x73\x56\xA6\x71\x58\x99\x65\x51\x93\x62\x4B" + "\x7E\x58\x44\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x73" + "\xD1\xA0\x90\xDF\xB2\x8E\xE3\xB1\x91\xDE\xA4\x8F\xCD\x84\x6C\xC3\x77" + "\x56\xDC\xC4\xA5\xD8\xC6\xA5\xE1\xCA\xA9\xE1\xBD\x9E\xD2\x95\x7C\xD0" + "\x8A\x68\xBA\x78\x57\xB0\x81\x60\xC9\x9F\x7E\xE1\xBF\xA2\xCE\xAC\x90" + "\xCB\x8D\x6F\xC0\x7D\x63\xBC\x77\x5E\xA2\x65\x4A\x95\x60\x45\x9C\x67" + "\x4E\xB2\x7D\x64\xD7\xA2\x89\xDC\xA7\x8E\xB5\x80\x67\xB2\x7D\x64\xA0" + "\x71\x58\x92\x61\x49\x9E\x6B\x51\xA8\x73\x58\xA4\x70\x52\xA6\x6C\x4D" + "\x9D\x68\x4F\x96\x62\x4C\x96\x62\x4B\x89\x61\x4E\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x73\xF8\xC7\xB9\xC6\x97\x72\xD0\x9D" + "\x79\xD8\x9D\x84\xCA\x85\x6C\xCA\x83\x60\xDA\xC4\xA4\xD6\xC5\xA2\xE3" + "\xCE\xA8\xE6\xC2\xA1\xD6\x9B\x84\xD2\x87\x63\xBC\x79\x55\xC7\x9A\x76" + "\xE1\xBD\x9A\xEF\xD0\xB3\xDD\xBE\xA3\xD4\x9A\x7B\xCE\x8E\x71\xCD\x88" + "\x6F\xA3\x6A\x4E\x91\x63\x43\x9E\x68\x4D\xB1\x7B\x60\xD6\xA0\x85\xDD" + "\xA7\x8C\xB7\x81\x66\xB8\x82\x67\xA2\x73\x5A\xA2\x71\x57\xB4\x81\x65" + "\xB8\x84\x66\xB2\x7E\x60\xB1\x75\x56\x9F\x69\x4E\x93\x5E\x47\x92\x5D" + "\x44\x8F\x68\x52\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x70\xD4\x8C\x77\xD4\x8B\x71\xDA\xA6\x88\xC7\x89\x6D" + "\xD3\x7C\x62\xD8\xBE\x9C\xD9\xC4\xA0\xDE\xC4\xA2\xE5\xC1\xA2\xCF\x9A" + "\x81\xCF\x8D\x6C\xC1\x7D\x5F\xD5\xA7\x87\xE1\xC7\xA7\xDC\xCC\xAE\xE2" + "\xCB\xB2\xD3\xA4\x8B\xC6\x8D\x71\xC5\x87\x6B\xAE\x6E\x53\x9D\x60\x45" + "\xA4\x60\x42\xAE\x7A\x59\xD3\xB5\x96\xD8\xAD\x94\xC8\x8A\x76\xC7\x89" + "\x73\xB1\x82\x5F\xA3\x77\x59\xA5\x79\x5D\xB9\x89\x6C\xB5\x81\x62\xBC" + "\x82\x65\xA7\x6A\x4F\x99\x5D\x4C\x97\x65\x55\x83\x5F\x50\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x73\xCE\x98" + "\x85\xDD\xA0\x85\xD7\xA3\x85\xC6\x82\x62\xC2\x6C\x4A\xD8\xBA\x99\xD9" + "\xBF\x9D\xDB\xBD\x9C\xE2\xBC\x9E\xDA\xA5\x8C\xD4\x94\x75\xCA\x87\x6B" + "\xDB\xAB\x8E\xE5\xCA\xA8\xE4\xCF\xB1\xEB\xCE\xB5\xD5\xA4\x8C\xCD\x94" + "\x78\xCF\x8F\x74\xBC\x7C\x61\xA9\x6F\x53\xAA\x67\x4B\xB8\x86\x66\xDE" + "\xBC\x9F\xDD\xB0\x98\xCB\x90\x79\xCB\x90\x77\xBD\x8E\x6D\xB1\x85\x67" + "\xAB\x7F\x65\xB8\x88\x6B\xB5\x81\x63\xBE\x8B\x6D\xBB\x86\x6B\x97\x5F" + "\x4D\x9A\x68\x58\x91\x68\x5B\xA0\x87\x79\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x73\xCE\xA6\x95\xCF\x9C\x82\xDA\xA5\x8A\xD2" + "\x8F\x6C\xBF\x6E\x48\xD6\xB4\x95\xDC\xBE\x9D\xDB\xBB\x9B\xE0\xBA\x9C" + "\xDC\xA7\x8E\xD4\x98\x79\xCB\x8B\x6E\xD9\xA9\x8C\xE1\xC3\xA2\xDF\xC7" + "\xAA\xE5\xC4\xAA\xD4\xA0\x89\xCE\x94\x78\xD0\x90\x75\xC0\x82\x66\xAF" + "\x75\x59\xA8\x6A\x4E\xBB\x88\x6A\xDC\xB7\x9B\xD9\xAA\x92\xC8\x8D\x74" + "\xC7\x8E\x72\xBA\x8B\x6A\xAE\x82\x66\xA6\x7A\x60\xB3\x82\x68\xB1\x7D" + "\x5F\xBB\x8D\x6F\xB9\x88\x6E\x9A\x66\x52\x9D\x6C\x5C\x97\x6A\x5C\x95" + "\x74\x66\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x70\xC2\x9F\x86\xD4\xA0\x89\xDD\x9F\x7F\xBC\x80\x57\xD3\xA9" + "\x8C\xE1\xBB\x9D\xD9\xB5\x96\xDB\xB2\x95\xDC\xA5\x8D\xD7\xA1\x84\xD4" + "\x97\x7C\xD6\xA6\x89\xD8\xB6\x97\xD7\xB5\x98\xDB\xAF\x95\xD1\x9A\x84" + "\xCB\x8E\x73\xC8\x88\x6D\xC1\x84\x68\xB6\x80\x63\xB5\x7A\x61\xC1\x90" + "\x76\xD0\xA7\x8D\xCF\x9B\x84\xC7\x8F\x71\xC2\x90\x6E\xB5\x85\x66\xA5" + "\x79\x5F\x9C\x6F\x57\xB7\x86\x6E\xB6\x81\x68\xBE\x8A\x73\xB0\x7F\x67" + "\xA1\x71\x5C\x97\x6B\x59\x85\x5A\x4A\x9D\x76\x66\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x70\xD6\xBA\x9E\xCA" + "\x99\x82\xD9\xA0\x84\xC0\x8D\x67\xD5\xA6\x8B\xE1\xB8\x9B\xD4\xB0\x91" + "\xD6\xAC\x8F\xDE\xA7\x8F\xD6\xA1\x86\xD3\x98\x7F\xD3\xA3\x86\xD6\xB2" + "\x93\xD7\xB1\x93\xDA\xA9\x8F\xD3\x9C\x86\xCC\x8F\x74\xC6\x86\x6B\xC2" + "\x85\x69\xBB\x87\x69\xBD\x84\x6C\xC3\x94\x7B\xC8\x9D\x84\xC9\x94\x7D" + "\xC8\x90\x72\xC0\x91\x6C\xB8\x88\x6B\xA4\x77\x5F\x9A\x6D\x57\xBC\x8B" + "\x74\xBA\x85\x6C\xBE\x87\x72\xB6\x80\x6B\xA4\x77\x63\x98\x6E\x59\x84" + "\x5E\x4A\x93\x6F\x5D\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x70\xEA\xCF\xB3\xC3\x93\x7E\xD6\xA1\x86\xC5\x9B" + "\x74\xD5\xA4\x8A\xE0\xB6\x99\xD0\xAA\x8C\xD2\xA8\x8B\xDF\xA8\x90\xD2" + "\x9D\x82\xCF\x96\x7C\xD0\xA0\x83\xD2\xAE\x8F\xD6\xAD\x90\xDA\xA7\x8D" + "\xD8\x9E\x89\xCF\x90\x76\xC5\x85\x6A\xC3\x89\x6C\xC0\x8C\x6E\xC0\x87" + "\x6F\xC3\x94\x7B\xC1\x96\x7D\xC5\x8E\x78\xC7\x8F\x6F\xBE\x8F\x6A\xBA" + "\x8A\x6D\xA2\x75\x5D\x98\x6B\x55\xBE\x8D\x76\xBA\x85\x6C\xB6\x7A\x67" + "\xB5\x7B\x67\xA0\x73\x5F\x93\x6C\x56\x84\x61\x4C\x84\x62\x4F\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x6D\xD9\xBA\xAF\xE4\xB1\x97\xCE\x9E\x7F\xD2\xA7\x86\xD6\xB8" + "\x95\xD2\xAC\x8E\xD4\xA5\x8A\xD2\xA7\x8D\xD7\xA6\x8C\xCF\x9E\x84\xD2" + "\xA1\x87\xD8\xA9\x8E\xCE\xAC\x8D\xCC\xAE\x8D\xD5\xAB\x8E\xCE\x9B\x81" + "\xC6\x8B\x74\xC6\x8B\x74\xC3\x8E\x75\xC2\x91\x7A\xC6\x90\x7B\xCA\x90" + "\x7B\xC8\x8F\x77\xC3\x8E\x73\xC3\x93\x76\xB4\x89\x6F\x97\x6B\x51\x9F" + "\x73\x59\xBF\x8E\x76\xBE\x8D\x75\xB5\x85\x68\xAE\x7F\x64\x98\x6D\x56" + "\x8F\x65\x52\x89\x61\x51\x85\x60\x54\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x6D\xF0\xD5\xCB" + "\xE6\xB5\x9D\xD2\xA4\x83\xD5\xAB\x8A\xD4\xB9\x95\xD4\xB0\x91\xD8\xA9" + "\x8E\xCF\xA6\x8B\xD9\xB0\x95\xD3\xA8\x8E\xD4\xA8\x8E\xD6\xAB\x91\xCD" + "\xAD\x8F\xCB\xAF\x90\xD6\xAD\x92\xCF\x9E\x86\xC8\x8E\x79\xC5\x8B\x76" + "\xC2\x8D\x76\xC4\x93\x7C\xC6\x92\x7C\xC7\x8D\x78\xC5\x8B\x76\xC3\x90" + "\x76\xC3\x93\x76\xB1\x86\x6F\x96\x69\x53\x9E\x71\x5B\xBF\x8D\x79\xC0" + "\x8E\x7A\xB6\x86\x69\xAF\x80\x65\x97\x6C\x55\x8F\x65\x52\x89\x61\x51" + "\x86\x61\x55\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x6D\xDB\xB0\x96\xDB\xB2" + "\x8D\xD3\xAF\x8C\xD0\xB9\x94\xD6\xB6\x96\xDC\xB3\x96\xD1\xAC\x90\xD3" + "\xB7\x99\xD2\xB3\x96\xD3\xAC\x92\xCE\xA7\x8D\xC8\xA6\x8A\xCE\xAD\x91" + "\xD0\xAB\x90\xCE\xA1\x89\xC8\x94\x7E\xC3\x8D\x78\xBE\x8F\x77\xBF\x8F" + "\x7C\xC4\x92\x7E\xC4\x8D\x78\xC5\x8E\x79\xC9\x98\x80\xC4\x95\x7A\xA2" + "\x76\x62\x9A\x6D\x59\xA6\x79\x65\xBE\x8C\x7A\xBD\x8B\x79\xBA\x8A\x6D" + "\xB2\x83\x68\x99\x6E\x57\x91\x67\x54\x8C\x64\x54\x8A\x65\x59\xA5\x99" + "\x92\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x6D\xCB\xA5\x89\xDD\xB6\x90\xD2\xB1\x8D\xD0\xBB" + "\x95\xD5\xB7\x96\xDA\xB4\x96\xD1\xAF\x92\xCE\xB3\x97\xCF\xB3\x97\xD2" + "\xAB\x93\xCB\xA1\x8A\xC8\xA1\x89\xD2\xAB\x93\xD2\xAF\x96\xD3\xA8\x91" + "\xCC\x9A\x86\xC2\x90\x7C\xBE\x91\x7B\xBA\x8D\x79\xC1\x91\x7E\xC4\x8E" + "\x7B\xC7\x91\x7C\xC7\x98\x7F\xBD\x91\x77\xA2\x77\x60\xA0\x73\x5D\xAE" + "\x81\x6B\xC2\x90\x7C\xC0\x8E\x7A\xB9\x89\x6C\xB0\x81\x66\x97\x6C\x55" + "\x8E\x64\x51\x8A\x62\x52\x89\x64\x58\x90\x7F\x74\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x6D" + "\xB3\x91\x74\xD9\xB5\x8C\xD6\xB7\x92\xD2\xC2\x9A\xD0\xB5\x93\xD3\xAF" + "\x90\xCF\xAF\x91\xC8\xAD\x91\xCB\xAF\x93\xD3\xA8\x91\xCA\x9A\x85\xCD" + "\x9D\x88\xDB\xAB\x96\xD4\xB5\x9A\xD5\xAE\x96\xCE\x9E\x89\xBC\x8C\x77" + "\xB5\x8A\x73\xB4\x88\x76\xC1\x90\x80\xC5\x90\x7F\xC6\x92\x7E\xBC\x8D" + "\x75\xA9\x7E\x65\xA4\x7A\x5D\xA2\x76\x5A\xAD\x81\x65\xBE\x8D\x73\xC0" + "\x8F\x75\xBC\x8C\x6F\xB3\x84\x69\x99\x6E\x57\x90\x66\x53\x8C\x64\x54" + "\x8D\x68\x5C\x76\x5F\x50\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x6A\xB9\x90" + "\x75\xD0\xAC\x89\xD0\xB2\x91\xCE\xB6\x99\xCB\xAC\x93\xDC\xB2\x9D\xCF" + "\xAA\x8F\xCE\xA7\x8D\xD3\xA6\x8E\xD2\xA3\x8B\xD3\x9D\x88\xD9\xA2\x8D" + "\xD8\xAE\x97\xD6\xAB\x94\xD0\xA3\x8B\xBE\x8F\x76\xB8\x89\x70\xAF\x7F" + "\x6A\xB6\x89\x73\xC5\x9C\x82\xC0\x95\x7B\xBA\x89\x6F\xC0\x8B\x72\xB1" + "\x86\x64\x9C\x73\x58\xA7\x80\x66\xBE\x91\x79\xC0\x8F\x77\xBD\x88\x6F" + "\xB5\x82\x68\x92\x65\x4D\x8A\x63\x4D\x8C\x69\x54\x87\x67\x53\x89\x68" + "\x58\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x6A\xDB\xC6\xBA\xC9\xA7\x8A\xD3" + "\xB3\x95\xCE\xB3\x91\xCF\xB1\x90\xCB\xAB\x8D\xCB\xA9\x8D\xC9\xA7\x8B" + "\xD5\xAE\x94\xD7\xAE\x94\xCB\x9E\x86\xCB\x9C\x84\xCC\xA2\x8B\xD2\xA7" + "\x8E\xD4\xA9\x90\xC9\x9D\x83\xC1\x92\x77\xB9\x89\x74\xBA\x8D\x77\xBA" + "\x8F\x76\xBA\x8F\x75\xC4\x91\x77\xC8\x91\x79\xB8\x8D\x6B\x9C\x73\x58" + "\xA3\x7C\x62\xB9\x8C\x74\xBD\x8C\x74\xB9\x86\x6C\xAF\x7E\x64\x92\x67" + "\x4E\x8F\x65\x50\x90\x6A\x56\x8C\x6A\x57\x85\x64\x54\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x67\xCA\xAB\x92\xC5\xA6\x89\xD0\xB1" + "\x8E\xD2\xB3\x90\xCC\xAE\x8B\xCC\xAB\x8F\xCB\xA9\x8D\xD5\xB0\x95\xD7" + "\xB0\x96\xCC\xA3\x89\xCB\xA0\x87\xCA\x9F\x86\xCF\xA6\x8C\xD5\xAC\x91" + "\xCF\xA3\x87\xC5\x94\x7A\xBD\x8B\x77\xBD\x8D\x78\xB8\x8D\x74\xBA\x8E" + "\x74\xC8\x93\x7A\xC9\x92\x7A\xB9\x8E\x6C\x9A\x71\x56\xA0\x79\x5F\xB8" + "\x8B\x73\xBE\x8D\x75\xB9\x88\x6E\xAF\x7E\x64\x93\x68\x4F\x90\x66\x51" + "\x8E\x68\x54\x8C\x68\x56\x83\x62\x52\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x64\xC6\xA9\x92\xD5\xB1\x90\xD2\xAE" + "\x8B\xCB\xAD\x8A\xD1\xAC\x91\xCE\xA9\x8E\xD3\xAE\x93\xD4\xAD\x93\xCE" + "\xA7\x8D\xD1\xA8\x8E\xCA\x9F\x86\xCF\xA6\x8B\xD3\xAD\x91\xD1\xA7\x88" + "\xC7\x97\x7A\xBE\x8A\x76\xC0\x8E\x7A\xBA\x8D\x75\xBD\x8E\x75\xC9\x94" + "\x7B\xC9\x90\x78\xB8\x8D\x6B\x98\x6F\x54\x9E\x77\x5D\xB7\x8A\x72\xBF" + "\x8E\x76\xBB\x8C\x71\xB0\x81\x66\x96\x6B\x52\x91\x67\x52\x8D\x65\x52" + "\x8B\x65\x53\x82\x61\x51\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x61\xCC\x9D\x85\xCD\x9C\x82\xC5" + "\x9E\x84\xCC\x9F\x87\xCD\xA0\x88\xD3\xA8\x8F\xCF\xA4\x8B\xD2\xA7\x8E" + "\xDB\xB0\x97\xCF\xA3\x89\xC8\xA2\x84\xC9\xA7\x88\xD4\xAA\x89\xD0\x9D" + "\x7F\xC1\x8B\x78\xC9\x95\x81\xBD\x8E\x76\xB9\x88\x70\xCA\x93\x7B\xCC" + "\x91\x7A\xB8\x8D\x6B\x98\x6F\x54\x9D\x76\x5C\xB5\x88\x70\xBC\x8B\x73" + "\xB8\x8E\x71\xAB\x81\x64\x98\x6D\x54\x93\x69\x54\x8E\x64\x51\x8E\x63" + "\x53\x86\x65\x55\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x61\xC7\x95\x81\xC8\x94\x7D\xBA\x8F\x78" + "\xC7\x96\x7F\xCB\x9C\x84\xD5\xA6\x8E\xCE\xA1\x89\xD1\xA4\x8C\xDA\xAF" + "\x96\xCF\xA3\x87\xC6\xA0\x82\xC5\xA6\x83\xD4\xAC\x8A\xD3\xA0\x82\xC3" + "\x8D\x7A\xCC\x98\x84\xBB\x8C\x74\xB6\x85\x6D\xCC\x93\x7B\xCE\x93\x7C" + "\xBA\x8F\x6D\x99\x70\x55\x9E\x77\x5D\xB4\x87\x6F\xB9\x88\x70\xB6\x8C" + "\x6F\xA9\x7F\x62\x98\x6D\x54\x94\x6A\x55\x8F\x65\x52\x90\x65\x55\x87" + "\x66\x56\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x5E\xD0\xB8\xA7\xBC\x8E\x6E\xBF" + "\x90\x75\xBC\x90\x74\xCB\x9F\x85\xD0\xA4\x8A\xCE\xA2\x84\xD4\xA6\x88" + "\xCF\xAB\x8C\xCA\xA4\x86\xCB\xA2\x85\xD5\xA9\x8D\xD2\xA6\x8A\xCA\x91" + "\x75\xC5\x90\x75\xB8\x91\x79\xAF\x88\x72\xCD\x97\x84\xCD\x93\x7F\xBC" + "\x8F\x6B\x9E\x76\x56\xAB\x85\x69\xB3\x88\x6E\xBB\x8C\x71\xB3\x8D\x71" + "\xA7\x81\x65\x95\x6E\x56\x90\x68\x55\x8B\x63\x52\x8E\x66\x56\x86\x65" + "\x55\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x5B\xA9\x8A\x71\xBD" + "\x8D\x6E\xBD\x8D\x6E\xC7\x97\x78\xCD\x9F\x81\xD0\xA4\x88\xD0\xA4\x88" + "\xD2\xAC\x8E\xD3\xAA\x8D\xCB\xA2\x85\xD1\xA5\x89\xD3\xA7\x8B\xCC\x93" + "\x77\xC4\x91\x75\xB9\x8F\x78\xB1\x87\x72\xCB\x97\x81\xCE\x94\x7F\xBB" + "\x8E\x6A\xA3\x79\x5A\xB0\x87\x6C\xB4\x89\x6F\xB9\x8D\x71\xB4\x8E\x72" + "\xAA\x84\x68\x97\x70\x58\x91\x69\x56\x8C\x64\x53\x8E\x66\x56\x87\x66" + "\x56\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x5B\xD6\xD2\xCA\xB5" + "\x8F\x73\xB8\x8E\x6F\xC2\x8E\x6D\xC6\x92\x73\xCD\x9E\x85\xCF\xA2\x8A" + "\xD4\xA8\x8C\xD9\xAD\x91\xCF\xA3\x87\xCA\x9E\x82\xD1\xA7\x8A\xD0\x9D" + "\x81\xC6\x95\x7B\xC0\x93\x7B\xB5\x88\x70\xC5\x95\x78\xC9\x96\x78\xB9" + "\x8C\x68\xB0\x82\x64\xBB\x8C\x73\xB7\x8C\x72\xB6\x8D\x70\xB1\x8B\x6F" + "\xAA\x84\x68\x96\x6F\x57\x90\x68\x55\x8E\x66\x55\x8B\x63\x53\x82\x61" + "\x51\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x58" + "\xC4\xA8\x93\xB7\x96\x7E\xBB\x8C\x6B\xC6\x92\x73\xCD\x9C\x84\xD3\xA4" + "\x8C\xD2\xA1\x87\xD6\xA7\x8C\xD3\xA4\x89\xC9\x9D\x81\xCE\xA4\x87\xD3" + "\xA3\x86\xC9\x98\x7E\xC8\x97\x80\xBC\x8B\x73\xC2\x92\x73\xC4\x95\x72" + "\xB7\x8A\x66\xB5\x85\x68\xBF\x8E\x76\xB7\x8C\x72\xB2\x8E\x6F\xAC\x86" + "\x6A\xA8\x82\x66\x93\x6C\x54\x8E\x66\x53\x8E\x66\x55\x89\x61\x51\x7C" + "\x5B\x4B\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x55\xC7\xB0\x9F\xBA\x8E\x70\xCC\x98\x79\xCE\x9B\x81" + "\xD3\xA2\x8B\xCE\x9B\x81\xD0\x9F\x85\xD6\xA7\x8C\xCA\x9E\x82\xCB\xA1" + "\x84\xD5\xA6\x8B\xCD\x9C\x82\xCD\x9C\x85\xBF\x8E\x76\xC0\x91\x70\xC0" + "\x93\x6D\xB4\x87\x63\xB9\x86\x6A\xC2\x8E\x77\xB6\x8B\x71\xAE\x8C\x6D" + "\xA7\x81\x65\xA4\x7E\x62\x90\x69\x51\x8C\x64\x51\x8D\x65\x54\x87\x5F" + "\x4F\x76\x55\x45\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x52\xB1\x94\x7F\xC8\x9F\x85" + "\xCF\xA0\x88\xD1\xA1\x8C\xD3\xA9\x8C\xC8\x9C\x80\xC8\x9C\x80\xD0\xA1" + "\x86\xC8\x97\x7D\xD1\xAB\x8D\xCD\xA7\x89\xC7\x9D\x80\xC1\x95\x79\xBD" + "\x8E\x73\xC4\x93\x79\xBA\x85\x60\xB8\x85\x67\xC0\x8F\x75\xB7\x8E\x71" + "\xB0\x8B\x68\xA6\x7B\x61\xA1\x76\x5D\x95\x6B\x54\x90\x69\x51\x8C\x65" + "\x4F\x80\x5A\x44\x79\x5F\x4D\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x52\xCB\xAF\x9D" + "\xB8\x92\x7C\xDB\xAF\x95\xC9\x9D\x83\xD0\xA6\x89\xCA\xA0\x83\xCD\xA1" + "\x85\xD2\xA3\x88\xCE\x9F\x84\xD2\xAC\x8E\xD1\xA8\x8B\xC9\x9F\x82\xC0" + "\x94\x78\xBA\x8B\x70\xC2\x91\x77\xBA\x85\x62\xB7\x84\x66\xC0\x8F\x75" + "\xB8\x8E\x71\xB2\x8A\x6A\xA8\x7D\x63\xA3\x78\x5F\x97\x6D\x56\x92\x6B" + "\x53\x8E\x67\x51\x83\x5D\x47\x77\x5D\x4B\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x4F\xE3\xCC\xBE\xC7\xA2\x87\xDA\xB2\x92\xCD\xA7\x89\xD3" + "\xAD\x8F\xD9\xB0\x93\xD0\xA6\x89\xD6\xAC\x8F\xD0\xA4\x88\xD0\xA4\x88" + "\xCB\x9F\x83\xC0\x91\x76\xB6\x87\x6C\xBD\x8E\x73\xB8\x86\x64\xB2\x82" + "\x65\xBF\x90\x77\xBB\x8F\x75\xB7\x8D\x70\xAF\x84\x6A\xAB\x80\x67\x9D" + "\x73\x5C\x95\x6E\x56\x91\x6A\x54\x8B\x65\x4F\x80\x66\x54\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x4C\xBA\x99\x81\xD3\xAD" + "\x8F\xCF\xAD\x8E\xD7\xB3\x94\xD8\xB4\x95\xCE\xA5\x88\xD4\xAB\x8E\xCD" + "\x9C\x82\xCE\x9D\x83\xCB\x9C\x81\xC1\x92\x77\xB8\x89\x6E\xBE\x8F\x74" + "\xB7\x88\x65\xB0\x81\x66\xC1\x92\x79\xBD\x91\x77\xBB\x8F\x73\xB1\x86" + "\x6C\xAE\x83\x6A\xA0\x76\x5F\x97\x70\x58\x91\x6A\x54\x8C\x66\x50\x7E" + "\x64\x52\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x4C" + "\xEF\xD4\xCA\xC4\xA0\x8F\xDB\xBD\x9C\xDA\xBA\x9A\xD2\xB2\x92\xD2\xAE" + "\x8F\xCE\xAA\x8B\xD2\x9D\x84\xCF\x9A\x81\xD0\x9D\x83\xCC\x9B\x81\xBD" + "\x91\x75\xBE\x92\x76\xB7\x8C\x6A\xAF\x83\x69\xC5\x96\x7E\xC3\x93\x7E" + "\xC3\x94\x7B\xB7\x8C\x72\xB7\x8C\x73\xAB\x81\x6A\x9E\x77\x5F\x94\x6D" + "\x57\x8A\x64\x4E\x7B\x61\x4F\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x49\xD4\xAF\xA3\xDF\xC1\xA0\xD9\xBB" + "\x9A\xD0\xB0\x90\xD5\xB3\x94\xCF\xAB\x8C\xD7\xA0\x88\xD2\x9B\x83\xD2" + "\x9F\x85\xD0\x9F\x85\xC0\x94\x78\xBD\x91\x75\xB8\x8D\x6C\xAF\x83\x69" + "\xC6\x96\x81\xC4\x94\x7F\xC6\x95\x7E\xBA\x8F\x75\xBB\x90\x77\xB0\x86" + "\x6F\xA2\x7B\x63\x96\x6F\x59\x8A\x64\x4E\x85\x6B\x59\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x43\xC9\x9E\x85\xE1\xB2\x91\xD8\xAF\x8C\xD2\xB6\x9A\xD8\xB4\x95" + "\xD2\xAC\x8E\xCF\xA9\x8B\xD3\xA9\x8C\xD1\xA5\x89\xC2\x93\x78\xC0\x8F" + "\x75\xB4\x8A\x6B\xBD\x8E\x73\xCA\x9B\x80\xCF\x9E\x87\xC8\x97\x80\xC2" + "\x8E\x78\xC9\x98\x80\xAD\x89\x6A\x9B\x76\x5A\x8E\x69\x50\x86\x59\x4B" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x43\xC4\x9E\x88\xD6\xAC\x8B\xD8" + "\xB0\x8D\xCE\xB4\x95\xD5\xB5\x95\xD1\xB1\x91\xD0\xAE\x8F\xD3\xAD\x8F" + "\xD0\xA7\x8A\xC0\x94\x78\xC1\x92\x77\xBA\x8C\x6E\xC6\x97\x7C\xD1\xA0" + "\x86\xD0\x9C\x86\xCA\x94\x7F\xC4\x91\x77\xC3\x93\x76\xA7\x81\x61\x9B" + "\x77\x58\x8E\x69\x4E\x81\x59\x48\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x43\xC1\xA1\x8B\xD0\xA8\x86\xD8\xB3\x8F\xCA\xB2\x93\xD5\xB7\x96\xD3" + "\xB8\x96\xD3\xB5\x94\xD3\xAF\x90\xCB\xA5\x87\xBD\x91\x75\xBF\x90\x75" + "\xC1\x8E\x72\xD0\x9F\x85\xD4\xA5\x8A\xCE\x9A\x84\xCB\x94\x7F\xC3\x90" + "\x72\xBC\x8C\x6D\xA6\x7C\x5B\x9E\x78\x58\x8E\x69\x4E\x81\x5D\x4C\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x43\xBD\xA3\x93\xCC\xA6\x88\xE0\xB7" + "\x92\xCE\xB0\x91\xDB\xBB\x9D\xD8\xBD\x9B\xD5\xBA\x98\xCD\xA9\x8A\xC2" + "\x98\x7B\xBD\x8A\x70\xC5\x90\x77\xCD\x9A\x7E\xD6\xAD\x90\xD2\xAC\x8E" + "\xCD\xA0\x88\xCD\x99\x83\xC0\x8D\x71\xB6\x83\x67\xA2\x73\x58\xA0\x75" + "\x5C\x8B\x65\x53\x9E\x81\x75\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x40" + "\xBA\x9F\x93\xCF\xA6\x89\xE3\xB6\x92\xCD\xAD\x8F\xDD\xBB\x9E\xD6\xBB" + "\x99\xD6\xB8\x97\xCD\xA4\x87\xC2\x93\x78\xC2\x8B\x73\xCF\x96\x7E\xD4" + "\xA4\x87\xD6\xB2\x93\xD0\xB0\x90\xD1\xA8\x8E\xD1\xA0\x89\xC2\x8F\x75" + "\xB7\x84\x6A\x9D\x6C\x55\x9A\x6D\x59\x87\x60\x52\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x40\xCE\xA2\x9A\xD8\x9F\x87\xD5\xB5" + "\x8D\xE9\xBA\xA1\xDC\xAB\x93\xCD\xB3\x91\xD2\xB2\x92\xC7\x96\x7C\xC1" + "\x8C\x73\xCE\x9F\x84\xD3\xA9\x8C\xD9\xB3\x93\xD4\xB4\x94\xD4\xB6\x95" + "\xD3\xB1\x95\xD1\xAC\x91\xCB\x97\x79\xBE\x8F\x76\x92\x67\x4E\x95\x69" + "\x4D\x8C\x66\x50\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x40\xCD\xA1\x99\xD8\x9F\x87\xD5\xB5\x8D\xE8\xB9\xA0\xDC\xAB\x93\xCF" + "\xB5\x93\xD4\xB4\x94\xCA\x99\x7F\xC4\x91\x77\xD0\xA4\x88\xD7\xAD\x90" + "\xD9\xB5\x94\xD6\xB6\x96\xD6\xB8\x97\xD4\xB2\x96\xD1\xAA\x90\xC9\x95" + "\x77\xC0\x91\x78\x95\x6A\x51\x92\x66\x4A\x89\x63\x4D\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x40\xCB\xA2\x99\xD8\xA1\x89\xD5" + "\xB7\x8E\xE5\xB9\x9F\xDA\xAB\x92\xD3\xB8\x96\xD6\xB6\x96\xCF\xA0\x85" + "\xCB\x9A\x80\xD7\xAE\x91\xDA\xB6\x97\xD6\xB7\x94\xD8\xBA\x99\xD9\xBB" + "\x9A\xD4\xAF\x94\xCD\xA4\x8A\xC3\x8F\x71\xBB\x8C\x73\x8F\x64\x4B\x88" + "\x5C\x40\x80\x5A\x44\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x40\xCC\xA3\x9A\xD9\xA4\x8B\xD6\xB9\x90\xE4\xB9\x9F\xD8\xAC\x92" + "\xD1\xB6\x94\xD5\xB3\x94\xCF\xA0\x85\xCC\x9D\x82\xD6\xB2\x93\xD8\xB8" + "\x98\xD5\xB7\x94\xD6\xBB\x99\xD6\xBB\x99\xD0\xAB\x90\xC9\x9E\x85\xC4" + "\x90\x72\xB6\x87\x6E\x8B\x60\x47\x88\x5C\x40\x82\x5C\x46\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x40\xCC\xA4\x9B\xDA\xA7\x8D" + "\xD9\xBC\x93\xE4\xB9\x9F\xD9\xAD\x93\xD1\xB3\x92\xD3\xB1\x92\xCC\xA0" + "\x84\xCB\x9F\x83\xD6\xB4\x95\xD8\xBA\x99\xD5\xBA\x96\xD6\xBB\x99\xD5" + "\xBA\x98\xCE\xA7\x8D\xC7\x9A\x82\xC5\x91\x73\xB4\x85\x6C\x8B\x60\x47" + "\x8C\x60\x44\x86\x60\x4A\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x40\xCD\xA8\x9E\xDE\xAB\x91\xDB\xC1\x97\xE5\xBC\xA1\xDA\xAF" + "\x95\xD0\xB2\x91\xD1\xAF\x90\xCC\xA0\x84\xCE\xA2\x86\xD7\xB9\x98\xD7" + "\xBD\x9B\xDA\xC1\x9C\xD7\xBD\x9B\xD5\xBA\x98\xCF\xA6\x8C\xC8\x99\x81" + "\xBA\x86\x68\xAC\x7D\x64\x8C\x61\x48\x89\x5D\x41\x7E\x58\x42\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x40\xC5\xAD\xA2\xCB\xAA" + "\x8E\xE3\xC3\x9D\xD1\xBB\x9A\xD2\xB6\x97\xD1\xB6\x94\xD0\xB2\x91\xCE" + "\xA8\x8A\xCF\xA9\x8B\xDA\xB6\x97\xDC\xBA\x9B\xD8\xBD\x99\xD3\xB3\x93" + "\xD2\xAE\x8F\xD5\xA6\x8E\xCA\x99\x82\xB8\x89\x6E\xA9\x78\x61\x8E\x5F" + "\x47\x82\x59\x3C\x7B\x5E\x45\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x40\xC7\xAF\xA4\xCC\xAB\x8F\xE1\xC2\x9C\xD3\xBD\x9C\xD3" + "\xB9\x99\xD4\xB9\x97\xD3\xB5\x94\xD1\xAB\x8D\xD1\xAB\x8D\xD7\xB3\x94" + "\xD8\xB6\x97\xD5\xB7\x94\xD3\xB1\x92\xD1\xAD\x8E\xD4\xA7\x8F\xCC\x9D" + "\x85\xB7\x8B\x6D\xAC\x7D\x65\x92\x61\x4A\x85\x5B\x3E\x80\x5F\x45\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x40\xC7\xB2\xA6\xCD" + "\xAE\x91\xDF\xC2\x9B\xD3\xBF\x9D\xD5\xBB\x9B\xD4\xB9\x97\xD3\xB5\x94" + "\xD1\xAB\x8D\xD0\xAA\x8C\xD3\xAF\x90\xD3\xB1\x92\xD2\xB3\x90\xD2\xB0" + "\x91\xD2\xAC\x8E\xD3\xA8\x8F\xCB\x9E\x86\xB7\x8C\x6B\xB0\x81\x69\x94" + "\x62\x4E\x87\x5B\x3F\x83\x61\x45\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x40\xCA\xB7\xAA\xCD\xB1\x93\xDC\xC2\x9A\xD4\xC3\xA0" + "\xD7\xC0\x9F\xD1\xB6\x94\xD2\xB4\x93\xD2\xAC\x8E\xD1\xAB\x8D\xD0\xAC" + "\x8D\xCE\xAC\x8D\xD0\xAC\x8B\xD3\xAF\x90\xD2\xAC\x8E\xD1\xA8\x8E\xCB" + "\xA0\x87\xB8\x8F\x6C\xB8\x89\x70\x9B\x66\x57\x8B\x5C\x43\x8B\x65\x49" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF" + "\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82" + "\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x40\xCB\xB8\xAB" + "\xCD\xB3\x94\xDB\xC1\x99\xD5\xC4\xA1\xD7\xC1\xA0\xD2\xB7\x95\xD3\xB5" + "\x94\xD5\xAF\x91\xD4\xAE\x90\xD2\xAE\x8F\xD0\xAE\x8F\xD0\xAC\x8B\xD5" + "\xAF\x91\xD2\xAC\x8E\xD0\xA7\x8D\xCA\xA1\x87\xB9\x90\x6B\xB9\x8D\x73" + "\x9C\x67\x58\x8D\x5C\x44\x8F\x66\x49\x20\x82\xFF\x01\x20\x82\xFF\x01" + "\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20\x82\xFF\x01\x20" + "\x82\xFF" + , //body + 15370, //lenght + 0, + 0, + 0, + }, + { + "red-2.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8D\xFF\x82\x00\x01\xFF\x82\x00" + "\x8A\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x98" + "\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\xC0\x01\xFF\x82\x00" + "\x83\xC0\x95\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83\xC0\x01" + "\xFF\x82\x00\x83\xC0\x95\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x8A\xFF" + "\x82\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x89\xFF\x83\xC0\x01\xFF\x82" + "\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\xA7\xFF" + , //body + 212, //lenght + 0, + 0, + 0, + }, + { + "red-3.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x87" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x83\xC0\x8D\xFF\x82\x00\x83\xC0\x86\xFF\x83\xC0\x01\xFF\x82\x00\x98" + "\xFF\x83\xC0\x01\xFF\x82\x00\x98\xFF\x83\xC0\x01\xFF\x82\x00\x98\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x93" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\x9C\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01" + "\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF" + "\x82\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\xAA\xFF" + , //body + 218, //lenght + 0, + 0, + 0, + }, + { + "red-4.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x92" + "\xFF\x83\xC0\x01\xFF\x82\x00\x98\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x95\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x92\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x84\xFF\x82\x00\x01" + "\xFF\x82\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x87\xFF\x82\x00" + "\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x96\xFF\x82\x00\x01\xFF\x82\x00\x9C" + "\xFF\x82\x00\x01\xFF\x82\x00\x98\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\x96\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\xA7\xFF" + , //body + 226, //lenght + 0, + 0, + 0, + }, + { + "red-5.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x87" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x83\xC0\x8D\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82" + "\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x9C\xFF" + "\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82" + "\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00" + "\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8C\xFF\x83\xC0\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\xAA\xFF" + , //body + 228, //lenght + 0, + 0, + 0, + }, + { + "red-6.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x8C" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x93\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x99\xFF\x82\x00\x01\xFF" + "\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x90\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8D" + "\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF" + "\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82" + "\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00" + "\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8C\xFF\x83\xC0\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\xAA\xFF" + , //body + 228, //lenght + 0, + 0, + 0, + }, + { + "red-7.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x87" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x8D\xFF\x82\x00\x83\xC0\x8A\xFF\x82\x00\x83\xC0\x98" + "\xFF\x83\xC0\x01\xFF\x82\x00\x9C\xFF\x82\x00\x83\xC0\x98\xFF\x83\xC0" + "\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x83" + "\xC0\x98\xFF\x83\xC0\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00" + "\x9C\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\xB0" + "\xFF" + , //body + 154, //lenght + 0, + 0, + 0, + }, + { + "red-8.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8D\xFF\x82\x00\x01\xFF\x82\x00" + "\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A" + "\xFF\x82\x00\x01\xFF\x82\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x8A\xFF" + "\x82\x00\x83\xC0\x90\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8D" + "\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF" + "\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82" + "\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8C\xFF\x83\xC0" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x83\xC0\xAA\xFF" + , //body + 246, //lenght + 0, + 0, + 0, + }, + { + "red-9.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8D\xFF\x82\x00\x01\xFF\x82\x00" + "\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A" + "\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF" + "\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82" + "\x00\x01\xFF\x82\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8F" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x98\xFF\x83" + "\xC0\x01\xFF\x82\x00\x83\xC0\x90\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x83\xC0\x93\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\xAD\xFF" + , //body + 228, //lenght + 0, + 0, + 0, + }, + { + "red-a.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x8F" + "\xFF\x83\xC0\x9F\xFF\x82\x00\x9B\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0" + "\x99\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x95\xFF\x83\xC0\x01" + "\xFF\x82\x00\x84\xFF\x82\x00\x83\xC0\x93\xFF\x82\x00\x83\xC0\x83\xFF" + "\x83\xC0\x01\xFF\x82\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x8A\xFF\x82" + "\x00\x83\xC0\x8D\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x89\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x87\xFF\x82" + "\x00\x01\xFF\x82\x00\x90\xFF\x82\x00\x01\xFF\x82\x00\x83\xFF\x83\xC0" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x89\xFF\x83\xC0\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\xA1\xFF" + , //body + 228, //lenght + 0, + 0, + 0, + }, + { + "red-j.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x90" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x95\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x99\xFF\x82\x00\x01" + "\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF" + "\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x9C\xFF\x82\x00\x01\xFF\x82" + "\x00\x9C\xFF\x82\x00\x01\xFF\x82\x00\x90\xFF\x82\x00\x01\xFF\x82\x00" + "\x87\xFF\x82\x00\x01\xFF\x82\x00\x90\xFF\x82\x00\x01\xFF\x82\x00\x87" + "\xFF\x82\x00\x01\xFF\x82\x00\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x92\xFF\x83\xC0\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\xAD\xFF" + , //body + 164, //lenght + 0, + 0, + 0, + }, + { + "red-k.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x84" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x86\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x83\xFF\x83\xC0\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x83\xC0\x8A\xFF\x82\x00\x01\xFF\x82\x00\x87" + "\xFF\x82\x00\x01\xFF\x82\x00\x90\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF" + "\x82\x00\x01\xFF\x82\x00\x93\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x96\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x99\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x96" + "\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00\x93\xFF" + "\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x90\xFF\x82" + "\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82\x00\x89\xFF\x83\xC0" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x83\xFF\x83\xC0\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x87\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\xA4\xFF" + , //body + 262, //lenght + 0, + 0, + 0, + }, + { + "red-q.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x89" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8D\xFF\x82\x00\x01\xFF\x82\x00" + "\x8A\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A" + "\xFF\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF" + "\x82\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82" + "\x00\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00" + "\x01\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01" + "\xFF\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF" + "\x82\x00\x8D\xFF\x82\x00\x01\xFF\x82\x00\x8A\xFF\x82\x00\x01\xFF\x82" + "\x00\x8C\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8F\xFF\x83\xC0\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x9C\xFF\x82\x00\x01\xFF" + "\x82\x00\x89\xFF" + , //body + 242, //lenght + 0, + 0, + 0, + }, + { + "red-t.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x05\x20\x31\x33\x0A\x32\x82\x35\x01\x0A\x83" + "\xFF\x83\xC0\x01\xFF\x82\x00\x86\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\x8A\xFF\x82\x00\x01\xFF\x82\x00\x83\xFF\x83\xC0\x01" + "\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x87\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00\x87" + "\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF" + "\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82" + "\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00" + "\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01" + "\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF" + "\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82" + "\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00" + "\x87\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x84" + "\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF" + "\x82\x00\x01\xFF\x82\x00\x84\xFF\x82\x00\x01\xFF\x82\x00\x87\xFF\x82" + "\x00\x01\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x83\xFF\x83\xC0" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83" + "\xC0\x87\xFF\x82\x00\x01\xFF\x82\x00\x86\xFF\x83\xC0\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x83\xC0\xA7\xFF" + , //body + 314, //lenght + 0, + 0, + 0, + }, + { + "small-c.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x01\x20\x82\x31\x02\x0A\x32\x82\x35\x01\x0A" + "\x89\xFF\x83\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x92\xFF\x83\x80\x89" + "\x00\x83\x80\x92\xFF\x8F\x00\x92\xFF\x8F\x00\x89\xFF\x83\xC0\x83\x80" + "\x83\x00\x83\xC0\x89\x00\x83\xC0\x83\x00\x83\x80\x83\xC0\x83\x80\x9B" + "\x00\x83\x80\xA1\x00\x83\x80\x9B\x00\x83\x80\x83\xC0\x83\x80\x83\x00" + "\x83\x80\x83\xC0\x83\x00\x83\xC0\x83\x80\x83\x00\x83\x80\x83\xC0\x8C" + "\xFF\x83\x80\x83\x00\x83\x80\x95\xFF\x83\xC0\x89\x00\x83\xC0\x89\xFF" + "" + , //body + 119, //lenght + 0, + 0, + 0, + }, + { + "small-d.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x01\x20\x82\x31\x02\x0A\x32\x82\x35\x01\x0A" + "\xB1\xFF\x82\x00\x9B\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x95\xFF\x83" + "\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0\x8F\xFF" + "\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x83\xC0\x8A\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x89\xFF\x83\xC0\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83" + "\xC0\x8F\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x83\xC0\x95\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x9C\xFF\x82\x00\xB0" + "\xFF" + , //body + 171, //lenght + 0, + 0, + 0, + }, + { + "small-h.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x01\x20\x82\x31\x02\x0A\x32\x82\x35\x01\x0A" + "\xA7\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x83\xFF\x83\xC0\x01\xFF\x82" + "\x00\x83\xC0\x89\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83" + "\xC0\x87\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x87\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF" + "\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82" + "\x00\x01\xFF\x82\x00\x86\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01" + "\xFF\x82\x00\x83\xC0\x8A\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00" + "\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x8F" + "\xFF\x83\xC0\x01\xFF\x82\x00\x01\xFF\x82\x00\x01\xFF\x82\x00\x83\xC0" + "\x95\xFF\x83\xC0\x01\xFF\x82\x00\x83\xC0\x9C\xFF\x82\x00\xB0\xFF" + , //body + 237, //lenght + 0, + 0, + 0, + }, + { + "small-s.pnm", + (unsigned char*) + "\x03\x50\x36\x0A\x82\x31\x01\x20\x82\x31\x02\x0A\x32\x82\x35\x01\x0A" + "\x8F\xFF\x83\x00\x9B\xFF\x83\x80\x83\x00\x83\x80\x95\xFF\x83\x80\x89" + "\x00\x83\x80\x8F\xFF\x83\x80\x8F\x00\x83\x80\x89\xFF\x83\xC0\x95\x00" + "\x83\xC0\x86\xFF\x83\x80\x95\x00\x83\x80\x86\xFF\x83\x80\x95\x00\x83" + "\x80\x89\xFF\x83\x80\x83\x00\x83\xC0\x83\x00\x83\xC0\x83\x00\x83\x80" + "\x92\xFF\x83\x80\x83\x00\x83\x80\x95\xFF\x83\xC0\x89\x00\x83\xC0\xAA" + "\xFF" + , //body + 103, //lenght + 0, + 0, + 0, + }, + { + 0, + 0, //body + 0, //lenght + 0, + 0, + 0, + } +}; diff --git a/archive-sources/solitair/rle.cpp b/archive-sources/solitair/rle.cpp new file mode 100644 index 0000000..e35ad14 --- /dev/null +++ b/archive-sources/solitair/rle.cpp @@ -0,0 +1,301 @@ +// rle.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" +#include "stdio.h" +#include "string.h" +#include "stdlib.h" + +void Usage() +{ + printf( + "Usage:\n\n" + "rle -c|-d \n" + "\nwhere \t-c compress" + "\n\t-d decompress\n" ); +} + +int Decompress( const char* filename ); + +int Compress( const char* filename ) +{ + if( NULL == filename || 0 == strlen( filename ) ) + { + Usage(); + return 2; + } + + FILE* out = NULL; + FILE* in = fopen( filename, "rb" ); + + char* filename_out; + + if( NULL == in ) + { + printf("Cannot open [%s]\n", filename ); + return 2; + } + + filename_out = (char*) malloc( strlen( filename + 4 ) ); + + if( filename_out == NULL ) + { + printf("Memory out!\n"); + return 2; + } + strcpy( filename_out, filename ); + strcat( filename_out, ".rle" ); + + out = fopen( filename_out, "wb" ); + + if( NULL == out ) + { + printf("Cannot create [%s] for output\n", filename_out ); + return 2; + } + + fwrite( filename, strlen( filename ) + 1, 1, out ); + +/////////////// +//compress now +/////////////// + + + + // 0xC0 + unsigned char cursor = 0; + + unsigned char bytes_to_read = 63; + unsigned char bytes[63]; + + int rep_byte = 0; + bool repeat = false; + + unsigned char counter; + + while( 1 ) + { + rep_byte = fgetc( in ); + + if( rep_byte == EOF ) + { + if( cursor == counter ) + { + counter += 128; + fputc( counter, out ); + fwrite( bytes, 1, counter - 128 , out ); + + cursor = 1; + bytes[0] = rep_byte; + bytes[1] = 0; + } + else + { + counter += 192; + fputc( counter, out ); + fputc( bytes[0], out ); + + cursor = 1; + bytes[0] = rep_byte; + bytes[1] = 0; + } + + break; + } + else + if( cursor == 63 ) + { + counter += 128; + fputc( counter, out ); + fwrite( bytes, 1, 63, out ); + + counter = 1; + cursor = 1; + bytes[0] = rep_byte; + bytes[1] = 0; + } + else if( counter == 63 ) + { + counter += 192; + fputc( counter, out ); + fputc( bytes[0], out ); + + cursor = 1; + bytes[0] = rep_byte; + bytes[1] = 0; + counter = 1; + } + else if( cursor == 0 ) + { + bytes[0] = rep_byte; + bytes[1] = 0; + counter = 1; + cursor = 1; + } + else + { + if( rep_byte == bytes[cursor-1] && cursor == 1 ) + { + counter++; + } + else if( rep_byte == bytes[cursor-1] ) + { + // changed situation we have to flush out data, + // next we have repeated data to handle + + fputc( counter - 1 + 128 , out ); + fwrite( bytes, 1, counter - 1, out ); + + bytes[0] = rep_byte; + bytes[1] = 0; + cursor = 1; + counter = 2; + } + else if( cursor == 1 && counter > 1 ) + { + fputc( counter + 192 , out ); + fputc( bytes[0], out ); + + bytes[0] = rep_byte; + bytes[1] = 0; + cursor = 1; + counter = 1; + + } else if( rep_byte != bytes[cursor-1] ) + { + + bytes[cursor] = rep_byte; + bytes[cursor+1] = 0; + counter++; + cursor++; + } + else + { + fputc( counter + 192 , out ); + fputc( bytes[0], out ); + + bytes[0] = rep_byte; + bytes[1] = 0; + cursor = 1; + counter = 1; + } + } + } + + + + fclose( in ); + fclose( out ); + + Decompress( filename_out ); + free(filename_out); + + return 0; +} + +int Decompress( const char* filename ) +{ + FILE* in = fopen( filename, "rb" ); + + if( NULL == in ) + { + printf("Cannot open [%s]\n", filename ); + return 2; + } + + char filename_out[255]; + unsigned char cursor = 0; + + while( + cursor < 255 && + EOF != ( filename_out[cursor] = fgetc( in ) ) && + ( filename_out[cursor] != 0 ) ) cursor++; + + if( cursor == 255 || EOF == filename_out[cursor] ) + { + printf( "Decompress: invalid file format!\n" ); + fclose( in ); + return 3; + } + + + strcat( filename_out, ".out" ); + + FILE* out = fopen( filename_out, "wb" ); + + if( NULL == out ) + { + printf("Cannot create [%s] for output\n", filename_out ); + fclose( in ); + return 2; + } + + int byte; + + while( EOF != ( byte = fgetc( in ) ) ) + { + char counter; + + if( !(byte&128) ) + { + printf("Some error while decompressing!"); + fclose( in ); + fclose( out ); + return 3; + } + + + if( !(byte & 64) ) + { + counter = byte - 128; + + while( EOF != ( byte = fgetc( in ) ) ) + { + fputc( byte, out ); + if( counter-- == 1 ) break; + } + } + else + { + counter = byte - 192; + byte = fgetc( in ); + + while( counter-- > 0 ) fputc( byte, out ); + } + } + + fclose( in ); + fclose( out ); + + return 0; +} + + + +int main(int argc, char* argv[]) +{ + + if( argc < 3 ) + { + Usage(); + return 1; + } + + if( + (argv[1][0] != '-') && + (argv[1][1] != 'c') && + (argv[1][1] != 'd') ) + { + Usage(); + return -1; + } + + + switch( argv[1][1] ) + { + case 'c': return Compress( argv[2] ); + case 'd': return Decompress( argv[2] ); + } + + return 0; +} diff --git a/archive-sources/solitair/solitair.cfg b/archive-sources/solitair/solitair.cfg new file mode 100644 index 0000000..40fe724 --- /dev/null +++ b/archive-sources/solitair/solitair.cfg @@ -0,0 +1,9 @@ +pluginversion=1 +name=Solitair +desc=a card game +depend=libfx2.so +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 diff --git a/archive-sources/solitair/somain.cpp b/archive-sources/solitair/somain.cpp new file mode 100644 index 0000000..d83754a --- /dev/null +++ b/archive-sources/solitair/somain.cpp @@ -0,0 +1,78 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" +{ +#include +#include +#include +#include +#include +} + +#include "pnm_file.h" + +#include "Table.h" +#define CONFIGDIR "." +#define GAMESDIR "." + +extern int debug; +extern int doexit; +extern unsigned short actcode; +extern unsigned short realcode; + +int solitair_exec( int fdfb, int fdrc, int fdlcd, char *cfgfile ) +{ + int rc = 0; + + CTable table; + + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + Set_8Bit_Pal(); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + rc = table.Run(); + + RcClose(); + + FBClose(); + + return rc; +} + +extern "C" +{ + int plugin_exec( PluginParam *par ) + { + int fd_fb=-1; + int fd_rc=-1; + + for( ; par; par=par->next ) + { + if ( !strcmp(par->id,P_ID_FBUFFER) ) + fd_fb=_atoi(par->val); + else if ( !strcmp(par->id,P_ID_RCINPUT) ) + fd_rc=_atoi(par->val); + else if ( !strcmp(par->id,P_ID_NOPIG) ) + fx2_use_pig=!_atoi(par->val); + } + + return solitair_exec( fd_fb, fd_rc, -1, 0 ); + } +} + diff --git a/archive-sources/sudoku/board.cpp b/archive-sources/sudoku/board.cpp new file mode 100644 index 0000000..2da6bed --- /dev/null +++ b/archive-sources/sudoku/board.cpp @@ -0,0 +1,773 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#include "board.h" + +#include + +#include "misc.h" + +//#define TEST +#ifndef TEST +extern "C" +{ + #include "draw.h" + #include "rcinput.h" + #include "fx2math.h" +} +#endif + +#define SCREEN_WIDTH 720 +#define SCREEN_HEIGHT 576 +#define SCREEN_BORDER 32 + +#define PROGRESSBAR_WIDTH 100 +#define PROGRESSBAR_HEIGHT 24 +#define PROGRESSBAR_LEFT (SCREEN_WIDTH/2)-(PROGRESSBAR_WIDTH/2) +#define PROGRESSBAR_TOP (SCREEN_HEIGHT/2)-(PROGRESSBAR_HEIGHT/2) + +#define SCREEN_MINSIZE_PERC 30 + +#define BLOCK_SPACE 2 +#define FIELD_BORDER 2 + +#define COLOR_BACKGROUND BACKGROUND +#define COLOR_BORDER STEELBLUE +#define COLOR_BORDER_HIGHLIGHTED COLOR_BORDER +#define COLOR_TEXT BLUE +#define COLOR_TEXT_FIXED BLACKBLACK +#define COLOR_TEXT_MISTAKE RED +#define COLOR_TEXTBG 0 +#define COLOR_FIELD_HIGHLIGHTED WHITE +#define COLOR_FIELDBG GLASS +#define COLOR_MESSAGEBOX RED +#define COLOR_MESSAGEBOXBG BLACKBLACK + +#define TEXT_HEIGHT 64 +#define TEXT_HEIGHT_SMALL 32 + +#define CURSOR2COORDS(cursorx, cursory) (cursorx / m_nBlockColumns), (cursory / m_nBlockRows), (cursorx % m_nFieldColumns), (cursory % m_nFieldRows) + +#define MENU_CMD_EXIT 0 +#define MENU_CMD_NEWGAME 1 +#define MENU_CMD_LOADGAME 2 +#define MENU_CMD_SAVEGAME 3 +#define MENU_CMD_SHOW_MISTAKES 4 +#define MENU_CMD_SHOW_SOLVABLE 5 +#define MENU_CMD_BOARD_SIZE 6 +#define MENU_CMD_SHOW_TV 7 +#define MENU_CMD_ABOUT 8 + +#define MENU_CAPTION "Sudoku" +#define MENU_TEXT_EXIT "Exit" +#define MENU_TEXT_NEWGAME "Start new game (Level %d)" +#define MENU_TEXT_LOADGAME "Load board" +#define MENU_TEXT_SAVEGAME "Save board" +#define MENU_TEXT_SHOW_MISTAKES "Show wrong fields on check: %s" +#define MENU_TEXT_SHOW_SOLVABLE "Show if solvable on check: %s" +#define MENU_TEXT_BOARD_SIZE "Change board size (%d%%)" +#define MENU_TEXT_SHOW_TV "Show TV: %s" +#define MENU_TEXT_ABOUT "About" + +#define TEXT_ABOUT "Sudoku v1.2\nby M. Schlosser\nemail: tuxbox@software-schlosser.de\nIn memory of Klaus K." +#define TEXT_PLEASEWAIT "please wait..." + +#define TEXT_ON "on" +#define TEXT_OFF "off" + +#define TEXT_RIGHT "Right!" +#define TEXT_WRONG "Wrong!" +#define TEXT_SOLVABLE "Solvable" +#define TEXT_NOTSOLVABLE "Not solvable!" + +#define TEXTBOX_BORDER 128 +#define TEXTBOX_X 300 +#define TEXTBOX_Y 200 +#define MSG_SLEEP 1000000 + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; + +extern unsigned short actcode; + +// ---------------------------------------------------------------------------- +// CBoard +// ---------------------------------------------------------------------------- +CBoard::CBoard() + : m_CursorX(0) + , m_CursorY(0) + , m_bShowMenu(false) + , m_bShowMessageBox(false) + , m_nLevel(LEVEL_DEFAULT) + , m_bShowMistakes(false) + , m_bShowSolvable(true) + , m_nBoardSizePercent(100) + , m_nShowTV(1) + , m_nScreenLeft(SCREEN_BORDER) + , m_nScreenTop(SCREEN_BORDER) + , m_nScreenRight(SCREEN_WIDTH-SCREEN_BORDER) + , m_nScreenBottom(SCREEN_HEIGHT-SCREEN_BORDER) + , m_nProgressBarLeft(PROGRESSBAR_LEFT) + , m_nProgressBarTop(PROGRESSBAR_TOP) + , m_nProgress(0) +{ + InitColors(); + InitMenu(); +} + +// ---------------------------------------------------------------------------- +// ~CBoard +// ---------------------------------------------------------------------------- +CBoard::~CBoard() +{ +} + +// ---------------------------------------------------------------------------- +// InitColors +// ---------------------------------------------------------------------------- +void CBoard::InitColors(void) +{ +#ifndef TEST + FBSetColor(YELLOW, 255, 255, 32); + FBSetColor(GREEN, 32, 255, 32); + FBSetColor(STEELBLUE, 32, 32, 192); + FBSetColor(BLUE, 72, 64, 255); + FBSetColor(GRAY, 128, 128, 144); + FBSetColor(BLACKBLACK,0, 0, 0); + FBSetColorEx(BACKGROUND, 128, 128, 160, m_nShowTV == 1 ? 255 : 0); + FBSetColorEx(GLASS, 224, 192, 255, m_nShowTV == 1 ? 127 : 0); + + FBSetupColors(); +#endif +} + +// ---------------------------------------------------------------------------- +// InitMenu +// ---------------------------------------------------------------------------- +void CBoard::InitMenu(void) +{ + m_Menu.sCaption = MENU_CAPTION; + + MenuAddItem(&m_Menu, MENU_TEXT_EXIT); + MenuAddItem(&m_Menu, MENU_TEXT_NEWGAME, m_nLevel); + MenuAddItem(&m_Menu, MENU_TEXT_LOADGAME); + MenuAddItem(&m_Menu, MENU_TEXT_SAVEGAME); + MenuAddItem(&m_Menu, MENU_TEXT_SHOW_MISTAKES, m_bShowMistakes ? TEXT_ON : TEXT_OFF); + MenuAddItem(&m_Menu, MENU_TEXT_SHOW_SOLVABLE, m_bShowSolvable ? TEXT_ON : TEXT_OFF); + MenuAddItem(&m_Menu, MENU_TEXT_BOARD_SIZE, m_nBoardSizePercent); + MenuAddItem(&m_Menu, MENU_TEXT_SHOW_TV, (m_nShowTV == 1) ? TEXT_ON : TEXT_OFF); + MenuAddItem(&m_Menu, MENU_TEXT_ABOUT); +} + +// ---------------------------------------------------------------------------- +// UpdateMenu +// ---------------------------------------------------------------------------- +void CBoard::UpdateMenu(void) +{ + MenuSetItem(&m_Menu, MENU_CMD_NEWGAME, MENU_TEXT_NEWGAME, m_nLevel); + MenuSetItem(&m_Menu, MENU_CMD_SHOW_MISTAKES, MENU_TEXT_SHOW_MISTAKES, m_bShowMistakes ? TEXT_ON : TEXT_OFF); + MenuSetItem(&m_Menu, MENU_CMD_SHOW_SOLVABLE, MENU_TEXT_SHOW_SOLVABLE, m_bShowSolvable ? TEXT_ON : TEXT_OFF); + MenuSetItem(&m_Menu, MENU_CMD_BOARD_SIZE, MENU_TEXT_BOARD_SIZE, m_nBoardSizePercent); + MenuSetItem(&m_Menu, MENU_CMD_SHOW_TV, MENU_TEXT_SHOW_TV, (m_nShowTV == 1) ? TEXT_ON : TEXT_OFF); +} + +// ---------------------------------------------------------------------------- +// InitBoard +// ---------------------------------------------------------------------------- +void CBoard::InitBoard() +{ + m_CursorX = 0; + m_CursorY = 0; + + // move cursor to first free field + while(IsSymbolFixed(CURSOR2COORDS(m_CursorX, m_CursorY))) + { + if(++m_CursorX > (m_mColumnLength-1)) + { + m_CursorY++; + m_CursorX = 0; + } + } + + m_nProgress = 0; + + // some precalculations + m_nBoardLeft = m_nScreenLeft; + m_nBoardTop = m_nScreenTop; + m_nBoardRight = ((SCREEN_WIDTH - SCREEN_BORDER) * m_nBoardSizePercent / 100); + m_nBoardBottom = ((SCREEN_HEIGHT - SCREEN_BORDER) * m_nBoardSizePercent / 100); + + m_nBlockWidth = ((m_nBoardRight - m_nBoardLeft) / m_nBlockColumns); + m_nBlockHeight = ((m_nBoardBottom - m_nBoardTop) / m_nBlockRows); + m_nFieldWidth = (m_nBlockWidth / m_nFieldColumns); + m_nFieldHeight = (m_nBlockHeight / m_nFieldRows); + + // add board border + int nBoardSpaceX = (m_nBlockColumns-1) * BLOCK_SPACE; + int nBoardSpaceY = (m_nBlockRows-1) * BLOCK_SPACE; + m_nBoardLeft -= (nBoardSpaceX/2); + m_nBoardTop -= (nBoardSpaceY/2); + m_nBoardRight += (nBoardSpaceX/2); + m_nBoardBottom += (nBoardSpaceY/2); + + m_mColumnLength = m_nBlockColumns * m_nFieldColumns; + m_mRowLength = m_nBlockRows * m_nFieldRows; + +#ifndef TEST + // draw board + DrawBoard(DRAWBOARD_SHOW_DEFAULT); + #ifdef USEX + FBFlushGrafic(); + #endif +#endif +} + + +// ---------------------------------------------------------------------------- +// NewGame +// ---------------------------------------------------------------------------- +void CBoard::NewGame() +{ +#ifndef TEST + Message(m_nProgressBarLeft, 192, 48, TEXT_PLEASEWAIT, COLOR_MESSAGEBOX, COLOR_MESSAGEBOXBG); +#endif + Create(m_nLevel); +} + +// ---------------------------------------------------------------------------- +// LoadSettings +// ---------------------------------------------------------------------------- +int CBoard::LoadSettings(const char *pszFile) +{ + std::ifstream F; + F.open(pszFile, std::ios_base::in | std::ios_base::binary); + if(!F.good()) + return -1; + + int nVersion; + F.read((char *) &nVersion, sizeof(nVersion)); + + F.read((char *) &m_nScreenLeft, sizeof(m_nScreenLeft)); + F.read((char *) &m_nScreenTop, sizeof(m_nScreenTop)); + F.read((char *) &m_nScreenRight, sizeof(m_nScreenRight)); // eigentlich ueberfluessig... + F.read((char *) &m_nScreenBottom, sizeof(m_nScreenBottom)); // eigentlich ueberfluessig... + F.read((char *) &m_nBoardSizePercent, sizeof(m_nBoardSizePercent)); + + F.read((char *) &m_nLevel, sizeof(m_nLevel)); + F.read((char *) &m_bShowMistakes, sizeof(m_bShowMistakes)); + F.read((char *) &m_bShowSolvable, sizeof(m_bShowSolvable)); + + if(nVersion >= 2) + { + F.read((char *) &m_nShowTV, sizeof(m_nShowTV)); + } + + F.close(); + return 1; +} + +// ---------------------------------------------------------------------------- +// SaveSettings +// ---------------------------------------------------------------------------- +int CBoard::SaveSettings(const char *pszFile) +{ + std::ofstream F; + F.open(pszFile, std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); + if(!F.good()) + return -1; + + int nVersion = SETTINGSFILE_VERSION; + F.write((const char *) &nVersion, sizeof(nVersion)); + + F.write((char *) &m_nScreenLeft, sizeof(m_nScreenLeft)); + F.write((char *) &m_nScreenTop, sizeof(m_nScreenTop)); + F.write((char *) &m_nScreenRight, sizeof(m_nScreenRight)); // eigentlich ueberfluessig... + F.write((char *) &m_nScreenBottom, sizeof(m_nScreenBottom)); // eigentlich ueberfluessig... + F.write((char *) &m_nBoardSizePercent, sizeof(m_nBoardSizePercent)); + + F.write((const char *) &m_nLevel, sizeof(m_nLevel)); + F.write((const char *) &m_bShowMistakes, sizeof(m_bShowMistakes)); + F.write((const char *) &m_bShowSolvable, sizeof(m_bShowSolvable)); + + if(nVersion >= 2) + { + F.write((char *) &m_nShowTV, sizeof(m_nShowTV)); + } + + F.close(); + return 1; +} + +// ---------------------------------------------------------------------------- +// Coord2Screen +// ---------------------------------------------------------------------------- +tPoint CBoard::Coord2Screen(int nBlockCol, int nBlockRow, int nFieldCol, int nFieldRow) +{ + tPoint p; + p.x = m_nBoardLeft + (nBlockCol * m_nBlockWidth) + (nFieldCol * m_nFieldWidth) + (nBlockCol * BLOCK_SPACE); + p.y = m_nBoardTop + (nBlockRow * m_nBlockHeight) + (nFieldRow * m_nFieldHeight) + (nBlockRow * BLOCK_SPACE); + return p; +} + +// ---------------------------------------------------------------------------- +// DrawField +// ---------------------------------------------------------------------------- +void CBoard::DrawField(int nBlockCol, int nBlockRow, int nFieldCol, int nFieldRow, int nBorderColor, int nFillColor, int nShow) +{ +#ifndef TEST + tPoint p = Coord2Screen(nBlockCol, nBlockRow, nFieldCol, nFieldRow); + if(nFillColor > 0) + { + FBFillRect(p.x+FIELD_BORDER, p.y+FIELD_BORDER, m_nFieldWidth-FIELD_BORDER, m_nFieldHeight-FIELD_BORDER, nFillColor); + } + + tSymbol *pSymbol = GetSymbol(nBlockCol, nBlockRow, nFieldCol, nFieldRow); + char szSymbol[2] = { pSymbol->cSymbol, '\0' }; + int nColorText = pSymbol->bFixed ? COLOR_TEXT_FIXED : COLOR_TEXT; + if((nShow & DRAWBOARD_SHOW_MISTAKES) && pSymbol->cSymbol != pSymbol->cSolution) + nColorText = COLOR_TEXT_MISTAKE; + FBDrawString(p.x+(m_nFieldWidth/4)+(FIELD_BORDER*2), p.y+FIELD_BORDER, m_nFieldHeight, szSymbol, nColorText, COLOR_TEXTBG); +#endif +} + +// ---------------------------------------------------------------------------- +// DrawBlock +// ---------------------------------------------------------------------------- +void CBoard::DrawBlock(int nBlockCol, int nBlockRow, int nFillColor, int nShow) +{ + int r, c; + for(r=0; rbFixed) + pSymbol->cSymbol = cSymbol; +} +/* +#define MOVECURSOR(move) { \ + int nOldX = m_CursorX; \ + int nOldY = m_CursorY; \ + DrawField(CURSOR2COORDS(m_CursorX, m_CursorY), COLOR_BORDER, COLOR_FIELDBG, DRAWBOARD_SHOW_DEFAULT); \ + do \ + { \ + move; \ + if(m_CursorX < 0) m_CursorX = (m_mColumnLength-1); \ + if(m_CursorY < 0) m_CursorY = (m_mRowLength-1); \ + if(m_CursorX >= m_mColumnLength) m_CursorX = 0; \ + if(m_CursorY >= m_mRowLength) m_CursorY = 0; \ + if(m_CursorX == nOldX && m_CursorY == nOldY) break; \ + } \ + while(IsSymbolFixed(CURSOR2COORDS(m_CursorX, m_CursorY))); \ + DrawField(CURSOR2COORDS(m_CursorX, m_CursorY), COLOR_BORDER_HIGHLIGHTED, COLOR_FIELD_HIGHLIGHTED, DRAWBOARD_SHOW_DEFAULT); \ + } +*/ +#define MOVECURSOR(move) { \ + DrawField(CURSOR2COORDS(m_CursorX, m_CursorY), COLOR_BORDER, COLOR_FIELDBG, DRAWBOARD_SHOW_DEFAULT); \ + move; \ + if(m_CursorX < 0) m_CursorX = (m_mColumnLength-1); \ + if(m_CursorY < 0) m_CursorY = (m_mRowLength-1); \ + if(m_CursorX >= m_mColumnLength) m_CursorX = 0; \ + if(m_CursorY >= m_mRowLength) m_CursorY = 0; \ + DrawField(CURSOR2COORDS(m_CursorX, m_CursorY), COLOR_BORDER_HIGHLIGHTED, COLOR_FIELD_HIGHLIGHTED, DRAWBOARD_SHOW_DEFAULT); \ + } + +// ---------------------------------------------------------------------------- +// MoveCursor +// ---------------------------------------------------------------------------- +void CBoard::MoveCursor(void) +{ +#ifndef TEST + if(m_bShowMessageBox) + switch(actcode) + { +// case RC_HOME: +// case RC_OK: + case 0xEE: + break; + default: + m_bShowMessageBox = false; + if(m_bShowMenu) + MenuDraw(&m_Menu); + else + DrawBoard(DRAWBOARD_SHOW_DEFAULT); + break; + } + else if(m_bShowMenu) + switch(actcode) + { + case RC_DOWN: + { + int nLastSelection = m_Menu.nSelectedItem; + if(++m_Menu.nSelectedItem >= m_Menu.nItemsCount) + m_Menu.nSelectedItem = 0; + MenuDrawItem(&m_Menu, nLastSelection); + MenuDrawItem(&m_Menu, m_Menu.nSelectedItem); + } + break; + + case RC_UP: + { + int nLastSelection = m_Menu.nSelectedItem; + if(--m_Menu.nSelectedItem < 0) + m_Menu.nSelectedItem = m_Menu.nItemsCount-1; + MenuDrawItem(&m_Menu, nLastSelection); + MenuDrawItem(&m_Menu, m_Menu.nSelectedItem); + } + break; + + case RC_MINUS: + case RC_LEFT: + switch(m_Menu.nSelectedItem) + { + case MENU_CMD_NEWGAME: + if(m_nLevel > LEVEL_MIN) m_nLevel--; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_NEWGAME, m_nLevel); + break; + + case MENU_CMD_SHOW_MISTAKES: + m_bShowMistakes = false; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_SHOW_MISTAKES, m_bShowMistakes ? TEXT_ON : TEXT_OFF); + break; + + case MENU_CMD_SHOW_SOLVABLE: + m_bShowSolvable = false; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_SHOW_SOLVABLE, m_bShowSolvable ? TEXT_ON : TEXT_OFF); + break; + + case MENU_CMD_BOARD_SIZE: + if(m_nBoardSizePercent > SCREEN_MINSIZE_PERC) m_nBoardSizePercent-=2; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_BOARD_SIZE, m_nBoardSizePercent); + break; + + case MENU_CMD_SHOW_TV: + m_nShowTV = 0; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_SHOW_TV, (m_nShowTV == 1) ? TEXT_ON : TEXT_OFF); + break; + } + break; + + case RC_PLUS: + case RC_RIGHT: + switch(m_Menu.nSelectedItem) + { + case MENU_CMD_NEWGAME: + if(m_nLevel < LEVEL_MAX) m_nLevel++; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_NEWGAME, m_nLevel); + break; + + case MENU_CMD_SHOW_MISTAKES: + m_bShowMistakes = true; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_SHOW_MISTAKES, m_bShowMistakes ? TEXT_ON : TEXT_OFF); + break; + + case MENU_CMD_SHOW_SOLVABLE: + m_bShowSolvable = true; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_SHOW_SOLVABLE, m_bShowSolvable ? TEXT_ON : TEXT_OFF); + break; + + case MENU_CMD_BOARD_SIZE: + if(m_nBoardSizePercent < 100) m_nBoardSizePercent+=2; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_BOARD_SIZE, m_nBoardSizePercent); + break; + + case MENU_CMD_SHOW_TV: + m_nShowTV = 1; + MenuSetItem(&m_Menu, m_Menu.nSelectedItem, MENU_TEXT_SHOW_TV, (m_nShowTV == 1) ? TEXT_ON : TEXT_OFF); + break; + } + break; + + case RC_OK: + if(DoMenuCmd()) + { + m_bShowMenu = false; + InitColors(); // if m_nShowTV changed... + DrawBoard(DRAWBOARD_SHOW_DEFAULT); + } + break; + +// case RC_HOME: +// case RC_RED: +// case RC_YELLOW: +// case RC_GREEN: + case RC_SETUP: + case RC_BLUE: + m_bShowMenu = false; + DrawBoard(DRAWBOARD_SHOW_DEFAULT); + break; + } + else + switch(actcode) + { + case RC_RIGHT: + MOVECURSOR(m_CursorX++); + break; + + case RC_LEFT: + MOVECURSOR(m_CursorX--); + break; + + case RC_DOWN: + MOVECURSOR(m_CursorY++); + break; + + case RC_UP: + MOVECURSOR(m_CursorY--); + break; + +// case RC_1: +// case RC_2: +// case RC_3: +// case RC_4: +// case RC_5: +// case RC_6: +// case RC_7: +// case RC_8: +// case RC_9: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + SetCurrentSymbol('0' + actcode); + DrawField(CURSOR2COORDS(m_CursorX, m_CursorY), COLOR_BORDER_HIGHLIGHTED, COLOR_FIELD_HIGHLIGHTED, DRAWBOARD_SHOW_DEFAULT); + break; + +// case RC_0: + case 0: + SetCurrentSymbol(0); + DrawField(CURSOR2COORDS(m_CursorX, m_CursorY), COLOR_BORDER_HIGHLIGHTED, COLOR_FIELD_HIGHLIGHTED, DRAWBOARD_SHOW_DEFAULT); + break; + + case RC_GREEN: + case RC_OK: + { + if(m_bShowMistakes) + DrawBoard(DRAWBOARD_SHOW_MISTAKES); + + // check if sudoku is erroneous and/or incomplete + int nCheck = CheckBoard(); + const char *pszMsg = NULL; + if(nCheck & CHECK_ERRONEOUS) + { + if(nCheck & CHECK_INCOMPLETE) // if the sudouku incomplete... + { + if(m_bShowSolvable) // ...and if we want to know if the sudoku is solvable... + pszMsg = TEXT_NOTSOLVABLE; // ...show "not solvable" + } + else + { + pszMsg = TEXT_WRONG; // ...show "wrong" + } + } + else if(nCheck & CHECK_INCOMPLETE) + { + if(m_bShowSolvable) // ...if we want to know if the sudoku is solvable... + pszMsg = TEXT_SOLVABLE; // ...show "solvable" + } + else + { + pszMsg = TEXT_RIGHT; + } + + if(pszMsg != NULL) + { + MessageBox(TEXTBOX_X, TEXTBOX_Y, TEXT_HEIGHT, (char *) pszMsg, COLOR_MESSAGEBOX, COLOR_MESSAGEBOXBG); + } + } + break; + +// case RC_RED: +// case RC_YELLOW: +// case RC_GREEN: + case RC_SETUP: + case RC_BLUE: + m_bShowMenu = true; + MenuDraw(&m_Menu); + UpdateMenu(); + break; + + case RC_HOME: + doexit = 1; + break; + } +#endif +} + +// ---------------------------------------------------------------------------- +// DoMenuCmd +// ---------------------------------------------------------------------------- +bool CBoard::DoMenuCmd(void) +{ +#ifndef TEST + switch(m_Menu.nSelectedItem) + { + case MENU_CMD_EXIT: + break; + + case MENU_CMD_NEWGAME: + NewGame(); + InitBoard(); + break; + + case MENU_CMD_LOADGAME: + LoadGame(GAMEFILE); + InitBoard(); + break; + + case MENU_CMD_SAVEGAME: + SaveGame(GAMEFILE); + break; + + case MENU_CMD_BOARD_SIZE: + InitBoard(); + break; + + case MENU_CMD_ABOUT: + MessageBox(200, 200, 48, TEXT_ABOUT, COLOR_MESSAGEBOX, COLOR_MESSAGEBOXBG); + return false; + break; + } + return true; +#endif +} + +// ---------------------------------------------------------------------------- +// Message +// ---------------------------------------------------------------------------- +void CBoard::Message(int x, int y, int dy, const char *pszMessage, int nColorText, int nColorBg) +{ +#ifndef TEST + std::string s(pszMessage); + + int nLineCount = 1; + std::string::size_type nMaxStrLen = 0; + std::string::size_type nStart = 0, nEnd; + while((nEnd = s.find('\n', nStart)) != std::string::npos) + { + if(s.substr(nStart, nEnd-nStart).length() > nMaxStrLen) + nMaxStrLen = s.substr(nStart, nEnd-nStart).length(); + nLineCount++; + nStart = nEnd+1; + } + if(s.substr(nStart, s.length()-nStart).length() > nMaxStrLen) + nMaxStrLen = s.substr(nStart, s.length()-nStart).length(); + + if(nLineCount > 1) + { +// FBFillRect(x, y, nMaxStrLen*(dy/4), nLineCount*dy, nColorBg); + FBFillRect(TEXTBOX_BORDER, y, SCREEN_WIDTH-(2*TEXTBOX_BORDER), nLineCount*dy, nColorBg); + } + + nStart = 0; + while((nEnd = s.find('\n', nStart)) != std::string::npos) + { + FBDrawString(x, y, dy, (char *) s.substr(nStart, nEnd-nStart).c_str(), nColorText, nColorBg); + y += dy; + nStart = nEnd+1; + } + FBDrawString(x, y, dy, (char *) s.substr(nStart, s.length()-nStart).c_str(), nColorText, nColorBg); +#endif +} + +// ---------------------------------------------------------------------------- +// MessageBox +// ---------------------------------------------------------------------------- +void CBoard::MessageBox(int x, int y, int dy, const char *pszMessage, int nColorText, int nColorBg) +{ + m_bShowMessageBox = true; + Message(x, y, dy, pszMessage, nColorText, nColorBg); +} + +// ---------------------------------------------------------------------------- +// CallbackCreate +// ---------------------------------------------------------------------------- +void CBoard::CallbackCreate(unsigned long nValue) +{ + m_nProgress+=2; + if(m_nProgress > PROGRESSBAR_WIDTH) + m_nProgress = 0; +#ifndef TEST + FBFillRect(m_nProgressBarLeft-1, m_nProgressBarTop-1, PROGRESSBAR_WIDTH+1, PROGRESSBAR_HEIGHT+1, BLACKBLACK); + FBFillRect(m_nProgressBarLeft, m_nProgressBarTop, m_nProgress, PROGRESSBAR_HEIGHT, BLUE); +#else +// cout << "Progress: " << m_nProgress << endl; +#endif +} diff --git a/archive-sources/sudoku/board.h b/archive-sources/sudoku/board.h new file mode 100644 index 0000000..73b492a --- /dev/null +++ b/archive-sources/sudoku/board.h @@ -0,0 +1,127 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#ifndef _BOARD_H +#define _BOARD_H + +#ifndef _COLORS_H + #include "colors.h" +#endif + +#ifndef _SUDOKU_H + #include "sudoku.h" +#endif + +#ifndef _MENU_H + #include "menu.h" +#endif + +typedef struct +{ + int x; + int y; +} tPoint; + +#define DRAWBOARD_SHOW_DEFAULT 0 +#define DRAWBOARD_SHOW_MISTAKES 1 + +#define LEVEL_MIN 1 +#define LEVEL_MAX 7 +#define LEVEL_DEFAULT 5 + +#define GAMEFILE "/var/tuxbox/config/sudoku.sav" +#define SETTINGSFILE "/var/tuxbox/config/sudoku.conf" +#define SETTINGSFILE_VERSION 2 + +class CBoard: public CSudoku +{ +public: + CBoard(); + virtual ~CBoard(); + +public: + void MoveCursor(void); + void InitBoard(); + void NewGame(); + int LoadSettings(const char *pszFile); + int SaveSettings(const char *pszFile); + +private: + void InitColors(void); + void InitMenu(void); + void UpdateMenu(void); + tPoint Coord2Screen(int nBlockCol, int nBlockRow, int nFieldCol, int nFieldRow); + void DrawField(int nBlockCol, int nBlockRow, int nFieldCol, int nFieldRow, int nBorderColor, int nFillColor, int nShow); + void DrawBlock(int nBlockCol, int nBlockRow, int nFillColor, int nShow); + void DrawBackground(void); + void DrawBoard(int nShow); + void SetCurrentSymbol(char cSymbol); + + bool DoMenuCmd(void); + void Message(int x, int y, int dy, const char *pszMessage, int nColorText, int nColorBg); + void MessageBox(int x, int y, int dy, const char *pszMessage, int nColorText, int nColorBg); + +private: // overrides + void CallbackCreate(unsigned long nValue); + +private: + int m_CursorX; + int m_CursorY; + + bool m_bShowMenu; + tMenu m_Menu; + + bool m_bShowMessageBox; + + // settings + int m_nLevel; + bool m_bShowMistakes; + bool m_bShowSolvable; + + int m_nBoardSizePercent; + int m_nShowTV; + +private: // pre calculated numbers (optimizations) + int m_nScreenLeft; + int m_nScreenTop; + int m_nScreenRight; + int m_nScreenBottom; + + int m_nBoardLeft; + int m_nBoardTop; + int m_nBoardRight; + int m_nBoardBottom; + + int m_nBlockWidth; + int m_nBlockHeight; + int m_nBlockSize; + int m_nFieldWidth; + int m_nFieldHeight; + + int m_mColumnLength; + int m_mRowLength; + + int m_nProgressBarLeft; + int m_nProgressBarTop; + int m_nProgress; +}; + +#endif // _BOARD_H diff --git a/archive-sources/sudoku/colors.h b/archive-sources/sudoku/colors.h new file mode 100644 index 0000000..a14eda1 --- /dev/null +++ b/archive-sources/sudoku/colors.h @@ -0,0 +1,35 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#ifndef _COLORS_H +#define _COLORS_H + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define BLACKBLACK 9 + +#define GLASS 10 +#define BACKGROUND 11 + +#endif // _COLORS_H diff --git a/archive-sources/sudoku/menu.cpp b/archive-sources/sudoku/menu.cpp new file mode 100644 index 0000000..1412cd0 --- /dev/null +++ b/archive-sources/sudoku/menu.cpp @@ -0,0 +1,214 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#include "menu.h" + +#include +#include + +//#define TEST +#ifndef TEST +extern "C" +{ + #include +} +#else + #define RED 0 +#endif + +#include "colors.h" + +#define SCREEN_WIDTH 720 +#define SCREEN_HEIGHT 576 + +#undef BLACK +#define BLACK BLACKBLACK + +#define COLOR_TEXTBG 0 + +#define FORMAT_TMP_LEN 1024 + + +// ---------------------------------------------------------------------------- +// tMenuItem::tMenuItem() +// ---------------------------------------------------------------------------- +tMenuItem::tMenuItem() + : nLeft(-1) + , nTop(-1) + , nWidth(-1) + , nHeight(-1) +{ +} +/* +// ---------------------------------------------------------------------------- +// tMenuItem::operator = +// ---------------------------------------------------------------------------- +tMenuItem &tMenuItem::operator = (const tMenuItem &rMenuItem) +{ + sText = rMenuItem.sText; + return *this; +} +*/ +// ---------------------------------------------------------------------------- +// tMenu +// ---------------------------------------------------------------------------- +tMenu::tMenu() + : nLeft(128) + , nTop(64) + , nWidth(SCREEN_WIDTH-(2*nLeft)) + , nColorMenuBorder(BLACK) + , nColorMenuBackground(STEELBLUE) + , nColorItemText(WHITE) + , nColorItemTextHighlighted(YELLOW) + , nColorItemBgHighlighted(BLUE) + , nColorCaptionBorder(RED) + , nColorCaptionBackground(BLACK) + , nColorCaptionText(RED) + , nCaptionHeight(48) + , nItemHeight(34) + , nItemsCount(0) + , nSelectedItem(0) +{ +} + +// ---------------------------------------------------------------------------- +// MenuAddItem +// ---------------------------------------------------------------------------- +tMenuItemIterator MenuGetItem(tMenu *pMenu, int nIndex) +{ + if(nIndex < 0 || nIndex > (pMenu->nItemsCount-1)) + return pMenu->MenuItemsList.end(); + + int i=0; + tMenuItemIterator pMenuItem; + for(pMenuItem = pMenu->MenuItemsList.begin(); pMenuItem != pMenu->MenuItemsList.end(); pMenuItem++) + { + if(i == nIndex) + return pMenuItem; + i++; + } + + return pMenu->MenuItemsList.end(); +} + +// ---------------------------------------------------------------------------- +// MenuAddItem +// ---------------------------------------------------------------------------- +void MenuAddItem(tMenu *pMenu, const char *pszFormat, ...) +{ + tMenuItem Item; +// Item.sText = pszText; + va_list argList; + va_start(argList, pszFormat); + + // TODO: + char szString[FORMAT_TMP_LEN]; + vsprintf(szString, pszFormat, argList); + Item.sText = szString; + + va_end(argList); + + pMenu->MenuItemsList.push_back(Item); + pMenu->nItemsCount++; +} + +// ---------------------------------------------------------------------------- +// MenuSetItem +// ---------------------------------------------------------------------------- +void MenuSetItem(tMenu *pMenu, int nIndex, const char *pszFormat, ...) +{ + tMenuItemIterator pMenuItem = MenuGetItem(pMenu, nIndex); + va_list argList; + va_start(argList, pszFormat); + + // TODO: + char szString[FORMAT_TMP_LEN]; + vsprintf(szString, pszFormat, argList); + pMenuItem->sText = szString; + + va_end(argList); + + if(pMenuItem->nLeft != -1 && pMenuItem->nTop != -1 && pMenuItem->nWidth != -1 && pMenuItem->nHeight != -1) + MenuDrawItem(pMenu, pMenuItem, (nIndex == pMenu->nSelectedItem)); +} + +// ---------------------------------------------------------------------------- +// MenuDrawItem +// ---------------------------------------------------------------------------- +void MenuDrawItem(tMenu *pMenu, tMenuItemIterator pMenuItem, bool bHighlighted) +{ + FBFillRect(pMenuItem->nLeft, pMenuItem->nTop, pMenuItem->nWidth, pMenuItem->nHeight, bHighlighted ? pMenu->nColorItemBgHighlighted : pMenu->nColorMenuBackground); + FBDrawString(pMenuItem->nLeft, pMenuItem->nTop, pMenuItem->nHeight, (char *) pMenuItem->sText.c_str(), bHighlighted ? pMenu->nColorItemTextHighlighted : pMenu->nColorItemText, COLOR_TEXTBG); +} + +// ---------------------------------------------------------------------------- +// MenuDrawItem +// ---------------------------------------------------------------------------- +void MenuDrawItem(tMenu *pMenu, int nIndex) +{ + MenuDrawItem(pMenu, MenuGetItem(pMenu, nIndex), (nIndex == pMenu->nSelectedItem)); +} + +// ---------------------------------------------------------------------------- +// MenuDraw +// ---------------------------------------------------------------------------- +void MenuDraw(tMenu *pMenu) +{ +#ifndef TEST + int x = pMenu->nLeft; + int y = pMenu->nTop; + int w = pMenu->nWidth; + + if(pMenu->sCaption.length() > 0) + { + if(pMenu->nCaptionHeight <= 0) + pMenu->nCaptionHeight = 48; + + FBFillRect(x, y, w, pMenu->nCaptionHeight, pMenu->nColorCaptionBackground); + FBDrawRect(x, y, w, pMenu->nCaptionHeight-1, pMenu->nColorCaptionBorder); + + FBDrawString(x+4, y+4, pMenu->nCaptionHeight-2, (char *) pMenu->sCaption.c_str(), pMenu->nColorCaptionText, COLOR_TEXTBG); + + y += pMenu->nCaptionHeight; + FBFillRect(x, y, w, 2, BLACK); + y += 2; + } + + int i=0; + tMenuItemIterator pMenuItem; + for(pMenuItem = pMenu->MenuItemsList.begin(); pMenuItem != pMenu->MenuItemsList.end(); pMenuItem++) + { + if(pMenuItem->sText.length() > 0) + { + pMenuItem->nLeft = x; + pMenuItem->nTop = y; + pMenuItem->nWidth = w; + pMenuItem->nHeight = pMenu->nItemHeight; + MenuDrawItem(pMenu, pMenuItem, (i == pMenu->nSelectedItem)); + + y += pMenu->nItemHeight; + FBFillRect(x, y, w, 2, BLACK); + y += 2; + i++; + } + } +#endif +} diff --git a/archive-sources/sudoku/menu.h b/archive-sources/sudoku/menu.h new file mode 100644 index 0000000..6a7f7d5 --- /dev/null +++ b/archive-sources/sudoku/menu.h @@ -0,0 +1,83 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#ifndef _MENU_H +#define _MENU_H + +#include +#include + +typedef struct tMenuItem +{ + tMenuItem(); + + std::string sText; + int nLeft; + int nTop; + int nWidth; + int nHeight; + +// tMenuItem &operator = (const tMenuItem &rMenuItem); +}; + +typedef std::list tMenuItemsList; +typedef std::list::iterator tMenuItemIterator; + +typedef struct tMenu +{ + tMenu(); + + // menu position + int nLeft; + int nTop; + int nWidth; + + // menu colors + int nColorMenuBorder; + int nColorMenuBackground; + int nColorItemText; + int nColorItemTextHighlighted; + int nColorItemBgHighlighted; + + int nColorCaptionBorder; + int nColorCaptionBackground; + int nColorCaptionText; + + // menu caption + std::string sCaption; + int nCaptionHeight; + + // menu items + int nItemHeight; + int nItemsCount; + int nSelectedItem; + + tMenuItemsList MenuItemsList; +}; + +extern tMenuItemIterator MenuGetItem(tMenu *pMenu, int nIndex); +extern void MenuAddItem(tMenu *pMenu, const char *pszFormat, ...); +extern void MenuSetItem(tMenu *pMenu, int nIndex, const char *pszFormat, ...); +extern void MenuDrawItem(tMenu *pMenu, tMenuItemIterator pMenuItem, bool bHighlighted); +extern void MenuDrawItem(tMenu *pMenu, int nIndex); +extern void MenuDraw(tMenu *pMenu); + +#endif // _MENU_H diff --git a/archive-sources/sudoku/misc.cpp b/archive-sources/sudoku/misc.cpp new file mode 100644 index 0000000..e02dd8d --- /dev/null +++ b/archive-sources/sudoku/misc.cpp @@ -0,0 +1,44 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#include + +// ---------------------------------------------------------------------------- +// Rand +// ---------------------------------------------------------------------------- +int Rand(void) +{ +// return rand(); + struct timeval tv; + gettimeofday(&tv, 0); + return (int) tv.tv_usec; +} + +// ---------------------------------------------------------------------------- +// Sleep +// ---------------------------------------------------------------------------- +void Sleep(unsigned int usec) +{ + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = usec; + select(0, 0, 0, 0, &tv); +} diff --git a/archive-sources/sudoku/misc.h b/archive-sources/sudoku/misc.h new file mode 100644 index 0000000..3133a0a --- /dev/null +++ b/archive-sources/sudoku/misc.h @@ -0,0 +1,28 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#ifndef _MISC_H +#define _MISC_H + +extern void Sleep(unsigned int usec); +extern int Rand(void); + +#endif // _MISC_H diff --git a/archive-sources/sudoku/somain.cpp b/archive-sources/sudoku/somain.cpp new file mode 100644 index 0000000..1cad153 --- /dev/null +++ b/archive-sources/sudoku/somain.cpp @@ -0,0 +1,198 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#include +#include +#include +#include + +//#define TEST +#ifdef TEST +#include +#include "sudoku.h" +void ShowSudoku(CSudoku &rSudoku, bool bFixed) +{ + int bc, br, fr, fc; + tSymbol *pSymbol; + for(br=0; brcSolution; + } + else + { + if(pSymbol->cSymbol > 0) + cout << pSymbol->cSymbol; + else + cout << " "; + } + cout << " "; + } + cout << " | "; + } + cout << endl; + } + cout << "------------------------" << endl; + } + cout << endl; +} + +// ---------------------------------------------------------------------------- +// main +// ---------------------------------------------------------------------------- +int main(int argc, char *argv[]) +{ + srand(time(NULL)); + + CSudoku Board; +// Board.LoadSettings(SETTINGSFILE); +// if(Board.LoadGame(GAMEFILE) <= 0) +// Board.NewGame(); +// Board.InitBoard(); + + Board.Create(5); + + ShowSudoku(Board, true); + ShowSudoku(Board, false); + + return 0; +} +#else +extern "C" +{ + #include "draw.h" + #include "fx2math.h" + #include "rcinput.h" + + #include "pig.h" +// #include +} + +#include "board.h" +#include "misc.h" + +extern unsigned short actcode; +extern unsigned short realcode; +extern int doexit; +extern int debug; + +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +// ---------------------------------------------------------------------------- +// shutdown +// ---------------------------------------------------------------------------- +void shutdown() +{ + Sleep(300000); // 300ms pause +/* + realcode = RC_0; + while(realcode != 0xEE) + { + RcGetActCode(); + } +*/ + + RcClose(); + FBClose(); +} + +// ---------------------------------------------------------------------------- +// main_exec +// ---------------------------------------------------------------------------- +int main( ) +{ +// srand(time(NULL)); + + int fdfb = -1, fdrc = -1; + if(FBInitialize(720, 576, 8, fdfb) < 0) + return -1; + + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if(RcInitialize(fdrc) < 0) + return -1; + + CBoard Board; + Board.LoadSettings(SETTINGSFILE); + if(Board.LoadGame(GAMEFILE) <= 0) + Board.NewGame(); + Board.InitBoard(); + + doexit = 0; + while(!doexit) + { + actcode = 0xEE; + RcGetActCode(); + + Board.MoveCursor(); + + while(realcode != 0xEE) + RcGetActCode(); + } + + Board.SaveSettings(SETTINGSFILE); + Board.SaveGame(GAMEFILE); + + shutdown(); + return 0; +} + +//extern "C" +//{ +// // ---------------------------------------------------------------------------- +// // plugin_exec +// // ---------------------------------------------------------------------------- +// int plugin_exec(PluginParam *par) +// { +// int fd_fb = -1; +// int fd_rc = -1; +// +// for( ; par; par=par->next) +// { +// if(strcmp(par->id, P_ID_FBUFFER) == 0) +// fd_fb = _atoi(par->val); +// else if(strcmp(par->id, P_ID_RCINPUT) == 0) +// fd_rc = _atoi(par->val); +// else if(strcmp(par->id, P_ID_NOPIG) == 0) +// fx2_use_pig = !_atoi(par->val); +// } +// +// return main_exec(fd_fb, fd_rc, -1, NULL); +// } +//} +#endif diff --git a/archive-sources/sudoku/sudoku.cfg b/archive-sources/sudoku/sudoku.cfg new file mode 100644 index 0000000..8fd4a26 --- /dev/null +++ b/archive-sources/sudoku/sudoku.cfg @@ -0,0 +1,7 @@ +type=1 +name=Sudoku +desc=Sudoku +needfb=1 +needrc=1 +needlcd=0 +needoffsets=0 diff --git a/archive-sources/sudoku/sudoku.cpp b/archive-sources/sudoku/sudoku.cpp new file mode 100644 index 0000000..990434f --- /dev/null +++ b/archive-sources/sudoku/sudoku.cpp @@ -0,0 +1,725 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#include +#include "sudoku.h" + +#include +#include +#include + +//#define _DEBUG_ + + +#ifdef HAVE_DBOX_HARDWARE + #include "misc.h" +#else + int Rand() + { + return rand(); + } +#endif + +//#define _TEST_ +#ifdef _TEST_ + static char testsudoku[] = + { + '5', '3', 0, 0, '7', 0, 0, 0, 0, + '6', 0, 0, '1', '9', '5', 0, 0, 0, + 0, '9', '8', 0, 0, 0, 0, '6', 0, + '8', 0, 0, 0, '6', 0, 0, 0, '3', + '4', 0, 0, '8', 0, '3', 0, 0, '1', + '7', 0, 0, 0, '2', 0, 0, 0, '6', + 0, '6', 0, 0, 0, 0, '2', '8', 0, + 0, 0, 0, '4', '1', '9', 0, 0, '5', + 0, 0, 0, 0, '8', 0, 0, '7', '9' + }; +#endif + +#define SYMBOLS "123456789" + +#define SAFEDELETEARRAY(ptr) if(ptr != NULL) { delete [] ptr; ptr = NULL; } + +#ifdef _DEBUG_ + #ifdef HAVE_DBOX_HARDWARE + #include + #else + #include + using namespace std; + #endif + +// ---------------------------------------------------------------------------- +// _ShowSudoku +// ---------------------------------------------------------------------------- +void _ShowSudoku(CSudoku &rSudoku, bool bFixed) +{ + int bc, br, fr, fc; + tSymbol *pSymbol; + for(br=0; brcSolution; + } + else + { + if(pSymbol->cSymbol > 0) + cout << pSymbol->cSymbol; + else + cout << " "; + } + cout << " "; + } + cout << " | "; + } + cout << endl; + } + cout << "------------------------" << endl; + } + cout << endl; +} +#endif + +// ---------------------------------------------------------------------------- +// CSudoku +// ---------------------------------------------------------------------------- +CSudoku::CSudoku() + : m_Board(NULL) + , m_TempBoard(NULL) + , m_pszSymbols(NULL) + , m_nBlockColumns(3) + , m_nBlockRows(3) + , m_nFieldColumns(3) + , m_nFieldRows(3) + , m_pnBlockLookup(NULL) + , m_pnFieldRowLookup(NULL) + , m_pnBlockColIndexLookup(NULL) + , m_pnBlockRowIndexLookup(NULL) + , m_pnFieldColIndexLookup(NULL) + , m_pnFieldRowIndexLookup(NULL) + , m_nCount1(0) + , m_nCount2(0) +{ + SetSymbols(SYMBOLS); + Init(); +} + +// ---------------------------------------------------------------------------- +// ~CSudoku +// ---------------------------------------------------------------------------- +CSudoku::~CSudoku() +{ + Shutdown(); +} + +// ---------------------------------------------------------------------------- +// Init +// ---------------------------------------------------------------------------- +void CSudoku::Init() +{ + int nBlockIdx, nBlockRow, nBlockCol, nFieldIdx, nFieldRow, nFieldCol, nIndex; + + // some precalculations + m_nBlockSize = m_nFieldColumns * m_nFieldRows; + m_nFieldsCount = m_nBlockSize * m_nBlockColumns * m_nBlockRows; + m_nBlockRowsSize = m_nBlockSize * m_nBlockColumns; + + Shutdown(true); + + m_pnBlockLookup = new int*[m_nBlockRows]; + m_pnFieldRowLookup = new int[m_nFieldRows]; + + for(nBlockRow=0; nBlockRowbFixed; +} + +// ---------------------------------------------------------------------------- +// CheckBlock +// ---------------------------------------------------------------------------- +int CSudoku::CheckBlock(int nBlockCol, int nBlockRow, char cSymbol) +{ + int fr, fc; + tSymbol *pSymbol; + for(fr=0; frbFixed) + { + if(pSymbol->cSolution == cSymbol) + return 1; + } + else + { + if(pSymbol->cSymbol == cSymbol) + return 1; + } + } + } + return 0; +} + +// ---------------------------------------------------------------------------- +// CheckCol +// ---------------------------------------------------------------------------- +int CSudoku::CheckCol(int nBlockRow, int nFieldRow, char cSymbol) +{ + int nBlockCol, nFieldCol; + tSymbol *pSymbol; + for(nBlockCol=0; nBlockColbFixed) + { + if(pSymbol->cSolution == cSymbol) + return 1; + } + else + { + if(pSymbol->cSymbol == cSymbol) + return 1; + } + } + } + return 0; +} + +// ---------------------------------------------------------------------------- +// CheckRow +// ---------------------------------------------------------------------------- +int CSudoku::CheckRow(int nBlockCol, int nFieldCol, char cSymbol) +{ + int nBlockRow, nFieldRow; + tSymbol *pSymbol; + for(nBlockRow=0; nBlockRowbFixed) + { + if(pSymbol->cSolution == cSymbol) + return 1; + } + else + { + if(pSymbol->cSymbol == cSymbol) + return 1; + } + } + } + return 0; +} + +// ---------------------------------------------------------------------------- +// CheckBlockAll +// ---------------------------------------------------------------------------- +int CSudoku::CheckBlockAll(int nBlockCol, int nBlockRow) +{ + int nFound; + size_t nSymbol; + for(nSymbol=0; nSymbolcSymbol == 0) + { + nCheck |= CHECK_INCOMPLETE; + break; + } + } + + for(i=0; icSymbol != 0 && GetSymbol(i)->cSymbol != GetSymbol(i)->cSolution) + { + nCheck |= CHECK_ERRONEOUS; + break; + } + } + + return nCheck; +} + +// ---------------------------------------------------------------------------- +// Solve +// ---------------------------------------------------------------------------- +int CSudoku::Solve(bool bCountSolutions) +{ + m_nSolutionsCount = 0; + + if(bCountSolutions) + { + memcpy(m_TempBoard, m_Board, m_nFieldsCount*sizeof(tSymbol)); + } + + int nRet = Solve(0, bCountSolutions); +#ifdef _DEBUG_ +//cout << "moep..." << endl; +cout << m_nCount1 << ", " << m_nCount2 << endl; +#endif + + if(bCountSolutions) + { + memcpy(m_Board, m_TempBoard, m_nFieldsCount*sizeof(tSymbol)); + } + + if(bCountSolutions) + return m_nSolutionsCount; + else + return nRet; +} + +// ---------------------------------------------------------------------------- +// GetSolutionsCount +// ---------------------------------------------------------------------------- +int CSudoku::GetSolutionsCount() +{ + return m_nSolutionsCount; +} + +// ---------------------------------------------------------------------------- +// Solve +// ---------------------------------------------------------------------------- +int CSudoku::Solve(int nIndex, bool bCountSolutions) +{ + if(nIndex >= m_nFieldsCount) + return 1; +#ifdef _DEBUG_ +// cout << nIndex << ", " << cc++ << " \r"; +#endif + + if(bCountSolutions && m_nSolutionsCount > 1) + return 0; + + m_nCount1++; + m_nCount2++; + if(m_nCount1 > MAX_SOLVE_CALLS) + return 0; + + // array index to coords +// int nBlockIdx, nBlockRow, nBlockCol, nFieldIdx, nFieldRow, nFieldCol; + + // find next unsolved field + tSymbol *pSymbol; + while(1) + { +// nBlockIdx = nIndex / m_nBlockSize; +// nBlockRow = nBlockIdx % m_nBlockColumns; +// nBlockCol = nBlockIdx / 3; +// nFieldIdx = nIndex - (nBlockIdx * m_nBlockSize); +// nFieldRow = nFieldIdx % m_nFieldColumns; +// nFieldCol = nFieldIdx / m_nFieldColumns; + +// pSymbol = GetSymbol(nBlockCol, nBlockRow, nFieldCol, nFieldRow); +// pSymbol = GetSymbol(m_pnBlockColIndexLookup[nIndex], m_pnBlockRowIndexLookup[nIndex], m_pnFieldColIndexLookup[nIndex], m_pnFieldRowIndexLookup[nIndex]); + pSymbol = GetSymbol(nIndex); + + if(pSymbol->cSolution != 0) + { + if(++nIndex >= m_nFieldsCount) + { +#ifdef _DEBUG_ + cout << "++nIndex >= m_nFieldsCount" << endl; +#endif + return 1; + } + } + else + { + break; + } + } + + int nSolutions = 0; + // try each symbol + size_t i; + for(i=0; icSolution = m_pszSymbols[i]; + pSymbol->bFixed = true; + + // check if the sudoku can be solved (recursive) + if(Solve(nIndex+1, bCountSolutions) == 1) + { + nSolutions++; + if(!bCountSolutions) + return 1; + } + + if(bCountSolutions && (m_nSolutionsCount > 1 || nSolutions > 1)) + return 0; + // didn't solve, so try the next symbol + } + } + + m_nSolutionsCount += nSolutions; + // none of the symbols were possible in this field so reset this symbol... + // ...and return to the calling function and try the next symbol there + pSymbol->cSolution = 0; + pSymbol->bFixed = false; + return 0; +} + +// ---------------------------------------------------------------------------- +// Create +// ---------------------------------------------------------------------------- +void CSudoku::Create(int nLevel) +{ +#ifdef _TEST_ + tSymbol *pSymbol; + int br, bc, fr, fc, i = 0; + for(br=0; brcSymbol = testsudoku[i]; + pSymbol->cSolution = testsudoku[i]; + pSymbol->bFixed = (testsudoku[i] != 0); + i++; + } +#else + memset(m_Board, 0, m_nFieldsCount*sizeof(tSymbol)); + for(int i=0; ibFixed = true; + + m_nCount2 = 0; + Create(); +////// // put in the last field since the create algo leaves it empty + // solve the unsolved rest ;) + Solve(false); + + for(int i=0; ibFixed = false; + + tSymbol *pSymbol; + int br, bc, nRandFieldRow, nRandFieldCol; + for(br=0; br 0) + { + do + { + nRandFieldCol = Rand() % m_nFieldColumns; + nRandFieldRow = Rand() % m_nFieldRows; + pSymbol = GetSymbol(bc, br, nRandFieldCol, nRandFieldRow); + } + while(pSymbol->cSymbol != 0); + + pSymbol->cSymbol = pSymbol->cSolution; +// pSymbol->bFixed = false; + pSymbol->bFixed = true; + nFields--; + } + } + } +#endif +} + +// ---------------------------------------------------------------------------- +// Create +// ---------------------------------------------------------------------------- +int CSudoku::Create() +{ + // find an empty field + int nBlockRow, nBlockCol, nFieldRow, nFieldCol; + tSymbol *pSymbol; + do + { + nBlockRow = Rand() % m_nBlockRows; + nBlockCol = Rand() % m_nBlockColumns; + nFieldRow = Rand() % m_nFieldRows; + nFieldCol = Rand() % m_nFieldColumns; + + pSymbol = GetSymbol(nBlockCol, nBlockRow, nFieldCol, nFieldRow); + } + while(pSymbol->cSolution != 0); + + // loop through symbols + size_t i; + for(i=0; icSolution = m_pszSymbols[i]; + + // count possible solutions (recursive) + int nSolutions = Solve(true); +#ifdef _DEBUG_ +_ShowSudoku(*this, true); +cout << endl << nSolutions << endl << endl; +#endif + m_nCount1 = 0; + + if(nSolutions > 1) + { + CallbackCreate(m_nCount2); + return Create(); + } + else if(nSolutions == 1) + return 1; + } + } + + pSymbol->cSolution = 0; + return 0; +} + +// ---------------------------------------------------------------------------- +// LoadGame +// ---------------------------------------------------------------------------- +int CSudoku::LoadGame(const char *pszFile) +{ + std::ifstream F; + F.open(pszFile, std::ios_base::in | std::ios_base::binary); + if(!F.good()) + return -1; + + // delete board and symbols + Shutdown(); + + // read savegame file version + int nVersion; + F.read((char *) &nVersion, sizeof(nVersion)); + + // read symbols + F.read((char *) &m_nSymbolsCount, sizeof(m_nSymbolsCount)); + m_pszSymbols = new char[m_nSymbolsCount+1]; + memset(m_pszSymbols, '\0', m_nSymbolsCount+1); + F.read(m_pszSymbols, m_nSymbolsCount); + + // read board + F.read((char *) &m_nBlockColumns, sizeof(m_nBlockColumns)); + F.read((char *) &m_nBlockRows, sizeof(m_nBlockRows)); + F.read((char *) &m_nFieldColumns, sizeof(m_nFieldColumns)); + F.read((char *) &m_nFieldRows, sizeof(m_nFieldRows)); + + Init(); + F.read((char *) m_Board, m_nFieldsCount*sizeof(tSymbol)); + + F.close(); + return 1; +} + +// ---------------------------------------------------------------------------- +// SaveGame +// ---------------------------------------------------------------------------- +int CSudoku::SaveGame(const char *pszFile) +{ + std::ofstream F; + F.open(pszFile, std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); + if(!F.good()) + return -1; + + // write savegame file version + int nVersion = GAMEFILE_VERSION; + F.write((const char *) &nVersion, sizeof(nVersion)); + + // write symbols + F.write((const char *) &m_nSymbolsCount, sizeof(m_nSymbolsCount)); + F.write(m_pszSymbols, m_nSymbolsCount); + + // write board + F.write((const char *) &m_nBlockColumns, sizeof(m_nBlockColumns)); + F.write((const char *) &m_nBlockRows, sizeof(m_nBlockRows)); + F.write((const char *) &m_nFieldColumns, sizeof(m_nFieldColumns)); + F.write((const char *) &m_nFieldRows, sizeof(m_nFieldRows)); + + F.write((const char *) m_Board, m_nFieldsCount*sizeof(tSymbol)); + + F.close(); + return 1; +} diff --git a/archive-sources/sudoku/sudoku.h b/archive-sources/sudoku/sudoku.h new file mode 100644 index 0000000..dcb336a --- /dev/null +++ b/archive-sources/sudoku/sudoku.h @@ -0,0 +1,109 @@ +/* + Sudoku + Copyright (C) 2006-2009 Martin Schlosser + email: sudoku@software-schlosser.de + www: http://www.software-schlosser.de + + Sudoku 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 3 of the License, or + (at your option) any later version. + + Sudoku 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 Sudoku in a file named COPYING. + If not, see . +*/ + +#ifndef _SUDOKU_H +#define _SUDOKU_H + +#include + +#define GAMEFILE_VERSION 1 + +#define CHECK_OK 0 +#define CHECK_INCOMPLETE 1 +#define CHECK_ERRONEOUS 2 + +#define MAX_SOLVE_CALLS 10000 + +typedef struct +{ + char cSymbol; + char cSolution; + bool bFixed; +} tSymbol; + +class CSudoku +{ +public: + CSudoku(); + virtual ~CSudoku(); + +public: + void Init(); + void Shutdown(bool bKeepSymbols = false); + void SetSymbols(const char *pszSymbols); + tSymbol *GetSymbol(int nBlockCol, int nBlockRow, int nFieldCol, int nFieldRow); + tSymbol *GetSymbol(int nIndex); + bool IsSymbolFixed(int nBlockCol, int nBlockRow, int nFieldCol, int nFieldRow); + int CheckBlock(int nBlockCol, int nBlockRow, char cSymbol); + int CheckCol(int nBlockRow, int nFieldRow, char cSymbol); + int CheckRow(int nBlockCol, int nFieldCol, char cSymbol); + int CheckBlockAll(int nBlockCol, int nBlockRow); + int CheckColAll(int nBlockRow, int nFieldRow); + int CheckRowAll(int nBlockCol, int nFieldCol); + int CheckBoard(void); + + int GetSolutionsCount(); + int Solve(bool bCountSolutions = false); + void Create(int nLevel); + + int LoadGame(const char *pszFile); + int SaveGame(const char *pszFile); + +private: + int Create(); + int Solve(int nIndex, bool bCountSolutions = false); + +protected: // overridables + virtual void CallbackCreate(unsigned long nValue) {}; + +private: + tSymbol *m_Board; + tSymbol *m_TempBoard; + char *m_pszSymbols; + + int m_nSolutionsCount; + +public: // board settings + int m_nBlockColumns; + int m_nBlockRows; + int m_nFieldColumns; + int m_nFieldRows; + +private: // pre calculated numbers (optimizations) + size_t m_nSymbolsCount; + int m_nFieldsCount; + int m_nBlockSize; + int m_nBlockRowsSize; + + int **m_pnBlockLookup; + int *m_pnFieldRowLookup; + + int *m_pnBlockColIndexLookup; + int *m_pnBlockRowIndexLookup; + int *m_pnFieldColIndexLookup; + int *m_pnFieldRowIndexLookup; + +private: // function call counters + unsigned long m_nCount1; + unsigned long m_nCount2; +}; + +#endif // _SUDOKU_H diff --git a/archive-sources/tank/board.c b/archive-sources/tank/board.c new file mode 100644 index 0000000..eaccfed --- /dev/null +++ b/archive-sources/tank/board.c @@ -0,0 +1,532 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include + +#include "draw.h" +#include +#include "rcinput.h" +#include "colors.h" +#include "pics.h" + +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 500 +#define LOGO_Y 30 +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; + +extern unsigned short actcode; +extern unsigned short realcode; +#ifdef USEX +static unsigned long oran=0; +#endif + +static int houses_x[10]; + +static int player=0; +static int cfly=120; +static int last_x=120; +static int use_comp=1; + +static char player2[] = "Player 2"; +static char compi[] = "coolie"; +static char *p2name=compi; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + +#ifdef USEX + oran=tv.tv_usec; + tv.tv_sec = 0; + tv.tv_usec &= 0x0fff; + select( 0, 0, 0, 0, &tv ); + return oran % idx; +#endif + + return tv.tv_usec % idx; +} + +static int cang[]= { 45, 45 }; +static int can_x=0; +static int can_y=0; + +static int can_x_tab[] = { 12, 12, 12, 12, // 39, 41 + 11, 11, 11, 11, // 43, 45 + 10, 10, 10, 10, // 47, 49 + 10, 10, 9, 9, // 51, 53 + 9, 9, 8, 8 }; // 55, 57 +static int can_y_tab[] = { 485, 485, 485, 485, // 39, 41 + 485, 485, 484, 484, // 43, 45 + 484, 484, 483, 483, // 47, 49 + 483, 483, 483, 483, // 51, 53 + 482, 482, 482, 482 }; // 55, 57 + +static void DrawCanon( int visible ) +{ + can_x=can_x_tab[ cang[player] - 39 ]; + can_y=can_y_tab[ cang[player] - 39 ]; + + if ( player ) + { + can_x = 672 - can_x; + FBDrawLine( 672, 496, can_x, can_y, visible?WHITE:AIR); + FBDrawLine( 672, 496+1, can_x, can_y+1, visible?WHITE:AIR); + FBDrawLine( 672-1, 496, can_x-1, can_y, visible?WHITE:AIR); + FBDrawLine( 672-1, 496+1, can_x-1, can_y+1, visible?WHITE:AIR); + } + else + { + can_x += 48; + FBDrawLine( 48, 496, can_x, can_y, visible?WHITE:AIR); + FBDrawLine( 48, 496+1, can_x, can_y+1, visible?WHITE:AIR); + FBDrawLine( 48+1, 496, can_x+1, can_y, visible?WHITE:AIR); + FBDrawLine( 48+1, 496+1, can_x+1, can_y+1, visible?WHITE:AIR); + } +} + +static void GeneratePlayer( int pnum ) +{ + int x; + int i; + int k; + int p; + + for (i=0; i<5; i++ ) + { + while(1) + { + x=myrand(180)+80; + if ( pnum ) + x+=360; + else + x=360-x; + + x-=8; + houses_x[pnum*5+i] = x; + for(k=0; k p + 16 ) + continue; + if ( x < p - 16 ) + continue; + break; + } + if ( k==i ) + break; + } + FBCopyImage( x, 496, 16, 16, house_pic ); + } +} + +void TankInitialize( void ) +{ + int y; + + FBFillRect( 0, 0, 720,576, AIR ); + +/* earth */ + FBFillRect( 0, 512, 720, 64, BROWN ); + + player=0; + cfly=120; + GeneratePlayer( 0 ); + GeneratePlayer( 1 ); + + cang[0]=45; + cang[1]=45; + +/* label */ + FBDrawString( 500, 64, 64, "Player 1", WHITE, 0 ); + FBDrawString( 500, 128, 64, p2name, SAIR, 0 ); + +/* middle */ + FBFillRect( 300, 500, 120, 12, BROWN ); + FBFillRect( 330, 400, 60, 100, BROWN ); + FBFillRect( 340, 370, 40, 30, BROWN ); + FBFillRect( 340, 0, 40, 230, BROWN ); + +/* tank */ + FBFillRect( 32, 496, 24, 16, GREEN ); + FBFillRect( 664, 496, 24, 16, GREEN ); + + FBFillRect( 0, 480, 32, 32, BROWN ); + FBFillRect( 688, 480, 32, 32, BROWN ); + + for( y=0; y<7; y++ ) + { + FBFillRect( 32, 498+y*2, (y+1)*2, 2, BROWN ); + FBFillRect( 688-(y+1)*2, 498+y*2, (y+1)*2, 2, BROWN ); + } + +/* canon */ + DrawCanon(1); + + actcode=0xee; +} + +static void Flame( int x ) +{ + struct timeval tv; + int i; + int k; + unsigned char *flame[] = { flame1_pic, flame2_pic, flame3_pic }; + + for( i=0; i<10; i++ ) + { + k=myrand(3); + FBCopyImage( x, 496, 16, 16, flame[k] ); +#ifdef USEX + FBFlushGrafic(); +#endif + tv.tv_usec = myrand(100000)+50000; + tv.tv_sec=0; + select(0,0,0,0,&tv); + } + FBFillRect( x, 496, 16, 16, AIR ); +} + +static int Fly( float ang_x, float ang_y ) +{ + struct timeval tv; + int x=0; + int y=0; + int xo=0; + int yo=0; + int xo2=0; + int yo2=0; + int i; + float speedy=(ang_y+ang_x)/80; + float speedx=(ang_y+ang_x)/160; + unsigned char px; + int inair=0; + + for( i=1; !doexit; i++ ) + { + if ( ( can_x+x >= 720 ) || ( can_x+x<0 )) + break; + if ( xo2 && yo2 ) + { + FBFillRect( can_x+xo2, can_y-yo2, 2, 2, AIR ); +#ifdef USEX + FBFlushGrafic(); +#endif + } + if ( xo && yo ) + { + FBFillRect( can_x+xo, can_y-yo, 2, 2, WHITE ); +#ifdef USEX + FBFlushGrafic(); +#endif + xo2=xo; + yo2=yo; + } + if (( y < 480 ) && ( y > -32 )) + { + px=FBGetPixel( can_x+x, can_y-y ); + if ( !inair ) + { + if ( px == AIR ) + inair=1; + } + else + { + if (( px != AIR ) && ((x!=xo) || (y!=yo)) && + ((x!=xo+1) || (y!=yo+1)) && + ((x!=xo-1) || (y!=yo-1)) ) + { + FBFillRect( can_x+x, can_y-y, 2, 2, AIR ); +#ifdef USEX + FBFlushGrafic(); +#endif + break; + } + } + + if ( y > -32 ) + FBFillRect( can_x+x, can_y-y, 2, 2, RED ); +#ifdef USEX + FBFlushGrafic(); +#endif + xo=x; + yo=y; + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0, 0, 0, 0, &tv ); + } + else + { + xo=0; + yo=0; + } + if ( y <= -32 ) + break; + if ( player ) + x-=ang_x; + else + x+=ang_x; + y+=ang_y; + ang_y-=speedy; + ang_x-=speedx; + if ( ang_y < 0 ) + speedx*=1.04; + if ( ang_x < 0 ) + ang_x=0; + RcGetActCode( ); + } + if ( xo2 && yo2 ) + { + FBFillRect( can_x+xo2, can_y-yo2, 2, 2, AIR ); +#ifdef USEX + FBFlushGrafic(); +#endif + } + if ( xo && yo ) + { + FBFillRect( can_x+xo, can_y-yo, 2, 2, AIR ); +#ifdef USEX + FBFlushGrafic(); +#endif + } + last_x=x+can_x; + if ( y <= 0 ) + { + for( i=0; i<10; i++ ) + { + if ( !houses_x[i] ) + continue; + if ((houses_x[i] <= x+can_x ) && + (houses_x[i]+16 > x+can_x )) + { + Flame( houses_x[i] ); + houses_x[i]=0; + return 1; + } + } + } + return 0; +} + +static void RunToFly( int speed ) +{ + int o=0; + int y=0; + char won[64]; + + if ( speed < 18 ) + speed=18; + o = speed/4; + y = o*cang[player]/90; + if ( Fly( o-y , y ) ) + { + for( o=0; o<5; o++ ) + if ( houses_x[o] ) + break; + if ( o==5 ) + { + sprintf(won,"%s won the game",p2name); + FBDrawString( 200, 360, 64, won, RED, 0 ); + doexit=4; + } + else + { + for( o=5; o<10; o++ ) + if ( houses_x[o] ) + break; + if ( o==10 ) + { + FBDrawString( 200, 360, 64, "Player 1 won the game", RED, 0 ); + doexit=4; + } + } + } + + while( realcode != 0xee ) + RcGetActCode( ); + actcode=0xee; +} + +static void Bomb( void ) +{ + struct timeval tv; + int speed=0; + + while( realcode != 0xee ) + RcGetActCode( ); + actcode=0xee; + + FBFillRect( 300, 515, 121, 19, BLACK ); + FBDrawRect( 299, 514, 122, 20, WHITE ); + FBDrawRect( 298, 513, 124, 22, WHITE ); + +/* 25 % */ + FBDrawVLine( 301+118-30, 515, 4, WHITE ); + FBDrawVLine( 301+118-29, 515, 4, WHITE ); + FBDrawVLine( 301+118-30, 529, 4, WHITE ); + FBDrawVLine( 301+118-29, 529, 4, WHITE ); + +/* 50 % */ + FBDrawVLine( 301+118-60, 515, 4, WHITE ); + FBDrawVLine( 301+118-59, 515, 4, WHITE ); + FBDrawVLine( 301+118-60, 529, 4, WHITE ); + FBDrawVLine( 301+118-59, 529, 4, WHITE ); + +/* 75 % */ + FBDrawVLine( 301+118-90, 515, 4, WHITE ); + FBDrawVLine( 301+118-89, 515, 4, WHITE ); + FBDrawVLine( 301+118-90, 529, 4, WHITE ); + FBDrawVLine( 301+118-89, 529, 4, WHITE ); + + actcode=0xee; + while( speed < 118 && (actcode != RC_OK) && !doexit ) + { + FBDrawVLine( 301+118-speed, 516, 16, GREEN ); + FBDrawVLine( 301+117-speed, 516, 16, GREEN ); + + if ( speed == 30 ) + { +/* 25 % */ + FBDrawVLine( 301+118-30, 516, 3, BLACK ); + FBDrawVLine( 301+118-29, 516, 3, BLACK ); + FBDrawVLine( 301+118-30, 529, 3, BLACK ); + FBDrawVLine( 301+118-29, 529, 3, BLACK ); + } + if ( speed == 60 ) + { +/* 50 % */ + FBDrawVLine( 301+118-60, 516, 3, BLACK ); + FBDrawVLine( 301+118-59, 516, 3, BLACK ); + FBDrawVLine( 301+118-60, 529, 3, BLACK ); + FBDrawVLine( 301+118-59, 529, 3, BLACK ); + } + if ( speed == 90 ) + { +/* 50 % */ + FBDrawVLine( 301+118-90, 516, 3, BLACK ); + FBDrawVLine( 301+118-89, 516, 3, BLACK ); + FBDrawVLine( 301+118-90, 529, 3, BLACK ); + FBDrawVLine( 301+118-89, 529, 3, BLACK ); + } + +#ifdef USEX + FBFlushGrafic(); +#endif + actcode=0xee; + RcGetActCode( ); + + if ( actcode == 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0, 0, 0, 0, &tv ); + speed+=2; + } + } + RunToFly( speed ); +} + +void Play( void ) +{ + int i; + + if ( use_comp ) + { + if ( !player && (actcode == 0xee )) + return; + } + else + { + if ( actcode == 0xee ) + return; + } + switch( actcode ) + { + case RC_RED : + FBDrawString( 500, 128, 64, p2name, AIR, 0 ); + if ( use_comp ) + { + use_comp=0; + p2name=player2; + } + else + { + use_comp=1; + p2name=compi; + } + FBDrawString( 500, 128, 64, p2name, player ? WHITE: SAIR, 0 ); + break; + case RC_UP : + if ( cang[player] < 55 ) + { + DrawCanon(0); + cang[player]+=2; + DrawCanon(1); + } + break; + case RC_DOWN : + if ( cang[player] > 40 ) + { + DrawCanon(0); + cang[player]-=2; + DrawCanon(1); + } + break; + case RC_OK : + case 0xee : + if ( use_comp && player ) // computer + { + RunToFly( cfly ); + if ( last_x < 340 ) + { + for( i=0; i<5; i++ ) + if (houses_x[i] > last_x ) + break; + } + else + i=0; + cfly -= 4; + if (( cfly < 65 ) || ( i==5 )) + { + cfly=120; + DrawCanon(0); + if ( cang[player] > 40 ) + cang[player]-=2; + else + cang[player] = 55; + DrawCanon(1); + } + } + else + { + Bomb(); + } + if ( !doexit ) + { + DrawCanon(0); + FBDrawString( 500, player?128:64, 64, + player ? p2name : "Player 1", SAIR, 0 ); + player=!player; + DrawCanon(1); + FBDrawString( 500, player?128:64, 64, + player ? p2name : "Player 1", WHITE, 0 ); + } + break; + } + return; +} diff --git a/archive-sources/tank/board.h b/archive-sources/tank/board.h new file mode 100644 index 0000000..06c6691 --- /dev/null +++ b/archive-sources/tank/board.h @@ -0,0 +1,7 @@ +#ifndef TANK_H +#define TANK_H + +extern void TankInitialize( void ); +extern void Play( void ); + +#endif diff --git a/archive-sources/tank/colors.h b/archive-sources/tank/colors.h new file mode 100644 index 0000000..bb90059 --- /dev/null +++ b/archive-sources/tank/colors.h @@ -0,0 +1,15 @@ + +#define YELLOW 4 +#define GREEN 5 +#define BLUE 7 +#define STEELBLUE 6 +#define GRAY 8 +#define DARK 9 +#define MAGENTA 10 +#define CYAN 11 +#define BROWN 12 +#define AIR 13 +#define DACH 14 +#define ORANGE 15 +#define SAIR 16 + diff --git a/archive-sources/tank/pics.h b/archive-sources/tank/pics.h new file mode 100644 index 0000000..59f5251 --- /dev/null +++ b/archive-sources/tank/pics.h @@ -0,0 +1,92 @@ +#ifndef PICS_H +#define PICS_H + +#define _ AIR +#define D DACH +#define W WHITE +#define B BLACK +#define R RED +#define O ORANGE +#define Y YELLOW + +static unsigned char house_pic[] = { +_,_,_,_,_,_,_,D,D,_,_,_,_,_,_,_, +_,_,_,_,_,_,D,D,D,D,_,B,B,_,_,_, +_,_,_,_,_,D,D,D,D,D,D,B,B,_,_,_, +_,_,_,_,D,D,D,D,D,D,D,B,B,_,_,_, +_,_,_,D,D,D,D,D,D,D,D,D,B,_,_,_, +_,_,D,D,D,D,D,D,D,D,D,D,D,D,_,_, +_,D,D,D,D,D,D,D,D,D,D,D,D,D,D,_, +_,W,W,W,W,W,W,W,W,W,W,W,W,W,W,_, +_,W,B,B,B,W,W,W,W,W,W,B,B,B,W,_, +_,W,B,B,B,W,W,W,W,W,W,B,B,B,W,_, +_,W,B,B,B,W,W,B,B,B,W,B,B,B,W,_, +_,W,W,W,W,W,W,B,B,B,W,W,W,W,W,_, +_,W,W,W,W,W,W,B,B,B,W,W,W,W,W,_, +_,W,W,W,W,W,W,B,B,B,W,W,W,W,W,_, +_,W,W,W,W,W,W,B,B,B,W,W,W,W,W,_, +_,W,W,W,W,W,W,B,B,B,W,W,W,W,W,_ }; + +static unsigned char flame1_pic[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,Y,R,R,Y,_,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,Y,O,Y,_,_,_,_, +_,_,_,_,_,_,Y,Y,Y,O,O,Y,_,_,_,_, +_,_,_,O,O,Y,Y,R,Y,O,Y,Y,Y,_,_,_, +_,_,O,O,Y,Y,Y,R,R,Y,Y,Y,R,Y,_,_, +_,O,Y,Y,Y,R,Y,R,R,Y,R,R,R,Y,Y,_, +_,Y,Y,Y,O,R,R,R,Y,Y,R,R,Y,Y,Y,_, +_,R,Y,Y,O,O,Y,Y,Y,Y,Y,R,R,Y,Y,_, +_,R,Y,O,O,Y,Y,Y,Y,Y,Y,O,R,R,Y,_, +_,_,R,Y,Y,R,Y,Y,R,R,R,O,Y,_,_,_, +_,_,_,Y,Y,Y,R,R,R,Y,Y,Y,Y,O,_,_, +_,_,_,Y,Y,Y,R,R,Y,Y,Y,O,O,O,_,_, +_,_,_,Y,Y,Y,R,R,O,Y,Y,Y,O,_,_,_, +_,_,_,_,R,Y,Y,Y,Y,Y,Y,R,Y,_,_,_, +_,_,_,_,R,R,Y,Y,Y,Y,R,R,_,_,_,_ }; + +static unsigned char flame2_pic[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,R,Y,Y,Y,_,_,_,_,_, +_,_,_,_,Y,Y,R,R,O,Y,Y,Y,_,_,_,_, +_,_,_,_,Y,Y,Y,Y,O,Y,R,Y,_,_,_,_, +_,_,_,Y,Y,Y,O,Y,O,Y,R,R,R,_,_,_, +_,Y,Y,R,R,R,Y,Y,Y,Y,Y,Y,R,Y,_,_, +_,Y,R,R,Y,Y,Y,Y,R,Y,Y,Y,Y,Y,Y,_, +_,Y,R,Y,Y,Y,Y,R,R,R,O,Y,Y,Y,O,_, +_,Y,Y,Y,O,Y,Y,Y,Y,R,Y,Y,Y,O,O,_, +_,Y,Y,Y,O,O,R,Y,Y,Y,Y,Y,O,O,O,_, +_,_,Y,Y,O,O,R,R,Y,Y,Y,Y,O,_,_,_, +_,_,_,Y,Y,Y,Y,R,R,R,Y,O,O,Y,_,_, +_,_,_,Y,Y,Y,O,Y,R,R,Y,Y,Y,Y,_,_, +_,_,_,Y,R,Y,Y,O,O,Y,Y,Y,Y,_,_,_, +_,_,_,_,R,R,R,Y,Y,Y,Y,R,R,_,_,_, +_,_,_,_,Y,Y,R,R,Y,Y,Y,R,_,_,_,_ }; + +static unsigned char flame3_pic[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,O,O,O,O,_,_,_,_,_,_, +_,_,_,_,Y,O,O,Y,Y,O,O,_,_,_,_,_, +_,_,_,Y,Y,Y,Y,R,R,Y,Y,Y,_,_,_,_, +_,_,Y,Y,Y,Y,Y,Y,R,R,R,Y,Y,_,_,_, +_,Y,Y,R,R,R,Y,Y,Y,R,R,R,Y,Y,_,_, +_,Y,R,R,Y,Y,Y,Y,Y,Y,R,R,Y,Y,_,_, +_,Y,Y,Y,Y,Y,R,Y,Y,O,O,Y,O,O,_,_, +_,Y,Y,Y,Y,Y,R,R,R,Y,O,O,Y,O,Y,_, +_,_,Y,Y,Y,O,Y,R,R,Y,Y,O,Y,Y,_,_, +_,_,Y,O,R,O,O,Y,Y,Y,Y,R,Y,Y,_,_, +_,_,Y,O,R,R,O,Y,R,Y,Y,R,R,Y,_,_, +_,_,Y,O,O,R,R,Y,O,Y,R,R,R,Y,_,_, +_,_,Y,Y,O,O,Y,Y,Y,Y,R,R,Y,Y,_,_, +_,_,_,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,_,_,_ }; + +#undef _ +#undef D +#undef W +#undef B +#undef R +#undef O +#undef Y + +#endif diff --git a/archive-sources/tank/somain.c b/archive-sources/tank/somain.c new file mode 100644 index 0000000..5bad2f5 --- /dev/null +++ b/archive-sources/tank/somain.c @@ -0,0 +1,115 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "board.h" +#include "colors.h" +#include "pig.h" +#include "fx2math.h" + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 30 ); + FBSetColor( GREEN, 30, 255, 30 ); + FBSetColor( STEELBLUE, 20, 20, 180 ); + FBSetColor( BLUE, 130, 130, 255 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 30, 30, 30 ); + FBSetColor( MAGENTA, 220, 30, 220 ); + FBSetColor( CYAN, 30, 220, 220 ); + FBSetColor( BROWN, 139, 69, 19 ); + FBSetColor( AIR, 30, 30, 180 ); + FBSetColor( DACH, 0xb2, 17, 17 ); + FBSetColor( ORANGE, 255, 180, 10 ); + FBSetColor( SAIR, 40, 40, 240 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int fdfb = -1, fdrc = -1; + + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + while( doexit != 3 ) + { + TankInitialize(); + +#ifdef USEX + FBFlushGrafic(); +#endif + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 200000; + select( 0, 0, 0, 0, &tv ); + + actcode=0xee; + RcGetActCode( ); + Play(); +#ifdef USEX + FBFlushGrafic(); +#endif + while( realcode != 0xee ) + RcGetActCode( ); + } + if ( doexit == 4 ) // level changed + { + doexit=0; + actcode=0xee; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 200000; + select( 0, 0, 0, 0, &tv ); + + RcGetActCode( ); + } + while( realcode != 0xee ) + RcGetActCode( ); + actcode=0xee; + } + } + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + diff --git a/archive-sources/tank/tank.cfg b/archive-sources/tank/tank.cfg new file mode 100644 index 0000000..972dde3 --- /dev/null +++ b/archive-sources/tank/tank.cfg @@ -0,0 +1,7 @@ +name=TankWars +desc=stay cool +depend=libfx2.so +type=1 +needfb=1 +needrc=1 +needlcd=0 diff --git a/archive-sources/tetris/board.c b/archive-sources/tetris/board.c new file mode 100644 index 0000000..7fb7a36 --- /dev/null +++ b/archive-sources/tetris/board.c @@ -0,0 +1,509 @@ +/* +** initial coding by fx2 +*/ + + +#include + +#include "draw.h" +#include +#include "rcinput.h" +#include "colors.h" +#include "pics.h" + +#if 0 +#define STATUS_X 5 +#define STATUS_Y 5 +#define LOGO_X 650 +#define LOGO_Y 0 +#else +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 500 +#define LOGO_Y 30 +#endif + +extern double sqrt( double in ); + +extern int doexit; + +extern unsigned short realcode; +extern unsigned short actcode; + + long score = 0; +static int level = 1; +static int puz_x = 5; +static int puz_y = 0; +static int actpuz = 0; +static int nextpuz = 1; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + + return tv.tv_usec % idx; +} + +static unsigned char puz_0[] = " X XXX "; +static unsigned char puz_1[] = " X XXX "; +static unsigned char puz_2[] = " X XXX "; +static unsigned char puz_3[] = " XX XX "; +static unsigned char puz_4[] = " XX XX "; +static unsigned char puz_5[] = " XXXX "; +static unsigned char puz_6[] = " XX XX "; + +/* magenta, blue, cyan, green, red, yellow, orange */ +static unsigned char *puz[] = { puz_0, puz_1, puz_2, puz_3, puz_4, puz_5, puz_6 }; +static unsigned char puzc[] = { 30, 80, 50, 60, 40, 70, 90 }; + +static void DrawScore( void ) +{ + char tscore[ 64 ]; + int x; + + sprintf(tscore,"%ld",score); + x=FBDrawString( LOGO_X-5, 340, 64, tscore, WHITE, BLACK ); + FBFillRect( LOGO_X+x-5, 340, 20, 64, BLACK ); +} + +static void DrawNextPuz( void ) +{ + int x; + int y; + unsigned char *p = puz[nextpuz]; + + for( y=0; y<4; y++ ) + { + for( x=0; x<4; x++, p++ ) + { + switch( *p ) + { + case 'X' : + FBCopyImageCol( (x+16)*32,(y+5)*32,32,32,puzc[nextpuz],puzdata); + break; + default : + FBFillRect( (x+16)*32,(y+5)*32,32,32,BLACK); + break; + } + } + } +} + +void DrawBoard( void ) +{ + int x; + int y; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++, p++ ) + { + switch ( *p ) + { + case '#' : + FBCopyImage( x*32, y*32, 32, 32, wall ); + break; + case ' ' : + FBFillRect( x*32, y*32, 32, 32, BLACK ); + break; + default : + FBFillRect( x*32, y*32, 32, 32, RED ); + break; + } + } + } + FBDrawFx2Logo(LOGO_X,LOGO_Y); + FBDrawString(LOGO_X-5,280,64,"Score",WHITE,0); + DrawNextPuz(); +} + +static void DrawPuz( void ) +{ + int x; + int y; + unsigned char *p; + + for( y=0; y<5; y++ ) + { + if ( puz_y+y>16 ) + break; + p = maze + puz_x - 1 + (puz_y+y) * MAZEW; + for( x=-1; x<5; x++, p++ ) + { + if ( puz_x+x > 12 ) + break; + if ( *p == 'X' ) + FBCopyImageCol( (x+puz_x)*32, (y+puz_y)*32, 32, 32, + puzc[actpuz], puzdata ); + if ( *p == ' ' ) + FBFillRect( (x+puz_x)*32, (y+puz_y)*32, 32, 32, BLACK ); + } + } +} + +int PutPuzIntoBoard( void ) +{ + int x; + int y; + unsigned char *p = puz[actpuz]; + + for( y=0; y<4; y++ ) + { + for( x=0; x<4; x++, p++ ) + { + if ( *p == 'X' ) + { + if ( maze[ (x+puz_x) + (y+puz_y)*MAZEW ] != ' ' ) + return 0; + maze[ (x+puz_x) + (y+puz_y)*MAZEW ] = 'X'; + } + } + } + DrawPuz(); + DrawNextPuz(); + return 1; +} + +int NextItem( void ) +{ + unsigned char *p = maze; + int x; + int y; + + for( y=0; y0; y-- ) + for( x=3, s=maze+y*MAZEW+x, t=s+(lines*MAZEW); x<13; x++, s++, t++ ) + *t = *s; + + FBMove( 3*32, 2*32, 3*32, (2+lines)*32, 10*32, (ny-2)*32 ); +} + +void RemoveCompl( void ) +{ + int y; + int x; + unsigned char *s; + int li1=0; + int li2=0; + int lines = 0; + + for( y=15; y>1; y-- ) + { + for( x=3, s = maze + y*MAZEW + x; x < 13; x++, s++ ) + { + if ( *s == ' ' ) + break; + } + if ( x != 13 ) + { + if ( li1 ) + { + DelLines( li1, li2 ); + y=li1+1; + } + li1=0; + li2=0; + continue; + } + lines++; + if ( li1 ) + li2=y; + else + li1=y; + } + if ( li1 ) + DelLines( li1, li2 ); + + if ( lines ) + { + /* points for lines */ + score += ((level+1)*lines); + + level+=(lines-1); + } +} + +void BoardInitialize( void ) +{ + int x; + int y; + unsigned char *p = maze; + + for( y = 0; y < MAZEH; y++ ) + { + for( x = 0; x < MAZEW; x++, p++ ) + { + if ( *p != '#' ) + *p = ' '; + } + } + actcode=0xee; + score=0; + puz_x = 6; + puz_y = 0; + level = 1; +} + +void DrawGameOver( void ) +{ + FBDrawString( 190, 290, 64, "Game Over", RED, 0 ); +} diff --git a/archive-sources/tetris/board.h b/archive-sources/tetris/board.h new file mode 100644 index 0000000..3892d03 --- /dev/null +++ b/archive-sources/tetris/board.h @@ -0,0 +1,13 @@ +#ifndef MAZE_H +#define MAZE_H + +extern void DrawBoard( void ); +extern void BoardInitialize( void ); +extern void DrawGameOver( void ); +extern void MoveSide( void ); +extern int NextItem( void ); +extern int PutPuzIntoBoard( void ); +extern int FallDown( void ); +extern void RemoveCompl( void ); + +#endif diff --git a/archive-sources/tetris/colors.h b/archive-sources/tetris/colors.h new file mode 100644 index 0000000..9fe3dd8 --- /dev/null +++ b/archive-sources/tetris/colors.h @@ -0,0 +1,9 @@ + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define DARK 9 +#define RED1 10 +#define RED2 11 diff --git a/archive-sources/tetris/pics.h b/archive-sources/tetris/pics.h new file mode 100644 index 0000000..ed0d9c1 --- /dev/null +++ b/archive-sources/tetris/pics.h @@ -0,0 +1,107 @@ +#ifndef PICS_H +#define PICS_H + +#define MAZEW 22 +#define MAZEH 18 + +static unsigned char maze[] =\ +" "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" # # "\ +" ############ "\ +" "; + +#define _ BLACK +#define Y YELLOW +#define W WHITE +#define r RED1 +#define R RED2 + +static unsigned char wall[] = { +r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r, +r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r, +R,R,R,r,r,r,r,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R, +R,R,R,R,r,r,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R, +R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R, +R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r, +r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r, +R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R, +R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R, +R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R, +R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r, +r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,R,R,r,r,_,_,r,r,r,r, +R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R, +R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R, +R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R, +R,R,R,R,R,R,R,R,R,R,_,_,r,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r, +r,r,_,_,r,r,r,r,r,r,r,r,r,r,R,R,r,r,_,_,r,r,r,r,r,r,r,r,r,r,r,r, +R,R,_,_,r,r,R,R,R,R,R,r,r,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R, +R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R, +R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,r,R,R,R,R,R,R,R,R,R,R, +R,R,_,_,r,R,R,R,R,R,R,R,R,R,R,R,R,R,_,_,r,R,R,R,R,R,R,R,R,R,R,R, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ }; + +#undef _ +#undef Y +#undef W +#undef r +#undef R + +static unsigned char puzdata[] = { +0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,0,1,1,2, +0,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,1,4, +1,3,5,5,5,5,5,6,5,5,5,5,5,7,7,7,7,7,5,6,6,6,5,5,7,2,2,5,6,5,5,8, +1,3,5,5,5,5,5,5,5,5,5,5,5,7,5,5,7,5,5,5,6,6,5,5,2,7,6,6,5,5,6,8, +1,3,5,6,7,5,7,7,7,7,7,7,5,5,5,5,7,5,5,6,6,6,5,7,2,7,6,5,5,5,6,8, +1,3,2,5,7,7,7,5,7,7,7,5,6,6,5,5,7,7,5,5,5,5,7,7,2,5,6,7,7,5,6,8, +1,0,2,5,5,5,5,5,7,7,7,7,5,5,7,7,5,5,5,6,5,5,7,7,5,6,5,5,7,2,6,9, +1,3,7,5,5,7,7,5,7,7,5,5,5,7,7,7,7,5,6,5,6,5,2,2,5,6,5,7,2,1,6,9, +1,3,5,7,5,7,7,7,7,5,7,7,5,7,2,7,5,6,6,6,5,7,2,2,6,5,5,7,2,2,4,9, +1,3,5,7,7,7,5,5,5,5,5,5,5,5,7,2,6,6,6,5,7,2,2,5,6,5,5,2,2,7,4,9, +1,3,5,5,7,6,5,5,7,7,2,7,7,5,7,7,5,5,6,7,2,2,6,6,2,7,2,2,7,7,4,9, +1,3,5,2,7,6,5,5,7,7,2,2,5,7,7,5,7,5,5,7,2,2,6,7,2,2,2,7,5,6,4,9, +1,3,7,2,7,6,5,5,7,7,7,7,7,7,7,5,5,6,5,7,7,5,5,7,2,5,6,6,6,6,6,8, +1,0,7,2,7,6,6,5,7,7,2,7,5,5,7,5,5,5,5,7,7,6,5,7,5,6,6,6,5,5,6,9, +1,0,2,2,6,6,5,7,2,7,2,7,7,7,5,6,6,6,7,2,7,6,7,2,6,6,6,7,7,5,4,8, +1,3,2,2,6,6,5,5,7,2,2,7,5,6,5,6,6,6,7,7,5,6,7,2,6,6,5,5,5,5,6,9, +1,3,7,5,6,6,7,7,7,2,2,7,6,6,6,5,5,5,2,7,6,7,2,2,6,5,7,7,7,5,4,9, +1,3,7,5,5,5,7,7,7,7,7,5,6,6,6,6,5,5,2,7,5,7,2,5,5,5,5,5,5,7,6,9, +0,3,7,5,5,5,7,2,7,2,7,5,6,6,5,7,2,2,5,6,5,7,2,2,5,5,7,7,5,5,6,9, +0,3,5,5,7,5,7,7,7,7,7,6,6,6,5,7,2,7,6,5,7,2,2,5,5,5,7,5,7,7,4,9, +0,3,5,5,7,5,7,7,2,2,5,6,6,6,2,2,7,5,6,7,5,5,5,6,5,6,5,5,5,7,6,9, +0,3,5,7,7,7,5,7,7,2,6,6,6,5,7,2,7,5,5,5,7,5,5,5,5,5,5,5,7,7,6,8, +0,3,5,5,7,5,5,7,2,2,6,6,5,5,7,2,5,5,5,5,7,5,7,7,5,7,5,7,7,7,6,9, +0,3,5,7,7,7,5,7,7,2,6,6,5,5,7,7,5,7,5,7,5,5,5,5,5,7,7,7,7,5,4,9, +0,3,5,7,5,7,5,7,2,7,5,6,5,5,7,7,5,5,7,7,7,7,5,7,5,5,5,5,6,6,4,9, +0,3,7,5,7,7,7,2,7,7,5,6,5,7,7,7,5,5,7,7,5,5,5,5,5,7,5,5,5,5,4,9, +0,3,5,5,5,7,5,7,7,7,6,5,5,7,7,7,5,5,2,5,6,5,5,5,7,7,7,5,5,5,6,9, +1,3,5,5,5,5,7,2,2,5,5,6,5,5,5,5,5,7,7,7,6,5,5,5,5,5,5,7,5,7,4,8, +0,3,5,5,5,7,2,2,7,5,6,5,5,5,2,5,5,5,5,5,5,6,5,5,5,5,5,5,7,7,6,9, +0,3,5,7,5,7,2,2,7,5,6,5,5,5,7,2,5,7,5,5,5,7,5,7,7,5,7,7,7,5,6,8, +0,3,6,6,7,2,2,7,6,6,6,6,7,5,2,7,5,6,5,6,4,4,4,6,4,4,6,4,6,4,4,9, +1,7,9,9,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 }; + +#endif diff --git a/archive-sources/tetris/somain.c b/archive-sources/tetris/somain.c new file mode 100644 index 0000000..09a6cf5 --- /dev/null +++ b/archive-sources/tetris/somain.c @@ -0,0 +1,661 @@ +/* +** initial coding by fx2 +*/ + +// #ifdef HAVE_DREAMBOX_HARDWARE +// #undef HAVE_CURL +// #else +// #define HAVE_CURL +// #endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "board.h" +#include "colors.h" +#include "draw.h" +#include "fx2math.h" +#include "pig.h" +#include "rcinput.h" + +#ifdef HAVE_CURL +#include +#include +#if LIBCURL_VERSION_NUM < 0x071507 +#include +#endif +#endif + + +extern int debug; +extern int doexit; +extern unsigned short actcode; +extern unsigned short realcode; +extern long score; + + +#ifdef HAVE_CURL +static char *proxy_addr=0; +static char *proxy_user=0; +#endif +static char *hscore=0; +static char isalloc=0; +static int localuser=-1; + +#ifndef TRUE +#define TRUE (!0) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +typedef struct _HScore +{ + char name[12]; + long points; +} HScore; + +static HScore hsc[8]; +#ifdef HAVE_CURL +static HScore ihsc[8]; +static int use_ihsc=0; +#endif + +unsigned long BuildCheck( char *user, long score ) +{ + unsigned long ret = 22; + unsigned long temp = 55; + + while ( * user ) + { + ret = ret << 1 ^ 90 ^ ( * user++ + temp ); + temp += 2; + } + + return ret ^ score; +} + +#ifdef HAVE_CURL +static void LoadHScore( void ) +{ + CURL *curl; + CURLcode res; + FILE *fp; + char url[ 512 ]; + char *p; + int i; + + FBDrawString( 150,32,32,"try load high score from",GRAY,0); + FBDrawString( 150,64,32,hscore,GRAY,0); +#ifdef USEX + FBFlushGrafic(); +#endif + + sprintf(url,"%s/games/tetris.php?action=get",hscore); + + curl = curl_easy_init(); + if ( !curl ) + return; + fp = fopen( "/var/tmp/trash", "w"); + if ( !fp ) + { + curl_easy_cleanup(curl); + return; + } + curl_easy_setopt( curl, CURLOPT_URL, url ); + curl_easy_setopt( curl, CURLOPT_FILE, fp ); + curl_easy_setopt( curl, CURLOPT_NOPROGRESS, TRUE ); + if ( proxy_addr ) + { + curl_easy_setopt( curl, CURLOPT_PROXY, proxy_addr ); + if ( proxy_user ) + curl_easy_setopt( curl, CURLOPT_PROXYUSERPWD, proxy_user ); + } + res = curl_easy_perform(curl); + + curl_easy_cleanup(curl); + fclose( fp ); + + if ( res ) + return; + + fp=fopen( "/var/tmp/trash", "r" ); + if ( !fp ) + return; + + for( i=0; i<8; i++ ) + { + if ( !fgets(url,512,fp) ) + break; + p=strchr(url,'\n'); + if ( p ) + *p=0; + p=strchr(url,'&'); + if ( !p ) + break; + *p=0; + p++; + + strncpy(ihsc[i].name,url,10); + ihsc[i].name[9]=0; + ihsc[i].points = atoi(p); + } + if ( i==8 ) + use_ihsc=1; + fclose(fp); + unlink("/var/tmp/trash"); +} +#endif // HAVE_CURL + +static void LocalSave( void ) +{ + int x; + char *user; + int i; + + localuser=-1; + + for( i=0; i < 8; i++ ) + if ( score > hsc[i].points ) + break; + if ( i==8 ) + return; + +// Fx2PigPause(); + + FBFillRect( 500,32,3*52,4*52+4,BLACK ); + + FBFillRect( 150,420,470,64,BLACK ); + FBDrawRect( 149,419,472,66,WHITE ); + FBDrawRect( 148,418,474,68,WHITE ); + x=FBDrawString( 154,420,64,"name : ",WHITE,0); + user=FBEnterWord(154+x,420,64,9,WHITE); + +// Fx2PigResume(); + + if ( i < 7 ) + memmove( hsc+i+1,hsc+i,sizeof(HScore)*(7-i) ); + strcpy(hsc[i].name,user); + hsc[i].points=score; + + localuser=i; +} + +static void SaveGame( void ) +{ +#ifdef HAVE_CURL + CURL *curl; + CURLcode res; + FILE *fp; + char url[ 512 ]; + char *user=0; + char luser[ 32 ]; + int x; + int n; + char *p; + struct timeval tv; + unsigned long chk=0; + + doexit=0; +#endif // HAVE_CURL + + if ( score < 31 ) + return; + LocalSave(); +#ifdef HAVE_CURL + LocalSave(); + + if ( !use_ihsc ) + return; + + for( x=0; x < 8; x++ ) + { + if ( score > ihsc[x].points ) + break; + } + if ( x == 8 ) + return; + + FBDrawString( 100,230,64,"Inet-Send Highscore ? (OK/BLUE)",GREEN,0); +#ifdef USEX + FBFlushGrafic(); +#endif + + while( realcode != 0xee ) + RcGetActCode(); + + actcode=0xee; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0,0,0,0, &tv ); + RcGetActCode(); + if ( actcode == RC_BLUE ) + return; + if ( actcode == RC_OK ) + break; + } + if ( doexit ) + return; + + if ( localuser != -1 ) + { + strcpy(luser,hsc[localuser].name); + user=luser; + } + else + { +// Fx2PigPause(); + + FBFillRect( 500,32,3*52,4*52+4,BLACK ); + + FBFillRect( 150,420,470,64,BLACK ); + FBDrawRect( 149,419,472,66,WHITE ); + FBDrawRect( 148,418,474,68,WHITE ); + x=FBDrawString( 154,420,64,"name : ",WHITE,0); + user=FBEnterWord(154+x,420,64,9,WHITE); + +// Fx2PigResume(); + } + + n=FBDrawString( 210,360,48,"sending",BLACK,WHITE); + +/* clean name */ + x = strlen(user); + p=user; + for( p=user; *p; x--, p++ ) + { + if (( *p == ' ' ) || ( *p == '&' ) || ( *p == '/' )) + memcpy(p,p+1,x); + } + + chk=BuildCheck( user, score ); + + sprintf(url,"%s/games/tetris.php?action=put&user=%s&score=%ld&chk=%lu", + hscore,user,score,chk); + + curl = curl_easy_init(); + if ( !curl ) + return; + fp = fopen( "/var/tmp/trash", "w"); + if ( !fp ) + { + curl_easy_cleanup(curl); + return; + } + curl_easy_setopt( curl, CURLOPT_URL, url ); + curl_easy_setopt( curl, CURLOPT_FILE, fp ); + curl_easy_setopt( curl, CURLOPT_NOPROGRESS, TRUE ); + if ( proxy_addr ) + { + curl_easy_setopt( curl, CURLOPT_PROXY, proxy_addr ); + if ( proxy_user ) + curl_easy_setopt( curl, CURLOPT_PROXYUSERPWD, proxy_user ); + } + res = curl_easy_perform(curl); + + FBFillRect( 210,360,n,48,GRAY); + if ( !res ) + FBDrawString( 210,360,48,"success",GREEN,GRAY); + else + FBDrawString( 210,360,48,"failed",RED,GRAY); + + curl_easy_cleanup(curl); + fclose( fp ); + unlink( "/var/tmp/trash" ); + + LoadHScore(); + + return; +#endif // HAVE_CURL +} + +static void ShowHScore( HScore *g ) +{ + int i; + int x; + char pp[64]; + + FBFillRect( 0, 0, 1400, 800, BNR0 ); + FBFillRect( 0, 0, 560, 576, BLACK ); +#ifdef HAVE_CURL + if ( g==ihsc ) + FBDrawString( 190, 32, 64, "Internet HighScore", RED, BLACK ); + else +#endif + FBDrawString( 220, 32, 64, "HighScore", RED, BLACK ); + for( i=0; i < 8; i++ ) + { + FBDrawString( 100, 100+i*48, 48, g[i].name, WHITE, 0 ); + sprintf(pp,"%ld",g[i].points); + x = FBDrawString( 400, 100+i*48, 48, pp, BLACK, BLACK ); + FBDrawString( 500-x, 100+i*48, 48, pp, WHITE, BLACK ); + } +#ifdef USEX + FBFlushGrafic(); +#endif + while( realcode != 0xee ) + RcGetActCode(); +} + +#ifdef HAVE_CURL +static void ShowIHScore( void ) +{ + int i = 50; + struct timeval tv; + + ShowHScore( ihsc ); + + while( !doexit && ( realcode == 0xee ) && ( i>0 )) + { + tv.tv_sec=0; + tv.tv_usec=200000; + select( 0,0,0,0,&tv); + RcGetActCode(); + i--; + } +} +#endif // HAVE_CURL + +static void setup_colors(void) +{ + FBSetColor( YELLOW, 235, 235, 30 ); + FBSetColor( GREEN, 30, 235, 30 ); + FBSetColor( STEELBLUE, 80, 80, 200 ); + FBSetColor( BLUE, 80, 80, 230 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 60, 60, 60 ); + FBSetColor( RED1, 198, 131, 131 ); + FBSetColor( RED2, 216, 34, 49 ); + +/* magenta */ + FBSetColor( 30, 216, 175, 216); + FBSetColor( 31, 205, 160, 207); + FBSetColor( 32, 183, 131, 188); + FBSetColor( 33, 230, 196, 231); + FBSetColor( 34, 159, 56, 171); + FBSetColor( 35, 178, 107, 182); + FBSetColor( 36, 172, 85, 180); + FBSetColor( 37, 180, 117, 184); + FBSetColor( 38, 120, 1, 127); + FBSetColor( 39, 89, 1, 98); +/* blue */ + FBSetColor( 40, 165, 172, 226); + FBSetColor( 41, 148, 156, 219); + FBSetColor( 42, 119, 130, 200); + FBSetColor( 43, 189, 196, 238); + FBSetColor( 44, 81, 90, 146); + FBSetColor( 45, 104, 114, 185); + FBSetColor( 46, 91, 103, 174); + FBSetColor( 47, 109, 119, 192); + FBSetColor( 48, 46, 50, 81); + FBSetColor( 49, 34, 38, 63); +/* cyan */ + FBSetColor( 50, 157, 218, 234); + FBSetColor( 51, 140, 208, 227); + FBSetColor( 52, 108, 186, 211); + FBSetColor( 53, 184, 233, 243); + FBSetColor( 54, 55, 143, 172); + FBSetColor( 55, 92, 171, 197); + FBSetColor( 56, 78, 160, 187); + FBSetColor( 57, 98, 177, 203); + FBSetColor( 58, 7, 98, 120); + FBSetColor( 59, 1, 78, 98); +/* green */ + FBSetColor( 60, 173, 218, 177); + FBSetColor( 61, 158, 209, 165); + FBSetColor( 62, 130, 189, 140); + FBSetColor( 63, 195, 232, 199); + FBSetColor( 64, 89, 138, 98); + FBSetColor( 65, 115, 174, 122); + FBSetColor( 66, 102, 163, 112); + FBSetColor( 67, 121, 180, 129); + FBSetColor( 68, 50, 77, 55); + FBSetColor( 69, 38, 59, 41); +/* red */ + FBSetColor( 70, 239, 157, 152); + FBSetColor( 71, 231, 141, 136); + FBSetColor( 72, 210, 112, 109); + FBSetColor( 73, 246, 184, 181); + FBSetColor( 74, 153, 76, 74); + FBSetColor( 75, 197, 97, 92); + FBSetColor( 76, 184, 86, 81); + FBSetColor( 77, 202, 101, 99); + FBSetColor( 78, 95, 33, 32); + FBSetColor( 79, 78, 20, 19); +/* yellow */ + FBSetColor( 80, 238, 239, 152); + FBSetColor( 81, 230, 231, 136); + FBSetColor( 82, 207, 214, 105); + FBSetColor( 83, 246, 246, 181); + FBSetColor( 84, 148, 157, 70); + FBSetColor( 85, 194, 200, 89); + FBSetColor( 86, 180, 189, 76); + FBSetColor( 87, 199, 206, 95); + FBSetColor( 88, 88, 93, 34); + FBSetColor( 89, 69, 75, 22); +/* orange */ + FBSetColor( 90, 243, 199, 148); + FBSetColor( 91, 237, 185, 130); + FBSetColor( 92, 220, 159, 99); + FBSetColor( 93, 249, 220, 178); + FBSetColor( 94, 184, 113, 43); + FBSetColor( 95, 208, 144, 81); + FBSetColor( 96, 198, 132, 67); + FBSetColor( 97, 213, 150, 88); + FBSetColor( 98, 127, 63, 1); + FBSetColor( 99, 98, 46, 1); + + FBSetupColors(); +} + +int main() +{ + struct timeval tv; +// int x; + int i; + int fd; + FILE *fp; + char *line; + char *p; + int fdfb = -1, fdrc = -1; + + if ( FBInitialize( 1280, 720, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + +/* load setup */ + fp = fopen( "/var/tuxbox/games/games.cfg", "r" ); + if ( fp ) + { + line=malloc(128); + isalloc=1; +#ifdef HAVE_CURL + proxy_addr=0; + proxy_user=0; +#endif + hscore=0; + while( fgets( line, 128, fp ) ) + { + if ( *line == '#' ) + continue; + if ( *line == ';' ) + continue; + p=strchr(line,'\n'); + if ( p ) + *p=0; + p=strchr(line,'='); + if ( !p ) + continue; + *p=0; + p++; +#ifdef HAVE_CURL + if ( !strcmp(line,"proxy") ) + proxy_addr=strdup(p); + else if ( !strcmp(line,"proxy_user") ) + proxy_user=strdup(p); + else if ( !strcmp(line,"hscore") ) + hscore=strdup(p); +#endif + } + fclose(fp); + free(line); + } + + fd = open( "/var/tuxbox/games/tetris.hscore", O_RDONLY ); + if ( fd == -1 ) + { + mkdir( "/var/tuxbox/games", 567 ); + for( i=0; i < 8; i++ ) + { + strcpy(hsc[i].name,"nobody"); + hsc[i].points=30; + } + } + else + { + read( fd, hsc, sizeof(hsc) ); + close(fd); + } + +#ifdef HAVE_CURL + if ( hscore ) + { + LoadHScore(); + } +#endif + +#ifdef HAVE_DBOX_HARDWARE + Fx2ShowPig( 480, 400, 176, 144 ); +#endif + + while( doexit != 3 ) + { + BoardInitialize(); + DrawBoard( ); /* 0 = all */ + NextItem(); +#ifdef HAVE_DREAMBOX_HARDWARE + Fx2ShowPig(480, 400, 176, 144 ); +#endif + doexit=0; + + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 10000; + select( 0, 0, 0, 0, &tv ); /* 10ms pause */ + RcGetActCode( ); + if ( doexit ) + break; + tv.tv_sec = 0; + tv.tv_usec = 10000; + select( 0, 0, 0, 0, &tv ); /* 10ms pause */ + RcGetActCode( ); + if ( doexit ) + break; + MoveSide(); + if ( !FallDown() ) + { + RemoveCompl(); + if ( !NextItem() ) + doexit=1; + } +#ifdef USEX + FBFlushGrafic(); +#endif + + RcGetActCode( ); + } + + if ( doexit != 3 ) + { + actcode=0xee; + DrawGameOver(); +#ifdef USEX + FBFlushGrafic(); +#endif + doexit=0; + SaveGame(); +#ifdef HAVE_CURL + if ( use_ihsc ) + ShowIHScore(); +#endif + ShowHScore(hsc); +// Fx2PigPause(); + +#ifdef USEX + FBFlushGrafic(); +#endif + i=0; + actcode=0xee; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + i++; + if ( i == 50 ) + { + FBDrawString( 190, 480, 48, "press OK for new game",GRAY,0); +#ifdef USEX + FBFlushGrafic(); +#endif + } + } +// Fx2PigResume(); + } + } +// Fx2StopPig(); + +#ifdef HAVE_DBOX_HARDWARE +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } +#endif + + RcClose(); + FBClose(); + +/* save hscore */ + fd = open( "/var/tuxbox/games/tetris.hscore", O_CREAT|O_WRONLY, 438 ); + if ( fd != -1 ) + { + write( fd, hsc, sizeof(hsc) ); + close(fd); + } + + if ( isalloc ) + { +#ifdef HAVE_CURL + if ( proxy_addr ) + free ( proxy_addr ); + if ( proxy_user ) + free ( proxy_user ); +#endif + if ( hscore ) + free ( hscore ); + } + + return 0; +} diff --git a/archive-sources/tetris/tetris.cfg b/archive-sources/tetris/tetris.cfg new file mode 100644 index 0000000..8ab1894 --- /dev/null +++ b/archive-sources/tetris/tetris.cfg @@ -0,0 +1,11 @@ +index=000022 +pluginversion=1 +name=Tetris +desc=i break together - tetris :) +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 +pigsize=128x96 +pigpos=450,105 diff --git a/archive-sources/vierg/board.c b/archive-sources/vierg/board.c new file mode 100644 index 0000000..838872b --- /dev/null +++ b/archive-sources/vierg/board.c @@ -0,0 +1,451 @@ +/* +** initial coding by fx2 +*/ + + +#include + +#include "draw.h" +#include +#include "rcinput.h" +#include "colors.h" +#include "pics.h" +#include + +#define STATUS_X 80 +#define STATUS_Y 50 +#define LOGO_X 500 +#define LOGO_Y 30 +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern double sqrt( double in ); + +extern int doexit; +static int ipos=3; + +extern unsigned short actcode; + +static char maze[42]; +static int tst[7]; + +static struct timeval starttv; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + + return tv.tv_usec % idx; +} + +static void msleep( int msec ) +{ + struct timeval tv; + tv.tv_sec = msec/1000; + tv.tv_usec = 1000*(msec%1000); + select( 0, 0, 0, 0, &tv ); +} + +void DrawBoard( void ) +{ + int x; + int y; + +// FBFillRect( 0, 0, 720, 576, BLACK );// orginal + FBFillRect( 0, 0, 576, 526, BLACK ); // by bazi98 + + for( y = 0; y < 6; y++ ) + { + for( x = 0; x < 7; x++ ) + { + FBCopyImage( x*48+64, y*48+96, 48, 48, dout ); + } + } + FBOverlayImage( ipos*48+64+6, 48+4, 36, 40, 0, 0, WHITE, dred, 0,0,0); +// FBDrawFx2Logo( LOGO_X, LOGO_Y );//orginal + FBDrawString( 490, 30, 64, "fx", WHITE, 0 );// by bazi98 + FBDrawString( 510, 40, 64, "2", RED, 0 );// by bazi98 + + gettimeofday(&starttv,0); +} + +void BoardInitialize( void ) +{ + memset(maze,0,sizeof(maze)); + + actcode=0xee; + ipos=3; +} + +static void Fall( int x, unsigned char *dr, char v ) +{ + int y; + + for( y=0; y<6; y++ ) + { + if ( maze[ (5-y)*7 + x ] ) + break; + if(y) + { + msleep(100); + FBCopyImage( x*48+64+6, y*48+48+4, 36, 40, dgray ); + maze[ (6-y)*7 + x ] = 0; + } + else + FBFillRect( x*48+64+6, y*48+48+4, 36, 40, BLACK ); + maze[ (5-y)*7 + x ] = v; + FBOverlayImage( x*48+64+6, y*48+96+4, 36, 40, 0, 0, WHITE, + dr, dgray, dgray, dgray); + } +} + +static int vFall( int x, char v ) +{ + int y; + int idx=-1; + + idx=x; + for( y=0; y<6; y++, idx+=7 ) + { + if ( !maze[ idx ] ) + { + maze[ idx ] = v; + return idx; + } + } + return -1; +} + +static int TestGameOver( int mask ) +{ + int x; + int y; + int idx; + + for( y=0, idx=0; y<3; y++ ) + { + for( x=0; x<7; x++, idx++ ) + { + if ( maze[ idx ] & mask ) // start-point + { + if ( x < 4 ) + { + // vertikal nach rechts testen + if (( maze[ idx +1 ] & mask ) && + ( maze[ idx +2 ] & mask ) && + ( maze[ idx +3 ] & mask )) + { + return 1; // game over + } + // diagonale nach rechts testen + if (( maze[ idx +8 ] & mask ) && + ( maze[ idx +16 ] & mask ) && + ( maze[ idx +24 ] & mask )) + { + return 1; // game over + } + } + if ( x > 2 ) + { + // diagonale nach links testen + if (( maze[ idx +6 ] & mask ) && + ( maze[ idx +12 ] & mask ) && + ( maze[ idx +18 ] & mask )) + { + return 1; // game over + } + } + // nach oben testen + if (( maze[ idx +7 ] & mask ) && + ( maze[ idx +14 ] & mask ) && + ( maze[ idx +21 ] & mask )) + { + return 1; // game over + } + } + } + } +// der rest wird nur auf waagerecht untersucht + for( ; y<6; y++ ) + { + for( x=0; x<7; x++, idx++ ) + { + if (( x < 4 ) && maze[ idx ] & mask ) // start-point + { + // vertikal nach rechts testen + if (( maze[ idx +1 ] & mask ) && + ( maze[ idx +2 ] & mask ) && + ( maze[ idx +3 ] & mask )) + { + return 1; // game over + } + } + } + } +// test auf patt + for( idx=35, x=0; x<7; x++, idx++ ) + if ( !maze[idx] ) + break; + return x==7 ? 2:0; +} + +static void CPlay( int x ) +{ + FBOverlayImage( x*48+64+6, 48+4, 36, 40, 0, 0, WHITE, dblue, 0,0,0); + msleep(700); + Fall( x, dblue, 2 ); +} + +static void outmaze() +{ + int x; + int y; + int idx; + + printf("+-+-+-+-+-+-+-+%c\n",0x0d); + for( y=0, idx=35; y<6; y++ ) + { + for( x=0; x<7; x++, idx++ ) + printf("|%c",maze[idx]?((maze[idx]&1)?'o':'*'):' '); + idx-=14; + printf("|%c\n",0x0d); + } + printf("+-+-+-+-+-+-+-+%c\n\n",0x0d); +} + +static void MyPlay( void ) +{ + int x; + int idx; + int k; + int vidx[7]; + int max=0; + + for( x=0; x<7; x++ ) + tst[x]=0; +/* test: eigener sieg in 1nem zug */ + for( x=0; x<7; x++ ) + { + idx=vFall( x, 6 ); +//printf("test %d (pos=%d)%c\n",x,idx,0x0d); +//outmaze(); + if ( idx != -1 ) + { + if ( TestGameOver(2) ) // great ! - choose it + { + maze[idx]=0; // remove virt. chip + CPlay( x ); + return; + } + k=vFall( x, 5 ); // put playerchip over me + if ( k != -1 ) + { + if ( TestGameOver(1) ) // fault - this field is ugly + tst[x] -= 50; + else + tst[x]++; + maze[k]=0; // remove virt. chip + } + else + tst[x]++; + maze[idx]=0; // remove virt. chip + } + else + tst[x]=-999999; // neg val + } +/* test: player sieg in 1-2 zuegen */ + for( x=0; x<7; x++ ) + { + idx=vFall( x, 5 ); + if ( idx != -1 ) + { + if ( TestGameOver(1) ) // great ! - choose it + tst[x] += 50; + else + { + int idx2; + + for( k=0;k<7;k++) + { + if ( k==x ) + continue; + idx2=vFall(k,5); + if ( idx2 != -1 ) + { + if ( TestGameOver(1) ) // great ! - choose it + tst[x] += 10; + maze[idx2]=0; // remove virt. chip + } + } + } + maze[idx]=0; // remove virt. chip + } + } + +// search highest val + for( x=1; x<7; x++ ) + if ( tst[x] > tst[max] ) + max=x; + idx=0; + for( x=0; x<7; x++ ) + { + if (( tst[x] == tst[max] ) && !maze[35+x] ) + { + vidx[idx] = x; + idx++; + } + } + + if ( !idx ) // never reached + return; + + if ( idx > 1 ) + { + int i1; + int i2; + + for( k=0;k tst[max] ) + max=x; + idx=0; + for( x=0; x<7; x++ ) + { + if (( tst[x] == tst[max] ) && !maze[35+x] ) + { + vidx[idx] = x; + idx++; + } + } + + if ( !idx ) // never reached + return; + + idx=myrand(idx); + CPlay(vidx[idx]); +} + +static int GameOver( int mask ) +{ + int k; + k=TestGameOver( mask ); + if ( !k ) + return 0; + if ( k == 2 ) // patt + { +// FBDrawString( 190, 410, 64, "Good Game !", WHITE, 0 ); // orginal + FBDrawString( 140, 430, 64, "Good Game !", WHITE, 0 ); // by bazi98 + } + else if ( mask == 1 ) + { +// FBDrawString( 190, 410, 64, "You won !", WHITE, 0 ); // orginal + FBDrawString( 140, 430, 64, "You won !", WHITE, 0 ); // by bazi98 + } + else + { +// FBDrawString( 190, 410, 64, "Iam the Winner !", WHITE, 0 ); // orginal + FBDrawString( 140, 430, 64, "Iam the Winner !", WHITE, 0 ); // by bazi98 + } + doexit=1; + return 1; +} + +void MoveMouse( void ) +{ +static int locked = 0; + int k; + + if ( locked ) + { + locked--; + actcode=0xee; + return; + } + k=0; + switch( actcode ) + { + case RC_7 : k++; + case RC_6 : k++; + case RC_5 : k++; + case RC_4 : k++; + case RC_3 : k++; + case RC_2 : k++; + case RC_1 : k++; + break; + } + if ( k ) + ipos=k-1; + switch( actcode ) + { + case RC_RIGHT : + if ( ipos < 6 ) + { + FBFillRect( ipos*48+64+6, 48+4, 36, 40, BLACK ); + ipos++; + FBOverlayImage( ipos*48+64+6, 48+4, 36, 40, 0, 0, WHITE, + dred, 0,0,0); + locked=1; + } + break; + case RC_LEFT : + if ( ipos > 0 ) + { + FBFillRect( ipos*48+64+6, 48+4, 36, 40, BLACK ); + ipos--; + FBOverlayImage( ipos*48+64+6, 48+4, 36, 40, 0, 0, WHITE, + dred, 0,0,0); + locked=1; + } + break; + case RC_7 : + case RC_6 : + case RC_5 : + case RC_4 : + case RC_3 : + case RC_2 : + case RC_1 : + + case RC_OK : + locked=1; + if ( maze[ipos+35] ) + break; + Fall( ipos, dred, 1 ); + k=TestGameOver( 1 ); + if ( GameOver(1) ) + return; + MyPlay(); + if ( GameOver(2) ) + return; + ipos=3; + FBOverlayImage( ipos*48+64+6, 48+4, 36, 40, 0, 0, WHITE, + dred, 0,0,0); + break; + } +} diff --git a/archive-sources/vierg/board.h b/archive-sources/vierg/board.h new file mode 100644 index 0000000..6c8d162 --- /dev/null +++ b/archive-sources/vierg/board.h @@ -0,0 +1,8 @@ +#ifndef MAZE_H +#define MAZE_H + +extern void DrawBoard( int rbomb ); +extern void BoardInitialize( void ); +extern void MoveMouse( void ); + +#endif diff --git a/archive-sources/vierg/colors.h b/archive-sources/vierg/colors.h new file mode 100644 index 0000000..cad0075 --- /dev/null +++ b/archive-sources/vierg/colors.h @@ -0,0 +1,6 @@ + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 diff --git a/archive-sources/vierg/pics.h b/archive-sources/vierg/pics.h new file mode 100644 index 0000000..a7d6594 --- /dev/null +++ b/archive-sources/vierg/pics.h @@ -0,0 +1,273 @@ +#ifndef PICS_H +#define PICS_H + +#define MAZEW 22 +#define MAZEH 18 + +#define B WHITE +#define _ GRAY +#define g BLACK + +static unsigned char dout[] = { +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B, +g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,B,B, +g,g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B, +g,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B }; + +static unsigned char dgray[]={ +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ +}; + +#undef g +#undef B +#undef _ + +static unsigned char dred[]={ +1,1,1,1,1,1,1,1,1,1,1,1,1,1,21,12,40,40,40,12, +12,21,21,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,40,12,12,12,21, +21,21,21,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,13,13,13,13,26,12,21,30,30, +30,30,21,21,21,21,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,33,16,32,29,20,21,30,18,18,18,36, +36,36,36,18,18,25,12,12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,34,16,33,32,39,40,21,30,25,25,18,18, +36,36,36,36,36,36,25,25,30,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,27,15,27,33,14,20,40,40,12,21,21,30,30, +25,18,36,36,36,36,36,36,18,21,1,1,1,1,1,1, +1,1,1,1,1,1,42,33,15,32,27,24,13,20,20,40,12,21,21,30, +30,25,18,18,18,36,36,36,36,36,21,1,1,1,1,1, +1,1,1,1,1,11,11,22,33,27,32,28,13,13,20,26,40,12,12,21, +21,30,25,18,18,18,18,18,36,36,36,30,1,1,1,1, +1,1,1,1,11,11,11,11,22,33,23,24,35,39,13,20,26,26,40,12, +12,21,30,30,25,25,25,25,18,18,36,18,30,1,1,1, +1,1,1,31,11,11,11,11,31,17,32,14,28,35,39,13,13,20,26,40, +12,12,21,21,21,30,30,30,30,25,18,36,30,40,1,1, +1,1,1,22,22,31,11,11,31,19,15,41,14,28,35,35,39,13,20,26, +40,40,40,12,12,21,21,21,30,30,30,18,25,30,1,1, +1,1,27,22,31,31,11,11,11,22,16,32,41,14,14,28,35,39,13,20, +20,26,40,40,12,12,12,12,21,21,21,21,30,21,39,1, +1,1,16,22,11,11,11,11,11,31,19,27,32,41,41,14,28,35,39,13, +13,20,20,26,26,26,40,40,12,12,12,12,21,12,39,1, +1,1,19,31,11,11,11,11,11,11,31,16,15,23,23,41,14,24,28,35, +39,13,13,20,20,20,26,26,26,40,40,40,40,26,35,1, +1,16,42,11,11,11,11,11,11,11,11,19,37,38,23,23,23,41,14,24, +28,35,39,39,13,13,13,13,20,20,20,20,26,20,24,1, +16,17,11,11,11,11,11,11,11,11,11,31,19,16,38,38,32,23,23,41, +14,24,28,35,35,35,39,39,13,13,13,20,20,39,38,17, +17,19,11,11,11,11,11,31,31,31,11,31,42,19,16,27,38,32,32,23, +41,41,14,24,28,29,29,29,35,39,39,13,39,41,17,22, +22,22,11,11,11,11,31,31,31,31,31,31,31,42,19,33,34,15,15,32, +23,23,23,41,14,24,24,24,28,29,28,29,41,34,31,11, +42,31,11,11,11,31,42,42,31,31,31,31,31,31,31,22,19,33,27,15, +38,38,23,23,23,41,14,14,14,24,14,32,16,42,11,11, +31,31,11,11,31,22,22,42,42,31,31,31,31,31,31,31,42,22,19,33, +16,34,15,15,38,32,32,38,38,15,34,17,22,11,11,11, +31,11,11,31,22,22,22,22,22,22,22,42,31,31,31,31,31,31,42,22, +19,17,33,33,16,16,16,16,33,17,19,31,11,11,11,11, +31,11,11,22,22,22,22,22,22,22,22,22,42,42,42,42,31,31,31,31, +31,42,22,22,22,22,22,22,31,11,11,11,11,11,11,11, +31,31,31,19,19,19,19,22,22,22,22,22,22,22,42,42,42,42,42,31, +31,31,31,31,11,11,11,11,11,11,11,11,11,11,11,11, +22,42,31,19,17,19,19,19,22,22,22,22,22,22,22,22,22,22,42,31, +31,31,31,31,31,11,11,11,11,11,11,11,11,11,11,11, +19,19,31,17,17,17,19,19,19,19,22,22,22,22,22,22,22,22,22,22, +42,42,42,31,31,31,31,31,31,31,31,11,11,11,11,31, +17,19,42,17,33,17,17,17,17,19,19,19,19,19,22,22,22,22,22,22, +22,42,42,42,42,42,42,42,31,31,31,31,11,11,11,42, +1,17,22,33,16,33,33,33,17,19,19,19,19,19,19,22,22,22,22,22, +22,22,22,22,22,42,42,42,42,42,42,11,11,11,11,1, +1,1,22,33,16,16,33,33,33,33,17,17,19,19,19,19,22,22,22,22, +22,22,22,22,22,22,42,22,22,22,42,31,11,11,11,1, +1,1,17,33,16,37,16,16,16,33,33,17,17,17,17,19,19,19,19,19, +22,22,22,22,22,22,22,22,22,22,22,31,11,11,22,1, +1,1,16,33,16,27,34,37,16,16,33,33,33,33,33,17,17,17,19,19, +19,19,19,22,22,22,22,22,22,22,22,11,11,31,19,1, +1,1,1,19,16,27,15,27,37,16,16,16,16,33,33,33,33,17,19,19, +19,19,19,19,19,19,19,19,19,22,42,11,11,31,1,1, +1,1,1,16,16,16,15,15,27,34,37,37,16,16,16,33,33,33,33,17, +17,17,19,19,19,19,19,19,19,22,11,11,19,16,1,1, +1,1,1,1,16,16,34,15,15,27,27,34,34,37,16,16,16,33,33,33, +33,33,17,17,17,17,17,19,22,31,11,22,33,1,1,1, +1,1,1,1,1,34,16,34,15,15,15,27,27,27,34,37,16,16,16,33, +33,33,33,33,33,33,33,19,42,31,22,33,1,1,1,1, +1,1,1,1,1,1,27,33,16,27,38,38,38,38,27,27,34,37,37,16, +16,16,16,16,16,33,19,31,11,22,37,1,1,1,1,1, +1,1,1,1,1,1,1,27,34,16,16,34,27,15,38,15,15,15,27,27, +27,37,16,33,19,22,31,31,17,34,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,34,16,34,37,16,16,37,37,37,37,16,16, +33,17,19,22,42,22,17,27,38,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,15,38,38,27,33,17,19,19,19,19, +22,22,19,19,33,16,27,28,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,26,40,20,38,16,19,22,31,22, +19,33,27,23,39,20,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,21,12,20,13,39,13, +13,20,26,1,1,1,1,1,1,1,1,1,1,1,1,1 +}; + +static unsigned char dblue[]={ +1,1,1,1,1,1,1,1,1,1,1,1,1,1,66,52,78,78,78,52, +52,66,66,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,52,52,52,52,52,66, +66,66,66,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,81,71,53,81,78,52,66,62,62, +62,62,66,66,66,66,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,70,56,65,67,75,66,62,82,58,72,72, +77,72,72,58,58,62,52,52,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,73,56,70,65,63,78,66,62,62,82,58,58, +72,72,77,77,77,72,82,62,62,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,68,55,68,70,54,81,52,78,52,66,66,62,62, +62,58,72,77,77,77,77,77,58,66,1,1,1,1,1,1, +1,1,1,1,1,1,80,70,55,65,73,54,71,75,75,78,52,66,66,62, +62,62,58,58,72,72,72,77,77,72,66,1,1,1,1,1, +1,1,1,1,1,51,69,59,70,68,65,67,63,71,81,60,78,52,52,66, +66,62,62,58,58,58,58,72,72,77,72,62,1,1,1,1, +1,1,1,1,51,51,51,69,59,79,61,54,63,63,71,81,60,78,78,52, +52,66,62,62,62,82,82,82,58,58,77,58,62,1,1,1, +1,1,1,69,69,69,51,51,69,57,65,54,67,67,63,71,81,75,60,78, +52,52,66,66,66,62,62,62,62,62,72,77,62,78,1,1, +1,1,1,59,64,80,51,51,69,74,55,61,54,67,67,63,63,71,75,60, +78,78,78,52,52,66,66,66,62,62,62,58,82,62,1,1, +1,1,68,59,80,69,51,51,51,64,56,65,61,54,54,67,67,63,71,81, +75,60,78,78,52,52,52,52,66,66,66,66,62,66,63,1, +1,1,56,64,69,69,51,51,51,80,74,68,65,61,61,54,67,67,63,53, +71,81,75,60,78,78,78,78,52,52,52,52,66,52,63,1, +1,1,74,69,51,51,51,51,51,69,80,56,55,65,61,61,54,54,67,67, +63,63,71,81,81,75,60,60,78,78,78,78,52,78,63,1, +1,56,80,69,51,51,51,51,51,51,51,59,73,76,61,61,61,61,54,54, +67,67,63,63,53,53,81,81,81,75,75,60,78,60,54,1, +56,70,69,51,51,51,51,69,69,69,51,80,74,56,76,76,65,61,61,61, +54,54,67,67,63,63,63,63,53,71,71,81,81,63,55,57, +70,74,51,51,51,51,69,69,69,69,69,69,64,74,56,68,55,65,65,61, +61,54,54,54,67,67,67,67,63,63,63,53,63,61,70,64, +59,64,51,51,51,69,69,69,69,69,69,69,69,80,59,70,73,55,55,65, +65,61,61,61,54,54,54,54,67,67,67,67,61,73,80,69, +80,80,51,51,69,69,80,80,80,69,69,69,69,69,69,64,74,79,73,55, +76,76,61,61,61,61,54,54,54,54,54,65,56,64,51,51, +69,69,51,69,80,64,64,80,80,80,80,80,80,69,69,80,80,59,74,79, +56,73,68,55,76,76,65,76,76,55,73,70,64,69,51,51, +69,69,51,80,64,59,59,64,64,64,64,80,80,80,80,80,69,69,80,59, +74,57,70,79,56,56,56,56,70,57,59,80,51,51,51,51, +69,69,51,64,59,59,59,59,59,59,59,64,64,80,80,80,80,69,69,69, +80,80,64,64,64,59,59,64,80,69,51,51,51,51,51,51, +69,69,69,59,74,59,59,59,59,59,59,59,59,64,80,80,80,80,80,69, +69,69,69,69,69,51,51,51,51,51,51,51,51,51,51,51, +64,64,69,74,57,74,74,59,59,59,59,59,59,59,64,64,64,64,80,80, +80,80,80,69,69,69,69,69,69,69,69,51,51,51,51,69, +74,59,80,57,70,57,57,74,74,74,59,59,59,59,59,59,59,64,64,64, +64,80,80,80,80,80,80,80,69,69,69,69,51,51,51,80, +70,74,64,70,70,70,57,57,57,74,74,74,59,59,59,59,59,59,59,59, +64,64,64,64,80,80,80,80,80,69,69,69,69,51,51,64, +1,70,59,79,56,79,79,70,57,57,57,57,74,59,59,59,59,59,59,59, +59,59,59,59,64,80,80,80,80,80,80,69,51,51,51,1, +1,1,59,79,56,56,79,70,70,70,70,57,74,74,74,59,59,59,59,59, +59,59,59,59,64,64,80,64,64,64,80,69,69,51,51,1, +1,1,70,79,56,73,56,56,56,79,70,70,70,57,57,74,74,74,74,59, +59,59,59,59,59,64,64,64,59,64,64,69,51,69,64,1, +1,1,56,70,56,73,73,73,56,56,79,79,70,70,70,70,57,57,57,57, +74,74,74,59,59,59,59,59,59,59,64,69,51,80,57,1, +1,1,1,57,56,68,55,68,73,56,56,56,56,79,79,79,70,70,57,57, +57,57,57,57,74,59,59,59,59,59,80,69,69,69,1,1, +1,1,1,56,56,56,55,55,68,73,73,73,56,56,56,79,70,70,70,70, +70,57,57,57,74,74,74,74,59,64,69,51,74,56,1,1, +1,1,1,1,56,56,73,55,55,68,68,73,73,73,56,56,56,79,79,70, +70,70,70,70,70,70,70,74,59,80,51,59,70,1,1,1, +1,1,1,1,1,73,56,73,68,55,55,68,68,68,73,73,56,56,56,79, +79,79,79,79,79,70,70,59,80,80,64,70,1,1,1,1, +1,1,1,1,1,1,73,79,56,68,76,76,76,55,68,68,73,73,73,56, +56,56,56,56,56,70,59,69,51,64,73,1,1,1,1,1, +1,1,1,1,1,1,1,68,73,56,56,73,68,55,55,55,55,55,68,68, +73,73,56,70,74,64,69,80,70,73,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,73,56,73,73,56,56,73,73,73,73,56,56, +79,70,74,59,64,64,57,68,76,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,55,76,55,68,79,70,74,74,59,59, +59,59,59,74,70,56,73,67,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,78,78,81,76,56,74,64,69,64, +59,70,68,61,63,75,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,66,52,60,71,63,63, +71,81,78,1,1,1,1,1,1,1,1,1,1,1,1,1 +}; +#endif diff --git a/archive-sources/vierg/somain.c b/archive-sources/vierg/somain.c new file mode 100644 index 0000000..da82a4a --- /dev/null +++ b/archive-sources/vierg/somain.c @@ -0,0 +1,198 @@ +/* +** initial coding by fx2 +*/ + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "board.h" +#include "colors.h" +#include "pig.h" +// #include +#include "fx2math.h" + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 255, 255, 30 ); + FBSetColor( GREEN, 30, 255, 30 ); + FBSetColor( STEELBLUE, 30, 30, 180 ); + FBSetColor( BLUE, 130, 130, 255 ); + FBSetColor( GRAY, 130, 130, 130 ); + + FBSetColor( 11, 222, 2, 2 ); + FBSetColor( 12, 248, 201, 201 ); + FBSetColor( 13, 242, 155, 156 ); + FBSetColor( 14, 235, 111, 111 ); + FBSetColor( 15, 230, 72, 72 ); + FBSetColor( 16, 226, 48, 48 ); + FBSetColor( 17, 226, 32, 32 ); + FBSetColor( 18, 254, 242, 242 ); + FBSetColor( 19, 223, 24, 24 ); + FBSetColor( 20, 244, 172, 172 ); + FBSetColor( 21, 250, 214, 214 ); + FBSetColor( 22, 222, 15, 15 ); + FBSetColor( 23, 234, 94, 94 ); + FBSetColor( 24, 238, 119, 119 ); + FBSetColor( 25, 254, 234, 234 ); + FBSetColor( 26, 246, 182, 184 ); + FBSetColor( 27, 230, 64, 64 ); + FBSetColor( 28, 238, 126, 126 ); + FBSetColor( 29, 238, 130, 130 ); + FBSetColor( 30, 250, 225, 225 ); + FBSetColor( 31, 222, 6, 6 ); + FBSetColor( 32, 234, 88, 88 ); + FBSetColor( 33, 226, 40, 40 ); + FBSetColor( 34, 230, 58, 58 ); + FBSetColor( 35, 238, 134, 134 ); + FBSetColor( 36, 254, 252, 252 ); + FBSetColor( 37, 226, 54, 54 ); + FBSetColor( 38, 230, 79, 79 ); + FBSetColor( 39, 240, 143, 143 ); + FBSetColor( 40, 246, 190, 191 ); + FBSetColor( 41, 234, 102, 102 ); + FBSetColor( 42, 222, 10, 10 ); + + FBSetColor( 51, 2, 2, 158 ); + FBSetColor( 52, 193, 194, 232 ); + FBSetColor( 53, 146, 146, 214 ); + FBSetColor( 54, 111, 111, 200 ); + FBSetColor( 55, 70, 70, 184 ); + FBSetColor( 56, 48, 48, 176 ); + FBSetColor( 57, 30, 30, 170 ); + FBSetColor( 58, 230, 230, 246 ); + FBSetColor( 59, 19, 19, 166 ); + FBSetColor( 60, 170, 170, 223 ); + FBSetColor( 61, 98, 98, 195 ); + FBSetColor( 62, 218, 218, 241 ); + FBSetColor( 63, 139, 139, 211 ); + FBSetColor( 64, 14, 14, 163 ); + FBSetColor( 65, 87, 87, 191 ); + FBSetColor( 66, 206, 206, 237 ); + FBSetColor( 67, 125, 125, 206 ); + FBSetColor( 68, 62, 62, 182 ); + FBSetColor( 69, 6, 6, 162 ); + FBSetColor( 70, 36, 36, 172 ); + FBSetColor( 71, 150, 150, 214 ); + FBSetColor( 72, 238, 238, 248 ); + FBSetColor( 73, 56, 56, 180 ); + FBSetColor( 74, 26, 26, 169 ); + FBSetColor( 75, 166, 166, 222 ); + FBSetColor( 76, 79, 79, 188 ); + FBSetColor( 77, 248, 248, 253 ); + FBSetColor( 78, 181, 181, 227 ); + FBSetColor( 79, 42, 42, 174 ); + FBSetColor( 80, 10, 10, 162 ); + FBSetColor( 81, 159, 159, 219 ); + FBSetColor( 82, 226, 226, 246 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + int fdfb = -1, fdrc = -1; + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + +#ifdef USEX + FBFlushGrafic(); +#endif + + while( doexit != 3 ) + { + BoardInitialize(); + DrawBoard( 0 ); +// Fx2ShowPig( 420, 150, 240, 188 ); + + doexit=0; + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 10000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + + RcGetActCode( ); + MoveMouse(); +#ifdef USEX + FBFlushGrafic(); +#endif + } + + if ( doexit != 3 ) + { + actcode=0xee; + doexit=0; + while(( actcode != RC_OK ) && !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + x = select( 0, 0, 0, 0, &tv ); /* 100ms pause */ + RcGetActCode( ); + } + } + } + +// Fx2StopPig(); + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + +// int plugin_exec( PluginParam *par ) +// { +// int fd_fb=-1; +// int fd_rc=-1; +// +// for( ; par; par=par->next ) +// { +// if ( !strcmp(par->id,P_ID_FBUFFER) ) +// fd_fb=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_RCINPUT) ) +// fd_rc=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_NOPIG) ) +// fx2_use_pig=!_atoi(par->val); +// } +// return vierg_exec( fd_fb, fd_rc, -1, 0 ); +// } diff --git a/archive-sources/vierg/vierg.cfg b/archive-sources/vierg/vierg.cfg new file mode 100644 index 0000000..bd812f0 --- /dev/null +++ b/archive-sources/vierg/vierg.cfg @@ -0,0 +1,9 @@ +name=4 gewinnt +desc=everybody knows it +type=1 +needfb=1 +needrc=1 +needlcd=0 +pigon=0 +pigsize=160x144 +pigpos=440,300 diff --git a/archive-sources/yahtzee/colors.h b/archive-sources/yahtzee/colors.h new file mode 100644 index 0000000..ca2d09f --- /dev/null +++ b/archive-sources/yahtzee/colors.h @@ -0,0 +1,8 @@ + +#define YELLOW 4 +#define GREEN 5 +#define STEELBLUE 6 +#define BLUE 7 +#define GRAY 8 +#define DARK 9 +#define GREEN2 10 diff --git a/archive-sources/yahtzee/pics.h b/archive-sources/yahtzee/pics.h new file mode 100644 index 0000000..2a6e2ae --- /dev/null +++ b/archive-sources/yahtzee/pics.h @@ -0,0 +1,22 @@ +#ifndef PICS_H +#define PICS_H + +#define MAZEW 44 +#define MAZEH 36 + +#define _ WHITE +#define W BLUE + +static unsigned char point[] = { +_,W,W,W,W,W,_, +_,W,W,W,W,W,_, +W,W,W,W,W,W,W, +W,W,W,W,W,W,W, +W,W,W,W,W,W,W, +_,W,W,W,W,W,_, +_,W,W,W,W,W,_ }; + +#undef W +#undef _ + +#endif diff --git a/archive-sources/yahtzee/somain.c b/archive-sources/yahtzee/somain.c new file mode 100644 index 0000000..a7f3106 --- /dev/null +++ b/archive-sources/yahtzee/somain.c @@ -0,0 +1,108 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include +#include +#include + +#include "rcinput.h" +#include "draw.h" +#include "pig.h" +#include "colors.h" +#include "yahtzee.h" +//#include +#include "fx2math.h" + +extern int doexit; +extern int debug; +extern unsigned short actcode; +extern unsigned short realcode; +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +static void setup_colors( void ) +{ + FBSetColor( YELLOW, 230, 230, 30 ); + FBSetColor( GREEN, 30, 230, 30 ); + FBSetColor( STEELBLUE, 80, 80, 220 ); + FBSetColor( BLUE, 30, 30, 230 ); + FBSetColor( GRAY, 130, 130, 130 ); + FBSetColor( DARK, 60, 60, 60 ); + FBSetColor( GREEN2, 20, 200, 20 ); + + FBSetupColors( ); +} + +int main( ) +{ + struct timeval tv; + int x; + + int fdfb = -1, fdrc = -1; + if ( FBInitialize( 720, 576, 8, fdfb ) < 0 ) + return -1; + + setup_colors(); + FBFillRect( 0, 0, 1400, 800, BNR0 ); + + if ( RcInitialize( fdrc ) < 0 ) + return -1; + + doexit=0; + while( !doexit ) + { + EnterPlayer(); + if ( !doexit ) + { + RunYahtzee(); + DrawWinner(); + } + } + +// Fx2StopPig(); + +/* fx2 */ +/* buffer leeren, damit neutrino nicht rumspinnt */ + realcode = RC_0; + while( realcode != 0xee ) + { + tv.tv_sec = 0; + tv.tv_usec = 300000; + x = select( 0, 0, 0, 0, &tv ); /* 300ms pause */ + RcGetActCode( ); + } + + RcClose(); + FBClose(); + + return 0; +} + +//int plugin_exec( PluginParam *par ) +//{ +// int fd_fb=-1; +// int fd_rc=-1; +// +// for( ; par; par=par->next ) +// { +// if ( !strcmp(par->id,P_ID_FBUFFER) ) +// fd_fb=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_RCINPUT) ) +// fd_rc=_atoi(par->val); +// else if ( !strcmp(par->id,P_ID_NOPIG) ) +// fx2_use_pig=!_atoi(par->val); +// } +// return yahtzee_exec( fd_fb, fd_rc, -1, 0 ); +//} diff --git a/archive-sources/yahtzee/text.h b/archive-sources/yahtzee/text.h new file mode 100644 index 0000000..adea057 --- /dev/null +++ b/archive-sources/yahtzee/text.h @@ -0,0 +1,94 @@ + +#define GO_WIDTH 142 +#define SC_WIDTH 81 +#define FX_WIDTH 45 +#define NO_0_WIDTH 18 +#define NO_1_WIDTH 9 +#define NO_2_WIDTH 19 +#define NO_3_WIDTH 18 +#define NO_4_WIDTH 19 +#define NO_5_WIDTH 17 +#define NO_6_WIDTH 18 +#define NO_7_WIDTH 18 +#define NO_8_WIDTH 18 +#define NO_9_WIDTH 18 + +#define _ BLACK +#define Y YELLOW +#define W WHITE +#define R RED +#define o STEELBLUE + +static unsigned char data_fx2[] = { +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,W,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,W,W,W,_,_,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +W,W,W,W,W,W,W,W,W,_,_,_,W,W,W,W,W,W,W,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,R,R,R,_,_,_,_,_,_,_, +W,W,W,W,W,W,W,W,W,_,_,_,W,W,W,W,W,W,W,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,W,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,W,W,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,_,_,_,_,_,_,_,_,R,R,R,R,R,R,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,_,_,_,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,_,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,_,W,W,W,W,W,W,_,_,_,_,_,R,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,_,W,W,W,W,_,_,_,_,_,R,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,_,W,W,_,W,W,W,W,W,_,_,_,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,_,_,_,W,W,W,W,_,_,R,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,_,W,W,_,_,_,W,W,W,W,W,_,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,_,_,_,_,W,W,W,W,W,R,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,_,W,W,_,_,_,_,_,W,W,W,W,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,W,W,W,W,_,_,_,_,_,_,_,_,W,W,_,_,_,_,_,_,W,W,W,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,W,W,W,W,W,W,_,_,_,_,_,W,W,W,W,W,_,_,_,_,W,W,W,W,R,R,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,W,W,W,W,W,W,_,_,_,_,_,W,W,W,W,W,_,_,_,_,W,W,W,R,R,W,W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,R,R,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,o,o,o,o,o,o,o,o,o,o,o,o,R,R,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, +o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o, +}; + +#undef B +#undef _ +#undef Y +#undef W +#undef o + diff --git a/archive-sources/yahtzee/yahtzee.c b/archive-sources/yahtzee/yahtzee.c new file mode 100644 index 0000000..14c2e7b --- /dev/null +++ b/archive-sources/yahtzee/yahtzee.c @@ -0,0 +1,758 @@ +/* +** initial coding by fx2 +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "colors.h" +#include "draw.h" +#include "pics.h" +#include "pig.h" +#include "rcinput.h" + +#include + +#define LOGO_X 600 +#define LOGO_Y 30 +#define RC_0 0 +#define RC_1 1 +#define RC_2 2 +#define RC_3 3 +#define RC_4 4 +#define RC_5 5 +#define RC_6 6 +#define RC_7 7 +#define RC_8 8 +#define RC_9 9 + +extern int doexit; + +extern unsigned short actcode; +extern unsigned short realcode; + +typedef struct _HScore +{ + char name[12]; + long points; + char flag; +} HScore; + +typedef struct _Player +{ + char name[16]; + int nums[17]; +} Player; + +static int numplayers=0; +static int actplayer=0; +static Player player[9]; +static char pig_dis = 0; + +static int pig_x[] = { 450, 450, 150, 150 }; + +static int myrand( int idx ) +{ + struct timeval tv; + gettimeofday(&tv,0); + + return tv.tv_usec % idx; +} + +static void DoYellow( void ) +{ + if ( pig_dis ) + { +// Fx2ShowPig( pig_x[actplayer], 300, 176, 144 ); + pig_dis=0; + } + else + { +// Fx2StopPig(); + pig_dis=1; + } +} + +void EnterPlayer( void ) +{ + struct timeval tv; + int y; + int x; + int i; + char cnum[2] = { 48, 0 }; + char txt[10]; + + /* clear screen */ + for( y=0; y < 576; y+=4 ) + { + FBFillRect( 0, y, 720, 4, BLACK ); +#ifdef USEX + FBFlushGrafic(); +#endif + tv.tv_sec = 0; + tv.tv_usec = 1000; + select( 0, 0, 0, 0, &tv ); /* 1ms pause */ + } + FBDrawString( 150, 64, 48, "Yahtzee presented by", WHITE, 0 ); + FBDrawFx2Logo( 200, 112 ); + /* first enter num players */ + if ( numplayers ) + { + x=FBDrawString( 150,200,64,"same player ? : OK / BLUE",RED,0); +#ifdef USEX + FBFlushGrafic(); +#endif + while( realcode != 0xee ) + RcGetActCode(); + + actcode=0xee; + while( !doexit ) + { + RcGetActCode(); + if ( actcode == RC_YELLOW ) + DoYellow(); + + if (( actcode == RC_OK ) || ( actcode == RC_BLUE )) + break; + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0, 0, 0, 0, &tv ); + } + if ( actcode == RC_OK ) + return; + FBFillRect( 150,200,x,64,BLACK); + } + x=FBDrawString( 100,232,64,"how many player (1-4): ",RED,0); +#ifdef USEX + FBFlushGrafic(); +#endif + + while( !doexit ) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0, 0, 0, 0, &tv ); + actcode=0xee; + RcGetActCode(); + if (( actcode >= 1 ) && ( actcode <= 4 )) /* RC_1 .. RC_4 */ + { + numplayers=actcode; + cnum[0]=actcode+48; + break; + } + } + if ( doexit ) + return; + + FBDrawString( 100+x,232,64,cnum,WHITE,0); + + for( i=0; i < numplayers; i++ ) + { + FBFillRect(150,300,570,64,BLACK); + sprintf(txt,"%d. name : ",i+1); + x=FBDrawString( 150,300,64,txt,WHITE,0); + strcpy(player[i].name,FBEnterWord(150+x,300,64,9,WHITE)); + } +} + +static char wu[5] = { 0, 0, 0, 0, 0 }; +static char mwu[5] = { 0, 0, 0, 0, 0 }; +static char ppx[] ={ +29, /* 1 */ +5, 52, /* 2 */ +5, 29, 52, /* 3 */ +5, 5, 52, 52, /* 4 */ +5, 5, 29, 52, 52, /* 5 */ +5, 5, 5, 52, 52, 52, /* 6 */ }; +static char ppy[] ={ +29, /* 1 */ +5, 52, /* 2 */ +5, 29, 52, /* 3 */ +5, 52, 5, 52, /* 4 */ +5, 52, 29, 5, 52, /* 5 */ +5, 29, 52, 5, 29, 52, /* 6 */ }; + +static void Roll( void ) +{ + int i; + int x; + int y; + int n; + int o; + int delta; + + x = actplayer ? 60 + actplayer*150 : 280; + y = 128; + +#if 0 + for( i=0; i < 5; i++ ) + { + FBFillRect( x, y, 64, 64, WHITE ); + y += 68; + } +#endif + + while( !doexit ) + { + for( i=0; i < 5; i++ ) + { + if ( !wu[i] ) + { + mwu[i] = myrand(6)+1; + delta=myrand(60); + for( n=0;n 0 ) + nnr=nr-1; + break; + case RC_DOWN : + if ( nr < 4 ) + nnr=nr+1; + break; + case RC_OK : /* select */ + if ( wu[nr] ) + { + wu[nr] = 0; + y=nr*68+128; + FBDrawRect( x+22,y,63,63,RED ); + FBDrawRect( x+23,y+1,61,61,RED ); + FBDrawRect( x+24,y+2,59,59,RED ); + } + else + { + wu[nr] = mwu[nr]; + y=nr*68+128; + FBDrawRect( x+22,y,63,63,WHITE ); + FBDrawRect( x+23,y+1,61,61,WHITE ); + FBDrawRect( x+24,y+2,59,59,WHITE ); + } + break; + case RC_BLUE : + rdy=1; + break; + } + if ( nr != nnr ) + { + y=nr*68+128; + FBFillRect( x,y+27,16,12,BLACK ); + nr=nnr; + y=nr*68+128; + FBDrawLine( x,y+27,x+15,y+32, RED ); + FBDrawLine( x,y+28,x+13,y+32, RED ); + FBDrawLine( x,y+37,x+15,y+32, RED ); + FBDrawLine( x,y+36,x+13,y+32, RED ); + } +#ifdef USEX + FBFlushGrafic(); +#endif + } + y=nr*68+128; + FBFillRect( x,y+27,16,12,BLACK ); +#ifdef USEX + FBFlushGrafic(); +#endif +} + +static int ScoreOf( int l ) +{ + int i; + int val = 0; + int max = 0; + int cnt[6]; + + if ( l < 6 ) + { + for( i=0; i < 5; i++ ) + if ( mwu[i] == (l+1) ) + val += (l+1); + return val; + } + memset(cnt,0,6*sizeof(int)); + for( i=0; i < 5; i++ ) + { + cnt[ mwu[i]-1 ]++; + if ( cnt[ mwu[i]-1 ] > max ) + max = cnt[ mwu[i]-1 ]; + val += mwu[i]; + } + if ( max==5 && ( player[actplayer].nums[13] > 0 )) + return 50; + switch( l ) + { + case 8 : /* 3 gl. */ + if ( max >= 3 ) + return val; + break; + case 9 : /* 4 gl. */ + if ( max >= 4 ) + return val; + break; + case 10 : /* full house */ + if ( max == 3 ) + { + for( i=0; i < 6; i++ ) + if ( cnt[i] == 2 ) + return 25; + } + break; + case 11 : /* kl.str */ + if (( cnt[0] && cnt[1] && cnt[2] && cnt[3] ) || + ( cnt[1] && cnt[2] && cnt[3] && cnt[4] ) || + ( cnt[2] && cnt[3] && cnt[4] && cnt[5] )) + return 30; + break; + case 12 : /* gr.str */ + if (( cnt[0] && cnt[1] && cnt[2] && cnt[3] && cnt[4] ) || + ( cnt[1] && cnt[2] && cnt[3] && cnt[4] && cnt[5] )) + return 40; + break; + case 13 : /* yahtzee */ + if ( max == 5 ) + return 50; + break; + case 14 : /* chance */ + return val; + } + return 0; +} + +static void SelectInBoard( void ) +{ + struct timeval tv; + time_t t1; + time_t t2=0; + short last=0; + int nr=0; + int nnr=0; + int i = actplayer; + char cnum[ 64 ]; + char rdy=0; + char blocker; + int val=-1; + + t1 = time(0); + + for( nnr=0; nnr<15; nnr++ ) + if ( player[i].nums[nnr] == -1 ) + break; + if ( nnr == 15 ) + nnr=nr; + + nr = -1; + + while( ! (t2 > t1) ) + { + while(( realcode != 0xee ) && !doexit ) + RcGetActCode(); + last=0xee; + t2 = time(0); + } + blocker=0; + while( !doexit && !rdy ) + { + tv.tv_sec=0; + tv.tv_usec=100000; + select(0,0,0,0,&tv); + actcode=0xee; + RcGetActCode(); + if ( realcode == 0xee ) + blocker=0; + if ( blocker && (actcode == last )) + continue; + last=actcode; + blocker=1; + switch( actcode ) + { + case RC_YELLOW : + DoYellow(); + break; + case RC_UP : + for( nnr=nr-1; nnr>-1; nnr-- ) + if ( player[i].nums[nnr] == -1 ) + break; + if ( nnr == -1 ) + nnr=nr; + break; + case RC_DOWN : + for( nnr=nr+1; nnr<15; nnr++ ) + if ( player[i].nums[nnr] == -1 ) + break; + if ( nnr == 15 ) + nnr=nr; + break; + case RC_OK : + player[actplayer].nums[nr] = val; + if ( nr < 6 ) + { + player[actplayer].nums[6] = 0; + for( i=0; i<6; i++ ) + if ( player[actplayer].nums[i] != -1 ) + player[actplayer].nums[6] += player[actplayer].nums[i]; + if ( player[actplayer].nums[6] > 62 ) + player[actplayer].nums[7] = 35; + } + player[actplayer].nums[15] = 0; + for( i=8; i<15; i++ ) + if ( player[actplayer].nums[i] != -1 ) + player[actplayer].nums[15] += player[actplayer].nums[i]; + player[actplayer].nums[16] = player[actplayer].nums[15]+ + player[actplayer].nums[6]+ + player[actplayer].nums[7]; + + rdy=1; + break; + } + if ( nnr != nr ) + { + if ( nr != -1 ) + FBFillRect( 126+30+i*150, 62+28*nr, 100, 28, BLACK ); + + nr=nnr; + + val=ScoreOf(nr); + if ( val ) + sprintf(cnum," %d ",val); + else + sprintf(cnum," --- "); + FBFillRect( 126+30+i*150, 62+28*nr, 100, 28, WHITE ); + FBDrawString( 126+30+i*150, 62+28*nr, 32, cnum, RED, 0 ); + } +#ifdef USEX + FBFlushGrafic(); +#endif + } + actplayer++; + if ( actplayer == numplayers ) + actplayer=0; +} + +void RunYahtzee( void ) +{ + struct timeval tv; + int y; + int i; + int n; + char cnum[ 64 ]; + + /* clear screen */ + for( y=0; y < 576; y+=4 ) + { + FBFillRect( 0, y, 720, 4, BLACK ); +#ifdef USEX + FBFlushGrafic(); +#endif + tv.tv_sec = 0; + tv.tv_usec = 1000; + select( 0, 0, 0, 0, &tv ); /* 1ms pause */ + } + + /* init values */ + for( i=0; i < numplayers; i++ ) + { + for( n=0; n<15; n++ ) + player[i].nums[n]=-1; + player[i].nums[6] = 0; + player[i].nums[7] = 0; + player[i].nums[15] = 0; + player[i].nums[16] = 0; + } + + /* draw board */ + FBDrawString( 36, 62, 32, "1",WHITE,0); + FBDrawString( 36, 90, 32, "2",WHITE,0); + FBDrawString( 36, 118, 32, "3",WHITE,0); + FBDrawString( 36, 146, 32, "4",WHITE,0); + FBDrawString( 36, 174, 32, "5",WHITE,0); + FBDrawString( 36, 202, 32, "6",WHITE,0); + FBDrawString( 36, 230, 32, "total",WHITE,0); + FBDrawString( 36, 258, 32, "Bonus",WHITE,0); + FBDrawString( 36, 286, 32, "3of a kind",WHITE,0); + FBDrawString( 36, 314, 32, "4of a kind",WHITE,0); + FBDrawString( 36, 342, 32, "FullHouse",WHITE,0); + FBDrawString( 36, 370, 32, "Sm. street",WHITE,0); + FBDrawString( 36, 398, 32, "Lg. street",WHITE,0); + FBDrawString( 36, 426, 32, "Yahtzee",WHITE,0); + FBDrawString( 36, 454, 32, "Chance",WHITE,0); + FBDrawString( 36, 482, 32, "total",WHITE,0); + FBDrawString( 36, 510, 32, "Summary",WHITE,0); + + actplayer=0; + + doexit=0; + while( !doexit ) + { + FBFillRect( 126, 0, 720-126, 576, BLACK ); + + for( i=0; i < numplayers; i++ ) + { + FBFillRect( 126+i*150, 30, 2, 512, WHITE ); + FBDrawString( 136+i*150, 30, 32, player[i].name, + WHITE, + i==actplayer?RED:BLACK ); + for( n=0; n<17; n++ ) + { + if ( player[i].nums[n] != -1 ) + { + if ( player[i].nums[n] || + ( n==6 ) || ( n==15 ) || (n==16)) + sprintf(cnum,"%d",player[i].nums[n]); + else + strcpy(cnum," - "); + FBDrawString( 126+30+i*150, 62+28*n, 32, cnum, WHITE, 0 ); + } + } + } + for( n=0; n<17; n++ ) + { + if ( player[actplayer].nums[n] == -1 ) + break; + } + if ( n==17 ) + return; + + if ( !pig_dis ) +// Fx2ShowPig( pig_x[actplayer], 300, 176, 144 ); + + memset(wu,0,5); /* mark all wuerfel for roll */ + memset(mwu,0,5); /* mark all wuerfel for roll */ + for( n=0; n < 3 && !doexit; n++ ) + { + Roll(); + memcpy(wu,mwu,5); + if (( n < 2 ) && !doexit ) + SelectForRoll(); + for( i=0; i < 5 ; i++ ) + if ( wu[i] == 0 ) + break; + if ( i==5 ) + break; + } + if ( doexit ) + return; + SelectInBoard(); + +#ifdef USEX + FBFlushGrafic(); +#endif + while(( realcode != 0xee ) && !doexit ) + RcGetActCode( ); + actcode=0xee; + } +} + +void DrawWinner( void ) +{ + struct timeval tv; + char text[ 64 ]; + int w=0; + int i; + int n; + HScore hsc[8]; + int fd; + +// Fx2StopPig(); + + if ( numplayers == 1 ) + { + FBFillRect( 180, 180, 400, 180, WHITE ); + + sprintf(text,"%d points !",player[0].nums[16] ); + FBDrawString( 300, 232, 64, text, RED, 0 ); + } + else + { + FBFillRect( 180, 180, 450, 180, WHITE ); + + for( i=1; i player[w].nums[16] ) + w=i; + sprintf(text,"Winner is %s",player[w].name); + FBDrawString( 200, 200, 64, text, RED, 0 ); + sprintf(text,"with %d points",player[w].nums[16] ); + FBDrawString( 200, 264, 64, text, RED, 0 ); + } +#ifdef USEX + FBFlushGrafic(); +#endif + +/* load HScore */ + fd = open( GAMESDIR "/yahtzee.hscore", O_RDONLY ); + if ( fd == -1 ) + { + mkdir( GAMESDIR, 567 ); + for( i=0;i<8;i++) + { + strcpy(hsc[i].name,"-"); + hsc[i].points=0; + hsc[i].flag=0; + } + } + else + { + read( fd, hsc, sizeof(hsc) ); + close(fd); + for( i=0;i<8;i++) + hsc[i].flag=0; + } + +/* insert into hscore */ + for( n=0; n < numplayers; n++ ) + { + for( i=0; i<8; i++ ) + if ( player[n].nums[16] > hsc[i].points ) + break; + if ( i==8 ) + continue; + if ( i < 7 ) + memmove( hsc+i+1,hsc+i,sizeof(HScore)*(7-i) ); + strcpy(hsc[i].name,player[n].name); + hsc[i].points=player[n].nums[16]; + hsc[i].flag=1; + } +/* save hscore */ + fd = open( GAMESDIR "/yahtzee.hscore", O_CREAT|O_WRONLY, 438 ); + if ( fd != -1 ) + { + write( fd, hsc, sizeof(hsc) ); + close(fd); + } + + while( realcode != 0xee ) + RcGetActCode(); + + actcode=0xee; + i=50; + while( !doexit && ( i>0 )) + { + RcGetActCode(); + if ( actcode == RC_OK ) + break; + tv.tv_sec = 0; + tv.tv_usec = 200000; + select( 0, 0, 0, 0, &tv ); + i--; + } + +/* show hscore */ + FBFillRect( 0, 0, 720, 576, BLACK ); + + FBDrawString( 220, 32, 64, "HighScore", RED, BLACK ); + for( i=0; i<8; i++ ) + { + if ( hsc[i].flag ) + FBFillRect( 88, 120+i*48, 8, 8, YELLOW ); + FBDrawString( 100, 100+i*48, 48, hsc[i].name, WHITE, 0 ); + sprintf(text,"%ld",hsc[i].points); + n = FBDrawString( 400, 100+i*48, 48, text, BLACK, BLACK ); + FBDrawString( 500-n, 100+i*48, 48, text, WHITE, BLACK ); + } +#ifdef USEX + FBFlushGrafic(); +#endif + + while( realcode != 0xee ) + RcGetActCode(); + + actcode=0xee; + i=0; + while( !doexit ) + { + RcGetActCode(); + if ( actcode == RC_OK ) + break; + tv.tv_sec = 0; + tv.tv_usec = 100000; + select( 0, 0, 0, 0, &tv ); + i++; + if ( i==50 ) + { + FBDrawString( 190, 480, 48, "press OK for new game",GRAY,0); +#ifdef USEX + FBFlushGrafic(); +#endif + } + } +} diff --git a/archive-sources/yahtzee/yahtzee.cfg b/archive-sources/yahtzee/yahtzee.cfg new file mode 100644 index 0000000..5ff3f6e --- /dev/null +++ b/archive-sources/yahtzee/yahtzee.cfg @@ -0,0 +1,8 @@ +pluginversion=1 +name=Yahtzee +desc=a game for 1-4 player +depend=libfx2.so +type=1 +needfb=1 +needrc=1 +needlcd=0 diff --git a/archive-sources/yahtzee/yahtzee.h b/archive-sources/yahtzee/yahtzee.h new file mode 100644 index 0000000..9132b6d --- /dev/null +++ b/archive-sources/yahtzee/yahtzee.h @@ -0,0 +1,8 @@ +#ifndef YAHTZEE_H +#define YAHTZEE_H + +extern void EnterPlayer( void ); +extern void RunYahtzee( void ); +extern void DrawWinner( void ); + +#endif diff --git a/config b/config index 98a162d..1e07554 100755 --- a/config +++ b/config @@ -50,3 +50,8 @@ MULTIMEDIA=no # LCD4LINUX=yes # LCD4LINUX=no LCD4LINUX=no + +# if you want to build games, define GAMES=yes: +# GAMES=yes +# GAMES=no +GAMES=no diff --git a/make/applications.mk b/make/applications.mk index 3b1938c..38af665 100755 --- a/make/applications.mk +++ b/make/applications.mk @@ -440,6 +440,82 @@ $(D)/motion: $(ARCHIVE)/motion-3.2.12.tar.gz | $(TARGETPREFIX) $(REMOVE)/motion-3.2.12 touch $@ +$(D)/djmount: $(D)/fuse $(ARCHIVE)/djmount-0.71.tar.gz | $(TARGETPREFIX) + $(UNTAR)/djmount-0.71.tar.gz + pushd $(BUILD_TMP)/djmount-0.71 && \ + $(PATCH)/djmount-0.71.diff && \ + CFLAGS="-I$(TARGETPREFIX)/include" \ + LDFLAGS="-L$(TARGETPREFIX)/lib -lz" \ + LIBS="-Wl,--rpath-link -Wl,$(TARGETPREFIX)/lib" \ + ./configure -C prefix=$(TARGETPREFIX) --with-fuse-prefix=$(TARGETPREFIX) --build=$(BUILD) --host=$(TARGET) && \ + $(MAKE) && \ + $(MAKE) install && \ + $(REMOVE)/djmount-0.71 + touch $@ + +$(D)/fuse: $(ARCHIVE)/fuse-2.9.2.tar.gz | $(TARGETPREFIX) + $(UNTAR)/fuse-2.9.2.tar.gz + pushd $(BUILD_TMP)/fuse-2.9.2 && \ + $(CONFIGURE) --prefix= --build=$(BUILD) --host=$(TARGET) && \ + $(MAKE) && \ + $(MAKE) install DESTDIR=$(TARGETPREFIX) && \ + $(REWRITE_PKGCONF) $(PKG_CONFIG_PATH)/fuse.pc + $(REMOVE)/fuse-2.9.2 + touch $@ + +$(D)/ushare: $(D)/libupnp $(ARCHIVE)/ushare-1.1a.tar.bz2 | $(TARGETPREFIX) + $(UNTAR)/ushare-1.1a.tar.bz2 + pushd $(BUILD_TMP)/ushare-1.1a && \ + $(PATCH)/ushare1.1a.diff && \ + PKG_CONFIG_PATH="$(TARGETPREFIX)/lib/pkgconfig" \ + CFLAGS="-I$(TARGETPREFIX)/include/ -I$(TARGETPREFIX)/include/upnp" \ + LDFLAGS="-L$(TARGETPREFIX)/lib -lz" \ + ./configure --prefix=$(TARGETPREFIX) --cross-prefix=$(TARGET)- --cross-compile --with-libupnp-dir=$(TARGETPREFIX)/lib/ --disable-dlna && \ + sed -i config.h -e 's@SYSCONFDIR.*@SYSCONFDIR "/etc"@' && \ + sed -i config.h -e 's@LOCALEDIR.*@LOCALEDIR "/share"@' && \ + cp $(BUILD_TMP)/ushare-1.1a/config.h $(BUILD_TMP)/ushare-1.1a/src/config.h && \ + $(MAKE) && \ + $(MAKE) install && \ + cp $(BUILD_TMP)/ushare-1.1a/scripts/ushare.conf $(TARGETPREFIX)/etc/ushare.conf + $(REMOVE)/ushare-1.1a + touch $@ + +$(D)/libupnp: $(ARCHIVE)/libupnp-1.6.17.tar.bz2 | $(TARGETPREFIX) + $(UNTAR)/libupnp-1.6.17.tar.bz2 + pushd $(BUILD_TMP)/libupnp-1.6.17 && \ + $(CONFIGURE) --prefix= --build=$(BUILD) --host=$(TARGET) && \ + $(MAKE) && \ + $(MAKE) install DESTDIR=$(TARGETPREFIX) && \ + $(REWRITE_PKGCONF) $(PKG_CONFIG_PATH)/libupnp.pc + $(REMOVE)/libupnp-1.6.17 + touch $@ + +$(D)/xupnpd: $(D)/udpxy | $(TARGETPREFIX) + set -e; cd $(BUILD_TMP); \ + rm -rf xupnpd; \ + svn co http://tsdemuxer.googlecode.com/svn/trunk/xupnpd xupnpd; \ + pushd $(BUILD_TMP)/xupnpd/src && \ + $(PATCH)/xupnpd_cst.diff; \ + $(MAKE) CST && \ + cp -f $(BUILD_TMP)/xupnpd/src/xupnpd $(TARGETPREFIX)/bin/ && \ + mkdir -p $(TARGETPREFIX)/share/xupnpd/ && \ + cp -rf $(BUILD_TMP)/xupnpd/src/playlists $(TARGETPREFIX)/share/xupnpd/ && \ + cp -rf $(BUILD_TMP)/xupnpd/src/plugins $(TARGETPREFIX)/share/xupnpd/ && \ + cp -rf $(BUILD_TMP)/xupnpd/src/profiles $(TARGETPREFIX)/share/xupnpd/ && \ + cp -rf $(BUILD_TMP)/xupnpd/src/www $(TARGETPREFIX)/share/xupnpd/ && \ + cp -rf $(BUILD_TMP)/xupnpd/src/ui $(TARGETPREFIX)/share/xupnpd/ && \ + cp -f $(BUILD_TMP)/xupnpd/src/*.lua $(TARGETPREFIX)/share/xupnpd/ && \ + $(REMOVE)/xupnpd + touch $@ + +$(D)/udpxy: $(ARCHIVE)/udpxy.1.0.23-7-prod.tar.gz | $(TARGETPREFIX) + $(UNTAR)/udpxy.1.0.23-7-prod.tar.gz + pushd $(BUILD_TMP)/udpxy-1.0.23-7 && \ + $(MAKE) CC=$(TARGET)-gcc&& \ + cp -f $(BUILD_TMP)/udpxy-1.0.23-7/udpxy $(TARGETPREFIX)/bin/ && \ + $(REMOVE)/udpxy-1.0.23-7 + touch $@ + $(D)/inadyn: $(ARCHIVE)/inadyn-1.99.3.tar.bz2 | $(TARGETPREFIX) $(UNTAR)/inadyn-1.99.3.tar.bz2 pushd $(BUILD_TMP)/inadyn-1.99.3 && \ diff --git a/make/archives.mk b/make/archives.mk index 79b147f..0d1625e 100755 --- a/make/archives.mk +++ b/make/archives.mk @@ -138,6 +138,21 @@ $(ARCHIVE)/motion-3.2.12.tar.gz: $(ARCHIVE)/sdparm-1.08.tar.gz: $(WGET) http://www.fhloston-paradise.de/sdparm-1.08.tar.gz +$(ARCHIVE)/djmount-0.71.tar.gz: + $(WGET) http://www.fhloston-paradise.de/djmount-0.71.tar.gz + +$(ARCHIVE)/fuse-2.9.2.tar.gz: + $(WGET) http://www.fhloston-paradise.de/fuse-2.9.2.tar.gz + +$(ARCHIVE)/libupnp-1.6.17.tar.bz2: + $(WGET) http://www.fhloston-paradise.de/libupnp-1.6.17.tar.bz2 + +$(ARCHIVE)/ushare-1.1a.tar.bz2: + $(WGET) http://www.fhloston-paradise.de/ushare-1.1a.tar.bz2 + +$(ARCHIVE)/udpxy.1.0.23-7-prod.tar.gz: + $(WGET) http://www.fhloston-paradise.de/udpxy.1.0.23-7-prod.tar.gz + $(ARCHIVE)/inadyn-1.99.3.tar.bz2: $(WGET) http://www.fhloston-paradise.de/inadyn-1.99.3.tar.bz2 diff --git a/make/libraries.mk b/make/libraries.mk index 5e60673..e002397 100755 --- a/make/libraries.mk +++ b/make/libraries.mk @@ -235,6 +235,7 @@ $(D)/ffmpeg: | $(TARGETPREFIX) --enable-demuxer=matroska \ --enable-demuxer=flv \ --enable-demuxer=rm \ + --enable-demuxer=rtsp \ --disable-encoders \ --disable-muxers \ --disable-ffplay \ @@ -245,9 +246,15 @@ $(D)/ffmpeg: | $(TARGETPREFIX) --disable-protocols \ --enable-protocol=file \ --enable-protocol=http \ + --enable-protocol=rtmp \ + --enable-protocol=rtmpe \ + --enable-protocol=rtmps \ + --enable-protocol=rtmpte \ + --enable-protocol=rtp \ --enable-bsfs \ --disable-devices \ --enable-swresample \ + --enable-avresample \ --disable-postproc \ --disable-swscale \ --disable-mmx \ diff --git a/make/neutrino.mk b/make/neutrino.mk index da3d587..e2c4c86 100755 --- a/make/neutrino.mk +++ b/make/neutrino.mk @@ -27,15 +27,17 @@ $(D)/neutrino-hd-nevis: $(NEUTRINO_OBJDIR)/config-nevis.status $(MAKE) -C $(NEUTRINO_OBJDIR) all $(MAKE) -C $(NEUTRINO_OBJDIR) install DESTDIR=$(TARGETPREFIX) $(MAKE) $(TARGETPREFIX)/.version + cp -a $(BUILD_TMP)/neutrino-hd/config.h $(TARGETPREFIX)/include/config.h touch $@ $(D)/neutrino-hd-apollo: $(NEUTRINO_OBJDIR)/config-apollo.status $(MAKE) -C $(NEUTRINO_OBJDIR) all $(MAKE) -C $(NEUTRINO_OBJDIR) install DESTDIR=$(TARGETPREFIX) $(MAKE) $(TARGETPREFIX)/.version + cp -a $(BUILD_TMP)/neutrino-hd/config.h $(TARGETPREFIX)/include/config.h touch $@ -$(NEUTRINO_OBJDIR)/config-nevis.status: libraries-int +$(NEUTRINO_OBJDIR)/config-nevis.status: $(D)/neutrino-hd-libs test -d $(NEUTRINO_OBJDIR) || mkdir -p $(NEUTRINO_OBJDIR) $(SOURCE_DIR)/neutrino-hd/autogen.sh pushd $(NEUTRINO_OBJDIR) && \ @@ -45,7 +47,7 @@ $(NEUTRINO_OBJDIR)/config-nevis.status: libraries-int $(SOURCE_DIR)/neutrino-hd/configure --host=$(TARGET) --build=$(BUILD) --prefix= \ --enable-maintainer-mode --with-target=cdk --with-targetprefix= --with-boxmodel=nevis --enable-flac --enable-pip --enable-ffmpegdec --enable-lua -$(NEUTRINO_OBJDIR)/config-apollo.status: libraries-int +$(NEUTRINO_OBJDIR)/config-apollo.status: $(D)/neutrino-hd-libs test -d $(NEUTRINO_OBJDIR) || mkdir -p $(NEUTRINO_OBJDIR) $(SOURCE_DIR)/neutrino-hd/autogen.sh pushd $(NEUTRINO_OBJDIR) && \ @@ -64,5 +66,6 @@ $(TARGETPREFIX)/.version: $(TARGETPREFIX)/bin/neutrino echo "forum=http://www.dbox2world.net" >> $@ echo "builddate=`cd $(SOURCE_DIR)/neutrino-hd && git log | grep "^commit" | wc -l` vom `date --reference=$(SOURCE_DIR)/neutrino-hd/.git`" >> $@ -libraries-int: +$(D)/neutrino-hd-libs: $(MAKE) $(D)/libmad $(D)/libid3tag $(D)/libungif $(D)/openssl $(D)/libcurl $(D)/freetype $(D)/libjpeg $(D)/libboost $(D)/dvbsi $(D)/libflac $(D)/ffmpeg $(D)/libvorbis $(D)/openthreads $(D)/luaposix + touch $@ diff --git a/make/plugins.mk b/make/plugins.mk index 2ed227a..47e16e3 100644 --- a/make/plugins.mk +++ b/make/plugins.mk @@ -35,6 +35,7 @@ $(D)/rcsim: $(D)/blockads: mkdir -p $(LIBPLUG) && \ + mkdir -p $(BIN) && \ mkdir -p $(VARCONF) && \ cp -a $(GIT_PLUGINS)/blockads $(BUILD_TMP)/ && \ pushd $(BUILD_TMP)/blockads && \ @@ -217,6 +218,7 @@ $(D)/shellexec: $(D)/tuxcal: $(D)/freetype mkdir -p $(LIBPLUG) && \ + mkdir -p $(BIN) && \ mkdir -p $(VARCONF)/tuxcal && \ cp -a $(GIT_PLUGINS)/tuxcal $(BUILD_TMP)/ && \ pushd $(BUILD_TMP)/tuxcal && \ @@ -242,6 +244,7 @@ $(D)/tuxcom: $(D)/freetype $(D)/tuxmail: $(D)/freetype mkdir -p $(LIBPLUG) && \ + mkdir -p $(BIN) && \ mkdir -p $(VARCONF)/tuxmail && \ cp -a $(GIT_PLUGINS)/tuxmail $(BUILD_TMP)/ && \ pushd $(BUILD_TMP)/tuxmail && \ @@ -256,8 +259,8 @@ $(D)/tuxmail: $(D)/freetype touch $@ $(D)/tuxwetter: $(D)/freetype - mkdir -p $(BIN) && \ mkdir -p $(LIBPLUG) && \ + mkdir -p $(BIN) && \ mkdir -p $(VARCONF)/tuxwetter && \ cp -a $(GIT_PLUGINS)/tuxwetter $(BUILD_TMP)/ && \ pushd $(BUILD_TMP)/tuxwetter && \ @@ -286,6 +289,161 @@ $(D)/sdparm: $(ARCHIVE)/sdparm-1.08.tar.gz | $(TARGETPREFIX) $(REMOVE)/sdparm-1.08 touch $@ +$(D)/libfx2: $(D)/freetype + cp -a $(SOURCE)/libfx2 $(BUILD_TMP)/ && \ + cp -a $(SOURCE)/libfx2 $(TARGETPREFIX)/include/ && \ + pushd $(BUILD_TMP)/libfx2 && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -shared -fpic -o $(BUILD_TMP)/libfx2/libfx2.so draw.c math.c rcinput.c + cp -f $(BUILD_TMP)/libfx2/libfx2.so $(TARGETPREFIX)/lib/ + rm -rf $(BUILD_TMP)/libfx2 + touch $@ + +$(D)/snake: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/snake $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/snake && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/snake/snake.so snake.c somain.c + cp -f $(BUILD_TMP)/snake/snake.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/snake/snake.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/snake + touch $@ + +$(D)/sol: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/sol $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/sol && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/sol/sol.so solboard.c somain.c + cp -f $(BUILD_TMP)/sol/sol.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/sol/sol.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/sol + touch $@ + +$(D)/pac: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/pac $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/pac && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/pac/pacman.so maze.c somain.c + cp -f $(BUILD_TMP)/pac/pacman.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/pac/pacman.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/pac + touch $@ + +$(D)/tank: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/tank $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/tank && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/tank/tank.so board.c somain.c + cp -f $(BUILD_TMP)/tank/tank.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/tank/tank.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/tank + touch $@ + +$(D)/mines: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/mines $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/mines && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/mines/mines.so board.c somain.c + cp -f $(BUILD_TMP)/mines/mines.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/mines/mines.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/mines + touch $@ + +$(D)/master: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/master $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/master && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/master/master.so board.c somain.c + cp -f $(BUILD_TMP)/master/master.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/master/master.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/master + touch $@ + +$(D)/tetris: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/tetris $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/tetris && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -lfreetype -lz -O2 -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/tetris/tetris.so board.c somain.c + cp -f $(BUILD_TMP)/tetris/tetris.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/tetris/tetris.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/tetris + touch $@ + +$(D)/vierg: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/vierg $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/vierg && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/vierg/vierg.so board.c somain.c + cp -f $(BUILD_TMP)/vierg/vierg.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/vierg/vierg.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/vierg + touch $@ + +#broken +$(D)/yahtzee: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/yahtzee $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/yahtzee && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/yahtzee/yahtzee.so yahtzee.c somain.c + cp -f $(BUILD_TMP)/yahtzee/yahtzee.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/yahtzee/yahtzee.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/yahtzee + touch $@ + +#broken +$(D)/sokoban: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/sokoban $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/sokoban && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/sokoban/soko.so board.c somain.c + cp -f $(BUILD_TMP)/sokoban/soko.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/sokoban/soko.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/sokoban + touch $@ + +#broken +$(D)/sudoku: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/sudoku $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/sudoku && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/sudoku/sudoku.so board.cpp menu.cpp misc.cpp somain.cpp sudoku.cpp + cp -f $(BUILD_TMP)/sudoku/sudoku.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/sudoku/sudoku.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/sudoku + touch $@ + +#broken +$(D)/lemm: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/lemm $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/lemm && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/lemm/lemmings.so lemm.c double.c pic.c sound.c sprite.c somain.c + cp -f $(BUILD_TMP)/lemm/lemmings.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/lemm/lemmings.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/lemm + touch $@ + +#broken +$(D)/solitair: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/solitair $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/solitair && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/solitair/solitair.so backbuffer.cpp Block.cpp Buffer.cpp Card.cpp Foundation.cpp Hand.cpp pnm_file.cpp pnm_res.cpp rle.cpp Slot.cpp Table.cpp Tableau.cpp Wastepile.cpp somain.cpp + cp -f $(BUILD_TMP)/solitair/solitair.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/solitair/solitair.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/solitair + touch $@ + +#broken +$(D)/c64emu: $(D)/libfx2 + mkdir -p $(LIBPLUG) && \ + cp -a $(SOURCE)/c64emu $(BUILD_TMP)/ && \ + pushd $(BUILD_TMP)/c64emu && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include -I$(TARGETPREFIX)/include/freetype2 -I$(TARGETPREFIX)/include/libfx2 -O2 -lfreetype -lz -ljpeg -lpng -lungif -lfx2 -o $(BUILD_TMP)/c64emu/c64emu.so 1541d64.cpp 1541job.cpp C64.cpp VIC.cpp CmdPipe.cpp CPUC64.cpp SID.cpp 1541fs.cpp 1541t64.cpp main.cpp CIA.cpp CPU1541.cpp CPU_common.cpp Display.cpp Prefs.cpp REU.cpp SAM.cpp vga.c + cp -f $(BUILD_TMP)/c64emu/c64emu.so $(LIBPLUG)/ + cp -f $(BUILD_TMP)/c64emu/c64emu.cfg $(LIBPLUG)/ + rm -rf $(BUILD_TMP)/c64emu + touch $@ + $(D)/boerse: mkdir -p $(LIBPLUG) && \ pushd $(SOURCE)/boerse && \ diff --git a/skel-root/etc/init.d/rcS.local b/skel-root/etc/init.d/rcS.local index 85073a6..b4a234c 100755 --- a/skel-root/etc/init.d/rcS.local +++ b/skel-root/etc/init.d/rcS.local @@ -15,3 +15,18 @@ fi if [ -e /var/etc/.lcd4linux ]; then /var/lcd/lcdrun.sh & fi + +#djmount starten +if [ -e /var/etc/.djmount ]; then + /bin/djmount -o iocharset=utf8 /media/00upnp & +fi + +#ushare starten +if [ -e /var/etc/.ushare ]; then + /bin/ushare -D & +fi + +#xupnpd starten +if [ -e /var/etc/.xupnpd ]; then + /bin/xupnpd & +fi -- 2.39.5