aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Page2008-05-28 20:30:20 +0000
committerChristopher Page2008-05-28 20:30:20 +0000
commit8297ead2671e43963098a3dc41e8e75fdbce4ddc (patch)
tree72b0e2bb7d03e461cc157ea5f093261ab902fbfb
parent3c0e72bb25f83120f0320782793af64213cbd1c2 (diff)
parent057af1000f5187a93fc1ac1a5f61a7a6a382bf03 (diff)
downloadscummvm-rg350-8297ead2671e43963098a3dc41e8e75fdbce4ddc.tar.gz
scummvm-rg350-8297ead2671e43963098a3dc41e8e75fdbce4ddc.tar.bz2
scummvm-rg350-8297ead2671e43963098a3dc41e8e75fdbce4ddc.zip
Merged revisions 32124,32126-32128,32131,32133,32135-32144,32146-32153,32155-32163,32165-32168,32170-32173,32175-32179,32181-32191,32193-32202,32204-32205,32209-32214,32216,32218,32220-32235,32237-32266,32269-32271,32273-32290,32292-32295,32297-32317,32319-32323,32325-32328,32330-32331,32334-32338,32343-32347 via svnmerge from
https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk svn-id: r32350
-rw-r--r--NEWS1
-rw-r--r--backends/fs/gp32/gp32-fs-factory.cpp42
-rw-r--r--backends/fs/gp32/gp32-fs-factory.h51
-rw-r--r--backends/fs/gp32/gp32-fs.cpp256
-rw-r--r--backends/midi/coreaudio.cpp11
-rw-r--r--backends/midi/quicktime.cpp18
-rw-r--r--backends/module.mk1
-rw-r--r--backends/platform/PalmOS/Src/be_base.cpp9
-rw-r--r--backends/platform/PalmOS/Src/be_base.h3
-rw-r--r--backends/platform/PalmOS/Src/be_save.cpp76
-rw-r--r--backends/platform/PalmOS/Src/be_save.h36
-rw-r--r--backends/platform/PalmOS/Src/extend.cpp2
-rw-r--r--backends/platform/PalmOS/Src/prefixes/native_kyra.h2
-rwxr-xr-xbackends/platform/PalmOS/Src/prefixes/native_m4.h7
-rwxr-xr-xbackends/platform/PalmOS/Src/prefixes/native_made.h7
-rw-r--r--backends/platform/PalmOS/Src/prefixes/native_sword1.h2
-rw-r--r--backends/platform/ds/arm9/makefile33
-rw-r--r--backends/platform/ds/arm9/source/adpcm_arm.s6
-rw-r--r--backends/platform/ds/arm9/source/blitters.cpp108
-rw-r--r--backends/platform/ds/arm9/source/blitters.h10
-rw-r--r--backends/platform/ds/arm9/source/blitters.s28
-rw-r--r--backends/platform/ds/arm9/source/blitters_arm.s15
-rw-r--r--backends/platform/ds/arm9/source/cdaudio.cpp168
-rw-r--r--backends/platform/ds/arm9/source/cdaudio.h2
-rw-r--r--backends/platform/ds/arm9/source/console2.h4
-rw-r--r--backends/platform/ds/arm9/source/dsmain.cpp835
-rw-r--r--backends/platform/ds/arm9/source/dsmain.h104
-rw-r--r--backends/platform/ds/arm9/source/dsoptions.cpp103
-rw-r--r--backends/platform/ds/arm9/source/dsoptions.h10
-rw-r--r--backends/platform/ds/arm9/source/fat/disc_io.c68
-rw-r--r--backends/platform/ds/arm9/source/fat/disc_io.h6
-rw-r--r--backends/platform/ds/arm9/source/fat/gba_nds_fat.c526
-rw-r--r--backends/platform/ds/arm9/source/fat/gba_nds_fat.h30
-rw-r--r--backends/platform/ds/arm9/source/fat/io_dldi.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_dldi.s16
-rw-r--r--backends/platform/ds/arm9/source/fat/io_efa2.c28
-rw-r--r--backends/platform/ds/arm9/source/fat/io_fcsr.c16
-rw-r--r--backends/platform/ds/arm9/source/fat/io_fcsr.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3_common.c10
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3_common.h6
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3cf.c54
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3cf.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3sd.c4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_m3sd_asm.s26
-rw-r--r--backends/platform/ds/arm9/source/fat/io_mmcf.c26
-rw-r--r--backends/platform/ds/arm9/source/fat/io_mmcf.h2
-rw-r--r--backends/platform/ds/arm9/source/fat/io_mpcf.c52
-rw-r--r--backends/platform/ds/arm9/source/fat/io_mpcf.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_njsd.c84
-rw-r--r--backends/platform/ds/arm9/source/fat/io_njsd.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_nmmc.c62
-rw-r--r--backends/platform/ds/arm9/source/fat/io_nmmc.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_sccf.c2
-rw-r--r--backends/platform/ds/arm9/source/fat/io_sccf.h4
-rw-r--r--backends/platform/ds/arm9/source/fat/io_scsd.c10
-rw-r--r--backends/platform/ds/arm9/source/fat/io_scsd.h8
-rw-r--r--backends/platform/ds/arm9/source/fat/io_scsd_asm.s112
-rw-r--r--backends/platform/ds/arm9/source/fat/io_sd_common.c60
-rw-r--r--backends/platform/ds/arm9/source/fat/io_sd_common.h10
-rw-r--r--backends/platform/ds/arm9/source/gbampsave.cpp73
-rw-r--r--backends/platform/ds/arm9/source/gbampsave.h23
-rw-r--r--backends/platform/ds/arm9/source/keys.cpp16
-rw-r--r--backends/platform/ds/arm9/source/osystem_ds.cpp178
-rw-r--r--backends/platform/ds/arm9/source/osystem_ds.h33
-rw-r--r--backends/platform/ds/arm9/source/portdefs.cpp2
-rw-r--r--backends/platform/ds/arm9/source/portdefs.h4
-rw-r--r--backends/platform/ds/arm9/source/ramsave.cpp85
-rw-r--r--backends/platform/ds/arm9/source/ramsave.h44
-rw-r--r--backends/platform/ds/arm9/source/scummconsole.c76
-rw-r--r--backends/platform/ds/arm9/source/scummconsole.h2
-rw-r--r--backends/platform/ds/arm9/source/scummhelp.cpp2
-rw-r--r--backends/platform/ds/arm9/source/scummhelp.h4
-rw-r--r--backends/platform/ds/arm9/source/touchkeyboard.cpp145
-rw-r--r--backends/platform/ds/arm9/source/touchkeyboard.h2
-rw-r--r--backends/platform/ds/arm9/source/wordcompletion.cpp16
-rw-r--r--backends/platform/ds/arm9/source/zipreader.cpp66
-rw-r--r--backends/platform/ds/arm9/source/zipreader.h16
-rw-r--r--backends/platform/gp32/Makefile187
-rw-r--r--backends/platform/gp32/README.GP321
-rw-r--r--backends/platform/gp32/debug-gdbstub-usb.cpp1927
-rw-r--r--backends/platform/gp32/fontdata.c284
-rw-r--r--backends/platform/gp32/gfx_splash.h4870
-rw-r--r--backends/platform/gp32/globals.h44
-rw-r--r--backends/platform/gp32/gp32_launcher.cpp190
-rw-r--r--backends/platform/gp32/gp32_launcher.h35
-rw-r--r--backends/platform/gp32/gp32_main.cpp93
-rw-r--r--backends/platform/gp32/gp32_osys.cpp792
-rw-r--r--backends/platform/gp32/gp32_osys.h155
-rw-r--r--backends/platform/gp32/gp32std.cpp336
-rw-r--r--backends/platform/gp32/gp32std.h61
-rw-r--r--backends/platform/gp32/gp32std_file.cpp320
-rw-r--r--backends/platform/gp32/gp32std_file.h61
-rw-r--r--backends/platform/gp32/gp32std_grap.cpp148
-rw-r--r--backends/platform/gp32/gp32std_grap.h47
-rw-r--r--backends/platform/gp32/gp32std_input.cpp210
-rw-r--r--backends/platform/gp32/gp32std_input.h53
-rw-r--r--backends/platform/gp32/gp32std_memory.cpp318
-rw-r--r--backends/platform/gp32/gp32std_memory.h35
-rw-r--r--backends/platform/gp32/gp32std_sound.cpp187
-rw-r--r--backends/platform/gp32/gp32std_sound.h48
-rw-r--r--backends/platform/gp32/gp_asmlib.s426
-rw-r--r--backends/platform/gp32/gp_clipped.c101
-rw-r--r--backends/platform/gp32/gpmad/readme.txt1
-rw-r--r--backends/platform/gp32/gptremor/readme.txt1
-rw-r--r--backends/platform/gp32/memcpy.S498
-rw-r--r--backends/platform/gp32/minilzo/readme.txt1
-rw-r--r--backends/platform/gp32/portdefs.h117
-rw-r--r--backends/platform/gp32/scummvm.bmpbin2104 -> 0 bytes
-rw-r--r--backends/platform/gp32/startup.c122
-rw-r--r--backends/platform/sdl/sdl.cpp6
-rw-r--r--backends/platform/wince/CELauncherDialog.cpp2
-rw-r--r--base/commandLine.cpp11
-rw-r--r--base/main.cpp9
-rw-r--r--base/plugins.cpp26
-rw-r--r--base/plugins.h15
-rw-r--r--common/advancedDetector.h2
-rw-r--r--common/file.h6
-rw-r--r--common/hashmap.h1
-rw-r--r--common/system.cpp18
-rw-r--r--common/system.h10
-rw-r--r--common/util.cpp104
-rw-r--r--common/util.h6
-rw-r--r--dists/engine-data/kyra.datbin231823 -> 236767 bytes
-rw-r--r--dists/msvc7/saga.vcproj17
-rw-r--r--dists/msvc7/scummvm.vcproj4
-rw-r--r--dists/msvc71/saga.vcproj17
-rw-r--r--dists/msvc71/scummvm.vcproj4
-rw-r--r--dists/msvc8/saga.vcproj20
-rw-r--r--dists/msvc8/scummvm.vcproj4
-rw-r--r--dists/msvc9/saga.vcproj20
-rw-r--r--dists/msvc9/scummvm.vcproj4
-rw-r--r--engines/agos/agos.cpp36
-rw-r--r--engines/agos/agos.h1
-rw-r--r--engines/cine/anim.cpp1
-rw-r--r--engines/cine/bg.cpp96
-rw-r--r--engines/cine/bg.h15
-rw-r--r--engines/cine/bg_list.cpp60
-rw-r--r--engines/cine/bg_list.h4
-rw-r--r--engines/cine/cine.cpp12
-rw-r--r--engines/cine/gfx.cpp1396
-rw-r--r--engines/cine/gfx.h158
-rw-r--r--engines/cine/main_loop.cpp16
-rw-r--r--engines/cine/object.cpp4
-rw-r--r--engines/cine/pal.cpp62
-rw-r--r--engines/cine/pal.h8
-rw-r--r--engines/cine/prc.cpp4
-rw-r--r--engines/cine/rel.cpp4
-rw-r--r--engines/cine/script.h3
-rw-r--r--engines/cine/script_fw.cpp67
-rw-r--r--engines/cine/script_os.cpp102
-rw-r--r--engines/cine/texte.cpp92
-rw-r--r--engines/cine/texte.h2
-rw-r--r--engines/cine/various.cpp833
-rw-r--r--engines/cine/various.h16
-rw-r--r--engines/cine/xref.txt37
-rw-r--r--engines/drascula/animation.cpp507
-rw-r--r--engines/drascula/detection.cpp63
-rw-r--r--engines/drascula/drascula.cpp1582
-rw-r--r--engines/drascula/drascula.h161
-rw-r--r--engines/drascula/rooms.cpp1301
-rw-r--r--engines/drascula/talk.cpp729
-rw-r--r--engines/drascula/texts.cpp33
-rw-r--r--engines/gob/coktelvideo.cpp32
-rw-r--r--engines/gob/coktelvideo.h15
-rw-r--r--engines/gob/detection.cpp65
-rw-r--r--engines/gob/draw_v2.cpp28
-rw-r--r--engines/gob/driver_vga.cpp19
-rw-r--r--engines/gob/game_v2.cpp12
-rw-r--r--engines/gob/gob.cpp22
-rw-r--r--engines/gob/gob.h8
-rw-r--r--engines/gob/inter.cpp4
-rw-r--r--engines/gob/inter.h1
-rw-r--r--engines/gob/inter_v2.cpp85
-rw-r--r--engines/gob/inter_v4.cpp103
-rw-r--r--engines/gob/map_v4.cpp2
-rw-r--r--engines/gob/mult_v2.cpp4
-rw-r--r--engines/gob/scenery.cpp159
-rw-r--r--engines/gob/scenery.h21
-rw-r--r--engines/gob/sound/adlib.cpp2
-rw-r--r--engines/gob/sound/cdrom.cpp6
-rw-r--r--engines/gob/sound/sound.cpp60
-rw-r--r--engines/gob/video.cpp23
-rw-r--r--engines/gob/video.h5
-rw-r--r--engines/gob/videoplayer.cpp61
-rw-r--r--engines/gob/videoplayer.h4
-rw-r--r--engines/kyra/animator_hof.cpp8
-rw-r--r--engines/kyra/animator_mr.cpp6
-rw-r--r--engines/kyra/debugger.cpp1
-rw-r--r--engines/kyra/detection.cpp103
-rw-r--r--engines/kyra/gui_hof.cpp4
-rw-r--r--engines/kyra/gui_lok.cpp2
-rw-r--r--engines/kyra/items_lok.cpp8
-rw-r--r--engines/kyra/kyra_hof.cpp35
-rw-r--r--engines/kyra/kyra_hof.h7
-rw-r--r--engines/kyra/kyra_lok.cpp1
-rw-r--r--engines/kyra/kyra_lok.h14
-rw-r--r--engines/kyra/kyra_mr.cpp9
-rw-r--r--engines/kyra/kyra_mr.h5
-rw-r--r--engines/kyra/kyra_v1.cpp5
-rw-r--r--engines/kyra/kyra_v1.h18
-rw-r--r--engines/kyra/kyra_v2.cpp22
-rw-r--r--engines/kyra/kyra_v2.h5
-rw-r--r--engines/kyra/resource.cpp817
-rw-r--r--engines/kyra/resource.h20
-rw-r--r--engines/kyra/scene_lok.cpp12
-rw-r--r--engines/kyra/scene_v2.cpp5
-rw-r--r--engines/kyra/script_hof.cpp4
-rw-r--r--engines/kyra/script_lok.cpp65
-rw-r--r--engines/kyra/script_v1.cpp4
-rw-r--r--engines/kyra/sequences_hof.cpp208
-rw-r--r--engines/kyra/sound.cpp42
-rw-r--r--engines/kyra/sound.h13
-rw-r--r--engines/kyra/sound_lok.cpp9
-rw-r--r--engines/kyra/sound_towns.cpp7
-rw-r--r--engines/kyra/staticres.cpp58
-rw-r--r--engines/kyra/text.cpp2
-rw-r--r--engines/kyra/text_hof.cpp3
-rw-r--r--engines/kyra/text_lok.cpp6
-rw-r--r--engines/kyra/text_mr.cpp15
-rw-r--r--engines/kyra/vqa.cpp8
-rw-r--r--engines/lure/game.cpp3
-rw-r--r--engines/lure/lure.cpp10
-rw-r--r--engines/lure/lure.h1
-rw-r--r--engines/lure/res_struct.cpp21
-rw-r--r--engines/m4/script.h3
-rw-r--r--engines/made/database.h2
-rw-r--r--engines/made/detection.cpp61
-rw-r--r--engines/made/graphics.cpp144
-rw-r--r--engines/made/graphics.h13
-rw-r--r--engines/made/made.cpp77
-rw-r--r--engines/made/made.h6
-rw-r--r--engines/made/pmvplayer.cpp37
-rw-r--r--engines/made/resource.cpp19
-rw-r--r--engines/made/screen.cpp68
-rw-r--r--engines/made/screen.h36
-rw-r--r--engines/made/screenfx.cpp92
-rw-r--r--engines/made/screenfx.h5
-rw-r--r--engines/made/script.cpp270
-rw-r--r--engines/made/script.h10
-rw-r--r--engines/made/scriptfuncs.cpp89
-rw-r--r--engines/made/scriptfuncs.h2
-rw-r--r--engines/metaengine.h2
-rw-r--r--engines/parallaction/callables_ns.cpp10
-rw-r--r--engines/parallaction/gui_ns.cpp6
-rw-r--r--engines/parallaction/input.cpp49
-rw-r--r--engines/parallaction/input.h4
-rw-r--r--engines/parallaction/parallaction.cpp52
-rw-r--r--engines/parallaction/parallaction.h4
-rw-r--r--engines/parallaction/parallaction_ns.cpp2
-rw-r--r--engines/saga/actor.cpp3
-rw-r--r--engines/saga/actor_walk.cpp5
-rw-r--r--engines/saga/detection.cpp4
-rw-r--r--engines/saga/detection_tables.h138
-rw-r--r--engines/saga/gfx.cpp4
-rw-r--r--engines/saga/interface.cpp9
-rw-r--r--engines/saga/interface.h4
-rw-r--r--engines/saga/introproc_ihnm.cpp (renamed from engines/saga/ihnm_introproc.cpp)0
-rw-r--r--engines/saga/introproc_ite.cpp (renamed from engines/saga/ite_introproc.cpp)108
-rw-r--r--engines/saga/isomap.cpp9
-rw-r--r--engines/saga/isomap.h2
-rw-r--r--engines/saga/itedata.cpp149
-rw-r--r--engines/saga/module.mk4
-rw-r--r--engines/saga/music.cpp20
-rw-r--r--engines/saga/palanim.cpp21
-rw-r--r--engines/saga/puzzle.cpp25
-rw-r--r--engines/saga/rscfile.cpp8
-rw-r--r--engines/saga/saga.cpp35
-rw-r--r--engines/saga/saga.h16
-rw-r--r--engines/saga/sagaresnames.h274
-rw-r--r--engines/saga/saveload.cpp1
-rw-r--r--engines/saga/scene.cpp1
-rw-r--r--engines/saga/scene.h14
-rw-r--r--engines/saga/sfuncs.cpp1
-rw-r--r--engines/saga/sndres.cpp16
-rw-r--r--engines/saga/sprite.cpp6
-rw-r--r--engines/saga/sthread.cpp8
-rw-r--r--engines/scumm/charset.cpp5
-rw-r--r--engines/scumm/debugger.cpp28
-rw-r--r--engines/scumm/detection_tables.h1
-rw-r--r--engines/scumm/saveload.cpp4
-rw-r--r--engines/scumm/script_v6.cpp4
-rw-r--r--engines/scumm/scumm-md5.h6
-rw-r--r--engines/scumm/string.cpp35
-rw-r--r--engines/sword2/mouse.cpp24
-rw-r--r--engines/sword2/mouse.h3
-rw-r--r--engines/sword2/sword2.cpp79
-rw-r--r--engines/sword2/sword2.h3
-rw-r--r--gui/about.cpp4
-rw-r--r--gui/debugger.cpp6
-rw-r--r--gui/launcher.h1
-rw-r--r--sound/audiostream.cpp15
-rw-r--r--sound/audiostream.h14
-rw-r--r--sound/flac.cpp26
-rw-r--r--sound/fmopl.h4
-rw-r--r--sound/midiplugin.h2
-rw-r--r--sound/mp3.cpp70
-rw-r--r--sound/softsynth/mt32/mt32emu.h2
-rw-r--r--sound/vorbis.cpp13
-rw-r--r--test/common/hashmap.h3
-rw-r--r--tools/create_kyradat/create_kyradat.cpp11
-rw-r--r--tools/create_kyradat/ita.h39
-rw-r--r--tools/scumm-md5.txt4
302 files changed, 9172 insertions, 18872 deletions
diff --git a/NEWS b/NEWS
index eee3a92e54..6a3a59a49b 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see:
- Added support for The Legend of Kyrandia: Book Two: Hand of Fate
- Added support for The Legend of Kyrandia: Book Three: Malcolm's Revenge
- Added support for Lost in Time
+ - Added support for The Bizarre Adventures of Woodruff and the Schnibble
- Added support for the PC version of Waxworks
- Added support for the Macintosh version of I Have no Mouth, and I
must Scream
diff --git a/backends/fs/gp32/gp32-fs-factory.cpp b/backends/fs/gp32/gp32-fs-factory.cpp
deleted file mode 100644
index 150c4f3236..0000000000
--- a/backends/fs/gp32/gp32-fs-factory.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#if defined(__GP32__)
-#include "backends/fs/gp32/gp32-fs-factory.h"
-#include "backends/fs/gp32/gp32-fs.cpp"
-
-DECLARE_SINGLETON(GP32FilesystemFactory);
-
-AbstractFilesystemNode *GP32FilesystemFactory::makeRootFileNode() const {
- return new GP32FilesystemNode();
-}
-
-AbstractFilesystemNode *GP32FilesystemFactory::makeCurrentDirectoryFileNode() const {
- return new GP32FilesystemNode();
-}
-
-AbstractFilesystemNode *GP32FilesystemFactory::makeFileNodePath(const String &path) const {
- return new GP32FilesystemNode(path);
-}
-#endif
diff --git a/backends/fs/gp32/gp32-fs-factory.h b/backends/fs/gp32/gp32-fs-factory.h
deleted file mode 100644
index 7e6cb595ca..0000000000
--- a/backends/fs/gp32/gp32-fs-factory.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef GP32_FILESYSTEM_FACTORY_H
-#define GP32_FILESYSTEM_FACTORY_H
-
-#include "common/singleton.h"
-#include "backends/fs/fs-factory.h"
-
-/**
- * Creates GP32FilesystemNode objects.
- *
- * Parts of this class are documented in the base interface class, FilesystemFactory.
- */
-class GP32FilesystemFactory : public FilesystemFactory, public Common::Singleton<GP32FilesystemFactory> {
-public:
- typedef Common::String String;
-
- virtual AbstractFilesystemNode *makeRootFileNode() const;
- virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const;
- virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const;
-
-protected:
- GP32FilesystemFactory() {};
-
-private:
- friend class Common::Singleton<SingletonBaseType>;
-};
-
-#endif /*GP32_FILESYSTEM_FACTORY_H*/
diff --git a/backends/fs/gp32/gp32-fs.cpp b/backends/fs/gp32/gp32-fs.cpp
deleted file mode 100644
index 06830c13f5..0000000000
--- a/backends/fs/gp32/gp32-fs.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "backends/fs/abstract-fs.h"
-
-#define MAX_PATH_SIZE 256
-
-/**
- * Implementation of the ScummVM file system API.
- *
- * Parts of this class are documented in the base interface class, AbstractFilesystemNode.
- */
-class GP32FilesystemNode : public AbstractFilesystemNode {
-protected:
- String _displayName;
- String _path;
- bool _isDirectory;
- bool _isRoot;
-
-public:
- /**
- * Creates a GP32FilesystemNode with the root node as path.
- */
- GP32FilesystemNode();
-
- /**
- * Creates a GP32FilesystemNode for a given path.
- *
- * @param path String with the path the new node should point to.
- */
- GP32FilesystemNode(const String &path);
-
- virtual bool exists() const { return true; } //FIXME: this is just a stub
- virtual String getDisplayName() const { return _displayName; }
- virtual String getName() const { return _displayName; }
- virtual String getPath() const { return _path; }
- virtual bool isDirectory() const { return _isDirectory; }
- // FIXME: isValid should return false if this Node can't be used!
- // so client code can rely on the return value.
- virtual bool isReadable() const { return true; } //FIXME: this is just a stub
- virtual bool isWritable() const { return true; } //FIXME: this is just a stub
-
- virtual AbstractFilesystemNode *getChild(const String &n) const;
- virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const;
- virtual AbstractFilesystemNode *getParent() const;
-};
-
-const char gpRootPath[] = "gp:\\";
-//char gpCurrentPath[MAX_PATH_SIZE] = "gp:\\"; // must end with '\'
-
-/**
- * Returns the last component of a given path.
- *
- * Examples:
- * gp:\foo\bar.txt would return "\bar.txt"
- * gp:\foo\bar\ would return "\bar\"
- *
- * @param str Path to obtain the last component from.
- * @return Pointer to the first char of the last component inside str.
- */
-const char *lastPathComponent(const Common::String &str) {
- if(str.empty())
- return "";
-
- const char *start = str.c_str();
- const char *cur = start + str.size() - 2;
-
- while (cur >= start && *cur != '\\') {
- --cur;
- }
-
- return cur + 1;
-}
-
-/**
- * FIXME: document this function.
- *
- * @param path
- * @param convPath
- */
-int gpMakePath(const char *path, char *convPath) {
- // copy root or current directory
- const char *p;
- if ((*path == '/') || (*path == '\\')) {
- path++;
- p = gpRootPath;
- while (*p)
- *convPath++ = *p++;
- }// else
- // p = gpCurrentPath;
-
- //while (*p)
- // *convPath++ = *p++;
-
- // add filenames/directories. remove "." & "..", replace "/" with "\"
- do {
- switch (*path) {
- case 0:
- case '/':
- case '\\':
- if (*(convPath - 1) == '\\') {
- // already ends with '\'
- } else if ((*(convPath - 2) == '\\') && (*(convPath - 1) == '.')) {
- convPath--; // remove '.' and end with '\'
- } else if ((*(convPath - 3) == '\\') && (*(convPath - 2) == '.') && (*(convPath - 1) == '.')) {
- convPath -= 3; // remove "\.."
- if (*(convPath - 1) == ':')
- *convPath++ = '\\'; // "gp:" -> "gp:\"
- else
- while (*(convPath - 1) != '\\')
- convPath--; // remove one directory and end with '\'
- } else {
- *convPath++ = '\\'; // just add '\'
- }
- break;
-
- default:
- *convPath++ = *path;
- break;
- }
- } while (*path++);
-
- *convPath = '\\';
-
- // *--convPath = 0; // remove last '\' and null-terminate
- *convPath = 0; // remove last '\' and null-terminate
-
- return 0;
-}
-
-GP32FilesystemNode::GP32FilesystemNode() {
- _isDirectory = true;
- _isRoot = true;
- _displayName = "GP32 Root";
- _path = "gp:\\";
-}
-
-GP32FilesystemNode::GP32FilesystemNode(const String &path) {
- const char *dsplName = NULL, *pos = NULL;
- char convPath[256];
-
- gpMakePath(path.c_str(), convPath);
-
- _path = convPath;
- pos = convPath;
-
- while (*pos)
- if (*pos++ == '\\')
- dsplName = pos;
-
- BP("FS: path name: %s", path.c_str());
-
- if (strcmp(path.c_str(), "gp:\\") == 0) {
- _isRoot = true;
- _displayName = "GP32 Root";
- } else {
- _isRoot = false;
- _displayName = String(dsplName);
- }
- _isDirectory = true;
-}
-
-AbstractFilesystemNode *GP32FilesystemNode::getChild(const String &n) const {
- // FIXME: Pretty lame implementation! We do no error checking to speak
- // of, do not check if this is a special node, etc.
- assert(_isDirectory);
-
- String newPath(_path);
- if (_path.lastChar() != '\\')
- newPath += '\\';
- newPath += n;
-
- return new GP32FilesystemNode(newPath);
-}
-
-bool GP32FilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const {
- assert(_isDirectory);
-
- //TODO: honor the hidden flag
-
- GPDIRENTRY dirEntry;
- GPFILEATTR attr;
- GP32FilesystemNode entry;
- uint32 read;
-
- if (mode == FilesystemNode::kListAll)
- LP("listDir(kListAll)");
- else
- LP("listDir(kListDirectoriesOnly)");
-
- int startIdx = 0; // current file
- String listDir(_path);
- //listDir += "/";
-
- while (GpDirEnumList(listDir.c_str(), startIdx++, 1, &dirEntry, &read) == SM_OK) {
-da if (dirEntry.name[0] == '.')
- continue;
-
- entry._displayName = dirEntry.name;
- entry._path = _path;
- entry._path += dirEntry.name;
- entry._isRoot = false;
-
- GpFileAttr(entry._path.c_str(), &attr);
- entry._isDirectory = attr.attr & (1 << 4);
-
- // Honor the chosen mode
- if ((mode == FilesystemNode::kListFilesOnly && entry._isDirectory) ||
- (mode == FilesystemNode::kListDirectoriesOnly && !entry._isDirectory))
- continue;
-
- if (entry._isDirectory)
- entry._path += "\\";
- myList.push_back(new GP32FilesystemNode(entry));
- }
-
- BP("Dir... %s", listDir.c_str());
-
- return true;
-}
-
-AbstractFilesystemNode *GP32FilesystemNode::getParent() const {
- if (_isRoot)
- return 0;
-
- const char *start = _path.c_str();
- const char *end = lastPathComponent(_path);
-
- GP32FilesystemNode *p = new GP32FilesystemNode(String(start, end - start));
-
- NP("%s", p->_path.c_str());
-
- return p;
-}
diff --git a/backends/midi/coreaudio.cpp b/backends/midi/coreaudio.cpp
index 8e00c24a1f..d7ab93a90a 100644
--- a/backends/midi/coreaudio.cpp
+++ b/backends/midi/coreaudio.cpp
@@ -24,6 +24,17 @@
#ifdef MACOSX
+// HACK to disable deprecated warnings under Mac OS X 10.5.
+// Apple depracted the AUGraphNewNode & AUGraphGetNodeInfo APIs
+// in favor of the new AUGraphAddNode & AUGraphNodeInfo APIs.
+// While it would be trivial to switch to those, this would break
+// binary compatibility with all pre-10.5 systems, so we don't want
+// to do that just now. Maybe when 10.6 comes... :)
+#include <AvailabilityMacros.h>
+#undef DEPRECATED_ATTRIBUTE
+#define DEPRECATED_ATTRIBUTE
+
+
#include "common/config-manager.h"
#include "common/util.h"
#include "sound/midiplugin.h"
diff --git a/backends/midi/quicktime.cpp b/backends/midi/quicktime.cpp
index 950dfa632c..63905212e6 100644
--- a/backends/midi/quicktime.cpp
+++ b/backends/midi/quicktime.cpp
@@ -24,6 +24,18 @@
#if defined(MACOSX) || defined(macintosh)
+// HACK to disable deprecated warnings under Mac OS X 10.5.
+// Apple depracted the complete QuickTime Music/MIDI API.
+// Apps are supposed to use CoreAudio & CoreMIDI. We do support
+// those, but while QT Midi support is still around, there is no
+// reason to disable this driver. If they really ditch the API in 10.6,
+// we can still release binaries with this driver disabled/removed.
+#include <AvailabilityMacros.h>
+#undef DEPRECATED_ATTRIBUTE
+#define DEPRECATED_ATTRIBUTE
+
+
+
#include "common/endian.h"
#include "common/util.h"
#include "sound/midiplugin.h"
@@ -285,10 +297,10 @@ MidiDriver *MidiDriver_QT_create(Audio::Mixer *mixer) {
return mididriver;
}
-//#if PLUGIN_ENABLED_DYNAMIC(QT)
- //REGISTER_PLUGIN_DYNAMIC(QT, PLUGIN_TYPE_MIDI, QuickTimeMidiPlugin);
+//#if PLUGIN_ENABLED_DYNAMIC(QUICKTIME)
+ //REGISTER_PLUGIN_DYNAMIC(QUICKTIME, PLUGIN_TYPE_MIDI, QuickTimeMidiPlugin);
//#else
- REGISTER_PLUGIN_STATIC(QT, PLUGIN_TYPE_MIDI, QuickTimeMidiPlugin);
+ REGISTER_PLUGIN_STATIC(QUICKTIME, PLUGIN_TYPE_MIDI, QuickTimeMidiPlugin);
//#endif
#endif // MACOSX || macintosh
diff --git a/backends/module.mk b/backends/module.mk
index e8ba303dea..187cc83ee9 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -3,7 +3,6 @@ MODULE := backends
MODULE_OBJS := \
fs/amigaos4/amigaos4-fs-factory.o \
fs/ds/ds-fs-factory.o \
- fs/gp32/gp32-fs-factory.o \
fs/palmos/palmos-fs-factory.o \
fs/posix/posix-fs-factory.o \
fs/ps2/ps2-fs-factory.o \
diff --git a/backends/platform/PalmOS/Src/be_base.cpp b/backends/platform/PalmOS/Src/be_base.cpp
index 3dadbe5286..afb3f15bae 100644
--- a/backends/platform/PalmOS/Src/be_base.cpp
+++ b/backends/platform/PalmOS/Src/be_base.cpp
@@ -24,9 +24,9 @@
*/
#include "be_base.h"
-#include "be_save.h"
#include "common/config-file.h"
#include "common/config-manager.h"
+#include "backends/saves/default/default-saves.h"
#include "backends/timer/default/default-timer.h"
#include "sound/mixer.h"
@@ -100,7 +100,7 @@ void OSystem_PalmBase::initBackend() {
// Create the savefile manager, if none exists yet (we check for this to
// allow subclasses to provide their own).
if (_saveMgr == 0) {
- _saveMgr = new PalmSaveFileManager();
+ _saveMgr = new DefaultSaveFileManager();
}
// Create and hook up the mixer, if none exists yet (we check for this to
@@ -120,6 +120,11 @@ void OSystem_PalmBase::initBackend() {
OSystem::initBackend();
}
+void OSystem_PalmBase::getTimeAndDate(struct tm &t) const {
+ time_t curTime = time(0);
+ t = *localtime(&curTime);
+}
+
uint32 OSystem_PalmBase::getMillis() {
return TimGetTicks() * 1000 / SysTicksPerSecond();
}
diff --git a/backends/platform/PalmOS/Src/be_base.h b/backends/platform/PalmOS/Src/be_base.h
index 38b76fcb05..582aae5d7a 100644
--- a/backends/platform/PalmOS/Src/be_base.h
+++ b/backends/platform/PalmOS/Src/be_base.h
@@ -26,6 +26,8 @@
#ifndef BE_BASE_H
#define BE_BASE_H
+#include <time.h>
+
#include "PalmVersion.h"
#include "globals.h"
@@ -236,6 +238,7 @@ public:
bool pollEvent(Common::Event &event);
+ void getTimeAndDate(struct tm &t) const;
virtual uint32 getMillis();
virtual void delayMillis(uint msecs);
diff --git a/backends/platform/PalmOS/Src/be_save.cpp b/backends/platform/PalmOS/Src/be_save.cpp
deleted file mode 100644
index 1c3da1ba23..0000000000
--- a/backends/platform/PalmOS/Src/be_save.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "be_base.h"
-#include "common/savefile.h"
-#include "be_save.h"
-
-Common::StringList PalmSaveFileManager::listSavefiles(const char *pattern) {
- TODO: Implement this. If you don't understand what it should do, just ask
- (e.g. on scummvm-devel or Fingolfin). It should be pretty simple if you
- use Common::matchString from common/util.h and read the Doxygen docs,
- then combine this with the old code below...
-
-/*
-void PalmSaveFileManager::listSavefiles(const char *prefix, bool *marks, int num) {
- FileRef fileRef;
- // try to open the dir
- Err e = VFSFileOpen(gVars->VFS.volRefNum, SCUMMVM_SAVEPATH, vfsModeRead, &fileRef);
- memset(marks, false, num*sizeof(bool));
-
- if (e != errNone)
- return;
-
- // enumerate all files
- UInt32 dirEntryIterator = vfsIteratorStart;
- Char filename[32];
- FileInfoType info = {0, filename, 32};
- UInt16 length = StrLen(prefix);
- int slot = 0;
-
- while (dirEntryIterator != vfsIteratorStop) {
- e = VFSDirEntryEnumerate (fileRef, &dirEntryIterator, &info);
-
- if (e != expErrEnumerationEmpty) { // there is something
-
- if (StrLen(info.nameP) == (length + 2)) { // consider max 99, filename length is ok
- if (StrNCaselessCompare(prefix, info.nameP, length) == 0) { // this seems to be a save file
- if (isdigit(info.nameP[length]) && isdigit(info.nameP[length+1])) {
-
- slot = StrAToI(filename + length);
- if (slot >= 0 && slot < num)
- *(marks+slot) = true;
-
- }
- }
- }
-
- }
- }
-
- VFSFileClose(fileRef);
-}
-
-}
diff --git a/backends/platform/PalmOS/Src/be_save.h b/backends/platform/PalmOS/Src/be_save.h
deleted file mode 100644
index c0aaf2a46c..0000000000
--- a/backends/platform/PalmOS/Src/be_save.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef BACKEND_SAVES_PALM_H
-#define BACKEND_SAVES_PALM_H
-
-#include "saves/default/default-saves.h"
-
-class PalmSaveFileManager : public DefaultSaveFileManager {
-public:
- Common::StringList listSavefiles(const char *pattern);
-};
-
-#endif
diff --git a/backends/platform/PalmOS/Src/extend.cpp b/backends/platform/PalmOS/Src/extend.cpp
index e2dbd8f093..430563a302 100644
--- a/backends/platform/PalmOS/Src/extend.cpp
+++ b/backends/platform/PalmOS/Src/extend.cpp
@@ -29,8 +29,6 @@
#include "modulesrsc.h"
-const char *SCUMMVM_SAVEPATH = "/PALM/Programs/ScummVM/Saved";
-
void PalmFatalError(const char *err) {
WinSetDrawWindow(WinGetDisplayWindow());
WinPalette(winPaletteSetToDefault,0,0,0);
diff --git a/backends/platform/PalmOS/Src/prefixes/native_kyra.h b/backends/platform/PalmOS/Src/prefixes/native_kyra.h
index c89b0a5b93..3b09c63a6f 100644
--- a/backends/platform/PalmOS/Src/prefixes/native_kyra.h
+++ b/backends/platform/PalmOS/Src/prefixes/native_kyra.h
@@ -2,6 +2,6 @@
#define PREFIX_H
#include "native_common.h"
-#define ENABLE_KYRA
+#define ENABLE_KYRA STATIC_PLUGIN
#endif
diff --git a/backends/platform/PalmOS/Src/prefixes/native_m4.h b/backends/platform/PalmOS/Src/prefixes/native_m4.h
new file mode 100755
index 0000000000..3bf85460a6
--- /dev/null
+++ b/backends/platform/PalmOS/Src/prefixes/native_m4.h
@@ -0,0 +1,7 @@
+#ifndef PREFIX_H
+#define PREFIX_H
+
+#include "native_common.h"
+#define ENABLE_M4 STATIC_PLUGIN
+
+#endif
diff --git a/backends/platform/PalmOS/Src/prefixes/native_made.h b/backends/platform/PalmOS/Src/prefixes/native_made.h
new file mode 100755
index 0000000000..fd439ed181
--- /dev/null
+++ b/backends/platform/PalmOS/Src/prefixes/native_made.h
@@ -0,0 +1,7 @@
+#ifndef PREFIX_H
+#define PREFIX_H
+
+#include "native_common.h"
+#define ENABLE_MADE STATIC_PLUGIN
+
+#endif
diff --git a/backends/platform/PalmOS/Src/prefixes/native_sword1.h b/backends/platform/PalmOS/Src/prefixes/native_sword1.h
index aaae4c9b86..6ae7bb9050 100644
--- a/backends/platform/PalmOS/Src/prefixes/native_sword1.h
+++ b/backends/platform/PalmOS/Src/prefixes/native_sword1.h
@@ -2,7 +2,7 @@
#define PREFIX_H
#include "native_common.h"
-#define ENABLE_SWORD1
+#define ENABLE_SWORD1 STATIC_PLUGIN
#define USE_MPEG2
#define USE_VORBIS
diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile
index ea98402d4e..aefd8c091e 100644
--- a/backends/platform/ds/arm9/makefile
+++ b/backends/platform/ds/arm9/makefile
@@ -34,10 +34,10 @@ ifeq ($(SCUMM_BUILD),g)
DS_BUILD_G = 1
endif
-#DS_BUILD_A = 1
+DS_BUILD_A = 1
#DS_BUILD_B = 1
#DS_BUILD_C = 1
-#DS_BUILD_D = 1 # started!
+#DS_BUILD_D = 1
#DS_BUILD_E = 1
#DS_BUILD_F = 1
#DS_BUILD_G = 1
@@ -82,11 +82,15 @@ VPATH = $(srcdir)
USE_ARM_SOUND_ASM = 1
ARM = 1
+USE_ARM_COSTUME_ASM = 1
ifdef DS_BUILD_A
- DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A -DUSE_ARM_GFX_ASM
+ DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A -DUSE_ARM_GFX_ASM -DUSE_ARM_COSTUME_ASM
LOGO = logoa.bmp
ENABLE_SCUMM = STATIC_PLUGIN
+ DEFINES += -DENABLE_SCUMM=STATIC_PLUGIN
+ MODULES += engines/scumm
+
USE_ARM_GFX_ASM = 1
BUILD=scummvm-A
endif
@@ -146,10 +150,12 @@ CXX = arm-eabi-g++
CFLAGS = -Wno-multichar -Wall\
-Wno-multichar -mcpu=arm9tdmi -mtune=arm9tdmi \
-mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\
- -ffast-math -mthumb-interwork
+ -mthumb-interwork -DUSE_ARM_COSTUME_ASM=1
+
+# -ffast-math
ifdef USE_DEBUGGER
- DEFINES += -DUSE_DEBUGGER
+ DEFINES += -DUSE_DEBUGGER
CFLAGS += -g
endif
@@ -258,14 +264,18 @@ OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp fmopl.cpp rate.cpp
#OPTLIST :=
# Compiler options for files which should be optimised for speed
-OPT_SPEED := -O3
+OPT_SPEED := -O2
# Compiler options for files which should be optimised for space
-OPT_SIZE := -Os -mthumb -fno-gcse -fno-schedule-insns2
+OPT_SIZE := -Os
+#-mthumb -fno-gcse -fno-schedule-insns2
-OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS)
+
+
+OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS)
+
@@ -330,8 +340,8 @@ endef
ifndef HAVE_GCC3
# If you use GCC, disable the above and enable this for intelligent
# dependency tracking.
-.cpp.o:
-
+#.cpp.o:
+%.o:%.cpp
$(MKDIR) $(*D)/$(DEPDIR)
$(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d2" $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o
# $(ECHO) "$(*D)/" > $(*D)/$(DEPDIR)/$(*F).d
@@ -342,7 +352,8 @@ else
# rule can get you into a bad state if you Ctrl-C at the wrong moment.
# Also, with this GCC inserts additional dummy rules for the involved headers,
# which ensures a smooth compilation even if said headers become obsolete.
-.cpp.o:
+#.cpp.o:
+%.o:%.cpp
# echo !!!!!!!!!!!! $(notdir $<)
# ifeq ( $(notdir $<), $(findstring $(notdir $<), $(OPTLIST)) )
# OPTFLAG=-O3
diff --git a/backends/platform/ds/arm9/source/adpcm_arm.s b/backends/platform/ds/arm9/source/adpcm_arm.s
index 178a63bb8c..38e8e60c6d 100644
--- a/backends/platform/ds/arm9/source/adpcm_arm.s
+++ b/backends/platform/ds/arm9/source/adpcm_arm.s
@@ -55,14 +55,14 @@ ARM_adpcm
loop:
LDRH r10,[r11,r2] @ r10 = stepTab[stepTableIndex]
TST r12,#4 @ if ((offset & 4) == 0)
- MOVEQ r9, #0 @ r9 = diff = 0
+ MOVEQ r9, #0 @ r9 = diff = 0
MOVNE r9, r10 @ else r9 = diff = stepTab[stepTableIndex]
TST r12,#2 @ if (offset & 2)
- ADDNE r9, r9, r10,ASR #1 @ diff += r10>>1
+ ADDNE r9, r9, r10,ASR #1 @ diff += r10>>1
TST r12,#1 @ if (offset & 1)
- ADDNE r9, r9, r10,ASR #2 @ diff += r10>>2
+ ADDNE r9, r9, r10,ASR #2 @ diff += r10>>2
ADD r9, r9, r10,ASR #3 @ diff += r10>>3
diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp
index 07c6b3fee1..582e15eb13 100644
--- a/backends/platform/ds/arm9/source/blitters.cpp
+++ b/backends/platform/ds/arm9/source/blitters.cpp
@@ -27,25 +27,25 @@
namespace DS {
-void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
+void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
int vsPitch, int vmScreenWidth, int textSurfacePitch) {
if (height <= 0) height = 1;
if (width < 4) return;
-
-
+
+
width &= ~4;
// src = (const byte *) (((int) (src)) & (~4));
// dst = (byte *) (((int) (dst)) & (~4));
// text = (const byte *) (((int) (text)) & (~4));
-
+
asm ( "mov r5, %0\n" // Height
- "yLoop:\n"
+ "yLoop:\n"
"mov r3, #0\n" // X pos
-
+
"xLoop:\n"
-
+
"ldr r4, [%2, r3]\n" // Load text layer word
"cmp r4, %5\n"
"bne singleByteCompare\n"
@@ -54,7 +54,7 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s
"add r3, r3, #4\n"
"cmp r3, %1\n" // x == width?
"blt xLoop\n"
-
+
"add %2, %2, %8\n" // src += vs->pitch
"add %3, %3, %6\n" // dst += _vm->_screenWidth
"add %4, %4, %7\n" // text += _textSurface.pitch
@@ -62,8 +62,8 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s
"cmp r5, #0\n" // y == 0?
"bne yLoop\n"
"b end\n"
-
-
+
+
"singleByteCompare:\n"
"ldrb r4, [%2, r3]\n" // Load text byte
"cmps r4, %5, lsr #24\n" // Compare with mask
@@ -78,7 +78,7 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s
"ldreqb r4, [%3, r3]\n" // Otherwise Load src byte
"streqb r4, [%4, r3]\n" // Store it
"add r3, r3, #1\n"
-
+
"ldrb r4, [%2, r3]\n" // Load text byte
"cmps r4, %5, lsr #24\n" // Compare with mask
"strneb r4, [%4, r3]\n" // Store if not equal
@@ -91,7 +91,7 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s
"strneb r4, [%4, r3]\n" // Store if not equal
"ldreqb r4, [%3, r3]\n" // Otherwise Load src byte
"streqb r4, [%4, r3]\n" // Store it
- "add r3, r3, #1\n"
+ "add r3, r3, #1\n"
"cmps r3, %1\n" // x == width?
"blt xLoop\n" // Repeat
@@ -101,10 +101,10 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s
"sub r5, r5, #1\n" // y -= 1
"cmp r5, #0\n" // y == 0?
"bne yLoop\n"
-
+
"end:\n"
: /* no output registers */
- : "r" (height), "r" (width), "r" (text), "r" (src), "r" (dst), "r" (CHARSET_MASK_TRANSPARENCY | (CHARSET_MASK_TRANSPARENCY << 8) | (CHARSET_MASK_TRANSPARENCY << 16) | (CHARSET_MASK_TRANSPARENCY << 24)),
+ : "r" (height), "r" (width), "r" (text), "r" (src), "r" (dst), "r" (CHARSET_MASK_TRANSPARENCY | (CHARSET_MASK_TRANSPARENCY << 8) | (CHARSET_MASK_TRANSPARENCY << 16) | (CHARSET_MASK_TRANSPARENCY << 24)),
"r" (vsPitch), "r" (vmScreenWidth), "r" (textSurfacePitch)
: "r5", "r3", "r4", "%2", "%3", "%4", "memory");
}
@@ -115,7 +115,7 @@ void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height) {
asm("ands r0, %3, #1\n"
"addne %3, %3, #1\n"
"bne roll2\n"
-
+
"yLoop2:\n"
"ldr r0, [%2, #0]\n"
"str r0, [%0, #0]\n"
@@ -131,7 +131,7 @@ void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height) {
"add %0, %0, %1\n"
"add %2, %2, %1\n"
"subs %3, %3, #2\n"
- "bne yLoop2\n"
+ "bne yLoop2\n"
: /* no output registers */
: "r" (dst), "r" (dstPitch), "r" (src), "r" (height)
@@ -150,7 +150,7 @@ void ComputeDivBy5TableIFN()
for (int i=0; i<160; ++i)
{
DIV_BY_5[i] = (2*i+5)/10;
- }
+ }
}
#ifdef PERFECT_5_TO_4_RESCALING
@@ -163,13 +163,13 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3
u32 bs3 = s3 & 0x1F;
u32 bs4 = s4 & 0x1F;
-#if 0
+#if 0
u32 gs0 = (s0 >> 5) & 0x1F;
u32 gs1 = (s1 >> 5) & 0x1F;
u32 gs2 = (s2 >> 5) & 0x1F;
u32 gs3 = (s3 >> 5) & 0x1F;
u32 gs4 = (s4 >> 5) & 0x1F;
-
+
u32 rs0 = (s0 >> 10) & 0x1F;
u32 rs1 = (s1 >> 10) & 0x1F;
u32 rs2 = (s2 >> 10) & 0x1F;
@@ -191,22 +191,22 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3
asm("and %0, %2, %1, lsr #10" : "=r"(rs3) : "r"(s3), "r"(mask) : );
asm("and %0, %2, %1, lsr #10" : "=r"(rs4) : "r"(s4), "r"(mask) : );
#endif
-
+
u32 rd0 = 4*rs0 + rs1;
u32 rd1 = 2*rs1 + rs1 + 2*rs2;
u32 rd2 = 2*rs2 + 2*rs3 + rs3;
u32 rd3 = rs3 + 4*rs4;
-
+
u32 gd0 = 4*gs0 + gs1;
u32 gd1 = 2*gs1 + gs1 + 2*gs2;
u32 gd2 = 2*gs2 + 2*gs3 + gs3;
u32 gd3 = gs3 + 4*gs4;
-
+
u32 bd0 = 4*bs0 + bs1;
u32 bd1 = 2*bs1 + bs1 + 2*bs2;
u32 bd2 = 2*bs2 + 2*bs3 + bs3;
u32 bd3 = bs3 + 4*bs4;
-
+
#if 0
// Offsetting for correct rounding
rd0 = rd0*2+5; rd1 = rd1*2+5; rd2 = rd2*2+5; rd3 = rd3*2+5;
@@ -217,14 +217,14 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3
gd0 = (gd0 * 51) >> 9; gd1 = (gd1 * 51) >> 9; gd2 = (gd2 * 51) >> 9; gd3 = (gd3 * 51) >> 9;
bd0 = (bd0 * 51) >> 9; bd1 = (bd1 * 51) >> 9; bd2 = (bd2 * 51) >> 9; bd3 = (bd3 * 51) >> 9;
#else
- rd0 = DIV_BY_5[rd0]; rd1 = DIV_BY_5[rd1]; rd2 = DIV_BY_5[rd2]; rd3 = DIV_BY_5[rd3];
- gd0 = DIV_BY_5[gd0]; gd1 = DIV_BY_5[gd1]; gd2 = DIV_BY_5[gd2]; gd3 = DIV_BY_5[gd3];
- bd0 = DIV_BY_5[bd0]; bd1 = DIV_BY_5[bd1]; bd2 = DIV_BY_5[bd2]; bd3 = DIV_BY_5[bd3];
+ rd0 = DIV_BY_5[rd0]; rd1 = DIV_BY_5[rd1]; rd2 = DIV_BY_5[rd2]; rd3 = DIV_BY_5[rd3];
+ gd0 = DIV_BY_5[gd0]; gd1 = DIV_BY_5[gd1]; gd2 = DIV_BY_5[gd2]; gd3 = DIV_BY_5[gd3];
+ bd0 = DIV_BY_5[bd0]; bd1 = DIV_BY_5[bd1]; bd2 = DIV_BY_5[bd2]; bd3 = DIV_BY_5[bd3];
#endif
-
+
u32 d10 = 0x80008000 | (rd1 << 26) | (gd1 << 21) | (bd1 << 16) | (rd0 << 10) | (gd0 << 5) | bd0;
u32 d32 = 0x80008000 | (rd3 << 26) | (gd3 << 21) | (bd3 << 16) | (rd2 << 10) | (gd2 << 5) | bd2;
-
+
((u32*)dest)[0] = d10;
((u32*)dest)[1] = d32;
}
@@ -233,7 +233,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3
u16* dest)
{
static const u32 MASK = 0x03E07C1F;
-
+
u32 argbargbs0 = u32(s0) | (u32(s0) << 16);
u32 argbargbs1 = u32(s1) | (u32(s1) << 16);
u32 argbargbs2 = u32(s2) | (u32(s2) << 16);
@@ -245,32 +245,32 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3
u32 grbs2 = argbargbs2 & MASK;
u32 grbs3 = argbargbs3 & MASK;
u32 grbs4 = argbargbs4 & MASK;
-
+
u32 grbd0 = (3*grbs0 + grbs1) >> 2;
u32 grbd1 = ( grbs1 + grbs2) >> 1;
u32 grbd2 = ( grbs2 + grbs3) >> 1;
u32 grbd3 = ( grbs3 + 3*grbs4) >> 2;
-
+
grbd0 &= MASK;
grbd1 &= MASK;
grbd2 &= MASK;
grbd3 &= MASK;
-
+
u32 d0 = grbd0 | (grbd0 >> 16);
u32 d1 = grbd1 | (grbd1 >> 16);
u32 d2 = grbd2 | (grbd2 >> 16);
u32 d3 = grbd3 | (grbd3 >> 16);
-
- d0 &= 0xFFFF;
- d1 &= 0xFFFF;
- d2 &= 0xFFFF;
- d3 &= 0xFFFF;
-
- d0 |= 0x8000;
- d1 |= 0x8000;
- d2 |= 0x8000;
- d3 |= 0x8000;
-
+
+ d0 &= 0xFFFF;
+ d1 &= 0xFFFF;
+ d2 &= 0xFFFF;
+ d3 &= 0xFFFF;
+
+ d0 |= 0x8000;
+ d1 |= 0x8000;
+ d2 |= 0x8000;
+ d3 |= 0x8000;
+
dest[0] = d0;
dest[1] = d1;
dest[2] = d2;
@@ -287,13 +287,13 @@ static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3
u32 bd0 = (d0 << 24) >> 24;
u32 bd1 = (d1 << 24) >> 24;
u32 gd0 = (d0 << 16) >> 24;
- u32 gd1 = (d1 << 16) >> 24;
+ u32 gd1 = (d1 << 16) >> 24;
u32 rd0 = (d0 >> 16);
u32 rd1 = (d1 >> 16);
-
+
rd0 = DIV_BY_5[rd0]; rd1 = DIV_BY_5[rd1];
gd0 = DIV_BY_5[gd0]; gd1 = DIV_BY_5[gd1];
- bd0 = DIV_BY_5[bd0]; bd1 = DIV_BY_5[bd1];
+ bd0 = DIV_BY_5[bd0]; bd1 = DIV_BY_5[bd1];
u32 d10 = 0x80008000 | (rd1 << 26) | (gd1 << 21) | (bd1 << 16) | (rd0 << 10) | (gd0 << 5) | bd0;
((u32*)dest)[0] = d10;
@@ -307,11 +307,11 @@ static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3
u32 rd2 = (d2 >> 16);
u32 rd3 = (d3 >> 16);
- rd2 = DIV_BY_5[rd2]; rd3 = DIV_BY_5[rd3];
- gd2 = DIV_BY_5[gd2]; gd3 = DIV_BY_5[gd3];
- bd2 = DIV_BY_5[bd2]; bd3 = DIV_BY_5[bd3];
+ rd2 = DIV_BY_5[rd2]; rd3 = DIV_BY_5[rd3];
+ gd2 = DIV_BY_5[gd2]; gd3 = DIV_BY_5[gd3];
+ bd2 = DIV_BY_5[bd2]; bd3 = DIV_BY_5[bd3];
u32 d32 = 0x80008000 | (rd3 << 26) | (gd3 << 21) | (bd3 << 16) | (rd2 << 10) | (gd2 << 5) | bd2;
-
+
((u32*)dest)[1] = d32;
}
@@ -320,7 +320,7 @@ static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3
static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const u8* src, const u32* palette)
{
ComputeDivBy5TableIFN();
-
+
for (size_t i=0; i<64; ++i)
{
u32 s0 = palette[src[5*i+0]];
@@ -353,7 +353,7 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const
static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16* dest, const u16* src)
{
ComputeDivBy5TableIFN();
-
+
for (size_t i=0; i<64; ++i)
{
u16 s0 = src[5*i+0];
@@ -384,7 +384,7 @@ void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStri
for (size_t i=0; i<200; ++i)
{
- Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam);
+ Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam);
}
}
#else
@@ -396,7 +396,7 @@ void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStri
for (size_t i=0; i<200; ++i)
{
- Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam);
+ Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam);
}
}
#endif
diff --git a/backends/platform/ds/arm9/source/blitters.h b/backends/platform/ds/arm9/source/blitters.h
index 7434a58efd..463aa2ac02 100644
--- a/backends/platform/ds/arm9/source/blitters.h
+++ b/backends/platform/ds/arm9/source/blitters.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _BLITTERS_H_
#define _BLITTERS_H_
@@ -29,22 +29,22 @@
namespace DS {
-void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
+void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
int vsPitch, int vmScreenWidth, int textSurfacePitch);
void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height);
void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette);
void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride);
}
-
+
#else
extern "C" {
-void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
+void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
int vsPitch, int vmScreenWidth, int textSurfacePitch);
void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height);
-void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette);
+void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette, u32 numLines);
void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride);
}
diff --git a/backends/platform/ds/arm9/source/blitters.s b/backends/platform/ds/arm9/source/blitters.s
index 40b8782eec..2f14c5a140 100644
--- a/backends/platform/ds/arm9/source/blitters.s
+++ b/backends/platform/ds/arm9/source/blitters.s
@@ -21,7 +21,7 @@
@ @author Robin Watts (robin@wss.co.uk)
.text
-
+
.global asmDrawStripToScreen
.global asmCopy8Col
.global Rescale_320x256xPAL8_To_256x256x1555
@@ -142,7 +142,7 @@ asmCopy8Col:
@ r3 = height
STMFD r13!,{r14}
SUB r1,r1,#4
-
+
TST r3,#1
ADDNE r3,r3,#1
BNE roll2
@@ -177,7 +177,7 @@ Rescale_320x256x1555_To_256x256x1555:
@ r2 = dstStride
@ r3 = srcStride
STMFD r13!,{r4-r5,r8-r11,r14}
-
+
SUB r2,r2,#64*5 @ srcStride -= line length
SUB r3,r3,#64*4 @ dstStride -= line length
@@ -187,7 +187,7 @@ Rescale_320x256x1555_To_256x256x1555:
MOV r5, #200 @ r5 = y
yLoop3:
MOV r4, #64 @ r4 = x
-xLoop3:
+xLoop3:
LDRH r9, [r0],#2 @ r9 = src0
LDRH r10,[r0],#2 @ r10= src1
LDRH r11,[r0],#2 @ r11= src2
@@ -212,7 +212,7 @@ xLoop3:
ADD r11,r11,r12 @ r11= dst2
ADD r12,r12,r14 @ r12= src3 + src4
ADD r12,r12,r14,LSL #1 @ r12= src3 + src4*3 = dst3<<2
-
+
AND r9, r8, r9, LSR #2 @ r9 = dst0 (split)
AND r10,r8, r10,LSR #1 @ r10= dst1 (split)
AND r11,r8, r11,LSR #1 @ r11= dst2 (split)
@@ -227,7 +227,7 @@ xLoop3:
ORR r10,r10,#0x8000
ORR r11,r11,#0x8000
ORR r12,r12,#0x8000
-
+
STRH r9, [r1],#2
STRH r10,[r1],#2
STRH r11,[r1],#2
@@ -235,7 +235,7 @@ xLoop3:
SUBS r4,r4,#1
BGT xLoop3
-
+
ADD r0,r0,r2,LSL #1
ADD r1,r2,r3,LSL #1
SUBS r5,r5,#1
@@ -266,7 +266,7 @@ Rescale_320x256xPAL8_To_256x256x1555:
ORR r8, r8,#0x00007C00
ORR r8, r8,#0x03E00000 @ r8 = mask
LDR r9, [r13,#7*4] @ r9 = palette
-
+
SUB r13,r13,#256*4 @ r13 = 1K of space on the stack.
MOV r5, r13 @ r5 points to this space
MOV r14,#256
@@ -277,14 +277,14 @@ palLoop:
AND r10,r10,r8 @ r10 = separated palette entry
STR r10,[r5], #4
BGT palLoop
-
+
SUB r2,r2,#64*5 @ srcStride -= line length
SUB r3,r3,#64*4 @ dstStride -= line length
MOV r5,#200 @ r5 = y
yLoop4:
MOV r4,#64 @ r4 = x
-xLoop4:
+xLoop4:
LDRB r9, [r0],#1 @ r9 = src0
LDRB r10,[r0],#1 @ r10= src1
LDRB r11,[r0],#1 @ r11= src2
@@ -303,7 +303,7 @@ xLoop4:
ADD r11,r11,r12 @ r11= dst2
ADD r12,r12,r14 @ r12= src3 + src4
ADD r12,r12,r14,LSL #1 @ r12= src3 + src4*3 = dst3<<2
-
+
AND r9, r8, r9, LSR #2 @ r9 = dst0 (split)
AND r10,r8, r10,LSR #1 @ r10= dst1 (split)
AND r11,r8, r11,LSR #1 @ r11= dst2 (split)
@@ -318,7 +318,7 @@ xLoop4:
ORR r10,r10,#0x8000
ORR r11,r11,#0x8000
ORR r12,r12,#0x8000
-
+
STRH r9, [r1],#2
STRH r10,[r1],#2
STRH r11,[r1],#2
@@ -326,7 +326,7 @@ xLoop4:
SUBS r4,r4,#1
BGT xLoop4
-
+
ADD r0,r0,r2
ADD r1,r2,r3,LSL #1
SUBS r5,r5,#1
@@ -336,4 +336,4 @@ xLoop4:
LDMFD r13!,{r4-r5,r8-r11,PC}
-
+
diff --git a/backends/platform/ds/arm9/source/blitters_arm.s b/backends/platform/ds/arm9/source/blitters_arm.s
index fa7613929b..5f7df298b4 100644
--- a/backends/platform/ds/arm9/source/blitters_arm.s
+++ b/backends/platform/ds/arm9/source/blitters_arm.s
@@ -251,8 +251,8 @@ xLoop3:
@ const u8 *src,
@ int dstStride,
@ int srcStride,
- @ const u16 *pal);
- @
+ @ const u16 *pal,
+ @ u32 numLines);
Rescale_320x256xPAL8_To_256x256x1555:
@ r0 = dst
@ r1 = src
@@ -263,6 +263,7 @@ Rescale_320x256xPAL8_To_256x256x1555:
ORR r8, r8,#0x0000FC00
ORR r8, r8,#0x03E00000 @ r8 = mask
LDR r9, [r13,#9*4] @ r9 = palette
+ LDR r7, [r13,#10*4] @ r7 = numLines
SUB r13,r13,#256*4 @ r13 = 1K of space on the stack.
MOV r5, r13 @ r5 points to this space
@@ -280,7 +281,7 @@ palLoop:
SUB r3,r3,#64*5 @ dstStride -= line length
MOV r14,#0xFF @ r14= 255
- MOV r5,#200 @ r5 = y
+ MOV r5,r7 @ r5 = numLines
yLoop4:
MOV r4,#16 @ r4 = x
xLoop4:
@@ -292,7 +293,7 @@ xLoop4:
ADD r6, r6, r6, LSL #1 @ r6 = 3*pal[src0]
AND r9, r14,r10,LSR #16 @ r9 = src2
LDR r9, [r13,r9, LSL #2] @ r9 = pal[src2]
- MOV r10,r10,LSR #24 @ r10= src3
+ MOV r10,r10,LSR #24 @ r10= src3
LDR r10,[r13,r10,LSL #2] @ r10= pal[src3]
ADD r6, r6, r7 @ r6 = dst0<<2
AND r6, r8, r6, LSR #2 @ r6 = dst0 (split)
@@ -322,7 +323,7 @@ xLoop4:
ADD r6, r6, r6, LSL #1 @ r6 = 3*pal[src5]
MOV r9, r11,LSR #24 @ r9 = src7
LDR r9, [r13,r9, LSL #2] @ r9 = pal[src7]
- AND r10,r14,r12 @ r10= src8
+ AND r10,r14,r12 @ r10= src8
LDR r10,[r13,r10,LSL #2] @ r10= pal[src8]
ADD r6, r6, r7 @ r6 = dst4<<2
AND r6, r8, r6, LSR #2 @ r6 = dst4 (split)
@@ -354,7 +355,7 @@ xLoop4:
ADD r6, r6, r6, LSL #1 @ r6 = 3*pal[src10]
AND r9, r14,r10 @ r9 = src12
LDR r9, [r13,r9, LSL #2] @ r9 = pal[src12]
- AND r12,r14,r10,LSR #8 @ r11= src13
+ AND r12,r14,r10,LSR #8 @ r11= src13
LDR r12,[r13,r12,LSL #2] @ r11= pal[src13]
ADD r6, r6, r7 @ r6 = dst8<<2
AND r6, r8, r6, LSR #2 @ r6 = dst8 (split)
@@ -384,7 +385,7 @@ xLoop4:
ADD r6, r6, r6, LSL #1 @ r6 = 3*pal[src15]
AND r9, r14,r11,LSR #8 @ r9 = src17
LDR r9, [r13,r9, LSL #2] @ r9 = pal[src17]
- AND r12,r14,r11,LSR #16 @ r11= src18
+ AND r12,r14,r11,LSR #16 @ r11= src18
LDR r12,[r13,r12,LSL #2] @ r11= pal[src18]
ADD r6, r6, r7 @ r6 = dst12<<2
AND r6, r8, r6, LSR #2 @ r6 = dst12 (split)
diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp
index e8c9f55ef1..9569a820f2 100644
--- a/backends/platform/ds/arm9/source/cdaudio.cpp
+++ b/backends/platform/ds/arm9/source/cdaudio.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#include "cdaudio.h"
#include "ds-fs.h"
#include "config-manager.h"
@@ -53,14 +53,14 @@ struct WaveHeader {
u16 fmtExtraData; // Number of extra fmt bytes
u16 fmtExtra; // Samples per block (only for IMA-ADPCM files)
} __attribute__ ((packed));
-
+
struct chunkHeader {
- char name[4];
+ char name[4];
u32 size;
} __attribute__ ((packed));
struct Header {
- s16 firstSample;
+ s16 firstSample;
char stepTableIndex;
char reserved;
} __attribute__ ((packed));
@@ -112,7 +112,7 @@ void decompressBlock();
void allocBuffers() {
-
+
}
void setActive(bool active) {
@@ -125,17 +125,17 @@ bool getActive() {
void playTrack(int track, int numLoops, int startFrame, int duration) {
Common::String path = ConfMan.get("path");
-
+
if (isPlayingFlag) {
stopTrack();
}
-
+
if (trackStartsAt2) {
track++;
}
-
-
-
+
+
+
char str[100];
if (path[strlen(path.c_str()) - 1] == '/') {
@@ -145,50 +145,50 @@ void playTrack(int track, int numLoops, int startFrame, int duration) {
sprintf(str, "/track%d.wav", track);
path = path + str;
}
-
-
+
+
//1820160
-
+
file = DS::std_fopen(path.c_str(), "rb");
-
+
if (!file) {
consolePrintf("Failed to open %s!\n", path.c_str());
return;
}
-
-
+
+
DS::std_fread((const void *) &waveHeader, sizeof(waveHeader), 1, file);
-
+
consolePrintf("Playing track %d\n", track);
consolePrintf("Format: %d\n", waveHeader.fmtFormatTag);
consolePrintf("Rate : %d\n", waveHeader.fmtSamPerSec);
consolePrintf("Bits : %d\n", waveHeader.fmtBitsPerSam);
consolePrintf("BlkSz : %d\n", waveHeader.fmtExtra);
-
+
if ((waveHeader.fmtFormatTag != 17) && (waveHeader.fmtFormatTag != 20)) {
consolePrintf("Wave file is in the wrong format! You must use IMA-ADPCM 4-bit mono.\n");
DS::std_fclose(file);
return;
}
-
+
for (int r = 0; r < 8; r++) {
IPC->adpcm.buffer[r] = (u8 * volatile) (decoderFormat *) malloc(waveHeader.fmtBlockAlign);
IPC->adpcm.filled[r] = false;
IPC->adpcm.arm7Dirty[r] = false;
}
-
+
// Skip chunks until we reach the data chunk
chunkHeader chunk;
DS::std_fread((const void *) &chunk, sizeof(chunkHeader), 1, file);
-
+
while (!((chunk.name[0] == 'd') && (chunk.name[1] == 'a') && (chunk.name[2] == 't') && (chunk.name[3] == 'a'))) {
DS::std_fseek(file, chunk.size, SEEK_CUR);
DS::std_fread((const void *) &chunk, sizeof(chunkHeader), 1, file);
}
-
+
dataChunkStart = DS::std_ftell(file);
-
-
+
+
static bool started = false;
sampleNum = 0;
blockCount = 0;
@@ -206,35 +206,35 @@ void playTrack(int track, int numLoops, int startFrame, int duration) {
memset(audioBuffer, 0, BUFFER_SIZE * 2);
memset(decompressionBuffer, 0, waveHeader.fmtExtra * 2);
DS::playSound(audioBuffer, BUFFER_SIZE * 2, false, false, waveHeader.fmtSamPerSec);
-
- }
+
+ }
fillPos = (IPC->streamPlayingSection + 1) & 3;
isPlayingFlag = true;
-
-
+
+
// Startframe is a 75Hz timer. Dunno why, since nothing else
// seems to run at that rate.
int tenths = (startFrame * 10) / 75;
-
+
// Seek to the nearest block start to the start time
int samples = (tenths * waveHeader.fmtSamPerSec) / 10;
int block = samples / waveHeader.fmtExtra;
-
-
+
+
if (duration == 0) {
blocksLeft = 0;
} else {
blocksLeft = ((((duration * 100) / 75) * (waveHeader.fmtSamPerSec)) / (waveHeader.fmtExtra) / 100) + 10;
}
// consolePrintf("Playing %d blocks (%d)\n\n", blocksLeft, duration);
-
+
// No need to seek if we're starting from the beginning
if (block != 0) {
DS::std_fseek(file, dataChunkStart + block * waveHeader.fmtBlockAlign, SEEK_SET);
// consolePrintf("Startframe: %d msec: %d (%d,%d)\n", startFrame, tenthssec, samples, block);
}
-
-
+
+
//decompressBlock();
playNextBlock();
DS::CD::numLoops = numLoops;
@@ -252,21 +252,21 @@ extern "C" void ARM_adcpm(int *block, int len, int stepTableIndex,
void decompressBlock() {
int block[2048];
bool loop = false;
-
+
blockCount++;
-
+
if (blockCount < 10) return;
-
-
+
+
do {
DS::std_fread((const void *) &blockHeader, sizeof(blockHeader), 1, file);
-
+
DS::std_fread(&block[0], waveHeader.fmtBlockAlign - sizeof(blockHeader), 1, file);
if (DS::std_feof(file) ) {
// Reached end of file, so loop
-
-
+
+
if ((numLoops == -1) || (numLoops > 1)) {
// Seek file to first packet
if (numLoops != -1) {
@@ -283,14 +283,14 @@ void decompressBlock() {
stopTrack();
return;
}
-
+
} else {
loop = false;
}
-
+
} while (loop);
-
-
+
+
if (blocksLeft > 0) {
blocksLeft--;
// consolePrintf("%d ", blocksLeft);
@@ -305,37 +305,37 @@ void decompressBlock() {
blockHeader.stepTableIndex,
blockHeader.firstSample,
decompressionBuffer);
-#else
+#else
// First sample is in header
decompressionBuffer[0] = blockHeader.firstSample;
-
+
// Set up initial table indeces
int stepTableIndex = blockHeader.stepTableIndex;
int prevSample = blockHeader.firstSample;
-
+
// consolePrintf("Decompressing block step=%d fs=%d\n", stepTableIndex, prevSample);
for (int r = 0; r < waveHeader.fmtExtra - 1; r++) {
-
+
int word = block[r >> 3];
int offset = 0;
-
+
switch (7 - (r & 0x0007)) {
case 0: {
offset = (word & 0xF0000000) >> 28;
break;
}
-
+
case 1: {
offset = (word & 0x0F000000) >> 24;
break;
}
-
+
case 2: {
offset = (word & 0x00F00000) >> 20;
break;
}
-
+
case 3: {
offset = (word & 0x000F0000) >> 16;
break;
@@ -361,41 +361,41 @@ void decompressBlock() {
break;
}
}
-
+
int diff = 0;
-
+
if (offset & 4) {
diff = diff + stepTab[stepTableIndex];
}
-
+
if (offset & 2) {
diff = diff + (stepTab[stepTableIndex] >> 1);
}
-
+
if (offset & 1) {
diff = diff + (stepTab[stepTableIndex] >> 2);
}
-
+
diff = diff + (stepTab[stepTableIndex] >> 3);
-
+
if (offset & 8) {
- diff = -diff;
+ diff = -diff;
}
-
+
int newSample = prevSample + diff;
-
+
if (newSample > 32767) newSample = 32767;
if (newSample < -32768) newSample = -32768;
-
+
decompressionBuffer[r + 1] = newSample;
-
+
prevSample = newSample;
-
+
stepTableIndex += indexTab[offset];
-
+
if (stepTableIndex > 88) stepTableIndex = 88;
if (stepTableIndex < 0) stepTableIndex = 0;
-
+
}
#endif
@@ -404,21 +404,21 @@ void decompressBlock() {
void playNextBlock() {
if (!isPlayingFlag) return;
int lastBlockId = -1;
-
+
while (IPC->adpcm.semaphore); // Wait for buffer to become free if needed
IPC->adpcm.semaphore = true; // Lock the buffer structure to prevent clashing with the ARM7
// DC_FlushAll();
-
+
//-8644, 25088
for (int block = fillPos + 1; block < fillPos + 4; block++) {
int blockId = block & 3;
-
+
if (IPC->streamFillNeeded[blockId]) {
-
+
IPC->streamFillNeeded[blockId] = false;
// DC_FlushAll();
-
+
/* if (!(REG_KEYINPUT & KEY_R)) {
//consolePrintf("Align: %d First: %d Step:%d Res:%d\n", waveHeader.fmtBlockAlign, blockHeader.firstSample, blockHeader.stepTableIndex, blockHeader.reserved);
consolePrintf("Filling buffer %d\n", blockId);
@@ -432,19 +432,19 @@ void playNextBlock() {
}
}
}
-
+
lastBlockId = blockId;
IPC->streamFillNeeded[blockId] = false;
// DC_FlushAll();
}
-
-
-
+
+
+
}
-
-
-
+
+
+
if (lastBlockId != -1) {
fillPos = lastBlockId;
/* if (!(REG_KEYINPUT & KEY_R)) {
@@ -459,18 +459,18 @@ void stopTrack() {
if (!isPlayingFlag) return;
DS::std_fclose(file);
-
+
isPlayingFlag = false;
-
+
for (int r = 0; r < BUFFER_SIZE; r++) {
audioBuffer[r] = 0;
}
-
+
for (int r= 0; r < waveHeader.fmtExtra; r++) {
decompressionBuffer[r] = 0;
}
// DS::stopSound(1);
-
+
// free(audioBuffer);
// free(decompressionBuffer);
@@ -507,7 +507,7 @@ bool trackExists(int num) {
bool checkCD() {
// Need to check whethe CD audio files are present - do this by trying to open Track1.wav.
consolePrintf("Attempted to open cd drive\n");
-
+
if (trackExists(1)) {
trackStartsAt2 = false;
return true;
diff --git a/backends/platform/ds/arm9/source/cdaudio.h b/backends/platform/ds/arm9/source/cdaudio.h
index a4a1a0bce9..d237569bb7 100644
--- a/backends/platform/ds/arm9/source/cdaudio.h
+++ b/backends/platform/ds/arm9/source/cdaudio.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _CDAUDIO_H_
#define _CDAUDIO_H_
diff --git a/backends/platform/ds/arm9/source/console2.h b/backends/platform/ds/arm9/source/console2.h
index 86434dcb93..6b9a677cc7 100644
--- a/backends/platform/ds/arm9/source/console2.h
+++ b/backends/platform/ds/arm9/source/console2.h
@@ -25,7 +25,7 @@
//
// Changelog:
// 0.1: First version
-// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
+// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
// Changed some register defines for consistency.
//
//////////////////////////////////////////////////////////////////////
@@ -87,7 +87,7 @@ void consoleClear(void);
//
// Changelog:
// 0.1: First version
-// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
+// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
// Changed some register defines for consistency.
//
//////////////////////////////////////////////////////////////////////
diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp
index d11e4e6f75..efa60015fb 100644
--- a/backends/platform/ds/arm9/source/dsmain.cpp
+++ b/backends/platform/ds/arm9/source/dsmain.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
// - Remove scummconsole.c
// - Delete files
@@ -55,6 +55,11 @@
// - Alternative controls?
+// - Fix 512x256 backbuffer to 320x240 - Done
+// - Fix keyboard appearing on wrong screen - Done
+// - Volume amplify option
+// - Make save/restore game screen use scaler buffer
+
//#define USE_LIBCARTRESET
@@ -158,7 +163,6 @@ bool bufferFirstHalf;
bool bufferSecondHalf;
// Saved buffers
-u8* savedBuffer = NULL;
bool highBuffer;
bool displayModeIs8Bit = false;
@@ -211,36 +215,41 @@ int gameHeight = 200;
// Scale
bool twoHundredPercentFixedScale = false;
bool cpuScalerEnable = false;
-#define NUM_SUPPORTED_GAMES 17
+#define NUM_SUPPORTED_GAMES 20
#ifdef USE_PROFILER
int hBlankCount = 0;
#endif
+u8* scalerBackBuffer = NULL;
+
gameListType gameList[NUM_SUPPORTED_GAMES] = {
// Unknown game - use normal SCUMM controls
- {"unknown", CONT_SCUMM_ORIGINAL},
-
+ {"unknown", CONT_SCUMM_ORIGINAL},
+
// SCUMM games
{"maniac", CONT_SCUMM_ORIGINAL},
{"zak", CONT_SCUMM_ORIGINAL},
{"loom", CONT_SCUMM_ORIGINAL},
{"indy3", CONT_SCUMM_ORIGINAL},
- {"atlantis", CONT_SCUMM_ORIGINAL},
+ {"atlantis", CONT_SCUMM_ORIGINAL},
{"monkey", CONT_SCUMM_ORIGINAL},
{"monkey2", CONT_SCUMM_ORIGINAL},
- {"tentacle", CONT_SCUMM_ORIGINAL},
+ {"tentacle", CONT_SCUMM_ORIGINAL},
{"samnmax", CONT_SCUMM_SAMNMAX},
-
+
// Non-SCUMM games
{"sky", CONT_SKY},
{"simon1", CONT_SIMON},
{"simon2", CONT_SIMON},
- {"gob", CONT_GOBLINS},
+ {"gob", CONT_GOBLINS},
{"queen", CONT_SCUMM_ORIGINAL},
{"cine", CONT_FUTURE_WARS},
- {"agi", CONT_AGI}
+ {"agi", CONT_AGI},
+ {"elvira2", CONT_SIMON},
+ {"elvira1", CONT_SIMON},
+ {"waxworks", CONT_SIMON},
};
gameListType* currentGame = NULL;
@@ -277,13 +286,14 @@ void updateStatus();
void triggerIcon(int imageNum);
void setIcon(int num, int x, int y, int imageNum, int flags, bool enable);
void setIconMain(int num, int x, int y, int imageNum, int flags, bool enable);
+void uploadSpriteGfx();
TransferSound soundControl;
bool isCpuScalerEnabled()
{
- return cpuScalerEnable;
+ return cpuScalerEnable || !displayModeIs8Bit;
}
@@ -298,11 +308,11 @@ void setCpuScalerEnable(bool enable) {
//plays an 8 bit mono sample at 11025Hz
void playSound(const void* data, u32 length, bool loop, bool adpcm, int rate)
{
-
+
if (!IPC->soundData) {
soundControl.count = 0;
}
-
+
soundControl.data[soundControl.count].data = data;
soundControl.data[soundControl.count].len = length | (loop? 0x80000000: 0x00000000);
soundControl.data[soundControl.count].rate = rate; // 367 samples per frame
@@ -322,8 +332,14 @@ void stopSound(int channel) {
void updateOAM() {
DC_FlushAll();
- dmaCopy(sprites, OAM_SUB, 128 * sizeof(SpriteEntry));
- dmaCopy(spritesMain, OAM, 128 * sizeof(SpriteEntry));
+
+ if (gameScreenSwap) {
+ dmaCopy(sprites, OAM, 128 * sizeof(SpriteEntry));
+ dmaCopy(spritesMain, OAM_SUB, 128 * sizeof(SpriteEntry));
+ } else {
+ dmaCopy(sprites, OAM_SUB, 128 * sizeof(SpriteEntry));
+ dmaCopy(spritesMain, OAM, 128 * sizeof(SpriteEntry));
+ }
}
void setGameSize(int width, int height) {
@@ -346,65 +362,29 @@ void initSprites() {
sprites[i].attribute[2] = 0;
sprites[i].attribute[3] = 0;
}
-
+
for (int i = 0; i < 128; i++) {
spritesMain[i].attribute[0] = ATTR0_DISABLED;
spritesMain[i].attribute[1] = 0;
spritesMain[i].attribute[2] = 0;
spritesMain[i].attribute[3] = 0;
}
-
+
updateOAM();
}
void saveGameBackBuffer() {
-#ifndef ENABLE_SCUMM
- if (savedBuffer == NULL) savedBuffer = new u8[gameWidth * gameHeight];
- for (int r = 0; r < gameHeight; r++) {
-
- u16* dst = (u16 *) (savedBuffer + (r * gameWidth));
- u16* src = BG_GFX_SUB + (r * 256);
- for (int x = 0; x < gameWidth >> 1; x++)
- {
- *dst++ = *src++;
- }
- }
-#endif
+ // Sometimes the only copy of the game screen is in video memory.
+ // So, I lock the video memory here, as if I'm going to modify it. This
+ // forces OSystem_DS to create a system memory copy if one doesn't exist.
+ // This will be automatially resotred by OSystem_DS::updateScreen().
+
+ OSystem_DS::instance()->lockScreen();
+ OSystem_DS::instance()->unlockScreen();
}
-void restoreGameBackBuffer() {
-#ifndef ENABLE_SCUMM
- if (savedBuffer) {
- for (int r = 0; r < gameHeight; r++) {
-
- u16* dst = get8BitBackBuffer() + (r * 256);
- u16* dst2 = BG_GFX_SUB + (r * 256);
- u16* src = ((u16 *) (savedBuffer)) + (r * (gameWidth >> 1));
-
- for (int x = 0; x < gameWidth >> 1; x++)
- {
- *dst++ = *src;
- *dst2++ = *src++;
- }
-
- }
-
- delete savedBuffer;
- savedBuffer = NULL;
- }
-#else
- memset(get8BitBackBuffer(), 0, 512 * 256);
- memset(BG_GFX_SUB, 0, 512 * 256);
- if (Scumm::g_scumm) {
- Scumm::g_scumm->markRectAsDirty(Scumm::kMainVirtScreen, 0, gameWidth - 1, 0, gameHeight - 1, 1);
- Scumm::g_scumm->markRectAsDirty(Scumm::kTextVirtScreen, 0, gameWidth - 1, 0, gameHeight - 1, 1);
- Scumm::g_scumm->markRectAsDirty(Scumm::kVerbVirtScreen, 0, gameWidth - 1, 0, gameHeight - 1, 1);
- }
-#endif
-
-}
void startSound(int freq, int buffer) {
@@ -414,22 +394,22 @@ void startSound(int freq, int buffer) {
bufferFirstHalf = false;
bufferSecondHalf = true;
-
+
int bytes = (2 * (bufferSamples)) + 100;
-
+
soundBuffer = (s16 *) malloc(bytes * 2);
if (!soundBuffer)
consolePrintf("Sound buffer alloc failed\n");
soundHiPart = true;
-
+
for (int r = 0; r < bytes; r++) {
soundBuffer[r] = 0;
}
soundFrequency = freq;
-
+
swiWaitForVBlank();
swiWaitForVBlank();
@@ -461,14 +441,14 @@ void initGame() {
consolePrintf("\n\n\n\nCurrent game: '%s' %d\n", gameName, gameName[0]);
currentGame = &gameList[0]; // Default game
-
+
for (int r = 0; r < NUM_SUPPORTED_GAMES; r++) {
if (!stricmp(gameName, gameList[r].gameId)) {
currentGame = &gameList[r];
// consolePrintf("Game list num: %d\n", currentGame);
}
}
-
+
if (firstTime) {
firstTime = false;
@@ -515,7 +495,7 @@ void displayMode8Bit() {
consolePrintf("displayMode8Bit...");
#endif
u16 buffer[32 * 32];
-
+
setKeyboardEnable(false);
if (!displayModeIs8Bit) {
@@ -524,49 +504,62 @@ void displayMode8Bit() {
}
}
+ consoleInitDefault((u16*)SCREEN_BASE_BLOCK(2), (u16*)CHAR_BASE_BLOCK(0), 16);
+ consolePrintSet(0, 23);
+
+ if (!displayModeIs8Bit) {
+ for (int r = 0; r < 32 * 32; r++) {
+ ((u16 *) SCREEN_BASE_BLOCK(2))[r] = buffer[r];
+ }
+// dmaCopyHalfWords(3, (u16 *) SCREEN_BASE_BLOCK(0), buffer, 32 * 32 * 2);
+ }
+
+ displayModeIs8Bit = true;
+
if (isCpuScalerEnabled())
{
- videoSetMode(MODE_5_2D | (consoleEnable? DISPLAY_BG0_ACTIVE: 0) | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP);
+ videoSetMode(MODE_5_2D | (consoleEnable? DISPLAY_BG0_ACTIVE: 0) | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP);
videoSetModeSub(MODE_3_2D /*| DISPLAY_BG0_ACTIVE*/ | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP); //sub bg 0 will be used to print text
-
+
vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
vramSetBankB(VRAM_B_MAIN_BG_0x06020000);
-
+
vramSetBankC(VRAM_C_SUB_BG_0x06200000);
- vramSetBankD(VRAM_D_MAIN_BG_0x06040000);
-
+ vramSetBankD(VRAM_D_SUB_SPRITE);
+
vramSetBankH(VRAM_H_LCD);
-
+
BG3_CR = BG_BMP16_256x256 | BG_BMP_BASE(8);
BG3_XDX = 256;
BG3_XDY = 0;
BG3_YDX = 0;
BG3_YDY = (int) ((200.0f / 192.0f) * 256);
+
}
else
{
- videoSetMode(MODE_5_2D | (consoleEnable? DISPLAY_BG0_ACTIVE: 0) | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP);
+ videoSetMode(MODE_5_2D | (consoleEnable? DISPLAY_BG0_ACTIVE: 0) | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP);
videoSetModeSub(MODE_3_2D /*| DISPLAY_BG0_ACTIVE*/ | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP); //sub bg 0 will be used to print text
-
+
vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
vramSetBankB(VRAM_B_MAIN_BG_0x06020000);
-
+
vramSetBankC(VRAM_C_SUB_BG_0x06200000);
- vramSetBankD(VRAM_D_MAIN_BG_0x06040000);
-
+ vramSetBankD(VRAM_D_SUB_SPRITE);
+
vramSetBankH(VRAM_H_LCD);
-
+
BG3_CR = BG_BMP8_512x256 | BG_BMP_BASE(8);
-
+
BG3_XDX = (int) (((float) (gameWidth) / 256.0f) * 256);
BG3_XDY = 0;
BG3_YDX = 0;
BG3_YDY = (int) ((200.0f / 192.0f) * 256);
- }
-
+ }
+
SUB_BG3_CR = BG_BMP8_512x256;
-
+
SUB_BG3_XDX = (int) (subScreenWidth / 256.0f * 256);
SUB_BG3_XDY = 0;
SUB_BG3_YDX = 0;
@@ -578,35 +571,29 @@ void displayMode8Bit() {
BG0_CR = BG_MAP_BASE(2) | BG_TILE_BASE(0);
BG0_Y0 = 0;
-
- // Restore palette entry used by text in the front-end
+
+ // Restore palette entry used by text in the front-end
// PALETTE_SUB[255] = savedPalEntry255;
-
- consoleInitDefault((u16*)SCREEN_BASE_BLOCK(2), (u16*)CHAR_BASE_BLOCK(0), 16);
- consolePrintSet(0, 23);
-
- if (!displayModeIs8Bit) {
- for (int r = 0; r < 32 * 32; r++) {
- ((u16 *) SCREEN_BASE_BLOCK(2))[r] = buffer[r];
- }
-// dmaCopyHalfWords(3, (u16 *) SCREEN_BASE_BLOCK(0), buffer, 32 * 32 * 2);
- }
-
+
+
initGame();
-
- if (!displayModeIs8Bit) restoreGameBackBuffer();
- displayModeIs8Bit = true;
+
#ifdef HEAVY_LOGGING
consolePrintf("done\n");
#endif
+ if (gameScreenSwap) {
+ POWER_CR |= POWER_SWAP_LCDS;
+ } else {
+ POWER_CR &= ~POWER_SWAP_LCDS;
+ }
- POWER_CR &= ~POWER_SWAP_LCDS;
-
+ uploadSpriteGfx();
+
keyboardEnable = false;
-
+
}
void setGameID(int id) {
@@ -619,22 +606,22 @@ void dummyHandler() {
void checkSleepMode() {
if (IPC->performArm9SleepMode) {
-
+
consolePrintf("ARM9 Entering sleep mode\n");
-
+
int intSave = REG_IE;
irqSet(IRQ_VBLANK, dummyHandler);
// int irqHandlerSave = (int) IRQ_HANDLER;
REG_IE = IRQ_VBLANK;
//IRQ_HANDLER = dummyHandler;
-
+
int powerSave = POWER_CR;
POWER_CR &= ~POWER_ALL;
-
+
while (IPC->performArm9SleepMode) {
swiWaitForVBlank();
}
-
+
POWER_CR = powerSave;
// IRQ_HANDLER = (void (*)()) irqHandlerSave;
irqSet(IRQ_VBLANK, VBlankHandler);
@@ -671,47 +658,57 @@ void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX,
{
int off = 128*64;
-
-
+
+
memset(SPRITE_GFX + off, 0, 32 * 32 * 2);
-
+ memset(SPRITE_GFX_SUB + off, 0, 32 * 32 * 2);
+
for (uint y=0; y<h; y++) {
for (uint x=0; x<w; x++) {
int color = icon[y*w+x];
-
+
if (color == keycolor) {
SPRITE_GFX[off+(y)*32+x] = 0x0000; // black background
+ SPRITE_GFX_SUB[off+(y)*32+x] = 0x0000; // black background
} else {
SPRITE_GFX[off+(y)*32+x] = BG_PALETTE[color] | 0x8000;
+ SPRITE_GFX_SUB[off+(y)*32+x] = BG_PALETTE[color] | 0x8000;
}
}
}
-
+
}
if (currentGame->control != CONT_SCUMM_SAMNMAX)
return;
uint16 border = RGB15(24,24,24) | 0x8000;
-
-
- int off = 48*64;
+
+
+ int off = 176*64;
memset(SPRITE_GFX_SUB+off, 0, 64*64*2);
-
+ memset(SPRITE_GFX+off, 0, 64*64*2);
+
int pos = 190 - (w+2);
+
-
-
+
// make border
for (uint i=0; i<w+2; i++) {
+ SPRITE_GFX[off+i] = border;
+ SPRITE_GFX[off+(31)*64+i] = border;
+
SPRITE_GFX_SUB[off+i] = border;
SPRITE_GFX_SUB[off+(31)*64+i] = border;
}
for (uint i=1; i<31; i++) {
+ SPRITE_GFX[off+(i*64)] = border;
+ SPRITE_GFX[off+(i*64)+(w+1)] = border;
+
SPRITE_GFX_SUB[off+(i*64)] = border;
SPRITE_GFX_SUB[off+(i*64)+(w+1)] = border;
}
-
+
int offset = (32 - h) >> 1;
for (uint y=0; y<h; y++) {
@@ -719,23 +716,24 @@ void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX,
int color = icon[y*w+x];
if (color == keycolor) {
+ SPRITE_GFX[off+(y+1+offset)*64+(x+1)] = 0x8000; // black background
SPRITE_GFX_SUB[off+(y+1+offset)*64+(x+1)] = 0x8000; // black background
} else {
+ SPRITE_GFX[off+(y+1+offset)*64+(x+1)] = BG_PALETTE[color] | 0x8000;
SPRITE_GFX_SUB[off+(y+1+offset)*64+(x+1)] = BG_PALETTE[color] | 0x8000;
}
}
}
-
-
- if ((cursorEnable))
- {
+
+
+ if ((cursorEnable)) {
sprites[1].attribute[0] = ATTR0_BMP | 150;
sprites[1].attribute[1] = ATTR1_SIZE_64 | pos;
- sprites[1].attribute[2] = ATTR2_ALPHA(1) | 48;
+ sprites[1].attribute[2] = ATTR2_ALPHA(1) | 176;
} else {
sprites[1].attribute[0] = ATTR0_DISABLED | 150;
sprites[1].attribute[1] = ATTR1_SIZE_64 | pos;
- sprites[1].attribute[2] = ATTR2_ALPHA(1) | 48;
+ sprites[1].attribute[2] = ATTR2_ALPHA(1) | 176;
}
}
@@ -751,6 +749,8 @@ void displayMode16Bit() {
if (displayModeIs8Bit) {
+ static int test = 0;
+// consolePrintf("saving buffer... %d\n", test++);
saveGameBackBuffer();
for (int r = 0; r < 32 * 32; r++) {
buffer[r] = ((u16 *) SCREEN_BASE_BLOCK(2))[r];
@@ -758,7 +758,7 @@ void displayMode16Bit() {
}
- videoSetMode(MODE_5_2D | /*DISPLAY_BG0_ACTIVE |*/ DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP);
+ videoSetMode(MODE_5_2D | /*DISPLAY_BG0_ACTIVE |*/ DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP);
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE |/* DISPLAY_BG1_ACTIVE |*/ DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP); //sub bg 0 will be used to print text
vramSetBankA(VRAM_A_MAIN_BG);
@@ -769,14 +769,10 @@ void displayMode16Bit() {
BG3_CR = BG_BMP16_512x256;
highBuffer = false;
-
- BG3_XDX = isCpuScalerEnabled() ? 256 : (int) (1.25f * 256);
- BG3_XDY = 0;
- BG3_YDX = 0;
- BG3_YDY = (int) ((200.0f / 192.0f) * 256);
+
memset(BG_GFX, 0, 512 * 256 * 2);
-
+
savedPalEntry255 = PALETTE_SUB[255];
PALETTE_SUB[255] = RGB15(31,31,31);//by default font will be rendered with color 255
@@ -795,14 +791,20 @@ void displayMode16Bit() {
consolePrintSet(0, 23);
consolePrintf("\n");
-
+
// Show keyboard
SUB_BG1_CR = BG_TILE_BASE(1) | BG_MAP_BASE(12);
//drawKeyboard(1, 12);
-
+
POWER_CR &= ~POWER_SWAP_LCDS;
displayModeIs8Bit = false;
+
+ BG3_XDX = isCpuScalerEnabled() ? 256 : (int) (1.25f * 256);
+ BG3_XDY = 0;
+ BG3_YDX = 0;
+ BG3_YDY = (int) ((200.0f / 192.0f) * 256);
+
#ifdef HEAVY_LOGGING
consolePrintf("done\n");
#endif
@@ -816,13 +818,13 @@ void displayMode16BitFlipBuffer() {
#endif
if (!displayModeIs8Bit) {
u16* back = get16BitBackBuffer();
-
+
// highBuffer = !highBuffer;
// BG3_CR = BG_BMP16_512x256 | BG_BMP_RAM(highBuffer? 1: 0);
-
+
if (isCpuScalerEnabled())
{
- Rescale_320x256x1555_To_256x256x1555(BG_GFX, back, 512, 512);
+ Rescale_320x256x1555_To_256x256x1555(BG_GFX, back, 512, 512);
}
else
{
@@ -841,12 +843,14 @@ void displayMode16BitFlipBuffer() {
#endif
const u8* back = (const u8*)get8BitBackBuffer();
u16* base = BG_GFX + 0x10000;
- Rescale_320x256xPAL8_To_256x256x1555( base,
- back,
- 256,
- 512,
- BG_PALETTE );
-
+ Rescale_320x256xPAL8_To_256x256x1555(
+ base,
+ back,
+ 256,
+ get8BitBackBufferStride(),
+ BG_PALETTE,
+ getGameHeight() );
+
#ifdef SCALER_PROFILE
// 10 pixels : 1ms
u16 t1 = TIMER1_DATA;
@@ -875,9 +879,24 @@ u16* get16BitBackBuffer() {
return BG_GFX + 0x20000;
}
+s32 get8BitBackBufferStride() {
+ // When the CPU scaler is enabled, the back buffer is in system RAM and is 320 pixels wide
+ // When the CPU scaler is disabled, the back buffer is in video memory and therefore must have a 512 pixel stride
+
+ if (isCpuScalerEnabled()){
+ return 320;
+ } else {
+ return 512;
+ }
+}
+
+u16* getScalerBuffer() {
+ return (u16 *) scalerBackBuffer;
+}
+
u16* get8BitBackBuffer() {
if (isCpuScalerEnabled())
- return BG_GFX + 0x60000;
+ return (u16 *) scalerBackBuffer;
else
return BG_GFX + 0x10000; // 16bit qty!
}
@@ -899,10 +918,10 @@ void doSoundCallback() {
if (soundCallback) {
lastCallbackFrame = frameCount;
-
+
for (int r = IPC->playingSection; r < IPC->playingSection + 4; r++) {
int chunk = r & 3;
-
+
if (IPC->fillNeeded[chunk]) {
IPC->fillNeeded[chunk] = false;
DC_FlushAll();
@@ -910,9 +929,9 @@ void doSoundCallback() {
IPC->fillNeeded[chunk] = false;
DC_FlushAll();
}
-
+
}
-
+
}
#ifdef HEAVY_LOGGING
consolePrintf("done\n");
@@ -924,7 +943,7 @@ void doTimerCallback() {
if (callbackTimer <= 0) {
callbackTimer += callbackInterval;
callback(callbackInterval);
- }
+ }
}
}
@@ -933,15 +952,15 @@ void soundUpdate() {
// playSound(soundBuffer, (bufferSamples * 2), true);
}
// consolePrintf("%x\n", IPC->test);
-
-
+
+
if (bufferFrame == 0) {
// bufferFirstHalf = true;
- }
+ }
if (bufferFrame == bufferSize >> 1) {
//bufferSecondHalf = true;
- }
-
+ }
+
bufferFrame++;
if (bufferFrame == bufferSize) {
bufferFrame = 0;
@@ -954,20 +973,20 @@ void memoryReport() {
do {
p = (int *) malloc(r * 8192);
free(p);
- r++;
+ r++;
} while ((p) && (r < 512));
-
+
int t = -1;
void* block[1024];
do {
t++;
block[t] = (int *) malloc(4096);
- } while ((t < 1024) && (block[t]));
-
+ } while ((t < 1024) && (block[t]));
+
for (int q = 0; q < t; q++) {
free(block[q]);
}
-
+
consolePrintf("Free: %dK, Largest: %dK\n", t * 4, r * 8);
}
@@ -978,7 +997,7 @@ void addIndyFightingKeys() {
event.type = Common::EVENT_KEYDOWN;
event.kbd.flags = 0;
-
+
// consolePrintf("Fight keys\n");
if ((getKeysDown() & KEY_L)) {
@@ -1008,16 +1027,16 @@ void addIndyFightingKeys() {
event.kbd.keycode = Common::KEYCODE_6;
event.kbd.ascii = '6';
system->addEvent(event);
- }
+ }
if ((getKeysChanged() & KEY_DOWN)) {
event.type = getKeyEvent(KEY_DOWN);
event.kbd.keycode = Common::KEYCODE_2;
event.kbd.ascii = '2';
system->addEvent(event);
}
-
+
if (indyFightRight) {
-
+
if ((getKeysChanged() & KEY_X)) {
event.type = getKeyEvent(KEY_X);
event.kbd.keycode = Common::KEYCODE_9;
@@ -1035,7 +1054,7 @@ void addIndyFightingKeys() {
event.kbd.keycode = Common::KEYCODE_3;
event.kbd.ascii = '3';
system->addEvent(event);
- }
+ }
} else {
@@ -1056,18 +1075,18 @@ void addIndyFightingKeys() {
event.kbd.keycode = Common::KEYCODE_1;
event.kbd.ascii = '1';
system->addEvent(event);
- }
-
+ }
+
}
-
-
+
+
if ((getKeysChanged() & KEY_Y)) {
event.type = getKeyEvent(KEY_Y);
event.kbd.keycode = Common::KEYCODE_5;
event.kbd.ascii = '5';
system->addEvent(event);
}
-}
+}
void setKeyboardEnable(bool en) {
@@ -1079,8 +1098,8 @@ void setKeyboardEnable(bool en) {
DS::drawKeyboard(1, 15, backupBank);
-
-
+
+
SUB_BG1_CR = BG_TILE_BASE(1) | BG_MAP_BASE(15);
if (displayModeIs8Bit) {
@@ -1090,7 +1109,11 @@ void setKeyboardEnable(bool en) {
SUB_DISPLAY_CR |= DISPLAY_BG1_ACTIVE; // Turn on keyboard layer
SUB_DISPLAY_CR &= ~DISPLAY_BG0_ACTIVE; // Turn off console layer
}
- lcdSwap();
+
+ // Ensure the keyboard is on the lower screen
+ POWER_CR |= POWER_SWAP_LCDS;
+
+
} else {
@@ -1098,26 +1121,38 @@ void setKeyboardEnable(bool en) {
for (int r = 0; r < 256; r++) {
BG_PALETTE_SUB[r] = BG_PALETTE[r];
}
-
-
+
+
//restoreVRAM(1, 12, backupBank);
-
+
if (displayModeIs8Bit) {
// Copy the sub screen VRAM from the top screen - they should always be
// the same.
u16* buffer = get8BitBackBuffer();
+ s32 stride = get8BitBackBufferStride();
+ for (int y = 0; y < gameHeight; y++) {
+ for (int x = 0; x < gameWidth; x++) {
+ BG_GFX_SUB[y * 256 + x] = buffer[(y * (stride / 2)) + x];
+ }
+ }
+/*
for (int r = 0; r < (512 * 256) >> 1; r++)
BG_GFX_SUB[r] = buffer[r];
-
+ */
SUB_DISPLAY_CR &= ~DISPLAY_BG1_ACTIVE; // Turn off keyboard layer
SUB_DISPLAY_CR |= DISPLAY_BG3_ACTIVE; // Turn on game layer
} else {
SUB_DISPLAY_CR &= ~DISPLAY_BG1_ACTIVE; // Turn off keyboard layer
SUB_DISPLAY_CR |= DISPLAY_BG0_ACTIVE; // Turn on console layer
}
-
- lcdSwap();
+
+ // Restore the screens so they're the right way round
+ if (gameScreenSwap) {
+ POWER_CR |= POWER_SWAP_LCDS;
+ } else {
+ POWER_CR &= ~POWER_SWAP_LCDS;
+ }
}
}
@@ -1136,7 +1171,7 @@ void addEventsToQueue() {
OSystem_DS* system = OSystem_DS::instance();
Common::Event event;
-
+
#ifdef USE_PROFILER
if (keysDown() & KEY_R) {
cygprofile_begin();
@@ -1148,7 +1183,7 @@ void addEventsToQueue() {
}
#endif
-
+
if (system->isEventQueueEmpty()) {
/*
@@ -1157,7 +1192,7 @@ void addEventsToQueue() {
consolePrintf("Tweak: %d\n", tweak);
IPC->tweakChanged = true;
}
-
+
if (getKeysDown() & KEY_R) {
tweak++;
@@ -1173,14 +1208,14 @@ void addEventsToQueue() {
if (!indyFightState) {
- if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_B)) {
+ if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_B)) {
if (currentGame->control == CONT_AGI) {
event.kbd.keycode = Common::KEYCODE_RETURN;
event.kbd.ascii = 13;
event.kbd.flags = 0;
} else {
- event.kbd.keycode = Common::KEYCODE_ESCAPE;
- event.kbd.ascii = 27;
+ event.kbd.keycode = Common::KEYCODE_ESCAPE;
+ event.kbd.ascii = 27;
event.kbd.flags = 0;
}
@@ -1190,11 +1225,11 @@ void addEventsToQueue() {
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
}
-
+
}
-
-
-
+
+
+
if ((!getIndyFightState()) && (getKeysDown() & KEY_Y)) {
consoleEnable = !consoleEnable;
if (displayModeIs8Bit) {
@@ -1203,7 +1238,7 @@ void addEventsToQueue() {
displayMode16Bit();
}
}
-
+
if ((getKeyboardEnable())) {
event.kbd.flags = 0;
@@ -1211,30 +1246,30 @@ void addEventsToQueue() {
bool release = getKeysReleased() & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN);
bool shoulders = getKeysHeld() & (KEY_L | KEY_R);
- if ( (down && (!shoulders)) || release)
+ if ( (down && (!shoulders)) || release)
{
-
+
if (getKeysChanged() & KEY_LEFT) {
event.kbd.keycode = Common::KEYCODE_LEFT;
event.kbd.ascii = 0;
event.type = getKeyEvent(KEY_LEFT);
system->addEvent(event);
}
-
+
if (getKeysChanged() & KEY_RIGHT) {
event.kbd.keycode = Common::KEYCODE_RIGHT;
event.kbd.ascii = 0;
event.type = getKeyEvent(KEY_RIGHT);
system->addEvent(event);
}
-
+
if (getKeysChanged() & KEY_UP) {
event.kbd.keycode = Common::KEYCODE_UP;
event.kbd.ascii = 0;
event.type = getKeyEvent(KEY_UP);
system->addEvent(event);
}
-
+
if (getKeysChanged() & KEY_DOWN) {
event.kbd.keycode = Common::KEYCODE_DOWN;
event.kbd.ascii = 0;
@@ -1242,15 +1277,22 @@ void addEventsToQueue() {
system->addEvent(event);
}
}
-
+
}
-
+
if (!((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (!getIndyFightState()) && (!getKeyboardEnable())) {
if ((getKeysDown() & KEY_A) && (!indyFightState)) {
gameScreenSwap = !gameScreenSwap;
- }
+ if (gameScreenSwap) {
+ POWER_CR |= POWER_SWAP_LCDS;
+ } else {
+ POWER_CR &= ~POWER_SWAP_LCDS;
+ }
+
+ }
+
if (!getPenHeld() || (mouseMode != MOUSE_HOVER)) {
if (getKeysDown() & KEY_LEFT) {
mouseMode = MOUSE_LEFT;
@@ -1264,7 +1306,7 @@ void addEventsToQueue() {
system->addEvent(event);
rightButtonDown = false;
}
-
+
if (getKeysDown() & KEY_RIGHT) {
if ((currentGame->control != CONT_SCUMM_SAMNMAX) && (currentGame->control != CONT_FUTURE_WARS) && (currentGame->control != CONT_GOBLINS)) {
@@ -1281,13 +1323,13 @@ void addEventsToQueue() {
} else {
event.mouse = Common::Point(getPenX(), getPenY());
}
-
+
rightButtonDown = true;
-
+
event.type = Common::EVENT_RBUTTONDOWN;
system->addEvent(event);
-
+
//event.type = Common::EVENT_RBUTTONUP;
//system->addEvent(event);
}
@@ -1299,9 +1341,9 @@ void addEventsToQueue() {
mouseMode = MOUSE_HOVER;
}
}
-
-
-
+
+
+
}
if ((getKeysDown() & KEY_SELECT)) {
@@ -1310,18 +1352,18 @@ void addEventsToQueue() {
showOptionsDialog();
}
-
+
}
-
+
if (!getIndyFightState() && !((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_X)) {
setKeyboardEnable(!keyboardEnable);
}
-
- updateStatus();
-
+
+ updateStatus();
+
Common::Event event;
-
+
if (!keyboardEnable) {
if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) {
@@ -1332,12 +1374,12 @@ void addEventsToQueue() {
}
if ((mouseMode != MOUSE_HOVER) || (!displayModeIs8Bit)) {
- if (getPenDown() && (!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) {
+ if (getPenDown() && (!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) {
event.type = ((mouseMode == MOUSE_LEFT) || (!displayModeIs8Bit))? Common::EVENT_LBUTTONDOWN: Common::EVENT_RBUTTONDOWN;
event.mouse = Common::Point(getPenX(), getPenY());
system->addEvent(event);
}
-
+
if (getPenReleased()) {
event.type = mouseMode == MOUSE_LEFT? Common::EVENT_LBUTTONUP: Common::EVENT_RBUTTONUP;
event.mouse = Common::Point(getPenX(), getPenY());
@@ -1345,36 +1387,37 @@ void addEventsToQueue() {
}
} else {
// In hover mode, D-pad left and right click the mouse when the pen is on the screen
-
+
if (getPenHeld()) {
if (getKeysDown() & KEY_LEFT) {
event.type = Common::EVENT_LBUTTONDOWN;
event.mouse = Common::Point(getPenX(), getPenY());
system->addEvent(event);
}
- /* if (getKeysReleased() & KEY_LEFT) {
+ if (getKeysReleased() & KEY_LEFT) {
event.type = Common::EVENT_LBUTTONUP;
event.mouse = Common::Point(getPenX(), getPenY());
system->addEvent(event);
- }*/
+ }
+
if (getKeysDown() & KEY_RIGHT) {
event.type = Common::EVENT_RBUTTONDOWN;
event.mouse = Common::Point(getPenX(), getPenY());
system->addEvent(event);
}
- /*if (getKeysReleased() & KEY_RIGHT) {
+ if (getKeysReleased() & KEY_RIGHT) {
event.type = Common::EVENT_RBUTTONUP;
event.mouse = Common::Point(getPenX(), getPenY());
system->addEvent(event);
- }*/
+ }
}
}
-
+
if (((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) || (indyFightState)) && (displayModeIs8Bit)) {
// Controls specific to the control method
-
-
+
+
if (currentGame->control == CONT_SKY) {
// Extra controls for Beneath a Steel Sky
if ((getKeysDown() & KEY_DOWN)) {
@@ -1387,7 +1430,7 @@ void addEventsToQueue() {
// Extra controls for Simon the Sorcerer
if ((getKeysDown() & KEY_DOWN)) {
Common::Event event;
-
+
event.type = Common::EVENT_KEYDOWN;
event.kbd.keycode = Common::KEYCODE_F10; // F10 or # - show hotspots
event.kbd.ascii = Common::ASCII_F10;
@@ -1400,13 +1443,13 @@ void addEventsToQueue() {
}
}
-
-
+
+
if (currentGame->control == CONT_SCUMM_ORIGINAL) {
// Extra controls for Scumm v1-5 games
if ((getKeysDown() & KEY_DOWN)) {
Common::Event event;
-
+
event.type = Common::EVENT_KEYDOWN;
event.kbd.keycode = Common::KEYCODE_PERIOD; // Full stop - skips current dialogue line
event.kbd.ascii = '.';
@@ -1416,19 +1459,19 @@ void addEventsToQueue() {
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
}
-
+
if (indyFightState) {
addIndyFightingKeys();
}
-
+
}
-
+
}
}
-
+
if (!displayModeIs8Bit) {
// Front end controls
-
+
if (leftHandedSwap(getKeysChanged()) & KEY_UP) {
event.type = getKeyEvent(leftHandedSwap(KEY_UP));
event.kbd.keycode = Common::KEYCODE_UP;
@@ -1455,10 +1498,10 @@ void addEventsToQueue() {
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
}
-
+
}
-
+
if ((getKeysChanged() & KEY_START)) {
event.type = getKeyEvent(KEY_START);
if (currentGame->control == CONT_FUTURE_WARS) {
@@ -1477,38 +1520,37 @@ void addEventsToQueue() {
// consolePrintf("!!!!!F5!!!!!");
}
event.kbd.flags = 0;
- consolePrintf("!!!!!F5!!!!!");
system->addEvent(event);
}
-
+
if (keyboardEnable) {
DS::addKeyboardEvents();
}
-
+
consumeKeys();
-
+
consumePenEvents();
}
}
-
+
void triggerIcon(int imageNum) {
triggeredIcon = imageNum;
- triggeredIconTimeout = 120;
+ triggeredIconTimeout = 120;
}
-
+
void setIcon(int num, int x, int y, int imageNum, int flags, bool enable) {
- sprites[num].attribute[0] = ATTR0_BMP | (enable? y: 192) | (!enable? ATTR0_DISABLED: 0);
+ sprites[num].attribute[0] = ATTR0_BMP | (enable? y: 192) | (!enable? ATTR0_DISABLED: 0);
sprites[num].attribute[1] = ATTR1_SIZE_32 | x | flags;
sprites[num].attribute[2] = ATTR2_ALPHA(1)| (imageNum * 16);
}
void setIconMain(int num, int x, int y, int imageNum, int flags, bool enable) {
- spritesMain[num].attribute[0] = ATTR0_BMP | (y & 0xFF) | (!enable? ATTR0_DISABLED: 0);
+ spritesMain[num].attribute[0] = ATTR0_BMP | (y & 0xFF) | (!enable? ATTR0_DISABLED: 0);
spritesMain[num].attribute[1] = ATTR1_SIZE_32 | (x & 0x1FF) | flags;
spritesMain[num].attribute[2] = ATTR2_ALPHA(1)| (imageNum * 16);
}
@@ -1536,16 +1578,16 @@ void updateStatus() {
break;
}
}
-
+
setIcon(0, 208, 150, offs, 0, true);
-
+
if (indyFightState) {
setIcon(1, (190 - 32), 150, 3, (indyFightRight? 0: ATTR1_FLIP_X), true);
// consolePrintf("%d\n", indyFightRight);
} else {
// setIcon(1, 0, 0, 0, 0, false);
}
-
+
if (triggeredIconTimeout > 0) {
triggeredIconTimeout--;
setIcon(4, 16, 150, triggeredIcon, 0, true);
@@ -1584,30 +1626,32 @@ void soundBufferEmptyHandler() {
} else {
// bufferFirstHalf = true;
}
-
+
soundHiPart = !soundHiPart;
}
void setMainScreenScroll(int x, int y) {
- if (gameScreenSwap) {
+/* if (gameScreenSwap) {
SUB_BG3_CX = x + (((frameCount & 1) == 0)? 64: 0);
SUB_BG3_CY = y;
- } else {
+ } else */{
BG3_CX = x + (((frameCount & 1) == 0)? 64: 0);
BG3_CY = y;
-
- touchX = x >> 8;
- touchY = y >> 8;
+
+ if (!gameScreenSwap) {
+ touchX = x >> 8;
+ touchY = y >> 8;
+ }
}
}
void setMainScreenScale(int x, int y) {
- if (gameScreenSwap) {
+/* if (gameScreenSwap) {
SUB_BG3_XDX = x;
SUB_BG3_XDY = 0;
SUB_BG3_YDX = 0;
SUB_BG3_YDY = y;
- } else {
+ } else*/ {
if (isCpuScalerEnabled() && (x==320))
{
BG3_XDX = 256;
@@ -1616,41 +1660,54 @@ void setMainScreenScale(int x, int y) {
BG3_YDY = y;
}
else
- {
+ {
BG3_XDX = x;
BG3_XDY = 0;
BG3_YDX = 0;
BG3_YDY = y;
}
-
- touchScX = x;
- touchScY = y;
+
+ if (!gameScreenSwap) {
+ touchScX = x;
+ touchScY = y;
+ }
}
}
void setZoomedScreenScroll(int x, int y, bool shake) {
- if (gameScreenSwap) {
+/* if (gameScreenSwap) {
BG3_CX = x + ((shake && ((frameCount & 1) == 0))? 64: 0);
BG3_CY = y;
-
+
touchX = x >> 8;
touchY = y >> 8;
- } else {
+ } else */{
+
+ if (gameScreenSwap) {
+ touchX = x >> 8;
+ touchY = y >> 8;
+ }
+
+
SUB_BG3_CX = x + ((shake && (frameCount & 1) == 0)? 64: 0);
SUB_BG3_CY = y;
}
}
void setZoomedScreenScale(int x, int y) {
- if (gameScreenSwap) {
+/* if (gameScreenSwap) {
BG3_XDX = x;
BG3_XDY = 0;
BG3_YDX = 0;
BG3_YDY = y;
- touchScX = x;
- touchScY = y;
- } else {
+ } else */{
+
+ if (gameScreenSwap) {
+ touchScX = x;
+ touchScY = y;
+ }
+
SUB_BG3_XDX = x;
SUB_BG3_XDY = 0;
SUB_BG3_YDX = 0;
@@ -1684,7 +1741,7 @@ void VBlankHandler(void) {
soundUpdate();
-
+
if ((!gameScreenSwap) && (!(getKeysHeld() & KEY_L) && !(getKeysHeld() & KEY_R))) {
if (currentGame) {
@@ -1699,14 +1756,14 @@ void VBlankHandler(void) {
}
}
}
-
+
penUpdate();
keysUpdate();
frameCount++;
-
+
if ((cursorEnable) && (mouseCursorVisible))
{
if (!keyboardEnable) {
@@ -1725,31 +1782,31 @@ void VBlankHandler(void) {
if (callback) {
callbackTimer -= FRAME_TIME;
}
-
+
if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) {
-
+
if ((!dragging) && (getPenHeld()) && (penDownFrames > 5)) {
dragging = true;
dragStartX = penX;
dragStartY = penY;
-
+
if (gameScreenSwap) {
dragScX = subScTargetX;
dragScY = subScTargetY;
} else {
dragScX = scX;
- dragScY = scY;
- }
-
-
+ dragScY = scY;
+ }
+
+
}
-
+
if ((dragging) && (!getPenHeld())) {
dragging = false;
}
-
+
if (dragging) {
-
+
if (gameScreenSwap) {
subScTargetX = dragScX + ((dragStartX - penX) << 8);
subScTargetY = dragScY + ((dragStartY - penY) << 8);
@@ -1757,18 +1814,18 @@ void VBlankHandler(void) {
scX = dragScX + ((dragStartX - penX));
scY = dragScY + ((dragStartY - penY));
}
-
+
// consolePrintf("X:%d Y:%d\n", dragStartX - penX, dragStartY - penY);
}
- }
-
-
+ }
+
+
/* if ((frameCount & 1) == 0) {
SUB_BG3_CX = subScX;
} else {
SUB_BG3_CX = subScX + 64;
}
-
+
SUB_BG3_CY = subScY + (shakePos << 8);*/
/*SUB_BG3_XDX = (int) (subScreenWidth / 256.0f * 256);
@@ -1777,40 +1834,40 @@ void VBlankHandler(void) {
SUB_BG3_YDY = (int) (subScreenHeight / 192.0f * 256);*/
static int ratio = ( 320 << 8) / SCUMM_GAME_WIDTH;
-
+
bool zooming = false;
-
+
if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) {
if ((getKeysHeld() & KEY_A) && (subScreenScale < ratio)) {
subScreenScale += 1;
zooming = true;
}
-
+
if ((getKeysHeld() & KEY_B) && (subScreenScale > 128)) {
subScreenScale -=1;
zooming = true;
}
}
-
+
int xCenter = subScTargetX + ((subScreenWidth >> 1) << 8);
int yCenter = subScTargetY + ((subScreenHeight >> 1) << 8);
-
+
if (twoHundredPercentFixedScale) {
subScreenWidth = 256 >> 1;
subScreenHeight = 192 >> 1;
} else {
subScreenWidth = (((SCUMM_GAME_HEIGHT * 256) / 192) * subScreenScale) >> 8;
subScreenHeight = SCUMM_GAME_HEIGHT * subScreenScale >> 8;
-
+
if ( ((subScreenWidth) > 256 - 8) && ((subScreenWidth) < 256 + 8) ) {
subScreenWidth = 256;
subScreenHeight = 192;
if (zooming) {
subScX = subScTargetX;
subScY = subScTargetY;
- triggerIcon(5);
+ triggerIcon(5);
}
} else if ( ((subScreenWidth) > 128 - 8) && ((subScreenWidth) < 128 + 8) ) {
subScreenWidth = 128;
@@ -1832,13 +1889,13 @@ void VBlankHandler(void) {
//triggerIcon(-1);
}
}
-
+
subScTargetX = xCenter - ((subScreenWidth >> 1) << 8);
subScTargetY = yCenter - ((subScreenHeight >> 1) << 8);
+
-
-
+
if (subScTargetX < 0) subScTargetX = 0;
if (subScTargetX > (gameWidth - subScreenWidth) << 8) subScTargetX = (gameWidth - subScreenWidth) << 8;
@@ -1850,30 +1907,30 @@ void VBlankHandler(void) {
subScX += (subScTargetX - subScX) >> 2;
subScY += (subScTargetY - subScY) >> 2;
-
+
if (displayModeIs8Bit) {
-
+
if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) {
-
+
int offsX = 0, offsY = 0;
if (getKeysHeld() & KEY_LEFT) {
offsX -= 1;
}
-
+
if (getKeysHeld() & KEY_RIGHT) {
offsX += 1;
}
-
+
if (getKeysHeld() & KEY_UP) {
offsY -= 1;
}
-
+
if (getKeysHeld() & KEY_DOWN) {
offsY += 1;
}
-
+
if (((gameScreenSwap) && (getKeysHeld() & KEY_L)) || ((!gameScreenSwap) && (getKeysHeld() & KEY_R))) {
subScTargetX += offsX << 8;
subScTargetY += offsY << 8;
@@ -1884,32 +1941,32 @@ void VBlankHandler(void) {
}
if (!scaledMode) {
-
+
if (scX + 256 > gameWidth - 1) {
scX = gameWidth - 1 - 256;
}
-
+
if (scX < 0) {
scX = 0;
}
-
+
if (scY + 192 > gameHeight - 1) {
scY = gameHeight - 1 - 192;
}
-
+
if (scY < 0) {
scY = 0;
}
-
+
setZoomedScreenScroll(subScX, subScY, (subScreenWidth != 256) && (subScreenWidth != 128));
setZoomedScreenScale(subScreenWidth, ((subScreenHeight * (256 << 8)) / 192) >> 8);
-
-
+
+
setMainScreenScroll(scX << 8, (scY << 8) + (shakePos << 8));
setMainScreenScale(256, 256); // 1:1 scale
-
+
} else {
-
+
if (scY > gameHeight - 192 - 1) {
scY = gameHeight - 192 - 1;
}
@@ -1917,13 +1974,13 @@ void VBlankHandler(void) {
if (scY < 0) {
scY = 0;
}
-
+
setZoomedScreenScroll(subScX, subScY, (subScreenWidth != 256) && (subScreenWidth != 128));
setZoomedScreenScale(subScreenWidth, ((subScreenHeight * (256 << 8)) / 192) >> 8);
-
+
setMainScreenScroll(64, (scY << 8) + (shakePos << 8));
setMainScreenScale(320, 256); // 1:1 scale
-
+
}
} else {
setZoomedScreenScroll(0, 0, true);
@@ -1932,12 +1989,12 @@ void VBlankHandler(void) {
setMainScreenScroll(0, 0);
setMainScreenScale(320, 256); // 1:1 scale
}
-
+
// Enable on screen keyboard when pen taps icon
if ((keyboardIcon) && (penX < 32) && (penY > 160) && (penHeld)) {
setKeyboardEnable(true);
}
-
+
if (keyboardEnable) {
if (DS::getKeyboardClosed()) {
setKeyboardEnable(false);
@@ -1987,7 +2044,7 @@ void setTopScreenTarget(int x, int y) {
if (subScTargetY < 0) subScTargetY = 0;
if (subScTargetY > gameHeight - subScreenHeight) subScTargetY = gameHeight - subScreenHeight;
-
+
subScTargetX <<=8;
subScTargetY <<=8;
}
@@ -2000,6 +2057,19 @@ void hBlankHandler() {
}
#endif
+void uploadSpriteGfx() {
+ vramSetBankD(VRAM_D_SUB_SPRITE);
+ vramSetBankE(VRAM_E_MAIN_SPRITE);
+
+ // Convert texture from 24bit 888 to 16bit 1555, remembering to set top bit!
+ u8* srcTex = (u8 *) icons_raw;
+ for (int r = 32 * 256 ; r >= 0; r--) {
+ SPRITE_GFX_SUB[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10);
+ SPRITE_GFX[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10);
+ }
+
+}
+
void initHardware() {
// Guard band
//((int *) (0x023FFF00)) = 0xBEEFCAFE;
@@ -2008,12 +2078,12 @@ void initHardware() {
penInit();
powerON(POWER_ALL);
-/* vramSetBankA(VRAM_A_MAIN_BG);
- vramSetBankB(VRAM_B_MAIN_BG);
+/* vramSetBankA(VRAM_A_MAIN_BG);
+ vramSetBankB(VRAM_B_MAIN_BG);
vramSetBankC(VRAM_C_SUB_BG); */
- vramSetBankI(VRAM_I_SUB_SPRITE);
- vramSetBankE(VRAM_E_MAIN_SPRITE);
-
+ vramSetBankD(VRAM_D_SUB_SPRITE);
+ vramSetBankE(VRAM_E_MAIN_SPRITE);
+
currentTimeMillis = 0;
@@ -2041,8 +2111,8 @@ void initHardware() {
// Allocate save buffer for game screen
// savedBuffer = new u8[320 * 200];
displayMode16Bit();
-
- memset(BG_GFX, 0, 512 * 256 * 2);
+
+ memset(BG_GFX, 0, 512 * 256 * 2);
scaledMode = true;
scX = 0;
scY = 0;
@@ -2050,33 +2120,33 @@ void initHardware() {
subScY = 0;
subScTargetX = 0;
subScTargetY = 0;
-
+
//lcdSwap();
POWER_CR &= ~POWER_SWAP_LCDS;
-
+
frameCount = 0;
callback = NULL;
-
-// vramSetBankH(VRAM_H_SUB_BG);
-
+
+// vramSetBankH(VRAM_H_SUB_BG);
+
// // Do text stuff
//BG0_CR = BG_MAP_BASE(0) | BG_TILE_BASE(1);
// BG0_Y0 = 48;
-
+
PALETTE[255] = RGB15(31,31,31);//by default font will be rendered with color 255
-
+
//consoleInit() is a lot more flexible but this gets you up and running quick
// consoleInitDefault((u16*)SCREEN_BASE_BLOCK(0), (u16*)CHAR_BASE_BLOCK(1), 16);
//consolePrintSet(0, 6);
-
+
//irqs are nice
irqInit();
// irqInitHandler();
irqSet(IRQ_VBLANK, VBlankHandler);
irqSet(IRQ_TIMER0, timerTickHandler);
irqSet(IRQ_TIMER2, soundBufferEmptyHandler);
-
+
irqEnable(IRQ_VBLANK);
irqEnable(IRQ_TIMER0);
irqEnable(IRQ_TIMER2);
@@ -2085,15 +2155,15 @@ void initHardware() {
irqSet(IRQ_HBLANK, hBlankHandler);
irqEnable(IRQ_HBLANK);
#endif
-
-
+
+
// Set up a millisecond timer
#ifdef HEAVY_LOGGING
consolePrintf("Setting up timer...");
#endif
TIMER0_CR = 0;
TIMER0_DATA = (u32) TIMER_FREQ(1000);
- TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1 | TIMER_IRQ_REQ;
+ TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1 | TIMER_IRQ_REQ;
REG_IME = 1;
#ifdef HEAVY_LOGGING
consolePrintf("done\n");
@@ -2102,23 +2172,18 @@ void initHardware() {
PALETTE[255] = RGB15(0,0,31);
initSprites();
-
+
// videoSetModeSub(MODE_3_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_1D_BMP); //sub bg 0 will be used to print text
- // Convert texture from 24bit 888 to 16bit 1555, remembering to set top bit!
- u8* srcTex = (u8 *) icons_raw;
- for (int r = 32 * 256 ; r >= 0; r--) {
- SPRITE_GFX_SUB[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10);
- SPRITE_GFX[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10);
- }
-
-
-
+ // If the software scaler's back buffer has not been allocated, do it now
+ scalerBackBuffer = (u8 *) malloc(320 * 256);
WAIT_CR &= ~(0x0080);
// REG_WRAM_CNT = 0;
+ uploadSpriteGfx();
+
// This is a bodge to get around the fact that the cursor is turned on before it's image is set
// during startup in Sam & Max. This bodge moves the cursor offscreen so it is not seen.
sprites[1].attribute[1] = ATTR1_SIZE_64 | 192;
@@ -2126,6 +2191,8 @@ void initHardware() {
}
+
+
void setKeyboardIcon(bool enable) {
keyboardIcon = enable;
}
@@ -2199,27 +2266,27 @@ void penUpdate() {
penDownLastFrame = false;
penDownFrames = 0;
}
-
+
}
int leftHandedSwap(int keys) {
// Start and select are unchanged
if (leftHandedMode) {
int result = keys & (~(KEY_R | KEY_L | KEY_Y | KEY_A | KEY_B | KEY_X | KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN));
-
+
if (keys & KEY_L) result |= KEY_R;
if (keys & KEY_R) result |= KEY_L;
-
+
if (keys & KEY_LEFT) result |= KEY_Y;
if (keys & KEY_RIGHT) result |= KEY_A;
if (keys & KEY_DOWN) result |= KEY_B;
if (keys & KEY_UP) result |= KEY_X;
-
+
if (keys & KEY_Y) result |= KEY_LEFT;
if (keys & KEY_A) result |= KEY_RIGHT;
if (keys & KEY_B) result |= KEY_DOWN;
if (keys & KEY_X) result |= KEY_UP;
-
+
return result;
} else {
return keys;
@@ -2310,28 +2377,28 @@ int getPenY() {
GLvector getPenPos() {
GLvector v;
-
+
v.x = (penX * inttof32(1)) / SCREEN_WIDTH;
v.y = (penY * inttof32(1)) / SCREEN_HEIGHT;
-
+
return v;
}
void formatSramOption() {
consolePrintf("The following files are present in save RAM:\n");
DSSaveFileManager::instance()->listFiles();
-
+
consolePrintf("\nAre you sure you want to\n");
consolePrintf("DELETE all files?\n");
consolePrintf("A = Yes, X = No\n");
-
+
while (true) {
if (keysHeld() & KEY_A) {
DSSaveFileManager::instance()->formatSram();
consolePrintf("SRAM cleared!\n");
return;
}
-
+
if (keysHeld() & KEY_X) {
consolePrintf("Whew, that was close!\n");
return;
@@ -2364,9 +2431,13 @@ u8 fastRamData[FAST_RAM_SIZE] ITCM_DATA;
void* fastRamAlloc(int size) {
// return malloc(size);
- void* result = (void *) fastRamPointer;
+ void* result = fastRamPointer;
fastRamPointer += size;
- return (void *) (result);
+ if(fastRamPointer > fastRamData + FAST_RAM_SIZE) {
+ consolePrintf("FastRam (ITCM) allocation failed!\n");
+ return NULL;
+ }
+ return result;
}
void fastRamReset() {
@@ -2380,7 +2451,7 @@ void fastRamReset() {
bool GBAMPAvail = false;
-bool initGBAMP(int mode) {
+bool initGBAMP(int mode) {
if (FAT_InitFiles()) {
if (mode == 2) {
disc_IsInserted();
@@ -2405,14 +2476,14 @@ void initDebugger() {
set_verbosity(VERBOSE_INFO | VERBOSE_ERROR);
wireless_init(0);
wireless_connect();
-
+
// This is where the address of the computer running the Java
// stub goes.
debugger_connect_tcp(192, 168, 0, 1);
- debugger_init();
-
+ debugger_init();
+
// Update function - should really call every frame
- user_debugger_update();
+ user_debugger_update();
}
@@ -2447,7 +2518,7 @@ cardTranslate cardReaderTable[] = {
void reboot() {
int deviceType = -1;
-
+
if (disc_getDeviceId() == DEVICE_DLDI) {
char id[6];
@@ -2525,13 +2596,13 @@ int main(void)
initDebugger();
}
#endif
-
+
// Let arm9 read cartridge
*((u16 *) (0x04000204)) &= ~0x0080;
-
+
lastCallbackFrame = 0;
tweak = 0;
-
+
indyFightState = false;
indyFightRight = true;
@@ -2544,25 +2615,25 @@ int main(void)
// bufferSize = 10;
-
+
/*bufferRate = 44100;
bufferFrame = 0;
bufferSamples = 8192;
bufferFirstHalf = false;
bufferSecondHalf = true;
-
+
int bytes = (2 * (bufferSamples)) + 100;
-
+
soundBuffer = (s16 *) malloc(bytes * 2);
soundHiPart = true;
-
+
for (int r = 0; r < bytes; r++) {
soundBuffer[r] = 0;
}
-
+
swiWaitForVBlank();
swiWaitForVBlank();
@@ -2571,35 +2642,35 @@ int main(void)
swiWaitForVBlank();
swiWaitForVBlank();
*/
-
+
lastEventFrame = 0;
mouseMode = MOUSE_LEFT;
-
+
/*
TIMER1_CR = 0;
TIMER1_DATA = TIMER_FREQ(bufferRate);
TIMER1_CR = TIMER_ENABLE | TIMER_DIV_1;
-
+
TIMER2_CR = 0;
TIMER2_DATA = 0xFFFF - (bufferSamples / 2);
TIMER2_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_CASCADE;
*/
// 2945 - 2947
+
-
-
+
// for (int r = 2946; r < 3000; r++) {
// soundBuffer[r] = 30000;
// }
-
+
//2372
consolePrintf("-------------------------------\n");
consolePrintf("ScummVM DS\n");
consolePrintf("Ported by Neil Millstone\n");
- consolePrintf("Version 0.11.0 beta1 ");
+ consolePrintf("Version 0.11.1 beta2");
#if defined(DS_BUILD_A)
consolePrintf("build A\n");
consolePrintf("Lucasarts SCUMM games (SCUMM)\n");
@@ -2610,7 +2681,7 @@ int main(void)
consolePrintf("-------------------------------\n");
#elif defined(DS_BUILD_C)
consolePrintf("build C\n");
- consolePrintf("Simon/Elvira (AGOS)\n");
+ consolePrintf("Simon/Elvira/Waxworks (AGOS)\n");
consolePrintf("-------------------------------\n");
#elif defined(DS_BUILD_D)
consolePrintf("build D\n");
@@ -2618,7 +2689,7 @@ int main(void)
consolePrintf("-------------------------------\n");
#elif defined(DS_BUILD_E)
consolePrintf("build E\n");
- consolePrintf("ITE/IHNM (SAGA)\n");
+ consolePrintf("Inherit the Earth (SAGA)\n");
consolePrintf("-------------------------------\n");
#elif defined(DS_BUILD_F)
consolePrintf("build F\n");
@@ -2649,7 +2720,7 @@ int main(void)
consolePrintf("\n");
#endif
-
+
#ifdef USE_BUILT_IN_DRIVER_SELECTION
// Do M3 detection selectioon
int extraData = DSSaveFileManager::getExtraData();
@@ -2688,7 +2759,7 @@ int main(void)
disc_setEnable(mode);
DSSaveFileManager::setExtraData(mode);
#else
-
+
int mode = 0;
#endif
@@ -2734,11 +2805,11 @@ int main(void)
}
delete node;
-
+
updateStatus();
-
-
+
+
// OSystem_DS::instance();
g_system = new OSystem_DS();
@@ -2769,7 +2840,7 @@ int main(void)
char* argv[3] = {"/scummvmds", "--config=scummvmg.ini"};
#endif
-#ifdef DS_NON_SCUMM_BUILD
+#ifdef DS_NON_SCUMM_BUILD
while (1) {
scummvm_main(2, (char **) &argv);
diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h
index 85212a2d01..f20442b11e 100644
--- a/backends/platform/ds/arm9/source/dsmain.h
+++ b/backends/platform/ds/arm9/source/dsmain.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _DSMAIN_H
#define _DSMAIN_H
@@ -42,98 +42,100 @@ enum controlType {
};
struct gameListType {
- char gameId[16];
- controlType control;
+ char gameId[16];
+ controlType control;
};
// Pen reading functions
-void penInit();
-void penUpdate();
-bool getPenDown();
-bool getPenHeld();
-bool getPenReleased();
-int getPenX();
-int getPenY();
+void penInit();
+void penUpdate();
+bool getPenDown();
+bool getPenHeld();
+bool getPenReleased();
+int getPenX();
+int getPenY();
GLvector getPenPos();
-void consumePenEvents();
+void consumePenEvents();
// Pad reading
-int getKeysHeld();
-void keysUpdate();
-int getKeysDown();
-int getKeysReleased();
-void consumeKeys();
-int leftHandedSwap(int keys);
+int getKeysHeld();
+void keysUpdate();
+int getKeysDown();
+int getKeysReleased();
+void consumeKeys();
+int leftHandedSwap(int keys);
// Video
-void displayMode8Bit(); // Switch to 8-bit mode5
-void displayMode16Bit(); // Switch to 16-bit mode5
+void displayMode8Bit(); // Switch to 8-bit mode5
+void displayMode16Bit(); // Switch to 16-bit mode5
// Flip double buffer
-void displayMode16BitFlipBuffer();
+void displayMode16BitFlipBuffer();
// Get address of current back buffer
-u16* get16BitBackBuffer();
-u16* get8BitBackBuffer();
+u16* get16BitBackBuffer();
+u16* get8BitBackBuffer();
+s32 get8BitBackBufferStride();
+u16* getScalerBuffer();
-void setTalkPos(int x, int y);
-void setTopScreenTarget(int x, int y);
+void setTalkPos(int x, int y);
+void setTopScreenTarget(int x, int y);
void set200PercentFixedScale(bool on);
// Timers
-void setTimerCallback(OSystem_DS::TimerProc proc, int interval); // Setup a callback function at a regular interval
-int getMillis(); // Return the current runtime in milliseconds
-void doTimerCallback(); // Call callback function if required
+void setTimerCallback(OSystem_DS::TimerProc proc, int interval); // Setup a callback function at a regular interval
+int getMillis(); // Return the current runtime in milliseconds
+void doTimerCallback(); // Call callback function if required
// Sound
-void setSoundProc(OSystem_DS::SoundProc proc, void* param); // Setup a callback function for sound
-void doSoundCallback(); // Call function if sound buffers need more data
-void playSound(const void* data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound
-void stopSound(int channel);
+void setSoundProc(OSystem_DS::SoundProc proc, void* param); // Setup a callback function for sound
+void doSoundCallback(); // Call function if sound buffers need more data
+void playSound(const void* data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound
+void stopSound(int channel);
int getSoundFrequency();
// Event queue
-void addEventsToQueue();
-void VBlankHandler();
+void addEventsToQueue();
+void VBlankHandler();
// Sam and Max Stuff
-void setGameID(int id);
-void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY);
+void setGameID(int id);
+void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY);
void setShowCursor(bool enable);
void setMouseCursorVisible(bool visible);
// Shake
-void setShakePos(int shakePos);
+void setShakePos(int shakePos);
// Reports
-void memoryReport();
+void memoryReport();
// GBAMP
-bool isGBAMPAvailable();
+bool isGBAMPAvailable();
// Sleep (I'd like some of that right now)
-void checkSleepMode();
+void checkSleepMode();
// Virtual keyboard
-void setKeyboardIcon(bool enable);
-bool getKeyboardIcon();
-void setKeyboardEnable(bool en);
-bool getKeyboardEnable();
+void setKeyboardIcon(bool enable);
+bool getKeyboardIcon();
+void setKeyboardEnable(bool en);
+bool getKeyboardEnable();
// Options
-void setLeftHanded(bool enable);
-void setTouchXOffset(int x);
-void setTouchYOffset(int y);
-void setUnscaledMode(bool enable);
+void setLeftHanded(bool enable);
+void setTouchXOffset(int x);
+void setTouchYOffset(int y);
+void setUnscaledMode(bool enable);
void setSnapToBorder(bool enable);
-void setIndyFightState(bool st);
-bool getIndyFightState();
+void setIndyFightState(bool st);
+bool getIndyFightState();
bool isCpuScalerEnabled();
void setCpuScalerEnable(bool enable);
// Display
-bool getIsDisplayMode8Bit();
-void setGameSize(int width, int height);
+bool getIsDisplayMode8Bit();
+void setGameSize(int width, int height);
int getGameWidth();
int getGameHeight();
diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp
index d23201f745..edb9c70580 100644
--- a/backends/platform/ds/arm9/source/dsoptions.cpp
+++ b/backends/platform/ds/arm9/source/dsoptions.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#include "dsoptions.h"
#include "dsmain.h"
#include "gui/dialog.h"
@@ -28,6 +28,7 @@
#include "osystem_ds.h"
#include "engines/scumm/scumm.h"
#include "touchkeyboard.h"
+#include "gui/PopUpWidget.h"
#define ALLOW_CPU_SCALER
@@ -40,28 +41,39 @@ namespace Scumm {
namespace DS {
-DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(20, 0, 320 - 40, 230 - 20) {
+DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(5, 0, 320 - 5, 230 - 20) {
addButton(this, 10, 175, "Close", GUI::kCloseCmd, 'C');
+ _radioButtonMode = false;
+
#ifdef DS_SCUMM_BUILD
if (!DS::isGBAMPAvailable()) {
// addButton(this, 100, 140, "Delete Save", 'dels', 'D');
}
#endif
- new GUI::StaticTextWidget(this, 80, 10, 130, 15, "ScummVM DS Options", GUI::kTextAlignCenter);
+ new GUI::StaticTextWidget(this, 90, 10, 130, 15, "ScummVM DS Options", GUI::kTextAlignCenter);
- _leftHandedCheckbox = new GUI::CheckboxWidget(this, 20, 25, 200, 20, "Left handed mode", 0, 'L');
- _indyFightCheckbox = new GUI::CheckboxWidget(this, 20, 40, 200, 20, "Indy fighting controls", 0, 'I');
- _unscaledCheckbox = new GUI::CheckboxWidget(this, 20, 55, 200, 20, "Unscaled main screen", 0, 'S');
- _twoHundredPercentCheckbox = new GUI::CheckboxWidget(this, 20, 70, 230, 20, "Zoomed screen at fixed 200% zoom", 0, 'T');
- _highQualityAudioCheckbox = new GUI::CheckboxWidget(this, 20, 85, 250, 20, "High quality audio (slower) (reboot)", 0, 'T');
- _disablePowerOff = new GUI::CheckboxWidget(this, 20, 100, 250, 20, "Disable power off on quit", 0, 'T');
- _showCursorCheckbox = new GUI::CheckboxWidget(this, 20, 115, 130, 20, "Show mouse cursor", 0, 'T');
-#ifdef ALLOW_CPU_SCALER
- _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 'T');
-#endif
- _snapToBorderCheckbox = new GUI::CheckboxWidget(this, 20, 130, 250, 20, "Snap to border", 0, 'T');
+ _leftHandedCheckbox = new GUI::CheckboxWidget(this, 5, 70, 130, 20, "Left handed mode", 0, 'L');
+ _indyFightCheckbox = new GUI::CheckboxWidget(this, 5, 40, 200, 20, "Indy fighting controls", 0, 'I');
+ _twoHundredPercentCheckbox = new GUI::CheckboxWidget(this, 5, 55, 230, 20, "Zoomed screen at fixed 200% zoom", 0, 'T');
+ _highQualityAudioCheckbox = new GUI::CheckboxWidget(this, 5, 25, 250, 20, "High quality audio (slower) (reboot)", 0, 'T');
+ _disablePowerOff = new GUI::CheckboxWidget(this, 5, 85, 130, 20, "Disable power off", 0, 'T');
+ _showCursorCheckbox = new GUI::CheckboxWidget(this, 5, 100, 130, 20, "Show mouse cursor", 0, 'T');
+
+//#ifdef ALLOW_CPU_SCALER
+// _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 'T');
+//#endif
+
+ new GUI::StaticTextWidget(this, 180, 70, 130, 15, "Main screen:", GUI::kTextAlignLeft);
+
+ _hardScaler = new GUI::CheckboxWidget(this, 140, 85, 170, 20, "Hardware scale (fast)", 0x10000001, 'T');
+ _cpuScaler = new GUI::CheckboxWidget(this, 140, 100, 170, 20, "Software scale (quality)", 0x10000002, 'S');
+ _unscaledCheckbox = new GUI::CheckboxWidget(this, 140, 115, 170, 20, "Unscaled", 0x10000003, 'S');
+
+
+
+ _snapToBorderCheckbox = new GUI::CheckboxWidget(this, 5, 115, 120, 20, "Snap to border", 0, 'T');
new GUI::StaticTextWidget(this, 20, 145, 110, 15, "Touch X Offset", GUI::kTextAlignLeft);
_touchX = new GUI::SliderWidget(this, 130, 145, 130, 12, 1);
@@ -153,6 +165,11 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(20, 0, 320 - 40, 230 - 20) {
_touchY->setValue(0);
}
+ if (!_cpuScaler->getState() && !_unscaledCheckbox->getState()) {
+ _hardScaler->setState(true);
+ }
+
+ _radioButtonMode = true;
}
DSOptionsDialog::~DSOptionsDialog() {
@@ -177,16 +194,49 @@ void DSOptionsDialog::updateConfigManager() {
}
void DSOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
+
+ static bool guard = false;
+
+ if ((!guard) && (_radioButtonMode))
+ {
+ guard = true;
+
+ if ((cmd & 0xFF000000) == 0x10000000)
+ {
+ _cpuScaler->setState(false);
+ _hardScaler->setState(false);
+ _unscaledCheckbox->setState(false);
+
+ if ((sender == _cpuScaler) && (cmd == 0x10000002))
+ {
+ _cpuScaler->setState(true);
+ }
+
+ if ((sender == _hardScaler) && (cmd == 0x10000001))
+ {
+ _hardScaler->setState(true);
+ }
+
+ if ((sender == _unscaledCheckbox) && (cmd == 0x10000003))
+ {
+ _unscaledCheckbox->setState(true);
+ }
+ }
+
+ guard = false;
+
+ }
+
if (cmd == GUI::kCloseCmd) {
updateConfigManager();
close();
}
-
+
#ifdef DS_SCUMM_BUILD
/* if (cmd == 'dels') {
_delDialog->setList(Scumm::generateSavegameList(Scumm::g_scumm, false));
_delDialog->handleCommand(NULL, GUI::kListSelectionChangedCmd, 0);
-
+
Common::Event event;
event.type = Common::EVENT_KEYDOWN;
event.kbd.ascii = 0;
@@ -195,9 +245,9 @@ void DSOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint
event.type = Common::EVENT_KEYUP;
OSystem_DS::instance()->addEvent(event);
-
+
int idx = _delDialog->runModal();
-
+
if (idx >= 0) {
char name[256];
Scumm::g_scumm->makeSavegameName(name, idx, false);
@@ -205,10 +255,10 @@ void DSOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint
((DSSaveFileManager *) (OSystem_DS::instance()->getSavefileManager()))->deleteFile(name);
}
}
-
+
}*/
#endif
-
+
}
@@ -220,11 +270,11 @@ void togglePause() {
OSystem_DS* system = OSystem_DS::instance();
event.type = Common::EVENT_KEYDOWN;
- event.kbd.keycode = Common::KEYCODE_p;
+ event.kbd.keycode = Common::KEYCODE_p;
event.kbd.ascii = 'p';
event.kbd.flags = 0;
system->addEvent(event);
-
+
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
}
@@ -235,14 +285,12 @@ void showOptionsDialog() {
togglePause();
DS::displayMode16Bit();
-
+
DSOptionsDialog* d = new DSOptionsDialog();
d->runModal();
- consolePrintf("deleting dialog\n");
delete d;
-
- consolePrintf("going to 8 bit\n");
+
DS::displayMode8Bit();
togglePause();
@@ -303,7 +351,8 @@ void setOptions() {
} else {
DS::setCpuScalerEnable(false);
}
-#endif
+#endif
+
}
}
diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h
index 3c9da82a83..9cfa785ca8 100644
--- a/backends/platform/ds/arm9/source/dsoptions.h
+++ b/backends/platform/ds/arm9/source/dsoptions.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _DSOPTIONS_H_
#define _DSOPTIONS_H_
@@ -39,7 +39,7 @@ class DSOptionsDialog : public GUI::Dialog {
public:
DSOptionsDialog();
~DSOptionsDialog();
-
+
protected:
virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
void togglePause();
@@ -53,14 +53,18 @@ protected:
GUI::CheckboxWidget* _indyFightCheckbox;
GUI::CheckboxWidget* _highQualityAudioCheckbox;
GUI::CheckboxWidget* _disablePowerOff;
- GUI::CheckboxWidget* _cpuScaler;
GUI::CheckboxWidget* _showCursorCheckbox;
GUI::CheckboxWidget* _snapToBorderCheckbox;
+ GUI::CheckboxWidget* _hardScaler;
+ GUI::CheckboxWidget* _cpuScaler;
+
#ifdef DS_SCUMM_BUILD
Scumm::SaveLoadChooser* _delDialog;
#endif
+ bool _radioButtonMode;
+
};
extern void showOptionsDialog();
diff --git a/backends/platform/ds/arm9/source/fat/disc_io.c b/backends/platform/ds/arm9/source/fat/disc_io.c
index f456343a2c..6d48674d62 100644
--- a/backends/platform/ds/arm9/source/fat/disc_io.c
+++ b/backends/platform/ds/arm9/source/fat/disc_io.c
@@ -5,7 +5,7 @@
uniformed io-interface to work with Chishm's FAT library
Written by MightyMax
-
+
Modified by Chishm:
2005-11-06
* Added WAIT_CR modifications for NDS
@@ -87,7 +87,7 @@ LPIO_INTERFACE active_interface = 0;
Disc Cache functions
2006-02-03:
- Added by www.neoflash.com
+ Added by www.neoflash.com
*/
int discDetect = 0;
@@ -99,7 +99,7 @@ int dldiFound = FALSE;
#include <string.h>
#define CACHE_FREE 0xFFFFFFFF
-
+
static u8 cacheBuffer[ DISC_CACHE_COUNT * 512 ];
static struct {
@@ -112,20 +112,20 @@ FATDevice currentDevice;
static u32 disc_CacheFind(u32 sector) {
u32 i;
-
+
for( i = 0; i < DISC_CACHE_COUNT; i++ ) {
if( cache[ i ].sector == sector )
return i;
}
-
+
return CACHE_FREE;
}
static u32 disc_CacheFindFree(void) {
-
+
u32 i = 0, j;
u32 count = -1;
-
+
for( j = 0; j < DISC_CACHE_COUNT; j++ ) {
if( cache[ j ].sector == CACHE_FREE ) {
@@ -142,7 +142,7 @@ static u32 disc_CacheFindFree(void) {
if( cache[ i ].sector != CACHE_FREE && cache[i].dirty != 0 ) {
active_interface->fn_WriteSectors( cache[ i ].sector, 1, &cacheBuffer[ i * 512 ] );
- /* todo: handle write error here
+ /* todo: handle write error here
cache[ i ].sector = CACHE_FREE;
cache[ i ].dirty = 0;
@@ -431,7 +431,7 @@ bool disc_setDsSlotInterface (void)
#endif
-bool disc_Init(void)
+bool disc_Init(void)
{
#ifdef DISC_CACHE
disc_CacheInit();
@@ -455,15 +455,15 @@ bool disc_Init(void)
// could not find a working IO Interface
active_interface = 0 ;
return false ;
-}
+}
-bool disc_IsInserted(void)
+bool disc_IsInserted(void)
{
if (active_interface) return active_interface->fn_IsInserted() ;
return false ;
-}
+}
-bool disc_ReadSectors(u32 sector, u8 numSecs, void* buffer)
+bool disc_ReadSectors(u32 sector, u8 numSecs, void* buffer)
{
#ifdef DISC_CACHE
u8 *p=(u8*)buffer;
@@ -480,9 +480,9 @@ bool disc_ReadSectors(u32 sector, u8 numSecs, void* buffer)
if (active_interface) return active_interface->fn_ReadSectors(sector,numSecs,buffer) ;
return false ;
#endif
-}
+}
-bool disc_WriteSectors(u32 sector, u8 numSecs, void* buffer)
+bool disc_WriteSectors(u32 sector, u8 numSecs, void* buffer)
{
/*#ifdef DISC_CACHE
u8 *p=(u8*)buffer;
@@ -499,18 +499,46 @@ bool disc_WriteSectors(u32 sector, u8 numSecs, void* buffer)
#ifdef DISC_CACHE
disc_CacheInit();
#endif
+
+#define MISALIGNMENT_BODGE
+
+#ifdef MISALIGNMENT_BODGE
+ // This bodge works around problems with some card reader drivers which require data to be
+ // aligned to 2- or 4-byte boundaries it varies which one they require. This bodge sorts
+ // it but also reduces write speed as it doesn't use the multi-sector write capability any
+ // more. A better fix will be written for a future version.
+
+ if (active_interface) {
+ u8 sectorBuffer[512];
+ int r;
+
+ for (r = 0; r < numSecs; r++) {
+ memcpy(sectorBuffer, &buffer[r * 512], 512);
+
+ if (!active_interface->fn_WriteSectors(sector + r, 1, sectorBuffer))
+ {
+ return false;
+ }
+ }
+
+
+ return true;
+ }
+
+#else
if (active_interface) return active_interface->fn_WriteSectors(sector,numSecs,buffer) ;
return false ;
+#endif
//#endif
-}
+}
-bool disc_ClearStatus(void)
+bool disc_ClearStatus(void)
{
if (active_interface) return active_interface->fn_ClearStatus() ;
return false ;
-}
+}
-bool disc_Shutdown(void)
+bool disc_Shutdown(void)
{
#ifdef DISC_CACHE
disc_CacheFlush();
@@ -518,7 +546,7 @@ bool disc_Shutdown(void)
if (active_interface) active_interface->fn_Shutdown() ;
active_interface = 0 ;
return true ;
-}
+}
u32 disc_HostType (void)
{
diff --git a/backends/platform/ds/arm9/source/fat/disc_io.h b/backends/platform/ds/arm9/source/fat/disc_io.h
index b2317ca110..05d4c020bd 100644
--- a/backends/platform/ds/arm9/source/fat/disc_io.h
+++ b/backends/platform/ds/arm9/source/fat/disc_io.h
@@ -7,7 +7,7 @@
// Use DMA to read the card, remove this line to use normal reads/writes
// #define _CF_USE_DMA
-// Allow buffers not aligned to 16 bits when reading files.
+// Allow buffers not aligned to 16 bits when reading files.
// Note that this will slow down access speed, so only use if you have to.
// It is also incompatible with DMA
#define _CF_ALLOW_UNALIGNED
@@ -43,7 +43,7 @@
// This allows the code to build on an earlier version of libnds, before the register was renamed
#ifndef REG_EXMEMCNT
-#define REG_EXMEMCNT REG_EXEMEMCNT
+#define REG_EXMEMCNT REG_EXEMEMCNT
#endif
#ifndef REG_EXEMEMCNT
@@ -70,7 +70,7 @@
#endif
// Disable NDS specific hardware and features if running on a GBA
-#ifndef NDS
+#ifndef NDS
#undef SUPPORT_NMMC
#undef DISC_CACHE
#endif
diff --git a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c
index fffd8ab88b..b5fdd665df 100644
--- a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c
+++ b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c
@@ -42,7 +42,7 @@
//---------------------------------------------------------------
// Appropriate placement of CF functions and data
#ifdef NDS
- #define _VARS_IN_RAM
+ #define _VARS_IN_RAM
#else
#define _VARS_IN_RAM __attribute__ ((section (".sbss")))
#endif
@@ -74,7 +74,7 @@
#ifdef __GNUC__
#define __PACKED __attribute__ ((__packed__))
#else
- #define __PACKED
+ #define __PACKED
#pragma pack(1)
#endif
@@ -98,7 +98,7 @@ typedef struct
u32 numSectors;
union // Different types of extended BIOS Parameter Block for FAT16 and FAT32
{
- struct
+ struct
{
// Ext BIOS Parameter Block for FAT16
u8 driveNumber;
@@ -110,7 +110,7 @@ typedef struct
// Bootcode
u8 bootCode[448];
} __PACKED fat16;
- struct
+ struct
{
// FAT32 extended block
u32 sectorsPerFAT32;
@@ -158,7 +158,7 @@ typedef struct
typedef struct
{
u8 ordinal; // Position within LFN
- u16 char0;
+ u16 char0;
u16 char1;
u16 char2;
u16 char3;
@@ -177,7 +177,7 @@ typedef struct
u16 char12;
} __PACKED DIR_ENT_LFN;
-const char lfn_offset_table[13]={0x01,0x03,0x05,0x07,0x09,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E};
+const char lfn_offset_table[13]={0x01,0x03,0x05,0x07,0x09,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E};
// End of packed structs
#ifdef __PACKED
@@ -190,7 +190,7 @@ const char lfn_offset_table[13]={0x01,0x03,0x05,0x07,0x09,0x0E,0x10,0x12,0x14,0x
//-----------------------------------------------------------------
// Global Variables
-// _VARS_IN_RAM variables are stored in the largest section of WRAM
+// _VARS_IN_RAM variables are stored in the largest section of WRAM
// available: IWRAM on NDS ARM7, EWRAM on NDS ARM9 and GBA
// Files
@@ -305,7 +305,7 @@ u16 getRTCtoFileTime (void)
u16 getRTCtoFileDate (void)
{
#ifdef NDS
- return (
+ return (
( ((IPC->rtc_year + 20) & 0x7F) <<9) |
( (IPC->rtc_month & 0xF) << 5) |
(IPC->rtc_day & 0x1F) );
@@ -330,13 +330,13 @@ u32 FAT_NextCluster(u32 cluster)
u32 nextCluster = CLUSTER_FREE;
u32 sector;
int offset;
-
- switch (filesysType)
+
+ switch (filesysType)
{
case FS_UNKNOWN:
nextCluster = CLUSTER_FREE;
break;
-
+
case FS_FAT12:
sector = filesysFAT + (((cluster * 3) / 2) / BYTE_PER_READ);
offset = ((cluster * 3) / 2) % BYTE_PER_READ;
@@ -351,32 +351,32 @@ u32 FAT_NextCluster(u32 cluster)
nextCluster = ((u8*)fatBuffer)[offset];
offset++;
-
+
if (offset >= BYTE_PER_READ) {
offset = 0;
fatBufferCurSector++;
disc_ReadSector(fatBufferCurSector, fatBuffer);
}
-
+
nextCluster |= (((u8*)fatBuffer)[offset]) << 8;
-
+
if (cluster & 0x01) {
nextCluster = nextCluster >> 4;
- } else {
+ } else {
nextCluster &= 0x0FFF;
}
-
+
if (nextCluster >= 0x0FF7)
{
nextCluster = CLUSTER_EOF;
}
break;
-
+
case FS_FAT16:
sector = filesysFAT + ((cluster << 1) / BYTE_PER_READ);
offset = cluster % (BYTE_PER_READ >> 1);
-
+
// If FAT buffer contains wrong sector
if (sector != fatBufferCurSector)
{
@@ -387,17 +387,17 @@ u32 FAT_NextCluster(u32 cluster)
// read the nextCluster value
nextCluster = ((u16*)fatBuffer)[offset];
-
+
if (nextCluster >= 0xFFF7)
{
nextCluster = CLUSTER_EOF;
}
break;
-
+
case FS_FAT32:
sector = filesysFAT + ((cluster << 2) / BYTE_PER_READ);
offset = cluster % (BYTE_PER_READ >> 2);
-
+
// If FAT buffer contains wrong sector
if (sector != fatBufferCurSector)
{
@@ -408,18 +408,18 @@ u32 FAT_NextCluster(u32 cluster)
// read the nextCluster value
nextCluster = (((u32*)fatBuffer)[offset]) & 0x0FFFFFFF;
-
+
if (nextCluster >= 0x0FFFFFF7)
{
nextCluster = CLUSTER_EOF;
}
break;
-
+
default:
nextCluster = CLUSTER_FREE;
break;
}
-
+
return nextCluster;
}
@@ -437,13 +437,13 @@ bool FAT_WriteFatEntry (u32 cluster, u32 value)
{
return false;
}
-
- switch (filesysType)
+
+ switch (filesysType)
{
case FS_UNKNOWN:
return false;
break;
-
+
case FS_FAT12:
sector = filesysFAT + (((cluster * 3) / 2) / BYTE_PER_READ);
offset = ((cluster * 3) / 2) % BYTE_PER_READ;
@@ -465,32 +465,32 @@ bool FAT_WriteFatEntry (u32 cluster, u32 value)
offset = 0;
// write the buffer back to disc
disc_WriteSector(fatBufferCurSector, fatBuffer);
- // read the next sector
+ // read the next sector
fatBufferCurSector++;
disc_ReadSector(fatBufferCurSector, fatBuffer);
}
-
+
((u8*)fatBuffer)[offset] = (value & 0x0FF0) >> 4;
} else {
-
+
((u8*)fatBuffer)[offset] = value & 0xFF;
-
+
offset++;
if (offset >= BYTE_PER_READ) {
offset = 0;
// write the buffer back to disc
disc_WriteSector(fatBufferCurSector, fatBuffer);
- // read the next sector
+ // read the next sector
fatBufferCurSector++;
disc_ReadSector(fatBufferCurSector, fatBuffer);
}
-
+
((u8*)fatBuffer)[offset] = (((u8*)fatBuffer)[offset] & 0xF0) | ((value >> 8) & 0x0F);
}
break;
-
+
case FS_FAT16:
sector = filesysFAT + ((cluster << 1) / BYTE_PER_READ);
offset = cluster % (BYTE_PER_READ >> 1);
@@ -507,11 +507,11 @@ bool FAT_WriteFatEntry (u32 cluster, u32 value)
((u16*)fatBuffer)[offset] = (value & 0xFFFF);
break;
-
+
case FS_FAT32:
sector = filesysFAT + ((cluster << 2) / BYTE_PER_READ);
offset = cluster % (BYTE_PER_READ >> 2);
-
+
// If FAT buffer contains wrong sector
if (sector != fatBufferCurSector)
{
@@ -524,15 +524,15 @@ bool FAT_WriteFatEntry (u32 cluster, u32 value)
(((u32*)fatBuffer)[offset]) = value;
break;
-
+
default:
return false;
break;
}
-
+
// write the buffer back to disc
disc_WriteSector(fatBufferCurSector, fatBuffer);
-
+
return true;
}
#endif
@@ -540,8 +540,8 @@ bool FAT_WriteFatEntry (u32 cluster, u32 value)
#ifdef CAN_WRITE_TO_DISC
/*-----------------------------------------------------------------
FAT_ReadWriteFatEntryBuffered
-Internal function - writes FAT information about a cluster to a
- buffer that should then be flushed to disc using
+Internal function - writes FAT information about a cluster to a
+ buffer that should then be flushed to disc using
FAT_WriteFatEntryFlushBuffer()
Call FAT_WriteFatEntry first so as not to ruin the disc.
Also returns the entry being replaced
@@ -555,13 +555,13 @@ u32 FAT_ReadWriteFatEntryBuffered (u32 cluster, u32 value)
if ((cluster < 0x0002) || (cluster > fatLastCluster))
return CLUSTER_FREE;
-
- switch (filesysType)
+
+ switch (filesysType)
{
case FS_UNKNOWN:
oldValue = CLUSTER_FREE;
break;
-
+
case FS_FAT12:
sector = filesysFAT + (((cluster * 3) / 2) / BYTE_PER_READ);
offset = ((cluster * 3) / 2) % BYTE_PER_READ;
@@ -587,40 +587,40 @@ u32 FAT_ReadWriteFatEntryBuffered (u32 cluster, u32 value)
offset = 0;
// write the buffer back to disc
disc_WriteSector(fatBufferCurSector, fatBuffer);
- // read the next sector
+ // read the next sector
fatBufferCurSector++;
disc_ReadSector(fatBufferCurSector, fatBuffer);
}
-
+
oldValue |= ((((u8*)fatBuffer)[offset]) << 4) & 0x0FF0;
((u8*)fatBuffer)[offset] = (value & 0x0FF0) >> 4;
} else {
-
+
oldValue = ((u8*)fatBuffer)[offset] & 0xFF;
((u8*)fatBuffer)[offset] = value & 0xFF;
-
+
offset++;
if (offset >= BYTE_PER_READ) {
offset = 0;
// write the buffer back to disc
disc_WriteSector(fatBufferCurSector, fatBuffer);
- // read the next sector
+ // read the next sector
fatBufferCurSector++;
disc_ReadSector(fatBufferCurSector, fatBuffer);
}
-
+
oldValue |= (((u8*)fatBuffer)[offset] & 0x0F) << 8;
((u8*)fatBuffer)[offset] = (((u8*)fatBuffer)[offset] & 0xF0) | ((value >> 8) & 0x0F);
}
- if (oldValue >= 0x0FF7)
+ if (oldValue >= 0x0FF7)
{
oldValue = CLUSTER_EOF;
}
break;
-
+
case FS_FAT16:
sector = filesysFAT + ((cluster << 1) / BYTE_PER_READ);
offset = cluster % (BYTE_PER_READ >> 1);
@@ -634,23 +634,23 @@ u32 FAT_ReadWriteFatEntryBuffered (u32 cluster, u32 value)
// Load correct sector to buffer
fatBufferCurSector = sector;
disc_ReadSector(fatBufferCurSector, fatBuffer);
- }
+ }
// write the value to the FAT buffer
oldValue = ((u16*)fatBuffer)[offset];
((u16*)fatBuffer)[offset] = value;
- if (oldValue >= 0xFFF7)
+ if (oldValue >= 0xFFF7)
{
oldValue = CLUSTER_EOF;
}
break;
-
+
case FS_FAT32:
sector = filesysFAT + ((cluster << 2) / BYTE_PER_READ);
offset = cluster % (BYTE_PER_READ >> 2);
-
+
// If FAT buffer contains wrong sector
if (sector != fatBufferCurSector)
{
@@ -666,18 +666,18 @@ u32 FAT_ReadWriteFatEntryBuffered (u32 cluster, u32 value)
oldValue = ((u32*)fatBuffer)[offset];
((u32*)fatBuffer)[offset] = value;
- if (oldValue >= 0x0FFFFFF7)
+ if (oldValue >= 0x0FFFFFF7)
{
oldValue = CLUSTER_EOF;
}
break;
-
+
default:
oldValue = CLUSTER_FREE;
break;
}
-
+
return oldValue;
}
#endif
@@ -727,7 +727,7 @@ u32 FAT_FirstFreeCluster(void)
/*-----------------------------------------------------------------
FAT_LinkFreeCluster
Internal function - gets the first available free cluster, sets it
-to end of file, links the input cluster to it then returns the
+to end of file, links the input cluster to it then returns the
cluster number
-----------------------------------------------------------------*/
u32 FAT_LinkFreeCluster(u32 cluster)
@@ -746,7 +746,7 @@ u32 FAT_LinkFreeCluster(u32 cluster)
{
return curLink; // Return the current link - don't allocate a new one
}
-
+
// Get a free cluster
firstFree = FAT_FirstFreeCluster();
@@ -777,7 +777,7 @@ Internal function - frees any cluster used by a file
bool FAT_ClearLinks (u32 cluster)
{
u32 nextCluster;
-
+
if ((cluster < 0x0002) || (cluster > fatLastCluster))
return false;
@@ -793,7 +793,7 @@ bool FAT_ClearLinks (u32 cluster)
while ((cluster != CLUSTER_EOF) && (cluster != CLUSTER_FREE))
{
cluster = FAT_ReadWriteFatEntryBuffered (cluster, CLUSTER_FREE);
- }
+ }
// Flush fat write buffer
FAT_WriteFatEntryFlushBuffer ();
@@ -814,7 +814,7 @@ bool FAT_InitFiles (void)
int i;
int bootSector;
BOOT_SEC* bootSec;
-
+
if (!disc_Init())
{
return (false);
@@ -830,7 +830,7 @@ bool FAT_InitFiles (void)
return false;
}*/
-
+
// Check if there is a FAT string, which indicates this is a boot sector
if ((globalBuffer[0x36] == 'F') && (globalBuffer[0x37] == 'A') && (globalBuffer[0x38] == 'T'))
@@ -848,9 +848,9 @@ bool FAT_InitFiles (void)
// First check for an active partition
for (i=0x1BE; (i < 0x1FE) && (globalBuffer[i] != 0x80); i+= 0x10);
// If it didn't find an active partition, search for any valid partition
- if (i == 0x1FE)
+ if (i == 0x1FE)
for (i=0x1BE; (i < 0x1FE) && (globalBuffer[i+0x04] == 0x00); i+= 0x10);
-
+
// Go to first valid partition
if ( i != 0x1FE) // Make sure it found a partition
{
@@ -865,7 +865,7 @@ bool FAT_InitFiles (void)
if (!disc_ReadSector (bootSector, bootSec)) {
return false;
}
-
+
// Store required information about the file system
if (bootSec->sectorsPerFAT != 0)
{
@@ -875,7 +875,7 @@ bool FAT_InitFiles (void)
{
filesysSecPerFAT = bootSec->extBlock.fat32.sectorsPerFAT32;
}
-
+
if (bootSec->numSectorsSmall != 0)
{
filesysNumSec = bootSec->numSectorsSmall;
@@ -987,7 +987,7 @@ Return the file info structure of the next valid file entry
u32 dirCluster: IN cluster of subdirectory table
int entry: IN the desired file entry
int origin IN: relative position of the entry
-DIR_ENT return OUT: desired dirEntry. First char will be FILE_FREE if
+DIR_ENT return OUT: desired dirEntry. First char will be FILE_FREE if
the entry does not exist.
-----------------------------------------------------------------*/
DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
@@ -1011,8 +1011,8 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
{
return (dir);
}
-
- switch (origin)
+
+ switch (origin)
{
case SEEK_SET:
wrkDirCluster = dirCluster;
@@ -1022,7 +1022,7 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
case SEEK_CUR: // Don't change anything
break;
case SEEK_END: // Find entry signifying end of directory
- // Subtraction will never reach 0, so it keeps going
+ // Subtraction will never reach 0, so it keeps going
// until reaches end of directory
wrkDirCluster = dirCluster;
wrkDirSector = 0;
@@ -1055,7 +1055,7 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
{
notFound = true;
}
- firstSector = FAT_ClustToSect(wrkDirCluster);
+ firstSector = FAT_ClustToSect(wrkDirCluster);
}
else if ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER) && (wrkDirSector == (filesysData - filesysRootDir)))
{
@@ -1082,7 +1082,7 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
lfnName[0] = '\0';
}
}
- if (entry == 0)
+ if (entry == 0)
{
if (!lfnExists)
{
@@ -1128,7 +1128,7 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
}
}
} while (!found && !notFound);
-
+
// If no file is found, return FILE_FREE
if (notFound)
{
@@ -1141,7 +1141,7 @@ DIR_ENT FAT_GetDirEntry ( u32 dirCluster, int entry, int origin)
/*-----------------------------------------------------------------
FAT_GetLongFilename
-Get the long name of the last file or directory retrived with
+Get the long name of the last file or directory retrived with
GetDirEntry. Also works for FindFirstFile and FindNextFile.
If a long name doesn't exist, it returns the short name
instead.
@@ -1156,14 +1156,14 @@ bool FAT_GetLongFilename (char* filename)
strncpy (filename, lfnName, MAX_FILENAME_LENGTH - 1);
filename[MAX_FILENAME_LENGTH - 1] = '\0';
-
+
return true;
}
/*-----------------------------------------------------------------
FAT_GetFilename
-Get the alias (short name) of the file or directory stored in
+Get the alias (short name) of the file or directory stored in
dirEntry
DIR_ENT dirEntry: IN a valid directory table entry
char* alias OUT: will be filled with the alias (short filename),
@@ -1192,7 +1192,7 @@ bool FAT_GetFilename (DIR_ENT dirEntry, char* alias)
}
}
else
- {
+ {
// Copy the filename from the dirEntry to the string
for (i = 0; (i < 8) && (dirEntry.name[i] != ' '); i++)
{
@@ -1230,8 +1230,8 @@ bool FAT_GetAlias (char* alias)
}
// Read in the last accessed directory entry
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
-
- return FAT_GetFilename (((DIR_ENT*)globalBuffer)[wrkDirOffset], alias);
+
+ return FAT_GetFilename (((DIR_ENT*)globalBuffer)[wrkDirOffset], alias);
}
/*-----------------------------------------------------------------
@@ -1244,8 +1244,8 @@ u32 FAT_GetFileSize (void)
{
// Read in the last accessed directory entry
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
-
- return ((DIR_ENT*)globalBuffer)[wrkDirOffset].fileSize;
+
+ return ((DIR_ENT*)globalBuffer)[wrkDirOffset].fileSize;
}
/*-----------------------------------------------------------------
@@ -1257,8 +1257,8 @@ u32 FAT_GetFileCluster (void)
{
// Read in the last accessed directory entry
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
-
- return (((DIR_ENT*)globalBuffer)[wrkDirOffset].startCluster) | (((DIR_ENT*)globalBuffer)[wrkDirOffset].startClusterHigh << 16);
+
+ return (((DIR_ENT*)globalBuffer)[wrkDirOffset].startCluster) | (((DIR_ENT*)globalBuffer)[wrkDirOffset].startClusterHigh << 16);
}
/*-----------------------------------------------------------------
@@ -1270,8 +1270,8 @@ u8 FAT_GetFileAttributes (void)
{
// Read in the last accessed directory entry
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
-
- return ((DIR_ENT*)globalBuffer)[wrkDirOffset].attrib;
+
+ return ((DIR_ENT*)globalBuffer)[wrkDirOffset].attrib;
}
#ifdef CAN_WRITE_TO_DISC
@@ -1294,10 +1294,10 @@ u8 FAT_SetFileAttributes (const char* filename, u8 attributes, u8 mask)
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
((DIR_ENT*)globalBuffer)[wrkDirOffset].attrib = (((DIR_ENT*)globalBuffer)[wrkDirOffset].attrib & ~(mask & 0x27)) | (attributes & 0x27); // 0x27 is he settable attributes
-
+
disc_WriteSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
- return ((DIR_ENT*)globalBuffer)[wrkDirOffset].attrib;
+ return ((DIR_ENT*)globalBuffer)[wrkDirOffset].attrib;
}
#endif
@@ -1305,7 +1305,7 @@ u8 FAT_SetFileAttributes (const char* filename, u8 attributes, u8 mask)
time_t FAT_FileTimeToCTime (u16 fileTime, u16 fileDate)
{
struct tm timeInfo;
-
+
timeInfo.tm_year = (fileDate >> 9) + 80; // years since midnight January 1970
timeInfo.tm_mon = ((fileDate >> 5) & 0xf) - 1; // Months since january
timeInfo.tm_mday = fileDate & 0x1f; // Day of the month
@@ -1326,8 +1326,8 @@ time_t FAT_GetFileCreationTime (void)
{
// Read in the last accessed directory entry
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
-
- return FAT_FileTimeToCTime(((DIR_ENT*)globalBuffer)[wrkDirOffset].cTime, ((DIR_ENT*)globalBuffer)[wrkDirOffset].cDate);
+
+ return FAT_FileTimeToCTime(((DIR_ENT*)globalBuffer)[wrkDirOffset].cTime, ((DIR_ENT*)globalBuffer)[wrkDirOffset].cDate);
}
/*-----------------------------------------------------------------
@@ -1339,8 +1339,8 @@ time_t FAT_GetFileLastWriteTime (void)
{
// Read in the last accessed directory entry
disc_ReadSector ((wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector, globalBuffer);
-
- return FAT_FileTimeToCTime(((DIR_ENT*)globalBuffer)[wrkDirOffset].mTime, ((DIR_ENT*)globalBuffer)[wrkDirOffset].mDate);
+
+ return FAT_FileTimeToCTime(((DIR_ENT*)globalBuffer)[wrkDirOffset].mTime, ((DIR_ENT*)globalBuffer)[wrkDirOffset].mDate);
}
#endif
@@ -1374,8 +1374,8 @@ DIR_ENT FAT_DirEntFromPath (const char* path)
return;
}
#endif
-
- if (path[pathPos] == '/')
+
+ if (path[pathPos] == '/')
{
dirCluster = filesysRootDirClus; // Start at root directory
}
@@ -1383,13 +1383,13 @@ DIR_ENT FAT_DirEntFromPath (const char* path)
{
dirCluster = curWorkDirCluster; // Start at current working dir
}
-
+
// Eat any slash /
while ((path[pathPos] == '/') && (path[pathPos] != '\0'))
{
pathPos++;
}
-
+
// Search until can't continue
found = false;
notFound = false;
@@ -1437,7 +1437,7 @@ DIR_ENT FAT_DirEntFromPath (const char* path)
flagLFN = true;
}
}
-
+
// Add end of string char
name[namePos] = '\0';
@@ -1497,7 +1497,7 @@ DIR_ENT FAT_DirEntFromPath (const char* path)
dirEntry = FAT_GetDirEntry (dirCluster, 1, SEEK_CUR);
}
}
-
+
if (found && ((dirEntry.attrib & ATTRIB_DIR) == ATTRIB_DIR) && (path[pathPos] != '\0'))
// It has found a directory from within the path that needs to be followed
{
@@ -1505,7 +1505,7 @@ DIR_ENT FAT_DirEntFromPath (const char* path)
dirCluster = dirEntry.startCluster | (dirEntry.startClusterHigh << 16);
}
}
-
+
if (notFound)
{
dirEntry.name[0] = FILE_FREE;
@@ -1534,11 +1534,11 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
bool flagLFN, dotSeen;
char fileAlias[13] = {0};
int tailNum;
-
+
unsigned char chkSum = 0;
-
+
u32 oldWorkDirCluster;
-
+
DIR_ENT* dirEntries = (DIR_ENT*)globalBuffer;
u32 dirCluster;
int secOffset;
@@ -1566,7 +1566,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
{
curWorkDirCluster = filesysRootDirClus;
}
-
+
pathPos = 0;
filePos = 0;
flagLFN = false;
@@ -1576,7 +1576,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
if (path[pathPos + filePos] == '/')
{
filename[filePos] = '\0';
- if (FAT_chdir(filename) == false)
+ if (FAT_chdir(filename) == false)
{
curWorkDirCluster = oldWorkDirCluster;
return false; // Couldn't change directory
@@ -1587,17 +1587,17 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
filename[filePos] = path[pathPos + filePos];
filePos++;
}
-
+
// Skip over last slashes
while (path[pathPos] == '/')
pathPos++;
-
+
// Check if the filename has a leading "."
// If so, it is an LFN
if (path[pathPos] == '.') {
flagLFN = true;
}
-
+
// Copy name from path
filePos = 0;
dotSeen = false;
@@ -1622,12 +1622,12 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
flagLFN = true;
}
}
-
+
if (filePos == 0) // No filename
{
return false;
}
-
+
// Check if a long filename was specified
if (filePos > 12)
{
@@ -1638,7 +1638,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
if (!flagLFN && (strrchr (filename, '.') != NULL) && (strlen(strrchr(filename, '.')) > 4)) {
flagLFN = true;
}
-
+
lfnPos = (filePos - 1) / 13;
// Add end of string char
@@ -1646,8 +1646,8 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
// Clear remaining chars
while (filePos < MAX_FILENAME_LENGTH)
filename[filePos++] = 0x01; // Set for LFN compatibility
-
-
+
+
if (flagLFN)
{
// Generate short filename - always a 2 digit number for tail
@@ -1666,7 +1666,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
// Pad Alias with underscores
while (aliasPos < 5)
fileAlias[aliasPos++] = '_';
-
+
fileAlias[5] = '~';
fileAlias[8] = '.';
fileAlias[9] = ' ';
@@ -1692,14 +1692,14 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
} else {
aliasPos = 9;
}
-
+
// Pad Alias extension with spaces
while (aliasPos < 12)
fileAlias[aliasPos++] = ' ';
-
+
fileAlias[12] = '\0';
-
-
+
+
// Get a valid tail number
tailNum = 0;
do {
@@ -1707,7 +1707,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
fileAlias[6] = 0x30 + ((tailNum / 10) % 10); // 10's digit
fileAlias[7] = 0x30 + (tailNum % 10); // 1's digit
} while ((FAT_DirEntFromPath(fileAlias).name[0] != FILE_FREE) && (tailNum < 100));
-
+
if (tailNum < 100) // Found an alias not being used
{
// Calculate file checksum
@@ -1725,7 +1725,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
{
return false;
}
-
+
dirEntryLength = lfnPos + 2;
}
else // Its not a long file name
@@ -1743,7 +1743,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
dirEntryLength = 1;
}
-
+
// Change dirEntry name to match alias
for (aliasPos = 0; ((fileAlias[aliasPos] != '.') && (fileAlias[aliasPos] != '\0') && (aliasPos < 8)); aliasPos++)
{
@@ -1775,12 +1775,12 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
maxSectors = (dirCluster == FAT16_ROOT_DIR_CLUSTER ? (filesysData - filesysRootDir) : filesysSecPerClus);
firstSector = (dirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(dirCluster));
disc_ReadSector (firstSector + secOffset, dirEntries);
-
+
dirEntryRemain = dirEntryLength;
tempDirCluster = dirCluster;
tempSecOffset = secOffset;
tempEntryOffset = entryOffset;
-
+
// Search for a large enough space to fit in new directory entry
while ((dirEntries[entryOffset].name[0] != FILE_LAST) && (dirEntryRemain > 0))
{
@@ -1803,7 +1803,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
{
dirCluster = FAT_NextCluster(dirCluster);
}
- firstSector = FAT_ClustToSect(dirCluster);
+ firstSector = FAT_ClustToSect(dirCluster);
}
else if ((dirCluster == FAT16_ROOT_DIR_CLUSTER) && (secOffset == (filesysData - filesysRootDir)))
{
@@ -1824,7 +1824,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
}
// Modifying the last directory is a special case - have to erase following entries
- if (dirEntries[entryOffset].name[0] == FILE_LAST)
+ if (dirEntries[entryOffset].name[0] == FILE_LAST)
{
dirEndFlag = true;
}
@@ -1843,7 +1843,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
}
// Add new directory entry
- while (dirEntryRemain > 0)
+ while (dirEntryRemain > 0)
{
// Move to next entry, first pass advances from last used entry
entryOffset++;
@@ -1868,7 +1868,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
{
dirCluster = FAT_NextCluster(dirCluster);
}
- firstSector = FAT_ClustToSect(dirCluster);
+ firstSector = FAT_ClustToSect(dirCluster);
}
else if ((dirCluster == FAT16_ROOT_DIR_CLUSTER) && (secOffset == (filesysData - filesysRootDir)))
{
@@ -1900,7 +1900,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
lfnEntry.flag = ATTRIB_LFN;
lfnEntry.reserved1 = 0;
lfnEntry.reserved2 = 0;
-
+
*((DIR_ENT_LFN*)&dirEntries[entryOffset]) = lfnEntry;
lfnPos --;
lfnEntry.ordinal = 0;
@@ -1914,7 +1914,7 @@ bool FAT_AddDirEntry (const char* path, DIR_ENT newDirEntry)
dirEntryRemain--;
}
-
+
// Write directory back to disk
disc_WriteSector (firstSector + secOffset, dirEntries);
@@ -1930,7 +1930,7 @@ FAT_FindNextFile
Gets the name of the next directory entry
(can be a file or subdirectory)
char* filename: OUT filename, must be at least 13 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindNextFile(char* filename)
@@ -1963,7 +1963,7 @@ FAT_FindFirstFile
Gets the name of the first directory entry and resets the count
(can be a file or subdirectory)
char* filename: OUT filename, must be at least 13 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindFirstFile(char* filename)
@@ -1971,7 +1971,7 @@ FILE_TYPE FAT_FindFirstFile(char* filename)
// Get the first directory entry
DIR_ENT file;
file = FAT_GetDirEntry (curWorkDirCluster, 1, SEEK_SET);
-
+
if (file.name[0] == FILE_FREE)
{
return FT_NONE; // Did not find a file
@@ -1996,7 +1996,7 @@ FAT_FindFirstFileLFN
Gets the long file name of the first directory entry and resets
the count (can be a file or subdirectory)
char* lfn: OUT long file name, must be at least 256 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindFirstFileLFN(char* lfn)
@@ -2012,7 +2012,7 @@ FAT_FindNextFileLFN
Gets the long file name of the next directory entry
(can be a file or subdirectory)
char* lfn: OUT long file name, must be at least 256 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindNextFileLFN(char* lfn)
@@ -2026,29 +2026,29 @@ FILE_TYPE FAT_FindNextFileLFN(char* lfn)
/*-----------------------------------------------------------------
FAT_FileExists
-Returns the type of file
+Returns the type of file
char* filename: IN filename of the file to look for
-FILE_TYPE return: OUT returns FT_NONE if there is now file with
+FILE_TYPE return: OUT returns FT_NONE if there is now file with
that name, FT_FILE if it is a file and FT_DIR if it is a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FileExists(const char* filename)
{
- DIR_ENT dirEntry;
- // Get the dirEntry for the path specified
- dirEntry = FAT_DirEntFromPath (filename);
-
- if (dirEntry.name[0] == FILE_FREE)
- {
- return FT_NONE;
- }
- else if (dirEntry.attrib & ATTRIB_DIR)
- {
- return FT_DIR;
- }
- else
- {
- return FT_FILE;
- }
+ DIR_ENT dirEntry;
+ // Get the dirEntry for the path specified
+ dirEntry = FAT_DirEntFromPath (filename);
+
+ if (dirEntry.name[0] == FILE_FREE)
+ {
+ return FT_NONE;
+ }
+ else if (dirEntry.attrib & ATTRIB_DIR)
+ {
+ return FT_DIR;
+ }
+ else
+ {
+ return FT_FILE;
+ }
}
/*-----------------------------------------------------------------
@@ -2074,7 +2074,7 @@ u32 FAT_GetFileSystemTotalSize (void)
/*-----------------------------------------------------------------
FAT_chdir
Changes the current working directory
-const char* path: IN null terminated string of directory separated by
+const char* path: IN null terminated string of directory separated by
forward slashes, / is root
bool return: OUT returns true if successful
-----------------------------------------------------------------*/
@@ -2090,7 +2090,7 @@ bool FAT_chdir (const char* path)
{
return true;
}
-
+
dir = FAT_DirEntFromPath (path);
if (((dir.attrib & ATTRIB_DIR) == ATTRIB_DIR) && (dir.name[0] != FILE_FREE))
@@ -2111,7 +2111,7 @@ bool FAT_chdir (const char* path)
return true;
}
else
- {
+ {
// Couldn't change directory - wrong path specified
return false;
}
@@ -2120,12 +2120,12 @@ bool FAT_chdir (const char* path)
/*-----------------------------------------------------------------
FAT_fopen(filename, mode)
Opens a file
-const char* path: IN null terminated string of filename and path
+const char* path: IN null terminated string of filename and path
separated by forward slashes, / is root
const char* mode: IN mode to open file in
Supported modes: "r", "r+", "w", "w+", "a", "a+", don't use
"b" or "t" in any mode, as all files are openned in binary mode
-FAT_FILE* return: OUT handle to open file, returns NULL if the file
+FAT_FILE* return: OUT handle to open file, returns NULL if the file
couldn't be openned
-----------------------------------------------------------------*/
FAT_FILE* FAT_fopen(const char* path, const char* mode)
@@ -2149,10 +2149,10 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
{
return NULL;
}
-
+
// Get the dirEntry for the path specified
dirEntry = FAT_DirEntFromPath (path);
-
+
// Check that it is not a directory
if (dirEntry.attrib & ATTRIB_DIR)
{
@@ -2174,7 +2174,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
// Find a free file buffer
for (fileNum = 0; (fileNum < MAX_FILES_OPEN) && (openFiles[fileNum].inUse == true); fileNum++);
-
+
if (fileNum == MAX_FILES_OPEN) // No free files
{
return NULL;
@@ -2191,7 +2191,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
{
return NULL;
}
-
+
file->read = true;
#ifdef CAN_WRITE_TO_DISC
file->write = ( strchr(mode, '+') != NULL ); //(mode[1] == '+');
@@ -2199,13 +2199,13 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
file->write = false;
#endif
file->append = false;
-
+
// Store information about position within the file, for use
// by FAT_fread, FAT_fseek, etc.
file->firstCluster = dirEntry.startCluster | (dirEntry.startClusterHigh << 16);
-
+
#ifdef CAN_WRITE_TO_DISC
- // Check if file is openned for random. If it is, and currently has no cluster, one must be
+ // Check if file is openned for random. If it is, and currently has no cluster, one must be
// assigned to it.
if (file->write && file->firstCluster == CLUSTER_FREE)
{
@@ -2223,7 +2223,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
disc_WriteSector (file->dirEntSector, globalBuffer);
}
#endif
-
+
file->length = dirEntry.fileSize;
file->curPos = 0;
file->curClus = dirEntry.startCluster | (dirEntry.startClusterHigh << 16);
@@ -2234,7 +2234,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
file->appByte = 0;
file->appClus = 0;
file->appSect = 0;
-
+
disc_ReadSector( FAT_ClustToSect( file->curClus), file->readBuffer);
file->inUse = true; // We're using this file now
@@ -2248,7 +2248,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
{
dirEntry.attrib = ATTRIB_ARCH;
dirEntry.reserved = 0;
-
+
// Time and date set to system time and date
dirEntry.cTime_ms = 0;
dirEntry.cTime = getRTCtoFileTime();
@@ -2257,12 +2257,12 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
dirEntry.mTime = getRTCtoFileTime();
dirEntry.mDate = getRTCtoFileDate();
}
- else // Already a file entry
+ else // Already a file entry
{
// Free any clusters used
FAT_ClearLinks (dirEntry.startCluster | (dirEntry.startClusterHigh << 16));
}
-
+
// Get a cluster to use
startCluster = FAT_LinkFreeCluster (CLUSTER_FREE);
if (startCluster == CLUSTER_FREE) // Couldn't get a free cluster
@@ -2298,13 +2298,13 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
((DIR_ENT*) globalBuffer)[file->dirEntOffset] = dirEntry;
disc_WriteSector (file->dirEntSector, globalBuffer);
}
-
+
// Now that file is created, open it
file->read = ( strchr(mode, '+') != NULL ); //(mode[1] == '+');
file->write = true;
file->append = false;
-
+
// Store information about position within the file, for use
// by FAT_fread, FAT_fseek, etc.
file->firstCluster = startCluster;
@@ -2318,7 +2318,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
file->appByte = 0;
file->appClus = 0;
file->appSect = 0;
-
+
// Empty file, so empty read buffer
memset (file->readBuffer, 0, BYTE_PER_READ);
file->inUse = true; // We're using this file now
@@ -2332,7 +2332,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
{
dirEntry.attrib = ATTRIB_ARCH;
dirEntry.reserved = 0;
-
+
// Time and date set to system time and date
dirEntry.cTime_ms = 0;
dirEntry.cTime = getRTCtoFileTime();
@@ -2352,13 +2352,13 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
}
dirEntry.startCluster = (startCluster & 0xFFFF);
dirEntry.startClusterHigh = ((startCluster >> 16) & 0xFFFF);
-
+
if(!FAT_AddDirEntry (path, dirEntry))
return NULL;
-
+
// Get the newly created dirEntry
dirEntry = FAT_DirEntFromPath (path);
-
+
// Store append cluster
file->appClus = startCluster;
@@ -2377,7 +2377,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
{
return NULL;
}
-
+
// Store cluster position into the directory entry
dirEntry.startCluster = (file->firstCluster & 0xFFFF);
dirEntry.startClusterHigh = ((file->firstCluster >> 16) & 0xFFFF);
@@ -2387,7 +2387,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
// Store append cluster
file->appClus = startCluster;
-
+
} else {
// Follow cluster list until last one is found
@@ -2410,7 +2410,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
file->read = ( strchr(mode, '+') != NULL );
file->write = false;
file->append = true;
-
+
// Calculate the sector and byte of the current position,
// and store them
file->appSect = (dirEntry.fileSize % filesysBytePerClus) / BYTE_PER_READ;
@@ -2424,7 +2424,7 @@ FAT_FILE* FAT_fopen(const char* path, const char* mode)
file->curClus = file->appClus;
file->curSect = file->appSect;
file->curByte = file->appByte;
-
+
// Read into buffer
disc_ReadSector( FAT_ClustToSect(file->curClus) + file->curSect, file->readBuffer);
file->inUse = true; // We're using this file now
@@ -2464,7 +2464,7 @@ bool FAT_fclose (FAT_FILE* file)
disc_CacheFlush();
}
#endif
- file->inUse = false;
+ file->inUse = false;
return true;
}
else
@@ -2515,14 +2515,14 @@ int FAT_fseek(FAT_FILE* file, s32 offset, int origin)
}
// Can't seek in append only mode
- if (!file->read && !file->write)
+ if (!file->read && !file->write)
{
return -1;
}
curPos = file->curPos;
- switch (origin)
+ switch (origin)
{
case SEEK_SET:
if (offset >= 0)
@@ -2537,13 +2537,13 @@ int FAT_fseek(FAT_FILE* file, s32 offset, int origin)
if (offset >= 0)
{
position = curPos + offset;
- }
+ }
else if ( (u32)(offset * -1) >= curPos )
{
// Tried to seek before start of file
position = 0;
}
- else
+ else
{
// Using u32 to maintain 32 bits of accuracy
position = curPos - (u32)(offset * -1);
@@ -2560,7 +2560,7 @@ int FAT_fseek(FAT_FILE* file, s32 offset, int origin)
// Tried to seek before start of file
position = 0;
}
- else
+ else
{
// Using u32 to maintain 32 bits of accuracy
position = file->length - (u32)(offset * -1);
@@ -2575,7 +2575,7 @@ int FAT_fseek(FAT_FILE* file, s32 offset, int origin)
// Tried to go past end of file
position = file->length;
}
-
+
// Save position
file->curPos = position;
@@ -2608,14 +2608,14 @@ int FAT_fseek(FAT_FILE* file, s32 offset, int origin)
nextCluster = FAT_NextCluster (cluster);
}
// Check if ran out of clusters, and the file is being written to
- if ((clusCount >= 0) && (file->write || file->append))
+ if ((clusCount >= 0) && (file->write || file->append))
{
// Set flag to allocate a new cluster
file->curSect = filesysSecPerClus;
file->curByte = 0;
}
file->curClus = cluster;
-
+
// Reload sector buffer for new position in file, if it is a different sector
if ((curPos ^ position) >= BYTE_PER_READ)
{
@@ -2645,7 +2645,7 @@ u32 FAT_fread (void* buffer, u32 size, u32 count, FAT_FILE* file)
int curSect;
u32 curClus;
u32 tempNextCluster;
-
+
int tempVar;
char* data = (char*)buffer;
@@ -2678,14 +2678,14 @@ u32 FAT_fread (void* buffer, u32 size, u32 count, FAT_FILE* file)
if (tempVar > remain)
tempVar = remain;
- if ((tempVar < BYTE_PER_READ) && flagNoError)
+ if ((tempVar < BYTE_PER_READ) && flagNoError)
{
memcpy(data, &(file->readBuffer[curByte]), tempVar);
remain -= tempVar;
data += tempVar;
curByte += tempVar;
- if (curByte >= BYTE_PER_READ)
+ if (curByte >= BYTE_PER_READ)
{
curByte = 0;
curSect++;
@@ -2694,7 +2694,7 @@ u32 FAT_fread (void* buffer, u32 size, u32 count, FAT_FILE* file)
// align to cluster
// tempVar is number of sectors to read
- if (remain > (filesysSecPerClus - curSect) * BYTE_PER_READ)
+ if (remain > (filesysSecPerClus - curSect) * BYTE_PER_READ)
{
tempVar = filesysSecPerClus - curSect;
} else {
@@ -2789,7 +2789,7 @@ u32 FAT_fread (void* buffer, u32 size, u32 count, FAT_FILE* file)
FAT_fwrite(buffer, size, count, file)
Writes size * count bytes into file from buffer, starting
from current position. It then sets the current position to the
- byte after the last byte written. If the file was openned in
+ byte after the last byte written. If the file was openned in
append mode it always writes to the end of the file.
const void* buffer IN: Pointer to buffer containing data. Should be
at least as big as the number of bytes to be written.
@@ -2870,7 +2870,7 @@ u32 FAT_fwrite (const void* buffer, u32 size, u32 count, FAT_FILE* file)
disc_ReadSector( FAT_ClustToSect( curClus), writeBuffer);
}
}
-
+
// Align to sector
tempVar = BYTE_PER_READ - curByte;
if (tempVar > remain)
@@ -2885,9 +2885,9 @@ u32 FAT_fwrite (const void* buffer, u32 size, u32 count, FAT_FILE* file)
// Write buffer back to disk
disc_WriteSector (curSect + FAT_ClustToSect(curClus), writeBuffer);
-
+
// Move onto next sector
- if (curByte >= BYTE_PER_READ)
+ if (curByte >= BYTE_PER_READ)
{
curByte = 0;
curSect++;
@@ -2896,7 +2896,7 @@ u32 FAT_fwrite (const void* buffer, u32 size, u32 count, FAT_FILE* file)
// Align to cluster
// tempVar is number of sectors to write
- if (remain > (filesysSecPerClus - curSect) * BYTE_PER_READ)
+ if (remain > (filesysSecPerClus - curSect) * BYTE_PER_READ)
{
tempVar = filesysSecPerClus - curSect;
} else {
@@ -2964,7 +2964,7 @@ u32 FAT_fwrite (const void* buffer, u32 size, u32 count, FAT_FILE* file)
remain -= tempVar * BYTE_PER_READ;
curSect += tempVar;
}
-
+
// Last remaining sector
// Check if sector wanted is different to the one started with
if ( (( (file->append ? file->appByte : file->curByte) + length) >= BYTE_PER_READ) && flagNoError)
@@ -2984,7 +2984,7 @@ u32 FAT_fwrite (const void* buffer, u32 size, u32 count, FAT_FILE* file)
disc_WriteSector( curSect + FAT_ClustToSect( curClus), writeBuffer);
}
}
-
+
// Amount read is the originally requested amount minus stuff remaining
length = length - remain;
@@ -3041,14 +3041,14 @@ int FAT_remove (const char* path)
u32 oldWorkDirCluster;
char checkFilename[13];
FILE_TYPE checkFiletype;
-
+
dirEntry = FAT_DirEntFromPath (path);
if (dirEntry.name[0] == FILE_FREE)
{
return -1;
}
-
+
// Only delete directories if the directory is entry
if (dirEntry.attrib & ATTRIB_DIR)
{
@@ -3062,10 +3062,10 @@ int FAT_remove (const char* path)
{
checkFiletype = FAT_FindNextFile (checkFilename);
}
-
+
// Change back to working directory
curWorkDirCluster = oldWorkDirCluster;
-
+
// Check that the directory is empty
if (checkFiletype != FT_NONE)
{
@@ -3084,7 +3084,7 @@ int FAT_remove (const char* path)
disc_ReadSector ( (wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector , globalBuffer);
((DIR_ENT*)globalBuffer)[wrkDirOffset].name[0] = FILE_FREE;
disc_WriteSector ( (wrkDirCluster == FAT16_ROOT_DIR_CLUSTER ? filesysRootDir : FAT_ClustToSect(wrkDirCluster)) + wrkDirSector , globalBuffer);
-
+
// Flush any sectors in disc cache
disc_CacheFlush();
@@ -3095,7 +3095,7 @@ int FAT_remove (const char* path)
#ifdef CAN_WRITE_TO_DISC
/*-----------------------------------------------------------------
FAT_mkdir (path)
-Makes a new directory, so long as no other directory or file has
+Makes a new directory, so long as no other directory or file has
the same name.
const char* path IN: Path and filename of directory to make
int return OUT: zero if successful, non-zero if not
@@ -3123,7 +3123,7 @@ int FAT_mkdir (const char* path)
{
curWorkDirCluster = filesysRootDirClus;
}
-
+
pathPos = 0;
filePos = 0;
@@ -3132,7 +3132,7 @@ int FAT_mkdir (const char* path)
if (path[pathPos + filePos] == '/')
{
pathname[filePos] = '\0';
- if (FAT_chdir(pathname) == false)
+ if (FAT_chdir(pathname) == false)
{
curWorkDirCluster = oldDirCluster;
return -1; // Couldn't change directory
@@ -3236,9 +3236,9 @@ FAT_fgets (char *tgtBuffer, int num, FAT_FILE* file)
Gets a up to num bytes from file, stopping at the first
newline.
-CAUTION: does not do strictly streaming. I.e. it's
+CAUTION: does not do strictly streaming. I.e. it's
reading more then needed bytes and seeking back.
- shouldn't matter for random access
+ shouldn't matter for random access
char *tgtBuffer OUT: buffer to write to
int num IN: size of target buffer
@@ -3250,62 +3250,62 @@ bool return OUT: character if successful, EOF if not
* Added check for unix style text files
* Removed seek when no newline is found, since it isn't necessary
-------------------------------------------------------------------*/
-char *FAT_fgets(char *tgtBuffer, int num, FAT_FILE* file)
-{
+char *FAT_fgets(char *tgtBuffer, int num, FAT_FILE* file)
+{
u32 curPos;
u32 readLength;
char *returnChar;
-
- // invalid filehandle
+
+ // invalid filehandle
if (file == NULL)
{
- return NULL ;
+ return NULL ;
}
-
- // end of file
+
+ // end of file
if (FAT_feof(file)==true)
{
- return NULL ;
- }
-
- // save current position
- curPos = FAT_ftell(file);
-
- // read the full buffer (max string chars is num-1 and one end of string \0
- readLength = FAT_fread(tgtBuffer,1,num-1,file) ;
-
- // mark least possible end of string
- tgtBuffer[readLength] = '\0' ;
-
- if (readLength==0) {
- // return error
- return NULL ;
- }
-
- // get position of first return '\r'
- returnChar = strchr(tgtBuffer,'\r');
-
+ return NULL ;
+ }
+
+ // save current position
+ curPos = FAT_ftell(file);
+
+ // read the full buffer (max string chars is num-1 and one end of string \0
+ readLength = FAT_fread(tgtBuffer,1,num-1,file) ;
+
+ // mark least possible end of string
+ tgtBuffer[readLength] = '\0' ;
+
+ if (readLength==0) {
+ // return error
+ return NULL ;
+ }
+
+ // get position of first return '\r'
+ returnChar = strchr(tgtBuffer,'\r');
+
// if no return is found, search for a newline
if (returnChar == NULL)
{
returnChar = strchr(tgtBuffer,'\n');
}
-
- // Mark the return, if existant, as end of line/string
- if (returnChar!=NULL) {
- *returnChar++ = 0 ;
- if (*returnChar=='\n') { // catch newline too when jumping over the end
- // return to location after \r\n (strlen+2)
- FAT_fseek(file,curPos+strlen(tgtBuffer)+2,SEEK_SET) ;
- return tgtBuffer ;
- } else {
- // return to location after \r (strlen+1)
- FAT_fseek(file,curPos+strlen(tgtBuffer)+1,SEEK_SET) ;
- return tgtBuffer ;
+
+ // Mark the return, if existant, as end of line/string
+ if (returnChar!=NULL) {
+ *returnChar++ = 0 ;
+ if (*returnChar=='\n') { // catch newline too when jumping over the end
+ // return to location after \r\n (strlen+2)
+ FAT_fseek(file,curPos+strlen(tgtBuffer)+2,SEEK_SET) ;
+ return tgtBuffer ;
+ } else {
+ // return to location after \r (strlen+1)
+ FAT_fseek(file,curPos+strlen(tgtBuffer)+1,SEEK_SET) ;
+ return tgtBuffer ;
}
}
-
- return tgtBuffer ;
+
+ return tgtBuffer ;
}
#ifdef CAN_WRITE_TO_DISC
@@ -3322,20 +3322,20 @@ bool return OUT: number of characters written if successful,
* Uses FAT_FILE instead of int
* writtenBytes is now u32 instead of int
-------------------------------------------------------------------*/
-int FAT_fputs (const char *string, FAT_FILE* file)
-{
+int FAT_fputs (const char *string, FAT_FILE* file)
+{
u32 writtenBytes;
- // save string except end of string '\0'
- writtenBytes = FAT_fwrite((void *)string, 1, strlen(string), file);
+ // save string except end of string '\0'
+ writtenBytes = FAT_fwrite((void *)string, 1, strlen(string), file);
- // check if we had an error
- if (writtenBytes != strlen(string))
- {
- // return EOF error
+ // check if we had an error
+ if (writtenBytes != strlen(string))
+ {
+ // return EOF error
return EOF;
}
- // return the charcount written
- return writtenBytes ;
+ // return the charcount written
+ return writtenBytes ;
}
#endif
diff --git a/backends/platform/ds/arm9/source/fat/gba_nds_fat.h b/backends/platform/ds/arm9/source/fat/gba_nds_fat.h
index c554cc80f6..539f94fef7 100644
--- a/backends/platform/ds/arm9/source/fat/gba_nds_fat.h
+++ b/backends/platform/ds/arm9/source/fat/gba_nds_fat.h
@@ -25,7 +25,7 @@
// Maximum number of files open at once
// Increase this to open more files, decrease to save memory
-#define MAX_FILES_OPEN 4
+#define MAX_FILES_OPEN 16
// Allow file writing
// Disable this to remove file writing support
@@ -147,7 +147,7 @@ bool FAT_GetAlias (char* alias);
/*-----------------------------------------------------------------
FAT_GetLongFilename
-Get the long name of the last file or directory retrived with
+Get the long name of the last file or directory retrived with
GetDirEntry. Also works for FindFirstFile and FindNextFile
char* filename: OUT will be filled with the filename, should be at
least 256 bytes long
@@ -210,7 +210,7 @@ FAT_FindNextFile
Gets the name of the next directory entry
(can be a file or subdirectory)
char* filename: OUT filename, must be at least 13 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindNextFile (char* filename);
@@ -220,7 +220,7 @@ FAT_FindFirstFile
Gets the name of the first directory entry and resets the count
(can be a file or subdirectory)
char* filename: OUT filename, must be at least 13 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindFirstFile (char* filename);
@@ -230,7 +230,7 @@ FAT_FindFirstFileLFN
Gets the long file name of the first directory entry and resets
the count (can be a file or subdirectory)
char* lfn: OUT long file name, must be at least 256 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindFirstFileLFN(char* lfn);
@@ -240,16 +240,16 @@ FAT_FindNextFileLFN
Gets the long file name of the next directory entry
(can be a file or subdirectory)
char* lfn: OUT long file name, must be at least 256 chars long
-FILE_TYPE return: OUT returns FT_NONE if failed,
+FILE_TYPE return: OUT returns FT_NONE if failed,
FT_FILE if it found a file and FT_DIR if it found a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FindNextFileLFN(char* lfn);
/*-----------------------------------------------------------------
FAT_FileExists
-Returns the type of file
+Returns the type of file
char* filename: IN filename of the file to look for
-FILE_TYPE return: OUT returns FT_NONE if there is now file with
+FILE_TYPE return: OUT returns FT_NONE if there is now file with
that name, FT_FILE if it is a file and FT_DIR if it is a directory
-----------------------------------------------------------------*/
FILE_TYPE FAT_FileExists (const char* filename);
@@ -269,7 +269,7 @@ u32 FAT_GetFileSystemTotalSize (void);
/*-----------------------------------------------------------------
FAT_chdir
Changes the current working directory
-const char* path: IN null terminated string of directory separated by
+const char* path: IN null terminated string of directory separated by
forward slashes, / is root
bool return: OUT returns true if successful
-----------------------------------------------------------------*/
@@ -282,12 +282,12 @@ bool FAT_chdir (const char* path);
/*-----------------------------------------------------------------
FAT_fopen(filename, mode)
Opens a file
-const char* path: IN null terminated string of filename and path
+const char* path: IN null terminated string of filename and path
separated by forward slashes, / is root
const char* mode: IN mode to open file in
Supported modes: "r", "r+", "w", "w+", "a", "a+", don't use
"b" or "t" in any mode, as all files are openned in binary mode
-FAT_FILE* return: OUT handle to open file, returns -1 if the file
+FAT_FILE* return: OUT handle to open file, returns -1 if the file
couldn't be openned
-----------------------------------------------------------------*/
FAT_FILE* FAT_fopen(const char* path, const char* mode);
@@ -338,7 +338,7 @@ u32 FAT_fread (void* buffer, u32 size, u32 count, FAT_FILE* file);
FAT_fwrite(buffer, size, count, file)
Writes size * count bytes into file from buffer, starting
from current position. It then sets the current position to the
- byte after the last byte written. If the file was openned in
+ byte after the last byte written. If the file was openned in
append mode it always writes to the end of the file.
const void* buffer IN: Pointer to buffer containing data. Should be
at least as big as the number of bytes to be written.
@@ -371,7 +371,7 @@ int FAT_remove (const char* path);
#ifdef CAN_WRITE_TO_DISC
/*-----------------------------------------------------------------
FAT_mkdir (path)
-Makes a new directory, so long as no other directory or file has
+Makes a new directory, so long as no other directory or file has
the same name.
const char* path IN: Path and filename of directory to make
int return OUT: zero if successful, non-zero if not
@@ -403,9 +403,9 @@ FAT_fgets (char *tgtBuffer, int num, FAT_FILE* file)
Gets a up to num bytes from file, stopping at the first
newline.
-CAUTION: does not do strictly streaming. I.e. it's
+CAUTION: does not do strictly streaming. I.e. it's
reading more then needed bytes and seeking back.
- shouldn't matter for random access
+ shouldn't matter for random access
char *tgtBuffer OUT: buffer to write to
int num IN: size of target buffer
diff --git a/backends/platform/ds/arm9/source/fat/io_dldi.h b/backends/platform/ds/arm9/source/fat/io_dldi.h
index 034c6aace3..053de3a94c 100644
--- a/backends/platform/ds/arm9/source/fat/io_dldi.h
+++ b/backends/platform/ds/arm9/source/fat/io_dldi.h
@@ -1,8 +1,8 @@
/*
- io_dldi.h
+ io_dldi.h
Reserved space for new drivers
-
+
This software is completely free. No warranty is provided.
If you use it, please give me credit and email me about your
project at chishm@hotmail.com
diff --git a/backends/platform/ds/arm9/source/fat/io_dldi.s b/backends/platform/ds/arm9/source/fat/io_dldi.s
index 657e475086..c2314e772d 100644
--- a/backends/platform/ds/arm9/source/fat/io_dldi.s
+++ b/backends/platform/ds/arm9/source/fat/io_dldi.s
@@ -17,8 +17,8 @@
.byte 0x01 @ Version number
.byte 0x0F @32KiB @ Log [base-2] of the size of this driver in bytes.
.byte 0x00 @ Sections to fix
- .byte 0x0F @32KiB @ Log [base-2] of the allocated space in bytes.
-
+ .byte 0x0F @32KiB @ Log [base-2] of the allocated space in bytes.
+
@---------------------------------------------------------------------------------
@ Text identifier - can be anything up to 47 chars + terminating null -- 16 bytes
.align 4
@@ -42,13 +42,13 @@ _dldi_driver_name:
_io_dldi:
.ascii "DLDI" @ ioType
.word 0x00000000 @ Features
- .word _DLDI_startup @
- .word _DLDI_isInserted @
+ .word _DLDI_startup @
+ .word _DLDI_isInserted @
.word _DLDI_readSectors @ Function pointers to standard device driver functions
- .word _DLDI_writeSectors @
- .word _DLDI_clearStatus @
- .word _DLDI_shutdown @
-
+ .word _DLDI_writeSectors @
+ .word _DLDI_clearStatus @
+ .word _DLDI_shutdown @
+
@---------------------------------------------------------------------------------
_DLDI_startup:
diff --git a/backends/platform/ds/arm9/source/fat/io_efa2.c b/backends/platform/ds/arm9/source/fat/io_efa2.c
index 468361969e..f3aa65cfcb 100644
--- a/backends/platform/ds/arm9/source/fat/io_efa2.c
+++ b/backends/platform/ds/arm9/source/fat/io_efa2.c
@@ -47,7 +47,7 @@ See gba_nds_fat.txt for help and license details.
// ID of Samsung K9K1G NAND flash chip
#define EFA2_NAND_ID 0xEC79A5C0
-// first sector of udisk
+// first sector of udisk
#define EFA2_UDSK_START 0x40
//
@@ -101,7 +101,7 @@ void efa2_nand_lock(void) {
//
// Set NAND Flash chip enable and write protection bits ?
-//
+//
// val | ~CE | ~WP |
// -----+-----+-----+
// 0 | 0 | 0 |
@@ -125,7 +125,7 @@ inline void efa2_nand_reset(void) {
//
// Read out NAND ID information, could be used for card detection
-//
+//
// | EFA2 1GBit |
// ------------------+------------+
// maker code | 0xEC |
@@ -166,7 +166,7 @@ EFA2_ClearStatus
Reads and checks NAND status information
bool return OUT: true if NAND is idle
-----------------------------------------------------------------*/
-bool EFA2_ClearStatus (void)
+bool EFA2_ClearStatus (void)
{
// tbd: currently there is no write support, so always return
// true, there is no possibility for pending operations
@@ -178,7 +178,7 @@ EFA2_IsInserted
Checks to see if the NAND chip used by the EFA2 is present
bool return OUT: true if the correct NAND chip is found
-----------------------------------------------------------------*/
-bool EFA2_IsInserted (void)
+bool EFA2_IsInserted (void)
{
EFA2_ClearStatus();
return (efa2_nand_id() == EFA2_NAND_ID);
@@ -223,7 +223,7 @@ bool EFA2_ReadSectors (u32 sector, u8 numSecs, void* buffer)
efa2_nand_reset();
// set NAND to READ1 operation mode and transfer page address
- REG_EFA2_NAND_CMD = 0x00; // write READ1 command
+ REG_EFA2_NAND_CMD = 0x00; // write READ1 command
REG_EFA2_NAND_WR = 0x00; // write address [7:0]
REG_EFA2_NAND_WR = (page ) & 0xff; // write address [15:8]
REG_EFA2_NAND_WR = (page >> 8 ) & 0xff; // write address[23:16]
@@ -280,7 +280,7 @@ bool EFA2_WriteSectors (u32 sector, u8 numSecs, void* buffer)
EFA2_Shutdown
unload the EFA2 interface
-----------------------------------------------------------------*/
-bool EFA2_Shutdown(void)
+bool EFA2_Shutdown(void)
{
return EFA2_ClearStatus();
}
@@ -368,7 +368,7 @@ See gba_nds_fat.txt for help and license details.
// ID of Samsung K9K1G NAND flash chip
#define EFA2_NAND_ID 0xEC79A5C0
-// first sector of udisk
+// first sector of udisk
#define EFA2_UDSK_START 0x40
//
@@ -422,7 +422,7 @@ void efa2_nand_lock(void) {
//
// Set NAND Flash chip enable and write protection bits ?
-//
+//
// val | ~CE | ~WP |
// -----+-----+-----+
// 0 | 0 | 0 |
@@ -446,7 +446,7 @@ inline void efa2_nand_reset(void) {
//
// Read out NAND ID information, could be used for card detection
-//
+//
// | EFA2 1GBit |
// ------------------+------------+
// maker code | 0xEC |
@@ -487,7 +487,7 @@ EFA2_ClearStatus
Reads and checks NAND status information
bool return OUT: true if NAND is idle
-----------------------------------------------------------------*/
-bool EFA2_ClearStatus (void)
+bool EFA2_ClearStatus (void)
{
// tbd: currently there is no write support, so always return
// true, there is no possibility for pending operations
@@ -499,7 +499,7 @@ EFA2_IsInserted
Checks to see if the NAND chip used by the EFA2 is present
bool return OUT: true if the correct NAND chip is found
-----------------------------------------------------------------*/
-bool EFA2_IsInserted (void)
+bool EFA2_IsInserted (void)
{
EFA2_ClearStatus();
return (efa2_nand_id() == EFA2_NAND_ID);
@@ -544,7 +544,7 @@ bool EFA2_ReadSectors (u32 sector, u8 numSecs, void* buffer)
efa2_nand_reset();
// set NAND to READ1 operation mode and transfer page address
- REG_EFA2_NAND_CMD = 0x00; // write READ1 command
+ REG_EFA2_NAND_CMD = 0x00; // write READ1 command
REG_EFA2_NAND_WR = 0x00; // write address [7:0]
REG_EFA2_NAND_WR = (page ) & 0xff; // write address [15:8]
REG_EFA2_NAND_WR = (page >> 8 ) & 0xff; // write address[23:16]
@@ -601,7 +601,7 @@ bool EFA2_WriteSectors (u32 sector, u8 numSecs, void* buffer)
EFA2_Shutdown
unload the EFA2 interface
-----------------------------------------------------------------*/
-bool EFA2_Shutdown(void)
+bool EFA2_Shutdown(void)
{
return EFA2_ClearStatus();
}
diff --git a/backends/platform/ds/arm9/source/fat/io_fcsr.c b/backends/platform/ds/arm9/source/fat/io_fcsr.c
index 7a67a6b1b0..d576dfbb0f 100644
--- a/backends/platform/ds/arm9/source/fat/io_fcsr.c
+++ b/backends/platform/ds/arm9/source/fat/io_fcsr.c
@@ -4,7 +4,7 @@
compact_flash.c
By chishm (Michael Chisholm)
- Hardware Routines for using a GBA Flash Cart and SRAM as a
+ Hardware Routines for using a GBA Flash Cart and SRAM as a
block device.
This software is completely free. No warranty is provided.
@@ -57,7 +57,7 @@ FCSR_IsInserted
Is a GBA Flash Cart with a valid file system inserted?
bool return OUT: true if a GBA FC card is inserted
-----------------------------------------------------------------*/
-bool FCSR_IsInserted (void)
+bool FCSR_IsInserted (void)
{
bool flagFoundFileSys = false;
@@ -85,7 +85,7 @@ FCSR_ClearStatus
Finish any pending operations
bool return OUT: always true for GBA FC
-----------------------------------------------------------------*/
-bool FCSR_ClearStatus (void)
+bool FCSR_ClearStatus (void)
{
return true;
}
@@ -101,7 +101,7 @@ void* buffer OUT: pointer to 512 byte buffer to store data in
bool return OUT: true if successful
-----------------------------------------------------------------*/
bool FCSR_ReadSectors (u32 sector, u8 numSecs, void* buffer)
-{
+{
int i;
bool flagSramSector = false;
int numSectors = (numSecs > 0 ? numSecs : 256);
@@ -208,14 +208,14 @@ bool FCSR_WriteSectors (u32 sector, u8 numSecs, void* buffer)
FCSR_Shutdown
unload the Flash Cart interface
-----------------------------------------------------------------*/
-bool FCSR_Shutdown(void)
+bool FCSR_Shutdown(void)
{
int i;
if (FCSR_ClearStatus() == false)
return false;
FCSR_FileSysPointer = 0;
-
+
for (i=0; i < 4; i++)
{
FCSR_SramSectorPointer[i] = 0;
@@ -262,11 +262,11 @@ bool FCSR_StartUp(void)
// Get SRAM sector regions from header block
for (i = 0; i < 4; i++)
{
- FCSR_SramSectorStart[i] = fileSysPointer[i+4];
+ FCSR_SramSectorStart[i] = fileSysPointer[i+4];
SramRegionSize[i] = fileSysPointer[i+8];
FCSR_SramSectorEnd[i] = FCSR_SramSectorStart[i] + SramRegionSize[i];
}
-
+
// Calculate SRAM region pointers
FCSR_SramSectorPointer[0] = (u8*)(SRAM_START + 4);
for (i = 1; i < 4; i++)
diff --git a/backends/platform/ds/arm9/source/fat/io_fcsr.h b/backends/platform/ds/arm9/source/fat/io_fcsr.h
index ef390a8ad6..2f87c1c8aa 100644
--- a/backends/platform/ds/arm9/source/fat/io_fcsr.h
+++ b/backends/platform/ds/arm9/source/fat/io_fcsr.h
@@ -1,5 +1,5 @@
/*
- io_fcsr.h
+ io_fcsr.h
Hardware Routines for using a GBA Flash Cart with SRAM
@@ -23,7 +23,7 @@ extern LPIO_INTERFACE FCSR_GetInterface(void) ;
#endif // define IO_FCSR_H
/*
- io_fcsr.h
+ io_fcsr.h
Hardware Routines for using a GBA Flash Cart with SRAM
diff --git a/backends/platform/ds/arm9/source/fat/io_m3_common.c b/backends/platform/ds/arm9/source/fat/io_m3_common.c
index 9c8280c808..ab2c143327 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3_common.c
+++ b/backends/platform/ds/arm9/source/fat/io_m3_common.c
@@ -1,13 +1,13 @@
/*
- io_m3_common.c
+ io_m3_common.c
Routines common to all version of the M3
-
+
Some code based on M3 SD drivers supplied by M3Adapter.
Some code written by SaTa may have been unknowingly used.
Copyright (c) 2006 Michael "Chishm" Chisholm
-
+
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -47,7 +47,7 @@ void _M3_changeMode (u32 mode) {
_M3_readHalfword (0x08000000 + (mode << 1));
_M3_readHalfword (0x0800080e);
_M3_readHalfword (0x08000000);
-
+
if ((mode & 0x0f) != 4) {
_M3_readHalfword (0x09000000);
} else {
@@ -56,5 +56,5 @@ void _M3_changeMode (u32 mode) {
_M3_readHalfword (0x08000188);
_M3_readHalfword (0x08000188);
}
-}
+}
diff --git a/backends/platform/ds/arm9/source/fat/io_m3_common.h b/backends/platform/ds/arm9/source/fat/io_m3_common.h
index 6d0c669783..92e6bed980 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3_common.h
+++ b/backends/platform/ds/arm9/source/fat/io_m3_common.h
@@ -1,5 +1,5 @@
/*
- io_m3_common.h
+ io_m3_common.h
Routines common to all version of the M3
@@ -7,7 +7,7 @@
Some code written by SaTa may have been unknowingly used.
Copyright (c) 2006 Michael "Chishm" Chisholm
-
+
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -40,7 +40,7 @@
// Values for changing mode
#define M3_MODE_ROM 0x00400004
-#define M3_MODE_MEDIA 0x00400003
+#define M3_MODE_MEDIA 0x00400003
extern void _M3_changeMode (u32 mode);
diff --git a/backends/platform/ds/arm9/source/fat/io_m3cf.c b/backends/platform/ds/arm9/source/fat/io_m3cf.c
index 968d83ae33..910f01097e 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3cf.c
+++ b/backends/platform/ds/arm9/source/fat/io_m3cf.c
@@ -73,7 +73,7 @@ M3CF_IsInserted
Is a compact flash card inserted?
bool return OUT: true if a CF card is inserted
-----------------------------------------------------------------*/
-bool M3CF_IsInserted (void)
+bool M3CF_IsInserted (void)
{
// Change register, then check if value did change
M3_REG_STS = CF_STS_INSERTED;
@@ -86,17 +86,17 @@ M3CF_ClearStatus
Tries to make the CF card go back to idle mode
bool return OUT: true if a CF card is idle
-----------------------------------------------------------------*/
-bool M3CF_ClearStatus (void)
+bool M3CF_ClearStatus (void)
{
int i;
-
+
// Wait until CF card is finished previous commands
i=0;
while ((M3_REG_CMD & CF_STS_BUSY) && (i < CARD_TIMEOUT))
{
i++;
}
-
+
// Wait until card is ready for commands
i = 0;
while ((!(M3_REG_STS & CF_STS_INSERTED)) && (i < CARD_TIMEOUT))
@@ -128,7 +128,7 @@ bool M3CF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
u8 *buff_u8 = (u8*)buffer;
int temp;
#endif
-
+
#if defined _CF_USE_DMA && defined NDS && defined ARM9
DC_FlushRange( buffer, j * BYTE_PER_READ);
#endif
@@ -139,7 +139,7 @@ bool M3CF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
{
i++;
}
-
+
// Wait until card is ready for commands
i = 0;
while ((!(M3_REG_STS & CF_STS_INSERTED)) && (i < CARD_TIMEOUT))
@@ -148,20 +148,20 @@ bool M3CF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Set number of sectors to read
- M3_REG_SEC = numSecs;
-
+ M3_REG_SEC = numSecs;
+
// Set read sector
M3_REG_LBA1 = sector & 0xFF; // 1st byte of sector number
M3_REG_LBA2 = (sector >> 8) & 0xFF; // 2nd byte of sector number
M3_REG_LBA3 = (sector >> 16) & 0xFF; // 3rd byte of sector number
M3_REG_LBA4 = ((sector >> 24) & 0x0F )| CF_CMD_LBA; // last nibble of sector number
-
+
// Set command to read
M3_REG_CMD = CF_CMD_READ;
-
-
+
+
while (j--)
{
// Wait until card is ready for reading
@@ -172,7 +172,7 @@ bool M3CF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Read data
#ifdef _CF_USE_DMA
#ifdef NDS
@@ -194,12 +194,12 @@ bool M3CF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
} else {
while(i--)
- *buff++ = *M3_DATA;
+ *buff++ = *M3_DATA;
}
#else
i=256;
while(i--)
- *buff++ = *M3_DATA;
+ *buff++ = *M3_DATA;
#endif
}
#if defined _CF_USE_DMA && defined NDS
@@ -230,7 +230,7 @@ bool M3CF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
u8 *buff_u8 = (u8*)buffer;
int temp;
#endif
-
+
#if defined _CF_USE_DMA && defined NDS && defined ARM9
DC_FlushRange( buffer, j * BYTE_PER_READ);
#endif
@@ -241,7 +241,7 @@ bool M3CF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
{
i++;
}
-
+
// Wait until card is ready for commands
i = 0;
while ((!(M3_REG_STS & CF_STS_INSERTED)) && (i < CARD_TIMEOUT))
@@ -250,19 +250,19 @@ bool M3CF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Set number of sectors to write
- M3_REG_SEC = numSecs;
-
+ M3_REG_SEC = numSecs;
+
// Set write sector
M3_REG_LBA1 = sector & 0xFF; // 1st byte of sector number
M3_REG_LBA2 = (sector >> 8) & 0xFF; // 2nd byte of sector number
M3_REG_LBA3 = (sector >> 16) & 0xFF; // 3rd byte of sector number
M3_REG_LBA4 = ((sector >> 24) & 0x0F )| CF_CMD_LBA; // last nibble of sector number
-
+
// Set command to write
M3_REG_CMD = CF_CMD_WRITE;
-
+
while (j--)
{
// Wait until card is ready for writing
@@ -273,7 +273,7 @@ bool M3CF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Write data
#ifdef _CF_USE_DMA
#ifdef NDS
@@ -295,19 +295,19 @@ bool M3CF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
} else {
while(i--)
- *M3_DATA = *buff++;
+ *M3_DATA = *buff++;
}
#else
i=256;
while(i--)
- *M3_DATA = *buff++;
+ *M3_DATA = *buff++;
#endif
}
#if defined _CF_USE_DMA && defined NDS
// Wait for end of transfer before returning
while(DMA3_CR & DMA_BUSY);
#endif
-
+
return true;
}
@@ -317,7 +317,7 @@ M3_Unlock
Returns true if M3 was unlocked, false if failed
Added by MightyMax
-----------------------------------------------------------------*/
-bool M3_Unlock(void)
+bool M3_Unlock(void)
{
// run unlock sequence
volatile unsigned short tmp ;
diff --git a/backends/platform/ds/arm9/source/fat/io_m3cf.h b/backends/platform/ds/arm9/source/fat/io_m3cf.h
index 006c283adc..bade53f511 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3cf.h
+++ b/backends/platform/ds/arm9/source/fat/io_m3cf.h
@@ -1,5 +1,5 @@
/*
- io_m3cf.h
+ io_m3cf.h
Hardware Routines for reading a compact flash card
using the M3 CF
@@ -24,7 +24,7 @@ extern LPIO_INTERFACE M3CF_GetInterface(void) ;
#endif // define IO_M3CF_H
/*
- io_m3cf.h
+ io_m3cf.h
Hardware Routines for reading a compact flash card
using the M3 CF
diff --git a/backends/platform/ds/arm9/source/fat/io_m3sd.c b/backends/platform/ds/arm9/source/fat/io_m3sd.c
index 2bbda37a5a..914b83e06e 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3sd.c
+++ b/backends/platform/ds/arm9/source/fat/io_m3sd.c
@@ -218,7 +218,7 @@ void M3SD_writesector(u16 * p,u32 sectorn)
}
} while ((verify > 0) && (tries < 16));
-
+
free(data);
free(check);
} // */
@@ -356,7 +356,7 @@ bool M3SD_Shutdown(void)
bool M3SD_StartUp(void)
{
vu16* waitCr = (vu16*)0x4000204;
-
+
*waitCr |= 0x6000;
// *(vu16*)0x4000204=0x6000;
// Try unlocking 3 times, because occationally it fails to detect the reader.
diff --git a/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s b/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
index a6bb8dc187..ffaa971aca 100644
--- a/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
+++ b/backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
@@ -54,7 +54,7 @@ sd_write_loop2:
sd_write_busy:
bl clkin
- ldrh r0,[r1]
+ ldrh r0,[r1]
tst r0,#0x100
beq sd_write_busy
ldmfd r13!,{r0-r1}
@@ -68,10 +68,10 @@ SD_crc16:
stmfd r13!,{r4-r9}
mov r9,r2
- mov r3,#0
- mov r4,#0
- mov r5,#0
- mov r6,#0
+ mov r3,#0
+ mov r4,#0
+ mov r5,#0
+ mov r6,#0
ldr r7,=0x80808080
ldr r8,=0x1021
@@ -86,19 +86,19 @@ sd_crc16_loop:
eorne r3,r3,r8
tst r2,r7,lsr #24
eorne r3,r3,r8
-
+
mov r4,r4,lsl #1
tst r4,#0x10000
eorne r4,r4,r8
tst r2,r7,lsr #25
eorne r4,r4,r8
-
+
mov r5,r5,lsl #1
tst r5,#0x10000
eorne r5,r5,r8
tst r2,r7,lsr #26
eorne r5,r5,r8
-
+
mov r6,r6,lsl #1
tst r6,#0x10000
eorne r6,r6,r8
@@ -107,7 +107,7 @@ sd_crc16_loop:
mov r7,r7,ror #4
subs r1,r1,#4
- bne sd_crc16_loop
+ bne sd_crc16_loop
mov r2,r9
mov r8,#16
@@ -145,7 +145,7 @@ SD_data_write:
mov r2,#SDODA
sd_data_write_busy:
bl clkin
- ldrh r3,[r2]
+ ldrh r3,[r2]
tst r3,#0x100
beq sd_data_write_busy
@@ -169,7 +169,7 @@ sd_data_write_loop:
bl clkout
subs r5, r5, #2
- bne sd_data_write_loop
+ bne sd_data_write_loop
cmp r1,#0
movne r0,r1
@@ -184,10 +184,10 @@ sd_data_write_loop2:
bl clkout
subs r5, r5, #1
bne sd_data_write_loop2
-
+
sd_data_write_busy2:
bl clkin
- ldrh r3,[r2]
+ ldrh r3,[r2]
tst r3,#0x100
beq sd_data_write_busy2
diff --git a/backends/platform/ds/arm9/source/fat/io_mmcf.c b/backends/platform/ds/arm9/source/fat/io_mmcf.c
index 5ccb3122e4..3034afe311 100644
--- a/backends/platform/ds/arm9/source/fat/io_mmcf.c
+++ b/backends/platform/ds/arm9/source/fat/io_mmcf.c
@@ -74,14 +74,14 @@ static bool cf_block_ready(void)
do
{
while (!(CF_RD_STATUS & 0x40));
- } while (CF_RD_STATUS & 0x80);
+ } while (CF_RD_STATUS & 0x80);
*/
do
{
i++;
- while ( (!(CF_RD_STATUS & 0x40)) && (i < CARD_TIMEOUT) ) i++;
- } while ( (CF_RD_STATUS & 0x80) && (i < CARD_TIMEOUT) );
+ while ( (!(CF_RD_STATUS & 0x40)) && (i < CARD_TIMEOUT) ) i++;
+ } while ( (CF_RD_STATUS & 0x80) && (i < CARD_TIMEOUT) );
if (i >= CARD_TIMEOUT) {
return false;
@@ -110,7 +110,7 @@ MMCF_IsInserted
Is a compact flash card inserted?
bool return OUT: true if a CF card is inserted
-----------------------------------------------------------------*/
-bool MMCF_IsInserted (void)
+bool MMCF_IsInserted (void)
{
if ( !cf_set_features(0xAA) ) return false;
@@ -123,7 +123,7 @@ MMCF_ClearStatus
Tries to make the CF card go back to idle mode
bool return OUT: true if a CF card is idle
-----------------------------------------------------------------*/
-bool MMCF_ClearStatus (void)
+bool MMCF_ClearStatus (void)
{
return true;
}
@@ -185,7 +185,7 @@ bool MMCF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
} else {
while(i--)
- *buff++ = *MP_DATA;
+ *buff++ = *MP_DATA;
}
#else
i=256;
@@ -222,15 +222,15 @@ bool MMCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
u8 *buff_u8 = (u8*)buffer;
int temp;
#endif
-
+
#if defined _CF_USE_DMA && defined NDS && defined ARM9
DC_FlushRange( buffer, j * BYTE_PER_READ);
#endif
- if (numSecs > 1)
+ if (numSecs > 1)
{
int r = 0;
-
+
for (r = 0; r < numSecs; r++)
{
MMCF_WriteSectors(sector + r, 1, ((unsigned char *) (buffer)) + 512);
@@ -270,12 +270,12 @@ bool MMCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
} else {
while(i--)
- *MP_DATA = *buff++;
+ *MP_DATA = *buff++;
}
#else
i=256;
while(i--)
- *MP_DATA = *buff++;
+ *MP_DATA = *buff++;
#endif
}
@@ -283,7 +283,7 @@ bool MMCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
#if defined _CF_USE_DMA && defined NDS
// Wait for end of transfer before returning
while(DMA3_CR & DMA_BUSY);
-#endif
+#endif
//#define _CF_VERIFY
@@ -312,7 +312,7 @@ bool MMCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
MMCF_Shutdown
unload the GBAMP CF interface
-----------------------------------------------------------------*/
-bool MMCF_Shutdown(void)
+bool MMCF_Shutdown(void)
{
return MMCF_ClearStatus() ;
}
diff --git a/backends/platform/ds/arm9/source/fat/io_mmcf.h b/backends/platform/ds/arm9/source/fat/io_mmcf.h
index fa9e6536ee..baa43ac59f 100644
--- a/backends/platform/ds/arm9/source/fat/io_mmcf.h
+++ b/backends/platform/ds/arm9/source/fat/io_mmcf.h
@@ -1,5 +1,5 @@
/*
- io_mmcf.h
+ io_mmcf.h
Hardware Routines for reading a compact flash card
using the GBA Movie Player
diff --git a/backends/platform/ds/arm9/source/fat/io_mpcf.c b/backends/platform/ds/arm9/source/fat/io_mpcf.c
index 6b56e29291..a12b6e8e1e 100644
--- a/backends/platform/ds/arm9/source/fat/io_mpcf.c
+++ b/backends/platform/ds/arm9/source/fat/io_mpcf.c
@@ -73,7 +73,7 @@ MPCF_IsInserted
Is a compact flash card inserted?
bool return OUT: true if a CF card is inserted
-----------------------------------------------------------------*/
-bool MPCF_IsInserted (void)
+bool MPCF_IsInserted (void)
{
// Change register, then check if value did change
MP_REG_STS = CF_STS_INSERTED;
@@ -86,17 +86,17 @@ MPCF_ClearStatus
Tries to make the CF card go back to idle mode
bool return OUT: true if a CF card is idle
-----------------------------------------------------------------*/
-bool MPCF_ClearStatus (void)
+bool MPCF_ClearStatus (void)
{
int i;
-
+
// Wait until CF card is finished previous commands
i=0;
while ((MP_REG_CMD & CF_STS_BUSY) && (i < CARD_TIMEOUT))
{
i++;
}
-
+
// Wait until card is ready for commands
i = 0;
while ((!(MP_REG_STS & CF_STS_INSERTED)) && (i < CARD_TIMEOUT))
@@ -139,7 +139,7 @@ bool MPCF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
{
i++;
}
-
+
// Wait until card is ready for commands
i = 0;
while ((!(MP_REG_STS & CF_STS_INSERTED)) && (i < CARD_TIMEOUT))
@@ -148,20 +148,20 @@ bool MPCF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Set number of sectors to read
- MP_REG_SEC = numSecs;
-
+ MP_REG_SEC = numSecs;
+
// Set read sector
MP_REG_LBA1 = sector & 0xFF; // 1st byte of sector number
MP_REG_LBA2 = (sector >> 8) & 0xFF; // 2nd byte of sector number
MP_REG_LBA3 = (sector >> 16) & 0xFF; // 3rd byte of sector number
MP_REG_LBA4 = ((sector >> 24) & 0x0F )| CF_CMD_LBA; // last nibble of sector number
-
+
// Set command to read
MP_REG_CMD = CF_CMD_READ;
-
-
+
+
while (j--)
{
// Wait until card is ready for reading
@@ -172,7 +172,7 @@ bool MPCF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Read data
#ifdef _CF_USE_DMA
#ifdef NDS
@@ -194,12 +194,12 @@ bool MPCF_ReadSectors (u32 sector, u8 numSecs, void* buffer)
}
} else {
while(i--)
- *buff++ = *MP_DATA;
+ *buff++ = *MP_DATA;
}
#else
i=256;
while(i--)
- *buff++ = *MP_DATA;
+ *buff++ = *MP_DATA;
#endif
}
#if (defined _CF_USE_DMA) && (defined NDS)
@@ -229,7 +229,7 @@ bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
u8 *buff_u8 = (u8*)buffer;
int temp;
#endif
-
+
#if defined _CF_USE_DMA && defined NDS && defined ARM9
DC_FlushRange( buffer, j * BYTE_PER_READ);
#endif
@@ -240,7 +240,7 @@ bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
{
i++;
}
-
+
// Wait until card is ready for commands
i = 0;
while ((!(MP_REG_STS & CF_STS_INSERTED)) && (i < CARD_TIMEOUT))
@@ -249,19 +249,19 @@ bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Set number of sectors to write
- MP_REG_SEC = numSecs;
-
+ MP_REG_SEC = numSecs;
+
// Set write sector
MP_REG_LBA1 = sector & 0xFF; // 1st byte of sector number
MP_REG_LBA2 = (sector >> 8) & 0xFF; // 2nd byte of sector number
MP_REG_LBA3 = (sector >> 16) & 0xFF; // 3rd byte of sector number
MP_REG_LBA4 = ((sector >> 24) & 0x0F )| CF_CMD_LBA; // last nibble of sector number
-
+
// Set command to write
MP_REG_CMD = CF_CMD_WRITE;
-
+
while (j--)
{
// Wait until card is ready for writing
@@ -272,7 +272,7 @@ bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
if (i >= CARD_TIMEOUT)
return false;
-
+
// Write data
#ifdef _CF_USE_DMA
#ifdef NDS
@@ -294,19 +294,19 @@ bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
}
} else {
while(i--)
- *MP_DATA = *buff++;
+ *MP_DATA = *buff++;
}
#else
i=256;
while(i--)
- *MP_DATA = *buff++;
+ *MP_DATA = *buff++;
#endif
}
#if defined _CF_USE_DMA && defined NDS
// Wait for end of transfer before returning
while(DMA3_CR & DMA_BUSY);
#endif
-
+
return true;
}
@@ -314,7 +314,7 @@ bool MPCF_WriteSectors (u32 sector, u8 numSecs, void* buffer)
MPCF_Shutdown
unload the GBAMP CF interface
-----------------------------------------------------------------*/
-bool MPCF_Shutdown(void)
+bool MPCF_Shutdown(void)
{
return MPCF_ClearStatus() ;
}
diff --git a/backends/platform/ds/arm9/source/fat/io_mpcf.h b/backends/platform/ds/arm9/source/fat/io_mpcf.h
index 8ec8859097..58cab41b4c 100644
--- a/backends/platform/ds/arm9/source/fat/io_mpcf.h
+++ b/backends/platform/ds/arm9/source/fat/io_mpcf.h
@@ -1,5 +1,5 @@
/*
- io_mpcf.h
+ io_mpcf.h
Hardware Routines for reading a compact flash card
using the GBA Movie Player
@@ -24,7 +24,7 @@ extern LPIO_INTERFACE MPCF_GetInterface(void) ;
#endif // define IO_MPCF_H
/*
- io_mpcf.h
+ io_mpcf.h
Hardware Routines for reading a compact flash card
using the GBA Movie Player
diff --git a/backends/platform/ds/arm9/source/fat/io_njsd.c b/backends/platform/ds/arm9/source/fat/io_njsd.c
index d8a0ff69ac..fbb223d560 100644
--- a/backends/platform/ds/arm9/source/fat/io_njsd.c
+++ b/backends/platform/ds/arm9/source/fat/io_njsd.c
@@ -3,11 +3,11 @@
Hardware Routines for reading an SD card using
a NinjaDS SD adapter.
-
+
Original code supplied by NinjaMod
-
+
Copyright (c) 2006 Michael "Chishm" Chisholm
-
+
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -28,7 +28,7 @@
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
+
2006-08-05 - Chishm
* First release
*/
@@ -84,7 +84,7 @@ static u32 _NJSD_relativeCardAddress = 0;
static inline bool _NJSD_waitIRQ(void) {
/*#ifdef _NJSD_SYNC
int i = IRQ_TIMEOUT;
- while (!(REG_IF & 0x100000) && --i);
+ while (!(REG_IF & 0x100000) && --i);
REG_IF = 0x100000;
if (i <= 0) {
return false;
@@ -96,7 +96,7 @@ static inline bool _NJSD_waitIRQ(void) {
//if (!(REG_IME & 1))
//{
// irq's disabled...
- while (!(REG_IF & 0x100000) && (!(_NJSD_irqFlag)) && --i);
+ while (!(REG_IF & 0x100000) && (!(_NJSD_irqFlag)) && --i);
_NJSD_irqFlag = 0;
REG_IF = 0x100000;
if (i <= 0) {
@@ -106,7 +106,7 @@ static inline bool _NJSD_waitIRQ(void) {
}
//} else {
// irq's enabled
- // while (!(_NJSD_irqFlag) && --i);
+ // while (!(_NJSD_irqFlag) && --i);
// _NJSD_irqFlag = 0;
// REG_IF = 0x100000;
// if (i <= 0) {
@@ -118,8 +118,8 @@ static inline bool _NJSD_waitIRQ(void) {
//#endif
}
-static inline void _NJSD_writeCardCommand
- (u8 cmd0, u8 cmd1, u8 cmd2, u8 cmd3, u8 cmd4, u8 cmd5, u8 cmd6, u8 cmd7)
+static inline void _NJSD_writeCardCommand
+ (u8 cmd0, u8 cmd1, u8 cmd2, u8 cmd3, u8 cmd4, u8 cmd5, u8 cmd6, u8 cmd7)
{
CARD_COMMAND[0] = cmd0;
CARD_COMMAND[1] = cmd1;
@@ -142,7 +142,7 @@ static bool _NJSD_reset (void) {
if (i <= 0) {
return false;
}
-
+
return true;
}
@@ -179,7 +179,7 @@ static bool _NJSD_sendCMDR (int speed, u8 *rsp_buf, int type, u8 cmd, u32 param)
REG_IME = 0;
#endif
- REG_IE &= ~0x100000;
+ REG_IE &= ~0x100000;
REG_IF = 0x100000;
CARD_CR1H = CARD_CR1_ENABLE;
@@ -191,7 +191,7 @@ static bool _NJSD_sendCMDR (int speed, u8 *rsp_buf, int type, u8 cmd, u32 param)
} else {
CARD_COMMAND[0] = 0xF0 | (speed << 2) | 0 | (1 << 1);
}
-
+
CARD_COMMAND[1] = (type & 0x40) | ((( type >> 2) & 7) << 3);
CARD_COMMAND[2] = 0x40 | cmd;
CARD_COMMAND[3] = (param>>24) & 0xFF;
@@ -301,7 +301,7 @@ static bool _NJSD_writeSector (u8 *buffer, u8 *crc_buf, u32 offset) {
}
- REG_IE &= ~0x100000;
+ REG_IE &= ~0x100000;
REG_IF = 0x100000;
CARD_CR1H = CARD_CR1_ENABLE;
@@ -334,7 +334,7 @@ static bool _NJSD_writeSector (u8 *buffer, u8 *crc_buf, u32 offset) {
i++;
}
} while (CARD_CR2 & CARD_BUSY);
-
+
i = WRITE_TIMEOUT;
responseBuffer[3] = 0;
do {
@@ -352,7 +352,7 @@ static bool _NJSD_writeSector (u8 *buffer, u8 *crc_buf, u32 offset) {
#ifdef _NJSD_SYNC
REG_IME = old_REG_IME;
#endif
-
+
return true;
}
@@ -365,12 +365,12 @@ static bool _NJSD_sendCLK (int speed, int count) {
REG_IME = 0;
#endif
- REG_IE &= ~0x100000;
+ REG_IE &= ~0x100000;
REG_IF = 0x100000;
//CARD_CR1H = CARD_CR1_ENABLE; // | CARD_CR1_IRQ;
_NJSD_writeCardCommand (0xE0 | ((speed & 3) << 2), 0, (count - 1), 0, 0, 0, 0, 0);
-
+
CARD_CR2 = _NJSD_cardFlags;
i = COMMAND_TIMEOUT;
while ((CARD_CR2 & CARD_BUSY) && --i);
@@ -404,7 +404,7 @@ static bool _NJSD_sendCMDN (int speed, u8 cmd, u32 param) {
REG_IME = 0;
#endif
- REG_IE &= ~0x100000;
+ REG_IE &= ~0x100000;
REG_IF = 0x100000;
CARD_CR1H = CARD_CR1_ENABLE; // | CARD_CR1_IRQ;
@@ -438,22 +438,22 @@ static bool _NJSD_sendCMDN (int speed, u8 cmd, u32 param) {
static bool _NJSD_cardInit (void) {
u8 responseBuffer[17];
int i;
-
+
// If the commands succeed the first time, assume they'll always succeed
if (! _NJSD_sendCLK (SD_CLK_200KHz, 256) ) return false;
if (! _NJSD_sendCMDN (SD_CLK_200KHz, GO_IDLE_STATE, 0) ) return false;
_NJSD_sendCLK (SD_CLK_200KHz, 8);
-
+
_NJSD_sendCLK (SD_CLK_200KHz, 256);
- _NJSD_sendCMDN (SD_CLK_200KHz, GO_IDLE_STATE, 0);
+ _NJSD_sendCMDN (SD_CLK_200KHz, GO_IDLE_STATE, 0);
_NJSD_sendCLK (SD_CLK_200KHz, 8);
-
+
for (i = 0; i < MAX_STARTUP_TRIES ; i++) {
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, APP_CMD, 0);
- if (
+ if (
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, SD_APP_OP_COND, SD_OCR_VALUE) &&
((responseBuffer[1] & 0x80) != 0))
- {
+ {
// Card is ready to receive commands now
break;
}
@@ -461,10 +461,10 @@ static bool _NJSD_cardInit (void) {
if (i >= MAX_STARTUP_TRIES) {
return false;
}
-
+
// The card's name, as assigned by the manufacturer
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_136, ALL_SEND_CID, 0);
-
+
// Get a new address
for (i = 0; i < MAX_STARTUP_TRIES ; i++) {
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, SEND_RELATIVE_ADDR, 0);
@@ -473,23 +473,23 @@ static bool _NJSD_cardInit (void) {
break;
}
}
- if (i >= MAX_STARTUP_TRIES) {
+ if (i >= MAX_STARTUP_TRIES) {
return false;
}
// Some cards won't go to higher speeds unless they think you checked their capabilities
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_136, SEND_CSD, _NJSD_relativeCardAddress);
-
+
// Only this card should respond to all future commands
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, SELECT_CARD, _NJSD_relativeCardAddress);
-
+
// Set a 4 bit data bus
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, APP_CMD, _NJSD_relativeCardAddress);
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, SET_BUS_WIDTH, 2); // 4-bit mode.
// Use 512 byte blocks
_NJSD_sendCMDR (SD_CLK_200KHz, responseBuffer, SD_RSP_48, SET_BLOCKLEN, 512); // 512 byte blocks
-
+
return true;
}
@@ -521,17 +521,17 @@ bool _NJSD_startup(void) {
return false;
}
return true;
-}
+}
bool _NJSD_writeSectors (u32 sector, u32 numSectors, const void* buffer) {
- u8 crc[8];
+ u8 crc[8];
u32 offset = sector * BYTES_PER_READ;
u8* data = (u8*) buffer;
while (numSectors--) {
_SD_CRC16 ( data, BYTES_PER_READ, crc);
-
+
if (! _NJSD_writeSector (data, crc, offset)) {
return false;
}
@@ -549,7 +549,7 @@ bool _NJSD_readSectors (u32 sector, u32 numSectors, void* buffer) {
#ifdef _NJSD_SYNC
u32 old_REG_IME;
#endif
-
+
u8* tbuf = (u8*)buffer;
if (numSectors == 0) {
@@ -573,7 +573,7 @@ bool _NJSD_readSectors (u32 sector, u32 numSectors, void* buffer) {
if (!_NJSD_waitIRQ ()) {
#ifdef _NJSD_SYNC
REG_IME = old_REG_IME;
-#endif
+#endif
return false;
}
}
@@ -586,10 +586,10 @@ bool _NJSD_readSectors (u32 sector, u32 numSectors, void* buffer) {
if (!_NJSD_waitIRQ ()) {
#ifdef _NJSD_SYNC
REG_IME = old_REG_IME;
-#endif
+#endif
return false;
}
-
+
if (((int)buffer & 0x03) != 0){
cardPolledTransfer (0xA1406000, tmp, BYTES_PER_READ, (u8*)_NJSD_read_cmd);
memcpy (tbuf + (numSectors - 1) * BYTES_PER_READ, tmp, BYTES_PER_READ);
@@ -618,7 +618,7 @@ bool _NJSD_readSectors (u32 sector, u32 numSectors, void* buffer) {
#ifdef _NJSD_SYNC
u32 old_REG_IME;
#endif
-
+
u8* tbuf = (u8*)buffer;
if (numSectors == 0) {
@@ -637,7 +637,7 @@ bool _NJSD_readSectors (u32 sector, u32 numSectors, void* buffer) {
if (!_NJSD_waitIRQ ()) {
#ifdef _NJSD_SYNC
REG_IME = old_REG_IME;
-#endif
+#endif
return false;
}
}
@@ -645,10 +645,10 @@ bool _NJSD_readSectors (u32 sector, u32 numSectors, void* buffer) {
if (!_NJSD_waitIRQ ()) {
#ifdef _NJSD_SYNC
REG_IME = old_REG_IME;
-#endif
+#endif
return false;
}
-
+
cardPolledTransfer (0xA1406000, (u32*)(tbuf + (numSectors - 1) * BYTES_PER_READ), BYTES_PER_READ, (u8*)_NJSD_read_cmd);
} else {
_NJSD_sendCMDR (_NJSD_speed, NULL, SD_RSP_STREAM, READ_SINGLE_BLOCK, sector * BYTES_PER_READ);
@@ -678,4 +678,4 @@ LPIO_INTERFACE NJSD_GetInterface(void) {
} ;
#endif // defined NDS
-#endif
+#endif \ No newline at end of file
diff --git a/backends/platform/ds/arm9/source/fat/io_njsd.h b/backends/platform/ds/arm9/source/fat/io_njsd.h
index dce469cad6..a297cda112 100644
--- a/backends/platform/ds/arm9/source/fat/io_njsd.h
+++ b/backends/platform/ds/arm9/source/fat/io_njsd.h
@@ -1,11 +1,11 @@
/*
- io_njsd.h
+ io_njsd.h
Hardware Routines for reading an SD card using
a NinjaDS SD adapter.
Copyright (c) 2006 Michael "Chishm" Chisholm
-
+
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
diff --git a/backends/platform/ds/arm9/source/fat/io_nmmc.c b/backends/platform/ds/arm9/source/fat/io_nmmc.c
index e9331ae58e..a29c26e43a 100644
--- a/backends/platform/ds/arm9/source/fat/io_nmmc.c
+++ b/backends/platform/ds/arm9/source/fat/io_nmmc.c
@@ -13,10 +13,10 @@
project at chishm@hotmail.com
See gba_nds_fat.txt for help and license details.
-
+
2006-02-09 - www.neoflash.com:
* First stable release
-
+
2006-02-13 - Chishm
* Added ReadMK2Config function
* Added read config test to init function so no unnecessary card commands are sent
@@ -73,7 +73,7 @@ static inline void Neo_MK2GameMode() {
static inline void Neo_EnableEEPROM( bool enable ) {
Neo_OpenSPI(spi_freq);
if(enable) Neo_SPI(0x06);
- else Neo_SPI(0x0E);
+ else Neo_SPI(0x0E);
Neo_CloseSPI();
}
@@ -87,7 +87,7 @@ void Neo_WriteMK2Config(u8 config) {
Neo_EnableEEPROM(false);
}
-u8 Neo_ReadMK2Config(void)
+u8 Neo_ReadMK2Config(void)
{
u8 config;
Neo_EnableEEPROM(true);
@@ -104,7 +104,7 @@ u8 Neo_ReadMK2Config(void)
u8 selectMMC_command [8] = {0xFF, 0x00, 0x6A, 0xDF, 0x37, 0x59, 0x33, 0xA3};
-void Neo_SelectMMC (u8 dataByte)
+void Neo_SelectMMC (u8 dataByte)
{
selectMMC_command[1] = dataByte; // Set enable / disable byte
cardWriteCommand (selectMMC_command); // Send "5. Use the EEPROM CS to access the MK2 MMC/SD card"
@@ -154,12 +154,12 @@ bool Neo_CheckMMCResponse( u8 response, u8 mask ) {
bool Neo_InitMMC() {
Neo_MK2GameMode();
Neo_WriteMK2Config( MK2_CONFIG_ZIP_RAM_CLOSE | MK2_CONFIG_GAME_FLASH_CLOSE);
-
+
// Make sure the configuration was accepted
if (Neo_ReadMK2Config() != (MK2_CONFIG_ZIP_RAM_CLOSE | MK2_CONFIG_GAME_FLASH_CLOSE)) {
return false; // If not, then it wasn't initialised properly
}
-
+
return true;
}
@@ -167,7 +167,7 @@ bool Neo_InitMMC() {
bool NMMC_IsInserted(void) {
int i;
-
+
Neo_EnableMMC( true ); // Open SPI port to MMC card
Neo_SendMMCCommand(MMC_SEND_CSD, 0);
if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured
@@ -183,13 +183,13 @@ bool NMMC_IsInserted(void) {
for (i = 0; i < 28; i++) {
Neo_SPI(0xff);
}
-
+
return true;
}
bool NMMC_ClearStatus (void) {
u32 i;
-
+
Neo_EnableMMC( true ); // Open SPI port to MMC card
for (i = 0; i < 10; i++) {
Neo_SPI(0xFF); // Send 10 0xFF bytes to MMC card
@@ -224,14 +224,14 @@ bool NMMC_StartUp(void) {
return false;
}
Neo_EnableMMC( true ); // Open SPI port to MMC card
-
+
// Set block length
Neo_SendMMCCommand(MMC_SET_BLOCKLEN, BYTE_PER_READ );
if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured
Neo_EnableMMC( false );
return false;
}
-
+
// Check if we can use a higher SPI frequency
Neo_SendMMCCommand(MMC_SEND_CSD, 0);
if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured
@@ -252,77 +252,77 @@ bool NMMC_StartUp(void) {
if ((transSpeed & 0xf0) >= 0x30) {
spi_freq = 0;
}
-
+
Neo_EnableMMC( false );
return true;
-}
+}
-bool NMMC_WriteSectors (u32 sector, u8 numSecs, void* buffer)
+bool NMMC_WriteSectors (u32 sector, u8 numSecs, void* buffer)
{
u32 i;
u8 *p=buffer;
-
+
int totalSecs = (numSecs == 0) ? 256 : numSecs;
sector *= BYTE_PER_READ;
-
+
Neo_EnableMMC( true ); // Open SPI port to MMC card
Neo_SendMMCCommand( 25, sector );
if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured
Neo_EnableMMC( false );
return false;
}
-
+
while (totalSecs--) {
Neo_SPI( 0xFC ); // Send Start Block token
for( i = 0; i < BYTE_PER_READ; i++ ) // Send a block of data
Neo_SPI( *p++ );
Neo_SPI( 0xFF ); // Send fake CRC16
Neo_SPI( 0xFF ); // Send fake CRC16
-
+
if( ( Neo_SPI( 0xFF ) & 0x0F ) != 0x05 ) { // Make sure the block was accepted
Neo_EnableMMC( false );
return false;
}
while( Neo_SPI( 0xFF ) == 0x00 ); // Wait for the block to be written
}
-
+
// Stop transmission block
Neo_SPI( 0xFD ); // Send Stop Transmission Block token
for( i = 0; i < BYTE_PER_READ; i++ ) // Send a block of fake data
Neo_SPI( 0xFF );
Neo_SPI( 0xFF ); // Send fake CRC16
Neo_SPI( 0xFF ); // Send fake CRC16
-
- Neo_SPI (0xFF); // Send 8 clocks
+
+ Neo_SPI (0xFF); // Send 8 clocks
while( Neo_SPI( 0xFF ) == 0x00 ); // Wait for the busy signal to clear
-
- for ( i = 0; i < 0x10; i++) {
+
+ for ( i = 0; i < 0x10; i++) {
Neo_SPI (0xFF); // Send clocks for the MMC card to finish what it's doing
}
-
+
Neo_EnableMMC( false ); // Close SPI port to MMC card
return true;
}
-bool NMMC_ReadSectors (u32 sector, u8 numSecs, void* buffer)
+bool NMMC_ReadSectors (u32 sector, u8 numSecs, void* buffer)
{
u32 i;
u8 *p=buffer;
-
+
int totalSecs = (numSecs == 0) ? 256 : numSecs;
sector *= BYTE_PER_READ;
-
+
Neo_EnableMMC( true ); // Open SPI port to MMC card
-
+
while (totalSecs--) {
Neo_SendMMCCommand(MMC_READ_BLOCK, sector );
if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured
Neo_EnableMMC( false );
return false;
}
-
+
if( Neo_CheckMMCResponse( 0xFE, 0xFF ) == false ) { // Check for Start Block token
Neo_EnableMMC( false );
return false;
@@ -333,7 +333,7 @@ bool NMMC_ReadSectors (u32 sector, u8 numSecs, void* buffer)
Neo_SPI( 0xFF ); // Ignore CRC16
sector += BYTE_PER_READ;
}
-
+
Neo_EnableMMC( false ); // Close SPI port to MMC card
return true;
}
diff --git a/backends/platform/ds/arm9/source/fat/io_nmmc.h b/backends/platform/ds/arm9/source/fat/io_nmmc.h
index 0249e3a864..5244d21868 100644
--- a/backends/platform/ds/arm9/source/fat/io_nmmc.h
+++ b/backends/platform/ds/arm9/source/fat/io_nmmc.h
@@ -1,5 +1,5 @@
/*
- io_NMMC.h
+ io_NMMC.h
Hardware Routines for reading an SD or MMC card using
a Neoflash MK2 or MK3.
@@ -26,7 +26,7 @@ extern LPIO_INTERFACE NMMC_GetInterface(void) ;
#endif // define IO_NMMC_H
/*
- io_NMMC.h
+ io_NMMC.h
Hardware Routines for reading an SD or MMC card using
a Neoflash MK2 or MK3.
diff --git a/backends/platform/ds/arm9/source/fat/io_sccf.c b/backends/platform/ds/arm9/source/fat/io_sccf.c
index bda628fdaa..0c77f4673c 100644
--- a/backends/platform/ds/arm9/source/fat/io_sccf.c
+++ b/backends/platform/ds/arm9/source/fat/io_sccf.c
@@ -57,7 +57,7 @@ bool SCCF_Unlock(void)
temp = (~temp & 0xFF);
return (CF_REG_LBA1 == temp);
#undef CF_REG_LBA1
-}
+}
bool SCCF_Shutdown(void) {
return MPCF_ClearStatus() ;
diff --git a/backends/platform/ds/arm9/source/fat/io_sccf.h b/backends/platform/ds/arm9/source/fat/io_sccf.h
index 2270c4eab1..961909fbce 100644
--- a/backends/platform/ds/arm9/source/fat/io_sccf.h
+++ b/backends/platform/ds/arm9/source/fat/io_sccf.h
@@ -1,5 +1,5 @@
/*
- io_sccf.h
+ io_sccf.h
Hardware Routines for reading a compact flash card
using the Supercard CF
@@ -24,7 +24,7 @@ extern LPIO_INTERFACE SCCF_GetInterface(void) ;
#endif // define IO_SCCF_H
/*
- io_sccf.h
+ io_sccf.h
Hardware Routines for reading a compact flash card
using the Supercard CF
diff --git a/backends/platform/ds/arm9/source/fat/io_scsd.c b/backends/platform/ds/arm9/source/fat/io_scsd.c
index 270691436d..9359fefb6d 100644
--- a/backends/platform/ds/arm9/source/fat/io_scsd.c
+++ b/backends/platform/ds/arm9/source/fat/io_scsd.c
@@ -1,8 +1,8 @@
/*
io_scsd.c by SaTa.
based on io_sccf.c
-
-
+
+
*/
/*
@@ -43,7 +43,7 @@ extern void InitSCMode(void); // CF‚Æ“¯‚¶
extern void ReadSector(u16 *buff,u32 sector,u8 ReadNumber);
extern void WriteSector(u16 *buff,u32 sector,u8 writeNumber);
extern bool MemoryCard_IsInserted(void); // CF‚ƈႤ
-//
+//
/*-----------------------------------------------------------------
SCSD_Unlock
@@ -55,7 +55,7 @@ bool SCSD_Unlock(void)
{
InitSCMode();
return MemoryCard_IsInserted();
-}
+}
bool SCSD_Shutdown(void) {
return MPCF_ClearStatus() ;
@@ -103,4 +103,4 @@ LPIO_INTERFACE SCSD_GetInterface(void) {
return &io_scsd ;
} ;
-#endif
+#endif \ No newline at end of file
diff --git a/backends/platform/ds/arm9/source/fat/io_scsd.h b/backends/platform/ds/arm9/source/fat/io_scsd.h
index 492492f619..75115b8d62 100644
--- a/backends/platform/ds/arm9/source/fat/io_scsd.h
+++ b/backends/platform/ds/arm9/source/fat/io_scsd.h
@@ -1,12 +1,12 @@
/*
io_scsd.h by SaTa.
based on io_sccf.h
-
-
+
+
*/
/*
- io_sccf.h
+ io_sccf.h
Hardware Routines for reading a compact flash card
using the GBA Movie Player
@@ -26,4 +26,4 @@
// export interface
extern LPIO_INTERFACE SCSD_GetInterface(void) ;
-#endif // define IO_SCSD_H
+#endif // define IO_SCSD_H \ No newline at end of file
diff --git a/backends/platform/ds/arm9/source/fat/io_scsd_asm.s b/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
index 390d36afeb..498cbb96c2 100644
--- a/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
+++ b/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
@@ -1,22 +1,22 @@
.TEXT
@--------------------------------sd data--------------------------------
.equ sd_comadd,0x9800000
-.equ sd_dataadd,0x9000000
+.equ sd_dataadd,0x9000000
.equ sd_dataradd,0x9100000
@-----------------viod sd_data_write_s(u16 *buff,u16* crc16buff)-------------------
.ALIGN
- .GLOBAL sd_data_write_s
+ .GLOBAL sd_data_write_s
.CODE 32
sd_data_write_s:
stmfd r13!,{r4-r5}
mov r5,#512
mov r2,#sd_dataadd
sd_data_write_busy:
- ldrh r3,[r2]
+ ldrh r3,[r2]
tst r3,#0x100
beq sd_data_write_busy
- ldrh r3,[r2]
+ ldrh r3,[r2]
mov r3,#0 @star bit
strh r3,[r2]
@@ -24,10 +24,10 @@ sd_data_write_loop:
ldrh r3,[r0],#2
add r3,r3,r3,lsl #20
mov r4,r3,lsl #8
- stmia r2,{r3-r4}
-
- subs r5, r5, #2
- bne sd_data_write_loop
+ stmia r2,{r3-r4}
+
+ subs r5, r5, #2
+ bne sd_data_write_loop
cmp r1,#0
movne r0,r1
@@ -38,11 +38,11 @@ sd_data_write_loop:
mov r3,#0xff @end bit
strh r3,[r2]
sd_data_write_loop2:
- ldrh r3,[r2]
+ ldrh r3,[r2]
tst r3,#0x100
bne sd_data_write_loop2
- ldmia r2,{r3-r4}
+ ldmia r2,{r3-r4}
ldmfd r13!,{r4-r5}
bx r14
@@ -50,7 +50,7 @@ sd_data_write_loop2:
@----------void sd_data_read_s(u16 *buff)-------------
.ALIGN
- .GLOBAL sd_data_read_s
+ .GLOBAL sd_data_read_s
.CODE 32
sd_data_read_s:
stmfd r13!,{r4}
@@ -61,62 +61,62 @@ sd_data_read_loop1:
bne sd_data_read_loop1
mov r2,#512
sd_data_read_loop:
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
mov r3,r4,lsr #16
strh r3 ,[r0],#2
- subs r2, r2, #16
- bne sd_data_read_loop
+ subs r2, r2, #16
+ bne sd_data_read_loop
ldmia r1,{r3-r4} @crc 16
- ldmia r1,{r3-r4}
- ldmia r1,{r3-r4}
- ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
ldrh r3,[r1] @end bit
- ldmfd r13!,{r4}
+ ldmfd r13!,{r4}
bx r14
@----------end sd_data_read_s-------------
@------void sd_com_crc16_s(u16* buff,u16 num,u16* crc16buff)
.ALIGN
- .GLOBAL sd_crc16_s
+ .GLOBAL sd_crc16_s
.CODE 32
sd_crc16_s:
stmfd r13!,{r4-r9}
mov r9,r2
- mov r3,#0
- mov r4,#0
- mov r5,#0
- mov r6,#0
+ mov r3,#0
+ mov r4,#0
+ mov r5,#0
+ mov r6,#0
ldr r7,=0x80808080
ldr r8,=0x1021
@@ -131,19 +131,19 @@ sd_crc16_loop:
eorne r3,r3,r8
tst r2,r7,lsr #24
eorne r3,r3,r8
-
+
mov r4,r4,lsl #1
tst r4,#0x10000
eorne r4,r4,r8
tst r2,r7,lsr #25
eorne r4,r4,r8
-
+
mov r5,r5,lsl #1
tst r5,#0x10000
eorne r5,r5,r8
tst r2,r7,lsr #26
eorne r5,r5,r8
-
+
mov r6,r6,lsl #1
tst r6,#0x10000
eorne r6,r6,r8
@@ -152,7 +152,7 @@ sd_crc16_loop:
mov r7,r7,ror #4
subs r1,r1,#4
- bne sd_crc16_loop
+ bne sd_crc16_loop
mov r2,r9
mov r8,#16
@@ -184,7 +184,7 @@ sd_crc16_write_data:
@--------------u8 sd_crc7_s(u16* buff,u16 num)----------------------------
.ALIGN
- .GLOBAL sd_crc7_s
+ .GLOBAL sd_crc7_s
.CODE 32
sd_crc7_s:
stmfd r13!,{r4}
@@ -206,7 +206,7 @@ sd_crc7_loop:
mov r4,r4,ror #1
subs r1,r1,#1
- bne sd_crc7_loop
+ bne sd_crc7_loop
mov r3,r3,lsl #1
add r0,r3,#1
@@ -216,7 +216,7 @@ sd_crc7_loop:
@--------------sd_com_read_s(u16* buff,u32 num)------------------
.ALIGN
- .GLOBAL sd_com_read_s
+ .GLOBAL sd_com_read_s
.CODE 32
sd_com_read_s:
@@ -229,8 +229,8 @@ sd_com_read_loop1:
sd_com_read_loop:
ldmia r2,{r3-r6}
- subs r1, r1, #1
- bne sd_com_read_loop
+ subs r1, r1, #1
+ bne sd_com_read_loop
ldmfd r13!,{r4-r6}
bx r14
@--------------end sd_com_read_s------------------
@@ -242,14 +242,14 @@ sd_com_read_loop:
.CODE 32
sd_com_write_s:
stmfd r13!,{r4-r6}
-
+
mov r2,#sd_comadd
sd_com_write_busy:
- ldrh r3,[r2]
+ ldrh r3,[r2]
tst r3,#0x1
beq sd_com_write_busy
- ldrh r3,[r2]
+ ldrh r3,[r2]
sd_com_write_loop:
ldrb r3,[r0],#1
@@ -257,9 +257,9 @@ sd_com_write_loop:
mov r4,r3,lsl #2
mov r5,r4,lsl #2
mov r6,r5,lsl #2
- stmia r2,{r3-r6}
- subs r1, r1, #1
- bne sd_com_write_loop
+ stmia r2,{r3-r6}
+ subs r1, r1, #1
+ bne sd_com_write_loop
ldmfd r13!,{r4-r6}
bx r14
@@ -267,7 +267,7 @@ sd_com_write_loop:
@-----------------void send_clk(u32 num)---------
.ALIGN
- .GLOBAL send_clk
+ .GLOBAL send_clk
.CODE 32
send_clk:
@@ -281,7 +281,7 @@ send_clk_loop1:
@---------------------------void SDCommand(u8 command,u8 num,u32 sector)--------------------
.ALIGN
- .GLOBAL SDCommand
+ .GLOBAL SDCommand
.CODE 32
@void SDCommand(u8 command,u8 num,u32 sector )
@{
@@ -338,12 +338,12 @@ SDCommand:
@ register u16 i,j;
@ i=readnum;
@ sectno<<=9;
-@ SDCommand(18,0,sector);
+@ SDCommand(18,0,sector);
@ for (j=0;j<i ; j++)
@ {
@ sd_data_read_s((u32)buff+j*512);
@ }
-@ SDCommand(12,0,0);
+@ SDCommand(12,0,0);
@ get_resp();
@ send_clk(0x10);
@
@@ -363,7 +363,7 @@ beginforj_ReadSector:
cmp r6,r5
bge endforj_ReadSector
mov r0,r4
- add r0,r0,r6,lsl #9
+ add r0,r0,r6,lsl #9
bl sd_data_read_s
add r6,r6,#1
b beginforj_ReadSector
@@ -408,17 +408,17 @@ get_resp:
@
@ sectno<<=9;
@
-@ SDCommand(25,0,sector);
+@ SDCommand(25,0,sector);
@ get_resp();
-@ send_clk(0x10);
+@ send_clk(0x10);
@
@ for (j=0;j<i ; j++)
@ {
@ sd_crc16_s((u32)(u32)buff+j*512,512,(u32)crc16);
@ sd_data_write_s((u32)buff+j*512,(u32)crc16);
-@ send_clk(0x10);
+@ send_clk(0x10);
@ }
-@ SDCommand(12,0,0);
+@ SDCommand(12,0,0);
@ get_resp();
@ send_clk(0x10);
@ while((*(u16*)sd_dataadd &0x0100)==0);
@@ -451,7 +451,7 @@ beginforj_WriteSector:
add r2,r13,#4
bl sd_crc16_s
mov r0,r4
- add r0,r0,r6,lsl #9
+ add r0,r0,r6,lsl #9
add r1,r13,#4
bl sd_data_write_s
mov r0,#0x10
@@ -481,7 +481,7 @@ beginwhile_WriteSector:
.GLOBAL InitSCMode
.CODE 32
InitSCMode:
- mvn r0,#0x0F6000000
+ mvn r0,#0x0F6000000
sub r0,r0,#0x01
mov r1,#0x0A500
add r1,r1,#0x5A
diff --git a/backends/platform/ds/arm9/source/fat/io_sd_common.c b/backends/platform/ds/arm9/source/fat/io_sd_common.c
index 36d4a3bfc8..0a38e6277c 100644
--- a/backends/platform/ds/arm9/source/fat/io_sd_common.c
+++ b/backends/platform/ds/arm9/source/fat/io_sd_common.c
@@ -5,10 +5,10 @@
Common SD card routines
- SD routines partially based on sd.s by Romman
+ SD routines partially based on sd.s by Romman
Copyright (c) 2006 Michael "Chishm" Chisholm
-
+
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -29,7 +29,7 @@
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
+
2006-08-07 - Chishm
* Moved the SD initialization to a common function
* Increased timeouts for slower cards
@@ -61,10 +61,10 @@ u8 _SD_CRC7(u8* data, int cnt) {
}
crc = (crc << 1) | 1;
return(crc);
-}
+}
/*
-Calculates the CRC16 for a sector of data. Calculates it
+Calculates the CRC16 for a sector of data. Calculates it
as 4 separate lots, merged into one buffer. This is used
for 4 SD data lines, not for 1 data line alone.
*/
@@ -79,53 +79,53 @@ void _SD_CRC16 (u8* buff, int buffLength, u8* crc16buff) {
b = 0; // r4
c = 0; // r5
d = 0; // r6
-
+
buffLength = buffLength * 8;
-
-
+
+
do {
if (bitPattern & 0x80) dataByte = *buff++;
-
+
a = a << 1;
if ( a & 0x10000) a ^= crcConst;
if (dataByte & (bitPattern >> 24)) a ^= crcConst;
-
+
b = b << 1;
if (b & 0x10000) b ^= crcConst;
if (dataByte & (bitPattern >> 25)) b ^= crcConst;
-
+
c = c << 1;
if (c & 0x10000) c ^= crcConst;
if (dataByte & (bitPattern >> 26)) c ^= crcConst;
-
+
d = d << 1;
if (d & 0x10000) d ^= crcConst;
if (dataByte & (bitPattern >> 27)) d ^= crcConst;
-
+
bitPattern = (bitPattern >> 4) | (bitPattern << 28);
} while (buffLength-=4);
-
+
count = 16; // r8
-
+
do {
bitPattern = bitPattern << 4;
if (a & 0x8000) bitPattern |= 8;
if (b & 0x8000) bitPattern |= 4;
if (c & 0x8000) bitPattern |= 2;
if (d & 0x8000) bitPattern |= 1;
-
+
a = a << 1;
b = b << 1;
c = c << 1;
d = d << 1;
-
+
count--;
-
+
if (!(count & 0x01)) {
*crc16buff++ = (u8)(bitPattern & 0xff);
}
} while (count != 0);
-
+
return;
}
@@ -136,20 +136,20 @@ cmd_17byte_response: a pointer to a function that sends the SD card a command an
use4bitBus: initialise card to use a 4 bit data bus when communicating with the card
RCA: a pointer to the location to store the card's Relative Card Address, preshifted up by 16 bits.
*/
-bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
+bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
_SD_FN_CMD_17BYTE_RESPONSE cmd_17byte_response,
bool use4bitBus,
u32 *RCA)
{
u8 responseBuffer[17] = {0};
int i;
-
+
for (i = 0; i < MAX_STARTUP_TRIES ; i++) {
cmd_6byte_response (responseBuffer, APP_CMD, 0);
- if (
+ if (
cmd_6byte_response (responseBuffer, SD_APP_OP_COND, SD_OCR_VALUE) &&
((responseBuffer[1] & 0x80) != 0))
- {
+ {
// Card is ready to receive commands now
break;
}
@@ -157,10 +157,10 @@ bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
if (i >= MAX_STARTUP_TRIES) {
return false;
}
-
+
// The card's name, as assigned by the manufacturer
cmd_17byte_response (responseBuffer, ALL_SEND_CID, 0);
-
+
// Get a new address
for (i = 0; i < MAX_STARTUP_TRIES ; i++) {
cmd_6byte_response (responseBuffer, SEND_RELATIVE_ADDR, 0);
@@ -169,16 +169,16 @@ bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
break;
}
}
- if (i >= MAX_STARTUP_TRIES) {
+ if (i >= MAX_STARTUP_TRIES) {
return false;
}
// Some cards won't go to higher speeds unless they think you checked their capabilities
cmd_17byte_response (responseBuffer, SEND_CSD, *RCA);
-
+
// Only this card should respond to all future commands
cmd_6byte_response (responseBuffer, SELECT_CARD, *RCA);
-
+
if (use4bitBus) {
// Set a 4 bit data bus
cmd_6byte_response (responseBuffer, APP_CMD, *RCA);
@@ -187,7 +187,7 @@ bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
// Use 512 byte blocks
cmd_6byte_response (responseBuffer, SET_BLOCKLEN, 512); // 512 byte blocks
-
+
// Wait until card is ready for data
i = 0;
do {
@@ -196,7 +196,7 @@ bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
}
i++;
} while (!cmd_6byte_response (responseBuffer, SEND_STATUS, *RCA) && ((responseBuffer[3] & 0x1f) != ((SD_STATE_TRAN << 1) | READY_FOR_DATA)));
-
+
return true;
}
diff --git a/backends/platform/ds/arm9/source/fat/io_sd_common.h b/backends/platform/ds/arm9/source/fat/io_sd_common.h
index 8962d88890..09abffab39 100644
--- a/backends/platform/ds/arm9/source/fat/io_sd_common.h
+++ b/backends/platform/ds/arm9/source/fat/io_sd_common.h
@@ -8,7 +8,7 @@
SD routines partially based on sd.s by Romman
Copyright (c) 2006 Michael "Chishm" Chisholm
-
+
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -32,7 +32,7 @@
2006-07-11 - Chishm
* Original release
-
+
2006-07-28 - Chishm
* Changed voltage range that the SD card can use
*/
@@ -76,7 +76,7 @@
#define SD_STATE_IDENT 2 // Identification state, after ALL_SEND_CID
#define SD_STATE_STBY 3 // Standby state, when card is deselected
#define SD_STATE_TRAN 4 // Transfer state, after card is selected and ready for data transfer
-#define SD_STATE_DATA 5 //
+#define SD_STATE_DATA 5 //
#define SD_STATE_RCV 6 // Receive data state
#define SD_STATE_PRG 7 // Programming state
#define SD_STATE_DIS 8 // Disconnect state
@@ -85,7 +85,7 @@
#define READY_FOR_DATA 1 // bit 8 in card status
/*
-Calculate the CRC7 of a command and return it preshifted with
+Calculate the CRC7 of a command and return it preshifted with
an end bit added
*/
extern u8 _SD_CRC7(u8* data, int size);
@@ -106,7 +106,7 @@ cmd_17byte_response: a pointer to a function that sends the SD card a command an
use4bitBus: initialise card to use a 4 bit data bus when communicating with the card
RCA: a pointer to the location to store the card's Relative Card Address, preshifted up by 16 bits.
*/
-extern bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
+extern bool _SD_InitCard (_SD_FN_CMD_6BYTE_RESPONSE cmd_6byte_response,
_SD_FN_CMD_17BYTE_RESPONSE cmd_17byte_response,
bool use4bitBus,
u32 *RCA);
diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp
index 3ee572f0f7..ca4e617e29 100644
--- a/backends/platform/ds/arm9/source/gbampsave.cpp
+++ b/backends/platform/ds/arm9/source/gbampsave.cpp
@@ -23,6 +23,7 @@
#include "gbampsave.h"
#include "gba_nds_fat.h"
#include "ds-fs.h"
+#include "config-manager.h"
/////////////////////////
// GBAMP Save File
@@ -30,7 +31,7 @@
GBAMPSaveFile::GBAMPSaveFile(char* name, bool saveOrLoad) {
handle = DS::std_fopen(name, saveOrLoad? "w": "r");
- consolePrintf("%s handle is %d\n", name, handle);
+// consolePrintf("%s handle is %d\n", name, handle);
// consolePrintf("Created %s\n", name);
bufferPos = 0;
saveSize = 0;
@@ -92,40 +93,40 @@ uint32 GBAMPSaveFile::write(const void *buf, uint32 size) {
memcpy(buffer + bufferPos, buf, size);
bufferPos += size;
-
+
saveSize += size;
/* int pos = 0;
-
+
int rest = SAVE_BUFFER_SIZE - bufferPos;
memcpy(buffer + bufferPos, buf, rest);
bufferPos = 512;
pos += rest;
- flushSaveBuffer();
+ flushSaveBuffer();
size -= rest;
// consolePrintf("First section: %d\n", rest);
-
+
while (size >= 512) {
DS::std_fwrite(((char *) (buf)) + pos, 1, 512, handle);
size -= 512;
pos += 512;
// consolePrintf("Full chunk, %d left ", size);
}
-
+
bufferPos = 0;
memcpy(buffer + bufferPos, ((char *) (buf)) + pos, size);
bufferPos += size;
// consolePrintf("%d left in buffer ", bufferPos);*/
-
+
} else {
-
+
memcpy(buffer + bufferPos, buf, size);
bufferPos += size;
-
+
saveSize += size;
}
-
+
// if ((size > 100) || (size <= 0)) consolePrintf("Write %d bytes\n", size);
return size;
}
@@ -145,40 +146,62 @@ GBAMPSaveFileManager::~GBAMPSaveFileManager() {
GBAMPSaveFile* GBAMPSaveFileManager::openSavefile(char const* name, bool saveOrLoad) {
char fileSpec[128];
-
- strcpy(fileSpec, getSavePath().c_str());
-
+
+ strcpy(fileSpec, getSavePath());
+
if (fileSpec[strlen(fileSpec) - 1] == '/') {
sprintf(fileSpec, "%s%s", getSavePath(), name);
} else {
sprintf(fileSpec, "%s/%s", getSavePath(), name);
}
-
+
// consolePrintf(fileSpec);
GBAMPSaveFile* sf = new GBAMPSaveFile(fileSpec, saveOrLoad);
if (sf->isOpen()) {
- return sf;
+ return sf;
} else {
delete sf;
- return NULL;
+ return NULL;
}
}
-Common::StringList GBAMPSaveFileManager::listSavefiles(const char *pattern) {
+// This method copied from an old version of the savefile.cpp, since it's been removed from there and
+// placed in default-saves.cpp, where I cannot call it.
+const char *GBAMPSaveFileManager::getSavePath() const {
+ const char *dir = NULL;
+
+ // Try to use game specific savepath from config
+ dir = ConfMan.get("savepath").c_str();
+
+ // Work around a bug (#999122) in the original 0.6.1 release of
+ // ScummVM, which would insert a bad savepath value into config files.
+ if (0 == strcmp(dir, "None")) {
+ ConfMan.removeKey("savepath", ConfMan.getActiveDomainName());
+ ConfMan.flushToDisk();
+ dir = ConfMan.get("savepath").c_str();
+ }
+
+
+ assert(dir);
+
+ return dir;
+}
+
+Common::StringList GBAMPSaveFileManager::listSavefiles(const char *pattern) {
enum { TYPE_NO_MORE = 0, TYPE_FILE = 1, TYPE_DIR = 2 };
char name[256];
-
- DS::std_cwd((char*)getSavePath().c_str()); //TODO : Check this suspicious const-cast
+
+ DS::std_cwd((char*)getSavePath()); //TODO : Check this suspicious const-cast
// consolePrintf("Save path: '%s', pattern: '%s'\n", getSavePath(),pattern);
-
+
int fileType = FAT_FindFirstFileLFN(name);
Common::StringList list;
do {
-
+
if (fileType == TYPE_FILE) {
FAT_GetLongFilename(name);
@@ -186,18 +209,18 @@ Common::StringList GBAMPSaveFileManager::listSavefiles(const char *pattern) {
for (int r = 0; r < strlen(name); r++) {
name[r] = tolower(name[r]);
}
-
-
+
+
if (Common::matchString(name, pattern)) {
list.push_back(name);
}
}
} while ((fileType = FAT_FindNextFileLFN(name)));
-
+
FAT_chdir("/");
return list;
-}
+}
diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h
index 40dcde0b26..e9188b5312 100644
--- a/backends/platform/ds/arm9/source/gbampsave.h
+++ b/backends/platform/ds/arm9/source/gbampsave.h
@@ -19,12 +19,11 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _GBAMPSAVE_H_
#define _GBAMPSAVE_H_
#include "system.h"
-#include "saves/default/default-saves.h"
#include "ds-fs.h"
#define SAVE_BUFFER_SIZE 100000
@@ -39,42 +38,44 @@ class GBAMPSaveFile : public Common::InSaveFile, public Common::OutSaveFile {
public:
GBAMPSaveFile(char* name, bool saveOrLoad);
virtual ~GBAMPSaveFile();
-
+
virtual uint32 read(void *buf, uint32 size);
virtual uint32 write(const void *buf, uint32 size);
-
+
virtual bool eos() const;
virtual void skip(uint32 bytes);
virtual uint32 pos() const;
virtual uint32 size() const;
virtual void seek(int32 pos, int whence);
-
+
void flushSaveBuffer();
-
+
virtual bool isOpen() const {
return handle != 0;
}
};
-class GBAMPSaveFileManager : public DefaultSaveFileManager {
+class GBAMPSaveFileManager : public Common::SaveFileManager {
public:
GBAMPSaveFileManager();
~GBAMPSaveFileManager();
-
+
// static GBAMPSaveFileManager* instance() { return instancePtr; }
GBAMPSaveFile *openSavefile(const char *filename, bool saveOrLoad);
-
+
virtual Common::OutSaveFile* openForSaving(const char* filename) { return openSavefile(filename, true); }
virtual Common::InSaveFile* openForLoading(const char* filename) { return openSavefile(filename, false); }
-
+
virtual bool removeSavefile(const char *filename) { return false; } // TODO: Implement this
virtual Common::StringList listSavefiles(const char *pattern);
-
+
void deleteFile(char* name);
void listFiles();
+
+ const char *getSavePath() const;
};
#endif
diff --git a/backends/platform/ds/arm9/source/keys.cpp b/backends/platform/ds/arm9/source/keys.cpp
index 8bfc983565..dcec2287b9 100644
--- a/backends/platform/ds/arm9/source/keys.cpp
+++ b/backends/platform/ds/arm9/source/keys.cpp
@@ -27,26 +27,26 @@
$Log: keys.c,v $
Revision 1.13 2006/01/12 09:10:47 wntrmute
Added key repeat as suggested by pepsiman
-
+
Revision 1.12 2005/11/27 12:30:25 wntrmute
reverted to correct hardware REGisters
-
+
Revision 1.11 2005/11/27 07:48:45 joatski
Renamed REG_KEYINPUT and REG_KEYCNT back to KEYS and KEYS_CR, as the alternatives are defined in registers_alt.h.
Changed function returns to uint32
-
+
Revision 1.10 2005/11/03 23:38:49 wntrmute
don't use enum for key function returns
-
+
Revision 1.9 2005/10/13 16:30:11 dovoto
Changed KEYPAD_BITS to a typedef enum, this resolved some issues with multiple redefinition of KEYPAD_BITS (although this error did not allways occur).
-
+
Revision 1.8 2005/10/03 21:21:59 wntrmute
use enum types
-
+
Revision 1.7 2005/09/07 18:06:27 wntrmute
use new register names
-
+
Revision 1.6 2005/08/23 17:06:10 wntrmute
converted all endings to unix
@@ -148,4 +148,4 @@ uint32 keysUp(void) {
}
-} // namespace ds
+} // namespace ds \ No newline at end of file
diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp
index f9b0b768c0..1d8d39dcab 100644
--- a/backends/platform/ds/arm9/source/osystem_ds.cpp
+++ b/backends/platform/ds/arm9/source/osystem_ds.cpp
@@ -37,6 +37,7 @@
#include "cdaudio.h"
#include "graphics/surface.h"
#include "touchkeyboard.h"
+#include "ds-fs-factory.h"
OSystem_DS* OSystem_DS::_instance = NULL;
@@ -62,7 +63,7 @@ int OSystem_DS::timerHandler(int t) {
tm->handler();
return t;
}
-
+
void OSystem_DS::initBackend() {
ConfMan.setInt("autosave_period", 0);
ConfMan.setBool("FM_medium_quality", true);
@@ -71,7 +72,7 @@ void OSystem_DS::initBackend() {
_timer = new DSTimerManager;
DS::setSoundProc(Audio::Mixer::mixCallback, _mixer);
DS::setTimerCallback(&OSystem_DS::timerHandler, 10);
-
+
OSystem::initBackend();
}
@@ -134,20 +135,20 @@ void OSystem_DS::setPalette(const byte *colors, uint start, uint num) {
int red = *colors;
int green = *(colors + 1);
int blue = *(colors + 2);
-
+
red >>= 3;
green >>= 3;
blue >>= 3;
-
+
// if (r != 255)
- {
+ {
BG_PALETTE[r] = red | (green << 5) | (blue << 10);
if (!DS::getKeyboardEnable()) {
BG_PALETTE_SUB[r] = red | (green << 5) | (blue << 10);
}
}
// if (num == 16) consolePrintf("pal:%d r:%d g:%d b:%d\n", r, red, green, blue);
-
+
colors += 4;
}
}
@@ -156,7 +157,7 @@ bool OSystem_DS::grabRawScreen(Graphics::Surface* surf) {
surf->create(DS::getGameWidth(), DS::getGameHeight(), 1);
// Ensure we copy using 16 bit quantities due to limitation of VRAM addressing
-
+
u16* image = (u16 *) DS::get8BitBackBuffer();
for (int y = 0; y < DS::getGameHeight(); y++)
@@ -173,7 +174,7 @@ bool OSystem_DS::grabRawScreen(Graphics::Surface* surf) {
void OSystem_DS::grabPalette(unsigned char *colors, uint start, uint num) {
// consolePrintf("Grabpalette");
-
+
for (unsigned int r = start; r < start + num; r++) {
*colors++ = (BG_PALETTE[r] & 0x001F) << 3;
*colors++ = (BG_PALETTE[r] & 0x03E0) >> 5 << 3;
@@ -184,60 +185,67 @@ void OSystem_DS::grabPalette(unsigned char *colors, uint start, uint num) {
void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) {
// consolePrintf("Copy rect %d, %d %d, %d ", x, y, w, h);
-
+
if (w <= 1) return;
if (h < 0) return;
if (!DS::getIsDisplayMode8Bit()) return;
-
+
+ u16* bg;
+ s32 stride;
u16* bgSub = (u16 *) BG_GFX_SUB;
- u16* bg = (u16 *) DS::get8BitBackBuffer();
- u16* src = (u16 *) buf;
- if (DS::getKeyboardEnable()) {
+ if (_frameBufferExists) {
+ bg = (u16 *) _framebuffer.pixels;
+ stride = _framebuffer.pitch;
+ } else {
+ bg = (u16 *) DS::get8BitBackBuffer();
+ stride = DS::get8BitBackBufferStride();
+ }
+ u16* src = (u16 *) buf;
+
+ if (DS::getKeyboardEnable()) {
+
for (int dy = y; dy < y + h; dy++) {
- u16* dest = bg + (dy << 8) + (x >> 1);
-
+ u16* dest = bg + (dy * (stride >> 1)) + (x >> 1);
+
DC_FlushRange(src, w << 1);
DC_FlushRange(dest, w << 1);
dmaCopyHalfWords(3, src, dest, w);
-
+
src += pitch >> 1;
}
-
+
} else {
for (int dy = y; dy < y + h; dy++) {
- u16* dest1 = bg + (dy << 8) + (x >> 1);
+ u16* dest1 = bg + (dy * (stride >> 1)) + (x >> 1);
u16* dest2 = bgSub + (dy << 8) + (x >> 1);
-
+
DC_FlushRange(src, w << 1);
DC_FlushRange(dest1, w << 1);
DC_FlushRange(dest2, w << 1);
-
+
dmaCopyHalfWords(3, src, dest1, w);
dmaCopyHalfWords(3, src, dest2, w);
-
+
src += pitch >> 1;
}
}
-
+
// consolePrintf("Done\n");
-
-
-
+
+
+
}
void OSystem_DS::updateScreen() {
- if (_frameBufferExists)
+ if ((_frameBufferExists) && (DS::getIsDisplayMode8Bit()))
{
+ _frameBufferExists = false;
+
// Copy temp framebuffer back to screen
copyRectToScreen((byte *)_framebuffer.pixels, _framebuffer.pitch, 0, 0, _framebuffer.w, _framebuffer.h);
-
- // Free memory
- _framebuffer.free();
-
- _frameBufferExists = false;
}
DS::displayMode16BitFlipBuffer();
@@ -271,36 +279,36 @@ void OSystem_DS::grabOverlay (OverlayColor *buf, int pitch) {
void OSystem_DS::copyRectToOverlay (const OverlayColor *buf, int pitch, int x, int y, int w, int h) {
u16* bg = (u16 *) DS::get16BitBackBuffer();
u16* src = (u16 *) buf;
-
+
// if (x + w > 256) w = 256 - x;
//if (x + h > 256) h = 256 - y;
// consolePrintf("Copy rect ovl %d, %d %d, %d %d\n", x, y, w, h, pitch);
-
-
+
+
for (int dy = y; dy < y + h; dy++) {
-
-
+
+
// Slow but save copy:
for (int dx = x; dx < x + w; dx++) {
-
+
*(bg + (dy * 512) + dx) = *src;
//if ((*src) != 0) consolePrintf("%d,%d: %d ", dx, dy, *src);
//consolePrintf("%d,", *src);
src++;
}
src += (pitch - w);
-
+
// Fast but broken copy: (why?)
/*
REG_IME = 0;
dmaCopy(src, bg + (dy << 9) + x, w * 2);
REG_IME = 1;
-
+
src += pitch;*/
}
-
+
// consolePrintf("Copy rect ovl done");
}
@@ -315,7 +323,7 @@ int16 OSystem_DS::getOverlayWidth() {
return getWidth();
}
-
+
bool OSystem_DS::showMouse(bool visible) {
DS::setShowCursor(visible);
return true;
@@ -353,7 +361,7 @@ bool OSystem_DS::pollEvent(Common::Event &event) {
return true;
}
}
-
+
return false;
/* if (lastPenFrame != DS::getMillis()) {
@@ -366,7 +374,7 @@ bool OSystem_DS::pollEvent(Common::Event &event) {
if (eventNum == 1) {
eventNum = 0;
lastPenFrame = DS::getMillis();
- if (DS::getPenDown()) {
+ if (DS::getPenDown()) {
event.type = Common::EVENT_LBUTTONDOWN;
event.mouse = Common::Point(DS::getPenX(), DS::getPenY());
consolePrintf("Down %d, %d ", event.mouse.x, event.mouse.y);
@@ -393,12 +401,12 @@ void OSystem_DS::delayMillis(uint msecs) {
int st = getMillis();
DS::addEventsToQueue();
DS::CD::update();
-
+
DS::doSoundCallback();
while (st + msecs >= getMillis()) {
DS::doSoundCallback();
}
-
+
DS::doTimerCallback();
DS::checkSleepMode();
DS::addEventsToQueue();
@@ -409,6 +417,10 @@ void OSystem_DS::getTimeAndDate(struct tm &t) const {
t = *localtime(&curTime);
}
+FilesystemFactory *OSystem_DS::getFilesystemFactory() {
+ return &DSFilesystemFactory::instance();
+}
+
OSystem::MutexRef OSystem_DS::createMutex(void) {
return NULL;
}
@@ -423,7 +435,7 @@ void OSystem_DS::deleteMutex(MutexRef mutex) {
}
void OSystem_DS::clearSoundCallback() {
- consolePrintf("Clearing sound callback");
+// consolePrintf("Clearing sound callback");
// DS::setSoundProc(NULL, NULL);
}
@@ -456,7 +468,7 @@ void OSystem_DS::quit() {
/* consolePrintf("Soft resetting...");
IPC->reset = 1;
REG_IE = 0;
-
+
asm("swi 0x26\n");
swiSoftReset();*/
}
@@ -475,10 +487,10 @@ Common::SaveFileManager* OSystem_DS::getSavefileManager() {
} else {
forceSram = false;
}
- if (forceSram) {
+ if (forceSram) {
consolePrintf("Using SRAM save method!\n");
}
-
+
if (DS::isGBAMPAvailable() && (!forceSram)) {
return &mpSaveManager;
} else {
@@ -488,28 +500,64 @@ Common::SaveFileManager* OSystem_DS::getSavefileManager() {
Graphics::Surface* OSystem_DS::createTempFrameBuffer() {
- // For now, we create a full temporary screen surface, to which we copy the
- // the screen content. Later unlockScreen will copy everything back.
- // Not very nice nor efficient, but at least works, and is not worse
- // than in the bad old times where we used grabRawScreen + copyRectToScreen.
-// consolePrintf("lockScreen()\n");
- _framebuffer.create(DS::getGameWidth(), DS::getGameHeight(), 1);
// Ensure we copy using 16 bit quantities due to limitation of VRAM addressing
- size_t imageStrideInBytes = DS::isCpuScalerEnabled()? DS::getGameWidth() : 512;
+ // If the scaler is enabled, we can just return the 8 bit back buffer, since it's in system memory
+ // memory anyway. Otherwise, we need to copy the back buffer into the memory normally used by the scaler buffer and
+ // then return it.
+ // We must make sure that once the frame buffer is created, future calls to copyRectToScreen() copy to this buffer
+
+ if (DS::isCpuScalerEnabled()) {
+
+ _framebuffer.pixels = DS::getScalerBuffer();
+ _framebuffer.w = DS::getGameWidth();
+ _framebuffer.h = DS::getGameHeight();
+ _framebuffer.pitch = DS::getGameWidth();
+ _framebuffer.bytesPerPixel = 1;
+
+
+ } else {
+
+ s32 height = DS::getGameHeight();
+ s32 width = DS::getGameWidth();
+ s32 stride = DS::get8BitBackBufferStride();
+
+ u16* src = DS::get8BitBackBuffer();
+ u16* dest = DS::getScalerBuffer();
+
+ for (int y = 0; y < height; y++) {
+
+ u16* destLine = dest + (y * (width / 2));
+ u16* srcLine = src + (y * (stride / 2));
+
+ DC_FlushRange(srcLine, width);
+
+ dmaCopyHalfWords(3, srcLine, destLine, width);
+ }
+
+ _framebuffer.pixels = dest;
+ _framebuffer.w = width;
+ _framebuffer.h = height;
+ _framebuffer.pitch = width;
+ _framebuffer.bytesPerPixel = 1;
+
+ }
+
+ _frameBufferExists = true;
+
+/*
+ size_t imageStrideInBytes = DS::get8BitBackBufferStride();
size_t imageStrideInWords = imageStrideInBytes / 2;
u16* image = (u16 *) DS::get8BitBackBuffer();
for (int y = 0; y < DS::getGameHeight(); y++) {
DC_FlushRange(image + (y * imageStrideInWords), DS::getGameWidth());
for (int x = 0; x < DS::getGameWidth() >> 1; x++) {
- *(((u16 *) (_framebuffer.pixels)) + y * (DS::getGameWidth() >> 1) + x) = image[(y << 8) + x];
+ *(((u16 *) (_framebuffer.pixels)) + y * (DS::getGameWidth() >> 1) + x) = image[(y * imageStrideInWords) + x];
// *(((u16 *) (surf->pixels)) + y * (DS::getGameWidth() >> 1) + x) = image[y * imageStrideInWords + x];
}
- }
-// consolePrintf("lockScreen() done\n");
- _frameBufferExists = true;
+ }*/
return &_framebuffer;
}
@@ -524,15 +572,7 @@ Graphics::Surface *OSystem_DS::lockScreen() {
}
void OSystem_DS::unlockScreen() {
-
-// consolePrintf("unlockScreen()\n");
-
- // Copy temp framebuffer back to screen
-// copyRectToScreen((byte *)_framebuffer.pixels, _framebuffer.pitch, 0, 0, _framebuffer.w, _framebuffer.h);
-
- // Free memory
-// _framebuffer.free();
-// consolePrintf("unlockScreen() done\n");
+ // No need to do anything here. The screen will be updated in updateScreen().
}
void OSystem_DS::setFocusRectangle(const Common::Rect& rect) {
diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h
index 2bbd82bcf7..246797188f 100644
--- a/backends/platform/ds/arm9/source/osystem_ds.h
+++ b/backends/platform/ds/arm9/source/osystem_ds.h
@@ -19,8 +19,8 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
-
+
+
#ifndef _OSYSTEM_DS_H_
#define _OSYSTEM_DS_H_
#include "common/system.h"
@@ -33,10 +33,10 @@
#include "sound/mixer.h"
#include "graphics/surface.h"
-class DSAudioMixer : public Audio::Mixer {
+class DSAudioMixer : public Audio::Mixer {
};
-class DSTimerManager : public DefaultTimerManager {
+class DSTimerManager : public DefaultTimerManager {
};
@@ -45,10 +45,10 @@ protected:
int eventNum;
int lastPenFrame;
-
+
Common::Event eventQueue[96];
int queuePos;
-
+
DSSaveFileManager saveManager;
GBAMPSaveFileManager mpSaveManager;
DSAudioMixer* _mixer;
@@ -58,7 +58,7 @@ protected:
static OSystem_DS* _instance;
-
+
Graphics::Surface* createTempFrameBuffer();
public:
@@ -98,7 +98,7 @@ public:
inline virtual OverlayColor RGBToColor(uint8 r, uint8 g, uint8 b);
inline virtual void colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b);
-
+
virtual bool showMouse(bool visible);
virtual void warpMouse(int x, int y);
@@ -131,21 +131,21 @@ public:
virtual void displayMessageOnOSD(const char *msg);
virtual Common::SaveFileManager *getSavefileManager();
-
+
void addEvent(Common::Event& e);
bool isEventQueueEmpty() { return queuePos == 0; }
-
+
virtual bool grabRawScreen(Graphics::Surface* surf);
-
+
virtual void setFocusRectangle(const Common::Rect& rect);
-
+
virtual void clearFocusRectangle();
-
+
virtual void initBackend();
-
+
virtual Graphics::Surface *lockScreen();
virtual void unlockScreen();
-
+
virtual Audio::Mixer* getMixer() { return _mixer; }
virtual Common::TimerManager* getTimerManager() { return _timer; }
static int timerHandler(int t);
@@ -155,8 +155,7 @@ public:
virtual void clearAutoComplete();
virtual void setCharactersEntered(int count);
-
-
+ FilesystemFactory *getFilesystemFactory();
};
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
diff --git a/backends/platform/ds/arm9/source/portdefs.cpp b/backends/platform/ds/arm9/source/portdefs.cpp
index 075d24d909..74a41faca0 100644
--- a/backends/platform/ds/arm9/source/portdefs.cpp
+++ b/backends/platform/ds/arm9/source/portdefs.cpp
@@ -37,7 +37,6 @@ extern "C" time_t __wrap_time(time_t* t) {
time_t DS_time(time_t) {
- consolePrintf("Time!");
if (OSystem_DS::instance()) {
return 0xABCD1234 + (OSystem_DS::instance()->getMillis() / 1000);
} else {
@@ -46,7 +45,6 @@ time_t DS_time(time_t) {
}
time_t DS_time(long* t) {
- consolePrintf("Time!");
if (OSystem_DS::instance()) {
if (t) *t = 0xABCD1234 + (OSystem_DS::instance()->getMillis() / 1000);
return 0xABCD1234 + (OSystem_DS::instance()->getMillis() / 1000);
diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h
index 12d53a332f..de7a5795f5 100644
--- a/backends/platform/ds/arm9/source/portdefs.h
+++ b/backends/platform/ds/arm9/source/portdefs.h
@@ -19,10 +19,12 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _PORTDEFS_H_
#define _PORTDEFS_H_
+
+
/*
typedef unsigned char u8;
typedef signed char s8;
diff --git a/backends/platform/ds/arm9/source/ramsave.cpp b/backends/platform/ds/arm9/source/ramsave.cpp
index a9ac773dd2..f8e005647e 100644
--- a/backends/platform/ds/arm9/source/ramsave.cpp
+++ b/backends/platform/ds/arm9/source/ramsave.cpp
@@ -17,7 +17,7 @@
* 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.
- *
+ *
*/
// Save in order 1,2,3,4,larger 2,5
#include "system.h"
@@ -52,18 +52,18 @@ DSSaveFile::DSSaveFile(SCUMMSave* s, bool compressed, u8* data) {
ownsData = true;
saveCompressed = false;
// consolePrintf("Decompressed. name=%s size=%d (%d)", save.name, save.size, save.compressedSize);
-
+
} else {
ownsData = false;
origHeader = s;
}
-
+
if (save.magic == (int) 0xBEEFCAFE) {
save.isValid = true;
} else {
save.isValid = false;
}
-
+
isTempFile = false;
}
@@ -78,7 +78,7 @@ DSSaveFile::~DSSaveFile() {
}
bool DSSaveFile::loadFromSaveRAM(vu8* address) {
-
+
SCUMMSave newSave;
for (int t = 0; t < (int) sizeof(newSave); t++) {
@@ -89,13 +89,13 @@ bool DSSaveFile::loadFromSaveRAM(vu8* address) {
newSave.isValid = true;
*((u16 *) (0x4000204)) |= 0x3;
-
+
saveData = new unsigned char[newSave.compressedSize];
-
+
for (int t = 0; t < (int) newSave.compressedSize; t++) {
((char *) (saveData))[t] = *(address + t + sizeof(newSave));
}
-
+
if (ownsData) delete this->saveData;
save = newSave;
saveCompressed = true;
@@ -105,7 +105,7 @@ bool DSSaveFile::loadFromSaveRAM(vu8* address) {
return true;
}
-
+
return false;
}
@@ -114,11 +114,11 @@ void DSSaveFile::compress() {
unsigned char* compBuffer = new unsigned char[(save.size * 110) / 100];
int compSize = LZ_Compress((u8 *) saveData, compBuffer, save.size);
save.compressedSize = compSize;
-
-
-
+
+
+
delete saveData;
-
+
// Make the save smaller
saveData = (u8 *) realloc(compBuffer, save.compressedSize);
saveCompressed = true;
@@ -129,39 +129,39 @@ int DSSaveFile::saveToSaveRAM(vu8* address) {
unsigned char* compBuffer;
bool failed;
-
+
int compSize;
-
+
compress();
-
+
compSize = save.compressedSize;
compBuffer = saveData;
-
+
if (DSSaveFileManager::instance()->getBytesFree() >= getRamUsage()) {
DSSaveFileManager::instance()->addBytesFree(-getRamUsage());
-
+
// Write header
for (int t = 0; t < sizeof(save); t++) {
while (*(address + t) != ((char *) (&save))[t]) {
*(address + t) = ((char *) (&save))[t];
}
}
-
+
// Write compressed buffer
for (int t = sizeof(save); t < (int) sizeof(save) + compSize; t++) {
while (*(address + t) != compBuffer[t - sizeof(save)]) {
*(address + t) = compBuffer[t - sizeof(save)];
}
}
-
+
failed = false;
} else {
failed = true;
}
-
+
return failed? 0: compSize + sizeof(save);
}
@@ -177,7 +177,7 @@ uint32 DSSaveFile::read(void *buf, uint32 size) {
}
memcpy(buf, saveData + ptr, size);
// consolePrintf("byte: %d ", ((u8 *) (buf))[0]);
-
+
ptr += size;
return size;
}
@@ -249,7 +249,7 @@ bool DSSaveFile::matches(char* filename) {
return false;
}
}
-
+
void DSSaveFile::setName(char *name) {
save.isValid = true;
save.magic = 0xBEEFCAFE;
@@ -258,7 +258,7 @@ void DSSaveFile::setName(char *name) {
save.compressedSize = 0;
saveData = new unsigned char[DS_MAX_SAVE_SIZE];
strcpy(save.name, name);
-
+
if ((strstr(name, ".s99")) || (strstr(name, ".c"))) {
isTempFile = true;
} else {
@@ -298,10 +298,10 @@ void DSSaveFile::deleteFile() {
DSSaveFileManager::DSSaveFileManager() {
instancePtr = this;
-
+
*((u16 *) (0x4000204)) |= 0x3;
swiWaitForVBlank();
-
+
loadAllFromSRAM();
}
@@ -311,7 +311,7 @@ DSSaveFileManager::~DSSaveFileManager() {
void DSSaveFileManager::loadAllFromSRAM() {
int addr = 1;
-
+
for (int r = 0; r < 8; r++) {
gbaSave[r].deleteFile();
}
@@ -332,7 +332,7 @@ void DSSaveFileManager::formatSram() {
for (int r = 0; r < SRAM_SAVE_MAX; r++) {
*(CART_RAM + r) = 0;
}
-
+
loadAllFromSRAM();
}
@@ -358,7 +358,7 @@ DSSaveFile *DSSaveFileManager::openSavefile(const char* filename, bool saveOrLoa
return gbaSave[r].clone();
}
}
-
+
if (saveOrLoad) {
return makeSaveFile(filename, saveOrLoad);
} else {
@@ -401,6 +401,8 @@ Common::StringList DSSaveFileManager::listSavefiles(const char *pattern) {
use Common::matchString from common/util.h and read the Doxygen docs,
then combine this with the old code below...
*/
+}
+
/*
void DSSaveFileManager::listSavefiles(const char *prefix, bool *marks, int num) {
@@ -416,21 +418,20 @@ void DSSaveFileManager::listSavefiles(const char *prefix, bool *marks, int num)
}
}
}
-
+
}
*/
-}
DSSaveFile *DSSaveFileManager::makeSaveFile(const char *filename, bool saveOrLoad) {
-
+
// Find a free save slot
int r = 0;
-
+
while ((r < 8) && (gbaSave[r].isValid())) {
r++;
}
-
+
if ((r == 8) && (gbaSave[r].isValid())) {
// No more saves
return NULL;
@@ -447,9 +448,9 @@ void DSSaveFileManager::flushToSaveRAM() {
int cartAddr = 1;
int s;
int extraData = DSSaveFileManager::getExtraData();
-
+
*((u16 *) (0x4000204)) |= 0x3;
-
+
swiWaitForVBlank();
int size = 0;
@@ -459,20 +460,20 @@ void DSSaveFileManager::flushToSaveRAM() {
if (!gbaSave[r].isTemp()) size += gbaSave[r].getRamUsage();
}
}
-
+
if (size <= SRAM_SAVE_MAX) {
for (int r = 0; r < SRAM_SAVE_MAX; r++) {
*(CART_RAM + r) = 0;
}
-
+
sramBytesFree = SRAM_SAVE_MAX;
-
+
for (int r = 0; (r < 8); r++) {
if (gbaSave[r].isValid() && (!gbaSave[r].isTemp())) {
-
+
cartAddr += s = gbaSave[r].saveToSaveRAM(CART_RAM + cartAddr);
-
+
/* if (s == 0) {
consolePrintf("WARNING: Save didn't fit in cart RAM and has been lost!! Delete files and save again.", gbaSave[r].getName());
failed = true;
@@ -483,7 +484,7 @@ void DSSaveFileManager::flushToSaveRAM() {
consolePrintf("WARNING: Save didn't fit in cart RAM and has been lost!! Delete files and save again.");
loadAllFromSRAM();
-
+
}
DSSaveFileManager::setExtraData(extraData);
diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h
index abf225e598..6add649f56 100644
--- a/backends/platform/ds/arm9/source/ramsave.h
+++ b/backends/platform/ds/arm9/source/ramsave.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _RAMSAVE_H_
#define _RAMSAVE_H_
@@ -46,56 +46,56 @@ class DSSaveFile : public Common::InSaveFile, public Common::OutSaveFile {
u16 extraMagic; // 32
u32 reserved; // 36
} __attribute__ ((packed));
-
+
SCUMMSave save;
u8* saveData;
SCUMMSave* origHeader;
bool isOpenFlag;
bool isTempFile;
-
+
public:
DSSaveFile();
DSSaveFile(SCUMMSave* s, bool saveCompressed, u8* data);
~DSSaveFile();
-
+
void reset();
-
+
bool isOpen() const { return isOpenFlag; }
virtual bool eos() const;
virtual void skip(uint32 size);
-
+
virtual uint32 pos() const;
virtual uint32 size() const;
virtual void seek(int32 pos, int whence);
uint32 read(void *buf, uint32 size);
uint32 write(const void *buf, uint32 size);
-
+
void setName(char *name);
char* getName() { return save.name; }
-
+
bool isValid() { return save.isValid; }
bool isTemp() { return isTempFile; }
bool matches(char* prefix, int num);
bool matches(char* filename);
-
+
void clearData();
void compress();
-
+
int getRamUsage() { return sizeof(save) + save.compressedSize; }
char* getRamImage() { return (char *) &save; }
-
+
int getSize() { return save.size; }
-
+
DSSaveFile* clone();
-
+
bool loadFromSaveRAM(vu8* address);
int saveToSaveRAM(vu8* address);
-
-
+
+
void deleteFile();
-
+
void operator delete(void *p) {
// consolePrintf("Finished! size=%d\n", ((DSSaveFile *) (p))->save->size);
}
@@ -107,25 +107,25 @@ public:
class DSSaveFileManager : public Common::SaveFileManager {
-
+
DSSaveFile gbaSave[8];
static DSSaveFileManager* instancePtr;
int sramBytesFree;
-
+
public:
DSSaveFileManager();
~DSSaveFileManager();
-
+
static DSSaveFileManager* instance() { return instancePtr; }
DSSaveFile *openSavefile(const char *filename, bool saveOrLoad);
-
+
virtual Common::OutSaveFile* openForSaving(const char* filename) { return openSavefile(filename, true); }
virtual Common::InSaveFile* openForLoading(const char* filename) { return openSavefile(filename, false); }
virtual bool removeSavefile(const char *filename);
virtual Common::StringList listSavefiles(const char *pattern);
-
+
void flushToSaveRAM();
void addBytesFree(int size) { sramBytesFree += size; }
@@ -134,7 +134,7 @@ public:
void deleteFile(char* name);
void listFiles();
void formatSram();
-
+
void loadAllFromSRAM();
static bool isExtraDataPresent();
diff --git a/backends/platform/ds/arm9/source/scummconsole.c b/backends/platform/ds/arm9/source/scummconsole.c
index 980dea7bc4..2145b47353 100644
--- a/backends/platform/ds/arm9/source/scummconsole.c
+++ b/backends/platform/ds/arm9/source/scummconsole.c
@@ -25,7 +25,7 @@
//
// Changelog:
// 0.1: First version
-// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
+// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
// Changed some register defines for consistency.
//
//////////////////////////////////////////////////////////////////////
@@ -52,7 +52,7 @@ u16* fontMap;
u8 row, col;
//font may not start on a character base boundry
-u16 fontOffset;
+u16 fontOffset;
//the first character in the set (0 if you have a full set)
u16 fontStart;
@@ -65,7 +65,7 @@ u16 fontPal;
///////////////////////////////////////////////////////////
//consoleInit
-// param:
+// param:
// font: 16 color font
// charBase: the location the font data will be loaded to
// numCharacters: count of characters in the font
@@ -79,7 +79,7 @@ void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16*
int i;
row = col = 0;
-
+
fontStart = charStart;
fontOffset = 0;
@@ -111,9 +111,9 @@ void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16*
temp |= 0xF00;
if(font[i] & 0xF000)
temp |= 0xF000;
-
+
charBase[i] = temp;
- }
+ }
}
}//end if bitdepth
else
@@ -140,7 +140,7 @@ void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16*
void consoleInitDefault(u16* map, u16* charBase, u8 bitDepth)
{
- consoleInit((u16 *) default_font_bin, charBase, 128, 0, map, CONSOLE_USE_COLOR255, bitDepth);
+ consoleInit((u16 *) default_font_bin, charBase, 128, 0, map, CONSOLE_USE_COLOR255, bitDepth);
}
void consolePrintSet(int x, int y)
@@ -164,9 +164,9 @@ void consolePrintChar(char c)
{
col = 0;
- row++;
+ row++;
}
-
+
if(row >= CONSOLE_HEIGHT)
{
row--;
@@ -178,7 +178,7 @@ void consolePrintChar(char c)
}
-
+
switch(c)
{
@@ -199,7 +199,7 @@ void consolePrintChar(char c)
}
-
+
}
@@ -207,16 +207,16 @@ void printX(int w, unsigned d)
{
int loop = 0;
int i = 0;
-
+
char buf[20] = {0};
while(d > 0)
{
buf[loop++] = d & 0xF;
- d = d>>4;
+ d = d>>4;
}
-
+
for (i = 7; i >= 0; i--)
{
if(buf[i] || i < loop)
@@ -235,15 +235,15 @@ void printx(int w, unsigned int d)
{
int loop = 0;
int i = 0;
-
+
char buf[20] = {0};
while(d > 0)
{
buf[loop++] = d & 0xF;
- d = d>>4;
+ d = d>>4;
}
-
+
for (i = 7; i >= 0; i--)
{
if(buf[i] || i < loop)
@@ -262,8 +262,8 @@ void printInt(int w, int d)
{
int loop = 0;
int i = 0;
-
- char buf[20] = {0};
+
+ char buf[20] = {0};
if(d < 0)
{
@@ -276,9 +276,9 @@ void printInt(int w, int d)
else while (d > 0)
{
buf[loop++] = d % 10;
- d /= 10;
+ d /= 10;
}
-
+
for (i = 7; i >= 0; i--)
{
if(buf[i] || i < loop)
@@ -310,16 +310,16 @@ void print0X(int w, unsigned d)
{
int loop = 0;
int i = 0;
-
+
char buf[] = {0,0,0,0,0,0,0,0}; //set to zero cause I may add formatted output someday
-
+
while(d > 0)
{
buf[loop++] = d & 0xF;
- d = d>>4;
+ d = d>>4;
}
-
+
for (i = 7; i >= 0; i--)
{
if(buf[i] || i < w || i < loop)
@@ -336,16 +336,16 @@ void print0x(int w, unsigned int d)
{
int loop = 0;
int i = 0;
-
+
char buf[] = {0,0,0,0,0,0,0,0}; //set to zero cause I may add formatted output someday
-
+
while(d > 0)
{
buf[loop++] = d & 0xF;
- d = d>>4;
+ d = d>>4;
}
-
+
for (i = 7; i >= 0; i--)
{
if(buf[i] || i < w || i < loop)
@@ -362,9 +362,9 @@ void print0Int(int w, int d)
{
int loop = 0;
int i = 0;
-
+
char buf[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; //set to zero cause I may add formatted output someday
-
+
if(d < 0)
{
consolePrintChar('-');
@@ -374,9 +374,9 @@ void print0Int(int w, int d)
while(d > 0)
{
buf[loop++] = d % 10;
- d /= 10;
+ d /= 10;
}
-
+
for (i = 15; i >= 0; i--)
if(buf[i] || i < w || i < loop)
consolePrintChar(buf[i] + '0');
@@ -414,14 +414,14 @@ void printF(int w, float f)
if(*t & BIT(31))
consolePrintChar('-');
-
+
print0Bin(32, fraction);
-
+
printInt(1, fraction);
consolePrintChar('e');
printInt(1, exp - 127);
-
+
/*
if(exp == 0 && fraction == 0)
{
@@ -447,7 +447,7 @@ void consolePrintf(const char* s, ...)
va_list argp;
va_start(argp, s);
-
+
while(*s)
{
@@ -474,7 +474,7 @@ void consolePrintf(const char* s, ...)
case 'I':
case 'd':
case 'D':
- if(z)print0Int(w, va_arg(argp, int));
+ if(z)print0Int(w, va_arg(argp, int));
else printInt(w, va_arg(argp, int));
s++;
break;
diff --git a/backends/platform/ds/arm9/source/scummconsole.h b/backends/platform/ds/arm9/source/scummconsole.h
index d8ccf34c62..01fdfc2f04 100644
--- a/backends/platform/ds/arm9/source/scummconsole.h
+++ b/backends/platform/ds/arm9/source/scummconsole.h
@@ -25,7 +25,7 @@
//
// Changelog:
// 0.1: First version
-// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
+// 0.2: Fixed sprite mapping bug. 1D mapping should work now.
// Changed some register defines for consistency.
//
//////////////////////////////////////////////////////////////////////
diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp
index f9efd58276..452f782dc5 100644
--- a/backends/platform/ds/arm9/source/scummhelp.cpp
+++ b/backends/platform/ds/arm9/source/scummhelp.cpp
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#include "scummhelp.h"
#define ADD_BIND(k,d) do { key[i] = k; dsc[i] = d; i++; } while (0)
diff --git a/backends/platform/ds/arm9/source/scummhelp.h b/backends/platform/ds/arm9/source/scummhelp.h
index 602cb5f788..e79c863cbd 100644
--- a/backends/platform/ds/arm9/source/scummhelp.h
+++ b/backends/platform/ds/arm9/source/scummhelp.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _SCUMMHELP_H_
#define _SCUMMHELP_H_
@@ -30,7 +30,7 @@ namespace DS {
void updateStrings(byte gameId, byte version, Common::Platform platform,
int page, Common::String &title, Common::String *&key, Common::String *&dsc);
-
+
}
#endif
diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp
index 5ff162cc4f..11832f4e3a 100644
--- a/backends/platform/ds/arm9/source/touchkeyboard.cpp
+++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp
@@ -45,7 +45,7 @@ struct key_data {
key_data keys[DS_NUM_KEYS] = {
// Key number x y character
-
+
// Numbers
{28, 3, 0, '1'},
{29, 5, 0, '2'},
@@ -116,7 +116,7 @@ key_data keys[DS_NUM_KEYS] = {
{54, 29, 8, Common::KEYCODE_DOWN},
{53, 31, 8, Common::KEYCODE_RIGHT},
{51, 29, 6, Common::KEYCODE_UP},
-
+
// Close button
{56, 30, 0, Common::KEYCODE_INVALID},
@@ -133,7 +133,7 @@ key_data keys[DS_NUM_KEYS] = {
{66, 26, -2, Common::KEYCODE_F10},
{67, 28, -2, Common::KEYCODE_F11},
{68, 30, -2, Common::KEYCODE_F12},
-
+
};
int keyboardX;
@@ -162,7 +162,7 @@ void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) {
/* for (int r = 0; r < 32 * 32; r++) {
((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = *saveSpace++;
}
-
+
for (int r = 0; r < 4096; r++) {
((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = *saveSpace++;
}*/
@@ -175,77 +175,77 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) {
// *saveSpace++ = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r];
((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = 0;
}
-
+
for (int r = 0; r < KEYBOARD_DATA_SIZE / 2; r++) {
// *saveSpace++ = ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r];
((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = ((u16 *) (keyboard_raw))[r];
}
-
+
for (int r = 0; r < 16; r++) {
BG_PALETTE_SUB[r] = ((u16 *) (keyboard_pal_raw))[r];
}
// this is the font
for (int tile = 0; tile < 94; tile++) {
-
+
u16* tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32)));
u8* src = ((u8 *) (_8x8font_tga_raw)) + 18 + tile * 8;
for (int y = 0 ; y < 8; y++) {
for (int x = 0; x < 2; x++) {
*(tileAddr + (y * 2) + x) =(*(src + (y * 752) + (x * 4) + 0) & 0x0F)
- | ((*(src + (y * 752) + (x * 4) + 1) & 0x0F) << 4)
+ | ((*(src + (y * 752) + (x * 4) + 1) & 0x0F) << 4)
| ((*(src + (y * 752) + (x * 4) + 2) & 0x0F) << 8)
| ((*(src + (y * 752) + (x * 4) + 3) & 0x0F) << 12);
-
+
}
}
}
-
+
for (int r = 0; r < 16; r++) {
int col = ((u16 *) (keyboard_pal_raw))[r];
-
+
int red = col & 0x001F;
int green = (col & 0x03E0) >> 5;
int blue = (col & 0x7C00) >> 10;
-
+
red = (red * 8) / 16;
green = (green * 24) / 16;
blue = (blue * 8) / 16;
if (green > 31) green = 31;
-
+
BG_PALETTE_SUB[16 + r] = red | (green << 5) | (blue << 10);
}
-
+
keyboardX = -2;
keyboardY = 2;
-
+
DS::mapBase = mapBase;
DS::tileBase = tileBase;
-
+
shiftState = false;
capsLockState = false;
-
+
int x = keyboardX;
int y = keyboardY;
-
+
u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase));
baseAddress = base;
-
+
for (int r = 0; r < DS_NUM_KEYS; r++) {
base[(y + keys[r].y) * 32 + x + keys[r].x] = 10 + keys[r].keyNum * 2;
base[(y + keys[r].y) * 32 + x + keys[r].x + 1] = 10 + keys[r].keyNum * 2 + 1;
-
+
base[(y + keys[r].y + 1) * 32 + x + keys[r].x] = 10 + 148 + keys[r].keyNum * 2;
base[(y + keys[r].y + 1) * 32 + x + keys[r].x + 1] = 10 + 148 + keys[r].keyNum * 2 + 1;
-
+
keys[r].pressed = false;
}
-
+
closed = false;
clearAutoComplete();
}
@@ -257,7 +257,7 @@ void drawAutoComplete() {
baseAddress[y * 32 + x] = 0;
}
}
-
+
for (int r = 0; r < autoCompleteCount; r++) {
int y = 12 + (r % 6) * 2;
@@ -265,15 +265,15 @@ void drawAutoComplete() {
for (int p = 0; p < strlen(autoCompleteWord[r]); p++) {
char c = autoCompleteWord[r][p];
-
+
int tile = c - 33 + (KEYBOARD_DATA_SIZE / 32);
if (selectedCompletion == r) {
tile |= 0x1000;
}
- baseAddress[y * 32 + x + p] = tile;
-
+ baseAddress[y * 32 + x + p] = tile;
+
}
}
@@ -317,7 +317,7 @@ void clearAutoComplete() {
void typeCompletion(int current) {
Common::Event event;
- OSystem_DS* system = OSystem_DS::instance();
+ OSystem_DS* system = OSystem_DS::instance();
strcat(autoCompleteBuffer, &autoCompleteWord[current][charactersEntered]);
strcat(autoCompleteBuffer, " ");
@@ -330,7 +330,7 @@ void typeCompletion(int current) {
event.type = Common::EVENT_KEYDOWN;
event.kbd.flags = 0;
system->addEvent(event);
-
+
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
}
@@ -350,14 +350,14 @@ void updateTypeEvents()
if (autoCompleteBuffer[0] != '\0')
{
Common::Event event;
- OSystem_DS* system = OSystem_DS::instance();
-
+ OSystem_DS* system = OSystem_DS::instance();
+
event.kbd.keycode = (Common::KeyCode) autoCompleteBuffer[0];
event.kbd.ascii = autoCompleteBuffer[0];
event.type = Common::EVENT_KEYDOWN;
event.kbd.flags = 0;
system->addEvent(event);
-
+
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
@@ -380,30 +380,37 @@ void createKeyEvent(int keyNum, Common::Event& event)
} else {
event.kbd.keycode = (Common::KeyCode) (Common::KEYCODE_F1 - (keys[keyNum].character - '1'));
event.kbd.ascii = 0;
- }
-
+ }
+
} else if ((keys[keyNum].character >= 'A') && (keys[keyNum].character <= 'Z')) {
-
+
if ((!DS::shiftState) && (!DS::capsLockState)) {
event.kbd.ascii = keys[keyNum].character + 32; // Make key lowercase.
} else {
event.kbd.ascii = keys[keyNum].character;
}
-
+
event.kbd.keycode = (Common::KeyCode) event.kbd.ascii;
} else {
- event.kbd.ascii = keys[keyNum].character;
- event.kbd.keycode = (Common::KeyCode) keys[keyNum].character;
- }
+ if ((keys[keyNum].character >= Common::KEYCODE_F1) && (keys[keyNum].character >= Common::KEYCODE_F12)) {
+ event.kbd.keycode = (Common::KeyCode) keys[keyNum].character;
+ event.kbd.ascii = keys[keyNum].character - Common::KEYCODE_F1 + Common::ASCII_F1;
+ } else {
+ event.kbd.ascii = keys[keyNum].character;
+ event.kbd.keycode = (Common::KeyCode) keys[keyNum].character;
+ }
+ }
}
void addKeyboardEvents() {
+ bool resetShift = false;
+
updateTypeEvents();
if (DS::getPenDown()) {
int x = IPC->touchXpx;
int y = IPC->touchYpx;
-
+
int tx = (x >> 3);
int ty = (y >> 3);
@@ -427,81 +434,89 @@ void addKeyboardEvents() {
tx -= keyboardX;
ty -= keyboardY;
-
+
// consolePrintf("x=%d y=%d\n", tx, ty);
-
+
for (int r = 0; r < DS_NUM_KEYS; r++) {
- if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) &&
+ if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) &&
(ty >= keys[r].y) && (ty <= keys[r].y + 1)) {
- OSystem_DS* system = OSystem_DS::instance();
+ OSystem_DS* system = OSystem_DS::instance();
Common::Event event;
-
+
// consolePrintf("Key: %d\n", r);
if ((keys[r].character == Common::KEYCODE_INVALID)) {
// Close button
DS::closed = true;
} else {
createKeyEvent(r, event);
- }
-
- //event.kbd.keycode = keys[r].character;
- //event.kbd.ascii = keys[r].character;
+ }
+
+ //event.kbd.keycode = keys[r].character;
+ //event.kbd.ascii = keys[r].character;
event.type = Common::EVENT_KEYDOWN;
system->addEvent(event);
// event.type = Common::EVENT_KEYUP;
// system->addEvent(event);
-
+
switch (keys[r].character) {
case DS_SHIFT: {
DS::shiftState = !DS::shiftState;
DS::setKeyHighlight(r, DS::shiftState);
break;
}
-
+
case DS_CAPSLOCK: {
DS::capsLockState = !DS::capsLockState;
DS::setKeyHighlight(r, DS::capsLockState);
break;
}
-
+
default: {
DS::setKeyHighlight(r, true);
keys[r].pressed = true;
-
- if (DS::shiftState) {
- DS::shiftState = false;
- for (int t = 0; t < DS_NUM_KEYS; t++) {
- if (keys[t].character == DS_SHIFT) {
- DS::setKeyHighlight(t, false);
- }
- }
- }
break;
}
}
-
+
}
}
}
-
+
if (DS::getPenReleased()) {
-
+
for (int r = 0; r < DS_NUM_KEYS; r++) {
if (keys[r].pressed) {
DS::setKeyHighlight(r, false);
- OSystem_DS* system = OSystem_DS::instance();
-
+ OSystem_DS* system = OSystem_DS::instance();
+
Common::Event event;
createKeyEvent(r, event);
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
keys[r].pressed = false;
+
+ if (keys[r].character != DS_SHIFT) {
+ resetShift = true;
+ }
+ }
+ }
+
+ }
+
+
+ if ((resetShift) && (DS::shiftState)) {
+ DS::shiftState = false;
+ resetShift = false;
+ for (int t = 0; t < DS_NUM_KEYS; t++) {
+ if (keys[t].character == DS_SHIFT) {
+ DS::setKeyHighlight(t, false);
}
}
}
+
}
}
diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h
index e4aa102ab4..8a5fc728ce 100644
--- a/backends/platform/ds/arm9/source/touchkeyboard.h
+++ b/backends/platform/ds/arm9/source/touchkeyboard.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _TOUCHKEYBOARD_H_
#define _TOUCHKEYBOARD_H_
diff --git a/backends/platform/ds/arm9/source/wordcompletion.cpp b/backends/platform/ds/arm9/source/wordcompletion.cpp
index bf4ce7c909..9eeeb62410 100644
--- a/backends/platform/ds/arm9/source/wordcompletion.cpp
+++ b/backends/platform/ds/arm9/source/wordcompletion.cpp
@@ -23,7 +23,7 @@ void addAutoCompleteLine(char* line) {
{
char word[32];
int length;
-
+
// Skip the T9-style numbers
while (*line != ' ')
{
@@ -37,7 +37,7 @@ void addAutoCompleteLine(char* line) {
if (*line == ' ') line++;
- // Copy the new word
+ // Copy the new word
do {
word[length++] = *line++;
} while ((*line != '\0') && (*line != ' ') && (*line != '\n'));
@@ -47,7 +47,7 @@ void addAutoCompleteLine(char* line) {
// Store a pointer to the start of the word
wordBufferPtr[wordBufferPtrPos++] = &wordBuffer[wordBufferPos];
-
+
// copy the new word into the buffer
strcpy(&wordBuffer[wordBufferPos], word);
wordBufferPos += strlen(word) + 1;
@@ -104,11 +104,11 @@ bool findWordCompletions(char* input)
// Get the word from the dictonary line
word = wordBufferPtr[position];
-
+
// Now check to see if the word is before or after the stub we're after
int result = scumm_stricmp((const char *) partialWord, (const char *) word);
-
+
if (result == 0) {
// We've found the whole word. Aren't we good.
break;
@@ -128,10 +128,10 @@ bool findWordCompletions(char* input)
word = wordBufferPtr[position];
//consolePrintf("Final word: %s\n", word);
-
+
system->setCharactersEntered(strlen(partialWord));
-
+
bool match = true;
@@ -161,7 +161,7 @@ bool findWordCompletions(char* input)
break;
}
}
-
+
if (match) {
system->addAutoComplete(word);
}
diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp
index 8ba56c2b7c..01321f44f5 100644
--- a/backends/platform/ds/arm9/source/zipreader.cpp
+++ b/backends/platform/ds/arm9/source/zipreader.cpp
@@ -17,7 +17,7 @@
* 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.
- *
+ *
*/
@@ -29,25 +29,25 @@
ZipFile::ZipFile() {
// Locate a zip file in cartridge memory space
-
+
// consolePrintf("ZIP file check...");
-
+
char* p = (char *) ZF_SEARCH_START;
bool found = false;
-
+
_zipFile = NULL;
-
+
while ((p != (char *) ZF_SEARCH_END) && (!found)) {
// Zip file header is: 0x504B0304
-
+
if ( (*p == 0x50) && (*(p + 1) == 0x4B) && (*(p + 2) == 0x03) && (*(p + 3) == 0x04) ) {
// Found header!
found = true;
_zipFile = p;
}
-
+
if (!found) p += ZF_SEARCH_STRIDE;
-
+
}
if (_zipFile) {
@@ -56,14 +56,14 @@ ZipFile::ZipFile() {
// consolePrintf("Not in use!\n");
return;
}
-
+
changeToRoot();
restartFile();
-
+
if (_currentFile->compSize != (u32) getFileSize()) {
consolePrintf("Error: ZIP file contains compression!\n");
}
-
+
_allFilesVisible = false;
}
@@ -83,73 +83,73 @@ bool ZipFile::restartFile() {
getFileName(name);
more = skipFile();
}
-
+
return more;
}
bool ZipFile::currentFileInFolder() {
char name[128];
-
+
if (_allFilesVisible) return true;
-
+
getFileName(name);
// consolePrintf("N:'%s'D:'%s'\n", name, _directory);
-
+
if (_directory[0] == 0) { // Root directory
name[strlen(name) - 1] = 0;
- return !strchr(name, '\\'); // Not in root if contains a / character before the last character
+ return !strchr(name, '\\'); // Not in root if contains a / character before the last character
} else {
/* if (name starts with directory && it's not the directory
&& (no slashes after the directory || it's the last character)
&& (slash follows directory)
*/
- if ((strstr(name, _directory) == name) && (strlen(name) != strlen(_directory))
+ if ((strstr(name, _directory) == name) && (strlen(name) != strlen(_directory))
&& ((strchr(name + strlen(_directory) + 1, '\\') == NULL)
|| (strchr(name + strlen(_directory) + 1, '\\') == name + strlen(name) - 1))
&& (*(name + strlen(_directory)) == '\\')) {
return true;
}
}
-
+
return false;
}
void ZipFile::getFileName(char* name) {
strncpy(name, (char *) (_currentFile + 1), _currentFile->nameLength);
-
+
for (int r = 0; r < (int) strlen(name); r++) {
if (name[r] == '/') name[r] = '\\';
}
name[_currentFile->nameLength] = 0;
-
+
if (name[strlen(name) - 1] == '\\') {
name[strlen(name) - 1] = 0;
- }
+ }
}
bool ZipFile::skipFile() {
bool valid;
do {
-
+
// Move on to the next file
_currentFile = (FileHeader *) (
((char *) (_currentFile)) + sizeof(*_currentFile) + _currentFile->nameLength + _currentFile->fileSize + _currentFile->extraLength
);
-
+
// Return true if there are more files. Check this by looking for the magic number
valid = (_currentFile->magic[0] == 0x50) &&
(_currentFile->magic[1] == 0x4B) &&
(_currentFile->magic[2] == 0x03) &&
(_currentFile->magic[3] == 0x04);
-
-
+
+
} while (valid && !currentFileInFolder());
-
+
return valid;
-
+
// Currently doesn't handle data descriptors!
}
@@ -170,7 +170,7 @@ int ZipFile::getFileSize() {
}
bool ZipFile::isDirectory() {
- return _currentFile->fileSize == 0; // This is a bit wrong, but seems to work.
+ return _currentFile->fileSize == 0; // This is a bit wrong, but seems to work.
}
char* ZipFile::getFile() {
@@ -180,7 +180,7 @@ char* ZipFile::getFile() {
bool ZipFile::findFile(char* search) {
changeToRoot();
restartFile();
-
+
char searchName[128];
strcpy(searchName, search);
for (int r = 0; r < (int) strlen(searchName); r++) {
@@ -191,15 +191,15 @@ bool ZipFile::findFile(char* search) {
*(searchName + strlen(searchName) - 1) = '\0'; // which we need to dispose of.
}
-
+
do {
char name[128];
getFileName(name);
if (*(name + strlen(name) - 1) == '\\') { // Directories have a terminating slash
*(name + strlen(name) - 1) = '\0'; // which we need to dispose of.
}
-
-
+
+
if (!stricmp(name, searchName)) {
// consolePrintf("'%s'=='%s'\n", name, searchName);
return true; // Got it!
@@ -222,7 +222,7 @@ void ZipFile::changeDirectory(char* dir) {
for (int r = 0; r < (int) strlen(_directory); r++) {
if (_directory[r] == '/') _directory[r] = '\\';
}
-
+
if (_directory[strlen(_directory) - 1] == '\\') {
_directory[strlen(_directory) - 1] = '\0';
}
diff --git a/backends/platform/ds/arm9/source/zipreader.h b/backends/platform/ds/arm9/source/zipreader.h
index cd7244dba5..19aa3d9f31 100644
--- a/backends/platform/ds/arm9/source/zipreader.h
+++ b/backends/platform/ds/arm9/source/zipreader.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
-
+
#ifndef _ZIPREADER_H_
#define _ZIPREADER_H_
#include "portdefs.h"
@@ -45,9 +45,9 @@ class ZipFile {
char* _zipFile;
char _directory[128];
-
+
bool _allFilesVisible;
-
+
FileHeader* _currentFile;
public:
@@ -55,25 +55,25 @@ public:
~ZipFile();
bool isReady();
-
+
// These operations set the current file
bool restartFile();
bool skipFile();
- bool findFile(char* search);
+ bool findFile(char* search);
// These return the file's data and information
char* getFile();
int getFileSize();
void getFileName(char* name);
bool isDirectory();
-
+
// These set the current directory
void changeDirectory(char* name);
void changeToRoot();
void setAllFilesVisible(bool state) { _allFilesVisible = state; }
-
+
bool currentFileInFolder();
-
+
u16 misaligned16(u16* v);
u32 misaligned32(u32* v);
diff --git a/backends/platform/gp32/Makefile b/backends/platform/gp32/Makefile
deleted file mode 100644
index f7145bf860..0000000000
--- a/backends/platform/gp32/Makefile
+++ /dev/null
@@ -1,187 +0,0 @@
-CC := arm-elf-gcc
-CXX := arm-elf-g++
-LD := arm-elf-g++
-AS := arm-elf-as
-AR := arm-elf-ar cru
-RANLIB := arm-elf-ranlib
-RM := rm -f
-MKDIR := mkdir -p
-ECHO := echo -n
-CAT := cat
-RM := rm -f
-# recursive version of RM
-RM_REC := $(RM) -r
-ZIP := zip -q
-CP := cp
-OBJCOPY := arm-elf-objcopy
-FXETOOL := b2fxec
-
-
-#######################################################################
-# Default compilation parameters. Normally don't edit these #
-#######################################################################
-
-CFLAGS = -marm -march=armv4t -mtune=arm920 -mapcs \
- -finline-functions \
- -fshort-enums \
- -mstructure-size-boundary=32 \
- -mno-thumb-interwork \
- -I$(GPSDK)/include \
- -g \
- -O2 \
- -fomit-frame-pointer
-# -ffast-math \
-# -fshort-double
-
-CPPFLAGS:= $(CFLAGS)
-CXXFLAGS:= $(CFLAGS)
-DEFINES :=
-LDFLAGS :=
-INCLUDES:= -I. -Icommon
-LIBS :=
-OBJS :=
-
-# Turn on useful warnings
-CXXFLAGS+= -Wall -pedantic -Wpointer-arith -Wcast-qual -Wcast-align -Wconversion
-CXXFLAGS+= -Wshadow -Wuninitialized -Wimplicit -Wundef
-CXXFLAGS+= -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-reorder
-CXXFLAGS+= -Wwrite-strings -fcheck-new -Wctor-dtor-privacy -Wnon-virtual-dtor
-
-# Stripped Build? (Smaller ELF, Minimal debug symbol information).
-# You MUST comment this out with a # if you wish to debug your code.
-STRIP_DEBUG = -Wl,--strip-debug
-
-# GPSDK (SDK, Includes and Startup Files) base dir
-GPSDK = /usr/compat/gp32/share/sdk
-
-LDSPECS = -specs=gp32_gpsdk.specs
-
-LDFLAGS = $(STRIP_DEBUG) -Wl,-Map,$(MAPFILE) $(LDSPECS) -Wl,--no-warn-mismatch
-
-LIBS += -L$(GPSDK)/lib \
- -lgpmem -lgpos -lgpstdio -lgpstdlib -lgpsound -lgpgraphic -lgpfont \
- -lm -lc -lgcc
-
-INCLUDES += -Ibackends/platform/gp32 -Iengines -I$(GPSDK)/include
-
-MODULES += backends/platform/gp32
-
-# Outputs
-EXEEXT = .elf
-MAPFILE = scummvm.map
-BIN = scummvm.gxb
-FXE = scummvm.fxe
-
-# Plugins hack
-srcdir = ./
-
-DEFINES = -D__GP32__
-DEFINES += -DNONSTANDARD_PORT
-
-# Disable new themes. GP32 has LOW memory!
-DEFINES += -DDISABLE_FANCY_THEMES
-
-# Support libtremor.
-#DEFINES += -DUSE_VORBIS -DUSE_TREMOR -DGP32_SDK
-#INCLUDES += -Ibackends/platform/gp32/gptremor
-#LIBS += -Lbackends/platform/gp32/gptremor -lgptremor
-
-# Support libmad.
-#DEFINES += -DUSE_MAD
-#INCLUDES += -Ibackends/platform/gp32/gpmad
-#LIBS += -Lbackends/platform/gp32/gpmad -lgpmad
-
-# Support libminilzo.
-DEFINES += -DUSE_MINILZO
-INCLUDES += -Ibackends/platform/gp32/minilzo
-LIBS += -Lbackends/platform/gp32/minilzo -lminilzo
-
-# Support for 8:3 save files names (The GP32 uses FAT12/16 (no vFAT) for the file system).
-DEFINES += -DSHORT_SAVENAMES
-
-# Support for the unsigned sound mixer.
-DEFINES += -DOUTPUT_UNSIGNED_AUDIO
-
-# Support for the GP32 (fmOPL derived) MIDI engine.
-# - NOT fully implemented yet.
-#DEFINES += -DUSE_GP32_FMOPL
-
-
-
-#GP32 Debug - Remove from Release builds
-# This builds in the GP32 GDB USB Stub. Don't use it unless you know what your doing.
-# You also need to remove ANY optemisation from the compiler flags.
-#DEFINES += -DGP32_GDB
-#OBJS += backends/platform/gp32/debug-gdbstub-usb.o
-
-# Standard librarys and optimization modules
-OBJS += backends/platform/gp32/startup.o \
- backends/platform/gp32/memcpy.o \
- backends/platform/gp32/gp_asmlib.o \
- backends/platform/gp32/gp_clipped.o \
- backends/platform/gp32/fontdata.o
-
-# Custom GP32 std library
-OBJS += backends/platform/gp32/gp32std.o \
- backends/platform/gp32/gp32std_file.o \
- backends/platform/gp32/gp32std_grap.o \
- backends/platform/gp32/gp32std_input.o \
- backends/platform/gp32/gp32std_memory.o \
- backends/platform/gp32/gp32std_sound.o \
- #backends/platform/gp32/dmaaudio_asm.o \
- #backends/platform/gp32/dmaaudio.o \
-
-#Main ScummVM for the GP32 Backend
-OBJS += backends/platform/gp32/gp32_main.o \
- backends/platform/gp32/gp32_launcher.o \
- backends/platform/gp32/gp32_osys.o \
- backends/fs/gp32/gp32-fs.o
-
-$(FXE): $(BIN)
- $(FXETOOL) -f -a "The ScummVM Team" -t "ScummVM for the GP32" -b backends/platform/gp32/scummvm.bmp $< $@
-
-$(BIN): scummvm$(EXEEXT)
- $(OBJCOPY) -O binary $< $@
-
-# Uncomment this to use GCC 3.x specific dependency tracking (recommended)
-HAVE_GCC3 = 1
-
-#######################################################################
-# Control which modules are built - uncomment any to disable module #
-#######################################################################
-
-DISABLE_SCALERS = 1
-DISABLE_HQ_SCALERS = 1
-
-ENABLE_SCUMM = STATIC_PLUGIN
-
-# We can play The Dig with GP32 -- without any movies/musics/voices. But who would do that?
-#ENABLE_SCUMM_7_8 = 1
-#ENABLE_HE = 1
-
-ENABLE_AGOS = STATIC_PLUGIN
-ENABLE_SKY = STATIC_PLUGIN
-ENABLE_QUEEN = STATIC_PLUGIN
-ENABLE_GOB = STATIC_PLUGIN
-ENABLE_LURE = STATIC_PLUGIN
-ENABLE_CINE = STATIC_PLUGIN
-ENABLE_SAGA = STATIC_PLUGIN
-ENABLE_KYRA = STATIC_PLUGIN
-ENABLE_AGI = STATIC_PLUGIN
-
-# The engines below are not supported on the GP32 port so there is
-# no point compiling support into the binary.
-#ENABLE_SWORD1 = STATIC_PLUGIN
-#ENABLE_SWORD2 = STATIC_PLUGIN
-
-#######################################################################
-# Misc stuff - you should normally never have to edit this #
-#######################################################################
-
-EXECUTABLE := scummvm$(EXEEXT)
-
-include Makefile.common
-
-dist:
- $(RM) $(ZIPFILE)
- $(ZIP) $(ZIPFILE) $(DISTFILES)
diff --git a/backends/platform/gp32/README.GP32 b/backends/platform/gp32/README.GP32
deleted file mode 100644
index 15120c7303..0000000000
--- a/backends/platform/gp32/README.GP32
+++ /dev/null
@@ -1 +0,0 @@
-TODO. :)
diff --git a/backends/platform/gp32/debug-gdbstub-usb.cpp b/backends/platform/gp32/debug-gdbstub-usb.cpp
deleted file mode 100644
index 76b7fad13b..0000000000
--- a/backends/platform/gp32/debug-gdbstub-usb.cpp
+++ /dev/null
@@ -1,1927 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/*
- *
- * Basic GP32 USB GDB Debug Stub - Use with Multi-firmware that supports GDB
- * Mithris kindly gave me the basic stub code.
- *
- */
-#include <sys/types.h>
-#include <gpcomm.h>
-#include <gpos_def.h>
-#include <gpdef.h>
-#include <gpmain.h>
-#include <gpos_def.h>
-#include <gpstdio.h>
-#include <gpgraphic.h>
-#include <gpfont.h>
-#include <gpstdlib.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-//#define USE_PRINTF // If there is a Printf(const char *pFormat,...) implemented
-
-///////////////////////////////////////////////////////////////
-// Externs
-extern int __text_start;
-extern int __data_start;
-extern int __bss_start;
-#ifdef USE_PRINTF
-extern void Printf(char *pFormat, ...);
-#endif
-///////////////////////////////////////////////////////////////
-
-extern "C" {
- int OpenUSB();
- void InstallISR();
-}
-
-struct g_Namedregisters {
- unsigned int r0;
- unsigned int r1;
- unsigned int r2;
- unsigned int r3;
- unsigned int r4;
- unsigned int r5;
- unsigned int r6;
- unsigned int r7;
- unsigned int r8;
- unsigned int r9;
- unsigned int r10;
- unsigned int r11;
- unsigned int r12;
- unsigned int sp;
- unsigned int lr;
- unsigned int pc;
- unsigned int fps;
- unsigned int fcpsr;
-};
-
-///////////////////////////////////////////////////////////////
-// Defines
-
-
-#define _REG_R1 0
-#define _REG_R2 2
-#define _REG_R3 3
-#define _REG_R4 4
-#define _REG_R5 5
-#define _REG_R6 6
-#define _REG_R7 7
-#define _REG_R8 8
-#define _REG_R9 9
-#define _REG_R10 10
-#define _REG_R11 11
-#define _REG_R12 12
-#define _REG_FP 11
-#define _REG_IP 12
-#define _REG_SL 10
-#define _REG_SP 13
-#define _REG_LR 14
-#define _REG_PC 15
-
-#define PACKET_SIZE 0x100
-
-#define MODE_USER 0
-#define MODE_FIQ 1
-#define MODE_IRQ 2
-#define MODE_SUPERVISOR 3
-#define MODE_ABORT 4
-#define MODE_UNDEF 5
-#define MODE_SYSTEM 6
-#define MODE_DUNNO -1
-
-///////////////////////////////////////////////////////////////
-// Global stuff
-
-// Register array.
-int g_Registers[50] = {1, 2, 3, 4 ,5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 41, 42, 43, 44, 45, 46, 47, 48, 49};
-
-// Register name strings, not used right now.
-static char * arm_register_name_strings[] =
-{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
- "r4", "r5", "r6", "r7", /* 4 5 6 7 */
- "r8", "r9", "r10", "r11", /* 8 9 10 11 */
- "r12", "sp", "lr", "pc", /* 12 13 14 15 */
- "f0", "f1", "f2", "f3", /* 16 17 18 19 */
- "f4", "f5", "f6", "f7", /* 20 21 22 23 */
- "fps", "cpsr" }; /* 24 25 */
-
-
-// Some USB stuff
-GPN_DESC g_CommDesc;
-GPN_COMM g_Comm;
-const char HexDigits[17] = "0123456789abcdef";
-char g_SendBuffer[256];
-char g_TempBuffer[256];
-char g_ReadBuffer[0x100];
-unsigned int g_CurrentCSPR = 0;
-unsigned int g_SavedStepInstruction = 0;
-unsigned int g_StepAddress = 0;
-bool g_LastWasStep = false;
-int g_iTrap = 0;
-bool g_GDBConnected = false;
-///////////////////////////////////////////////////////////////
-
-
-///////////////////////////////////////////////////////////////
-// Prototypes
-void BreakPoint();
-int GetException(unsigned int CSPR);
-unsigned int *GetNextInstruction(unsigned int *pAddr);
-bool CondWillExecute(unsigned int uiCond, unsigned int CSPR);
-unsigned int DecodeInstruction(unsigned int uiInstruction, unsigned int PC);
-
-///////////////////////////////////////////////////////////////
-
-
-///////////////////////////////////////////////////////////////
-// Code Begins here
-///////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////
-// Open usb comms stuff
-int OpenUSB()
-{
- int iResult;
-
- g_CommDesc.port_kind = COMM_USB_D;
- g_CommDesc.tr_mode = 1;
- g_CommDesc.tr_buf_size = PACKET_SIZE;
- g_CommDesc.sz_pkt = PACKET_SIZE;
- g_CommDesc.isr_comm_ram = 0;
-
-
- iResult = GpCommCreate(&g_CommDesc, &g_Comm);
- return iResult;
-}
-
-///////////////////////////////////////////////////////////////
-// No need for explanation
-void CloseUSB()
-{
- GpCommDelete(&g_CommDesc);
-}
-
-///////////////////////////////////////////////////////////////
-// No need for explanation
-int SendUSB(const void *pData, unsigned int uiSize)
-{
- return g_Comm.comm_send((unsigned char *)pData, uiSize);
-}
-
-
-///////////////////////////////////////////////////////////////
-// No need for explanation
-int RecvUSB(char *pBuffer, unsigned int uiSize)
-{
- return g_Comm.comm_recv((unsigned char *)pBuffer, uiSize);
-}
-
-///////////////////////////////////////////////////////////////
-// Waits for an acknowledge from the server
-void WaitACK()
-{
- bool bBreak = false;
- int iResult;
-
- while (!bBreak) {
- iResult = g_Comm.comm_recv((unsigned char *)g_SendBuffer, 0x100);
- if (iResult > 0) {
- bBreak = true;
- }
- }
-}
-///////////////////////////////////////////////////////////////
-// Formats and sends a command to the server,
-// it also calculates checksum
-void SendCommand(unsigned char *pCommand)
-{
- int iOffset;
- unsigned int iCheckSum;
-
- iOffset = 4;
- g_SendBuffer[iOffset++] = '$';
-
- iCheckSum = 0;
- while (*pCommand != 0) {
- g_SendBuffer[iOffset++] = *pCommand;
- iCheckSum += *pCommand++;
- }
-
- g_SendBuffer[iOffset++] = '#';
- iCheckSum = iCheckSum & 0xff;
- g_SendBuffer[iOffset++] = HexDigits[(iCheckSum & 0xf0) >> 4];
- g_SendBuffer[iOffset++] = HexDigits[(iCheckSum & 0x0f)];
- g_SendBuffer[iOffset] = 0;
-
- (*(int *)&g_SendBuffer[0]) = (iOffset - 4);
- SendUSB(g_SendBuffer, 0x100);
- WaitACK();
-}
-
-///////////////////////////////////////////////////////////////
-// This function creates and sends a package which tells gdb that
-// the last command was unsupported
-void UnSupportedCommand()
-{
- (*(int *)&g_SendBuffer[0]) = 4;
- g_SendBuffer[4] = '$';
- g_SendBuffer[5] = '#';
- g_SendBuffer[6] = '0';
- g_SendBuffer[7] = '0';
- g_SendBuffer[8] = '0';
- SendUSB(g_SendBuffer, 0x100);
-
- WaitACK();
-
-}
-
-
-///////////////////////////////////////////////////////////////
-// This function is quite similar to the SendCommand above
-// But it allows the user to set the package length.
-// If the length of a package exceeds 256bytes including
-// the protocol stuff and the package length you can split
-// the packages by sending the package size * -1.
-// The server will then merge all packages until a package
-// with a length >0 is recieved.
-void SendCommandSize(unsigned char *pCommand, int iSize)
-{
- int iOffset;
- unsigned int iCheckSum;
-
- iOffset = 4;
- g_SendBuffer[iOffset++] = '$';
-
- iCheckSum = 0;
- while (*pCommand != 0) {
- g_SendBuffer[iOffset++] = *pCommand;
- iCheckSum += *pCommand++;
- }
-
- g_SendBuffer[iOffset++] = '#';
- iCheckSum = iCheckSum & 0xff;
- g_SendBuffer[iOffset++] = HexDigits[(iCheckSum & 0xf0) >> 4];
- g_SendBuffer[iOffset++] = HexDigits[(iCheckSum & 0x0f)];
- g_SendBuffer[iOffset] = 0;
-
- (*(int *)&g_SendBuffer[0]) = iSize;
- SendUSB(g_SendBuffer, 0x100);
-
- WaitACK();
-}
-
-
-///////////////////////////////////////////////////////////////
-// Writes a 32bit hexadeciman number in ascii to the string.
-void HexToString(char *pString, int iNumber)
-{
- pString[0] = HexDigits[(iNumber >> 28) & 0x0f];
- pString[1] = HexDigits[(iNumber >> 24) & 0x0f];
- pString[2] = HexDigits[(iNumber >> 20) & 0x0f];
- pString[3] = HexDigits[(iNumber >> 16) & 0x0f];
- pString[4] = HexDigits[(iNumber >> 12) & 0x0f];
- pString[5] = HexDigits[(iNumber >> 8) & 0x0f];
- pString[6] = HexDigits[(iNumber >> 4) & 0x0f];
- pString[7] = HexDigits[(iNumber) & 0x0f];
-
-}
-
-///////////////////////////////////////////////////////////////
-// This does the same, but in a differend endian.
-void HexToStringBW(char *pString, int iNumber)
-{
- pString[6] = HexDigits[(iNumber >> 28) & 0x0f];
- pString[7] = HexDigits[(iNumber >> 24) & 0x0f];
- pString[4] = HexDigits[(iNumber >> 20) & 0x0f];
- pString[5] = HexDigits[(iNumber >> 16) & 0x0f];
- pString[2] = HexDigits[(iNumber >> 12) & 0x0f];
- pString[3] = HexDigits[(iNumber >> 8) & 0x0f];
- pString[0] = HexDigits[(iNumber >> 4) & 0x0f];
- pString[1] = HexDigits[(iNumber) & 0x0f];
-
- pString[8] = 0;
-
-}
-
-
-///////////////////////////////////////////////////////////////
-// equiv to strcat i imagine
-void PrintToString(char *pString, char *pOtherString)
-{
- while (*pOtherString != 0) {
- *pString = *pOtherString;
- *pString++;
- *pOtherString++;
- }
-}
-
-///////////////////////////////////////////////////////////////
-// converts "ff" -> 0xff
-unsigned char StringToByte(char *pString)
-{
- unsigned char ucValue = 0;
-
- for (int i = 0; i < 2; i++) {
- ucValue = ucValue << 4;
- switch(pString[i]) {
- case '0':
- break;
- case '1':
- ucValue |= (0x01);
- break;
- case '2':
- ucValue |= (0x02);
- break;
- case '3':
- ucValue |= (0x03);
- break;
- case '4':
- ucValue |= (0x04);
- break;
- case '5':
- ucValue |= (0x05);
- break;
- case '6':
- ucValue |= (0x06);
- break;
- case '7':
- ucValue |= (0x07);
- break;
- case '8':
- ucValue |= (0x08);
- break;
- case '9':
- ucValue |= (0x09);
- break;
- case 'a':
- ucValue |= (0x0a);
- break;
- case 'b':
- ucValue |= (0x0b);
- break;
- case 'c':
- ucValue |= (0x0c);
- break;
- case 'd':
- ucValue |= (0x0d);
- break;
- case 'e':
- ucValue |= (0x0e);
- break;
- case 'f':
- ucValue |= (0x0f);
- break;
-
- }
- }
-
- return ucValue;
-}
-
-///////////////////////////////////////////////////////////////
-// Sends a package with the program offsets to GDB
-// Of some reason all offsets should be NULL.
-void SendOffsets()
-{
- char String[255];
- int a = 0;//(int)&__text_start;
- int b = 0;//(int)&__data_start;
- int c = 0;//(int)&__bss_start;
-
- PrintToString(String, "Text=");
- HexToString(&String[5], a);
- PrintToString(&String[5+8], ";Data=");
- HexToString(&String[5+8+6], b);
- PrintToString(&String[5+8+6+8], ";Bss=");
- HexToString(&String[5+8+6+8+5], c);
- String[5+8+6+8+5+8] = 0;
-
- SendCommand((unsigned char *)String);
-}
-
-///////////////////////////////////////////////////////////////
-// This function dumps all registers to GDB
-// It utilizes the SendCommandSize function to split the package.
-void DumpRegisters()
-{
- char Buffer[0x100];
- // Ugly hack so far.
-
- for (int i = 0; i < 21; i++) {
- //g_Registers[i] = i;
- HexToStringBW(&Buffer[i * 8], g_Registers[i]);
- }
- Buffer[21*8] = 0;
- SendCommandSize((unsigned char *)Buffer, -1 * (21 * 8 + 4));
- for (int i = 0; i < 21; i++) {
- //g_Registers[20 + i] = i;
- HexToStringBW(&Buffer[i * 8], g_Registers[21 + i]);
- }
- Buffer[21*8] = 0;
-
- SendCommandSize((unsigned char *)Buffer, (21 * 8) + 4);
-}
-
-///////////////////////////////////////////////////////////////
-// This function extracts an address from a string.
-void *GetAddr(char *pBuffer)
-{
- int iAddr;
- int i = 0;
- iAddr = 0;
-
- while (pBuffer[i] != ',') {
- iAddr = iAddr << 4;
- switch(pBuffer[i]) {
- case '0':
- //iAddr |=
- break;
- case '1':
- iAddr |= (0x01);
- break;
- case '2':
- iAddr |= (0x02);
- break;
- case '3':
- iAddr |= (0x03);
- break;
- case '4':
- iAddr |= (0x04);
- break;
- case '5':
- iAddr |= (0x05);
- break;
- case '6':
- iAddr |= (0x06);
- break;
- case '7':
- iAddr |= (0x07);
- break;
- case '8':
- iAddr |= (0x08);
- break;
- case '9':
- iAddr |= (0x09);
- break;
- case 'a':
- iAddr |= (0x0a);
- break;
- case 'b':
- iAddr |= (0x0b);
- break;
- case 'c':
- iAddr |= (0x0c);
- break;
- case 'd':
- iAddr |= (0x0d);
- break;
- case 'e':
- iAddr |= (0x0e);
- break;
- case 'f':
- iAddr |= (0x0f);
- break;
-
- }
- i++;
- }
- return (void *)iAddr;
-}
-///////////////////////////////////////////////////////////////
-// This function does pretty much the same, but returns an int
-// I know, some redundant code.
-int GetBytes(char *pBuffer)
-{
- int iBytes = 0;
- int i = 0;
-
-
- while ((pBuffer[i] != '#') && (pBuffer[i] != ':')) {
- iBytes = iBytes << 4;
- switch(pBuffer[i]) {
- case '0':
- //iAddr |=
- break;
- case '1':
- iBytes |= 0x01;
- break;
- case '2':
- iBytes |= 0x02;
- break;
- case '3':
- iBytes |= 0x03;
- break;
- case '4':
- iBytes |= 0x04;
- break;
- case '5':
- iBytes |= 0x05;
- break;
- case '6':
- iBytes |= 0x06;
- break;
- case '7':
- iBytes |= 0x07;
- break;
- case '8':
- iBytes |= 0x08;
- break;
- case '9':
- iBytes |= 0x09;
- break;
- case 'a':
- iBytes |= 0x0a;
- break;
- case 'b':
- iBytes |= 0x0b;
- break;
- case 'c':
- iBytes |= 0x0c;
- break;
- case 'd':
- iBytes |= 0x0d;
- break;
- case 'e':
- iBytes |= 0x0e;
- break;
- case 'f':
- iBytes |= 0x0f;
- break;
-
- }
-
- i++;
- }
- return iBytes;
-}
-
-///////////////////////////////////////////////////////////////
-// This function reads memory and sends it back to GDB.
-void SendMemory(void *pAddr, int iBytes)
-{
- unsigned char *pData;
- unsigned char iData;
- int iBufferPos = 0;
- int iBytesToSend;
- char Byte;
- int i;
-
- pData = (unsigned char *)pAddr;
-
-
- do {
- if (iBytes > 100) {
- iBytesToSend = 100;
- iBytes -= 100;
- } else {
- iBytesToSend = iBytes;
- iBytes = 0;
- }
- iBufferPos = 0;
- for (i = 0; i < iBytesToSend; i+=1) {
- iData = *pData++;
- g_TempBuffer[iBufferPos++] = HexDigits[(iData & 0xf0) >> 4];
- g_TempBuffer[iBufferPos++] = HexDigits[(iData & 0x0f)];
-
- }
- if (iBytes > 0) {
- // This mean that we have not yet sent our last command.
- g_TempBuffer[iBufferPos] = 0;
- SendCommandSize((unsigned char *)g_TempBuffer, -1 * (i + 1 + 4));
- }
- } while (iBytes > 0 );
- g_TempBuffer[iBufferPos] = 0;
- SendCommand((unsigned char *)g_TempBuffer);
-}
-
-
-
-///////////////////////////////////////////////////////////////
-// Does pretty much what it says.
-void WriteMemory(void *pAddr, unsigned int uiBytes, char *pHexString)
-{
- unsigned char *pData = ((unsigned char *)pAddr);
- unsigned int uiOffset = 0;
- unsigned char ucByte;
-
- //Printf("0x%x 0x%x", pAddr, uiBytes);
- for (unsigned int i = 0; i < uiBytes ; i++) {
- ucByte = StringToByte(&pHexString[uiOffset]);
- //Printf("0x%x", ucByte);
- *pData++ = ucByte;
- uiOffset += 2;
- }
- /*
- while (1);
- unsigned int *piData = (unsigned int *)pAddr;
- *piData = 0xe7ffdefe;//0xfedeffe7;
- */
-
-}
-
-
-///////////////////////////////////////////////////////////////
-// Sends the required information about a trap
-// TODO: correct numbers need to be placed there.
-void SendBreakPoint()
-{
- int iOffset = 0;
-
- g_TempBuffer[iOffset++] = 'T';
- g_TempBuffer[iOffset++] = '0';
- g_TempBuffer[iOffset++] = '5';
- g_TempBuffer[iOffset++] = '0';
- g_TempBuffer[iOffset++] = 'd';
- g_TempBuffer[iOffset++] = ':';
- HexToStringBW(&g_TempBuffer[iOffset], g_Registers[_REG_SP]);
- iOffset += 8;
- g_TempBuffer[iOffset++] = ';';
- g_TempBuffer[iOffset++] = '0';
- g_TempBuffer[iOffset++] = 'b';
- g_TempBuffer[iOffset++] = ':';
- HexToStringBW(&g_TempBuffer[iOffset], g_Registers[_REG_FP]);
- iOffset += 8;
- g_TempBuffer[iOffset++] = ';';
- g_TempBuffer[iOffset++] = '0';
- g_TempBuffer[iOffset++] = 'f';
- g_TempBuffer[iOffset++] = ':';
- HexToStringBW(&g_TempBuffer[iOffset], g_Registers[_REG_PC]);
- iOffset += 8;
- g_TempBuffer[iOffset++] = ';';
- g_TempBuffer[iOffset] = 0;
-
- SendCommand((unsigned char *)g_TempBuffer);
-
-
-
-
-}
-
-
-///////////////////////////////////////////////////////////////
-// Finds a character in a string and returns the offset.
-int FindChar(char *pBuffer, char sign)
-{
- int iRetVal = 0;
-
- while (*pBuffer != sign) {
- iRetVal++;
- *pBuffer++;
- }
- return iRetVal;
-}
-
-
-// Attibute naked.
-///////////////////////////////////////////////////////////////
-// This is the ISR(Interrupt Service Routine) which handles
-// All traps, it's basically a context switcher.
-void ISR() __attribute__ ((naked));
-void ISR()
-{
- // Lets snatch the registers!
-
- asm volatile(" \n"
- " str r4, [%0, #0x10] \n"
- " str r5, [%0, #0x14] \n"
- " str r6, [%0, #0x18] \n"
- " str r7, [%0, #0x1C] \n"
- " str r8, [%0, #0x20] \n"
- " str r9, [%0, #0x24] \n"
- " str r10, [%0, #0x28] \n"
- " str r11, [%0, #0x2C] \n"
- " str r12, [%0, #0x30] \n"
-
- " str r14, [%0, #0x3C] \n"
-
- " @// skip 8 * 12byte(96bit) = 0x60 \n"
-
- " mov r4, %0 \n"
- " ldmia sp!, {r0, r1, r2, r3} \n"
- " str r0, [r4, #0x00] \n"
- " str r1, [r4, #0x04] \n"
- " str r2, [r4, #0x08] \n"
- " str r3, [r4,#0x0C] \n"
-
- " mrs r1, SPSR \n"
- " str r1, [r4, #0x48] \n"
- " str r1, [r4,#0xA0] \n"
- " str r1, [r4,#0xA4] \n"
-
- " mrs r1, CPSR \n"
- " mov r2, r1 \n"
-
-
- " @// Let us set the mode to supervisor so we can get r13 and r14 \n"
- " bic r1, r1, #0x1f \n"
- " orr r1, r1, #0x13 \n"
- " msr CPSR_c, r1 \n"
- " @// Just remember that we're in the supervisor stack aswell now \n"
- " str r13, [r4,#0x34] \n"
- " str r14, [r4,#0x38] \n"
- " @// Lets move back to whatever mode we was in. \n"
- " @// Make sure that IRQ's are turned on \n"
- " bic r2, r2, #0x80 \n"
- " msr CPSR_fsxc, r2 \n"
-
-
-
-
- " \n"
- :
- : "r" (g_Registers)
- : "%0", "r1", "r2", "r4");
-
-
- // Get Current CSPR and save LR
- asm volatile(" \n"
- " mrs r0, CPSR \n"
- " str r0, [%0] \n"
-
- " str r14, [%1, #0x40] \n"
- " str r0, [%1, #0x44] \n"
- " str r13, [%1, #0x4C] \n"
- " \n"
- :
- : "r" (&g_CurrentCSPR), "r" (g_Registers)
- : "r0");
-
-
- switch(g_CurrentCSPR & 0x1f) {
- case 0x10: // USER
- g_iTrap = 0;
- break;
- case 0x11: // FIQ
- g_iTrap = 1;
- break;
- case 0x12: // IRQ
- g_iTrap = 2;
- break;
- case 0x13: // Supervisor
- g_iTrap = 3;
- break;
- case 0x17: // Abort
- g_iTrap = 4;
- break;
- case 0x1B: // Undefined/Breakpoint
- // We cannot continue like this!
- g_Registers[15] -= 4;
- g_Registers[16] -= 4;
- g_iTrap = 5;
- break;
- case 0x1F: // System
- g_iTrap = 6;
- break;
- default:
- g_iTrap = -1;
- }
-
-
- #ifdef USE_PRINTF
- Printf("Trap@0x%x:%d", g_Registers[15], g_iTrap);
- #endif
- /*
- switch (g_iTrap) {
- case MODE_USER:
- break;
- case MODE_FIQ:
- break;
- case MODE_IRQ:
- break;
- case MODE_SUPERVISOR:
- break;
- case MODE_ABORT:
- break;
- case MODE_UNDEF:
- break;
- case MODE_SYSTEM:
- break;
- case MODE_DUNNO:
- default:
- while (1);
- }
- */
- SendBreakPoint();
- BreakPoint();
-
- //Printf("0x%x 0x%x", g_Registers[15], g_Registers[16]);
- // Okay, it's time to continue.
-
-
- switch (g_iTrap) {
- case MODE_USER:
- //Printf("Dunno!!\n");
- break;
- case MODE_FIQ:
- //Printf("Dunno!!\n");
- break;
- case MODE_IRQ:
- //Printf("Dunno!!\n");
- break;
- case MODE_SUPERVISOR:
- //Printf("Dunno!!\n");
- break;
- case MODE_ABORT:
- asm volatile(" \n"
- " mov r10, #0 \n"
- " @Invalidate I&D cache \n"
- " mcr p15, 0, r10, c7, c7 \n"
- " @ restore the registers \n"
- " ldr r1,[%0, #0x04] \n"
- " ldr r2,[%0, #0x08] \n"
- " ldr r4,[%0, #0x10] \n"
- " ldr r5,[%0, #0x14] \n"
- " ldr r6,[%0, #0x18] \n"
- " ldr r7,[%0, #0x1C] \n"
- " ldr r8,[%0, #0x20] \n"
- " ldr r9,[%0, #0x24] \n"
- " ldr r10,[%0, #0x28] \n"
- " ldr r11,[%0, #0x2C] \n"
- " ldr r12,[%0, #0x30] \n"
- " ldr r14,[%0, #0x40] \n"
- " ldr r0, [%0, #0x44] \n"
- " msr CPSR_fsxc, r0 \n"
- " ldr r0, [%0, #0x48] \n"
- " msr SPSR_fsxc, r0 \n"
-
- " ldr r0,[%0, #0x00] \n"
- " ldr r3,[%0, #0x0C] \n"
-
- " subs pc, lr, #0x04 \n"
-
- " \n"
- :
- :"r" (g_Registers)
- :"r0");
- break;
- case MODE_UNDEF:
- // This will be the breakpoint i'm gonna test with.
- asm volatile(" \n"
- " mov r10, #0 \n"
- " @Invalidate I&D cache \n"
- " mcr p15, 0, r10, c7, c7 \n"
- " @ restore the registers \n"
- " ldr r1,[%0, #0x04] \n"
- " ldr r2,[%0, #0x08] \n"
- " ldr r4,[%0, #0x10] \n"
- " ldr r5,[%0, #0x14] \n"
- " ldr r6,[%0, #0x18] \n"
- " ldr r7,[%0, #0x1C] \n"
- " ldr r8,[%0, #0x20] \n"
- " ldr r9,[%0, #0x24] \n"
- " ldr r10,[%0, #0x28] \n"
- " ldr r11,[%0, #0x2C] \n"
- " ldr r12,[%0, #0x30] \n"
- " ldr r14,[%0, #0x40] \n"
- " ldr r0, [%0, #0x44] \n"
- " msr CPSR_fsxc, r0 \n"
- " ldr r0, [%0, #0x48] \n"
- " msr SPSR_fsxc, r0 \n"
-
- " ldr r0,[%0, #0x00] \n"
- " ldr r3,[%0, #0x0C] \n"
- " @ The subbing has already been done! \n"
- " @subs pc, lr, #0x04 \n"
- " movs pc, lr \n"
- " \n"
- :
- :"r" (g_Registers)
- :"r0");
-
-
- break;
- case MODE_SYSTEM:
- //Printf("Dunno!!\n");
- break;
- case MODE_DUNNO:
- default:
- //Printf("Dunno!!\n");
- while (1);
- }
-
-
-
-
-}
-
-///////////////////////////////////////////////////////////////
-// Returns which exception occured based on CSPR
-int GetException(unsigned int CSPR)
-{
- switch(CSPR & 0x1f) {
- case 0x10: // USER
- return 0;
- case 0x11: // FIQ
- return 1;
- case 0x12: // IRQ
- return 2;
- case 0x13: // Supervisor
- return 3;
- case 0x17: // Abort
- return 4;
- case 0x1B: // Undefined/Breakpoint
- return 5;
- case 0x1F: // System
- return 6;
- default:
- return -1;
- }
-}
-
-
-///////////////////////////////////////////////////////////////
-// Installs the ISR address into the system RAM
-void InstallISR()
-{
- int *pPointer = (int *)(0x0c7ac040);
- int *pPointer2 = (int *)(0x0c7ac018);
-
- void (*pISR)();
-
- pISR = ISR;
-
- *pPointer = (int)pISR;
- *pPointer2 = (int)pISR;
-
-}
-
-void DEBUG_Print(char *pFormat, ...)
-{
- char Temp[0x100];
- va_list VaList;
- int iLength;
- int iOffset;
- unsigned char MyChar;
-
- if (!g_GDBConnected) return;
-
- va_start(VaList , pFormat);
- vsnprintf(Temp, 0x100, pFormat , VaList);
- va_end(VaList);
-
- iLength = strlen(Temp);
- if (iLength > 100) iLength = 100;
-
- g_TempBuffer[0] = 'O';
- iOffset = 1;
- for (int i = 0; i < iLength; i++) {
- MyChar = (unsigned char)Temp[i];
- g_TempBuffer[iOffset++] = HexDigits[(MyChar & 0xf0) >> 4];
- g_TempBuffer[iOffset++] = HexDigits[(MyChar & 0x0f)];
- }
- g_TempBuffer[iOffset] = 0;
- SendCommand((unsigned char *)g_TempBuffer);
-
-}
-
-
-///////////////////////////////////////////////////////////////
-// The main thread when the GDB thread has control
-void BreakPoint()
-{
- unsigned int *pNextInstruction;
- bool bBreakLoop = false;
- int iResult;
- int iMessageLength;
- int iOffsetAdd;
- int iNullVal = 0;
- void *pAddr;
- int iOffset;
- int iBytes;
-
-
- // Find out if we got here through a STEP command
- if (g_LastWasStep) {
- #ifdef USE_PRINTF
- Printf("I:0x%x 0x%x", *((unsigned int *)(g_Registers[15] + 4)), *((unsigned int *)(g_Registers[15])));
- Printf("S: 0x%x", g_StepAddress);
- #endif
- if ((unsigned int)g_Registers[15] == g_StepAddress) {
- // Yes it was, Lets restore the instruction.
- *((unsigned int *)g_StepAddress) = g_SavedStepInstruction;
- #ifdef USE_PRINTF
- Printf("Restore: 0x%x", g_SavedStepInstruction);
- #endif
- } else {
- while (1);
- }
- g_LastWasStep = false;
- }
-
-
- while (!bBreakLoop) {
- iResult = RecvUSB(g_ReadBuffer, 0x100);
- //Printf("%d\n", iResult);
-
- if (iResult > 0) {
- // If we recieve a package we can assume that GDB is connected.. or smth..:D
- g_GDBConnected = true;
- // Well, we have recieved a package, lets print the contents.
- iMessageLength = *(int *)&g_ReadBuffer[0];
- g_ReadBuffer[4 + iMessageLength] = 0;
- //Printf("%s\n %d", &g_ReadBuffer[4], iMessageLength);
-
- // Let us also send an ACK '+'
- (*(int *)&g_SendBuffer[0]) = 1;
- g_SendBuffer[4] = '+';
- SendUSB((const void *)g_SendBuffer, 0x100);
- WaitACK();
-
- // I can see that i get a bunch of '+' and '-' in the messages.. lets remove them.
- iOffsetAdd = 4;
- while ((g_ReadBuffer[iOffsetAdd] == '+') || (g_ReadBuffer[iOffsetAdd] == '-')) iOffsetAdd++;
-
- // Check whether it's legimit command
- if (g_ReadBuffer[iOffsetAdd] == '$') {
- // Well it is!
- switch(g_ReadBuffer[iOffsetAdd + 1]) {
- case 'H': // Set thread, we're not having any threads.. so.. just return OK
- SendCommand((unsigned char *)"OK");
- break;
- case 'q': // Query, there are some queries, but GDB first asks for Offsets
- switch(g_ReadBuffer[iOffsetAdd + 2]) {
- case 'O': // Offsets
- SendOffsets();
- break;
- case 'C':
- SendCommand((unsigned char *)"QC0000");
- //SendBreakPoint();
- break;
-
- }
- break;
- case '?':
- // This will have to be modified later to send the correct signal.
- SendBreakPoint();
- break;
- case 'g':
- DumpRegisters();
- break;
- case 'm':
- pAddr = GetAddr(&g_ReadBuffer[iOffsetAdd + 2]);
- iOffset = FindChar(&g_ReadBuffer[iOffsetAdd + 2], ',');
- iBytes = GetBytes(&g_ReadBuffer[iOffsetAdd + 2 + iOffset]);
- SendMemory(pAddr, iBytes);
- break;
- case 'X': //Write memory binary, which we DON't support.. ofcourse.
- UnSupportedCommand();
- break;
- case 'P': // Write register
- {
- SendCommand((unsigned char *)"OK");
-
- }
- break;
- case 'M': // Write memory not binary
- {
- pAddr = GetAddr(&g_ReadBuffer[iOffsetAdd + 2]);
- iOffset = FindChar(&g_ReadBuffer[iOffsetAdd + 2], ',');
- iBytes = GetBytes(&g_ReadBuffer[iOffsetAdd + 2 + iOffset]);
- iOffset = FindChar(&g_ReadBuffer[iOffsetAdd + 2], ':');
- WriteMemory(pAddr, iBytes, &g_ReadBuffer[iOffsetAdd + 2 + iOffset + 1]);
- SendCommand((unsigned char *)"OK");
-
- }
- break;
- case 'c': // continue
- {
- return;
-
- }
- break;
-
- case 's': // Stepping.
- {
- // Get the address of the next instruction.
- pNextInstruction = GetNextInstruction((unsigned int *)g_Registers[15]);
-
- // Read whatsever there.
- g_SavedStepInstruction = *pNextInstruction;
- g_StepAddress = (unsigned int)pNextInstruction;
- g_LastWasStep = true;
-
- //Printf("Curr: 0x%x", g_Registers[15]);
- #ifdef USE_PRINTF
- Printf("Next: 0x%x->0x%x", g_Registers[15], pNextInstruction);
- #endif
- //Printf("Trap: 0x%x", GetException((unsigned int)g_Registers[40]));
- // Write a breakpoint instruction to the address.
- *pNextInstruction = 0xe7ffdefe;
- return;
-
- }
- break;
- case 'Z': // BreakPoint.
- {
- switch(g_ReadBuffer[iOffsetAdd + 2]) {
- case '0':
- // Software breakpoint, i think it's up to me to add, it, lets send OK for now.
- UnSupportedCommand();
- break;
- default:
- // We only support software breakpoints for now, lets return unsupported.
- // Actually we don't even support SW breakpoints now
- UnSupportedCommand();
- break;
- }
- }
- break;
-
- default:
- UnSupportedCommand();
- break;
-
- }
- }
-
- }
-
- }
-
-}
-
-///////////////////////////////////////////////////////////////
-// Tries to find the next instruction to be executed after a break
-unsigned int *GetNextInstruction(unsigned int *pAddr)
-{
- unsigned int uiInstruction = *pAddr;
- unsigned int uiAndVal = 0;
- unsigned int iNewPC = 0;
- int iNewAddr = 0;
- int iRegsbeforePC = 0;
- unsigned int uiBaseRegister = 0;
- unsigned int uiRegVal = 0;
- unsigned int uiData = 0;
- unsigned int uiCondMask = 0;
- int iPCOffset = 0;
-
- unsigned int uiNewPC = DecodeInstruction(uiInstruction, (unsigned int)pAddr);
- return (unsigned int *)uiNewPC;
-
-
- // Set new PC to pAddr + 4, because we really hope that is the case...:D
- iNewPC = (unsigned int)pAddr;
- iNewPC += 4; // Next instruction (atleast in ARM mode, we don't support thumb yet)
-
- // Now it's a good point to find out if the instruction would be executed anyway.
- uiCondMask = (uiInstruction & 0xf0000000) >> 28;
-
- if (CondWillExecute(uiCondMask, (unsigned int)g_Registers[18])) {
- //Printf("Condition will execute");
- // Find out if it's a B or BL instruction. (This is the easy one)
- if ((uiInstruction & 0xE000000 ) == 0xA000000) {
- #ifdef USE_PRINTF
- Printf("0x%x", uiInstruction);
- #endif
- // Okay, it's a branch instruction, lets get the address it's for
- iNewAddr = uiInstruction & 0xffffff;
- // We might need to sign extend this instruction.
- if ((iNewAddr & 0x00800000) != 0) {
- #ifdef USE_PRINTF
- printf("Sign extending");
- #endif
- //iNewAddr *= -1;
- iNewAddr |= 0xff000000;
- }
- #ifdef USE_PRINTF
- Printf("0x%x", iNewAddr);
- #endif
- iNewAddr *= 4; // Instruction size.
- iNewPC = ((int)pAddr + iNewAddr + 8);
- }
-
- // Well, it might be a ldm(ea)?
-
- if ((uiInstruction & 0xE000000) == 0x8000000) {
- #ifdef USE_PRINTF
- Printf("LDM");
- #endif
- // this is a LDM/STM alright.
- if ((uiInstruction & 0x100000) != 0) {
- // This is a LDM instruction
- // Lets see if the PC is ever loaded.
- #ifdef USE_PRINTF
- Printf("includes PC");
- #endif
- if ((uiInstruction & 0x8000) != 0) {
- // Well (damn the PC is loaded)
- for (int i = 0; i < 15; i++) {
- uiAndVal = 1 << i;
- if ((uiInstruction & uiAndVal) != 0) iRegsbeforePC++;
- }
- #ifdef USE_PRINTF
- Printf("%d regs", iRegsbeforePC);
- #endif
- /*
- <mr_spiv> da = fa
- <mr_spiv> ia = fd
- <mr_spiv> db = ea
- <mr_spiv> ib = ed
- */
- // Lets find out which register is used as base for this operation.
- uiBaseRegister = (uiInstruction & 0xF0000) >> 16;
- uiRegVal = ((unsigned int *)g_Registers)[uiBaseRegister];
- // First, have a look at the U bit.
- if ((uiInstruction & (1 << 23)) != 0) {
-
- // Transfer is made descending
- // Which also means that the PC is closest to the base register i just found out.
- // Lets check the P bit (If i'm supposed to increment before or after.
-
- iPCOffset = iRegsbeforePC * 4;
- if (((uiInstruction) & (1 << 24)) != 0) iPCOffset += 4;
-
- } else {
- // Transfer is done ascending
- // Lets check the P bit (If i'm supposed to decrement before or after.
- if (((uiInstruction) & (1 << 24)) != 0) iPCOffset = -4;
- }
-
-
- iNewPC = *(unsigned int *)((((int)uiRegVal) + iPCOffset) & ~0x03);
- }
- }
- }
-
- // Check if it's a mov pc, Rn
-
- }
-
- return (unsigned int *)iNewPC;
-}
-
-///////////////////////////////////////////////////////////////
-// Determines if uiCond will be true with this CSPR
-bool CondWillExecute(unsigned int uiCond, unsigned int CSPR)
-{
-
- switch(uiCond) {
- case 0: // EQ
- // This is true if Z is set in CSPR
- if ((CSPR & (1 << 30)) != 0) return true;
- else return false;
- case 1: // NE
- // This should be true if Z is not set.
- if ((CSPR & (1 << 30)) == 0) return true;
- else return false;
- case 2: // CS/HS
- // this one should be true if C is set.
- if ((CSPR & (1 << 29)) != 0) return true;
- else return false;
- case 3: // CC/LO
- // this one should be true if C is clear.
- if ((CSPR & (1 << 29)) == 0) return true;
- else return false;
- case 4: // MI
- // this one should be true if N is set
- if ((CSPR & (1 << 31)) != 0) return true;
- else return false;
- case 5: // PL
- // this one should be true if N is clear.
- if ((CSPR & (1 << 31)) == 0) return true;
- else return false;
- case 6: // VS
- // this one should be true if V is set
- if ((CSPR & (1 << 28)) != 0) return true;
- else return false;
- case 7: // VC
- // this one should be true if V is clear.
- if ((CSPR & (1 << 28)) == 0) return true;
- else return false;
- case 8: // HI
- // This is true if C and Z is clear
- if (((CSPR & (1 << 30)) == 0) && ((CSPR & (1 << 29)) == 0)) return true;
- else return false;
- case 9: // LS
- // C clear OR Z set
- if (((CSPR & (1 << 29)) == 0) || ((CSPR & (1 << 30)) != 0)) return true;
- else return false;
- case 10: // GE
- // N set AND V set || N clear and V clear
- if ((CSPR & (1 << 31)) == (CSPR & (1 << 28))) return true;
- else return false;
- case 11: // LT
- // N != V
- if ((CSPR & (1 << 31)) != (CSPR & (1 << 28))) return true;
- else return false;
- case 12: // GT
- // Z == 0, N == V
- if (((CSPR & (1 << 30)) == 0) && ((CSPR & (1 << 31)) == (CSPR & (1 << 28)))) return true;
- else return false;
- case 13: // LE
- if (((CSPR & (1 << 30)) == 1) && ((CSPR & (1 << 31)) != (CSPR & (1 << 28)))) return true;
- else return false;
- case 14: // AL
- return true;
- default:
- break;
- }
-
-
-}
-// I got the idea for this layout from the singlestep.c (found in eCos)
-// But i thought the code was a bit tricky to port, and i wanna learn more about this anyway so, i'll just do smth similar to that
-
-
-
-typedef struct
-{
- unsigned Rm : 4; // Rm
- unsigned resv2 : 1; // Reserved 2 (0)
- unsigned shift : 2; // hmm.. dunno actually but probably (LSL, LSR, ASR, ROR )
- unsigned amount : 5; // Shift amount 0-31
- unsigned Rd : 4; // Rd
- unsigned Rn : 4; // Rn
- unsigned s : 1; // S-flag
- unsigned opcode : 4; // Opcode (Mov etc)
- unsigned resv1 : 3; // Reserved 1 (000)
- unsigned cond : 4; // Condition
-
-} dpisr; // Data Processing Immediate Register Shift
-#define DPISR_R1 0
-#define DPISR_R2 0
-// Example <opcode> Rd, Rm, <shift> amount
-typedef struct
-{
- unsigned Rm : 4; // Rm
- unsigned resv3 : 1; // Reserved 3 (1)
- unsigned shift : 2; // (LSL, LSR, ASR, ROR )
- unsigned resv2 : 1; // Reserved 2 (0)
- unsigned Rs : 4; // Rs
- unsigned Rd : 4; // Rd
- unsigned Rn : 4; // Rn
- unsigned s : 1; // S-flag
- unsigned opcode : 4; // Opcode
- unsigned resv1 : 3; // Reserved 1 (000)
- unsigned cond : 4; // Condition
-} dprrs; // Data Processing Register Register Shift
-#define DPRRS_R1 0
-#define DPRRS_R2 0
-#define DPRRS_R3 1
-// Example <opcode> Rd, Rn, Rm <shift> Rs
-// This intruction is unpredictable if R15 is one of the used registers anyway.
-typedef struct
-{
- unsigned immed : 8; // Immediate value
- unsigned rotate : 4; // rotate
- unsigned Rd : 4; // Rd
- unsigned Rn : 4; // Rn
- unsigned s : 1; // S-flag
- unsigned opcode : 4; // Opcode
- unsigned resv1 : 3; // Reserved 1 (001)
- unsigned cond : 4; // Condition
-} dpi; // Data processing immediate
-// example add r0, r1, (ror <immed>, <rotate * 2>)
-#define DPI_R1 1
-
-typedef struct
-{
- unsigned immed : 12; // Immediate
- unsigned Rd : 4; // Rd
- unsigned Rn : 4; // Rn
- unsigned L : 1; // L-bit (Load/Store)?
- unsigned W : 1; // W-bit
- unsigned B : 1; // B-bit
- unsigned U : 1; // U-bit
- unsigned p : 1; // P-bit
- unsigned resv1 : 3; // Reserved 1 (010)
- unsigned cond : 4; // Condition
-} lsio; // Load/store immediate offset
-// Example ldr Rd, [Rn, #<immed>]
-#define LSIO_R1 2
-
-
-typedef struct
-{
- unsigned Rm : 4; // Rm
- unsigned resv2 : 1; // Reserved 2 (0)
- unsigned shift : 2; // Shit type (LSL, LSR, ASR, ROR )
- unsigned amount : 5; // Shift amount (0-31)
- unsigned Rd : 4; // Rd
- unsigned Rn : 4; // Rn
- unsigned L : 1; // L-bit (Load/Store)?
- unsigned W : 1; // W-bit
- unsigned B : 1; // B-bit
- unsigned U : 1; // U-bit
- unsigned p : 1; // P-bit
- unsigned resv1 : 3; // Reserved 1 (011)
- unsigned cond : 4; // Condition
-} lsro; // Load/Store register offset
-// Example ldr Rd, [Rn + Rm lsl 5]
-#define LSRO_R1 3
-#define LSRO_R2 0
-
-
-typedef struct
-{
- unsigned regs : 16; // Register mask
- unsigned Rn : 4; // Rn
- unsigned L : 1; // L-bit (Load/Store)?
- unsigned W : 1; // W-bit
- unsigned S : 1; // B-bit
- unsigned U : 1; // U-bit
- unsigned p : 1; // P-bit
-
- unsigned resv1 : 3; // Reserved 1 (100)
- unsigned cond : 4; // Condition
-} lsm; // Load store multiple
-// Example: ldm r0, {r1, r2, r3}
-#define LSM_R1 4
-
-typedef struct
-{
- unsigned offset : 24; // Branch offset
- unsigned link : 1; // Link flag
- unsigned resv1 : 3; // Reserved 1 (101)
- unsigned cond : 4; // Condition
-} bl; // Branch with link(optional)
-#define BL_R1 5
-
-typedef union {
- dpisr DPISR;
- dprrs DPRRS;
- dpi DPI;
- lsio LSIO;
- lsro LSRO;
- lsm LSM;
- bl BL;
- unsigned int uiInstruction;
-} Instruction;
-
-/*
-#define DPISR_R1 0
-#define DPISR_R2 0
-
-
-#define DPRRS_R1 0
-#define DPRRS_R2 0
-#define DPRRS_R3 1
-
-#define DPI_R1 1
-
-#define LSIO_R1 2
-
-#define LSRO_R1 3
-#define LSRO_R2 0
-
-#define LSM_R1 4
-
-#define BL_R1 5
-*/
-
-/*
- * Data Processiong Opcode field values
- */
-#define OPCODE_MOV 0xD
-#define OPCODE_MVN 0xF
-#define OPCODE_ADD 0x4
-#define OPCODE_ADC 0x5
-#define OPCODE_SUB 0x2
-#define OPCODE_SBC 0x6
-#define OPCODE_RSB 0x3
-#define OPCODE_RSC 0x7
-#define OPCODE_AND 0x0
-#define OPCODE_EOR 0x1
-#define OPCODE_ORR 0xC
-#define OPCODE_BIC 0xE
-#define OPCODE_CMP 0xA
-#define OPCODE_CMN 0xB
-#define OPCODE_TST 0x8
-#define OPCODE_TEQ 0x9
-
-/*
- * Shift field values
- */
-#define SHIFT_LSL 0x0
-#define SHIFT_LSR 0x1
-#define SHIFT_ASR 0x2
-#define SHIFT_ROR 0x3
-#define SHIFT_RRX 0x3 /* Special case: ROR(0) implies RRX */
-
-
-unsigned int DecodeDPISR(dpisr Instr, unsigned int PC);
-unsigned int DecodeDPRRS(dprrs Instr, unsigned int PC);
-unsigned int DecodeDPI(dpi Instr, unsigned int PC);
-unsigned int DecodeLSIO(lsio Instr, unsigned int PC);
-unsigned int DecodeLSRO(lsro Instr, unsigned int PC);
-unsigned int DecodeLSM(lsm Instr, unsigned int PC);
-unsigned int DecodeBL(bl Instr, unsigned int PC);
-
-
-///////////////////////////////////////////////////////////////
-//
-unsigned int DecodeInstruction(unsigned int uiInstruction, unsigned int PC)
-{
- Instruction myInstruction;
- unsigned int uiCondMask;
-
- uiCondMask = (uiInstruction & 0xf0000000) >> 28;
-
- // This instruction can do whatever it wants, but if it doesn't execute we don't give a shit.
- if (!CondWillExecute(uiCondMask, (unsigned int)g_Registers[18])) return PC + 4;
- //Printf("CondWillExec");
-
- myInstruction.uiInstruction = uiInstruction;
-
- // Start decoding.. phuu
-
- if ((myInstruction.DPISR.resv1 == DPISR_R1) && (myInstruction.DPISR.resv2 == DPISR_R2)) return DecodeDPISR(myInstruction.DPISR, PC);
- else if ((myInstruction.DPRRS.resv1 == DPRRS_R1) &&
- (myInstruction.DPRRS.resv2 == DPRRS_R2) &&
- (myInstruction.DPRRS.resv3 == DPRRS_R3)) return DecodeDPRRS(myInstruction.DPRRS, PC);
- else if ((myInstruction.DPI.resv1 == DPI_R1)) return DecodeDPI(myInstruction.DPI, PC);
- else if ((myInstruction.LSIO.resv1 == LSIO_R1)) return DecodeLSIO(myInstruction.LSIO, PC);
-
- else if ((myInstruction.LSRO.resv1 == LSRO_R1) &&
- (myInstruction.LSRO.resv2 == LSRO_R2)) return DecodeLSRO(myInstruction.LSRO, PC);
- else if (myInstruction.LSM.resv1 == LSM_R1) return DecodeLSM(myInstruction.LSM, PC);
- else if (myInstruction.BL.resv1 == BL_R1) return DecodeBL(myInstruction.BL, PC);
-
- return 0;
-}
-
-///////////////////////////////////////////////////////////////
-//
-unsigned int LSL(unsigned int uiValue, unsigned int uiSteps)
-{
- return uiValue << uiSteps;
-}
-
-///////////////////////////////////////////////////////////////
-//
-unsigned int LSR(unsigned int uiValue, unsigned int uiSteps)
-{
- return uiValue >> uiSteps;
-}
-
-///////////////////////////////////////////////////////////////
-//
-// This one could be trickier since, i'm nor sure if a signed shift really is a signed shift.
-unsigned int ASR(unsigned int uiValue, unsigned int uiSteps)
-{
- unsigned int uiSignMask = 0;
-
- // Check if it's a negative number
- if (uiValue & 0x80000000) {
- // Yes, damn
- uiSignMask = ((~0) << (32 - uiSteps));
- }
-
- return ((uiValue >> uiSteps) | uiSignMask);
-}
-
-///////////////////////////////////////////////////////////////
-//
-unsigned int ROR(unsigned int uiValue, unsigned int uiSteps)
-{
- unsigned int uiRetval;
-
- while (uiSteps-- > 0) {
- if (uiValue & 0x01) {
- uiValue = (uiValue >> 1) | 0x80000000;
- } else {
- uiValue = uiValue >> 1;
- }
- }
- return uiValue;
-}
-
-
-///////////////////////////////////////////////////////////////
-//
-unsigned int Shift_Operand(unsigned int Rm, unsigned int amount, unsigned int shift)
-{
- unsigned int uiRegisterValue;
-
-
-
-
- uiRegisterValue = g_Registers[Rm];
- if (Rm == 0x0f) {
- // Rm is PC, and PC is offseted by 8.
- uiRegisterValue += 8;
- }
-
- // Determine the shift mode.
- //(LSL, LSR, ASR, ROR )
- switch (shift) {
- case 0: // LSL
- return LSL(uiRegisterValue, amount);
- case 1: // LSR
- return LSR(uiRegisterValue, amount);
- case 2: // ASR
- return ASR(uiRegisterValue, amount);
- case 3: // ROR
- return ROR(uiRegisterValue, amount);
- default:
- break;
- }
- return 0;
-}
-
-///////////////////////////////////////////////////////////////
-//
-// Example <opcode> Rd, Rm, <shift> amount
-unsigned int DecodeDPISR(dpisr Instr, unsigned int uiPC)
-{
- unsigned int uiOperand = Shift_Operand(Instr.Rm, Instr.amount, Instr.shift);
- unsigned int uiRnVal = g_Registers[Instr.Rn];
-
-
-
- // Only do this i Pc is Rd
- if (Instr.Rd != 0x0f) return uiPC + 4;
-
- // The actual value that PC contains when executing this instruction is the instruction address+8
- if (Instr.Rn == 0x0f) uiRnVal += 8;
-
- // Check what opcode it is!
- switch (Instr.opcode) {
- case OPCODE_MOV:
- return uiOperand;
- case OPCODE_MVN:
- return ~uiOperand;
- case OPCODE_ADD:
- return uiRnVal + uiOperand;
- case OPCODE_ADC:
- return uiRnVal + uiOperand + (((g_Registers[18] & (1 << 29))) == 0?0:1);
- case OPCODE_SUB:
- return uiRnVal - uiOperand;
- case OPCODE_SBC:
- return uiRnVal - uiOperand - (((g_Registers[18] & (1 << 29))) == 0?1:0);
- case OPCODE_RSB:
- return uiOperand - uiRnVal;
- case OPCODE_RSC:
- return uiOperand - uiRnVal - (((g_Registers[18] & (1 << 29))) == 0?1:0);
- case OPCODE_AND:
- return (uiRnVal & uiOperand);
- case OPCODE_EOR:
- return (uiRnVal^uiOperand);
- case OPCODE_ORR:
- return (uiRnVal | uiOperand);
- case OPCODE_BIC:
- return (uiRnVal & ~uiOperand);
- default:
- return 0;
- }
-}
-
-
-///////////////////////////////////////////////////////////////
-//
-//dprrs; // Data Processing Register Register Shift
-// Example <opcode> Rd, Rn, Rm <shift> Rs
-unsigned int DecodeDPRRS(dprrs Instr, unsigned int uiPC)
-{
- unsigned int uiRmValue = g_Registers[Instr.Rm];
- unsigned int uiRsValue = g_Registers[Instr.Rs];
- unsigned int uiRnVal = g_Registers[Instr.Rn];
- if ((Instr.Rm = 0x0f)) uiRmValue += 8;
-
-
- unsigned int uiOperand = Shift_Operand(uiRmValue, uiRsValue, Instr.shift);
-
- // Check if destination is PC
- if (Instr.Rd != 0x0f) return uiPC + 4;
- if ((Instr.Rn = 0x0f)) uiRnVal += 8;
-
- // Check what opcode it is!
- switch (Instr.opcode) {
- case OPCODE_MOV:
- return uiOperand;
- case OPCODE_MVN:
- return ~uiOperand;
- case OPCODE_ADD:
- return uiRnVal + uiOperand;
- case OPCODE_ADC:
- return uiRnVal + uiOperand + (((g_Registers[18] & (1 << 29))) == 0?0:1);
- case OPCODE_SUB:
- return uiRnVal - uiOperand;
- case OPCODE_SBC:
- return uiRnVal - uiOperand - (((g_Registers[18] & (1 << 29))) == 0?1:0);
- case OPCODE_RSB:
- return uiOperand - uiRnVal;
- case OPCODE_RSC:
- return uiOperand - uiRnVal - (((g_Registers[18] & (1 << 29))) == 0?1:0);
- case OPCODE_AND:
- return (uiRnVal & uiOperand);
- case OPCODE_EOR:
- return (uiRnVal^uiOperand);
- case OPCODE_ORR:
- return (uiRnVal | uiOperand);
- case OPCODE_BIC:
- return (uiRnVal & ~uiOperand);
- default:
- return 0;
- }
-
-}
-
-///////////////////////////////////////////////////////////////
-//
-// dpi; // Data processing immediate
-// example add r0, r1, (ror <immed>, <rotate * 2>)
-unsigned int DecodeDPI(dpi Instr, unsigned int uiPC)
-{
- unsigned int uiOperand = (ROR(Instr.immed, Instr.rotate << 1));
- unsigned int uiRnVal = g_Registers[Instr.Rn];
-
- // Check if PC is destination
- if (Instr.Rd != 0x0f) return uiPC + 4; // Next instruction
- if ((Instr.Rn = 0x0f)) uiRnVal += 8;
-
- // Check what opcode it is!
- switch ((Instr.opcode)) {
- case OPCODE_MOV:
- return uiOperand;
- case OPCODE_MVN:
- return ~uiOperand;
- case OPCODE_ADD:
- return uiRnVal + uiOperand;
- case OPCODE_ADC:
- return uiRnVal + uiOperand + (((g_Registers[18] & (1 << 29))) == 0?0:1);
- case OPCODE_SUB:
- return uiRnVal - uiOperand;
- case OPCODE_SBC:
- return uiRnVal - uiOperand - (((g_Registers[18] & (1 << 29))) == 0?1:0);
- case OPCODE_RSB:
- return uiOperand - uiRnVal;
- case OPCODE_RSC:
- return uiOperand - uiRnVal - (((g_Registers[18] & (1 << 29))) == 0?1:0);
- case OPCODE_AND:
- return (uiRnVal & uiOperand);
- case OPCODE_EOR:
- return (uiRnVal^uiOperand);
- case OPCODE_ORR:
- return (uiRnVal | uiOperand);
- case OPCODE_BIC:
- return (uiRnVal & ~uiOperand);
- default:
- return 0;
- }
-
-}
-
-///////////////////////////////////////////////////////////////
-//
-// lsio; // Load/store immediate offset
-// Example ldr Rd, [Rn, #<immed>]
-unsigned int DecodeLSIO(lsio Instr, unsigned int uiPC)
-{
- unsigned int uiRnValue = g_Registers[Instr.Rn];
- unsigned int uiMemValue;
-
- // Check if destination is PC
- if (Instr.Rd != 0x0f) return uiPC + 4;
- // Check if it's a LDR instruction
- if (Instr.L != 1) return uiPC + 4;
-
- if (Instr.Rn == 0x0f) uiRnValue += 8;
-
- // Check if it's pre-indexed
- if (Instr.p == 1){
-
- if (Instr.U == 1) {
- // Add offset
- uiRnValue += Instr.immed;
- } else {
- // Sub offset
- uiRnValue -= Instr.immed;
- }
- }
-
- uiMemValue = *(unsigned int *)(uiRnValue);
-
- return uiMemValue;
-
-}
-
-///////////////////////////////////////////////////////////////
-//
-// lsro; // Load/Store register offset
-// Example ldr Rd, [Rn + Rm lsl 5]
-unsigned int DecodeLSRO(lsro Instr, unsigned int uiPC)
-{
- unsigned int uiRnValue = g_Registers[Instr.Rn];
- unsigned int uiRmValue = g_Registers[Instr.Rm];
- unsigned int uiIndex;
- unsigned int uiMemValue;
-
- if (Instr.Rm == 0x0f) uiRmValue += 8;
- if (Instr.Rn == 0x0f) uiRnValue += 8;
-
- // Check if destination is PC and that it's LDR instruction
- if ((Instr.Rd != 0x0f) || (Instr.L != 1)) return uiPC + 4;
-
- uiIndex = Shift_Operand(Instr.Rm, Instr.amount, Instr.shift);
-
- if (Instr.p == 1){
-
- if (Instr.U == 1) {
- // Add offset
- uiRnValue += uiIndex;
- } else {
- // Sub offset
- uiRnValue -= uiIndex;
- }
- }
-
- uiMemValue = *(unsigned int *)(uiRnValue);
-
- return uiMemValue;
-
-
-}
-///////////////////////////////////////////////////////////////
-//
-// lsm; // Load store multiple
-// Example: ldm r0, {r1, r2, r3}
-unsigned int DecodeLSM(lsm Instr, unsigned int uiPC)
-{
- unsigned int uiRnValue = g_Registers[Instr.Rn];
- unsigned int uiOffsetToPC = 0;
- unsigned int uiMemValue;
-
- // Make sure PC is destination and it's Load instruction
- if (((Instr.regs & (1 << 15)) == 0) || (Instr.L != 1)) return uiPC + 4;
-
-
- // Check if U bit it set
- if (Instr.U == 0) {
- // This means that it's ascending
- // Also means that the PC is closest to Rn
- if (Instr.p == 1) {
- // Pre decrement.
- uiOffsetToPC -= 4;
- } else {
- uiOffsetToPC = 0;
- }
- } else {
- // The stack is descending, that means that the PC is as far away as possible.
- // Lets find out how many registers before it.
- for (int i = 0; i < 15; i++) {
- if ((Instr.regs & (1 << i)) != 0) uiOffsetToPC += 4;
- }
-
- // If the P bit is set, it uses pre increment
- if (Instr.p == 1) uiOffsetToPC += 4;
- }
-
- // read from out calculated address.
- uiMemValue = *(unsigned int *)((uiRnValue + uiOffsetToPC) & ~0x03);
-
- return uiMemValue;
-
-}
-
-///////////////////////////////////////////////////////////////
-//
-// bl; // Branch with link(optional)
-unsigned int DecodeBL(bl Instr, unsigned int uiPC)
-{
- //Printf("Decode BL");
- unsigned int uiAddress;
-
- uiAddress = Instr.offset;
- if (uiAddress & 0x00800000) {
- uiAddress |= 0xff000000;
- }
-
- uiAddress <<= 2;
- uiAddress += 8;
-
- return uiPC + uiAddress;
-
-}
diff --git a/backends/platform/gp32/fontdata.c b/backends/platform/gp32/fontdata.c
deleted file mode 100644
index 56f778ce2c..0000000000
--- a/backends/platform/gp32/fontdata.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-const unsigned char fontresEng1[] =
-{
- 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x81,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xFF,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x36,0x7F,0x7F,0x7F,0x7F,0x3E,0x1C,0x08,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x08,0x1C,0x3E,0x7F,0x3E,0x1C,0x08,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x3C,0x3C,0x7E,0x66,0x7E,0x18,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x3C,0x3C,0x7E,0x7E,0x3C,0x18,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0F,0x07,0x0D,0x19,0x3C,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x33,0x3C,0x33,0x30,0x70,0xF0,0x70,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x40,0x60,0x70,0x7C,0x7F,0x7C,0x70,0x60,0x40,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x01,0x03,0x07,0x1F,0x7F,0x1F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x33,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x3E,0x63,0x30,0x1C,0x36,0x63,0x63,0x36,0x1C,0x06,0x63,0x3E,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x7F,0x06,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x18,0x30,0x7F,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x08,0x1C,0x1C,0x3E,0x3E,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x7F,0x7F,0x3E,0x3E,0x1C,0x1C,0x08,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x18,0x18,0x3C,0x66,0x60,0x3C,0x06,0x06,0x66,0x3C,0x18,0x18,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18,0x30,0x63,0x43,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x0C,0x06,0x06,0x06,0x06,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,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,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x01,0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x6E,0x76,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x06,0x0C,0x18,0x30,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x06,0x1C,0x06,0x06,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0C,0x1C,0x3C,0x6C,0x6C,0x7E,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x60,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x60,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x06,0x06,0x0C,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3E,0x06,0x06,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x6E,0x6E,0x6E,0x60,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x60,0x60,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x6E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x6C,0x78,0x70,0x78,0x6C,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x63,0x77,0x7F,0x6B,0x6B,0x63,0x63,0x63,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x76,0x7E,0x6E,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x04,0x06,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x60,0x3C,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x60,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x40,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x3C,0x66,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,0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3C,0x66,0x60,0x78,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x06,0x00,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x77,0x7F,0x6B,0x6B,0x6B,0x6B,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x6C,0x7E,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x06,0x06,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x6E,0x78,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x38,0x0C,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x30,0x30,0x7C,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x7F,0x36,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0x18,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x7E,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x7F,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x3C,0x66,0xC2,0xC0,0xC2,0x66,0x3C,0x18,0x0E,0x0C,0x78,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x66,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x06,0x0C,0x18,0x00,0x3E,0x63,0x7F,0x60,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x1C,0x36,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x30,0x18,0x0C,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x1C,0x36,0x1C,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x1C,0x36,0x00,0x3E,0x63,0x7F,0x60,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x00,0x3E,0x63,0x7F,0x60,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x30,0x18,0x0C,0x00,0x3E,0x63,0x7F,0x60,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x66,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x63,0x63,0x08,0x1C,0x36,0x63,0x63,0x7F,0x63,0x63,0x00,0x00,0x00,0x00,
- 0x00,0x1C,0x36,0x1C,0x00,0x1C,0x36,0x63,0x63,0x7F,0x63,0x63,0x00,0x00,0x00,0x00,
- 0x00,0x0C,0x18,0x30,0x00,0x7F,0x33,0x30,0x3E,0x30,0x33,0x7F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1F,0x36,0x66,0x66,0x7F,0x66,0x66,0x66,0x67,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x1C,0x36,0x00,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x63,0x63,0x00,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x30,0x18,0x0C,0x00,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x3C,0x66,0x00,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x30,0x18,0x0C,0x00,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x63,0x63,0x00,0x63,0x63,0x63,0x63,0x3F,0x03,0x06,0x3C,0x00,0x00,
- 0x00,0x00,0x63,0x63,0x1C,0x36,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x63,0x63,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x18,0x7E,0xC3,0xC0,0xC0,0xC3,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x1C,0x36,0x32,0x30,0x78,0x30,0x30,0x30,0x73,0x7E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xC3,0x66,0x3C,0x18,0xFF,0x18,0xFF,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0xF3,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0xD8,0x70,0x00,0x00,
- 0x00,0x00,0x0C,0x18,0x30,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0C,0x18,0x30,0x00,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0C,0x18,0x30,0x00,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x3B,0x6E,0x00,0x6E,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00,
- 0x00,0x3B,0x6E,0x00,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63,0x63,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30,0x63,0x63,0x3E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x60,0xE0,0x63,0x66,0x6C,0x18,0x30,0x6E,0xC3,0x06,0x0C,0x1F,0x00,0x00,
- 0x00,0x00,0x60,0xE0,0x63,0x66,0x6C,0x18,0x33,0x67,0xCF,0x1F,0x03,0x03,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x1B,0x36,0x6C,0x36,0x1B,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x6C,0x36,0x1B,0x36,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,
- 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,
- 0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x36,0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
- 0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
- 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x6E,0x6C,0x6C,0x6E,0x3B,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x7E,0x63,0x63,0x7E,0x60,0x60,0x20,0x00,0x00,
- 0x00,0x00,0x00,0x7F,0x63,0x63,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x7F,0x36,0x36,0x36,0x36,0x36,0x36,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7F,0x63,0x30,0x18,0x0C,0x18,0x30,0x63,0x7F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x6C,0x6C,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x3E,0x30,0x30,0x60,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3F,0x6C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x7F,0x63,0x63,0x36,0x1C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x36,0x36,0x36,0x77,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x03,0x06,0x7E,0xDB,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x30,0x1C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x7F,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0xFF,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,
- 0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3B,0x6E,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x3C,0x1C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x70,0xD8,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-};
diff --git a/backends/platform/gp32/gfx_splash.h b/backends/platform/gp32/gfx_splash.h
deleted file mode 100644
index 6e1081ca6e..0000000000
--- a/backends/platform/gp32/gfx_splash.h
+++ /dev/null
@@ -1,4870 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/////////////////////////////////////////
-//
-// Header file for GP32
-//
-// convertion of gfx_splash.bmp file :
-// Width = 320
-// Heigth = 240
-// GP32 Mode = 8 Bits per Pixel
-//
-// with GP32Converter coded by Edorul :
-// http://www.ifrance.com/edorul/
-// edorul@free.fr
-//
-/////////////////////////////////////////
-
-#define gfx_splash_width 320
-#define gfx_splash_height 240
-
-#define gfx_splash_palnb 256
-
-#include <gpgraphic.h>
-
-GP_PALETTEENTRY gfx_splash_Pal[256] = {
- 0x843, 0x88B, 0x1941, 0x110D, 0x2883, 0x30C9, 0x2945, 0x2109, 0x214D, 0x2989, 0x218F, 0x3149, 0x394D, 0x3989, 0x318D, 0x8D1,
- 0x1153, 0x9D9, 0x2993, 0x29DB, 0x1A01, 0x3243, 0x3A4B, 0x3B01, 0x1A15, 0x125B, 0x3255, 0x329B, 0x3B17, 0x331D, 0x40C3, 0x4145,
- 0x498B, 0x6987, 0x61C9, 0x49D1, 0x4285, 0x524D, 0x4B43, 0x530D, 0x6207, 0x624D, 0x6307, 0x6B4B, 0x4211, 0x4A55, 0x4A93, 0x4297,
- 0x5251, 0x5255, 0x5293, 0x5295, 0x4ADB, 0x5313, 0x535D, 0x6AD3, 0x62D9, 0x7355, 0x6319, 0x6B5D, 0x6B9B, 0x639F, 0x7359, 0x735D,
- 0x739B, 0x7B9F, 0x32E1, 0x3B63, 0x4AA3, 0x52E9, 0x4BA3, 0x53A9, 0x6BE3, 0x6BA9, 0x7BF1, 0x7C4D, 0x5C1F, 0x7417, 0x741B, 0x5C25,
- 0x54AB, 0x552F, 0x6C65, 0x6CAB, 0x7D27, 0x752D, 0x54F1, 0x5D35, 0x5D79, 0x6CF1, 0x6D75, 0x6DB9, 0x7E35, 0x763B, 0x89CF, 0xB085,
- 0xA909, 0xA98D, 0xB14B, 0xB1CF, 0x8207, 0x834F, 0x8A53, 0x8AD3, 0x8A95, 0x9253, 0x9295, 0x8395, 0x8359, 0x835D, 0x83D9, 0x83DD,
- 0x9359, 0x93D9, 0x93DD, 0xAA11, 0xA2D7, 0xB253, 0xBA95, 0xA393, 0xAB19, 0xABDB, 0xA3DF, 0xB319, 0xB3DF, 0xC001, 0xC8C7, 0xD843,
- 0xD885, 0xC909, 0xC18D, 0xD14B, 0xD9CF, 0xE001, 0xE8C7, 0xF801, 0xF885, 0xF14B, 0xD295, 0xCB19, 0xC39D, 0xDB19, 0xD3DF, 0xF295,
- 0xE319, 0xEB9D, 0xF35B, 0xFBDF, 0x83E1, 0x8C4D, 0x8C15, 0x945D, 0x9D53, 0x951F, 0xAC57, 0xAC9D, 0xA595, 0xB55D, 0xD517, 0xCD5B,
- 0xE59B, 0xD65B, 0xE69B, 0x8421, 0x8C65, 0x8CA3, 0x84E7, 0x9461, 0x9465, 0x9CA1, 0x94A5, 0x8CAB, 0x9D25, 0x8D6D, 0xA463, 0xA4E1,
- 0xA4E5, 0xB421, 0xB4E1, 0xB4A5, 0xA4E9, 0xAD65, 0xA529, 0xAD6D, 0xADAB, 0xADAD, 0xB56B, 0xB56D, 0xB5AB, 0xB5AD, 0x94F3, 0x8DB3,
- 0x8DF9, 0xADB5, 0xA5F9, 0x9E27, 0x962D, 0xB665, 0xB62D, 0xBF25, 0xB729, 0x9675, 0x8EBD, 0x9F37, 0x9F3D, 0xA675, 0xAEB9, 0xAF37,
- 0xAF7D, 0xCC63, 0xC4E7, 0xD463, 0xD4E7, 0xC5A5, 0xC569, 0xC5E9, 0xC5ED, 0xD529, 0xDD6D, 0xD5E9, 0xD5EF, 0xF463, 0xE5E1, 0xEDAD,
- 0xD5F1, 0xCE67, 0xCE2D, 0xCF65, 0xCF6B, 0xE623, 0xE6AB, 0xEFE5, 0xEF2F, 0xC631, 0xCE75, 0xCEB3, 0xCEB7, 0xDE31, 0xD675, 0xD6B3,
- 0xDEB7, 0xD6F9, 0xDF35, 0xCFBD, 0xEEB3, 0xE6F9, 0xEF77, 0xE739, 0xEF7D, 0xEFBB, 0xEFFF, 0xFF79, 0xFFB9, 0xFFFF, 0x1, 0x1
-
-};
-
-unsigned char gfx_splash[76800] = {
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF6, 0x4E, 0xBC, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x33, 0xE,
- 0xFD, 0xF9, 0x3A, 0xE, 0x33, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF7, 0xF7, 0xF8, 0x99, 0x2, 0x15, 0x39, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF7,
- 0xFD, 0x94, 0xE, 0xE, 0xE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xE9, 0xE9, 0xEF, 0x99, 0x14, 0x17, 0x15, 0x99, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF0,
- 0xE9, 0xE, 0xE, 0xB7, 0xF7, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0,
- 0xE9, 0xB8, 0xAC, 0x24, 0x15, 0x14, 0x17, 0x27, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xF9,
- 0xF0, 0x97, 0x27, 0x4D, 0xC6, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3F, 0xE,
- 0xE, 0xE, 0x3A, 0xFD, 0xF0, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xE9,
- 0xB8, 0x27, 0x15, 0x2, 0x2, 0x2, 0x17, 0x24, 0x35, 0xF9, 0xFD, 0xFD, 0xF8, 0xF0, 0xF0, 0xD8,
- 0x2C, 0x0, 0x6, 0x2, 0x2, 0x16, 0x4D, 0xBC, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0x3A,
- 0xE, 0x33, 0xF5, 0xFD, 0xE, 0x38, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xE9, 0xBD,
- 0xAC, 0x15, 0x2, 0x15, 0x17, 0x15, 0x17, 0x26, 0x16, 0xF2, 0xFD, 0xF8, 0xF0, 0xE9, 0xBD, 0x4D,
- 0x2, 0x14, 0x14, 0x14, 0x2, 0x2, 0x2, 0x2, 0x39, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xEA, 0xBD, 0xBD,
- 0xAC, 0x24, 0x17, 0x17, 0x15, 0x26, 0x26, 0x26, 0x24, 0xF2, 0xF9, 0xF0, 0xE9, 0xBD, 0xB6, 0x16,
- 0x24, 0x24, 0x15, 0x15, 0x15, 0x17, 0x24, 0x14, 0x2, 0x39, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xAC, 0x27, 0x17, 0x15, 0x15, 0x26, 0x26, 0x26, 0x24, 0xEB, 0xF7, 0xEE, 0xBD, 0xBD, 0xB6, 0x27,
- 0x26, 0x26, 0x17, 0x15, 0x15, 0x24, 0x15, 0x14, 0x15, 0x2, 0x4E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xB6,
- 0x27, 0x24, 0x15, 0x15, 0x2, 0x24, 0x26, 0x26, 0x26, 0x27, 0xC6, 0xEE, 0xBD, 0xBD, 0xB8, 0x35,
- 0x26, 0x26, 0x15, 0x14, 0x15, 0x15, 0x15, 0x2, 0x14, 0x17, 0x24, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xA3,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xE9, 0xBD, 0xB6,
- 0x27, 0x15, 0x15, 0x2, 0x2, 0x2, 0x14, 0x15, 0x17, 0x26, 0x27, 0xC6, 0xD8, 0xBD, 0xBD, 0x4D,
- 0x15, 0x17, 0x17, 0x16, 0x35, 0x16, 0x14, 0x14, 0x15, 0x17, 0x15, 0x24, 0xB8, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0x2C, 0x41, 0xB6, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xE9, 0xBD, 0xBD,
- 0xAC, 0x27, 0x26, 0x2, 0x2, 0x0, 0x2, 0x26, 0x17, 0x26, 0x15, 0x4D, 0xD8, 0xBD, 0xBD, 0xAC,
- 0x6, 0x15, 0x17, 0x27, 0xB6, 0xAA, 0x39, 0x6, 0x14, 0x17, 0x26, 0x26, 0x27, 0xEF, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6,
- 0x41, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xE9, 0xBD,
- 0xB8, 0xB5, 0x4E, 0x6, 0x15, 0x14, 0x2, 0x14, 0x26, 0x26, 0x17, 0x15, 0x4D, 0xAC, 0xBC, 0x39,
- 0x2, 0x14, 0x17, 0x24, 0xB5, 0xBD, 0xB7, 0x40, 0x6, 0x24, 0x26, 0x26, 0x24, 0xAC, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xBB, 0xA3, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xE9,
- 0xBD, 0xBD, 0xB8, 0x27, 0x17, 0x15, 0x14, 0x14, 0x15, 0x26, 0x26, 0x15, 0x2, 0x6, 0x27, 0x6,
- 0x2, 0x2, 0x17, 0x24, 0xB5, 0xBD, 0xBD, 0xB6, 0x16, 0x15, 0x26, 0x17, 0x17, 0x4E, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0,
- 0xD8, 0xBD, 0xBD, 0x4E, 0x15, 0x17, 0x14, 0x14, 0x14, 0x17, 0x26, 0x17, 0x15, 0x14, 0x2, 0x2,
- 0x2, 0x2, 0x15, 0x15, 0x4E, 0xBD, 0xBD, 0xBD, 0x6F, 0x15, 0x24, 0x14, 0x2, 0x27, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xA3,
- 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xE9, 0xBD, 0xBD, 0xB6, 0x16, 0x14, 0x14, 0x14, 0x14, 0x15, 0x24, 0x26, 0x26, 0x24, 0x15, 0x15,
- 0x15, 0x15, 0x15, 0x15, 0x39, 0xE9, 0xBD, 0xBD, 0xB4, 0x16, 0x24, 0x14, 0x2, 0x2, 0x35, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xA3, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8,
- 0xEE, 0xBD, 0xBD, 0xBD, 0x4E, 0x2, 0x14, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x14, 0x15, 0x17,
- 0x17, 0x17, 0x17, 0x17, 0x39, 0xE9, 0xBD, 0xBD, 0xA9, 0x16, 0x17, 0x15, 0x15, 0x2, 0x6, 0xB8,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0x41,
- 0xE, 0xE, 0xE, 0xA3, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF5, 0xE9, 0xBD, 0xBD, 0xB6, 0x25, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x2, 0x2, 0x2, 0x15,
- 0x15, 0x17, 0x17, 0x15, 0x4E, 0xE9, 0xBD, 0xBD, 0x39, 0x2, 0x17, 0x17, 0x17, 0x15, 0x15, 0x4E,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xE, 0xAA, 0x2C, 0xE, 0xE, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF8, 0xEE, 0xD8, 0xBD, 0xBD, 0xA5, 0x15, 0x15, 0x14, 0x14, 0x17, 0x15, 0x14, 0x14, 0x2, 0x2,
- 0x2, 0x14, 0x15, 0x16, 0xBC, 0xE9, 0xAC, 0x4E, 0x27, 0x2, 0x14, 0x17, 0x26, 0x15, 0x15, 0x4E,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xE, 0xE9, 0xBD, 0x38, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xB8, 0x4E, 0x6, 0x2, 0x14, 0x15, 0x15, 0x15, 0x14, 0x14, 0x2,
- 0x2, 0x2, 0x14, 0x35, 0xD8, 0xA5, 0x16, 0x2, 0x2, 0x2, 0x14, 0x15, 0x15, 0x14, 0x2, 0x40,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF5, 0xE9, 0xBD, 0xBD, 0xB7, 0x4E, 0x9, 0x15, 0x14, 0x2, 0x0, 0x2, 0x2, 0x2,
- 0x2, 0x15, 0x16, 0xB6, 0xB8, 0x27, 0x14, 0x17, 0x2, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x27,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x2C,
- 0x33, 0x3A, 0x41, 0xA8, 0xAA, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xF5, 0xEA, 0xD8, 0xBD, 0xB7, 0xAA, 0x35, 0x6, 0x2, 0x14, 0x14, 0x14, 0x15,
- 0x15, 0x16, 0xA5, 0xB6, 0x2E, 0x6, 0x14, 0x17, 0x17, 0x15, 0x17, 0x17, 0x26, 0x26, 0x17, 0x27,
- 0xF2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xE9, 0xD8, 0xBD, 0xBD, 0xA5, 0x35, 0x16, 0x16, 0x16, 0x16,
- 0x3C, 0xB8, 0xBD, 0xB4, 0x9, 0x2, 0x2, 0x15, 0x17, 0x17, 0x26, 0x24, 0x15, 0x26, 0x15, 0x24,
- 0xF2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xEA, 0xE9, 0xE9, 0xE9, 0xE9, 0xEB, 0xEB, 0xEB,
- 0xEA, 0xD8, 0xBD, 0xB7, 0x35, 0x16, 0x2, 0x15, 0x24, 0x24, 0x26, 0x26, 0x15, 0x15, 0x17, 0x39,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0x2C, 0x41, 0xB6, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF8, 0xF7, 0xF7, 0xF8, 0xF9, 0xFD, 0xFD, 0xF9,
- 0xF5, 0xEA, 0xD8, 0xBD, 0xB6, 0xA9, 0x16, 0x15, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, 0x24, 0xC6,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xB6,
- 0x41, 0xE, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF7, 0xEA, 0xD8, 0xBD, 0xBD, 0xA5, 0x27, 0x27, 0x27, 0x17, 0x26, 0x26, 0x15, 0x99, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xE, 0xF7, 0xBB, 0x41, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF2, 0xF2, 0xF2, 0xF2,
- 0xF2, 0xEF, 0xE9, 0xE9, 0xEE, 0xE9, 0xD8, 0xB8, 0xBC, 0xBC, 0x4D, 0x24, 0x24, 0xB5, 0xF9, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xAA,
- 0x31, 0xE, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xE9, 0x99, 0x4D, 0x16, 0x6, 0x9, 0x6,
- 0x6, 0x6, 0x15, 0x27, 0x40, 0xB6, 0xD8, 0xE9, 0xEE, 0xF5, 0xF5, 0xF2, 0xF6, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0x31, 0x3F, 0x41, 0xF8, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xB5, 0x39, 0x16, 0x2, 0x2, 0x2, 0x2, 0x14, 0x14,
- 0x14, 0x14, 0x14, 0x2, 0x2, 0x2, 0x16, 0x4D, 0xEB, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xA8,
- 0xF9, 0xF0, 0xE, 0xE, 0xE, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xE9, 0x99, 0x15, 0x2, 0x2, 0x14, 0x15, 0x26, 0x26, 0x24, 0x15,
- 0x15, 0x17, 0x26, 0x17, 0x15, 0x15, 0x15, 0x2, 0x16, 0xC5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xB6, 0xE, 0x2C, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF5, 0xE9, 0xBD, 0x99, 0x15, 0x2, 0x2, 0x15, 0x17, 0x26, 0x26, 0x26, 0x26, 0x15,
- 0x2, 0x14, 0x24, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x24, 0xB5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF5, 0xE9, 0xBD, 0x99, 0x15, 0x2, 0x14, 0x15, 0x2, 0x2, 0x15, 0x24, 0x26, 0x26, 0x24,
- 0x15, 0x14, 0x15, 0x15, 0x14, 0x15, 0x17, 0x15, 0x15, 0x26, 0x15, 0x4D, 0xF9, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xE9, 0xBD, 0xB6, 0x27, 0x2, 0x15, 0x26, 0x15, 0x2, 0x2, 0x2, 0x15, 0x15, 0x17, 0x24,
- 0x24, 0x24, 0x17, 0x15, 0x15, 0x17, 0x15, 0x2, 0x15, 0x26, 0x26, 0x15, 0xBC, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xA3,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8,
- 0xEE, 0xD8, 0xBD, 0x6F, 0x2, 0x2, 0x26, 0x26, 0x15, 0x24, 0x17, 0x14, 0x15, 0x15, 0x2, 0x15,
- 0x24, 0x24, 0x17, 0x15, 0x24, 0x24, 0x15, 0x14, 0x15, 0x17, 0x14, 0x14, 0x16, 0xE9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0x2C, 0x41, 0xB6, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xE9, 0xBD, 0xBD, 0x2E, 0x0, 0x14, 0x26, 0x26, 0x15, 0x26, 0x17, 0x17, 0x17, 0x17, 0x15, 0x17,
- 0x26, 0x26, 0x17, 0x15, 0x24, 0x15, 0x15, 0x14, 0x15, 0x14, 0x15, 0x26, 0x15, 0x2C, 0xF9, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6,
- 0x41, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0x38, 0xA3, 0xB4, 0xE9, 0xE, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0,
- 0xD8, 0xBD, 0xB6, 0x16, 0x0, 0x2, 0x24, 0x17, 0x2, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
- 0x17, 0x17, 0x17, 0x24, 0x24, 0x15, 0x15, 0x14, 0x15, 0x15, 0x17, 0x26, 0x15, 0x9, 0xF0, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xBB, 0xA3, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xBD, 0xB4, 0xA3, 0xE, 0x2C, 0xB6, 0xFD, 0xFD, 0xFD, 0xF8, 0xEE,
- 0xBD, 0xBD, 0xAC, 0x6, 0x0, 0x0, 0x2, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x15, 0x15, 0x17,
- 0x2, 0x14, 0x15, 0x15, 0x14, 0x2, 0x2, 0x14, 0x14, 0x26, 0x26, 0x26, 0x24, 0x6, 0xB8, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x2, 0x14, 0x2, 0x14, 0x26, 0x26, 0x17, 0x17, 0x17, 0x15, 0x14, 0x17,
- 0x2, 0x40, 0xAC, 0xAC, 0x4D, 0x16, 0x2, 0x15, 0x14, 0x24, 0x26, 0x26, 0x17, 0x15, 0x2E, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE9, 0x2C, 0xE, 0x31, 0xAA, 0xFD, 0xF9, 0xA8, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x2, 0x15, 0x14, 0x14, 0x15, 0x26, 0x26, 0x15, 0x14, 0x15, 0x39, 0x27,
- 0x4E, 0xD8, 0xD8, 0xBD, 0xBD, 0xAC, 0x27, 0x2, 0x0, 0x14, 0x26, 0x17, 0x17, 0x17, 0x15, 0xBC,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0xE9, 0xFD, 0xF0, 0x3A, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x2, 0x17, 0x15, 0x14, 0x14, 0x17, 0x24, 0x14, 0x2, 0xAC, 0xF9, 0xF6,
- 0xF9, 0xF7, 0xF0, 0xE9, 0xBD, 0xBD, 0xB6, 0x40, 0x2, 0x2, 0x24, 0x14, 0x15, 0x17, 0x15, 0x4E,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAA, 0x6, 0x2, 0x14, 0x14, 0x14, 0x14, 0x15, 0x14, 0x24, 0x27, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF8, 0xF0, 0xE9, 0xBD, 0xBD, 0xAC, 0x6, 0x2, 0x24, 0x14, 0x2, 0x14, 0x14, 0x2E,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xAA, 0x3A, 0xF0, 0xFD, 0xE9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x2, 0x2, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x4E, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xA9, 0x2, 0x14, 0x17, 0x15, 0x15, 0x14, 0x2, 0x16,
- 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x2C,
- 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x31, 0xE, 0x2C, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xB6, 0x16, 0x2, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x2C, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xE9, 0xB8, 0xB6, 0xAC, 0x27, 0x2, 0x15, 0x26, 0x17, 0x17, 0x15, 0x15, 0x39,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xFD,
- 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xEA,
- 0xBD, 0xBD, 0xB8, 0x27, 0x2, 0x15, 0x15, 0x15, 0x14, 0x15, 0x15, 0x15, 0x9, 0xF0, 0xF9, 0xF8,
- 0xF7, 0xF7, 0x4E, 0x6, 0x6, 0x9, 0x16, 0x2, 0x15, 0x24, 0x15, 0x17, 0x26, 0x15, 0x15, 0x99,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0x3A, 0xA3, 0xB6, 0xE9, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0,
- 0xD8, 0xBD, 0xBD, 0x35, 0x2, 0x2, 0x2, 0x2, 0x2, 0x15, 0x24, 0x2, 0x9, 0xEF, 0xF7, 0xE9,
- 0xB8, 0xBC, 0x4E, 0x2, 0x14, 0x15, 0x15, 0x17, 0x17, 0x15, 0x17, 0x15, 0x15, 0x14, 0x6, 0xEB,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x2C,
- 0xE, 0x31, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF8, 0xE9, 0xB6, 0x3C, 0xE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xE9, 0xBD, 0xBD, 0xAA, 0x6, 0x2, 0x14, 0x15, 0x6, 0x15, 0x14, 0x2, 0x2, 0xBD, 0xE9, 0x2E,
- 0x2, 0x6, 0x15, 0x14, 0x14, 0x2, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0xF2,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9,
- 0xFD, 0xF0, 0x3A, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xEA, 0xBD, 0xBD, 0xB8, 0x4E, 0x6, 0x24, 0x6, 0x14, 0x15, 0x14, 0x2, 0x2, 0x4E, 0xB6, 0x6,
- 0x15, 0x15, 0x14, 0x2, 0x2, 0x14, 0x17, 0x17, 0x17, 0x17, 0x15, 0x17, 0x17, 0x15, 0x4E, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9,
- 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF5, 0xE9, 0xBD, 0xBD, 0xB8, 0x97, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x39, 0xB6, 0x9,
- 0x2, 0x2, 0x2, 0x2, 0x6, 0x2, 0x15, 0x17, 0x17, 0x17, 0x26, 0x26, 0x24, 0x16, 0xF2, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x3A,
- 0xF0, 0xFD, 0xE9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF5, 0xE9, 0xBD, 0xBD, 0xB8, 0x4E, 0x15, 0x17, 0x17, 0x17, 0x17, 0x14, 0x3C, 0xD8, 0xB6,
- 0x3C, 0x35, 0x35, 0x4E, 0xAA, 0x4E, 0x2, 0x15, 0x24, 0x24, 0x26, 0x26, 0x17, 0x4D, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x31, 0xE, 0x2C, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF5, 0xE9, 0xD8, 0xBD, 0xB8, 0xA5, 0x16, 0x15, 0x17, 0x15, 0x27, 0xE9, 0xF5, 0xF7,
- 0xF5, 0xAC, 0x6, 0x6, 0x97, 0x4E, 0x2, 0x24, 0x15, 0x17, 0x26, 0x26, 0x15, 0xBC, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xF7, 0xEE, 0xE9, 0xD8, 0xE9, 0xC6, 0x99, 0x4E, 0x99, 0xF2, 0xF9, 0xFD, 0xFD,
- 0xF9, 0xAC, 0x2, 0x15, 0x16, 0xAA, 0x35, 0x16, 0x27, 0x27, 0x24, 0x24, 0x4D, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0x2C, 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF5, 0xF0, 0xF5, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF2, 0x35, 0x16, 0x35, 0xD8, 0xD8, 0xBC, 0xEB, 0xF2, 0xF2, 0xF2, 0xF9, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x3A, 0xFD, 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF8, 0xF7, 0xEB, 0x99, 0x4E, 0x4D, 0x4D, 0x4D, 0x4E, 0xAC, 0xEF,
- 0xF6, 0xF9, 0xF5, 0xEB, 0xF0, 0xF7, 0xF7, 0xF7, 0xEF, 0xC6, 0xF2, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xC6, 0x4D, 0x6, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x6,
- 0x16, 0x4D, 0x99, 0xEB, 0xEB, 0xEF, 0xF7, 0xEF, 0x35, 0x6, 0x24, 0x27, 0x97, 0xF6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF7, 0xF0, 0xE9, 0xB5, 0x24, 0x2, 0x14, 0x17, 0x17, 0x26, 0x26, 0x17, 0x24, 0x15, 0x2,
- 0x2, 0x2, 0x2, 0x6, 0x6, 0x16, 0x4D, 0x16, 0x2, 0x14, 0x26, 0x14, 0x14, 0x27, 0xEB, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB3, 0xD6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A,
- 0x94, 0x2C, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x94, 0x31, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xEE, 0xE9, 0xB8, 0x27, 0x2, 0x15, 0x26, 0x15, 0x15, 0x17, 0x26, 0x26, 0x26, 0x26, 0x15,
- 0x2, 0x14, 0x15, 0x15, 0x2, 0x2, 0x2, 0x2, 0x14, 0x17, 0x26, 0x17, 0x15, 0x17, 0x4D, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xF2, 0xF5, 0xFB, 0x67, 0x1E, 0x6C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF9,
- 0xFD, 0xFD, 0xA3, 0x94, 0x41, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB7, 0x94, 0x41, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8,
- 0xF0, 0xD8, 0xBD, 0x97, 0x2, 0x14, 0x26, 0x26, 0x15, 0x2, 0x14, 0x15, 0x24, 0x26, 0x26, 0x24,
- 0x15, 0x14, 0x15, 0x14, 0x2, 0x14, 0x14, 0x15, 0x14, 0x17, 0x26, 0x15, 0x15, 0x14, 0x97, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF2, 0xEA, 0xBD, 0xEF, 0xDC, 0x66, 0x1E, 0x4, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF5,
- 0xFD, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xB6, 0xF5, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xE9, 0xBD, 0xB6, 0x25, 0x2, 0x14, 0x15, 0x26, 0x26, 0x14, 0x14, 0x14, 0x15, 0x15, 0x17, 0x26,
- 0x2A, 0x24, 0x17, 0x14, 0x14, 0x15, 0x24, 0x14, 0x15, 0x26, 0x26, 0x17, 0x15, 0x15, 0x4D, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xEB, 0xBD, 0xB6, 0xD8, 0x37, 0x4, 0x1F, 0x1E, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x33,
- 0xE9, 0xFD, 0xBD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0xA3, 0x31, 0xE, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0,
- 0xD8, 0xBD, 0xAC, 0x6, 0x2, 0x15, 0x26, 0x26, 0x26, 0x24, 0x15, 0x14, 0x15, 0x14, 0x15, 0x24,
- 0x26, 0x26, 0x17, 0x15, 0x24, 0x24, 0x15, 0x14, 0x15, 0x26, 0x26, 0x26, 0x15, 0x15, 0x24, 0xF2,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF6, 0xE9, 0xB4, 0xAA, 0xB6, 0x20, 0x4, 0x29, 0x1F, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xB6,
- 0x20, 0x20, 0x4, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x31, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x0, 0x24, 0x26, 0x26, 0x26, 0x15, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15,
- 0x26, 0x26, 0x17, 0x15, 0x24, 0x15, 0x15, 0x14, 0x15, 0x17, 0x17, 0x26, 0x14, 0x2, 0x25, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF4, 0xD8, 0xAA, 0x94, 0xA8, 0x30, 0x4, 0x25, 0x1E, 0xD7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xE9, 0xEA, 0xB6,
- 0x4, 0x1E, 0x1F, 0x30, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE9, 0x31, 0xE, 0x31, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x0, 0x2, 0x24, 0x26, 0x26, 0x26, 0x17, 0x14, 0x16, 0x39, 0x4D, 0x35,
- 0x16, 0x15, 0x17, 0x24, 0x24, 0x15, 0x15, 0x14, 0x14, 0x15, 0x15, 0x17, 0x15, 0x2, 0xD, 0xF5,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF5, 0xBD, 0xA3, 0x41, 0xA3, 0x20, 0x6, 0x29, 0x4, 0xAF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xBD, 0xB4, 0xBA, 0xA7,
- 0x4, 0x1E, 0x4, 0xB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x31,
- 0xE, 0x31, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0xBD, 0xFD, 0xE, 0xA3, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x2, 0x0, 0x2, 0x26, 0x26, 0x26, 0x17, 0x4D, 0xC6, 0xD8, 0xBD, 0xBD,
- 0xAC, 0x27, 0x15, 0x17, 0x17, 0x14, 0x15, 0x14, 0x14, 0x26, 0x26, 0x26, 0x24, 0x2, 0x9, 0xF0,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xBD, 0xA4, 0x41, 0x6F, 0xD, 0x6, 0x29, 0x4, 0x97, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF7, 0xEA, 0xB6, 0x94, 0x94, 0xA7,
- 0x1F, 0x20, 0x1F, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xBD,
- 0xFD, 0xE, 0xA3, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0xF8, 0xFD, 0xE, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0x4D, 0x2, 0x14, 0x14, 0x2, 0x14, 0x26, 0x26, 0x15, 0x99, 0xF7, 0xF0, 0xE9, 0xBD,
- 0xBD, 0xB8, 0x97, 0x24, 0x24, 0x15, 0x16, 0x2E, 0x2E, 0x24, 0x26, 0x26, 0x17, 0x2, 0x4E, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xBD, 0x94, 0x3F, 0x41, 0xD, 0x6, 0x29, 0x1F, 0x71, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFC, 0xF6, 0xF6, 0xF6, 0xF4, 0xF6, 0xF6, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFC, 0xFB,
- 0xFD, 0xFD, 0xF5, 0xF7, 0xFD, 0xF6, 0xF4, 0xF6, 0xFD, 0xF2, 0xF4, 0xF6, 0xF6, 0xF4, 0xE2, 0xB5,
- 0xA9, 0x6F, 0xB0, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xAA, 0x6F, 0x41, 0x3A,
- 0x1E, 0x25, 0x20, 0xD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF8,
- 0xFD, 0xE, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xB6, 0x3A, 0xFD, 0xE, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9,
- 0xBD, 0xBD, 0x35, 0x2, 0x17, 0x15, 0x14, 0x14, 0x15, 0x26, 0x26, 0x27, 0xF2, 0xF8, 0xF5, 0xEE,
- 0xE9, 0xE9, 0xE9, 0xC6, 0xC6, 0xBC, 0xB8, 0xBD, 0xBD, 0xB8, 0x39, 0x24, 0x15, 0x4D, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xBC, 0x41, 0x3C, 0x3C, 0xD, 0x4, 0x25, 0x1F, 0x71, 0xD5, 0xB5, 0xA7, 0xB0, 0xBA, 0xD8,
- 0xE9, 0xE9, 0xEB, 0xD8, 0xB0, 0x40, 0x30, 0xD, 0xD, 0x20, 0x20, 0x20, 0xD, 0x20, 0xD, 0x20,
- 0x20, 0x1F, 0x6, 0x6, 0x4, 0x4, 0x4, 0x4, 0xD, 0xB, 0xB, 0x40, 0xF4, 0xFD, 0xF6, 0xE0,
- 0xD8, 0x6F, 0xB, 0x32, 0xD8, 0xF6, 0xF6, 0xF4, 0xE0, 0xB5, 0x72, 0x38, 0x3E, 0x25, 0x1F, 0xAF,
- 0xF7, 0xF0, 0xEF, 0xF4, 0xB5, 0x1F, 0xFE, 0x0, 0x0, 0x0, 0x4, 0x4, 0x4, 0x4, 0x4, 0x0,
- 0x0, 0x0, 0xFE, 0x4, 0xB0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF5, 0xF0, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xD8, 0xA3, 0x41, 0x40, 0x30,
- 0x1F, 0x6B, 0x37, 0xD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A,
- 0xFD, 0xE, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xFD, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8,
- 0xBD, 0xBD, 0x2E, 0x2, 0x17, 0x17, 0x15, 0x14, 0x14, 0x17, 0x26, 0x14, 0x35, 0xF2, 0xF9, 0xF8,
- 0xF7, 0xF7, 0xF8, 0xF9, 0xF8, 0xF7, 0xF0, 0xE9, 0xE9, 0xF0, 0xF2, 0xBC, 0xC6, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xEF, 0xBC, 0xA3, 0x3C, 0x38, 0xB, 0x4, 0x25, 0x28, 0x25, 0x1F, 0x0, 0xFE, 0x0, 0x0, 0x0,
- 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x6, 0x6, 0x6, 0x4, 0x6, 0x4, 0x4,
- 0x5, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x25, 0x6C, 0x97, 0x37, 0x4,
- 0xFE, 0x0, 0xFE, 0x0, 0x0, 0x0, 0xD, 0x6E, 0x4, 0x0, 0x0, 0x0, 0x4, 0x4, 0x0, 0x39,
- 0xE2, 0xE2, 0xD7, 0x72, 0x1F, 0x4, 0x1E, 0x1F, 0x1F, 0x20, 0x1F, 0x6, 0x6, 0x20, 0x20, 0x20,
- 0x1F, 0x1F, 0x25, 0xB, 0x0, 0xB, 0x20, 0x4, 0xB, 0xB, 0x5, 0x5, 0x5, 0x4, 0x4, 0x4,
- 0x5, 0x0, 0xFE, 0xFE, 0x0, 0x40, 0xFD, 0xFD, 0xFD, 0x40, 0xB0, 0xBA, 0x41, 0x3A, 0x32, 0x37,
- 0x37, 0x97, 0x37, 0xB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0xFD, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8,
- 0xBD, 0xBD, 0x32, 0x0, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x24, 0x26, 0x2, 0x27, 0xC6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF7, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xBD, 0xA3, 0x3A, 0x33, 0xB, 0x6, 0x29, 0x25, 0x4, 0x0, 0x4, 0x6, 0x20, 0x20, 0x20,
- 0x25, 0x20, 0x20, 0x20, 0x6, 0x6, 0xD, 0x20, 0x20, 0x25, 0x25, 0x25, 0x20, 0x25, 0x20, 0x25,
- 0x25, 0x20, 0x20, 0x20, 0x20, 0x20, 0x25, 0x20, 0x20, 0x37, 0x3E, 0x30, 0x6, 0x4, 0x4, 0x20,
- 0x37, 0x25, 0x20, 0x25, 0x30, 0x20, 0x6, 0x0, 0x20, 0x25, 0x20, 0x20, 0x20, 0x25, 0x22, 0x1F,
- 0x25, 0x39, 0x37, 0x1F, 0x4, 0x1F, 0x29, 0x1F, 0x1F, 0x20, 0x1F, 0x1E, 0x1F, 0x20, 0x20, 0x1F,
- 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xB, 0x6, 0x20, 0x20, 0x25, 0x30, 0x25, 0x20, 0x20, 0x37, 0x6C,
- 0xA7, 0x6C, 0x3E, 0x72, 0x37, 0x25, 0x6F, 0x6C, 0x39, 0x0, 0x4, 0x4, 0x0, 0x0, 0x4, 0xB,
- 0xFE, 0x0, 0x0, 0x6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8,
- 0xBD, 0xBD, 0x4E, 0x2, 0x2, 0x2, 0x2, 0x15, 0x14, 0x15, 0x15, 0x17, 0x14, 0x2, 0x6, 0x97,
- 0xF2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xB7, 0x94, 0x3A, 0x33, 0xB, 0x4, 0x30, 0x25, 0x4, 0x6, 0x20, 0x6, 0x4, 0x4, 0x1E,
- 0x6, 0x6, 0x6, 0x6, 0x4, 0x6, 0x6, 0x4, 0x4, 0x6, 0x1F, 0x1F, 0x4, 0x1F, 0x6, 0x4,
- 0x1F, 0x4, 0x6, 0xB, 0x6, 0xB, 0xB, 0x5, 0x20, 0x4, 0x4, 0xB, 0x37, 0x37, 0x1F, 0x25,
- 0x25, 0x1F, 0x6, 0x1F, 0x20, 0x20, 0x20, 0x6, 0x1F, 0x1F, 0x6, 0x1F, 0x20, 0x20, 0x25, 0x1F,
- 0x1E, 0x1E, 0x4, 0x1E, 0x20, 0x1F, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
- 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x1F, 0x4, 0x1F, 0x25, 0x29,
- 0x29, 0x4, 0x1F, 0x20, 0x37, 0x29, 0x0, 0x4, 0x4, 0x20, 0x20, 0xB, 0x5, 0x4, 0x4, 0x4,
- 0x0, 0x4, 0x4, 0x4, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF5, 0xBD, 0x2C,
- 0xE, 0x31, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9,
- 0xBD, 0xBD, 0xB6, 0x16, 0x2, 0x15, 0x17, 0x15, 0x14, 0x15, 0x15, 0x15, 0x2, 0x2, 0x2, 0x2,
- 0x16, 0x99, 0xEF, 0xF2, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xE9, 0xB7, 0xA3, 0x3A, 0x31, 0x7, 0x4, 0x25, 0x32, 0x4, 0x0, 0xD, 0x6, 0x1F, 0x1F, 0x1F,
- 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x25, 0x25, 0x1F, 0x6, 0x1F, 0x20, 0x20, 0x1F, 0x25, 0x1F, 0x1F,
- 0x1F, 0x6, 0x1F, 0x20, 0x20, 0x20, 0x20, 0xD, 0x20, 0x6, 0x1F, 0x6, 0xB, 0x20, 0x4, 0xB,
- 0x20, 0x6, 0x4, 0x1F, 0x20, 0x1F, 0x1F, 0x6, 0x6, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x1F, 0x20,
- 0x1F, 0x1F, 0x22, 0x1F, 0x1E, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x25, 0x29, 0x29, 0x25, 0x20, 0x25,
- 0x20, 0x1F, 0x1F, 0x20, 0x1F, 0x6, 0x6, 0x6, 0x4, 0x1F, 0x4, 0x0, 0x0, 0x6, 0x6, 0x6,
- 0x6, 0x1F, 0x6, 0x4, 0x1F, 0x1F, 0x1F, 0x20, 0x1F, 0x1F, 0x20, 0xB, 0x5, 0x4, 0x4, 0x4,
- 0xB, 0x37, 0x30, 0x4, 0xD7, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xF0, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xE, 0xE9,
- 0xFD, 0xF0, 0x3C, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xEE,
- 0xD8, 0xBD, 0xB8, 0xA5, 0x16, 0x14, 0x15, 0x15, 0x14, 0x15, 0x17, 0x15, 0x14, 0x14, 0x2, 0x2,
- 0x0, 0x2, 0x2, 0x6, 0x16, 0x4E, 0xEF, 0xFD, 0xEB, 0x40, 0xC6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xE2, 0xB0, 0x40, 0x30, 0xD, 0x0, 0x2, 0x16, 0xD, 0x4, 0x4, 0x1F, 0x20, 0x1F, 0x25, 0x25,
- 0x25, 0x30, 0x25, 0x25, 0x25, 0x25, 0x29, 0x29, 0x67, 0x29, 0x29, 0x29, 0x29, 0x30, 0x20, 0xB,
- 0x39, 0x6B, 0x37, 0x29, 0x25, 0x37, 0x39, 0x30, 0x20, 0x25, 0x25, 0x20, 0x6, 0x25, 0x1F, 0x1F,
- 0x1F, 0x28, 0x22, 0x20, 0x1F, 0x1F, 0x1F, 0x1E, 0xB, 0x20, 0x25, 0x30, 0x20, 0x20, 0x1F, 0xD,
- 0x6, 0x1F, 0x1F, 0x1F, 0x6, 0x1F, 0x25, 0x29, 0x39, 0x37, 0x39, 0x65, 0x29, 0x25, 0x39, 0x71,
- 0x96, 0x71, 0x71, 0x71, 0x96, 0x96, 0x29, 0x70, 0x67, 0x70, 0x67, 0xB2, 0x6E, 0x37, 0x71, 0x29,
- 0x22, 0x29, 0x29, 0x1F, 0x6, 0x1F, 0x1F, 0x1F, 0x29, 0x1F, 0x6, 0xD, 0x4, 0x4, 0x0, 0x0,
- 0x6, 0x29, 0x1F, 0x1F, 0xF4, 0xF4, 0xD8, 0xEB, 0xB0, 0x6F, 0xA3, 0x94, 0x5, 0x4, 0xF4, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xB4, 0x3A, 0xF7,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xEE, 0xD8, 0xBD, 0xBD, 0xB4, 0x16, 0x2, 0x2, 0x2, 0x15, 0x24, 0x15, 0x15, 0x15, 0x14, 0x2,
- 0x2, 0x2, 0x2, 0x2, 0x14, 0x2, 0x16, 0xB5, 0x39, 0x2, 0x15, 0xBC, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xFC, 0xD8, 0x72, 0xD6, 0x97, 0x39, 0x39,
- 0x25, 0x25, 0x25, 0x20, 0xD, 0x0, 0x0, 0x16, 0x32, 0x25, 0x20, 0x25, 0x29, 0x25, 0x30, 0x32,
- 0x30, 0xD, 0xB, 0x30, 0x25, 0x29, 0x29, 0x29, 0x29, 0x29, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x25, 0x25, 0x20, 0x25, 0x37, 0x25, 0x20, 0x20, 0x39, 0x30, 0x25, 0x25, 0xD, 0x29, 0x29, 0x29,
- 0x29, 0x29, 0x29, 0x25, 0x25, 0x25, 0x25, 0x30, 0x37, 0x37, 0x37, 0x37, 0x30, 0x37, 0x20, 0x6,
- 0x25, 0x39, 0x37, 0x20, 0x25, 0x37, 0x37, 0x39, 0x37, 0x37, 0x6B, 0x71, 0x6B, 0x71, 0x9B, 0xAF,
- 0xB5, 0xDB, 0x68, 0x4, 0x39, 0xE6, 0xDB, 0xDA, 0xE6, 0xE6, 0xDB, 0xE8, 0xD5, 0xE6, 0xE8, 0xE6,
- 0xE6, 0xE6, 0xE2, 0xD7, 0xD7, 0xB5, 0x25, 0x6, 0xB5, 0xAE, 0x72, 0x72, 0x6F, 0xA7, 0x97, 0x71,
- 0x9B, 0xB2, 0xB2, 0x7A, 0xD6, 0xB, 0x0, 0x32, 0x39, 0x2C, 0x16, 0xE, 0x4, 0x4, 0xED, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0x3A, 0xE, 0x31,
- 0xBD, 0xF0, 0xAA, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0x94, 0xE, 0xE, 0x31, 0xAA, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xEE, 0xD8, 0xBD, 0xBD, 0xA9, 0x6, 0x15, 0x2, 0x2, 0x14, 0x2, 0x2, 0x2, 0x14, 0x2,
- 0x2, 0x14, 0x14, 0x15, 0x15, 0x15, 0x2, 0x27, 0x27, 0x14, 0x17, 0x4D, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xEA, 0xEE, 0x5, 0x1E, 0xB2, 0x71, 0xB2, 0xB2,
- 0xAF, 0x6E, 0x6B, 0x71, 0x6E, 0x25, 0x35, 0xB5, 0xA9, 0x6E, 0x97, 0x97, 0x6E, 0x6C, 0x6F, 0x6C,
- 0x30, 0xB, 0xD, 0xA7, 0x97, 0xAF, 0xAF, 0xAF, 0x7A, 0x71, 0x6B, 0x39, 0x39, 0x37, 0x39, 0x39,
- 0x37, 0x37, 0x39, 0x39, 0x72, 0x3E, 0xB, 0x4, 0xD6, 0xAE, 0x6E, 0x97, 0x6E, 0x97, 0xB2, 0xB2,
- 0xB5, 0xB5, 0xB2, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xB0, 0xB0, 0xA7, 0x6C, 0x39, 0x39, 0x25, 0x6,
- 0x37, 0x97, 0x97, 0x97, 0xB5, 0xE2, 0xE2, 0xED, 0xE2, 0xE2, 0xEF, 0xE6, 0xDB, 0xD5, 0xB5, 0xA9,
- 0x35, 0x3E, 0xD, 0xFE, 0x6, 0x40, 0x39, 0x6C, 0xAF, 0xA9, 0xAF, 0xB5, 0x40, 0xAF, 0x6E, 0x97,
- 0xA9, 0x6E, 0x39, 0x37, 0x32, 0x25, 0xFE, 0x0, 0x37, 0x37, 0x30, 0x20, 0xD, 0x20, 0x20, 0x20,
- 0x6, 0x20, 0x29, 0x29, 0x37, 0x4, 0x0, 0x20, 0x20, 0x6, 0x9, 0x4, 0x0, 0xB, 0xEE, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xE9,
- 0xA3, 0x33, 0xE, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x41, 0xB6, 0xF9, 0xFD, 0xF8, 0xBD, 0x33, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xB6, 0x35, 0x15, 0x15, 0x14, 0x2, 0x2, 0x14, 0x15, 0x15, 0x15,
- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x16, 0x99, 0x16, 0x17, 0x24, 0xB5, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xE9, 0xBD, 0xBB, 0x33, 0x4, 0x1E, 0x4, 0x4, 0x4,
- 0x4, 0x0, 0x0, 0x4, 0x0, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xB,
- 0xB, 0x0, 0xFE, 0xD, 0x4, 0x6, 0x6, 0x6, 0x1F, 0x1F, 0x1E, 0x1E, 0x6, 0x4, 0x5, 0x5,
- 0x4, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xB, 0xB, 0x4, 0x1F, 0x1F, 0x6, 0x4, 0x4,
- 0x4, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0,
- 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x0,
- 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x0, 0x1E, 0x4, 0x4, 0x4, 0xB, 0x4, 0xB, 0x4, 0x4,
- 0x4, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0,
- 0x0, 0x0, 0x4, 0x4, 0x4, 0x4, 0x0, 0x4, 0x4, 0x0, 0x0, 0xFE, 0x4, 0x3E, 0xFB, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF8, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB7, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF0, 0xE9, 0xBD, 0xBD, 0xB4, 0x32, 0x6, 0x15, 0x15, 0x14, 0x14, 0x15, 0x15, 0x14,
- 0x14, 0x14, 0x14, 0x14, 0x2, 0x14, 0x15, 0x16, 0x99, 0xB5, 0x99, 0x6, 0x15, 0x4D, 0xF9, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8, 0xB4, 0xAA, 0xAA, 0x3A, 0x30, 0x30, 0x30, 0x20,
- 0xD, 0xB, 0x5, 0x0, 0x0, 0x0, 0x4, 0x5, 0x4, 0xFE, 0x4, 0xB, 0x6, 0xB, 0x5, 0x4,
- 0x4, 0x4, 0x4, 0x4, 0x5, 0x4, 0x5, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5,
- 0xD, 0xB, 0x6, 0x6, 0x7, 0x5, 0x5, 0xB, 0x5, 0x1F, 0x1E, 0x1F, 0x1F, 0x4, 0x1E, 0x1F,
- 0x1F, 0x1F, 0x6, 0x6, 0x1F, 0x1F, 0x1F, 0x6, 0xB, 0x6, 0x1F, 0x1F, 0x4, 0x1E, 0x1E, 0x1F,
- 0x1F, 0x1E, 0x1E, 0x1F, 0x1E, 0x4, 0x1E, 0x4, 0x1F, 0x1E, 0x1E, 0x1F, 0x1E, 0x1F, 0x1F, 0x1F,
- 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1E, 0x4, 0x1F, 0x4, 0x4, 0x4, 0x4, 0x1E, 0x4,
- 0x4, 0x4, 0x1E, 0x1F, 0x4, 0x6, 0x6, 0x4, 0x6, 0x4, 0x4, 0x5, 0x4, 0x4, 0x0, 0x0,
- 0x4, 0x4, 0x4, 0x4, 0x4, 0x25, 0x20, 0x25, 0xD, 0xD, 0x6, 0xB, 0xB6, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0x3F, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xF0, 0xE9, 0xD8, 0xD8, 0xB8, 0xA5, 0x39, 0x35, 0x27, 0x16, 0x15, 0x9, 0x6,
- 0x2, 0x14, 0x14, 0x14, 0x2, 0x15, 0x2, 0x14, 0x6, 0x35, 0x99, 0x24, 0x26, 0x24, 0xF2, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xE9, 0xB9, 0xB4, 0xA5, 0xAA, 0xB4, 0x94, 0x41, 0x33,
- 0x33, 0x2C, 0xC, 0x0, 0x5, 0x0, 0x0, 0x23, 0x20, 0xD, 0x20, 0x20, 0xCC, 0xCC, 0xBF, 0xCB,
- 0xE3, 0xC7, 0xC9, 0xCA, 0xCA, 0xCA, 0xC9, 0xC9, 0xC9, 0xC9, 0x5C, 0xBF, 0xF3, 0xCF, 0xCF, 0xCF,
- 0xC4, 0x2F, 0xA, 0x1, 0x1, 0xE, 0x1A, 0x2F, 0x3A, 0x48, 0xA6, 0xAB, 0xAD, 0xC1, 0xC9, 0xCD,
- 0xCD, 0xC1, 0xEC, 0x5A, 0xBF, 0xC9, 0xAD, 0xC9, 0xC9, 0xC9, 0xC9, 0xBF, 0xAD, 0xCB, 0xC9, 0xC9,
- 0xC9, 0xCB, 0xCB, 0xCB, 0xCF, 0xCF, 0xCE, 0xCE, 0xCE, 0xAD, 0xCD, 0xCD, 0xCD, 0xCD, 0xC2, 0xC2,
- 0xC2, 0xC2, 0xC2, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xD0, 0xCA, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x57, 0x58, 0x5A, 0x57, 0x57, 0x57, 0x57, 0x5A, 0x5A, 0x0,
- 0x4, 0xB, 0xD, 0x4, 0x4, 0xA7, 0x6F, 0x6F, 0xA3, 0xB8, 0xE9, 0xEB, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB,
- 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x38, 0xE9, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF0, 0xF0, 0xEE, 0xE9, 0xE9, 0xE9, 0xD8, 0xB8, 0xB6, 0xAC, 0xAC,
- 0x4E, 0x35, 0x15, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0xD7, 0x27, 0x15, 0x27, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xE9, 0xBD, 0xBD, 0xAA, 0xA5, 0xA3, 0x3B, 0x3A,
- 0x31, 0x2E, 0xE, 0xFE, 0x0, 0x5, 0x5, 0x23, 0x30, 0x5, 0x20, 0x25, 0xC9, 0xC9, 0xC9, 0x55,
- 0xC9, 0xE3, 0xC3, 0xCA, 0xCA, 0xCA, 0xC9, 0x5C, 0x5A, 0x56, 0x56, 0x56, 0x5C, 0xCE, 0xEC, 0x41,
- 0x7, 0x7, 0x9, 0xE, 0x7, 0x12, 0x2D, 0x2F, 0x36, 0x52, 0xAD, 0xAD, 0xAD, 0xBF, 0xCD, 0xCD,
- 0xCD, 0xC9, 0xEC, 0x59, 0xCD, 0xCD, 0xCD, 0xC9, 0xC9, 0xC9, 0xC9, 0xCE, 0xBF, 0x53, 0x55, 0x52,
- 0x36, 0xAD, 0xCE, 0xCC, 0xCA, 0xCA, 0xCC, 0xCA, 0xCA, 0x55, 0xC9, 0xCB, 0xCB, 0xCC, 0xCC, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x5A, 0x5A, 0x7,
- 0xB, 0x20, 0x20, 0x4, 0x4, 0xB5, 0xA9, 0xB6, 0xBD, 0xE9, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE9, 0x2C, 0xA3, 0xE, 0xFD, 0xFD, 0xBD, 0x38, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xF8, 0xF7, 0xF7, 0xF7, 0xF7, 0xF5, 0xF0, 0xE9, 0xD8,
- 0xBD, 0xB8, 0xA5, 0x16, 0x6, 0x14, 0x15, 0x16, 0x39, 0xAC, 0xF7, 0xF2, 0xB5, 0xF2, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xF5, 0xEE, 0xEF, 0xD8, 0xAC, 0xA3, 0x3C,
- 0x33, 0x2C, 0xE, 0x0, 0x0, 0x4, 0x4, 0x30, 0x30, 0x4, 0x4, 0x5, 0xC9, 0xC9, 0x5C, 0x55,
- 0x52, 0x52, 0x53, 0x50, 0x4F, 0x4F, 0x4F, 0x5C, 0x5A, 0x56, 0x56, 0x46, 0x1A, 0x3, 0x1, 0x1,
- 0x1, 0x1, 0x0, 0x1, 0x1, 0xA, 0x1A, 0x34, 0x3D, 0xAD, 0xAD, 0xAD, 0xAD, 0xCD, 0xCE, 0xCE,
- 0xCD, 0xC9, 0xCD, 0x50, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCC, 0xD0, 0xCC, 0xCA, 0xBF, 0xBF,
- 0xC0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0x5D, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x58, 0x5B, 0x58, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x57, 0x57, 0x57, 0x5A, 0x5A, 0x9,
- 0xB, 0x25, 0x25, 0x4, 0x4, 0xEF, 0xD8, 0xE9, 0xEC, 0xF1, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6, 0x3F, 0xFD, 0xFD, 0x2C, 0xEE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xEF, 0xEF, 0xF7, 0xF9, 0xFD, 0xFD, 0xFD, 0xF8, 0xF5, 0xEE,
- 0xE9, 0xD8, 0xD8, 0xB8, 0x40, 0x35, 0x4E, 0x97, 0x4D, 0x4E, 0xBC, 0xF2, 0xF6, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xE9, 0xB6, 0x94,
- 0x3A, 0x31, 0x2C, 0x0, 0x0, 0x4, 0x5, 0x37, 0x33, 0x0, 0x0, 0x0, 0x9, 0x1, 0x0, 0x7,
- 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55, 0x5C, 0x56, 0x56, 0x46, 0x0, 0x0, 0x0, 0x1,
- 0x1, 0x1, 0x0, 0x0, 0x1, 0x7, 0xA, 0x2F, 0x54, 0xAD, 0xAD, 0xC4, 0xCE, 0xD0, 0xD0, 0xD0,
- 0xD0, 0xD0, 0xF1, 0x4F, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x57, 0x57, 0x57, 0x5A, 0x5A, 0x7,
- 0x6, 0x25, 0x30, 0xB, 0x4, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xB7,
- 0x41, 0x2C, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB5, 0x6, 0x16, 0x35, 0x97, 0xEF, 0xF9, 0xF2, 0xEF, 0xEB, 0xC6,
- 0xAC, 0x4D, 0x99, 0x35, 0x9, 0x16, 0x3C, 0x6, 0x2, 0x2, 0x2, 0x6, 0x16, 0x99, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8, 0xAA,
- 0x3B, 0x33, 0x2C, 0x7, 0x0, 0x0, 0x4, 0x30, 0x30, 0x0, 0x0, 0x0, 0x9, 0x3, 0x1, 0x0,
- 0x1, 0x0, 0x1, 0x1, 0x3, 0x1, 0x1, 0x53, 0xBF, 0x56, 0x56, 0x47, 0x1, 0x1, 0x1, 0x3,
- 0x3, 0x3, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0xA, 0x1A, 0x2F, 0x2F, 0x2F, 0x2F, 0x3D, 0x3D,
- 0xAD, 0xD0, 0xF1, 0x43, 0xD0, 0xD0, 0xC9, 0xBF, 0xBF, 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCC, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x57, 0x57, 0x5A, 0x5A, 0x7,
- 0x4, 0x20, 0x20, 0x4, 0x6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xE9, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAC, 0x15, 0x15, 0x15, 0x16, 0xAC, 0xAC, 0x16, 0x6, 0x16, 0x6,
- 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x2, 0x14, 0x17, 0x17, 0x17, 0x2, 0x2, 0x2, 0x99, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6,
- 0x41, 0x33, 0x31, 0xE, 0x7, 0x0, 0x4, 0x25, 0x25, 0x4, 0x0, 0x4, 0x12, 0x3, 0xA, 0x1,
- 0x1, 0x0, 0x0, 0x1, 0x9, 0x1, 0x0, 0x4F, 0xC9, 0x56, 0x56, 0x50, 0x3, 0x1, 0x1, 0x1,
- 0x1, 0x1, 0x1, 0x8, 0x7, 0x7, 0xA, 0x1A, 0x34, 0x34, 0x36, 0x48, 0x54, 0x53, 0xAB, 0xAD,
- 0xAD, 0xAD, 0xA6, 0x1A, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0x54, 0x55, 0xAD, 0xBF, 0xBF,
- 0xC9, 0xCC, 0xCC, 0xCA, 0xCA, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0xB,
- 0xB, 0x3E, 0x37, 0xB, 0x4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xA3,
- 0xBD, 0xF8, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0xE, 0x2C, 0x41, 0xB6, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEF, 0x35, 0x27, 0x4D, 0x4D, 0x27, 0x2, 0x14, 0x24, 0x15, 0x2,
- 0x14, 0x15, 0x15, 0x17, 0x14, 0x2, 0x14, 0x17, 0x17, 0x17, 0x15, 0x14, 0x14, 0x15, 0x27, 0xF6,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB8,
- 0x6F, 0x38, 0x33, 0xE, 0x7, 0x0, 0x4, 0x20, 0x1F, 0x4, 0x4, 0x4, 0x3, 0x3, 0x1, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x4F, 0xC9, 0x56, 0x56, 0x59, 0xA, 0x3, 0x3, 0x3,
- 0x1, 0x1, 0x0, 0x1, 0x7, 0xE, 0x2D, 0x2F, 0x3D, 0x54, 0xC4, 0xBF, 0xAD, 0xAD, 0xAD, 0xAD,
- 0xAD, 0xBF, 0x36, 0x10, 0x55, 0xAD, 0xAD, 0xAD, 0xAD, 0x4C, 0x18, 0x10, 0x12, 0x36, 0x46, 0x46,
- 0x4F, 0x53, 0x55, 0x5A, 0x5C, 0xC9, 0xC9, 0xCA, 0xCC, 0xCC, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA,
- 0x5D, 0x5D, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x57, 0x58, 0x58, 0xB,
- 0xD, 0x3E, 0x33, 0xB, 0x4, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xB6,
- 0x3F, 0xE, 0x2C, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF8, 0xBD, 0xA3, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF8, 0xF7, 0xF5, 0x99, 0x16, 0x6, 0x2, 0x2, 0x2, 0x17, 0x26, 0x26, 0x26, 0x15,
- 0x2, 0x14, 0x24, 0x15, 0x14, 0x15, 0x17, 0x17, 0x17, 0x15, 0x17, 0x15, 0x15, 0x26, 0x24, 0xB5,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7,
- 0x6F, 0x38, 0x31, 0x7, 0x1, 0x0, 0x2, 0xD, 0x6, 0x4, 0x4, 0x4, 0x1A, 0xA, 0x1, 0x0,
- 0xE, 0x1, 0x0, 0x1, 0x7, 0x0, 0x0, 0x46, 0xCD, 0x56, 0x56, 0x59, 0x10, 0x3, 0x1, 0x9,
- 0x1, 0x3, 0x1, 0x0, 0x1, 0x1, 0x3, 0x1A, 0x1A, 0x36, 0x3D, 0x48, 0x3D, 0x3D, 0x48, 0x54,
- 0x55, 0xBF, 0x4C, 0x3, 0x52, 0xBF, 0xAD, 0x1A, 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1D, 0x47,
- 0x47, 0x47, 0x47, 0x47, 0x46, 0x46, 0x46, 0x55, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0x5D, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x57, 0x57, 0x58, 0x5A, 0x6,
- 0x0, 0x4, 0x5, 0x4, 0xA7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xA3, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF5, 0xEE, 0xE9, 0xB8, 0x24, 0x15, 0x17, 0x15, 0x2, 0x14, 0x15, 0x24, 0x26, 0x26, 0x24,
- 0x15, 0x14, 0x24, 0x15, 0x14, 0x15, 0x17, 0x15, 0x15, 0x17, 0x26, 0x17, 0x15, 0x26, 0x17, 0x99,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB7,
- 0x6F, 0x38, 0x2C, 0x5, 0x0, 0x0, 0x2, 0xD, 0xD, 0x4, 0x4, 0x4, 0x3, 0xA, 0x1, 0x0,
- 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1C, 0xC9, 0x51, 0x56, 0x59, 0x18, 0x3, 0x1, 0x3,
- 0x3, 0x1, 0x3, 0x3, 0x3, 0x1A, 0x2F, 0x36, 0x36, 0x4C, 0x54, 0xAD, 0xAD, 0xBF, 0xC9, 0xC9,
- 0xC9, 0xC9, 0x54, 0x3, 0x52, 0xC9, 0x34, 0x8, 0x52, 0x0, 0x0, 0x1, 0x3, 0x52, 0x52, 0xBF,
- 0xC9, 0xCD, 0xCE, 0xCA, 0xCC, 0xD0, 0xD0, 0xD0, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0x5D, 0x5D, 0xCA, 0x5D, 0xCA, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x58, 0x5A, 0x5A, 0x6,
- 0x4, 0x0, 0x4, 0x4, 0xD, 0xED, 0xEF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBB, 0xA8, 0xE, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xEA, 0xD8, 0xBD, 0x4D, 0x15, 0x26, 0x26, 0x26, 0x14, 0x14, 0x14, 0x15, 0x15, 0x17, 0x26,
- 0x2A, 0x24, 0x17, 0x15, 0x15, 0x17, 0x24, 0x15, 0x15, 0x26, 0x26, 0x17, 0x17, 0x26, 0x24, 0xC6,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6,
- 0x41, 0x38, 0x30, 0x4, 0x4, 0x0, 0x0, 0xE, 0xD, 0x4, 0x4, 0x4, 0x3, 0x1, 0x1, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0x2F, 0xCE, 0x57, 0x57, 0x5A, 0x1D, 0xA, 0x3, 0x3,
- 0x1, 0x3, 0x12, 0x2C, 0xA, 0xA, 0x2E, 0x3D, 0x4C, 0x4C, 0x52, 0xAD, 0xAD, 0xAD, 0xBF, 0xC9,
- 0xC9, 0xAD, 0x19, 0x11, 0x11, 0x10, 0x1, 0x3, 0x10, 0x0, 0x0, 0x1, 0x10, 0x19, 0x19, 0x18,
- 0x1C, 0xCE, 0xCE, 0xC9, 0xC9, 0xC9, 0xC9, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x58, 0x57, 0x57, 0x57, 0x58, 0x5B, 0x5B, 0x6,
- 0x4, 0x37, 0x37, 0x6, 0x4, 0x4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x41, 0xBD, 0xFD, 0xF0, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF5, 0xE9, 0xBD, 0xBD, 0x39, 0x15, 0x26, 0x26, 0x26, 0x15, 0x15, 0x15, 0x15, 0x14, 0x14, 0x15,
- 0x26, 0x26, 0x17, 0x15, 0x24, 0x24, 0x15, 0x14, 0x15, 0x26, 0x26, 0x15, 0x14, 0x2, 0x4D, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6,
- 0x41, 0x38, 0x30, 0x4, 0x4, 0x4, 0x0, 0xE, 0x20, 0x4, 0x4, 0x4, 0x3, 0x1, 0x1, 0x1,
- 0x0, 0x1, 0x1, 0x1, 0x7, 0x1, 0x1, 0x1A, 0xCA, 0x57, 0x57, 0x51, 0x43, 0x3, 0x3, 0x3,
- 0xA, 0xA, 0x3, 0x1A, 0xA, 0xA, 0x8, 0x36, 0x52, 0x4C, 0x4C, 0x52, 0x48, 0x4C, 0x4C, 0x4C,
- 0x36, 0x1A, 0x11, 0x10, 0x35, 0x2B, 0x3, 0x3, 0x3, 0xFE, 0x0, 0x1, 0x18, 0x18, 0x19, 0x1B,
- 0x1B, 0xCE, 0xCE, 0xCE, 0xD0, 0xD0, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x57, 0x58, 0x57, 0x57, 0x58, 0x58, 0x58, 0x5B, 0x6,
- 0x6, 0x37, 0x25, 0x1F, 0x4, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0x41, 0xE, 0x2C, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF5, 0xE9, 0xD8, 0xBD, 0xA9, 0x35, 0x35, 0x27, 0x24, 0x15, 0x15, 0x15, 0x17, 0x17, 0x17, 0x17,
- 0x26, 0x26, 0x15, 0x15, 0x24, 0x15, 0x15, 0x2, 0x15, 0x26, 0x15, 0x17, 0x15, 0x2, 0x4E, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB4,
- 0x41, 0x38, 0xE, 0x4, 0x4, 0x4, 0x4, 0x30, 0x25, 0x4, 0x4, 0x4, 0x3, 0x1, 0x1, 0x1,
- 0x3, 0x1, 0x3, 0xF, 0xF, 0xF, 0x10, 0x10, 0xC9, 0x5A, 0x57, 0x57, 0x43, 0xF, 0xF, 0x10,
- 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10,
- 0xF, 0xF, 0x10, 0x3, 0x32, 0x16, 0x3, 0x3, 0x3, 0x0, 0x1, 0x3, 0x10, 0x18, 0x18, 0x46,
- 0x18, 0xCE, 0xCE, 0xCD, 0xCE, 0xD0, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCC,
- 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x58,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x1F,
- 0x21, 0x71, 0x37, 0x25, 0x4, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xEA, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF8, 0xF5, 0xF0, 0xF0, 0xE9, 0xD8, 0xBD, 0xBC, 0xAC, 0x27, 0x15, 0x17, 0x17, 0x15, 0x15, 0x24,
- 0x15, 0x17, 0x17, 0x24, 0x24, 0x15, 0x15, 0x14, 0x15, 0x26, 0x26, 0x26, 0x15, 0x2, 0x94, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB4,
- 0x3B, 0x38, 0xE, 0x4, 0x4, 0x4, 0x0, 0x23, 0x20, 0x4, 0x4, 0x4, 0x1, 0x1, 0x0, 0x0,
- 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5C, 0x5A, 0x57, 0x5A, 0x46, 0x1, 0xF, 0xF,
- 0x1, 0xF, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0,
- 0x1, 0xF, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x10, 0x12, 0x10, 0x10, 0x12, 0x12, 0x55,
- 0x12, 0x1D, 0x46, 0x43, 0x46, 0x4F, 0x46, 0x46, 0x46, 0x46, 0x4F, 0x4F, 0x4F, 0x50, 0x50, 0x51,
- 0x55, 0x5C, 0xCA, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x1F,
- 0x28, 0x71, 0x39, 0x20, 0x4, 0x6E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x31, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xEA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xF9, 0xF7, 0xF0, 0xE9, 0xD8, 0xD8, 0xBC, 0xA5, 0x39, 0x35, 0x39, 0x4D, 0x4D,
- 0x27, 0x2, 0x2, 0x17, 0x17, 0x14, 0x15, 0x14, 0x14, 0x17, 0x17, 0x24, 0x16, 0xB6, 0xF9, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB4,
- 0x3B, 0x38, 0x2C, 0x4, 0x4, 0x0, 0x0, 0x25, 0x20, 0x4, 0x4, 0x4, 0xF, 0xF, 0xF, 0xF,
- 0x1, 0x0, 0xFE, 0x1, 0x13, 0x1B, 0x42, 0x43, 0x5C, 0x5C, 0x57, 0x57, 0x56, 0x47, 0x47, 0x47,
- 0x1A, 0x0, 0x0, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1A, 0x53, 0x53, 0x55, 0xBF, 0xBF,
- 0xA, 0x3, 0x10, 0xF, 0x3, 0x10, 0x3, 0xF, 0xF, 0x10, 0xF, 0x10, 0x10, 0x10, 0x10, 0x10,
- 0x10, 0x1B, 0xCA, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x58, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x1E,
- 0x28, 0xB2, 0x37, 0xD, 0x0, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x31, 0xFD, 0xFD, 0xFD, 0x41, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF0, 0xF0, 0xF0, 0xEE, 0xE9, 0xE9, 0xBD, 0x4E, 0x9,
- 0x2, 0x2, 0x15, 0x17, 0x17, 0x15, 0x15, 0x6, 0x9, 0x39, 0x97, 0x99, 0xF2, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xAA,
- 0x3F, 0x33, 0x2C, 0x4, 0x4, 0x0, 0x0, 0x25, 0x20, 0x4, 0x4, 0x4, 0x10, 0xF, 0xF, 0x1,
- 0x1, 0x1, 0x0, 0x1, 0x1B, 0x44, 0x46, 0x4F, 0x55, 0x5C, 0x57, 0x57, 0x56, 0x47, 0x47, 0x53,
- 0x50, 0x19, 0x10, 0x10, 0xF, 0x10, 0x10, 0x10, 0x10, 0xF, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF,
- 0x0, 0x0, 0x0, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x53, 0xBF, 0xC9, 0xC9, 0xBF,
- 0x1D, 0x46, 0x36, 0x1D, 0x1D, 0x1D, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
- 0x1B, 0x34, 0x55, 0xC0, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x1E,
- 0x28, 0xD5, 0xA7, 0x4, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x33, 0xE,
- 0xFD, 0xF9, 0x3A, 0xE, 0x33, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF5, 0xAA, 0xFD, 0xBB, 0xE, 0xF0, 0xE9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xF7, 0xF0, 0xE9, 0xD8, 0xAC, 0x15, 0x15,
- 0x14, 0x14, 0x17, 0x17, 0x17, 0x24, 0x4D, 0xBC, 0xEB, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3F, 0x33, 0x2C, 0x7, 0x4, 0x0, 0x4, 0x25, 0x25, 0x4, 0x4, 0x1E, 0x1, 0x1, 0x1, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x50, 0x5C, 0x51, 0x51, 0x56, 0x10, 0xF, 0xF,
- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF, 0x10, 0xF, 0x10, 0x10, 0x10, 0x10,
- 0x1, 0xF, 0xF, 0xF, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x12, 0xBF, 0xBF, 0xC9, 0xBF,
- 0xAD, 0xBF, 0xBF, 0xBE, 0xBE, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xA4, 0xA6, 0x53,
- 0xA4, 0x52, 0x2D, 0x3, 0x10, 0x10, 0x18, 0x1B, 0x19, 0x1B, 0x1D, 0x50, 0x5A, 0x5B, 0x5A, 0x5B,
- 0x5A, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x4,
- 0x28, 0xB5, 0x97, 0x4, 0x4, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF7,
- 0xFD, 0x94, 0xE, 0xE, 0xE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xB4, 0xE, 0x31, 0xB6, 0xE, 0xE, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xC6, 0xAC, 0xF2, 0xFD, 0xFD, 0xF7, 0xEA, 0xBD, 0xBD, 0x4D, 0x15, 0x15,
- 0x14, 0x2, 0x15, 0x17, 0x15, 0x27, 0xEF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8,
- 0x3C, 0x32, 0x2C, 0xB, 0x4, 0x0, 0x4, 0x25, 0x25, 0x4, 0x4, 0x1E, 0x0, 0x0, 0x0, 0x0,
- 0x2B, 0x7, 0x2B, 0x0, 0x0, 0x0, 0x1, 0x1, 0x4F, 0x5C, 0x57, 0x51, 0x51, 0x1, 0x1, 0x1,
- 0x1, 0x3, 0x3, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xF, 0x1,
- 0x11, 0x19, 0x11, 0x11, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x52, 0xAD, 0xBF, 0xBF,
- 0x1C, 0x3, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1,
- 0x1, 0x1, 0xF, 0xF, 0x10, 0x10, 0x10, 0x3, 0x2E, 0x10, 0x10, 0x19, 0x19, 0x59, 0x5A, 0x5A,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x1E,
- 0x28, 0xB5, 0x37, 0xD, 0x4, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF0,
- 0xE9, 0xE, 0xE, 0xB7, 0xF7, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF7, 0xF5, 0xF5, 0xA9, 0x6, 0x2, 0x9, 0x40, 0xEB, 0xF2, 0xE9, 0xBD, 0xBD, 0xA5, 0x16, 0x15,
- 0x17, 0x15, 0x15, 0x17, 0x15, 0x2, 0x27, 0xC6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xA8,
- 0x3A, 0x32, 0xE, 0x6, 0x4, 0x0, 0x4, 0x30, 0x30, 0x4, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0,
- 0x4, 0x0, 0x0, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x43, 0x5C, 0x51, 0x51, 0x51, 0x1, 0x0, 0x0,
- 0x0, 0x1, 0x0, 0x0, 0x0, 0x7, 0x2B, 0x7, 0x2B, 0x7, 0x4B, 0x9, 0x0, 0x0, 0x1, 0x1,
- 0x18, 0x10, 0x10, 0x10, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1A, 0xBF, 0xBF, 0xBF,
- 0x1B, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1,
- 0x0, 0x0, 0x7, 0x27, 0x1, 0x1, 0x1, 0x1, 0x96, 0x12, 0x11, 0x11, 0x19, 0x19, 0x34, 0x36,
- 0x36, 0x43, 0x46, 0x46, 0x46, 0x5A, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x28, 0xD5, 0x6E, 0xB, 0x4, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3F, 0xE,
- 0xE, 0xE, 0x3A, 0xFD, 0xF0, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xEA, 0xE9, 0xD8, 0x25, 0x14, 0x2, 0x2, 0x2, 0x9, 0x4E, 0xC6, 0xD8, 0xBD, 0xB7, 0xA5, 0x35,
- 0x15, 0x14, 0x17, 0x17, 0x15, 0x14, 0x2, 0x6, 0x4E, 0xF2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x33, 0xD, 0x4, 0x4, 0x0, 0x0, 0x32, 0x29, 0x4, 0x4, 0x1E, 0x8, 0x7, 0x7, 0x1,
- 0x1, 0x0, 0xFE, 0xFE, 0xFE, 0x0, 0x1, 0x1, 0x43, 0xC0, 0x51, 0x57, 0x51, 0x1A, 0x10, 0x3,
- 0x10, 0x10, 0x10, 0x10, 0x3, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3,
- 0x10, 0x10, 0x10, 0x10, 0x12, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x36, 0xBF, 0xBF,
- 0x1A, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x9, 0x16, 0x7, 0xD,
- 0x0, 0x0, 0x7, 0x2B, 0x0, 0x0, 0x0, 0x0, 0x2B, 0x9, 0x3, 0x10, 0x19, 0x19, 0xBF, 0xBF,
- 0xBF, 0xC0, 0xC0, 0xC0, 0x5A, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x4,
- 0x28, 0xB2, 0x6B, 0x20, 0x4, 0x30, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0x3A,
- 0xE, 0x33, 0xF5, 0xFD, 0xE, 0x38, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xB4, 0x41, 0xFD, 0xFD, 0xAA, 0x38, 0xEE, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0,
- 0xD8, 0xBD, 0xB6, 0x16, 0x2, 0x15, 0x17, 0x15, 0x2, 0x2, 0x16, 0x39, 0x35, 0x2E, 0x2, 0x2,
- 0x14, 0x2, 0x14, 0x17, 0x17, 0x15, 0x15, 0x14, 0x2, 0x39, 0xEF, 0xF2, 0xF2, 0xF6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x32, 0xB, 0x4, 0x4, 0x4, 0x2, 0x25, 0x29, 0x1F, 0x4, 0x6, 0x52, 0x52, 0xA6, 0x46,
- 0x52, 0x36, 0x0, 0x0, 0xFE, 0x3, 0x46, 0x4F, 0x50, 0xCA, 0x57, 0x57, 0x56, 0x46, 0x46, 0x1D,
- 0x43, 0x46, 0x43, 0x43, 0x43, 0x43, 0x1A, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x10,
- 0x10, 0x10, 0x10, 0x1B, 0x1B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x46, 0x4F,
- 0x18, 0x3, 0x10, 0x10, 0x10, 0x3, 0x3, 0x3, 0x3, 0x1, 0x1, 0x3, 0x3, 0x1, 0x1, 0x7,
- 0x1, 0x0, 0x0, 0x7, 0x1, 0x1, 0x1, 0x1, 0x7, 0x1, 0x1, 0x1, 0x12, 0x19, 0x4F, 0x59,
- 0x5A, 0x58, 0x5B, 0x58, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x29, 0x9D, 0x37, 0x25, 0x6, 0xA7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xE9, 0xA3, 0xFD, 0xFD, 0xD8, 0x2C, 0xFD, 0xFD, 0xFD, 0xF8, 0xEA,
- 0xBD, 0xBD, 0xAC, 0x16, 0x15, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x2, 0x0, 0x0, 0x2, 0x2,
- 0x2, 0x2, 0x14, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x2, 0x15, 0x6, 0x9, 0x16, 0xC6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0xA3,
- 0x3A, 0x2E, 0x5, 0x0, 0x4, 0x4, 0x0, 0xD, 0x20, 0x1F, 0x6, 0x4, 0xBF, 0xAB, 0xC4, 0x52,
- 0x55, 0x55, 0x34, 0xF, 0x10, 0x10, 0x10, 0x10, 0x1B, 0xCC, 0x5A, 0x57, 0x57, 0x1B, 0x10, 0x11,
- 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x10, 0xF, 0x1, 0x1, 0x1, 0x4F, 0x53,
- 0x53, 0x52, 0x52, 0x53, 0x1B, 0x3, 0x1, 0x1, 0x1, 0x10, 0x1A, 0x13, 0x18, 0x13, 0x18, 0x18,
- 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x13, 0x13, 0x1A, 0x8, 0x8, 0x3, 0x8, 0x8,
- 0x3, 0x3, 0x3, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x12, 0x12, 0x18,
- 0x1A, 0x46, 0x50, 0x50, 0x56, 0x57, 0x58, 0x57, 0x56, 0x4F, 0x4F, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x29, 0xD5, 0x71, 0xB, 0xFE, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD, 0xB6, 0xA8, 0xFD, 0xEE, 0xE, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x6, 0x14, 0x14, 0x2, 0x2, 0x2, 0x15, 0x24, 0x15, 0x15, 0x14, 0x2, 0x2,
- 0x2, 0x2, 0x14, 0x15, 0x15, 0x17, 0x15, 0x17, 0x14, 0x2, 0x2, 0x15, 0x14, 0x2, 0x3C, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0xA3,
- 0x33, 0x2C, 0x5, 0x4, 0x6, 0x4, 0xFE, 0x4, 0xB, 0x6, 0x4, 0x4, 0x54, 0x54, 0xAD, 0x54,
- 0xC9, 0xC9, 0x4F, 0x46, 0x49, 0x53, 0x53, 0x53, 0x53, 0xCE, 0x5A, 0x57, 0x57, 0x50, 0x49, 0x47,
- 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x3, 0x0, 0x0, 0x53, 0xC9,
- 0xC9, 0xC9, 0xC9, 0x5C, 0x1B, 0x1, 0x1, 0x0, 0x0, 0x1, 0x36, 0x49, 0x49, 0x49, 0x49, 0x49,
- 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xAD, 0x55, 0xAD, 0x55, 0xBF, 0xBF,
- 0xAD, 0xAD, 0xAB, 0x55, 0xAD, 0xAD, 0xAD, 0x55, 0x53, 0x53, 0x53, 0x52, 0x3D, 0x34, 0x12, 0x48,
- 0x46, 0x46, 0x36, 0x1D, 0x1B, 0x1B, 0x1B, 0x1A, 0x1A, 0x1B, 0x1D, 0x50, 0x5B, 0x5B, 0x5D, 0x5,
- 0x29, 0xD6, 0x39, 0x1F, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0x2C, 0x41, 0xB6, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xE, 0x2C, 0xBD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9,
- 0xBD, 0xBD, 0xAC, 0x16, 0x15, 0x14, 0x9, 0x6, 0x6, 0x15, 0x14, 0x2, 0x2, 0x2, 0x14, 0x2,
- 0x2, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x17, 0x2, 0x15, 0x15, 0x15, 0x15, 0x16, 0xF2,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x94,
- 0x38, 0x31, 0xE, 0x5, 0x4, 0x4, 0xFE, 0xB, 0x20, 0x5, 0x4, 0x4, 0x0, 0xFE, 0x0, 0x0,
- 0x1A, 0x55, 0x55, 0x55, 0xCE, 0xC2, 0xCE, 0xC2, 0xC2, 0xC9, 0x5C, 0x5A, 0x57, 0xC0, 0xC2, 0xC2,
- 0xC1, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xCE, 0xAB, 0x1, 0x0, 0x12, 0xBF,
- 0xC9, 0xCD, 0xCE, 0xC9, 0x1B, 0x1, 0x0, 0x0, 0x0, 0x1, 0x8, 0xAB, 0xC1, 0xC1, 0xC2, 0xC2,
- 0xC1, 0xC1, 0xC1, 0xC2, 0xC2, 0xC2, 0xEC, 0xEC, 0xC2, 0xEA, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xC9,
- 0xCD, 0xCD, 0xBF, 0xC9, 0xBF, 0xBF, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xCE, 0xCF, 0xF3, 0xCF, 0xBE,
- 0xBE, 0xBE, 0xBE, 0xBE, 0xAB, 0xAB, 0x53, 0x53, 0x47, 0x47, 0x49, 0x53, 0x5B, 0x5B, 0x5D, 0xB,
- 0x25, 0xD7, 0x71, 0x1F, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xB6,
- 0x41, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xEA,
- 0xD8, 0xE9, 0xBC, 0x27, 0x16, 0x4E, 0xAC, 0xA9, 0x16, 0x14, 0x2, 0x2, 0x14, 0x15, 0x15, 0x15,
- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x14, 0x15, 0x15, 0x17, 0x26, 0x26, 0x26, 0x99,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x94,
- 0x33, 0x31, 0xE, 0xB, 0x4, 0x0, 0x20, 0xA7, 0x37, 0x5, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0,
- 0x1, 0x3, 0x55, 0xBF, 0xBF, 0xC2, 0xCD, 0xBF, 0xBF, 0x5C, 0x5C, 0x5A, 0x5A, 0x5C, 0xC9, 0x55,
- 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xAD, 0xBF, 0x55, 0x12, 0x1, 0x0, 0x1, 0x1A,
- 0xAD, 0x55, 0x55, 0xBF, 0x1B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x1B, 0x1B, 0x1B, 0x59,
- 0xAD, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xBF, 0xC9, 0xCD, 0xBF, 0xCD, 0xC9, 0xCD, 0xCD, 0xCE, 0xCD,
- 0xCD, 0xCD, 0xBF, 0xBF, 0xBF, 0xC9, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xCD, 0xCF, 0xD0, 0xD0, 0xC2,
- 0xC2, 0xC2, 0xCE, 0xCE, 0xC2, 0xCE, 0xCE, 0xC9, 0xBE, 0xBE, 0xBE, 0xC0, 0x5B, 0x5B, 0x5D, 0xC,
- 0x1F, 0x9D, 0x96, 0x0, 0x4, 0xF2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xE, 0xBB, 0x41, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0,
- 0xF0, 0xF0, 0xF5, 0xEB, 0xC6, 0xD8, 0xBD, 0xBD, 0xB6, 0x27, 0x14, 0x14, 0x14, 0x15, 0x15, 0x14,
- 0x14, 0x14, 0x14, 0x14, 0x2, 0x14, 0x24, 0x15, 0x15, 0x17, 0x26, 0x24, 0x26, 0x26, 0x26, 0x4E,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x94,
- 0x38, 0x31, 0x2C, 0x5, 0x4, 0x0, 0x30, 0xB0, 0x37, 0x4, 0x0, 0x4, 0x1A, 0x12, 0x12, 0x3,
- 0x1, 0x1, 0x3, 0x1A, 0x4C, 0xC9, 0xCA, 0xCA, 0xC9, 0x5C, 0xC0, 0x5A, 0x5C, 0x5C, 0x5C, 0x55,
- 0xBF, 0xBF, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x55, 0xBF, 0x5C, 0x43, 0x1, 0x0, 0x1, 0x3,
- 0x12, 0x55, 0xC9, 0xC9, 0x1D, 0x18, 0x18, 0x18, 0x12, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x5A,
- 0x36, 0x3D, 0x4C, 0x4C, 0x4F, 0x52, 0x52, 0x52, 0xA6, 0x54, 0xC9, 0xCD, 0xCD, 0xCD, 0xC9, 0xCD,
- 0xCE, 0xCE, 0xBF, 0xC9, 0xC6, 0x9B, 0x9B, 0xB2, 0xAC, 0xC9, 0xCD, 0xCD, 0xCF, 0xD0, 0xD0, 0x5C,
- 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5A, 0xC0, 0x5B, 0x5D, 0x5B, 0x5D, 0xC,
- 0x25, 0x9D, 0x6B, 0x4, 0x25, 0x97, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF8, 0xF9, 0xFD, 0xFD, 0xF7, 0xF0, 0xE9, 0xE9, 0xE9, 0xBD, 0xA5, 0x4D, 0x97, 0xAC, 0x4E, 0x2E,
- 0x9, 0x14, 0x14, 0x14, 0x2, 0x15, 0x15, 0x15, 0x15, 0x24, 0x26, 0x24, 0x26, 0x26, 0x17, 0x4E,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0xA3,
- 0x38, 0x31, 0xE, 0x4, 0x6, 0x0, 0x30, 0x72, 0x25, 0x0, 0x0, 0x4, 0xCE, 0xC9, 0xCE, 0xCD,
- 0x36, 0x1, 0x1, 0x12, 0x18, 0xBF, 0xC9, 0xC9, 0xC9, 0x5C, 0xC9, 0x5C, 0x5C, 0x5C, 0xC9, 0xAD,
- 0xBF, 0xC9, 0xBF, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0xAD, 0xBF, 0xBF, 0xBF, 0x12, 0x0, 0x3, 0x1B,
- 0x1, 0x8, 0x55, 0xC9, 0x1D, 0x18, 0x18, 0x18, 0x12, 0x12, 0x1A, 0x1A, 0x1A, 0x1A, 0x1B, 0x5A,
- 0x1A, 0x1A, 0x2D, 0x1A, 0x2F, 0x34, 0x34, 0x34, 0x34, 0x4C, 0xC9, 0xCD, 0xC9, 0xC9, 0xC9, 0xC9,
- 0xCD, 0xCE, 0xBF, 0xC9, 0xB4, 0x39, 0x39, 0x39, 0x48, 0xBF, 0xBF, 0xC9, 0xCF, 0xD0, 0xCC, 0x5B,
- 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0xC,
- 0x37, 0xE6, 0x9B, 0x25, 0x29, 0x4, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF5, 0xF5, 0xF7, 0xF5, 0xF0, 0xE9, 0xD8, 0xBD, 0xB8,
- 0xAC, 0x39, 0x15, 0x14, 0x14, 0x15, 0x15, 0x15, 0x17, 0x26, 0x26, 0x26, 0x26, 0x26, 0x17, 0x99,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0xA3,
- 0x38, 0x32, 0xE, 0x4, 0x4, 0x0, 0x37, 0x6C, 0x20, 0x4, 0x4, 0x4, 0xBF, 0xBF, 0xBF, 0xBF,
- 0x55, 0x3, 0x18, 0xC9, 0xCC, 0x5A, 0xC9, 0xC9, 0xC9, 0x5C, 0xC9, 0x5C, 0x5A, 0x5C, 0x5C, 0xBF,
- 0xBF, 0xC8, 0xC3, 0xC4, 0xC7, 0xAD, 0xE1, 0x9D, 0xAD, 0xBF, 0xAD, 0xBF, 0x4F, 0x1, 0x1, 0xBF,
- 0x1A, 0x0, 0x8, 0xAD, 0x36, 0x1A, 0x1A, 0x1B, 0x1A, 0x1A, 0x34, 0x3C, 0x2F, 0x3A, 0x1D, 0x5A,
- 0x4C, 0xC9, 0xC9, 0xC9, 0xC9, 0xCD, 0xCE, 0xCD, 0xCD, 0xC9, 0xCD, 0xCD, 0xC9, 0xC9, 0xC9, 0xC9,
- 0xC9, 0xCD, 0xBF, 0xC9, 0xC9, 0xC9, 0xCD, 0xC9, 0xC9, 0xC9, 0xC9, 0xCE, 0xCF, 0xD0, 0xBF, 0x53,
- 0x56, 0x59, 0x5A, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0xC,
- 0x4, 0x6D, 0x25, 0x1F, 0x30, 0x0, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xFD,
- 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xE9, 0xD8,
- 0xBD, 0xB8, 0xAC, 0x35, 0x16, 0x14, 0x15, 0x17, 0x26, 0x26, 0x26, 0x26, 0x17, 0x26, 0x24, 0xEF,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x31, 0xE, 0x0, 0x4, 0x4, 0x39, 0x71, 0x29, 0x4, 0x0, 0x4, 0x55, 0xBF, 0xBF, 0x5C,
- 0x5C, 0x1B, 0x1A, 0x53, 0xCE, 0x5A, 0xC9, 0xBF, 0xBF, 0xBF, 0xCE, 0x5C, 0x5A, 0x5C, 0xAD, 0xAD,
- 0xBF, 0xAD, 0x55, 0xAD, 0xC3, 0x55, 0xC6, 0xC5, 0xAD, 0x55, 0xBF, 0xBF, 0xBF, 0xA, 0x1, 0x55,
- 0xBF, 0x34, 0x1, 0xA, 0x55, 0xBF, 0xBF, 0xBF, 0xBF, 0xCD, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0x5A,
- 0x52, 0xC9, 0xC9, 0xC9, 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xC9, 0xCE, 0xCE, 0xCD, 0xCD, 0xC9, 0xC9,
- 0xC9, 0xCD, 0xBF, 0xC9, 0xE9, 0xC6, 0xB8, 0xC4, 0xC9, 0xC9, 0xC9, 0xCD, 0xCF, 0xD0, 0xAD, 0x52,
- 0x53, 0x53, 0x55, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5,
- 0x4, 0x0, 0xB, 0x6, 0x25, 0x4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x2C,
- 0x41, 0xBD, 0xF9, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF0,
- 0xE9, 0xD8, 0xBD, 0xB7, 0xAA, 0x35, 0x16, 0x17, 0x17, 0x17, 0x15, 0x17, 0x17, 0x17, 0x4D, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB,
- 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA8,
- 0x3A, 0x33, 0xE, 0x0, 0x4, 0x4, 0x30, 0x39, 0x25, 0x6, 0x4, 0x4, 0x36, 0x36, 0x36, 0x46,
- 0x46, 0x46, 0x53, 0xC9, 0xCE, 0x5A, 0x5C, 0xBF, 0xC9, 0xBF, 0xCE, 0x5A, 0x5A, 0x5C, 0x5C, 0xBF,
- 0xC9, 0xC9, 0xC9, 0xC4, 0xAC, 0x54, 0xC3, 0xC3, 0xAD, 0x53, 0xBF, 0xBF, 0xBF, 0x34, 0x1, 0x52,
- 0xC9, 0xBF, 0x36, 0x1, 0xA, 0x55, 0xBF, 0xBF, 0xBF, 0xC9, 0xAD, 0xBF, 0xBF, 0xBF, 0xBF, 0x59,
- 0x52, 0xC9, 0xC9, 0xC9, 0xBF, 0xC9, 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xC9, 0xBF, 0xAD,
- 0xAD, 0xAD, 0xAD, 0xBF, 0x6B, 0x77, 0x65, 0x65, 0xBF, 0xC9, 0xCE, 0xCF, 0xF3, 0xF3, 0xCA, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x23,
- 0x5, 0x25, 0x25, 0xB, 0x4, 0x39, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0xE, 0x38, 0xB4, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF7, 0xF0, 0xE9, 0xD8, 0xBD, 0xB8, 0xAC, 0x39, 0x24, 0x15, 0x17, 0x17, 0x17, 0x27, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xD8, 0xA3,
- 0xE, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA,
- 0x3A, 0x33, 0xE, 0x4, 0x4, 0x0, 0x20, 0x37, 0x1F, 0x1F, 0x4, 0x4, 0x52, 0x53, 0x54, 0x55,
- 0x55, 0xAD, 0xAB, 0x4F, 0xC9, 0xC0, 0x55, 0xBF, 0xBF, 0xBF, 0xCE, 0x5C, 0x5A, 0x5C, 0x5C, 0xBF,
- 0xBF, 0xBF, 0xBF, 0xC9, 0xC4, 0xAD, 0xC9, 0xAD, 0xBF, 0x54, 0xBF, 0xBF, 0xBF, 0x4F, 0x3, 0x46,
- 0xBF, 0xC9, 0xBF, 0x36, 0x1, 0x3, 0x53, 0x55, 0x55, 0xBF, 0xAD, 0xBF, 0xBF, 0xBF, 0xBF, 0x59,
- 0x4F, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xBF, 0xAD, 0xAD, 0xAD, 0x55, 0x55, 0xAD, 0xAD, 0xBF, 0xBF,
- 0xBF, 0xC9, 0xBF, 0xBF, 0xAD, 0xAD, 0x55, 0xAD, 0xBF, 0xC9, 0xCB, 0xD0, 0xF3, 0xF3, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5,
- 0x30, 0x97, 0x25, 0x20, 0x4, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9,
- 0xBD, 0x41, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xEF, 0xEF, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF7, 0xE9, 0xB6, 0xB8, 0xBD, 0x97, 0x27, 0x15, 0x24, 0x27, 0x4D, 0xF2, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0xB4, 0xF7, 0xD8, 0x33, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3C, 0x33, 0x2C, 0x5, 0x4, 0x0, 0x20, 0x39, 0x1F, 0x1F, 0x4, 0x4, 0x53, 0x53, 0x53, 0x53,
- 0x53, 0x53, 0xBE, 0xC2, 0xC9, 0x5C, 0xBF, 0xBF, 0xAD, 0xBF, 0xCE, 0x5A, 0x5A, 0x5A, 0xBF, 0xAD,
- 0xAD, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xAD, 0x55, 0x55, 0x55, 0x55, 0x36, 0x1, 0x34,
- 0xCD, 0xBF, 0xBF, 0xC9, 0x52, 0x1, 0x3, 0x52, 0x55, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xC9, 0x59,
- 0x52, 0xC9, 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xBF, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xBF, 0xC9,
- 0xC9, 0xC9, 0xC0, 0xC9, 0xC9, 0xBF, 0xC0, 0xC9, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x5B, 0x5D,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5A, 0x5A, 0x5A, 0x5B, 0x5B, 0x5,
- 0x37, 0xB5, 0x29, 0x20, 0x6, 0x37, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE9, 0xA8, 0x31, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB5, 0x6, 0x16, 0x35, 0x99, 0xEF, 0xF9, 0xF2, 0xF2, 0xF2, 0xEB,
- 0xB6, 0x97, 0xAC, 0x35, 0x6, 0x16, 0x39, 0x2, 0x2, 0x2, 0x2, 0x6, 0x16, 0x99, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE,
- 0xF9, 0xFD, 0xFD, 0xF8, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3C, 0x33, 0x2C, 0xD, 0x0, 0x0, 0x20, 0x39, 0x1F, 0x20, 0x4, 0x4, 0xBF, 0xC9, 0xC9, 0xC9,
- 0xBF, 0xC9, 0xBF, 0xBF, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xCE, 0x5C, 0x5C, 0x5A, 0x55, 0x46,
- 0x4F, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x4F, 0x52, 0x52, 0x52, 0x52, 0x52, 0x12, 0x12,
- 0xCD, 0xBF, 0xC9, 0xC9, 0xC9, 0x53, 0x3, 0x1A, 0x2F, 0x52, 0xAB, 0xBF, 0xBF, 0xBF, 0xC9, 0x55,
- 0x52, 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCB, 0xCD, 0xCF, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x5A, 0x5B, 0x5B, 0x5D, 0xD,
- 0x37, 0xD5, 0x6B, 0x20, 0x37, 0xFE, 0xEF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB5, 0x15, 0x15, 0x6, 0x16, 0xAC, 0xAC, 0x24, 0x6, 0x16, 0x9,
- 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x14, 0x17, 0x26, 0x17, 0x2, 0x2, 0x2, 0x99, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x3A, 0xEE, 0xFD, 0xE9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA,
- 0x3C, 0x2E, 0x2C, 0x20, 0x0, 0x4, 0x20, 0x37, 0x20, 0x20, 0x4, 0x4, 0xD0, 0xC9, 0x36, 0x1A,
- 0xA, 0x3, 0x1, 0x1, 0x3, 0x3, 0x3, 0x3, 0x3, 0x1A, 0xC9, 0x5A, 0x5C, 0x5A, 0x36, 0x34,
- 0x34, 0x4F, 0x53, 0x59, 0x53, 0x53, 0x53, 0x53, 0x53, 0x52, 0x52, 0x52, 0x52, 0x52, 0x46, 0x3,
- 0xCD, 0xBF, 0xC9, 0xC9, 0xCD, 0xC9, 0x34, 0x43, 0x52, 0xAD, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0x55,
- 0x52, 0xC9, 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xCD, 0xCF, 0xCA, 0xCA, 0xCA, 0xCC, 0xCC, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x25, 0xD5, 0x71, 0xB, 0x30, 0xFE, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEF, 0x39, 0x27, 0x4D, 0x35, 0x16, 0x2, 0x14, 0x24, 0x24, 0x6,
- 0x15, 0x14, 0x14, 0x15, 0x2, 0x2, 0x14, 0x15, 0x15, 0x17, 0x14, 0x2, 0x14, 0x15, 0x27, 0xF6,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xB6, 0x31, 0xE, 0x2C, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8,
- 0x3C, 0x2E, 0xE, 0x20, 0x0, 0x0, 0xB, 0x37, 0x20, 0xB, 0x4, 0x0, 0xD0, 0x4C, 0x1A, 0x12,
- 0xA, 0x8, 0x1A, 0xA, 0x12, 0x12, 0x1A, 0x8, 0x8, 0x1A, 0xBF, 0xC0, 0x5C, 0x5A, 0x36, 0x2F,
- 0x2D, 0x2D, 0x2F, 0x36, 0x52, 0x55, 0x59, 0x59, 0x53, 0x53, 0x52, 0x52, 0x53, 0x54, 0x54, 0x1A,
- 0xAD, 0xBF, 0xBF, 0xAD, 0xBF, 0xAD, 0x36, 0x4F, 0x55, 0xBF, 0xAD, 0xBF, 0xC4, 0x9D, 0xAD, 0x5A,
- 0x52, 0xC9, 0xCD, 0xCB, 0xCB, 0xCF, 0xCB, 0xCD, 0xCE, 0xCA, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x2,
- 0x1F, 0xE6, 0x97, 0xB, 0x4, 0x6E, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF8, 0xF7, 0xF5, 0x99, 0x16, 0x6, 0x6, 0x0, 0x2, 0x2, 0x15, 0x15, 0x17, 0x26,
- 0x2A, 0x24, 0x17, 0x15, 0x15, 0x17, 0x24, 0x15, 0x15, 0x15, 0x17, 0x15, 0x15, 0x26, 0x15, 0xB5,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA8,
- 0x3A, 0x32, 0x2C, 0x25, 0x0, 0x0, 0x5, 0x37, 0x20, 0xB, 0x4, 0x0, 0x36, 0x1A, 0x12, 0xA,
- 0x12, 0x12, 0x8, 0xA, 0x12, 0x2D, 0x12, 0xA, 0x8, 0x2C, 0x55, 0xC9, 0xC0, 0x5C, 0x4C, 0x34,
- 0x33, 0x38, 0x38, 0x3B, 0x48, 0x48, 0xA6, 0xAD, 0x55, 0x55, 0x55, 0x55, 0x53, 0x53, 0x53, 0x48,
- 0x55, 0xCE, 0xCD, 0xCD, 0xCD, 0xCD, 0x54, 0x55, 0xBF, 0xC9, 0xBF, 0xBF, 0xBF, 0xA1, 0xC3, 0x55,
- 0x2D, 0x2F, 0x36, 0x3D, 0x3D, 0x3D, 0x48, 0x3D, 0x3D, 0x46, 0x4F, 0x52, 0x52, 0x53, 0x53, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x5B, 0x2,
- 0x4, 0xDB, 0x39, 0xB, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF5, 0xEE, 0xE9, 0xB8, 0x24, 0x15, 0x17, 0x26, 0x24, 0x17, 0x17, 0x15, 0x15, 0x15, 0x24,
- 0x26, 0x26, 0x17, 0x15, 0x24, 0x24, 0x15, 0x14, 0x15, 0x17, 0x26, 0x26, 0x14, 0x15, 0x17, 0x24,
- 0xE, 0x2C, 0x2C, 0xE, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x3A, 0xA3, 0xB6, 0xE9, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xA5,
- 0x3A, 0x31, 0x25, 0x5, 0x4, 0x0, 0xD, 0x37, 0x20, 0x5, 0x4, 0x4, 0x1A, 0x1A, 0xA, 0x8,
- 0x8, 0x3, 0x8, 0x3, 0x3, 0x3, 0xA, 0x2C, 0x12, 0x2D, 0x55, 0xC9, 0x5C, 0x5C, 0x52, 0x3B,
- 0x3C, 0x33, 0x38, 0x3D, 0xA3, 0xA3, 0xA4, 0xAD, 0xAD, 0xBF, 0xBF, 0xAD, 0x55, 0x59, 0x55, 0x55,
- 0x53, 0xC9, 0xCE, 0xCE, 0xCE, 0xCD, 0x54, 0xBF, 0xBF, 0xCF, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xAD,
- 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xBF, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x1F, 0xE2, 0x6E, 0xB, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0x2C, 0x41, 0xB6, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xEA, 0xD8, 0xBD, 0x3A, 0x15, 0x26, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
- 0x26, 0x26, 0x17, 0x15, 0x24, 0x15, 0x15, 0x14, 0x15, 0x26, 0x26, 0x26, 0x15, 0x2, 0x15, 0x25,
- 0x2C, 0x3A, 0xAA, 0x3A, 0x0, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8,
- 0xE9, 0xB6, 0x3C, 0xE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x30, 0xD, 0x0, 0x0, 0x0, 0xD, 0x39, 0x30, 0x1F, 0x0, 0x4, 0x2F, 0x1A, 0x12, 0x12,
- 0x8, 0x8, 0x3, 0x3, 0xE, 0x2C, 0x33, 0x3C, 0x2F, 0x2F, 0x53, 0xCE, 0x5C, 0x5C, 0x52, 0x3A,
- 0x2F, 0x3A, 0x48, 0xA6, 0xAD, 0xAD, 0xAD, 0xC4, 0xBF, 0xC9, 0xBF, 0xC4, 0xC4, 0xBF, 0xAD, 0xBF,
- 0x59, 0x55, 0xCF, 0xCF, 0xCF, 0xCF, 0x54, 0xBF, 0xBF, 0xC9, 0xCF, 0xCD, 0xCD, 0xCD, 0xCF, 0xCE,
- 0xBF, 0xC9, 0xCD, 0xCD, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5A, 0x5B, 0x5D, 0x6,
- 0x6, 0xD7, 0x6E, 0x1F, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xB6,
- 0x41, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF5, 0xE9, 0xBD, 0xBD, 0x2E, 0x2, 0x24, 0x26, 0x26, 0x26, 0x17, 0x17, 0x15, 0x14, 0x14, 0x15,
- 0x15, 0x17, 0x17, 0x24, 0x24, 0x15, 0x15, 0x14, 0x15, 0x26, 0x26, 0x15, 0x6, 0x0, 0xD, 0x2E,
- 0x2C, 0x2C, 0x2C, 0x41, 0xA8, 0x0, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xBD, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0xA3,
- 0x3A, 0x31, 0xB, 0x0, 0x0, 0x0, 0xD, 0x37, 0x37, 0x1F, 0x0, 0x4, 0x1B, 0x1B, 0x1B, 0x18,
- 0x12, 0x12, 0x8, 0x3, 0x3, 0x3, 0x8, 0x1A, 0x1A, 0x2C, 0x4F, 0xCE, 0x5A, 0x5A, 0x53, 0x2F,
- 0x1A, 0x2F, 0x34, 0x48, 0x52, 0xA6, 0xA6, 0xAB, 0xAD, 0xAD, 0xAD, 0xA6, 0xA6, 0xA6, 0xA6, 0xAD,
- 0xAD, 0xBF, 0xAD, 0xC4, 0xC4, 0xAD, 0x4C, 0x55, 0xC9, 0x5A, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xCD,
- 0x5A, 0xC9, 0xCE, 0xCE, 0xD0, 0xD0, 0xCD, 0xC9, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x1F, 0xD7, 0x71, 0x6, 0x0, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xE, 0xBB, 0x41, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF5, 0xE9, 0xD8, 0xBD, 0xA3, 0x2C, 0x32, 0x27, 0x24, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x17,
- 0x14, 0x15, 0x17, 0x26, 0x17, 0x14, 0x15, 0x14, 0x14, 0x17, 0x17, 0x26, 0x24, 0x2, 0xE, 0xE,
- 0x2C, 0x2C, 0x2C, 0x2C, 0x31, 0x41, 0x31, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0xA3,
- 0x3A, 0x32, 0xB, 0x0, 0x2, 0x0, 0xD, 0x37, 0x25, 0x6, 0x4, 0x4, 0x1B, 0x19, 0x19, 0x10,
- 0x10, 0x10, 0x12, 0x12, 0x12, 0x12, 0x10, 0x10, 0xF, 0x10, 0x46, 0xCE, 0x5A, 0x5C, 0x53, 0x1A,
- 0x18, 0x1A, 0x3B, 0x3B, 0x3B, 0x3D, 0xA5, 0x52, 0x48, 0x48, 0x52, 0xA4, 0x52, 0xA4, 0xA4, 0xA6,
- 0xC4, 0xCD, 0xAD, 0xCD, 0xBF, 0xBF, 0x46, 0xBF, 0x4C, 0x5C, 0xC9, 0xC9, 0xC9, 0xC4, 0xC5, 0xC4,
- 0x5A, 0xC9, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xD0, 0xD0, 0xCE, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0xCA, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x1F, 0xD7, 0x71, 0x6, 0x0, 0xA7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF8, 0xF5, 0xF0, 0xF0, 0xE9, 0xD8, 0xBB, 0xB6, 0x35, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
- 0x2, 0x14, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x14, 0x24, 0x26, 0x26, 0x17, 0x14, 0x16, 0x41,
- 0xAA, 0xA8, 0xA8, 0xA3, 0x33, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x41, 0xBB, 0xF7, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x94,
- 0x33, 0x2E, 0x6, 0x0, 0x2, 0x0, 0xD, 0x39, 0x29, 0x1F, 0x4, 0x4, 0x1C, 0x1A, 0x1D, 0x18,
- 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x1A, 0x2F, 0x10, 0x11, 0x1D, 0xD0, 0x5C, 0x5C, 0x55, 0x11,
- 0x19, 0x19, 0x18, 0x3D, 0x48, 0x3D, 0x48, 0xA6, 0x55, 0xBF, 0xC9, 0xBF, 0xC4, 0xBF, 0xBF, 0xBF,
- 0xBF, 0xC1, 0xC4, 0xC9, 0xBF, 0x55, 0x53, 0xBF, 0x4F, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xAD, 0xBF,
- 0xBF, 0x52, 0x52, 0x52, 0x53, 0x50, 0x53, 0x53, 0x55, 0x55, 0x55, 0x55, 0x50, 0x53, 0x5A, 0x5C,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x58, 0x5B, 0x5D, 0x4,
- 0x4, 0xB5, 0x6B, 0x1F, 0x4, 0x3E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x1, 0x7,
- 0x7, 0x7, 0xE, 0x2C, 0x2C, 0x7, 0xE, 0x7, 0x0, 0x2C, 0x35, 0x16, 0x16, 0x16, 0x16, 0x15,
- 0x2, 0x2, 0x2, 0x17, 0x17, 0x17, 0x15, 0x14, 0x2, 0x14, 0x15, 0x15, 0x15, 0x4D, 0x6F, 0x2C,
- 0xE, 0xE, 0x2C, 0x31, 0xAA, 0x3A, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xBB, 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x41,
- 0x38, 0x2C, 0x6, 0x0, 0x2, 0x2, 0x25, 0x39, 0x29, 0x1E, 0x4, 0x4, 0x36, 0x1A, 0x55, 0x12,
- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x2E, 0x1A, 0x10, 0x10, 0x1B, 0xCE, 0x5C, 0x5C, 0x59, 0x18,
- 0x19, 0x19, 0x19, 0x19, 0x3D, 0x48, 0x54, 0x54, 0x55, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0x54, 0xAD,
- 0x55, 0x55, 0x55, 0xAD, 0x54, 0x3D, 0x59, 0xAD, 0x36, 0xAD, 0x53, 0x1B, 0x1B, 0x1B, 0x1D, 0x1A,
- 0x19, 0x19, 0x1B, 0x19, 0x1B, 0x1B, 0x34, 0x53, 0xBF, 0xC2, 0xC0, 0xAB, 0xBF, 0xBF, 0xBF, 0xBF,
- 0x5D, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x4, 0xB2, 0x39, 0x1F, 0x4, 0x3E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x7, 0x33, 0xAA,
- 0x3C, 0x2C, 0x3A, 0x3C, 0x3A, 0x38, 0x41, 0x2C, 0xE, 0xE, 0xE, 0x31, 0x3F, 0xE, 0x9, 0x2,
- 0x2, 0x0, 0x2, 0x17, 0x17, 0x17, 0x15, 0x2, 0x2, 0x6, 0x16, 0x16, 0x2E, 0x33, 0x33, 0x2C,
- 0x2C, 0x2C, 0xE, 0x2C, 0x2C, 0xAA, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4, 0x41,
- 0x38, 0x25, 0x6, 0x0, 0x4, 0x4, 0x25, 0x39, 0x29, 0x1E, 0x4, 0x1E, 0x1C, 0x36, 0x59, 0x12,
- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x1A, 0x1A, 0x18, 0x18, 0x10, 0xCE, 0xC0, 0x5A, 0x5A, 0x10,
- 0x18, 0x19, 0x19, 0x19, 0x18, 0x19, 0x19, 0x19, 0x19, 0x11, 0x11, 0x19, 0x1A, 0x18, 0x1A, 0x1C,
- 0x19, 0x19, 0x19, 0x42, 0x1D, 0x1B, 0x59, 0x12, 0x1A, 0x55, 0x53, 0x1A, 0x1A, 0x1A, 0x53, 0x36,
- 0x46, 0x1B, 0x1B, 0x1C, 0x1C, 0x1B, 0x42, 0x4F, 0x5C, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0xD,
- 0x1F, 0x9B, 0x37, 0x6, 0x4, 0x6F, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x38, 0xA3, 0x38,
- 0x3F, 0xA3, 0x38, 0x2C, 0x33, 0x33, 0x2C, 0x2C, 0x2C, 0x2C, 0xE, 0xE, 0x3F, 0xE, 0x2, 0x15,
- 0x17, 0x15, 0x15, 0x17, 0x17, 0x15, 0x9, 0x2E, 0x3A, 0x2C, 0x31, 0x33, 0x31, 0x31, 0x31, 0x2C,
- 0x33, 0x38, 0x31, 0xE, 0x2C, 0x41, 0x31, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xE9, 0xB6, 0xA3, 0x38, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA, 0x3F,
- 0x33, 0x25, 0x6, 0x4, 0x4, 0x0, 0x25, 0x6B, 0x29, 0x1E, 0x4, 0x1E, 0xC9, 0xC9, 0x55, 0xC9,
- 0xCD, 0xC9, 0xCE, 0xD0, 0xC9, 0xC9, 0xCB, 0xCC, 0xCC, 0xCC, 0x53, 0xC9, 0xC9, 0x5A, 0x1C, 0x10,
- 0x10, 0x18, 0x12, 0x10, 0x10, 0x12, 0x18, 0x18, 0x18, 0x18, 0x1B, 0x1A, 0x1A, 0x12, 0x12, 0x12,
- 0x1A, 0x1B, 0x4F, 0x36, 0x36, 0x36, 0x53, 0x1B, 0xBF, 0x53, 0xBF, 0xAD, 0xBF, 0xBF, 0x55, 0xBF,
- 0xC9, 0xBF, 0xBF, 0xBF, 0xBF, 0xC9, 0xAD, 0x52, 0x4F, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5D, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x6, 0x71, 0x29, 0x4, 0x4, 0xA9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xA3,
- 0xE, 0xE, 0x33, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x2C, 0x2C, 0x3F,
- 0x41, 0x33, 0x41, 0xAA, 0x2E, 0x16, 0x2C, 0x2C, 0xE, 0xE, 0xE, 0x38, 0x2C, 0x6, 0x14, 0x17,
- 0x17, 0x17, 0x17, 0x17, 0x14, 0x15, 0x4E, 0x3A, 0x31, 0x2C, 0x2C, 0xB6, 0x3A, 0x2C, 0x2C, 0x31,
- 0x33, 0x33, 0x38, 0xE, 0x2C, 0x3A, 0x33, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE,
- 0x33, 0xB6, 0xE9, 0xF5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8, 0x3C,
- 0x32, 0x25, 0x4, 0x0, 0x6, 0x0, 0x25, 0x37, 0x29, 0x1E, 0x1E, 0x1F, 0xCE, 0xC9, 0x55, 0xC9,
- 0xC9, 0xC9, 0xC9, 0xCE, 0xC9, 0xC9, 0xCB, 0xCB, 0xCB, 0xCE, 0xCB, 0xBF, 0xCA, 0x46, 0x43, 0x1B,
- 0x10, 0x10, 0x18, 0x18, 0x18, 0x18, 0x1A, 0x55, 0xC9, 0xC9, 0xCA, 0xC9, 0xC9, 0xCE, 0xCE, 0xC9,
- 0xC9, 0xC0, 0xC9, 0xC9, 0xC9, 0x46, 0x50, 0x1B, 0xCD, 0xAD, 0x5C, 0xC9, 0xC9, 0xCD, 0x55, 0xC9,
- 0xCB, 0xC9, 0xC9, 0xC9, 0xCD, 0xD0, 0xF3, 0xF3, 0xCD, 0xBF, 0xBE, 0xBF, 0xBF, 0xBF, 0xC0, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x5B, 0x58, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x4, 0x37, 0x37, 0x1F, 0x4, 0xAF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x41, 0xE,
- 0xE, 0xE, 0xE, 0xE, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF5, 0xF5, 0xE, 0x2C, 0x33, 0x33,
- 0xE, 0x3F, 0x3C, 0x25, 0x2, 0x2, 0x2, 0x9, 0x16, 0xE, 0x2C, 0x3F, 0x38, 0x9, 0x2, 0x14,
- 0x15, 0x17, 0x17, 0x17, 0x15, 0x2, 0x16, 0x16, 0x2C, 0x2C, 0x2C, 0xB6, 0xE, 0xE, 0x2C, 0x2C,
- 0x31, 0x33, 0x33, 0x2C, 0x33, 0xA3, 0x33, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xD8,
- 0x33, 0x3A, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3, 0x3A,
- 0x2E, 0x25, 0x6, 0x0, 0x4, 0x0, 0x30, 0x67, 0x29, 0x1E, 0x1E, 0x1F, 0xC9, 0xC9, 0xA6, 0x9D,
- 0x9F, 0x9F, 0xA1, 0xA1, 0xA2, 0xA1, 0xA2, 0xA1, 0xC4, 0xC9, 0xCB, 0xBF, 0xC9, 0x1A, 0x5A, 0x55,
- 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1B, 0xC9, 0xCC, 0xCC, 0xCB, 0xCB, 0xC9, 0xCB, 0xCE,
- 0xCE, 0xCE, 0xCD, 0xCB, 0xBF, 0x50, 0x55, 0x1B, 0xCD, 0xBF, 0x5C, 0xC9, 0xC9, 0xCD, 0x55, 0xC9,
- 0xC9, 0xC9, 0xCD, 0xC9, 0xC9, 0xCF, 0xF3, 0xFA, 0xCD, 0x55, 0x55, 0x5C, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5D, 0x6,
- 0x4, 0x3E, 0x37, 0x1F, 0x1E, 0xB2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xAA,
- 0xF9, 0xFD, 0xEA, 0x3F, 0xE, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xE9, 0xE9, 0xE9, 0xE, 0x3A, 0x41, 0x41,
- 0x2C, 0x2C, 0x2C, 0x16, 0x15, 0x15, 0x14, 0x2, 0x2, 0xD, 0x3C, 0x9, 0x2C, 0x3C, 0x2E, 0x6,
- 0x2, 0x2, 0x15, 0x15, 0x15, 0x14, 0x2, 0x2, 0x16, 0x2C, 0x2C, 0xB4, 0x3A, 0x2C, 0x2C, 0x33,
- 0x33, 0x31, 0x2C, 0x31, 0x33, 0x41, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xD8, 0x3A, 0x3A, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0x94, 0x38,
- 0x2C, 0x20, 0xD, 0x0, 0x6, 0x0, 0x25, 0x37, 0x29, 0x1F, 0x1E, 0x1F, 0xC9, 0xCE, 0x52, 0x52,
- 0x52, 0x52, 0x54, 0x52, 0x54, 0x54, 0x54, 0x55, 0xC9, 0xC9, 0xC9, 0xBF, 0x55, 0x43, 0x5B, 0x50,
- 0x43, 0x19, 0x1B, 0x1B, 0x4D, 0x1B, 0x42, 0xAD, 0xCF, 0xD0, 0xD0, 0xD0, 0xD0, 0xC9, 0xCB, 0xCF,
- 0xCB, 0xCF, 0xCE, 0xCE, 0x55, 0x59, 0xC9, 0x36, 0xBF, 0x55, 0xBF, 0xC9, 0xC4, 0xCD, 0x55, 0x55,
- 0xAD, 0xBF, 0xC9, 0xC9, 0xCD, 0xF3, 0xFA, 0xFA, 0xD0, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0xCA, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x6,
- 0x1F, 0x97, 0x37, 0x1F, 0x1E, 0xB2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xE9, 0xBD, 0xBD, 0xBD, 0xE, 0xA3, 0x33, 0xE,
- 0x31, 0x3C, 0x2C, 0x2, 0x2, 0x14, 0x2, 0x2, 0x0, 0x2, 0x6, 0x9, 0x6, 0x9, 0x2, 0x0,
- 0x0, 0x0, 0x2, 0x15, 0x15, 0x15, 0x17, 0x14, 0x2, 0x15, 0x2C, 0xE, 0x38, 0xA3, 0x3C, 0x31,
- 0x2C, 0xE, 0x2C, 0x38, 0x33, 0x38, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE9, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB8, 0x94, 0x38,
- 0x2C, 0x25, 0xD, 0x4, 0x6, 0x0, 0x4, 0x1F, 0x22, 0x1F, 0x1E, 0x1E, 0xBF, 0xCE, 0x54, 0x9D,
- 0x9D, 0x9D, 0x9F, 0x9F, 0x9D, 0x9D, 0x9D, 0x9D, 0xC4, 0xCA, 0xC9, 0xBF, 0xAD, 0x50, 0x5A, 0x4F,
- 0x1D, 0x1B, 0x1B, 0x1B, 0x36, 0x1B, 0xAD, 0xF3, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xCE, 0xCA, 0xC3,
- 0xC9, 0xC9, 0xCB, 0xC9, 0x52, 0x5A, 0xC9, 0x4C, 0xC9, 0xBF, 0x5C, 0xCD, 0xC9, 0xCD, 0x53, 0x53,
- 0xBF, 0xC9, 0xCB, 0xD0, 0xD0, 0xD0, 0xD0, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0xCA, 0x5D, 0xCA, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0xD,
- 0x6, 0x25, 0xB, 0x6, 0x6, 0xAE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x33, 0x3C,
- 0xF5, 0xFD, 0xFD, 0xFD, 0xEE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xEE, 0xBD, 0xBD, 0xBB, 0xBB, 0xE, 0x33, 0x38, 0x3A,
- 0x33, 0x2C, 0x2C, 0x6, 0x15, 0x15, 0x15, 0x15, 0x6, 0x14, 0x2, 0x0, 0x0, 0x0, 0x2, 0x2,
- 0x0, 0x2, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x14, 0x2, 0x14, 0x2, 0x2, 0x6, 0x35, 0xA8,
- 0x3C, 0xE, 0x38, 0xB4, 0x41, 0x1, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xA3,
- 0xE, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB7, 0x94, 0x38,
- 0x2C, 0x2C, 0xD, 0xB, 0x0, 0x0, 0x4, 0x4, 0x20, 0x1E, 0x4, 0x1E, 0x54, 0xCD, 0x53, 0xAD,
- 0xAD, 0x55, 0xAD, 0xAD, 0xAD, 0xBF, 0xC9, 0xC9, 0xC9, 0xCA, 0xC9, 0xBF, 0xCE, 0x4F, 0x46, 0xBF,
- 0x55, 0xBF, 0xC9, 0xC9, 0xCA, 0xCE, 0xF3, 0xF3, 0xF3, 0xCE, 0xCE, 0xCE, 0xCE, 0xC9, 0xC0, 0xCD,
- 0xCD, 0xCD, 0xCD, 0xCD, 0x46, 0x5C, 0xC9, 0xBF, 0xCD, 0xBF, 0x5C, 0xC9, 0xC9, 0xCE, 0x55, 0xAD,
- 0xBF, 0xBF, 0xC9, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0xD,
- 0x4, 0x4, 0x4, 0x4, 0x1F, 0x6E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xD8, 0xE,
- 0x2C, 0xFD, 0xFD, 0xFD, 0xE, 0x38, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBB, 0xBB, 0x31, 0xA5, 0x31, 0x31,
- 0x2C, 0x33, 0x32, 0x14, 0x26, 0x26, 0x26, 0x24, 0x15, 0x15, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
- 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x14, 0x2, 0x14, 0x15, 0x15, 0x14, 0x16, 0xE,
- 0x38, 0xAA, 0x94, 0x31, 0x0, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE,
- 0xF7, 0x41, 0xF0, 0x31, 0xEE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3, 0x3A,
- 0x31, 0x2C, 0x20, 0x20, 0xFE, 0x0, 0x20, 0x25, 0x22, 0x1E, 0x1E, 0x1E, 0xC4, 0xCD, 0xBF, 0x96,
- 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0x9D, 0x99, 0x99, 0xAD, 0xCA, 0xCA, 0xBF, 0xCC, 0xCB, 0xD0, 0x5C,
- 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCE, 0xF3, 0xF3, 0xCD, 0xBF, 0xC9, 0xCD, 0xCD, 0xC9, 0x55, 0x53,
- 0x4F, 0x52, 0x52, 0x52, 0x1D, 0x5A, 0x4F, 0x4F, 0xCE, 0xC9, 0x5C, 0xCD, 0xCE, 0xD0, 0x55, 0x53,
- 0x55, 0x55, 0xBF, 0xBF, 0xBF, 0xBF, 0x5C, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0xCA, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0xB,
- 0x1F, 0x20, 0xB, 0x6, 0x1F, 0x6E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD,
- 0x3F, 0xFD, 0xFD, 0xFD, 0x38, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBB, 0xBB, 0xBB, 0xE, 0x33, 0xA3, 0x38,
- 0xE, 0x0, 0xD, 0x15, 0x26, 0x15, 0x14, 0x2, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14,
- 0x14, 0x2, 0x14, 0x14, 0x2, 0x14, 0x24, 0x17, 0x15, 0x2, 0x15, 0x26, 0x26, 0x26, 0x15, 0x9,
- 0x9, 0x7, 0x9, 0xE, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3F,
- 0xE9, 0xD8, 0xF5, 0xE9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8, 0x3F,
- 0x33, 0x2C, 0x20, 0xD, 0x0, 0x0, 0x37, 0x3E, 0x25, 0x1F, 0xB, 0x4, 0xC4, 0xCD, 0xBF, 0x55,
- 0xCB, 0xCE, 0xD0, 0xCE, 0xCC, 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 0x5C, 0xD0, 0xC9, 0x5C, 0x5C,
- 0xC9, 0xCA, 0xCB, 0xCD, 0xC9, 0xCD, 0xCD, 0xBF, 0xC9, 0xBF, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xBF,
- 0xC9, 0xC2, 0xC2, 0xC2, 0x46, 0xC0, 0xCE, 0xCE, 0xCE, 0xCD, 0xC9, 0xF3, 0xF3, 0xF3, 0xCE, 0xCE,
- 0xCE, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0xB,
- 0x1F, 0x29, 0x20, 0x1F, 0x1F, 0xAF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBB, 0xBB, 0xBB, 0xE, 0x2C, 0xE, 0x31,
- 0x38, 0xE, 0x6F, 0x16, 0x15, 0x35, 0x40, 0x3C, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14,
- 0x14, 0x14, 0x14, 0x14, 0x2, 0x15, 0x15, 0x15, 0x15, 0x24, 0x24, 0x24, 0x26, 0x26, 0x26, 0x4D,
- 0xE9, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE,
- 0xE, 0x41, 0xAA, 0xF7, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xAA, 0x41,
- 0x33, 0x30, 0xD, 0x4, 0x7, 0xFE, 0x32, 0x37, 0x20, 0x5, 0x5, 0x4, 0xCF, 0xC4, 0xC9, 0x5C,
- 0x55, 0xC9, 0xD0, 0xD0, 0xC9, 0xBF, 0x54, 0x53, 0x53, 0x52, 0x55, 0x53, 0xCE, 0x5C, 0x5A, 0x5C,
- 0xC4, 0x52, 0x36, 0x36, 0x52, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xC9, 0xCD, 0xCD, 0xD0, 0xD0, 0xD0,
- 0xD0, 0xC9, 0xD0, 0xBF, 0x50, 0xCC, 0xF3, 0xD0, 0xD0, 0xD0, 0xC9, 0xD0, 0xD0, 0xD0, 0xCC, 0xCC,
- 0xCC, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0x1F, 0x37, 0xB, 0x4, 0x4, 0xD5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBB, 0xBB, 0xBB, 0x2C, 0x3C, 0x2C, 0x2C,
- 0xE, 0x7, 0xAA, 0xA5, 0xA3, 0x94, 0x94, 0x41, 0x40, 0x16, 0x15, 0x24, 0x15, 0x16, 0x15, 0x15,
- 0x15, 0x15, 0x15, 0x15, 0x14, 0x15, 0x15, 0x15, 0x17, 0x26, 0x26, 0x26, 0x17, 0x26, 0x17, 0x39,
- 0xEE, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF7, 0xB4, 0x33, 0xE, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0x94,
- 0x38, 0x31, 0xD, 0xD, 0x4, 0x4, 0x3E, 0x6B, 0x25, 0x4, 0x4, 0x4, 0xF3, 0xCD, 0xCE, 0x5C,
- 0x5C, 0x5C, 0x5A, 0x55, 0x1A, 0x1A, 0x3, 0x3, 0x10, 0x1A, 0x36, 0x36, 0xC9, 0xC9, 0x5C, 0x5A,
- 0x48, 0x36, 0x1C, 0x1C, 0x4C, 0x54, 0xBF, 0xCD, 0xCF, 0xD0, 0xD0, 0xD0, 0xD0, 0xF3, 0xF3, 0xF3,
- 0xD0, 0xC9, 0xD0, 0x52, 0x5A, 0xCC, 0xD0, 0xD0, 0xD0, 0xD0, 0xC0, 0xD0, 0xD0, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x6,
- 0x1F, 0x37, 0x6, 0xFE, 0x71, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xA3,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xE, 0x41, 0xA8, 0x3C,
- 0x2C, 0xE, 0xBB, 0xB7, 0xB6, 0xAA, 0xA5, 0xA3, 0xA3, 0xA3, 0x40, 0x35, 0x39, 0x40, 0x39, 0x16,
- 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x15, 0x15, 0x17, 0x26, 0x26, 0x17, 0x17, 0x26, 0x17, 0x39,
- 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0xA3,
- 0x3B, 0x2C, 0xD, 0x20, 0x0, 0x0, 0x3E, 0x6E, 0x25, 0x4, 0x4, 0x4, 0xCE, 0xC9, 0xCE, 0xC9,
- 0x5C, 0x5C, 0x5C, 0x4F, 0xA, 0x1A, 0x18, 0x12, 0x1A, 0x1B, 0x36, 0x36, 0xC9, 0xC9, 0x5C, 0x5A,
- 0x46, 0x3D, 0x3D, 0x3D, 0x3D, 0x4C, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x55, 0xC9, 0xCD,
- 0xCD, 0xBF, 0xCE, 0x46, 0x5A, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0x5C, 0xD0, 0xD0, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x6,
- 0x1F, 0x37, 0x20, 0x20, 0xD5, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xE,
- 0xE, 0xE, 0x2C, 0x41, 0xB6, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xE, 0x2C, 0x2C, 0x41,
- 0xA3, 0x2C, 0xE9, 0xE9, 0xE9, 0xBD, 0xBD, 0xB7, 0xB7, 0xBD, 0xB7, 0xB6, 0xB4, 0xAA, 0xA8, 0xA3,
- 0x4E, 0x35, 0x9, 0x6, 0x2, 0x14, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, 0x17, 0x99,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x2C, 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0xA3,
- 0x3A, 0x2C, 0x25, 0x25, 0x0, 0x0, 0x3E, 0x6E, 0x25, 0x1E, 0x4, 0x4, 0xC9, 0xC9, 0xC9, 0xD0,
- 0x5C, 0x5C, 0x50, 0x1A, 0x3, 0xA, 0x12, 0x18, 0x1C, 0x1C, 0x36, 0x36, 0xBF, 0xC9, 0x5C, 0x5A,
- 0x46, 0x3D, 0x4C, 0x48, 0x52, 0x52, 0x52, 0x52, 0x52, 0x54, 0x53, 0x55, 0x54, 0x55, 0xAD, 0x55,
- 0xAD, 0xAD, 0xC1, 0x1D, 0x5A, 0xBF, 0xC9, 0xC9, 0xD0, 0xD0, 0x5C, 0xD0, 0xD0, 0xD0, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D, 0x6,
- 0x1F, 0x39, 0x20, 0x4, 0x6, 0x39, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6,
- 0x41, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xE9, 0x2C, 0x31, 0x2C, 0x2C,
- 0x2C, 0xE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF5, 0xF5, 0xF5, 0xF7, 0xF5, 0xF0, 0xEE, 0xE9, 0xBD, 0xB7,
- 0xB6, 0xB4, 0xA5, 0x35, 0x9, 0x6, 0x15, 0x17, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, 0x24, 0xEB,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A,
- 0xFD, 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x94,
- 0x38, 0x2C, 0x25, 0x20, 0x0, 0x0, 0x6C, 0x39, 0x20, 0x1E, 0x4, 0x4, 0x52, 0x52, 0x52, 0x52,
- 0x52, 0x36, 0x12, 0x3, 0xA, 0x3, 0x18, 0x12, 0x1A, 0x34, 0x36, 0x36, 0x55, 0xC9, 0x5C, 0x5A,
- 0x46, 0x36, 0x3D, 0x48, 0x52, 0xAB, 0x55, 0xBF, 0xBF, 0xAD, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
- 0xAD, 0xAD, 0xBF, 0x1D, 0x5A, 0xBF, 0xC9, 0xBF, 0xCD, 0xC9, 0xBF, 0xCE, 0xCD, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xD0, 0xCE, 0xCE, 0xCE, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x6,
- 0x1F, 0x6B, 0x25, 0x6, 0x0, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xBB, 0xA3, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xEE, 0x2C, 0xE, 0x2C, 0x2C,
- 0x2C, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF0,
- 0xE9, 0xD8, 0xBD, 0xB8, 0xAA, 0x35, 0x16, 0x15, 0x17, 0x17, 0x15, 0x15, 0x17, 0x26, 0x4D, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xB4, 0x41,
- 0x33, 0x30, 0xD, 0x5, 0x4, 0x4, 0x6C, 0x39, 0x20, 0x1E, 0x4, 0x1E, 0xE, 0x7, 0x3, 0x1,
- 0x3, 0x3, 0xA, 0xA, 0x1A, 0xA, 0x18, 0x1A, 0x1B, 0x34, 0x36, 0x36, 0x53, 0xC9, 0x5C, 0x5A,
- 0x4F, 0x3D, 0x3D, 0x3D, 0x52, 0xA6, 0x54, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xBF, 0xAD,
- 0xAD, 0xAD, 0xAB, 0x46, 0xBF, 0xBF, 0xBF, 0xBF, 0xAD, 0xAD, 0x55, 0xBF, 0xBF, 0xC9, 0xCE, 0xCE,
- 0xCE, 0xC9, 0xCE, 0xCE, 0xCE, 0xC9, 0xC9, 0xC0, 0xC0, 0xC0, 0xC0, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x6,
- 0x1F, 0x39, 0x20, 0x25, 0x1F, 0x39, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xF0, 0xE, 0x2C, 0x2C, 0x31,
- 0x2C, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF7, 0xF0, 0xE9, 0xD8, 0xBD, 0xBB, 0xAC, 0x39, 0x24, 0x15, 0x17, 0x17, 0x17, 0x27, 0xF6, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9,
- 0x31, 0xE, 0x31, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA, 0x3C,
- 0x33, 0x25, 0x6, 0x4, 0x4, 0x4, 0x37, 0x37, 0x20, 0x1F, 0x4, 0x1E, 0x2C, 0x2C, 0x8, 0x3,
- 0x3, 0x3, 0x3, 0x3, 0x3, 0xA, 0x1A, 0x1A, 0x2F, 0x36, 0x36, 0x34, 0x52, 0xC9, 0x5C, 0x59,
- 0x34, 0x36, 0x3B, 0x3D, 0x36, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x52, 0xAB, 0xAD, 0xBF, 0x36,
- 0x8, 0xAD, 0x3D, 0x50, 0xBF, 0xAD, 0xAD, 0xBF, 0xBF, 0xAD, 0x55, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,
- 0xAD, 0xBF, 0xBF, 0xBF, 0xBF, 0xC9, 0xC2, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5D, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x6,
- 0x1F, 0x97, 0x25, 0x6, 0x6, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xF0, 0xE, 0x2C, 0x2C, 0x2C,
- 0x2C, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF7, 0xF0, 0xE9, 0xE9, 0xD8, 0xBD, 0xB8, 0x97, 0x4D, 0x4D, 0x99, 0xF6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xBD, 0xFD, 0xE, 0xA3, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA5, 0x3A,
- 0x32, 0x25, 0x6, 0x4, 0xB, 0x4, 0x30, 0x25, 0x25, 0x1F, 0x4, 0x1E, 0x2C, 0x2F, 0xA, 0xA,
- 0x3, 0xA, 0xA, 0x1A, 0x12, 0x12, 0x1A, 0x1A, 0x2F, 0x36, 0x2F, 0x34, 0x4F, 0xC9, 0x5C, 0x50,
- 0x1A, 0x3B, 0x3D, 0x3D, 0x3D, 0x48, 0x54, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xBF, 0xA6, 0x1,
- 0x8, 0x52, 0x2F, 0x56, 0xAD, 0xAD, 0xAD, 0xBF, 0xCD, 0xC1, 0xBF, 0xCD, 0xCD, 0xCD, 0xCD, 0xCE,
- 0xCE, 0xCE, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xCE, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D,
- 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x6, 0xB5, 0x6E, 0x6, 0x1F, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xF0, 0xE, 0x31, 0x2C, 0x2C,
- 0x3F, 0x7, 0x2C, 0xE, 0x2C, 0x2C, 0x2C, 0xE, 0xE, 0xE, 0xE, 0x2C, 0x2C, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF5, 0xF0, 0xF0, 0xF5, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xF8, 0xFD, 0xE, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3, 0x3A,
- 0x30, 0x25, 0x4, 0x4, 0x5, 0x4, 0x30, 0x30, 0x20, 0xB, 0x4, 0x4, 0x1A, 0xA, 0xA, 0x1A,
- 0x1C, 0x36, 0x36, 0x36, 0x1A, 0x1A, 0xA, 0x3, 0x7, 0xA, 0xA, 0x2F, 0x3D, 0xCE, 0x5A, 0x1D,
- 0x12, 0x3B, 0x3D, 0x3D, 0x48, 0x54, 0xAD, 0xBF, 0xBF, 0xAD, 0xAD, 0xAD, 0xBF, 0xAD, 0x1, 0x8,
- 0x8, 0x36, 0x12, 0x57, 0xBF, 0xBF, 0xBF, 0xCD, 0xCD, 0xC1, 0x55, 0xCD, 0xCD, 0xCD, 0xCD, 0xCE,
- 0xCE, 0xF3, 0xF3, 0xD0, 0xD0, 0xD0, 0xD0, 0xCE, 0xCA, 0xCA, 0x5D, 0xCA, 0xCA, 0xCA, 0x5D, 0xCA,
- 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x1E, 0xA7, 0x3E, 0x1F, 0x1F, 0x20, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xF0, 0xE, 0x2C, 0x2C, 0x3A,
- 0xAA, 0xE, 0x33, 0xB6, 0x41, 0x3A, 0x3A, 0x31, 0x2C, 0x2C, 0x31, 0x33, 0x2C, 0x1, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x3A, 0xFD, 0xE, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA5, 0x3A,
- 0x32, 0x30, 0x5, 0x4, 0x5, 0x4, 0x25, 0x25, 0x20, 0x1F, 0x4, 0x4, 0x2F, 0x12, 0x12, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1C, 0x34, 0x2F, 0x1A, 0x12, 0x2F, 0x2D, 0x36, 0xCE, 0x5A, 0xA,
- 0x8, 0x3B, 0x3D, 0x3D, 0x52, 0xAD, 0xAD, 0xAD, 0xAB, 0xA6, 0xA6, 0xA6, 0x52, 0x7, 0x3, 0x3,
- 0x3, 0x7, 0x8, 0x43, 0x3D, 0x36, 0x36, 0x3D, 0x3D, 0x3D, 0x36, 0x34, 0x34, 0x34, 0x34, 0x36,
- 0xCD, 0xC9, 0xCD, 0xCE, 0xD0, 0xCE, 0xCE, 0xCD, 0xCE, 0xCA, 0x5D, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x4, 0xAF, 0x39, 0xB, 0x4, 0x29, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xF0, 0x31, 0x41, 0x31, 0xA8,
- 0x2C, 0x2C, 0xE, 0x3A, 0x3A, 0x38, 0x3A, 0x31, 0x2C, 0x2C, 0x31, 0x33, 0x38, 0x2C, 0x0, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xB6, 0xFD, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA, 0x3C,
- 0x33, 0x2C, 0xB, 0x4, 0x4, 0x4, 0x30, 0x25, 0x20, 0xB, 0x0, 0x4, 0x1A, 0x1A, 0x1A, 0x12,
- 0xA, 0x12, 0x1A, 0x36, 0x36, 0x34, 0x34, 0x2F, 0x1A, 0x1A, 0x1A, 0x2F, 0x2F, 0xCE, 0x50, 0x0,
- 0x7, 0x3D, 0x3B, 0x3D, 0x48, 0x52, 0xAB, 0xA6, 0x3, 0xF, 0x1, 0x1, 0x12, 0x1D, 0x18, 0x3,
- 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x1, 0x0, 0xF, 0xF, 0xF, 0x10, 0x10, 0x19,
- 0xBF, 0xCE, 0xCE, 0xD0, 0xD0, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0x5D, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x50, 0x51, 0x5A, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x4, 0xB2, 0x6B, 0xD, 0x4, 0x97, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x2C,
- 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xEE, 0x41, 0x1, 0xA5, 0x3A,
- 0x2C, 0x2C, 0x2C, 0x33, 0x33, 0x33, 0x33, 0xE, 0x2C, 0x2C, 0x2C, 0x33, 0x38, 0x31, 0xE, 0x7,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4, 0x41,
- 0x33, 0x2C, 0xE, 0x5, 0x4, 0x0, 0x30, 0x25, 0x20, 0xB, 0x0, 0x4, 0x2F, 0x1C, 0x1C, 0x1C,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x2F, 0x34, 0x2F, 0x34, 0x34, 0x34, 0x34, 0x2F, 0xC9, 0x43, 0x0,
- 0x1, 0x3D, 0x36, 0x3A, 0x36, 0x3D, 0x48, 0xA, 0x1, 0x1, 0x0, 0xFE, 0x52, 0x55, 0x10, 0x0,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x1, 0xF, 0x10, 0x11, 0x43,
- 0xBF, 0xD0, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0x5D, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x4F, 0x0, 0x3, 0x10, 0x10, 0x10, 0x1B, 0x42, 0x43, 0x43, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x4, 0xD5, 0x97, 0xB, 0x4, 0xE6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xFD,
- 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xEA, 0xF7, 0x94, 0x0, 0x2C,
- 0x2C, 0x2C, 0xE, 0x2C, 0x31, 0x31, 0x2C, 0x2C, 0x2C, 0x31, 0x31, 0x31, 0x2C, 0x2C, 0x3C, 0x33,
- 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x41,
- 0x33, 0x2C, 0x2C, 0xB, 0x4, 0x0, 0x30, 0x25, 0x20, 0x5, 0x0, 0x4, 0xA, 0x3, 0x3, 0x1,
- 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1,
- 0x1, 0xF, 0xF, 0xF, 0xF, 0x1, 0x0, 0x1, 0x0, 0xFE, 0xFE, 0x0, 0x52, 0x59, 0x1, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x1, 0x10, 0x42,
- 0x36, 0x53, 0x54, 0x1B, 0x52, 0x19, 0x43, 0x1B, 0x1B, 0x1D, 0x1D, 0x43, 0x1D, 0x1D, 0x1B, 0x1D,
- 0x1B, 0x1D, 0x1B, 0x1B, 0x1A, 0x1, 0x1, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x3, 0x3, 0x5B,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x1E, 0xD7, 0x97, 0x6, 0x4, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xE9, 0xEA, 0xEE, 0x3F, 0xE,
- 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x7, 0xA8, 0xA8, 0xB4, 0x41, 0x31, 0xB4, 0x38,
- 0x7, 0x0, 0x9, 0xE, 0xE, 0xE, 0x31, 0xE, 0xE, 0xE, 0xE, 0x2C, 0x2C, 0xE, 0x2C, 0xE,
- 0xE, 0x2C, 0x2C, 0xE, 0xE, 0xE, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x94,
- 0x38, 0x31, 0x2C, 0x5, 0x4, 0x4, 0x30, 0x37, 0x20, 0x5, 0x4, 0x4, 0x8, 0x10, 0x3, 0x1,
- 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFE, 0x0, 0xFE, 0x0, 0xFE, 0x0, 0x0, 0x0,
- 0x1, 0x1, 0x1, 0xF, 0x1, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1, 0x52, 0x50, 0x0, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xA, 0x1A, 0x1A, 0x1A, 0x12, 0x12, 0x1B, 0x1D,
- 0xF, 0x10, 0x1, 0xF, 0x1, 0x10, 0x1, 0x1, 0xF, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
- 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x46, 0x46, 0x50,
- 0x50, 0x59, 0x56, 0x51, 0x57, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x1F, 0xDB, 0xA9, 0x4, 0x4, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x2C,
- 0xE, 0x31, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xD8, 0xE9, 0x3F, 0x0, 0x2C, 0x2C, 0x38, 0xA3, 0x33, 0x3F,
- 0xA8, 0x31, 0xE, 0xE, 0xE, 0x41, 0x3F, 0x2C, 0x33, 0x31, 0x2C, 0x38, 0x38, 0x2C, 0x2C, 0x2C,
- 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0x94,
- 0x38, 0x31, 0xE, 0x4, 0x5, 0x4, 0x20, 0x30, 0x20, 0x6, 0x4, 0x4, 0x53, 0x53, 0x50, 0x47,
- 0x49, 0x45, 0x1B, 0x1, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x3, 0x52, 0x46, 0x0, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x12, 0x53, 0x54, 0x54, 0xB9, 0xAD, 0x53, 0x1B,
- 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x0, 0x3, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x12, 0x47, 0x49, 0x49, 0x49, 0x47, 0x49, 0x46,
- 0x42, 0x44, 0x42, 0x42, 0x1B, 0x1D, 0x1B, 0x42, 0x1D, 0x50, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x1F, 0xDB, 0x97, 0x4, 0x4, 0xD5, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9,
- 0xFD, 0xF0, 0x3A, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xEE, 0xD8, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xE9, 0x41, 0x0, 0x2C, 0x2C, 0x33, 0xAA, 0x7,
- 0x7, 0x38, 0xA3, 0x38, 0x33, 0xA3, 0x2C, 0x33, 0x33, 0x31, 0x3A, 0xB4, 0xAA, 0x33, 0x31, 0x2C,
- 0x2C, 0x33, 0x33, 0x33, 0x2C, 0x2C, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x2C, 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0xA3,
- 0x38, 0x31, 0xE, 0x0, 0x7, 0x4, 0xD, 0x25, 0x25, 0xB, 0x4, 0x4, 0xEC, 0xEC, 0xC2, 0xC1,
- 0xC1, 0xC1, 0xC1, 0xC1, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xA, 0x52, 0x42, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x52, 0x54, 0xAD, 0xA1, 0x99, 0x53, 0x1A,
- 0xFE, 0xFE, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xAB, 0xBE, 0xBE, 0xBE, 0xC1, 0xC2,
- 0xC2, 0xC2, 0xCE, 0xCE, 0xC0, 0xC0, 0xC0, 0xC2, 0xC0, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x1F, 0xD5, 0x97, 0xB, 0x6, 0x6B, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9,
- 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xEA, 0xD8, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBB, 0xBB, 0xBD, 0xBD, 0xE9, 0x41, 0x0, 0x2C, 0xE, 0xAA, 0x7,
- 0x7, 0xE, 0x2C, 0x41, 0xA3, 0x2C, 0x2C, 0x33, 0x33, 0x33, 0xAA, 0xAA, 0x94, 0x3A, 0xA3, 0x33,
- 0x3F, 0x31, 0x33, 0x33, 0x2C, 0xE, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A,
- 0xFD, 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x38, 0x33, 0xE, 0x0, 0x4, 0x4, 0x20, 0x30, 0x29, 0x6, 0x4, 0x4, 0x48, 0x3D, 0x3D, 0x3D,
- 0x3B, 0x3B, 0x3A, 0x3B, 0x7, 0x0, 0x1, 0x0, 0x1, 0x3, 0x8, 0xA, 0xA, 0x1, 0xFE, 0xFE,
- 0x0, 0x12, 0x1A, 0x2D, 0x12, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1A, 0x53, 0x1B, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x34, 0x54, 0xAD, 0xE1, 0xAD, 0x53, 0x44,
- 0x1B, 0x7, 0x0, 0x3, 0x0, 0x1, 0x1, 0x0, 0x3, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xBE, 0xC2, 0xC2, 0xC2, 0x5D,
- 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5A, 0x6,
- 0x6, 0xAF, 0x97, 0x20, 0x1F, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x3A,
- 0xF0, 0xFD, 0xE9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xEE, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
- 0xE9, 0xE9, 0xE9, 0xBD, 0xBD, 0xBD, 0xBB, 0xBB, 0xBD, 0xBD, 0xE9, 0x3F, 0x0, 0x2C, 0x3A, 0x7,
- 0x7, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0xE, 0x33, 0x3A, 0x38, 0x33, 0x38, 0x31, 0x94, 0x2C, 0x3A,
- 0xB6, 0x33, 0x38, 0xA3, 0xA3, 0x2C, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xA8,
- 0x3A, 0x33, 0x2C, 0x0, 0x4, 0x0, 0x30, 0x29, 0x25, 0x1E, 0x4, 0x4, 0x2F, 0x1A, 0xA, 0x3,
- 0x3, 0xA, 0x3, 0x1, 0x3, 0xA, 0x1A, 0x12, 0x2F, 0x34, 0x34, 0x34, 0x36, 0xA, 0xFE, 0x0,
- 0x0, 0x1A, 0x4C, 0x48, 0x2F, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1B, 0x53, 0x10, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1, 0x53, 0x55, 0xA6, 0x54, 0x53, 0x53,
- 0xB9, 0xC9, 0xBF, 0x46, 0xBF, 0x43, 0x55, 0x59, 0x5A, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x50, 0x3, 0x1, 0x1, 0x0, 0x1, 0x36, 0xC2, 0xC2, 0xCE, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x1F,
- 0x1E, 0x71, 0x39, 0x25, 0x25, 0x6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x31, 0xE, 0x2C, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7,
- 0xF7, 0xF7, 0xF5, 0xEE, 0xD8, 0xBD, 0xBD, 0xBB, 0xBB, 0xBD, 0xBD, 0xD8, 0x3A, 0xE, 0x2C, 0x9,
- 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x2C, 0x2C,
- 0x31, 0x2C, 0x2C, 0xE, 0xE, 0x31, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9,
- 0x31, 0xE, 0x31, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xA8,
- 0x3B, 0x33, 0x2C, 0x0, 0x4, 0x0, 0x20, 0x29, 0x25, 0x1F, 0x4, 0x4, 0xA, 0x3, 0x3, 0x3,
- 0x1, 0x1, 0x1, 0x3, 0x7, 0x7, 0x7, 0x3, 0xA, 0xA, 0x3, 0xA, 0xA, 0x7, 0xFE, 0x0,
- 0x0, 0x3, 0xA, 0x8, 0x7, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1C, 0x53, 0x1, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x36, 0xAD, 0x9D, 0x54, 0x53, 0xA,
- 0x4C, 0xCC, 0xCA, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x50, 0x50, 0x50, 0x50, 0x56, 0x57, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x1F,
- 0x1F, 0x71, 0x39, 0xD, 0x39, 0x4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xD8, 0xBD, 0xBD, 0xBB, 0xBB, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xE9, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xBD, 0xFD, 0xE, 0xA3, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xA8,
- 0x3A, 0x33, 0x2C, 0x0, 0x4, 0x0, 0x4, 0x1F, 0x25, 0x20, 0x6, 0x4, 0x1, 0x0, 0x0, 0x0,
- 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x2A, 0x16, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x1,
- 0x1, 0x1, 0x1, 0x1, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0xFE, 0xFE, 0x36, 0x53, 0x1, 0xFE, 0xFE,
- 0x24, 0x1F, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x3, 0x53, 0x55, 0xAD, 0x50, 0x1B,
- 0x1A, 0x4F, 0x50, 0x50, 0x50, 0x53, 0x51, 0x50, 0x51, 0x51, 0x50, 0x50, 0x50, 0x50, 0x4F, 0x50,
- 0x50, 0x50, 0x4F, 0x46, 0x46, 0x47, 0x46, 0x46, 0x42, 0x42, 0x42, 0x50, 0x5A, 0x5B, 0x58, 0x58,
- 0x58, 0x58, 0x58, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x5A, 0x5B, 0x5B, 0x5B, 0x58, 0x6,
- 0x4, 0x97, 0x3E, 0x6, 0x6B, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x7,
- 0x9, 0x7, 0x31, 0x1, 0x7, 0xE, 0x2C, 0x9, 0x7, 0x7, 0x7, 0x7, 0xE, 0x7, 0x7, 0x7,
- 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x2C, 0x31, 0xE, 0x7, 0x7, 0x7, 0x7, 0x9, 0x9,
- 0x7, 0x7, 0x7, 0x7, 0x0, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xF8, 0xFD, 0xE, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x32, 0xD, 0x0, 0x5, 0x0, 0x4, 0x6, 0x25, 0x20, 0x6, 0x4, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x2B, 0x95, 0xD, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1,
- 0x0, 0x0, 0x0, 0x0, 0xFE, 0x0, 0xFE, 0x0, 0xFE, 0xFE, 0x0, 0x4F, 0x53, 0x0, 0xFE, 0xFE,
- 0x2B, 0x2A, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x4C, 0x53, 0x54, 0x4F, 0xBF,
- 0xB9, 0x3, 0x1, 0xF, 0xF, 0x10, 0x10, 0xF, 0x10, 0xF, 0xF, 0xF, 0x10, 0x10, 0x10, 0x10,
- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF, 0x10, 0x10, 0x10, 0x19, 0x43, 0x57, 0x58,
- 0x58, 0x5A, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x29, 0xB2, 0x6E, 0x1F, 0x39, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x94, 0x0, 0xE,
- 0xB4, 0x3A, 0x41, 0xE, 0x2C, 0x9, 0x7, 0x33, 0xB4, 0x41, 0x2C, 0x94, 0xB4, 0x3C, 0x33, 0x2C,
- 0x2C, 0x2C, 0xE, 0x2C, 0x2C, 0x31, 0x38, 0xA8, 0xAA, 0x33, 0xB4, 0xE, 0x41, 0x33, 0x33, 0x33,
- 0x3A, 0xE, 0x2C, 0x2C, 0xAA, 0x7, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x3A, 0xFD, 0xE, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0xA3,
- 0x3A, 0x2C, 0x7, 0x0, 0x5, 0x0, 0x25, 0x29, 0x25, 0x1F, 0x4, 0x4, 0x0, 0x0, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x2, 0x4B, 0x27, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0x0, 0xFE, 0xFE, 0x0, 0xFE, 0xFE, 0x0, 0x4F, 0x4F, 0x0, 0xFE, 0x0,
- 0x95, 0x2B, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x3, 0x55, 0x55, 0x53, 0xA,
- 0x1, 0xF, 0x1, 0xF, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xF, 0xF, 0xF, 0x3,
- 0x1, 0x1, 0x1, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xF, 0xF, 0x11, 0x11, 0x42, 0x50,
- 0x47, 0x1A, 0x52, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x1F, 0x25, 0x6, 0x1F, 0x37, 0x1F, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x0, 0x2C, 0xE,
- 0xE, 0xA3, 0xA8, 0x3C, 0x41, 0xA8, 0x31, 0xE, 0xE, 0x3A, 0xAA, 0x41, 0x2C, 0x2C, 0xE, 0x2C,
- 0x2C, 0xE, 0x2C, 0x33, 0x33, 0x33, 0x3C, 0x31, 0x38, 0x3C, 0x33, 0xE, 0xB6, 0x3F, 0x33, 0x3F,
- 0xB7, 0x3F, 0x2C, 0x3F, 0x41, 0x31, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xB6, 0xFD, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x41,
- 0x33, 0x2C, 0x6, 0x0, 0x5, 0x0, 0x39, 0x6E, 0x29, 0x1F, 0x4, 0x4, 0xFE, 0x6, 0x2A, 0x0,
- 0x2A, 0x16, 0x1F, 0x2A, 0x0, 0x24, 0x4B, 0x7, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0xFE, 0x0, 0x0, 0x0, 0x0, 0xFE, 0x3, 0x53, 0x46, 0x0, 0xFE, 0x0,
- 0x95, 0x25, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x4F, 0x55, 0x53, 0x3,
- 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0xA, 0x4D, 0x2E, 0x0, 0x3C, 0x4D, 0xA, 0x35, 0x4D, 0x2E, 0x0, 0x1, 0x3, 0x18, 0x18, 0x12,
- 0x44, 0x4A, 0xF1, 0x5A, 0x5B, 0x5B, 0x58, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x1F,
- 0x1E, 0x6, 0x4, 0x1F, 0x37, 0x25, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB7, 0x2C,
- 0xE, 0x38, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x7, 0x31, 0x3F,
- 0xA5, 0x2C, 0xE, 0xE, 0xE, 0x7, 0x3A, 0x3F, 0x9, 0xE, 0x2C, 0x2C, 0x2C, 0x31, 0x2C, 0x2C,
- 0x2C, 0x2C, 0x2C, 0x31, 0x33, 0x31, 0x38, 0x2C, 0x2C, 0x31, 0x3C, 0x41, 0xAA, 0x2C, 0x31, 0x2C,
- 0x2C, 0x3A, 0xAA, 0xAA, 0x2C, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x41,
- 0x33, 0x2C, 0x6, 0x0, 0x5, 0x0, 0x39, 0x39, 0x29, 0x1F, 0x4, 0x1E, 0xFE, 0x27, 0x4B, 0x0,
- 0x9, 0x7, 0x1, 0x7, 0x0, 0x1, 0x1, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0,
- 0x0, 0xFE, 0x0, 0x0, 0xFE, 0x0, 0xFE, 0x0, 0x0, 0xFE, 0x3, 0x52, 0x43, 0x0, 0xFE, 0x0,
- 0x24, 0x6, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1A, 0x55, 0x50, 0x3,
- 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x18, 0x1B,
- 0x59, 0x5D, 0x5B, 0x58, 0x50, 0x1D, 0x56, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x1F, 0x39, 0x25, 0x1F, 0x37, 0x29, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF0,
- 0xFD, 0xF0, 0x3A, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF7, 0xF7, 0x9, 0x3A, 0x33,
- 0x33, 0x2C, 0x2C, 0x2C, 0x2C, 0xE, 0xE, 0x94, 0x2C, 0x7, 0xE, 0xE, 0x2C, 0x31, 0x2C, 0x2C,
- 0x2C, 0xE, 0xE, 0x3C, 0x3C, 0x38, 0x33, 0xE, 0x2C, 0x2C, 0x2C, 0x41, 0x31, 0x2C, 0x2C, 0xE,
- 0x2C, 0x31, 0xA3, 0x2C, 0x31, 0x2C, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xD8,
- 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x41,
- 0x3A, 0x2E, 0xB, 0x0, 0xB, 0x0, 0x37, 0x35, 0x25, 0x1F, 0x6, 0x1E, 0xFE, 0x2, 0x2, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x0, 0xFE, 0x0, 0x0, 0xFE, 0x12, 0x53, 0x1B, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x53, 0x4F, 0x3,
- 0x0, 0xFE, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x10,
- 0x1, 0x3, 0x1B, 0x46, 0x3, 0x10, 0x43, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x6,
- 0x4, 0x6E, 0x39, 0x4, 0x6B, 0x29, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xBD,
- 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xE9, 0xE9, 0xE9, 0xE, 0x3F, 0x38,
- 0x2C, 0x2C, 0x33, 0x33, 0x33, 0x2C, 0x2C, 0x33, 0x3A, 0x7, 0x7, 0x7, 0xE, 0x31, 0xA3, 0x31,
- 0x2C, 0xE, 0xE, 0xAA, 0x33, 0x2C, 0x2C, 0x2C, 0x2C, 0x33, 0x33, 0x33, 0x33, 0x2C, 0xE, 0x2C,
- 0x2C, 0xA3, 0x33, 0x2C, 0x2C, 0x2C, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31,
- 0xEA, 0xFD, 0x3C, 0xE, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB7, 0x94,
- 0x38, 0x2E, 0xE, 0x0, 0xB, 0x4, 0x37, 0x37, 0x29, 0x1F, 0x4, 0x4, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x2B, 0x2A, 0x0,
- 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFE, 0xFE, 0x1A, 0x55, 0x12, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1B, 0x53, 0x1B,
- 0x1A, 0x1B, 0x1B, 0x1B, 0x34, 0x36, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x4F, 0x4F, 0x4F, 0x4F,
- 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x36, 0x36, 0x46, 0x36, 0x34, 0x34, 0x12,
- 0x12, 0x34, 0x34, 0x34, 0x49, 0xBF, 0xC0, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x6,
- 0x4, 0x6C, 0x37, 0x1E, 0x71, 0x37, 0xA7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0x33,
- 0xFD, 0xFD, 0xF0, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xE9, 0xBD, 0xBD, 0xBD, 0xE, 0xA3, 0x31,
- 0x2C, 0x33, 0x38, 0x33, 0x38, 0x2C, 0x2C, 0x33, 0xA3, 0xE, 0x7, 0x7, 0x7, 0x3C, 0x31, 0xA8,
- 0xA8, 0xE, 0x38, 0x33, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x33, 0x33, 0x38, 0x3A, 0x2C, 0x2C, 0x2C,
- 0x41, 0xB7, 0xA3, 0x31, 0x2C, 0x38, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE,
- 0xFD, 0xBD, 0x38, 0xF7, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x31, 0x2C, 0x0, 0x6, 0x4, 0x37, 0x39, 0x37, 0x1F, 0x4, 0x4, 0x0, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x6, 0x4B, 0x25, 0xFE,
- 0xFE, 0xFE, 0x0, 0x1, 0x1, 0xF, 0x1, 0xF, 0x0, 0x0, 0x1D, 0x55, 0xE, 0x2B, 0x25, 0x0,
- 0x1, 0x1, 0x1, 0xF, 0x1, 0xF, 0xF, 0x10, 0x11, 0x11, 0x11, 0x19, 0x19, 0x19, 0x50, 0x5C,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xD0, 0xCC, 0xCC, 0xCE, 0xCC, 0xD0, 0xD0, 0xD0, 0xF3, 0xF3, 0xD0, 0xCC, 0xCC, 0xF3, 0xCF,
- 0x52, 0xAB, 0xC1, 0xB9, 0xAB, 0xA3, 0x1A, 0x1A, 0x1B, 0x5A, 0x5B, 0x5B, 0x5D, 0x5B, 0x5D, 0x1F,
- 0x4, 0x6E, 0x37, 0x1F, 0x9B, 0x39, 0x6B, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xE, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xBD, 0xBD, 0xBB, 0xBB, 0x2C, 0x3C, 0xE,
- 0x2C, 0x33, 0x33, 0x33, 0x31, 0x31, 0x33, 0x94, 0xA3, 0xE, 0x2C, 0xE, 0xA3, 0x2C, 0x7, 0x0,
- 0xE, 0x3F, 0xAA, 0x31, 0xE, 0x2C, 0x2C, 0x2C, 0xE, 0x38, 0x31, 0x3C, 0xAA, 0xA3, 0x33, 0x33,
- 0xA3, 0xE, 0x3C, 0xAA, 0xA3, 0x38, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xF0, 0x33, 0xEA, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA,
- 0x3C, 0x33, 0x2C, 0x4, 0x4, 0x0, 0x39, 0x39, 0x29, 0x1E, 0x4, 0x4, 0x0, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x0,
- 0x0, 0x0, 0x0, 0xF, 0xF, 0xF, 0x1, 0x1, 0x1, 0xFE, 0x1D, 0x55, 0x2E, 0x95, 0x25, 0x1,
- 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xF, 0xF, 0x10, 0x11, 0x11, 0x19, 0x42, 0x50, 0x5C,
- 0xCA, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 0xCB,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xCB, 0xCB, 0xD0, 0xD0, 0xD0, 0xD0, 0xF3, 0xD0, 0xD0, 0xF3, 0xD0,
- 0xF3, 0xC4, 0x0, 0x0, 0x3, 0xBE, 0xBE, 0xBE, 0xBF, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0x1F,
- 0x4, 0x97, 0x6B, 0x1E, 0x65, 0x0, 0x39, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xE, 0xA3, 0x38,
- 0xE, 0x31, 0x38, 0x31, 0x2C, 0x33, 0x3A, 0x38, 0x3A, 0x31, 0x2C, 0x41, 0xA3, 0xE, 0xE, 0x7,
- 0x7, 0x0, 0xE, 0xAA, 0xAA, 0x38, 0x2C, 0x2C, 0x2C, 0x31, 0x33, 0x31, 0x2C, 0x31, 0xA3, 0xB4,
- 0x2C, 0x2C, 0x2C, 0x2C, 0x38, 0xAA, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD,
- 0xE, 0xA3, 0xFD, 0x2C, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3C, 0x33, 0x2C, 0x4, 0x4, 0x0, 0x39, 0x6B, 0x22, 0x1E, 0x4, 0x1E, 0x0, 0xFE, 0x0, 0xFE,
- 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
- 0x1, 0x1, 0x1, 0xF, 0xF, 0xF, 0x3, 0x3, 0x3, 0x3, 0x43, 0x4F, 0xA, 0x12, 0x10, 0x12,
- 0x12, 0x12, 0x12, 0x12, 0x18, 0x1A, 0x18, 0x10, 0x12, 0x18, 0x18, 0x19, 0x1B, 0x47, 0x1D, 0x1C,
- 0x36, 0x4F, 0x5C, 0xCA, 0xCE, 0xCD, 0xCB, 0xCB, 0xC9, 0x5C, 0xC9, 0xC9, 0xCA, 0xCA, 0xCC, 0xCC,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xC9, 0xC9, 0xCB, 0xD0, 0xD0, 0xD0, 0xF3, 0xF3, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xD0, 0x12, 0x3, 0x3, 0x59, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0x6,
- 0x4, 0x71, 0x65, 0x1E, 0x1F, 0xD7, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x2C,
- 0xE, 0x31, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0x7, 0x31, 0x94,
- 0xAA, 0x3A, 0x2C, 0x2C, 0x2C, 0x38, 0x41, 0x3A, 0x38, 0x33, 0x33, 0xAA, 0x2C, 0x2C, 0x2C, 0x2C,
- 0x9, 0x7, 0x7, 0x0, 0x38, 0xB7, 0x31, 0x31, 0x2C, 0x2C, 0xE, 0x7, 0x7, 0x7, 0x2C, 0xE,
- 0x7, 0x7, 0xE, 0xA3, 0x3A, 0xE, 0x9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3C, 0x33, 0x2C, 0x4, 0x6, 0x4, 0x6B, 0x6B, 0x29, 0x1E, 0x4, 0x1E, 0x0, 0xFE, 0xFE, 0x0,
- 0x12, 0x1B, 0x42, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x13, 0x0, 0xFE,
- 0xFE, 0x1, 0x47, 0x4F, 0x4F, 0x50, 0x50, 0x53, 0x46, 0x4F, 0x50, 0x4F, 0x4F, 0x50, 0x50, 0x53,
- 0x53, 0x53, 0x55, 0x55, 0x55, 0xAD, 0x55, 0x55, 0x53, 0x55, 0x55, 0x55, 0xAD, 0x5C, 0x47, 0x44,
- 0x34, 0x34, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x8, 0x8, 0x12, 0x12, 0x12, 0x46, 0xCC,
- 0xCA, 0xCB, 0xCB, 0xCB, 0xCD, 0xBF, 0xBF, 0xC9, 0xCB, 0xCB, 0xD0, 0xD0, 0xD0, 0xF3, 0xF3, 0xF3,
- 0xF3, 0xD0, 0x36, 0x36, 0x34, 0x1D, 0x43, 0x43, 0x43, 0x43, 0x43, 0x42, 0x42, 0x1D, 0x1D, 0x6,
- 0x4, 0x6B, 0x6B, 0x1E, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9,
- 0xFD, 0xF0, 0x3A, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0x7, 0x33, 0x2C,
- 0x38, 0x41, 0xA8, 0x3A, 0x33, 0xB6, 0xA3, 0x3A, 0x31, 0x2C, 0x41, 0x33, 0x2C, 0x2C, 0x2C, 0x2C,
- 0x2C, 0xE, 0xE, 0x9, 0x33, 0xA3, 0x31, 0x31, 0x38, 0xE, 0x0, 0xBB, 0xBB, 0xBB, 0xBB, 0xBD,
- 0xD8, 0xF0, 0x2C, 0xB6, 0xA8, 0x3F, 0x1, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x2C, 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4,
- 0x3C, 0x33, 0x2C, 0x0, 0x6, 0x4, 0x6E, 0x6B, 0x29, 0x1E, 0x4, 0x4, 0xFE, 0xFE, 0xFE, 0x12,
- 0xBE, 0xC2, 0xEC, 0xCE, 0xCE, 0xEC, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC1, 0xC1, 0xA4, 0x0,
- 0xFE, 0x8, 0x53, 0x52, 0x53, 0x50, 0x50, 0x55, 0x4F, 0x4F, 0x52, 0x53, 0x53, 0x52, 0x4F, 0x50,
- 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0xC4, 0xC4, 0x55, 0xAD, 0xC0, 0x55, 0xBE,
- 0xBE, 0xC1, 0xC1, 0xC1, 0xBE, 0xBE, 0xC1, 0xC1, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xC1, 0xCC,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xBF, 0xAD, 0xBF, 0xC9, 0xCB, 0xD0, 0xD0, 0xD0, 0xF3, 0xF3, 0xF3,
- 0xF3, 0xD0, 0x46, 0x46, 0x46, 0x1A, 0x3, 0xA, 0x12, 0x12, 0x12, 0x12, 0x12, 0x1A, 0x2D, 0x6,
- 0x4, 0x7A, 0x39, 0x1F, 0x4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9,
- 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xE, 0xA3, 0xA3,
- 0x38, 0x2C, 0x31, 0x94, 0xA5, 0x38, 0xE, 0xE, 0x2C, 0x41, 0x3F, 0x41, 0xA3, 0x2C, 0x2C, 0x2C,
- 0x2C, 0x2C, 0x2C, 0x33, 0x41, 0x3A, 0x33, 0x31, 0x31, 0x1, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBD,
- 0xD8, 0xF0, 0xE, 0xB4, 0x2C, 0xA3, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A,
- 0xFD, 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3C, 0x33, 0xE, 0x0, 0x6, 0x0, 0x6B, 0x6B, 0x29, 0x1E, 0x4, 0x1E, 0x0, 0xFE, 0xFE, 0x7,
- 0xAB, 0xCD, 0xF1, 0x36, 0xA, 0x7, 0x3, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x7, 0x7, 0x0,
- 0xFE, 0x12, 0x53, 0x52, 0x50, 0x53, 0x53, 0x55, 0x4F, 0x52, 0x52, 0x53, 0x53, 0x50, 0x4F, 0x4F,
- 0x4F, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x52, 0x9D, 0x9C, 0x52, 0xAD, 0xC0, 0xBF, 0xEC,
- 0xF1, 0xCE, 0xD0, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCD, 0xBF, 0xCD, 0xCD, 0xCE, 0xCE, 0xCE, 0xCB,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xC9, 0xBF, 0xBF, 0xC9, 0xC9, 0xCB, 0xD0, 0xD0, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCA, 0xC0, 0xC9, 0xBF, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x6,
- 0x4, 0x9B, 0x6B, 0x1F, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x3A,
- 0xF0, 0xFD, 0xE9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0x0, 0x9, 0x31,
- 0xA8, 0x38, 0xE, 0x2C, 0x2C, 0x2C, 0x2C, 0xE, 0x3A, 0x41, 0x3F, 0x2C, 0x33, 0x94, 0xA3, 0x2C,
- 0x2C, 0xE, 0x2C, 0xB4, 0x33, 0x31, 0x31, 0x2C, 0x7, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBB, 0xBD,
- 0xD8, 0xF0, 0x7, 0x2C, 0x38, 0x2C, 0x1, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA5,
- 0x3A, 0x33, 0xE, 0x0, 0x6, 0x0, 0x39, 0x6E, 0x29, 0x1F, 0x4, 0x1E, 0xFE, 0xFE, 0xFE, 0xFE,
- 0x0, 0x3, 0xA, 0x3, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0x1A, 0x52, 0x4F, 0x4F, 0x4F, 0x53, 0x53, 0x52, 0x52, 0x4F, 0x4F, 0x4F, 0x4F, 0x4F, 0x4F,
- 0x52, 0x4F, 0x4F, 0x4F, 0x52, 0x52, 0x53, 0x53, 0x52, 0xE1, 0xC7, 0x52, 0x55, 0xC0, 0x50, 0x5C,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xD0, 0xD0, 0xCC, 0xCB, 0xC9, 0x52, 0x53, 0x55, 0xBF, 0xC9, 0xCB, 0xCB,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xCD, 0xCD, 0xC9, 0xCD, 0xC9, 0xC9, 0xCB, 0xD0, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCA, 0xCA, 0xC0, 0xCD, 0xEC, 0xF1, 0xF1, 0xF1, 0xEC, 0xEC, 0xF1, 0xF1, 0xF1, 0xB,
- 0x1E, 0x96, 0x65, 0x1F, 0x39, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x31, 0xE, 0x2C, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xBB, 0x0, 0xE,
- 0x31, 0xAA, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x31, 0xA8, 0x2C, 0x3C, 0x41, 0x3C, 0x41, 0x41, 0xA3,
- 0x41, 0xE, 0x41, 0x41, 0xE, 0x2C, 0xE, 0x0, 0xE9, 0xE9, 0xE9, 0xE9, 0xD8, 0xBD, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x31, 0x41, 0xE, 0x7, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0xA3,
- 0x38, 0x32, 0x6, 0x0, 0x4, 0x0, 0x39, 0x6B, 0x29, 0x1F, 0x4, 0x1E, 0x1, 0x18, 0x1D, 0x43,
- 0x1D, 0x1D, 0x1D, 0x1D, 0x1B, 0x1B, 0x1D, 0x1D, 0x1B, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x36, 0x4F, 0x4F, 0x4F, 0x50, 0x53, 0x53, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x52,
- 0x52, 0x53, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x52, 0x52, 0x52, 0x53, 0x55, 0xC0, 0x50, 0xC9,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xBF, 0x52, 0x52, 0x53, 0x53, 0x55, 0xBF, 0xCB,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCF, 0xCB, 0xCB, 0xCB, 0xCB, 0xC9, 0xC9, 0xCB, 0xD0, 0xF3, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCA, 0xCA, 0xCA, 0xCE, 0xF1, 0xF1, 0xF1, 0xF1, 0xEC, 0xEC, 0xF1, 0xC2, 0x5D, 0xB,
- 0x4, 0x96, 0x65, 0x20, 0x9B, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x9,
- 0x9, 0x2C, 0xE, 0xE, 0xE, 0x9, 0x9, 0x2C, 0xE, 0xE, 0xE, 0x9, 0x2C, 0x2C, 0xE, 0x2C,
- 0x2C, 0xE, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF5, 0xEE, 0xD8, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x7, 0x3F, 0xAA, 0x3A, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x94,
- 0x33, 0x30, 0x20, 0x4, 0x6, 0x0, 0x29, 0x39, 0x29, 0x1F, 0x4, 0x1E, 0xFE, 0xFE, 0x0, 0x3,
- 0x1B, 0x46, 0x50, 0x55, 0x5C, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0x53, 0x4F, 0x4F, 0x53, 0x53, 0x55, 0x52, 0x53, 0x53, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52,
- 0x52, 0x52, 0x52, 0x53, 0x53, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x55, 0xC0, 0x50, 0xBF,
- 0xC9, 0xCD, 0xCB, 0xCD, 0xC9, 0xCB, 0xC9, 0xC9, 0x55, 0x4F, 0x4F, 0x52, 0x53, 0x53, 0x55, 0xBF,
- 0xCB, 0xCB, 0xCB, 0xCB, 0xCD, 0xCB, 0xCB, 0xCB, 0xCB, 0xC9, 0xBF, 0xCB, 0xCB, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCA, 0xCA, 0xCA, 0xCE, 0xCA, 0xCA, 0x5D, 0x5B, 0x5A, 0x5B, 0x5B, 0x5B, 0x5D, 0xD,
- 0x4, 0x97, 0x6B, 0x20, 0x6B, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBD, 0xBD, 0xE9, 0xF0, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x9, 0x7, 0xE, 0xA5, 0x31, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4, 0x41,
- 0x33, 0x2C, 0x20, 0x4, 0x6, 0x4, 0x25, 0x6B, 0x29, 0x1F, 0x1E, 0x1E, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xA, 0x1A, 0x1D, 0x46, 0x53, 0x55, 0x5A, 0x5C, 0xCA, 0xCA,
- 0x5D, 0x53, 0x4F, 0x4F, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0xE1, 0x9D, 0x52,
- 0x4F, 0x52, 0x4F, 0x4F, 0x55, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x55, 0xC0, 0x46, 0x36,
- 0x53, 0xC9, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xBF, 0x52, 0x52, 0x52, 0x52, 0x52, 0x55, 0xAD,
- 0xBF, 0xC4, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCD, 0xBF, 0xC9, 0xC9, 0xCB, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCC, 0xCC, 0xCC, 0xD0, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0xE,
- 0x4, 0x9B, 0x71, 0x25, 0x29, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xB7,
- 0x41, 0x2C, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xE9, 0xF0, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x7, 0x2C, 0x3A, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA, 0x3C,
- 0x33, 0x2C, 0x20, 0x4, 0x4, 0x4, 0x25, 0x6B, 0x29, 0x1F, 0x1E, 0x1E, 0x0, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1, 0x1A, 0x3D, 0x54, 0x55, 0x5D, 0x5D,
- 0x5C, 0x53, 0x53, 0x53, 0x53, 0x55, 0x55, 0x53, 0x53, 0x53, 0x53, 0x53, 0x52, 0x4E, 0x3A, 0x52,
- 0x52, 0x52, 0x52, 0x53, 0xAB, 0x52, 0x53, 0xAB, 0x53, 0x53, 0x53, 0x53, 0xAD, 0x5A, 0x49, 0x49,
- 0x44, 0x36, 0x53, 0xCA, 0xCB, 0xCC, 0xCB, 0xCB, 0xBF, 0x55, 0x53, 0x52, 0x52, 0x52, 0x52, 0x55,
- 0xAD, 0xEC, 0xA0, 0xA0, 0xA0, 0x9E, 0x9E, 0x9E, 0x9E, 0xA0, 0xA0, 0x9E, 0xC4, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCC, 0xCC, 0xCC, 0xCE, 0x59, 0x51, 0x51, 0x50, 0x50, 0x56, 0x5B, 0x5B, 0x5D, 0xC,
- 0xB, 0xB2, 0x71, 0x1F, 0x4, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xE9, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xE9, 0xF0, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x7, 0xB8, 0x41, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x3A, 0x94, 0x2C, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8, 0x3C,
- 0x33, 0x30, 0xD, 0x4, 0x5, 0x0, 0x25, 0x39, 0x29, 0x1F, 0x4, 0x1E, 0x0, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x8, 0x34, 0x52, 0x55, 0xCB, 0xD0, 0xD0, 0xD0, 0xC9, 0x5D, 0x5C,
- 0x5C, 0x55, 0x55, 0x55, 0xAD, 0xBF, 0xBF, 0x52, 0x53, 0x53, 0x55, 0x55, 0x53, 0x55, 0x55, 0x53,
- 0x53, 0x53, 0x55, 0x55, 0xAD, 0x52, 0x55, 0x53, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xC0, 0x55, 0xC1,
- 0xCD, 0xCE, 0xCE, 0xCC, 0xCB, 0xCB, 0xCB, 0xCB, 0xC9, 0xBF, 0xBF, 0x55, 0x53, 0x52, 0x52, 0x53,
- 0x54, 0xE9, 0xB2, 0xD5, 0xE5, 0x9B, 0x9A, 0xAF, 0x9B, 0xD5, 0xE5, 0x6B, 0xC4, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCC, 0xCC, 0xCC, 0xCD, 0x2D, 0x1A, 0x13, 0x13, 0x13, 0x1B, 0x5A, 0x5B, 0x5B, 0xB,
- 0x20, 0xD5, 0x71, 0x6, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xA3,
- 0xBD, 0xF8, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xEE, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
- 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
- 0xEE, 0xF5, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x0, 0xA3, 0x31, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xF9, 0xFD, 0xFD, 0xA3, 0x94, 0x41, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA, 0x3C,
- 0x33, 0x30, 0xB, 0x4, 0x5, 0x0, 0x20, 0x37, 0x29, 0x1F, 0x4, 0x1E, 0x0, 0x0, 0xFE, 0x0,
- 0x0, 0x8, 0x36, 0xAD, 0xCF, 0xFA, 0xF3, 0xD0, 0xC9, 0xC9, 0xCB, 0xD0, 0xD0, 0xC9, 0x5C, 0x5D,
- 0x5C, 0xCA, 0x4F, 0x7, 0x5B, 0x47, 0x1, 0x1A, 0x5D, 0x59, 0xA, 0x55, 0x5D, 0xC8, 0x9D, 0x5C,
- 0x55, 0xBF, 0xF3, 0xD0, 0xCE, 0xBF, 0xC9, 0xBF, 0xBF, 0x5C, 0xC9, 0xC9, 0xCE, 0xC0, 0x59, 0xBF,
- 0xC9, 0xCD, 0xC9, 0xC4, 0xC9, 0xCD, 0xCD, 0xCD, 0xAD, 0xCD, 0xCD, 0xCD, 0xC9, 0xBF, 0xAD, 0xAB,
- 0xAD, 0xC6, 0x9B, 0xB2, 0xD5, 0x9D, 0x9A, 0x9B, 0xAF, 0xB5, 0xDE, 0x6B, 0xAD, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCC, 0xCC, 0xCC, 0xCE, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x5B, 0x5B, 0x5B, 0xB,
- 0x20, 0xD5, 0x71, 0x6, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xB6,
- 0x3F, 0xE, 0x2C, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
- 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
- 0xF8, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x7, 0x2C, 0x2C, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xF5, 0xFD, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA, 0x3F,
- 0x33, 0x30, 0x6, 0x4, 0x5, 0x0, 0x20, 0x39, 0x25, 0x1F, 0x4, 0x1E, 0x7, 0x2F, 0x48, 0xB9,
- 0xCE, 0xC9, 0xAD, 0xBF, 0xD0, 0xD0, 0xF3, 0xF3, 0xD0, 0xCB, 0xCB, 0xD0, 0xD0, 0xCB, 0x5C, 0x5D,
- 0x5C, 0x5D, 0x46, 0x0, 0x51, 0x50, 0x0, 0x3, 0x5A, 0x5A, 0x0, 0x0, 0x53, 0xCF, 0xC8, 0x5C,
- 0x55, 0xBF, 0xD0, 0xF3, 0xCE, 0xAD, 0xC9, 0xAD, 0x55, 0x55, 0xBF, 0xC9, 0xCE, 0xC0, 0x50, 0x54,
- 0xC9, 0xCC, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xCE, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC4, 0xC9,
- 0xC9, 0xC6, 0x9B, 0xB2, 0xD5, 0x9F, 0x9A, 0x9B, 0xAF, 0xB5, 0xE5, 0x6B, 0xAD, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xCC, 0xCC, 0xD0, 0xCE, 0xC0, 0xCA, 0xC0, 0xC0, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x25, 0xB5, 0x6E, 0x4, 0xDB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x31, 0xA8, 0x38, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA,
- 0x33, 0xE9, 0xFD, 0xBD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xB4, 0x41,
- 0x33, 0x30, 0x5, 0x4, 0x5, 0x0, 0x20, 0x39, 0x25, 0x1F, 0x4, 0x1E, 0xFA, 0xFD, 0xFA, 0xFA,
- 0xF3, 0xD0, 0xC9, 0xAD, 0xBF, 0xCB, 0xD0, 0xD0, 0xD0, 0xCC, 0xCA, 0xCA, 0x5C, 0x5D, 0x5C, 0x5D,
- 0x5C, 0x4F, 0x1, 0x1, 0x50, 0x57, 0x0, 0x3, 0x5A, 0x5A, 0x1, 0x1, 0x10, 0xBF, 0xAD, 0x5C,
- 0x55, 0xBF, 0xD0, 0xF3, 0xD0, 0xBF, 0xBF, 0xC9, 0x55, 0x55, 0x55, 0xBF, 0xCD, 0xC9, 0x46, 0x34,
- 0x1A, 0x36, 0xC9, 0xF3, 0xF3, 0xF3, 0xF3, 0xD0, 0xCE, 0xCB, 0xC9, 0xC9, 0xC9, 0xCB, 0xC4, 0xCF,
- 0xC4, 0xC6, 0x9B, 0xAF, 0xDE, 0x9D, 0x9A, 0x97, 0xAF, 0xAF, 0xE5, 0x6B, 0xAD, 0xD0, 0xF3, 0xF3,
- 0xF3, 0xF3, 0xD0, 0xD0, 0xF3, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x7,
- 0x20, 0xAF, 0x6E, 0xFE, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x38,
- 0xA3, 0xB4, 0xE9, 0xE, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x7, 0x38, 0xAA, 0xA8, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xB6, 0x31, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xB6, 0x41,
- 0x33, 0x2C, 0x23, 0x4, 0x5, 0x0, 0x1F, 0x39, 0x29, 0x1F, 0x4, 0x1E, 0xFA, 0xFA, 0xFA, 0xFA,
- 0xFA, 0xF3, 0xD0, 0xCF, 0xAD, 0x4C, 0x46, 0x50, 0x51, 0x5C, 0x5D, 0xCA, 0xCA, 0xCA, 0x5C, 0x5D,
- 0xCA, 0x4F, 0x46, 0x1B, 0x50, 0x5B, 0x1, 0x0, 0x55, 0x5A, 0x1A, 0x1B, 0x50, 0x8, 0x7, 0x53,
- 0x55, 0xBF, 0xCE, 0xD0, 0xF3, 0xC9, 0xBF, 0xC9, 0x55, 0x55, 0x55, 0x55, 0xC9, 0xC2, 0xAB, 0xC1,
- 0xC1, 0xC1, 0xCE, 0xF3, 0xF3, 0xF3, 0xF3, 0xD0, 0xD0, 0xCB, 0xC9, 0xC9, 0xBF, 0xC9, 0xCB, 0xCB,
- 0xC9, 0xC6, 0x9B, 0x9B, 0x9F, 0x9D, 0x9A, 0x97, 0xAF, 0xAF, 0xDE, 0x6B, 0x54, 0xD0, 0xF3, 0xFA,
- 0xFA, 0xF3, 0xD0, 0xD0, 0xF1, 0x34, 0x46, 0x5D, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5A, 0x12,
- 0x31, 0xD5, 0x71, 0x0, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0,
- 0xBD, 0xB4, 0xA3, 0xE, 0x2C, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x7, 0x2C, 0x2C, 0xA3, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0xA3,
- 0x3A, 0x31, 0x23, 0x4, 0x5, 0x0, 0xB, 0x37, 0x29, 0x20, 0x4, 0x1E, 0xFA, 0xFA, 0xF3, 0xFA,
- 0xC6, 0x41, 0xE, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xA, 0x1D, 0x50, 0x5C, 0x5C, 0x5C,
- 0x5C, 0x5D, 0x5A, 0x34, 0x50, 0x5D, 0x3, 0x0, 0x51, 0x5C, 0x53, 0x47, 0x5B, 0x53, 0x5A, 0x55,
- 0x55, 0x5C, 0xCE, 0xF3, 0xF3, 0xCC, 0xBF, 0xC9, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xC2, 0x53, 0xC9,
- 0xCE, 0xCC, 0xCC, 0xD0, 0xF3, 0xF3, 0xF3, 0xF3, 0xD0, 0xD0, 0xCE, 0xC9, 0xBF, 0xBF, 0xBF, 0xC9,
- 0xC9, 0xC6, 0x9B, 0x9B, 0x9D, 0x9D, 0x9A, 0x6E, 0x97, 0xA9, 0xD5, 0x39, 0x54, 0xD0, 0xFA, 0xFA,
- 0xFA, 0xF3, 0xD0, 0xD0, 0xCD, 0xC1, 0xC2, 0x5D, 0x5B, 0x5B, 0x58, 0x57, 0x58, 0x5A, 0x5A, 0x8,
- 0xC, 0x25, 0x1F, 0x5, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x9, 0x9,
- 0xE, 0xE, 0x9, 0x9, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x7, 0x9, 0xE, 0x9, 0x9, 0x7, 0x2C,
- 0x31, 0xE, 0xE, 0x2C, 0x2C, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x31, 0x2C, 0xE, 0xE, 0x2C,
- 0xE, 0xE, 0x7, 0x2C, 0x38, 0xA3, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x41, 0xB6, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA5,
- 0x3A, 0x33, 0xE, 0x4, 0x5, 0x0, 0x5, 0x30, 0x30, 0x20, 0x4, 0x4, 0xCF, 0xA6, 0x33, 0x0,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xA, 0x36, 0x54, 0xAD, 0x5C,
- 0xCA, 0x5D, 0x5C, 0x1, 0x1B, 0x5D, 0x12, 0x0, 0x52, 0x5C, 0xC9, 0x51, 0x5A, 0xA, 0x53, 0x55,
- 0x55, 0x5C, 0xD0, 0xF3, 0xD0, 0xD0, 0x5C, 0xBF, 0xC9, 0xC9, 0xC9, 0xBF, 0xBF, 0xC9, 0x4F, 0xBF,
- 0xD0, 0xCC, 0xCC, 0xCC, 0xD0, 0xF3, 0xF3, 0xD0, 0xF3, 0xF3, 0xCE, 0xC9, 0xCA, 0xC9, 0xBF, 0xBF,
- 0xBF, 0xCD, 0x96, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x77, 0x77, 0x9A, 0x71, 0x55, 0xD0, 0xFA, 0xFA,
- 0xFA, 0xF3, 0xCA, 0xCE, 0x5D, 0x5B, 0x5B, 0x58, 0x5B, 0x58, 0x5B, 0x58, 0x58, 0x5A, 0x5A, 0x23,
- 0x5, 0x1F, 0x4, 0xD, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41,
- 0xBB, 0xF7, 0xFD, 0xFD, 0xF9, 0xA8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x7, 0x7, 0x0,
- 0x7, 0x1, 0x0, 0x0, 0x38, 0x3A, 0x3A, 0x3A, 0x7, 0x0, 0x7, 0x7, 0x7, 0x7, 0x1, 0x7,
- 0x3A, 0xE, 0x3A, 0x41, 0x33, 0xE, 0x2C, 0x31, 0x2C, 0xE, 0x2C, 0x2C, 0x41, 0xAA, 0x41, 0x31,
- 0x2C, 0x2C, 0x2C, 0x2C, 0xAA, 0x31, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xB7, 0xB4, 0x38, 0x2C, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xA8,
- 0x3A, 0x33, 0xE, 0x0, 0x4, 0x4, 0xB, 0x37, 0x30, 0x20, 0x4, 0x1E, 0x0, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1, 0xA, 0x3A, 0xB4, 0xEC, 0xD0, 0xCB, 0xCB, 0xD0, 0xCF, 0x5C,
- 0xCA, 0x5A, 0x1A, 0x3, 0x1A, 0x5D, 0x1D, 0x0, 0x4F, 0x5D, 0xCA, 0x5A, 0x56, 0x1, 0xF, 0x46,
- 0x55, 0x5C, 0xD0, 0xF3, 0xF3, 0xF3, 0xC9, 0xBF, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCD, 0x46, 0xA,
- 0xA, 0x1C, 0xAD, 0x5C, 0xCB, 0xCE, 0xD0, 0xD0, 0xD0, 0xD0, 0xCD, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
- 0xBF, 0xC9, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xD0, 0xD0, 0xFA, 0xFA,
- 0xFA, 0xEC, 0x4F, 0x4F, 0x46, 0x46, 0x47, 0x59, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x5A, 0x5A, 0xC,
- 0x32, 0xB2, 0x29, 0x20, 0x6, 0xE2, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB,
- 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x2C, 0x1,
- 0x7, 0x7, 0x7, 0x0, 0x7, 0x2C, 0xE, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x0,
- 0x7, 0x7, 0x3F, 0x33, 0x0, 0x7, 0xE, 0xE, 0x2C, 0x2C, 0x2C, 0x3F, 0x94, 0x38, 0x3C, 0xA3,
- 0x94, 0x31, 0xE, 0x94, 0x33, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD,
- 0xA3, 0xFD, 0xFD, 0xF9, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA8,
- 0x3B, 0x33, 0xD, 0x0, 0x4, 0x4, 0xB, 0x30, 0x30, 0x20, 0x4, 0x1E, 0xFE, 0xFE, 0xFE, 0x0,
- 0x7, 0x2D, 0x94, 0xB6, 0xF0, 0xF8, 0xFA, 0xCF, 0xF3, 0xFA, 0xFA, 0xF3, 0xC9, 0xCB, 0xCF, 0x5C,
- 0xCA, 0x5C, 0x52, 0x52, 0x4F, 0x5D, 0x46, 0x0, 0x46, 0xCA, 0x5C, 0x5C, 0x51, 0x56, 0x10, 0x1,
- 0x1B, 0xBF, 0xD0, 0xD0, 0xD0, 0xD0, 0xC9, 0xC9, 0xAD, 0xC9, 0xC9, 0xC4, 0xC9, 0xCE, 0x55, 0xBE,
- 0xC1, 0x48, 0x3A, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x8, 0x1A, 0x55, 0x5C, 0xC9, 0xCB, 0xC9, 0xCB, 0xCE, 0xC9, 0xCC, 0xCA, 0xD0, 0xFA, 0xFA,
- 0xFA, 0xF1, 0xBF, 0xBE, 0xBF, 0xC2, 0xC0, 0xC0, 0x5B, 0x58, 0x58, 0x57, 0x58, 0x57, 0x5A, 0xC,
- 0xB, 0x9B, 0x37, 0xB, 0x25, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x2C, 0x1,
- 0x7, 0x7, 0x1, 0x7, 0x7, 0x7, 0x1, 0x1, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x1,
- 0x7, 0x7, 0x1, 0x1, 0x7, 0x7, 0x7, 0x7, 0xE, 0xE, 0x38, 0xB4, 0x3A, 0xA3, 0xE, 0x31,
- 0x3C, 0xA3, 0xAA, 0x41, 0x7, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x31, 0xBD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBB, 0xA3,
- 0x3A, 0x32, 0xB, 0x0, 0x6, 0x0, 0x0, 0x5, 0x30, 0x25, 0x4, 0x1E, 0x1, 0x33, 0xA4, 0xE9,
- 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFA, 0xFA, 0xF3, 0xF3, 0xD0, 0xF3, 0xFA, 0xF3, 0xF3, 0xF3, 0x5C,
- 0xCA, 0xCA, 0xCA, 0x4F, 0x1C, 0x5D, 0x50, 0x0, 0x36, 0xF3, 0xCC, 0xCA, 0xC9, 0x59, 0x57, 0x43,
- 0x3, 0x3, 0x46, 0x5C, 0x5C, 0xBF, 0x5C, 0x5C, 0x5C, 0xC9, 0xC9, 0xCD, 0xBF, 0xCE, 0xBF, 0x3B,
- 0x2E, 0x7, 0x1, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, 0x5C, 0xCA, 0x5C, 0xCA, 0xCA, 0xD0, 0xFA, 0xFA,
- 0xF3, 0xC0, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x5B, 0x58, 0x58, 0x57, 0x5A, 0xC,
- 0x20, 0x9B, 0x6B, 0x25, 0x29, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF5, 0xBD, 0x2C,
- 0xE, 0x31, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xE, 0xE, 0x0,
- 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0xE, 0xE, 0xE, 0xE, 0xE, 0x7,
- 0x0, 0x7, 0x7, 0x7, 0x1, 0x7, 0x7, 0x7, 0x7, 0x7, 0x3C, 0x3F, 0xA5, 0x3A, 0xA3, 0xA3,
- 0x33, 0x3C, 0x38, 0x2C, 0x2C, 0x0, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xBB, 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0xA3,
- 0x38, 0x31, 0xB, 0x4, 0x4, 0x0, 0xFE, 0x5, 0x30, 0x25, 0x1E, 0x1E, 0xFA, 0xFA, 0xFA, 0xFD,
- 0xFA, 0xFD, 0xFA, 0xFA, 0xFA, 0xFD, 0xFA, 0xFA, 0xF3, 0xF3, 0xD0, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCC, 0xCA, 0x46, 0x3, 0x3, 0x5D, 0x5B, 0xA, 0x1C, 0xF3, 0xF3, 0xD0, 0xCC, 0xCA, 0x55, 0x51,
- 0x56, 0x10, 0xF, 0x1C, 0x5C, 0xBF, 0x5C, 0x5C, 0x5C, 0xC9, 0xCD, 0xAC, 0xBF, 0xCE, 0x5A, 0x3,
- 0x7, 0x1, 0x7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x3, 0xBF, 0xC9, 0xCA, 0xCC, 0xD0, 0xF3, 0xCA,
- 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5A, 0x5A, 0xB,
- 0x25, 0x9B, 0x37, 0x5, 0x1F, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xE, 0xE9,
- 0xFD, 0xF0, 0x3C, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xEA, 0xEA, 0xEA, 0xEA, 0xE, 0x7, 0x7,
- 0x7, 0x7, 0x7, 0xE, 0xE, 0xE, 0xE, 0x9, 0xE, 0x7, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE,
- 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0xE, 0xE, 0x2C, 0x2C, 0xE,
- 0x2C, 0x31, 0x7, 0x2C, 0x2C, 0x2C, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0x94,
- 0x3A, 0x32, 0xB, 0x0, 0x4, 0x4, 0xB, 0x38, 0x25, 0x25, 0x4, 0x1E, 0xD0, 0xF3, 0xFA, 0xFA,
- 0xFA, 0xFA, 0xFA, 0xF7, 0xC6, 0xA5, 0x52, 0x4F, 0x53, 0x55, 0xC9, 0xCE, 0xC9, 0xC4, 0xAD, 0xAD,
- 0xAD, 0xCB, 0x55, 0x4F, 0x36, 0x5A, 0x5D, 0x5A, 0x1C, 0xF3, 0xF3, 0xF3, 0xF3, 0xD0, 0xC9, 0xAD,
- 0x55, 0x5B, 0x1D, 0x3, 0x50, 0x5C, 0x5C, 0x5C, 0xC9, 0x5C, 0xCB, 0xE3, 0xC4, 0xCE, 0x5C, 0x43,
- 0xBF, 0xBF, 0xBF, 0xBF, 0xC9, 0xC9, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x58, 0x58, 0x58, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x58, 0x58, 0x58, 0x5A, 0x5A, 0x7,
- 0x20, 0x9D, 0x37, 0x20, 0x20, 0x27, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xB4, 0x3A, 0xF7,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xE9,
- 0xF5, 0xF9, 0x7, 0x2C, 0x2C, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB8, 0x94,
- 0x33, 0x2E, 0xB, 0x0, 0x5, 0x4, 0x25, 0x6E, 0x37, 0x1F, 0x4, 0x1E, 0xCD, 0xD0, 0xD0, 0xCD,
- 0xAD, 0x3D, 0x2D, 0x3, 0x1, 0x1, 0x1, 0x3, 0x3, 0xA, 0x47, 0xC1, 0x49, 0x1A, 0x1A, 0x35,
- 0x36, 0xC9, 0x5C, 0x5A, 0x52, 0x55, 0x5C, 0xCA, 0x5C, 0xCC, 0xD0, 0xD0, 0xD0, 0xF3, 0xC9, 0xC9,
- 0x5C, 0x5A, 0x5B, 0x59, 0x51, 0x5C, 0x5C, 0x5C, 0x5C, 0xC9, 0xC9, 0xC4, 0x5C, 0xCE, 0x5D, 0x46,
- 0xCA, 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCC, 0xCC, 0xCA, 0xCA, 0xCC, 0xCC, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x58, 0x5A, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x7,
- 0xD, 0x9B, 0x37, 0xD, 0x22, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0x3A, 0xE, 0x31,
- 0xBD, 0xF0, 0xAA, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xEA,
- 0xF7, 0xFD, 0x7, 0x2C, 0x2C, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xBB, 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB7, 0x94,
- 0x38, 0x32, 0xE, 0x0, 0x5, 0x0, 0xB, 0x37, 0x29, 0x1F, 0x1E, 0x1E, 0x52, 0x2F, 0xA, 0x1,
- 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0xA, 0x2E, 0xA, 0x34, 0xBF, 0xBF, 0x36, 0x1A, 0x1C,
- 0x36, 0xC9, 0x5C, 0x5A, 0x52, 0x4C, 0x3D, 0x4E, 0x52, 0xC9, 0xCA, 0xCB, 0xCB, 0xCA, 0xC9, 0x5C,
- 0x5C, 0x5C, 0x1A, 0x5A, 0x5A, 0x5C, 0x5C, 0x5C, 0x5C, 0xC9, 0xCB, 0xE3, 0xC3, 0xCE, 0xC0, 0x1D,
- 0x55, 0xC4, 0xBF, 0xBF, 0xC9, 0xCA, 0xCC, 0xCA, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x58, 0x58, 0x58, 0x5A, 0xE,
- 0x20, 0x9B, 0x37, 0x20, 0x22, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xE9,
- 0xA3, 0x33, 0xE, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xE9,
- 0xF5, 0xF9, 0x0, 0xE, 0x2C, 0x2C, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3,
- 0x3A, 0x31, 0xE, 0x0, 0x4, 0x0, 0x6, 0x37, 0x20, 0x1F, 0x1E, 0x4, 0x7, 0x0, 0x0, 0x0,
- 0x7, 0x0, 0x1, 0x0, 0x0, 0x9, 0xE, 0xA, 0x16, 0xA, 0x1A, 0x49, 0xEC, 0x47, 0x1A, 0x1C,
- 0x4C, 0x5C, 0x5C, 0x5C, 0x53, 0x4C, 0x3D, 0x36, 0x52, 0x55, 0xC9, 0xCD, 0xCB, 0xC9, 0x54, 0xAD,
- 0x55, 0x5C, 0x1C, 0x46, 0x5C, 0x5C, 0xC9, 0xC9, 0xC9, 0xCB, 0xCB, 0xC9, 0xC9, 0xCE, 0x5C, 0x7,
- 0x1, 0x1, 0x2C, 0x4C, 0xCD, 0xC9, 0xC4, 0x55, 0xAD, 0x5C, 0x5C, 0x5C, 0x5C, 0x55, 0x5A, 0x5A,
- 0x5A, 0x57, 0x51, 0x51, 0x51, 0x57, 0x5A, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x58, 0x5A, 0x5A, 0x58, 0x5A, 0x5A, 0x7,
- 0x20, 0x9B, 0x25, 0xD, 0x22, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF8, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF0, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
- 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA,
- 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xE9, 0xE9, 0xBD, 0xBD, 0xBD,
- 0xEA, 0xF7, 0x0, 0x7, 0x9, 0xE, 0x7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31,
- 0xA3, 0xBD, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA,
- 0x3B, 0x33, 0x2C, 0x4, 0x6, 0x4, 0x25, 0x6E, 0x25, 0x1F, 0x4, 0x1E, 0x8, 0x1, 0x1, 0x1,
- 0x3, 0x3, 0x1, 0x1, 0x0, 0x3, 0x3, 0x3, 0x3, 0x3, 0xA, 0x1B, 0xBE, 0xCD, 0x46, 0x1A,
- 0x36, 0x5C, 0x5C, 0x5C, 0x55, 0x52, 0x36, 0x1B, 0x1A, 0x1B, 0x12, 0x2C, 0x9, 0x0, 0xFE, 0xFE,
- 0xFE, 0x53, 0x46, 0x1D, 0x5D, 0x5A, 0x5A, 0x5C, 0xCD, 0xCE, 0xD0, 0xCD, 0x5C, 0xCD, 0x5C, 0x1B,
- 0x1A, 0x12, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
- 0x3, 0xF, 0x3, 0x3, 0x3, 0x3, 0x12, 0x50, 0x5A, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x20, 0x79, 0x20, 0xD, 0x22, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x41,
- 0xB6, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
- 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
- 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF7, 0xF0, 0xE9, 0xBD, 0xBD,
- 0xE9, 0xF5, 0x0, 0x1, 0x1, 0x7, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xB6, 0x41, 0x2C, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3B, 0x33, 0x2C, 0x4, 0x4, 0x0, 0x25, 0x71, 0x29, 0x1F, 0x1E, 0x1E, 0x2D, 0x1A, 0xA, 0xA,
- 0xA, 0xA, 0xA, 0xA, 0x1, 0x1, 0x3, 0x3, 0x3, 0x1A, 0x1C, 0x1A, 0x46, 0xC1, 0xEC, 0x49,
- 0x12, 0x12, 0x1C, 0x1D, 0x36, 0x3D, 0x1, 0x1, 0x1, 0x1, 0xFE, 0x0, 0x0, 0x0, 0xFE, 0xFE,
- 0x0, 0x1C, 0xBF, 0x1A, 0xCA, 0x5A, 0xCA, 0xCA, 0xD0, 0xD0, 0xF3, 0xD0, 0xD0, 0xD0, 0x5C, 0x49,
- 0x4A, 0x49, 0x49, 0x44, 0x1B, 0x2D, 0x1B, 0x1B, 0x1B, 0x1B, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
- 0x34, 0x34, 0x1B, 0x34, 0x34, 0x34, 0x2D, 0x8, 0x1, 0x12, 0x1B, 0x1D, 0x46, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5A, 0xB,
- 0x20, 0x9B, 0x25, 0x20, 0x29, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xB7,
- 0xB4, 0x38, 0x2C, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA,
- 0x3B, 0x33, 0x2C, 0x0, 0x4, 0xFE, 0x30, 0x6E, 0x28, 0x1F, 0x1E, 0x4, 0x12, 0xE, 0x3, 0x3,
- 0x3, 0x3, 0x3, 0x1, 0x0, 0x0, 0x3, 0x1A, 0x36, 0x1C, 0x1C, 0x1A, 0x1A, 0x36, 0xBF, 0xF1,
- 0xC2, 0xAB, 0x46, 0x1B, 0x12, 0x12, 0x8, 0x8, 0x8, 0x0, 0x43, 0x43, 0x43, 0x43, 0x1B, 0x10,
- 0x0, 0x1, 0x5C, 0x5C, 0x5A, 0x51, 0x5C, 0x5C, 0xCA, 0xD0, 0xF3, 0xD0, 0xD0, 0xF3, 0x5C, 0xAB,
- 0xBE, 0xBE, 0xAB, 0x49, 0x4A, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49,
- 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4A, 0x49, 0x49, 0x49, 0x49, 0x49, 0xAB, 0x5A, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5A, 0xB,
- 0xC, 0x9B, 0x30, 0x20, 0x29, 0x28, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xA3,
- 0xFD, 0xFD, 0xF9, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0x2C, 0xE, 0x33, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xAA,
- 0x3C, 0x33, 0xE, 0x0, 0x4, 0x0, 0x39, 0x97, 0x28, 0x1F, 0x1E, 0x1E, 0x12, 0x8, 0x8, 0x3,
- 0x3, 0xA, 0x1A, 0xA, 0x1, 0x0, 0x3, 0xA, 0x1A, 0x1C, 0x1C, 0x1C, 0x1A, 0x1A, 0x1C, 0x52,
- 0xAD, 0xEC, 0xF1, 0xEC, 0xCE, 0xC1, 0xC1, 0xC1, 0xC1, 0xAB, 0x5A, 0x5C, 0x5C, 0x5C, 0x5C, 0x5A,
- 0x50, 0x10, 0x36, 0xCA, 0x5A, 0x46, 0x18, 0x50, 0x5C, 0xCC, 0xD0, 0xF3, 0xD0, 0xF3, 0xC9, 0xBF,
- 0xBF, 0xCD, 0xBF, 0xCD, 0xC1, 0xC2, 0xC2, 0xC2, 0xC1, 0xC1, 0xC2, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
- 0xBE, 0xBE, 0xC1, 0xC1, 0xC1, 0xC1, 0xF1, 0xCE, 0xCE, 0xC2, 0xC2, 0xCE, 0xC0, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xD,
- 0x5, 0x71, 0x32, 0xC, 0x29, 0x1F, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x31,
- 0xBD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD,
- 0xD8, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0xE9, 0xFD, 0xF0, 0x3A, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA5,
- 0x3C, 0x32, 0xB, 0x0, 0x5, 0x0, 0x39, 0x6F, 0x22, 0x21, 0x1E, 0x1E, 0x8, 0x7, 0x3, 0x9,
- 0x3, 0xA, 0x3, 0x3, 0xA, 0xA, 0x3, 0xA, 0x18, 0x1B, 0x1A, 0x1C, 0x36, 0x36, 0x36, 0x36,
- 0x36, 0x4F, 0x5A, 0x56, 0x51, 0x36, 0x1D, 0x1B, 0x1B, 0x34, 0x51, 0x5C, 0xCA, 0xCA, 0x5C, 0xCA,
- 0xCA, 0x5D, 0x1B, 0x5C, 0x5A, 0x5A, 0x42, 0x10, 0x51, 0xC9, 0xCC, 0xF3, 0xF3, 0xF3, 0xCA, 0xBF,
- 0xC2, 0xCE, 0xEC, 0xF7, 0xF1, 0xF1, 0xF1, 0xEC, 0xCE, 0xCE, 0xEC, 0xEC, 0xCD, 0xCD, 0xCD, 0xC2,
- 0xC1, 0xC1, 0xC1, 0xC2, 0xC1, 0xEC, 0xCE, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xD,
- 0x5, 0x97, 0x37, 0xD, 0x37, 0x1F, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB,
- 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31,
- 0xE, 0xE, 0xE, 0x9, 0xE, 0xE, 0xE, 0x2C, 0x2C, 0x2C, 0xE, 0xE, 0x2C, 0xE, 0xE, 0xE,
- 0xE, 0xE, 0xE, 0x2C, 0x31, 0x2C, 0x2C, 0xE, 0x31, 0x31, 0x2C, 0xE, 0x2C, 0x7, 0x7, 0x7,
- 0x7, 0x9, 0x0, 0x7, 0x7, 0x0, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9,
- 0xB6, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x94,
- 0x38, 0x25, 0x1F, 0x4, 0x4, 0x0, 0x39, 0xA7, 0x28, 0x1F, 0x1E, 0x1E, 0x8, 0x7, 0xA, 0x2C,
- 0x1A, 0x12, 0xA, 0x1A, 0x12, 0xA, 0xA, 0x1A, 0x1A, 0x18, 0x1B, 0x1A, 0x1C, 0x1A, 0x1C, 0x1C,
- 0x34, 0x4C, 0x5C, 0x51, 0x50, 0xF, 0x10, 0x11, 0x11, 0xF, 0x1B, 0x46, 0x1A, 0x36, 0x50, 0x5C,
- 0xCA, 0xCA, 0x5C, 0x50, 0xCA, 0x5C, 0x5C, 0x50, 0x43, 0xA, 0x52, 0xD0, 0xF3, 0xF3, 0xCE, 0xF1,
- 0xF1, 0xF1, 0xCE, 0xCE, 0xD0, 0xD0, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xD,
- 0x4, 0xA7, 0x39, 0x20, 0x65, 0x1E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x7, 0x3F,
- 0x2C, 0x2C, 0x7, 0x0, 0x7, 0xE, 0xE, 0x31, 0x38, 0x33, 0xE, 0x41, 0x38, 0x3F, 0xA5, 0x2C,
- 0x31, 0xA3, 0xB4, 0x41, 0x2C, 0xE, 0xE, 0x3C, 0xA8, 0xE, 0xA3, 0xA3, 0x3A, 0x7, 0x7, 0x0,
- 0x0, 0x7, 0x7, 0x7, 0x9, 0x7, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C,
- 0x31, 0xE9, 0xF7, 0xB6, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xB4, 0x41,
- 0x33, 0x25, 0x1F, 0x4, 0x6, 0x0, 0x39, 0x9B, 0x28, 0x1F, 0x1E, 0x1E, 0x8, 0x8, 0xA, 0x12,
- 0x1A, 0x1A, 0xA, 0xA, 0x12, 0x12, 0x10, 0xF, 0x1, 0x1, 0x1, 0xF, 0xF, 0xF, 0xF, 0xF,
- 0xF, 0x11, 0x11, 0x10, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x43, 0x1B, 0x1, 0x0, 0x0, 0x0,
- 0x3, 0x53, 0x5A, 0x50, 0xCA, 0xCA, 0xCA, 0x5C, 0x5D, 0xC0, 0xCA, 0xCC, 0xF3, 0xFA, 0xD0, 0xCE,
- 0xCE, 0xCE, 0xD0, 0xD0, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0xFE, 0xAE, 0x3E, 0x20, 0x6B, 0x1E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x3A,
- 0xA3, 0xB6, 0xE9, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x7, 0x2C, 0x3C,
- 0xA3, 0x2C, 0x7, 0x1, 0x7, 0xE, 0xE, 0xE, 0xE, 0x2C, 0x3C, 0x3C, 0xE, 0xB4, 0xB6, 0x3A,
- 0x38, 0xA8, 0x38, 0x2C, 0x2C, 0xE, 0xE, 0x7, 0x38, 0x33, 0x0, 0x7, 0xE, 0x7, 0x7, 0x7,
- 0x7, 0x1, 0x0, 0x0, 0x7, 0x7, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xBB, 0x41, 0x2C, 0xE, 0xA3, 0xD8, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA8, 0x3A,
- 0x31, 0x30, 0x1F, 0x4, 0x6, 0x0, 0x3E, 0xAF, 0x28, 0x1F, 0x4, 0x1E, 0xF, 0x1, 0x1, 0x1,
- 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x3, 0x1, 0x1, 0x1, 0x1, 0xFE, 0xFE, 0xFE, 0xFE,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x46, 0x1A, 0x1, 0x0, 0x1, 0x0,
- 0x0, 0x1A, 0x5A, 0x1B, 0x53, 0xCA, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xD0, 0xF3, 0xCE, 0xC9,
- 0xC9, 0xC9, 0xCD, 0xC9, 0xAD, 0x43, 0x43, 0x43, 0x5C, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0xFE, 0xBC, 0xA9, 0x20, 0x71, 0x1E, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xE9,
- 0xB6, 0x3C, 0xE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0x33, 0x2C,
- 0x41, 0xA8, 0x33, 0x7, 0x7, 0x7, 0x7, 0xE, 0x38, 0x41, 0x31, 0xE, 0x31, 0x33, 0x38, 0x3A,
- 0x33, 0x38, 0x31, 0x31, 0x33, 0x33, 0x2C, 0xE, 0xE, 0xA8, 0x0, 0x7, 0x7, 0x1, 0x7, 0xE,
- 0xE, 0x7, 0x7, 0x0, 0x0, 0x1, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3, 0x3A,
- 0x31, 0x30, 0x6, 0x4, 0x4, 0x0, 0x6C, 0x9B, 0x22, 0x1F, 0x4, 0x1E, 0x1, 0x1, 0x1, 0x1,
- 0xF, 0xF, 0xF, 0x1, 0x0, 0xFE, 0x3, 0x4F, 0x53, 0x59, 0x53, 0x53, 0x12, 0x0, 0xFE, 0xFE,
- 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x46, 0xA, 0x0, 0x1, 0x1D, 0x0,
- 0x0, 0x1, 0x55, 0x1D, 0xA, 0x2F, 0x2F, 0x34, 0x53, 0x55, 0x52, 0x3D, 0x36, 0x36, 0x2F, 0x12,
- 0x1A, 0x1A, 0x1B, 0x13, 0x12, 0x46, 0x4F, 0x4F, 0x4F, 0x55, 0xC0, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0xD,
- 0xFE, 0xE0, 0xBA, 0x20, 0x9B, 0x1F, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xBD, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF8, 0xF8, 0xF8, 0xE, 0x2C, 0x2C,
- 0x2C, 0x38, 0xA3, 0xB6, 0xA3, 0x33, 0x3C, 0x41, 0x3A, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x38, 0xAA,
- 0x38, 0x33, 0x31, 0x38, 0x38, 0x33, 0x33, 0xE, 0xE, 0xAA, 0x9, 0x9, 0x7, 0x1, 0x1, 0x7,
- 0x9, 0xE, 0xE, 0x7, 0x1, 0x1, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA8, 0x3A,
- 0x33, 0x2C, 0x6, 0x4, 0x4, 0x0, 0x6B, 0x9B, 0x29, 0x1F, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1,
- 0x1, 0xF, 0x1, 0x1, 0xFE, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0xF, 0xF, 0xF, 0xF,
- 0xF, 0xF, 0x1, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x46, 0x3, 0x0, 0x1, 0x4C, 0x4B,
- 0x0, 0x0, 0xA, 0xA, 0x3, 0x46, 0x52, 0x52, 0x47, 0x47, 0x50, 0x5C, 0x5A, 0x5A, 0x5A, 0x5C,
- 0x5C, 0x5C, 0x5C, 0x5C, 0x53, 0x5C, 0xCA, 0xCA, 0xBF, 0x53, 0x55, 0xCA, 0xCC, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x6,
- 0x0, 0xED, 0xD7, 0x1F, 0x9B, 0x1F, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xEE, 0xEA, 0xEA, 0x7, 0x31, 0x2C,
- 0x2C, 0xE, 0x2C, 0x31, 0x33, 0x33, 0x2C, 0xE, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x31, 0xB6,
- 0x31, 0x2C, 0x33, 0x38, 0x38, 0x33, 0x31, 0x2C, 0x31, 0xB6, 0x33, 0x2C, 0xE, 0x7, 0x7, 0x7,
- 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xAA, 0x3F,
- 0x2F, 0x2C, 0x6, 0x4, 0x4, 0x4, 0x37, 0x9B, 0x29, 0x1E, 0x4, 0x4, 0x0, 0x0, 0x2A, 0x6,
- 0x0, 0x0, 0x0, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1,
- 0x1, 0x1, 0x1, 0xFE, 0x0, 0x0, 0x0, 0x0, 0xFE, 0x8, 0x43, 0x1, 0x0, 0x1, 0x36, 0x27,
- 0x0, 0x0, 0x0, 0x8, 0x4F, 0x4F, 0x4F, 0x4F, 0x47, 0x47, 0x55, 0xC9, 0xCB, 0xCA, 0xCB, 0xD0,
- 0xCE, 0xCE, 0xCB, 0xCB, 0xC9, 0x5C, 0xCA, 0xCA, 0xCE, 0xCC, 0xD0, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x6,
- 0x0, 0xD8, 0xBA, 0x1F, 0x71, 0x1F, 0xEF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x31,
- 0xE, 0x31, 0xB6, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xE9, 0xBD, 0xBD, 0xBD, 0x7, 0x2C, 0x2C,
- 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x33, 0xB4,
- 0x33, 0x2C, 0x33, 0x38, 0x3A, 0x33, 0x2C, 0x33, 0x38, 0x94, 0x3A, 0x2C, 0x2C, 0x2C, 0xE, 0x9,
- 0x7, 0x7, 0x7, 0x7, 0x7, 0xE, 0x1, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xAA, 0x3F,
- 0x2F, 0x2C, 0x4, 0x4, 0x6, 0x4, 0x20, 0xB2, 0x37, 0x4, 0x4, 0x1E, 0x0, 0x25, 0x4B, 0x0,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x46, 0x0, 0xFE, 0x0, 0x3, 0x42,
- 0x1, 0x0, 0x0, 0x1, 0x4F, 0x53, 0x53, 0x53, 0x47, 0x46, 0x50, 0xC9, 0xCE, 0xCE, 0xCE, 0xCC,
- 0xCE, 0xD0, 0xD0, 0xCC, 0xCE, 0xCC, 0xD0, 0xD0, 0xD0, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x6,
- 0xFE, 0xD8, 0xB0, 0x20, 0x71, 0x1F, 0xF6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xBD,
- 0xFD, 0xE, 0xA3, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0x7, 0x2C, 0x2C,
- 0x2C, 0x2C, 0x2C, 0x31, 0x2C, 0x2C, 0x2C, 0x2C, 0xE, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x3A,
- 0xAA, 0xA3, 0x33, 0x33, 0x31, 0x2C, 0x31, 0x33, 0x38, 0x38, 0x3A, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C,
- 0xE, 0x9, 0x7, 0x1, 0x7, 0x7, 0x0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4, 0x3F,
- 0x34, 0x2C, 0x4, 0x4, 0x6, 0x4, 0x1F, 0xD5, 0x6B, 0x4, 0x1E, 0x1E, 0xFE, 0x0, 0x0, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0xFE, 0x0, 0x0, 0xFE, 0x12, 0x36, 0x0, 0xFE, 0xFE, 0xFE, 0x1,
- 0x1B, 0x3, 0x0, 0x1, 0x1B, 0x50, 0x56, 0x51, 0x46, 0x43, 0x50, 0xC0, 0xCE, 0xD0, 0xD0, 0xD0,
- 0xD0, 0xD0, 0xD0, 0xD0, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x5D,
- 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D, 0x6,
- 0x20, 0xFB, 0xBA, 0x25, 0x6B, 0x4, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF8,
- 0xFD, 0xE, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0x0, 0xE, 0x2C,
- 0x2C, 0x33, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C,
- 0xE, 0x33, 0xA8, 0xA3, 0x33, 0xE, 0x41, 0xB4, 0x3A, 0x3A, 0x31, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C,
- 0x2C, 0x2C, 0x2C, 0x7, 0x7, 0x0, 0x41, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xAA, 0x3F,
- 0x38, 0x30, 0x4, 0x4, 0x4, 0x4, 0x4, 0xD5, 0x71, 0x1E, 0x1E, 0x1E, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x2B, 0x16, 0x24, 0x6, 0x16, 0x9, 0x16, 0x7, 0x24, 0x7, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x36, 0x0, 0xFE, 0xFE, 0xFE, 0xFE,
- 0x0, 0x1A, 0x0, 0x0, 0x3, 0x5A, 0x5C, 0x5C, 0x46, 0x43, 0x3, 0x18, 0x1D, 0x46, 0x4C, 0x54,
- 0xBF, 0xBF, 0xC9, 0xC9, 0xCC, 0xCC, 0xCC, 0x5C, 0x53, 0x53, 0x59, 0x59, 0x50, 0x50, 0x50, 0x50,
- 0x50, 0x50, 0x50, 0x50, 0x50, 0x56, 0x56, 0x50, 0x51, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B,
- 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x1F,
- 0xB, 0xAF, 0x39, 0xB, 0x37, 0x97, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A,
- 0xFD, 0xE, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xBB, 0x0, 0x7,
- 0x7, 0x2C, 0x7, 0xE, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0xE, 0xE, 0x2C, 0x2C,
- 0xE, 0x7, 0x7, 0x7, 0x2C, 0x2C, 0x2C, 0xE, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7,
- 0x7, 0x7, 0x7, 0x7, 0x0, 0x94, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8, 0x3C,
- 0x33, 0xE, 0x4, 0x6, 0x4, 0x4, 0x0, 0x9B, 0xB2, 0x4, 0x4, 0x1E, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x98, 0x7, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0xFE, 0x1A, 0x36, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0x0, 0x1A, 0x0, 0x0, 0x1, 0x1D, 0x59, 0x59, 0x43, 0x43, 0x8, 0x3, 0x3, 0xF, 0x10, 0x10,
- 0x2F, 0xCD, 0xCE, 0xCE, 0xCE, 0xCD, 0xCE, 0x12, 0x3, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
- 0x18, 0x12, 0x12, 0x12, 0x12, 0x1A, 0x12, 0x12, 0x12, 0x50, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5D, 0x1F,
- 0xFE, 0x0, 0x4, 0xB, 0x4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6,
- 0xFD, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xBD, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBD,
- 0xD8, 0xF0, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3, 0x3A,
- 0x31, 0xB, 0x0, 0x6, 0x4, 0x4, 0x4, 0x6C, 0x9B, 0x1E, 0x4, 0x1E, 0x0, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x2, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x1D, 0x0, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0x12, 0x0, 0x0, 0x0, 0x1, 0x53, 0x5A, 0x42, 0x4F, 0x46, 0x36, 0x36, 0x36, 0x34, 0x1A,
- 0x12, 0x1A, 0x34, 0x34, 0x36, 0x46, 0x34, 0x12, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x3D, 0x3D,
- 0x3D, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x36, 0x46, 0x4F, 0x50, 0x57, 0x5A, 0x5B, 0x5B,
- 0x5D, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x6,
- 0xB, 0x29, 0x32, 0x4, 0x20, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8, 0xBD, 0xBD, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBD, 0xBD,
- 0xE9, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB8, 0x94, 0x3A,
- 0x31, 0xB, 0x4, 0x6, 0x4, 0x4, 0x0, 0x5, 0x20, 0x1F, 0x1E, 0x4, 0x0, 0x0, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xFE, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x36, 0x0, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0x12, 0xFE, 0x0, 0x0, 0x0, 0x12, 0x5A, 0x43, 0x50, 0x59, 0x55, 0x55, 0x59, 0x53, 0x53,
- 0x53, 0x34, 0x34, 0x34, 0x34, 0x34, 0x12, 0x1A, 0x4F, 0x52, 0x52, 0x52, 0x52, 0x55, 0x52, 0x52,
- 0x52, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5C, 0x36, 0x1B, 0x1B, 0x1B, 0x1A, 0x59,
- 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xC,
- 0x0, 0x9B, 0x6E, 0xFE, 0xEF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,
- 0xEA, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x41, 0x38,
- 0x30, 0xD, 0x6, 0x4, 0x4, 0x5, 0xFE, 0x0, 0x1F, 0x1F, 0x1F, 0x1E, 0x46, 0x4F, 0x4F, 0x46,
- 0x46, 0x46, 0x4F, 0x46, 0x43, 0x43, 0x1D, 0x1A, 0x3, 0xFE, 0xFE, 0xFE, 0x0, 0x12, 0x12, 0x12,
- 0x12, 0x12, 0x0, 0xFE, 0x12, 0x0, 0x0, 0x0, 0x0, 0x12, 0x34, 0x1, 0x1, 0x1, 0x1, 0x1,
- 0x0, 0x12, 0x1, 0x1, 0x1, 0x1, 0x1, 0x43, 0x43, 0x55, 0x5C, 0x5C, 0x5C, 0xC0, 0xC0, 0xC0,
- 0xBF, 0xC9, 0xCA, 0xC0, 0xC0, 0xCA, 0x36, 0x34, 0xC9, 0xC9, 0xC9, 0xC0, 0xC9, 0xC9, 0x5A, 0x5C,
- 0x5C, 0x55, 0x55, 0x55, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xC9, 0x5C, 0xBF, 0x5C, 0x5A, 0x5A, 0xCC,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xC,
- 0x4, 0xAF, 0x3E, 0x0, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xE9, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
- 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
- 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xE9, 0xEA,
- 0xF5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x41, 0x38,
- 0x2C, 0x2C, 0xD, 0x4, 0x4, 0x4, 0x4, 0x39, 0x71, 0x1F, 0x1E, 0x1E, 0xCA, 0xCA, 0x5C, 0x5C,
- 0xCA, 0xC9, 0xCA, 0xCA, 0x5C, 0x5C, 0x5C, 0xC9, 0x4C, 0xFE, 0xFE, 0xFE, 0xA, 0x5C, 0x5C, 0x5C,
- 0x5C, 0xBF, 0x1, 0xFE, 0x34, 0x8, 0x0, 0x0, 0x0, 0x12, 0x1A, 0x1, 0x1, 0xF, 0xF, 0xF,
- 0x1, 0x2F, 0x96, 0x18, 0x11, 0x11, 0x19, 0x42, 0x43, 0x55, 0xC9, 0xC9, 0xCE, 0xCB, 0xCE, 0xC9,
- 0xCD, 0xCD, 0xCF, 0xCF, 0xCE, 0xD0, 0x54, 0x36, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
- 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCA, 0xCB, 0xD0, 0xD0, 0xCC, 0xCA, 0xCA, 0xCC, 0xCA,
- 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x23,
- 0x5, 0xAF, 0x37, 0xB, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
- 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
- 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF7,
- 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA3, 0x3A,
- 0x2C, 0x2C, 0xD, 0x4, 0x4, 0x4, 0x20, 0xDB, 0xB5, 0x1E, 0x4, 0x1E, 0xC9, 0xC9, 0xC9, 0x5C,
- 0xC9, 0xC9, 0xCC, 0xCC, 0xCA, 0xC9, 0x5C, 0x5C, 0x55, 0x0, 0xFE, 0xFE, 0x0, 0x5C, 0x5C, 0x5C,
- 0x5C, 0x5C, 0x12, 0x0, 0x43, 0x1A, 0x0, 0x0, 0x0, 0xA, 0x3, 0x1, 0x1, 0xF, 0xF, 0xF,
- 0xF, 0xF, 0x10, 0x10, 0x11, 0x11, 0x11, 0x43, 0x43, 0x55, 0xC9, 0xCD, 0xCE, 0xCE, 0xCE, 0xD0,
- 0xD0, 0xCD, 0xCE, 0xCC, 0xCC, 0xCC, 0xBF, 0x3D, 0xCB, 0xCB, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xD0,
- 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xC,
- 0x4, 0xAF, 0x37, 0x4, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
- 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9,
- 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xD8, 0xA8, 0x3C,
- 0x33, 0x2C, 0xD, 0x2, 0x6, 0x4, 0x4, 0xD5, 0xB2, 0x4, 0x4, 0x1E, 0xCB, 0xCB, 0xE4, 0xC6,
- 0xCA, 0xC9, 0xCA, 0xCC, 0xCC, 0xC9, 0xC9, 0xC9, 0xC9, 0x36, 0xFE, 0xFE, 0xFE, 0x36, 0x5C, 0xC9,
- 0xC9, 0xC9, 0x46, 0x0, 0x43, 0x46, 0x1, 0x0, 0x0, 0x1, 0x1, 0xA, 0x95, 0x2E, 0xF, 0xF,
- 0xF, 0xF, 0xF, 0xF, 0x10, 0x10, 0x11, 0x47, 0x43, 0x55, 0xC9, 0xCD, 0xCD, 0xC2, 0xCD, 0xCE,
- 0xD0, 0xD0, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xC0,
- 0x5D, 0xC0, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5A, 0x58, 0x5B, 0x7,
- 0x4, 0x71, 0x6C, 0x0, 0xD7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4, 0x41,
- 0x33, 0x2C, 0x7, 0x4, 0xB, 0x4, 0x4, 0xD5, 0xB5, 0x4, 0x4, 0x4, 0xCC, 0xCC, 0xC8, 0xC3,
- 0xC9, 0xC9, 0xC9, 0x5C, 0x5C, 0xC9, 0xBF, 0x55, 0xAD, 0x53, 0x12, 0xFE, 0xFE, 0x0, 0x1A, 0x55,
- 0x55, 0x55, 0x53, 0x0, 0x43, 0x5A, 0x12, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0xF, 0xF,
- 0xF, 0xF, 0xF, 0xF, 0xF, 0x10, 0x10, 0x59, 0x42, 0x59, 0x59, 0xBF, 0xCD, 0xCD, 0xCD, 0xCE,
- 0xD0, 0xD0, 0xCC, 0xCC, 0xCE, 0xC9, 0xC9, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x58, 0x5B, 0x4,
- 0x4, 0x79, 0x6B, 0x6, 0x29, 0xD5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xB6, 0x94,
- 0x33, 0x31, 0xC, 0x4, 0x4, 0x4, 0x4, 0xDB, 0xD5, 0x4, 0x4, 0x4, 0xCC, 0xCA, 0xC6, 0xC3,
- 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xAD, 0xBF, 0xBF, 0xBF, 0x55, 0x55, 0x1, 0xFE, 0x0, 0x1, 0x46,
- 0x5C, 0x5C, 0x5C, 0x12, 0x36, 0x5A, 0x5A, 0x1A, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3,
- 0x3, 0x27, 0x2E, 0xA, 0x4B, 0x32, 0x12, 0x5C, 0x1B, 0x59, 0x59, 0xC1, 0xBF, 0xAD, 0xAD, 0xAD,
- 0xAD, 0xBF, 0xAD, 0xAD, 0xAD, 0xBF, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xC9, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5A, 0x5A, 0xB,
- 0x4, 0x9B, 0x29, 0x20, 0x29, 0x29, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBB, 0xA3,
- 0x3A, 0x33, 0xE, 0x5, 0x4, 0x4, 0x1F, 0xE6, 0xB2, 0x4, 0x4, 0x1E, 0xCA, 0xC9, 0x5C, 0x5A,
- 0x5C, 0xC9, 0x5C, 0xCA, 0xCC, 0xCA, 0xC9, 0x5C, 0xC9, 0x55, 0x5A, 0x46, 0x10, 0x1, 0x0, 0x1,
- 0x3, 0x1B, 0x1B, 0x18, 0x18, 0x43, 0x1D, 0x12, 0x1, 0x1D, 0x43, 0x43, 0x36, 0x46, 0x46, 0x46,
- 0x46, 0x52, 0x4F, 0x4F, 0x52, 0x4F, 0x53, 0xBF, 0x18, 0x50, 0x56, 0xBF, 0xC2, 0xCD, 0xCD, 0xCD,
- 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xD0, 0xD0, 0xCE, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x5B, 0x58, 0x5A, 0x5A, 0xE,
- 0x0, 0x79, 0x6B, 0x6, 0xD5, 0x6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xBD, 0xAA,
- 0x3C, 0x33, 0x2C, 0xB, 0x4, 0x4, 0x1F, 0xDB, 0xB2, 0x4, 0x4, 0x1E, 0x5C, 0x5C, 0x5C, 0x5C,
- 0x5C, 0x5C, 0xBF, 0xCA, 0xCA, 0xC9, 0xC9, 0xC9, 0xC9, 0xAD, 0xBF, 0xBF, 0x49, 0x44, 0x13, 0x13,
- 0x10, 0x10, 0xF, 0x10, 0x10, 0x3, 0x1, 0x3, 0x3, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9,
- 0xBF, 0xCE, 0xCE, 0xCE, 0xCE, 0xC9, 0xC9, 0xBF, 0x12, 0x7, 0x10, 0x12, 0x12, 0x12, 0x12, 0x12,
- 0x12, 0x1A, 0x1B, 0x1A, 0x1A, 0x1B, 0x34, 0x34, 0x1D, 0x36, 0x46, 0x46, 0x46, 0x46, 0x55, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x5B, 0x58, 0x58, 0x5A, 0x7,
- 0x4, 0x9B, 0x6B, 0xD, 0x1F, 0x6B, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xE9, 0xB4,
- 0x3C, 0x33, 0x2C, 0xB, 0x4, 0x4, 0x1F, 0xDB, 0xD5, 0x4, 0x4, 0x1E, 0x54, 0x53, 0x53, 0x55,
- 0x5A, 0x5A, 0x55, 0x53, 0x55, 0x55, 0x55, 0x53, 0x53, 0x52, 0x53, 0x53, 0x52, 0x4A, 0xBE, 0x4A,
- 0x49, 0x49, 0x45, 0x45, 0x45, 0x44, 0x12, 0x34, 0x3, 0xC9, 0x5C, 0xC9, 0xC9, 0xC9, 0xC9, 0xBF,
- 0xBF, 0xC9, 0xC9, 0xCD, 0xC9, 0xC9, 0xC9, 0xBF, 0x55, 0x53, 0x55, 0x53, 0x53, 0x53, 0x53, 0x53,
- 0x53, 0x53, 0x53, 0x53, 0x52, 0x52, 0x4F, 0x4F, 0x46, 0x46, 0x46, 0x4F, 0x4F, 0x46, 0x50, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x5B, 0x5B, 0x58, 0x58, 0x57, 0x5B, 0x5B, 0x5A, 0x5A, 0x7,
- 0x4, 0x9A, 0x28, 0xD, 0x9B, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6,
- 0x41, 0x33, 0x2C, 0xB, 0x4, 0x4, 0x1F, 0xE6, 0xD5, 0x4, 0x4, 0x1E, 0x2F, 0x1A, 0x1C, 0x46,
- 0x45, 0x45, 0x44, 0x13, 0x13, 0x13, 0x13, 0x12, 0x10, 0x10, 0x10, 0x10, 0x12, 0x12, 0x44, 0x49,
- 0xBE, 0xBE, 0xC1, 0xC1, 0xC1, 0xC2, 0xBF, 0xBF, 0x3, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0xC9,
- 0xBF, 0xC9, 0xC9, 0xCE, 0xCD, 0xC9, 0xC9, 0xC9, 0xBF, 0xC9, 0xCE, 0xCB, 0xCE, 0xCE, 0xCE, 0xCE,
- 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x9,
- 0x6, 0x77, 0x67, 0xB, 0x28, 0x29, 0xEF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0xBB,
- 0xA3, 0x3A, 0x32, 0xB, 0x4, 0x0, 0x6, 0xDB, 0xB2, 0x4, 0x1E, 0x1F, 0x1C, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x44, 0x49, 0x4A, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,
- 0xC1, 0xC1, 0xBE, 0xBE, 0xBE, 0xBF, 0x5C, 0xC9, 0x46, 0xAD, 0xC9, 0xC9, 0xE7, 0x9D, 0xBF, 0xBF,
- 0xAD, 0xBF, 0xC9, 0xBF, 0xC9, 0xC9, 0xCD, 0xC0, 0xC9, 0x5C, 0xBF, 0xC9, 0xC9, 0xCD, 0xCD, 0xCD,
- 0xCE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0xCE, 0xCE, 0xD0, 0xCC, 0xCE, 0xCC, 0xCC, 0xCC, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0xB,
- 0x4, 0x79, 0x37, 0x6, 0x9D, 0x1F, 0x6B, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD,
- 0x94, 0x3A, 0x33, 0xD, 0x5, 0x4, 0x1F, 0xDB, 0xB2, 0x1E, 0x1F, 0x22, 0x1A, 0x1A, 0x1A, 0x8,
- 0x3, 0x3, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x12, 0x1A, 0x1A, 0x1A, 0x2F, 0x34,
- 0x36, 0x3D, 0x46, 0x3D, 0x59, 0x59, 0x5C, 0xC9, 0x5C, 0xBF, 0xBF, 0xBF, 0xAD, 0x54, 0xBF, 0x5A,
- 0x5C, 0xBF, 0x5C, 0xBF, 0xBF, 0x5C, 0xC9, 0xC0, 0xC0, 0x5C, 0xBF, 0xC9, 0xCD, 0xCD, 0xCE, 0xCE,
- 0xCA, 0xCA, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5D, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x5A, 0x57, 0x58, 0x5B, 0x58, 0x58, 0x5B, 0x6,
- 0x4, 0x9B, 0x37, 0xB, 0x9D, 0x65, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8,
- 0xA5, 0x3C, 0x33, 0xC, 0x4, 0x4, 0x1F, 0xDB, 0x9D, 0x4, 0x1F, 0x28, 0x1A, 0xA, 0xA, 0xA,
- 0xA, 0x1, 0x1, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0x3, 0x8, 0x1A, 0x12,
- 0x2D, 0x34, 0x34, 0x34, 0x55, 0xC0, 0x59, 0x53, 0x55, 0xC9, 0xCB, 0xCF, 0xCB, 0xCE, 0xCD, 0xCD,
- 0xCB, 0xC9, 0xC9, 0xC9, 0xBF, 0xC9, 0xCD, 0xC9, 0xC9, 0x5C, 0xC9, 0xBF, 0xBF, 0xCB, 0xC9, 0xBF,
- 0xBF, 0xCA, 0xCA, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x57, 0x5A, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x5A, 0x5B, 0x6,
- 0x4, 0xB5, 0x97, 0x1F, 0xB2, 0x65, 0x6E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8,
- 0xA5, 0x3C, 0x33, 0xC, 0x4, 0x4, 0x1E, 0xE6, 0xD5, 0x4, 0x1F, 0x1F, 0x2F, 0x1A, 0xA, 0x3,
- 0x7, 0x1, 0x3, 0x3, 0x3, 0x8, 0x3, 0x3, 0x8, 0xA, 0xA, 0x8, 0x8, 0xA, 0xA, 0x1A,
- 0x2F, 0x34, 0x34, 0x2F, 0x53, 0xC0, 0x5A, 0x52, 0x52, 0xAD, 0xCF, 0xCF, 0xD0, 0xD0, 0xD0, 0xF3,
- 0xF3, 0xF3, 0xF3, 0xF3, 0xC4, 0xCF, 0xCF, 0xCE, 0xC0, 0xC9, 0xC9, 0xBF, 0xBF, 0xAD, 0xAD, 0xBF,
- 0xBF, 0xBF, 0xBF, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCC, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x57, 0x57, 0x57, 0x58, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x58, 0x5B, 0xB,
- 0x4, 0xE2, 0xAF, 0x20, 0xB2, 0x29, 0xAF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9,
- 0xA5, 0x3C, 0x38, 0xC, 0x4, 0x4, 0x4, 0xDB, 0x9D, 0x4, 0x6, 0x1F, 0x1A, 0x3, 0x3, 0x3,
- 0x1, 0x1, 0x8, 0x3, 0xA, 0x12, 0x8, 0x3, 0x1, 0x3, 0x3, 0x12, 0xA, 0x1A, 0x2E, 0x1A,
- 0x1A, 0x2F, 0x34, 0x2F, 0x4F, 0xC0, 0x5A, 0x52, 0x52, 0x52, 0xAD, 0xC9, 0xC9, 0xCD, 0xCE, 0xCE,
- 0xD0, 0xCE, 0xCE, 0xCE, 0xC9, 0xBF, 0xC9, 0xCD, 0xC0, 0xCE, 0xCD, 0xC9, 0xCD, 0xCD, 0xCD, 0xCE,
- 0xCE, 0xD0, 0xD0, 0xD0, 0xCE, 0xCE, 0xCD, 0xCE, 0xCE, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5D, 0x5B, 0x5B, 0x5D, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x57, 0x58, 0x58, 0x57, 0x57, 0x58, 0x58, 0x58, 0x5B, 0xB,
- 0x4, 0xDB, 0x97, 0x20, 0xD5, 0x29, 0xD5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9,
- 0xAA, 0x3C, 0x33, 0xC, 0x5, 0x4, 0x4, 0xD7, 0xB5, 0x4, 0x6, 0x6, 0x1A, 0xA, 0x1A, 0x3,
- 0x1, 0x3, 0x8, 0x1, 0x3, 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x1A, 0x1A, 0x1A, 0x2E, 0x1A,
- 0x2F, 0x34, 0x36, 0x34, 0x46, 0x5C, 0x5C, 0x53, 0x4C, 0x52, 0x48, 0x48, 0x48, 0x52, 0xA6, 0xA6,
- 0x5C, 0xBF, 0xC4, 0xCD, 0xC9, 0xBF, 0xBF, 0xC9, 0xCD, 0xCE, 0xCD, 0xC9, 0xC9, 0xCD, 0xCE, 0xCE,
- 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x57, 0x58, 0x58, 0x57, 0x57, 0x58, 0x58, 0x5B, 0x5B, 0x5,
- 0x1F, 0xE2, 0x9B, 0x25, 0xB2, 0x29, 0xE6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF7, 0xB7, 0xBD, 0xF5, 0xF8,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9,
- 0xA8, 0x3C, 0x33, 0xC, 0x5, 0x4, 0x4, 0xD5, 0xD5, 0x6, 0x6, 0x6, 0x1A, 0xA, 0x12, 0x3,
- 0x3, 0x8, 0x8, 0x3, 0x1, 0x1, 0x1, 0x3, 0x3, 0x3, 0x3, 0x3, 0x12, 0x1A, 0x2D, 0x34,
- 0x3D, 0x36, 0x3B, 0x36, 0x36, 0x5C, 0x5C, 0x53, 0x52, 0x54, 0x54, 0xAD, 0xBF, 0xBF, 0xBF, 0xAD,
- 0xC9, 0xC9, 0xC9, 0xBF, 0xBF, 0xC9, 0xBF, 0xC9, 0xCD, 0xCE, 0xCE, 0xD0, 0xD0, 0xD0, 0xCE, 0xCE,
- 0xCE, 0xCE, 0xCE, 0xCE, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5A, 0x58, 0x58, 0x58, 0x58, 0x58, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0xB,
- 0x6, 0xE1, 0x97, 0x20, 0x71, 0x1F, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xEE, 0xF0, 0xA3, 0x7, 0x38, 0xA3, 0xB4,
- 0xF0, 0xF8, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xE9,
- 0xA8, 0x3C, 0x33, 0xB, 0x4, 0x4, 0x4, 0xB5, 0xD5, 0x6, 0x6, 0xD, 0x1A, 0xA, 0x1A, 0x7,
- 0x1, 0x1, 0x1, 0x8, 0x8, 0x3, 0x1, 0x1, 0x1, 0x3, 0x3, 0xA, 0x1A, 0x1A, 0x2F, 0x34,
- 0x36, 0x36, 0x36, 0x36, 0x36, 0x5C, 0xC0, 0x55, 0x54, 0x54, 0xAD, 0xBF, 0xAD, 0xAD, 0xAD, 0xAD,
- 0xC9, 0x5C, 0xC9, 0xC9, 0xC9, 0xCD, 0xD0, 0xD0, 0xD0, 0xD0, 0xCE, 0xCD, 0xC9, 0xCD, 0xCE, 0xCE,
- 0xD0, 0xD0, 0xD0, 0xCE, 0xCE, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x6,
- 0x6, 0xFC, 0xB5, 0x25, 0x71, 0x1F, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x94, 0x2C, 0x2C, 0x41, 0xB6, 0xF5, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xD8, 0x2C, 0x0, 0xF, 0x8, 0x2D,
- 0x3B, 0xA3, 0xB6, 0xEA, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8,
- 0xA4, 0x3A, 0x33, 0x5, 0x4, 0x4, 0x0, 0xAF, 0xB5, 0x4, 0x6, 0x6, 0x1A, 0xA, 0x3, 0x7,
- 0x8, 0x3, 0x1, 0x1, 0x3, 0x8, 0x8, 0xA, 0xA, 0x3, 0xA, 0x3, 0x1A, 0x12, 0x1A, 0x1A,
- 0x36, 0x36, 0x36, 0x36, 0x4C, 0xC9, 0xC0, 0x5A, 0xC9, 0xCF, 0xCD, 0xD0, 0xD0, 0xD0, 0xD0, 0xCE,
- 0xCA, 0xCA, 0xD0, 0xD0, 0xD0, 0xCE, 0xD0, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xD0,
- 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x20,
- 0xB, 0xD7, 0x6E, 0x20, 0x71, 0x28, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xD8, 0x2C, 0xB6, 0xA3, 0x31, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x1, 0x1, 0x1,
- 0x8, 0x12, 0x2D, 0x41, 0xB7, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8,
- 0xA3, 0x3A, 0x33, 0x7, 0x5, 0x4, 0xFE, 0x72, 0x97, 0x2, 0x6, 0xD, 0x2F, 0x1A, 0x12, 0x2C,
- 0x2D, 0xA, 0x8, 0x1, 0x1, 0x3, 0x8, 0x3, 0xA, 0x3, 0x3, 0x2E, 0x2E, 0x1A, 0x1A, 0x1C,
- 0x36, 0x4C, 0x52, 0x4C, 0x4C, 0x5C, 0x5C, 0x5A, 0xAD, 0xC4, 0xAD, 0xC4, 0xAD, 0xC4, 0xC9, 0xCF,
- 0xC9, 0xCA, 0xD0, 0xD0, 0xD0, 0xCE, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x20,
- 0xFE, 0x0, 0x6, 0xB, 0x39, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0x41, 0x33, 0xAA, 0x38, 0xF9, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x1, 0x0, 0x0,
- 0x0, 0x1, 0x1, 0x8, 0x3B, 0xB7, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xEA, 0xB7,
- 0x94, 0x38, 0x25, 0xD, 0x4, 0x0, 0x0, 0x5, 0x20, 0xD, 0x25, 0xD, 0x2D, 0x12, 0xA, 0x7,
- 0xA, 0x8, 0x1, 0x1, 0x1, 0x3, 0x8, 0x8, 0xA, 0xA, 0x3, 0xA, 0x12, 0xA, 0x12, 0x34,
- 0x36, 0x4C, 0x4C, 0x3D, 0x4C, 0x5C, 0xC0, 0x5A, 0xAD, 0x54, 0x54, 0x54, 0x54, 0xA6, 0x54, 0xAD,
- 0xC9, 0x5C, 0xC9, 0xC9, 0xBF, 0xC9, 0xC9, 0xBF, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xCD, 0xC9, 0xC9,
- 0xC9, 0xCD, 0xD0, 0xCC, 0xCC, 0xCC, 0xCC, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCC,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x58, 0x5B, 0x5B, 0x25,
- 0x4, 0x37, 0x39, 0x1F, 0x1F, 0xDB, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xA3, 0x31, 0xBB, 0xFD, 0xFD, 0xBB, 0x3A, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x0, 0x8, 0x2D, 0x2C,
- 0x1, 0x0, 0x0, 0x0, 0x8, 0x3B, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF4, 0xF4, 0xF7, 0xE9, 0xB0,
- 0x6F, 0x30, 0xB, 0x4, 0x4, 0x4, 0x4, 0xFE, 0x0, 0xD, 0x25, 0xD, 0x1A, 0xA, 0xA, 0x9,
- 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x3, 0xA, 0x1A, 0x12, 0x12, 0x12, 0x1A, 0x1C, 0x36,
- 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x55, 0x5C, 0x5C, 0xC4, 0x55, 0x54, 0x54, 0x54, 0xAD, 0xC4, 0xBF,
- 0xC9, 0x5C, 0xCD, 0xCD, 0xCD, 0xCD, 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCE, 0xCE, 0xCE,
- 0xD0, 0xD0, 0xD0, 0xCE, 0xD0, 0xD0, 0xCC, 0xCA, 0xCC, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA,
- 0xCA, 0xCA, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B,
- 0x5B, 0x5B, 0x5B, 0x5B, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x20,
- 0x1F, 0xD7, 0x97, 0xB, 0xD, 0xE0, 0xE0, 0xED, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x41, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x41, 0xEC, 0xF0,
- 0xB7, 0x41, 0x2C, 0x1, 0x0, 0x12, 0xAA, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF5, 0xF5, 0xE2, 0x22, 0x4, 0x4, 0x4, 0x1E,
- 0x4, 0x0, 0x0, 0x0, 0x0, 0xFE, 0xFE, 0x4, 0xFE, 0x0, 0x4, 0x0, 0x0, 0x4, 0x0, 0x0,
- 0xFE, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4,
- 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4,
- 0x4, 0x4, 0x4, 0x4, 0x4, 0x0, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x4, 0xFE, 0x5, 0x5,
- 0x4, 0x0, 0x0, 0xFE, 0x0, 0x4, 0x0, 0xFE, 0x4, 0xFE, 0x0, 0x0, 0x4, 0x5, 0x5, 0x5,
- 0x0, 0x4, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1E, 0x1E,
- 0x4, 0x0, 0x4, 0x0, 0x0, 0x4, 0x4, 0x0, 0x6, 0xFE, 0x6, 0x4, 0xFE, 0x0, 0x0, 0x0,
- 0xFE, 0x39, 0x25, 0xFE, 0x0, 0xB, 0x0, 0x4, 0x4, 0xB, 0x25, 0xBC, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A, 0x94, 0x2C, 0x2C, 0x41, 0xBB, 0xF7,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x3, 0xA3, 0xE9, 0xD8,
- 0xE9, 0xF0, 0xE9, 0xB4, 0x8, 0x3, 0x94, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xBD, 0xB5, 0x64, 0x77, 0x79, 0x70, 0x67,
- 0x3E, 0x6C, 0x3E, 0x38, 0x3E, 0x20, 0x20, 0xB3, 0xF6, 0xAE, 0x3E, 0x6E, 0x6C, 0x6F, 0x25, 0x4,
- 0x37, 0x97, 0xA7, 0xA7, 0xA9, 0x97, 0x97, 0x71, 0x39, 0x39, 0x37, 0x37, 0x39, 0x39, 0x39, 0x37,
- 0x39, 0x37, 0x39, 0x23, 0x1, 0x23, 0xA8, 0xA8, 0x6E, 0x72, 0x72, 0x72, 0xB2, 0xB3, 0xAF, 0x9B,
- 0x96, 0x96, 0x96, 0x97, 0x71, 0x6B, 0x6B, 0x71, 0x39, 0x37, 0x39, 0x29, 0x4, 0x4, 0x39, 0x71,
- 0x37, 0x6B, 0xD5, 0xE1, 0xD5, 0xD5, 0xE6, 0xE6, 0xF4, 0xF4, 0xE2, 0xB5, 0xAF, 0x3E, 0x25, 0x25,
- 0x0, 0xFE, 0x25, 0x6E, 0x37, 0x39, 0x71, 0x97, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x65, 0x39,
- 0x39, 0x32, 0x25, 0x2, 0xFE, 0x4, 0x39, 0x1F, 0x6, 0xD, 0xD, 0x6, 0xB, 0x6, 0x4, 0x4,
- 0x1E, 0xD5, 0x39, 0x0, 0xFE, 0x6F, 0x20, 0x4, 0x1F, 0x4, 0x0, 0x38, 0xF7, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF9, 0xFD, 0xFD, 0xA3, 0x94, 0x41, 0x2C,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x3, 0xA3, 0xEA, 0xBD,
- 0xB6, 0xB6, 0xBD, 0xF7, 0x33, 0x3, 0x94, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6, 0xA4, 0x72, 0x64, 0x64, 0x21, 0x21, 0x22,
- 0x20, 0x20, 0x20, 0x23, 0x30, 0x4, 0xFE, 0x30, 0xAE, 0x25, 0x6, 0x25, 0x20, 0x37, 0x25, 0xB,
- 0x25, 0x32, 0x25, 0x25, 0x25, 0x6, 0x6, 0x1F, 0xD, 0xB, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6,
- 0x1E, 0x6, 0x20, 0x20, 0xB, 0x30, 0x30, 0xB, 0x16, 0x6, 0x6, 0x1F, 0x20, 0x25, 0x25, 0x1F,
- 0x1F, 0x1F, 0x1F, 0x20, 0x25, 0x20, 0x25, 0x29, 0x25, 0x20, 0x25, 0x29, 0x1F, 0x1F, 0x37, 0x37,
- 0x1F, 0x20, 0x39, 0x6B, 0x39, 0x37, 0x6B, 0x71, 0x6B, 0x6E, 0x6B, 0x97, 0xD5, 0xB5, 0xB5, 0xF4,
- 0x30, 0x6, 0xA7, 0xF4, 0xD5, 0xE1, 0xE6, 0xE8, 0xE8, 0xE8, 0xE6, 0xE6, 0xE6, 0xE6, 0xE1, 0xE6,
- 0xE1, 0xD5, 0xE2, 0xA5, 0x6, 0x20, 0xE6, 0xB2, 0x6E, 0xA7, 0x97, 0x3E, 0x39, 0x25, 0x1F, 0x25,
- 0x37, 0xFC, 0xE0, 0x0, 0xB, 0xFC, 0xF4, 0xB2, 0x6E, 0x25, 0x4, 0x32, 0xEF, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF5, 0xFD, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xF7, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x3, 0xA4, 0xF0, 0xF7,
- 0xEA, 0xB7, 0xB4, 0xF0, 0x31, 0x3, 0x41, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xA4, 0x41, 0x6C, 0x66, 0x21, 0x1F, 0x20, 0x1E,
- 0x5, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4, 0x6, 0x4, 0x4, 0x4, 0x0, 0x4, 0x4, 0x5,
- 0x6, 0x6, 0x4, 0x4, 0x6, 0x4, 0x4, 0x1E, 0x4, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1F,
- 0x1E, 0x1F, 0x6, 0x6, 0x20, 0x6, 0x6, 0x1F, 0x6, 0x6, 0x6, 0x1F, 0x1F, 0x4, 0x1F, 0x1F,
- 0x1F, 0x1F, 0xB, 0xB, 0x20, 0x20, 0x20, 0xB, 0x20, 0xB, 0x20, 0x20, 0x1F, 0x4, 0x20, 0x1F,
- 0x4, 0x4, 0x6, 0x1F, 0x1E, 0x4, 0x4, 0x20, 0x0, 0x4, 0x4, 0x0, 0x4, 0x30, 0x30, 0x25,
- 0x37, 0x4, 0x37, 0x6C, 0x20, 0x29, 0x25, 0x25, 0x29, 0x29, 0x22, 0x22, 0x22, 0x29, 0x22, 0x67,
- 0x1F, 0x20, 0x37, 0x25, 0xB, 0x1F, 0x39, 0x29, 0x37, 0x25, 0x32, 0x25, 0xB, 0x6, 0x0, 0x4,
- 0x20, 0xF4, 0xAF, 0x4, 0x4, 0x6E, 0x20, 0x37, 0x25, 0xB, 0x6, 0x2C, 0xEF, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x33, 0xE9, 0xFD, 0xBD, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x3, 0xA4, 0xF5, 0xFD,
- 0xFD, 0xF0, 0xB6, 0xF0, 0x33, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xAA, 0x48, 0x40, 0x29, 0x22, 0x37, 0x37, 0x25,
- 0x20, 0xD, 0xE, 0x7, 0x0, 0x0, 0x0, 0x20, 0x1F, 0x4, 0x4, 0x6, 0x4, 0x6, 0xB, 0xB,
- 0x1F, 0x1F, 0x6, 0x4, 0x6, 0x20, 0x20, 0x1F, 0x4, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x29, 0x20, 0x6, 0x1F, 0x20, 0x20, 0x20, 0x6, 0x1F, 0x25, 0x25, 0x25, 0x25, 0x1F, 0x20, 0x25,
- 0x25, 0x20, 0x25, 0x20, 0x20, 0x25, 0xD, 0x20, 0x20, 0x6, 0xB, 0x1F, 0x25, 0x25, 0x25, 0x1F,
- 0x20, 0x1F, 0x4, 0x1F, 0x37, 0x25, 0x20, 0x4, 0x20, 0x20, 0x5, 0x20, 0x23, 0xB, 0x5, 0xB,
- 0x5, 0x4, 0x4, 0xB, 0x4, 0xB, 0x1F, 0x1F, 0x4, 0xB, 0xB, 0xD, 0x1F, 0x20, 0x4, 0x6,
- 0x20, 0x1F, 0x30, 0x20, 0xB, 0x20, 0x20, 0x20, 0xD, 0xB, 0xB, 0xD, 0x4, 0x4, 0x4, 0x1F,
- 0x4, 0xD5, 0x9B, 0x4, 0x20, 0x1F, 0xB, 0x3E, 0xB6, 0xD8, 0xB0, 0x40, 0xEF, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x31, 0xE, 0x2C, 0xD8, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x3, 0xA4, 0xF5, 0xFD,
- 0xF9, 0xF5, 0xBD, 0xF0, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xAA, 0xA4, 0x41, 0x3E, 0x6B, 0x40, 0x3A, 0x39,
- 0x37, 0x32, 0x2C, 0xE, 0x9, 0xFE, 0xFE, 0x37, 0x3E, 0x6, 0x6, 0x1F, 0x6, 0x6, 0xD, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x25, 0x30, 0x25, 0x20, 0x29, 0x37, 0x37, 0x30, 0x30, 0x25, 0x25, 0x25,
- 0x37, 0x37, 0x30, 0x39, 0x6E, 0x37, 0x30, 0x37, 0x20, 0x29, 0x29, 0x29, 0x28, 0x28, 0x6B, 0x37,
- 0x25, 0x1F, 0x25, 0x29, 0x29, 0x37, 0x37, 0x6E, 0x40, 0x97, 0xA9, 0x3E, 0x37, 0x25, 0x25, 0x39,
- 0x37, 0x6B, 0x6E, 0x39, 0x39, 0x37, 0x6B, 0x25, 0x25, 0x20, 0x5, 0x4, 0x5, 0x4, 0x5, 0x25,
- 0x3E, 0xAF, 0x37, 0x30, 0x20, 0xB, 0x37, 0x39, 0x20, 0x25, 0x25, 0x20, 0x25, 0x39, 0x29, 0x37,
- 0x25, 0x25, 0x37, 0x25, 0x20, 0x33, 0xE, 0xE, 0x32, 0x6E, 0x30, 0x3A, 0x38, 0xB, 0xB, 0x1F,
- 0x4, 0xE8, 0xD5, 0x4, 0x65, 0x6E, 0xB4, 0xB7, 0xE9, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xB7, 0x41, 0x2C, 0x2C, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x3, 0xA4, 0xF0, 0xF7,
- 0xB7, 0xEA, 0xEA, 0xF5, 0x33, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8, 0xB7, 0xB4, 0xB4, 0xAA, 0xAA, 0xA8, 0xA3,
- 0x3C, 0x33, 0x2D, 0x2D, 0xE, 0x0, 0x0, 0x3E, 0x6E, 0xB, 0xD, 0x20, 0x20, 0x20, 0x20, 0x25,
- 0x20, 0x25, 0x20, 0x25, 0x39, 0x20, 0x4, 0x6E, 0x39, 0x37, 0x6E, 0x37, 0x20, 0x39, 0x37, 0x6B,
- 0x37, 0x72, 0x6F, 0xBA, 0xD8, 0xA7, 0x6E, 0x37, 0x37, 0x37, 0x25, 0x6C, 0x71, 0x71, 0x3E, 0x37,
- 0x37, 0x39, 0x3E, 0x6E, 0x32, 0x39, 0xA9, 0x37, 0x0, 0x0, 0xB0, 0xD8, 0xA7, 0x32, 0x39, 0x6E,
- 0x39, 0x37, 0x6F, 0x6E, 0xA7, 0x37, 0x6E, 0x6F, 0xD, 0x6F, 0x30, 0xE2, 0xB0, 0xFB, 0xB0, 0x20,
- 0x6, 0x25, 0x37, 0x25, 0x32, 0x37, 0x37, 0x40, 0x37, 0x6E, 0x6E, 0x6F, 0x6E, 0xAF, 0xA9, 0xB5,
- 0x97, 0xA9, 0xB0, 0xE2, 0xBC, 0xBC, 0xBA, 0xAF, 0x97, 0xA9, 0xD7, 0x6E, 0xB, 0x20, 0x20, 0x20,
- 0x2, 0xE1, 0x9B, 0x1F, 0xB5, 0xBD, 0xD8, 0xE9, 0xF0, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xAA, 0xF5, 0xE9, 0xB6, 0xA3, 0x38, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xA4, 0xF0, 0xF5,
- 0x31, 0xAA, 0xF0, 0xF5, 0x33, 0x1, 0x41, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xF0, 0xEE, 0xE9, 0xE9, 0xE9, 0xE9, 0xBD, 0xB6,
- 0xA3, 0x3C, 0x33, 0x31, 0xE, 0x0, 0xFE, 0x3E, 0x6E, 0x4, 0x5, 0x20, 0x20, 0x20, 0x20, 0x29,
- 0x29, 0x37, 0x39, 0x37, 0xD, 0xD, 0xD, 0xB, 0x4, 0x20, 0xAE, 0x97, 0xA7, 0x3E, 0x6E, 0xBA,
- 0xBA, 0xB5, 0x20, 0x0, 0x0, 0x0, 0x30, 0xA7, 0x3E, 0x6E, 0x6F, 0x97, 0x6F, 0xAF, 0xAF, 0xB0,
- 0x6E, 0x6E, 0xAF, 0xA9, 0x6E, 0x97, 0x39, 0x6, 0x33, 0x30, 0x5, 0xFE, 0xF6, 0xD8, 0xAF, 0x6E,
- 0xB0, 0xA7, 0xB5, 0xB0, 0xBC, 0xA7, 0xAF, 0xA9, 0x6F, 0xF6, 0xBC, 0xFB, 0x0, 0xB, 0xFD, 0xEF,
- 0x6F, 0x37, 0xBA, 0x39, 0xF4, 0xBA, 0xE2, 0xBC, 0xA7, 0xAF, 0xD7, 0xD7, 0xE2, 0xA9, 0x6, 0xE2,
- 0xB5, 0xFC, 0xFC, 0xFE, 0x0, 0xFE, 0x40, 0xFC, 0xFC, 0xF6, 0xEF, 0x3E, 0x4, 0xB, 0x20, 0x30,
- 0x1F, 0xE6, 0x9B, 0x20, 0xEF, 0xF5, 0xF1, 0xF0, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0x94, 0xE, 0x2C, 0xAA, 0xBD, 0xF0, 0xF9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xA3, 0xBD, 0xF8, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xD8, 0xE, 0x1, 0x94, 0xE9, 0xEA,
- 0x2C, 0xA3, 0xEA, 0xF5, 0x31, 0x1, 0x41, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF7, 0xF7, 0xF5, 0xF0, 0xE9,
- 0xB4, 0x94, 0x38, 0x31, 0x2C, 0x0, 0x0, 0x3E, 0x6F, 0x6, 0x4, 0x4, 0x5, 0xB, 0xB, 0x4,
- 0x1F, 0x6, 0x1F, 0xD, 0x20, 0x33, 0x3C, 0x32, 0x32, 0xD, 0x25, 0xA9, 0x6F, 0xA7, 0x25, 0xB,
- 0x20, 0x30, 0x33, 0x3F, 0x3C, 0x33, 0x30, 0xB, 0x30, 0x32, 0x6E, 0x40, 0xD, 0x4, 0x4, 0x37,
- 0xA7, 0x30, 0x30, 0x32, 0x40, 0xA7, 0x38, 0x2C, 0x3A, 0x33, 0x3A, 0x30, 0x7, 0x40, 0xB0, 0xBC,
- 0xBB, 0xBA, 0xD8, 0xBC, 0xBB, 0xB6, 0xD8, 0xE9, 0xE9, 0xBC, 0xBD, 0x0, 0x32, 0x32, 0xFE, 0x32,
- 0xFC, 0xEF, 0xE2, 0xED, 0xEF, 0xFE, 0x40, 0xE2, 0xB5, 0xD8, 0xB5, 0x6F, 0x7, 0xB, 0x32, 0xE,
- 0x0, 0xAA, 0x2C, 0x94, 0x94, 0x3B, 0x3C, 0x7, 0x0, 0x0, 0xD, 0x30, 0x33, 0x37, 0x30, 0x25,
- 0x4, 0xE6, 0x79, 0x20, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0x41, 0x33, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xB6, 0x3F, 0xE, 0x2C, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBB, 0xE9, 0x31, 0x1, 0x2D, 0x3A, 0x34,
- 0x2C, 0xA4, 0xEA, 0xF5, 0x33, 0x1, 0x41, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0,
- 0xBD, 0xA3, 0x38, 0x33, 0x31, 0x4, 0xFE, 0x3E, 0x6B, 0x30, 0x6E, 0x3E, 0x38, 0x38, 0x30, 0xB,
- 0x6, 0xD, 0xD, 0x32, 0xA3, 0xA3, 0x3C, 0x3D, 0x6F, 0x33, 0x30, 0xE, 0x33, 0x38, 0xAA, 0xBD,
- 0xBA, 0xB6, 0xA3, 0x41, 0x41, 0x3F, 0x41, 0x41, 0x2C, 0xE, 0xE, 0xE, 0x32, 0xA3, 0x33, 0xE,
- 0x5, 0x5, 0xE, 0x33, 0x40, 0x40, 0x41, 0xA3, 0x94, 0x41, 0x41, 0x38, 0x33, 0x2C, 0x31, 0xE,
- 0xE, 0x9, 0x7, 0x7, 0x7, 0x7, 0x7, 0x9, 0xE, 0xE, 0xE, 0x38, 0x3A, 0x38, 0x40, 0xD,
- 0x0, 0x0, 0x7, 0x0, 0xB, 0x33, 0x7, 0x2C, 0xD, 0x16, 0x16, 0x32, 0x6F, 0xB4, 0xA3, 0xB6,
- 0xB4, 0x3A, 0xB7, 0xA4, 0xA4, 0xA4, 0xA4, 0xB4, 0xB7, 0xB4, 0xA3, 0x3B, 0x33, 0x33, 0x37, 0x30,
- 0x1F, 0xE6, 0x9B, 0x25, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0x3F, 0x33, 0xE9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB8, 0xEE, 0x41, 0x0, 0x1, 0x1, 0x1,
- 0x2C, 0xA8, 0xEA, 0xF5, 0x33, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xD8, 0xA8, 0x3A, 0x33, 0x33, 0x4, 0xFE, 0x39, 0x6E, 0x37, 0xA7, 0x41, 0x3C, 0x3F, 0x6F, 0xA7,
- 0xB0, 0xD7, 0xD8, 0xD8, 0xD8, 0xB6, 0xB4, 0xB4, 0xA8, 0xB7, 0xBB, 0xE9, 0xD8, 0xE9, 0xD8, 0xD8,
- 0xD8, 0xE9, 0xBD, 0xB7, 0xB4, 0xAA, 0xA3, 0xA3, 0xAA, 0xAA, 0xAA, 0xAA, 0xA3, 0xA8, 0xA3, 0xAA,
- 0xB6, 0xBD, 0xBD, 0xD8, 0xE9, 0xE9, 0xE9, 0xE9, 0xB6, 0xB6, 0xA8, 0xA8, 0xAA, 0xA3, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xB4, 0xAA, 0xB4, 0xB4, 0xAA, 0xB4, 0xA3, 0xA3, 0x3C, 0x41, 0xA3,
- 0x41, 0xA3, 0x6F, 0xA9, 0xAA, 0xA7, 0xA9, 0xB6, 0xBC, 0xD8, 0xD8, 0xBD, 0xB6, 0xB6, 0xB7, 0xEA,
- 0xEB, 0xEF, 0xEB, 0xD8, 0xEA, 0xB7, 0xBD, 0xBD, 0xB9, 0xB7, 0xB4, 0xA3, 0x38, 0x38, 0x3C, 0x37,
- 0x1E, 0xE6, 0x9B, 0x29, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0x3A, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x2C, 0xE, 0x33, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6, 0xE9, 0xD8, 0x8, 0x0, 0x0, 0x0,
- 0x12, 0xA4, 0xEA, 0xF5, 0x33, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xD8, 0xAA, 0x3B, 0x38, 0x38, 0x4, 0x0, 0x6E, 0x71, 0x6E, 0xBC, 0xB6, 0xB4, 0xB4, 0xB4, 0xBA,
- 0xBD, 0xEB, 0xF0, 0xF0, 0xEB, 0xE9, 0xEA, 0xE9, 0xE9, 0xD8, 0xE9, 0xF0, 0xEA, 0xF0, 0xFD, 0xF0,
- 0xFD, 0xF0, 0xF1, 0xF1, 0xE9, 0xE9, 0xE9, 0xBD, 0xD8, 0xD8, 0xBD, 0xBD, 0xB7, 0xB7, 0xBD, 0xBD,
- 0xBD, 0xE9, 0xEE, 0xEE, 0xF0, 0xF5, 0xF5, 0xF5, 0xE9, 0xE9, 0xE9, 0xBD, 0xBD, 0xD8, 0xB6, 0xB7,
- 0xB6, 0xB8, 0xB6, 0xB8, 0xB6, 0xB8, 0xB8, 0xBD, 0xBD, 0xBD, 0xB8, 0xB8, 0xB6, 0xB8, 0xAA, 0xAA,
- 0xB4, 0xAA, 0xB6, 0xAA, 0xB8, 0xBB, 0xBB, 0xBD, 0xE9, 0xE9, 0xEE, 0xEE, 0xE9, 0xEA, 0xF0, 0xF0,
- 0xEF, 0xFD, 0xF2, 0xF0, 0xF0, 0xF2, 0xEF, 0xF2, 0xF5, 0xEA, 0xBD, 0xB6, 0x94, 0x3F, 0x40, 0x3A,
- 0x20, 0x9B, 0x29, 0x37, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9, 0xFD, 0xF0, 0x3A, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBD, 0xB6, 0xF0, 0xB7, 0xE, 0x1, 0x0,
- 0x8, 0x94, 0xEA, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xE9, 0xAA, 0x3B, 0x38, 0x3A, 0x4, 0x4, 0x9B, 0x39, 0xAF, 0xF7, 0xEA, 0xE9, 0xE9, 0xE9, 0xEF,
- 0xF7, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xF7, 0xF5, 0xF0, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xF7, 0xF0, 0xF0, 0xF5, 0xF0, 0xF0, 0xF0, 0xF5, 0xF0, 0xF0, 0xF0, 0xF0,
- 0xF5, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xF9, 0xEF, 0xF0, 0xF0, 0xF5, 0xF5, 0xF0,
- 0xF0, 0xEE, 0xE9, 0xEE, 0xF0, 0xF0, 0xEE, 0xF0, 0xF0, 0xF5, 0xEE, 0xF7, 0xE9, 0xE9, 0xF0, 0xBD,
- 0xE9, 0xEA, 0xE9, 0xEE, 0xEE, 0xF0, 0xF7, 0xF5, 0xF5, 0xFD, 0xFD, 0xF7, 0xFD, 0xF5, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xBD, 0xA8, 0x94, 0x94, 0x3F,
- 0x30, 0x3E, 0xB5, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xEA, 0xBD, 0xE9, 0xF5, 0xE9, 0xA3, 0x3A,
- 0x8, 0x3A, 0xE9, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xEA, 0xB4, 0x3F, 0x3A, 0x3C, 0x4, 0x0, 0x6E, 0x29, 0xAF, 0xFD, 0xF7, 0xF8, 0xF7, 0xFD, 0xF7,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xFD, 0xF7, 0xF5, 0xFD,
- 0xF5, 0xF5, 0xF5, 0xFD, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xEA, 0xBD, 0xB4, 0xB4, 0xB7,
- 0xF1, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x31, 0xE9, 0xF7, 0xB6, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xEA, 0xD8, 0xF5, 0xF7, 0xF5, 0xF0,
- 0xB6, 0xB4, 0xE9, 0xF5, 0x33, 0x1, 0x3B, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xFB, 0xF4, 0xF4, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xE9, 0xB6, 0x3F, 0x3A, 0x41, 0x5, 0x0, 0x3E, 0x20, 0xA9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xEA, 0xE9, 0xE9, 0xE9,
- 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xE, 0xA3, 0xD8, 0xF7, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xD8, 0xBD, 0x38, 0xAA, 0xE9, 0xF0, 0xF7,
- 0xF8, 0xF0, 0xBD, 0xF0, 0xB4, 0x2C, 0x33, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF8, 0xED, 0xD3, 0x8F, 0x92, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xE9, 0xAA, 0x3C, 0x3F, 0x6F, 0xB, 0xFE, 0x4, 0x4, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xF0, 0xF5, 0xF5,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0x94, 0xE, 0xE, 0x31, 0xAA, 0xF9, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBB, 0xBD, 0xE, 0x12, 0x3B, 0x41, 0xA3,
- 0xBD, 0xF0, 0xF0, 0xF5, 0xF8, 0xF0, 0xE9, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xE0, 0xD3, 0x84, 0x88, 0x88, 0x93, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xEA, 0xB4, 0x41, 0x3A, 0x23, 0x4, 0xB, 0x30, 0xFE, 0xB5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x41, 0xB6, 0xF9, 0xFD, 0xF8, 0xBD, 0x33, 0xF8,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xA3, 0xBD, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xFB, 0xF4, 0xF4, 0xDF, 0xDD, 0xDD, 0xDD, 0xF4, 0xFB, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x0, 0x3, 0x8, 0x2C,
- 0x3B, 0x94, 0xAA, 0xBD, 0xF0, 0xF5, 0xF5, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xED,
- 0xD3, 0x8A, 0x86, 0x87, 0x89, 0x91, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5,
- 0xE9, 0xB4, 0x6F, 0x3E, 0xC, 0xFE, 0x4, 0xB, 0xFE, 0x3E, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB7, 0x94,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xB6, 0x41, 0x2C, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF7, 0xDC, 0x91, 0x8F, 0x8F, 0x89, 0x88, 0x88, 0x88, 0x8F, 0x93, 0xDF, 0xFB,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x0, 0x0, 0x1, 0x1,
- 0xF, 0x12, 0x2D, 0x38, 0xA4, 0xB7, 0xEA, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xEE, 0xD4, 0x8A,
- 0x86, 0x87, 0x87, 0x89, 0xD4, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7,
- 0xE9, 0xB4, 0x41, 0x3F, 0x30, 0x0, 0xFE, 0xFE, 0x0, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0x3F, 0xFD, 0xFD, 0xF9, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xEE, 0xB1, 0x83, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x89, 0x92,
- 0xDF, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xE9, 0x33, 0x0, 0x0, 0x0, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0x12, 0x3A, 0xB4, 0xF7, 0xFD, 0xFD, 0xF9, 0xF5, 0xD9, 0x8D, 0x89, 0x85,
- 0x87, 0x87, 0x87, 0x90, 0xF4, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xE9, 0xB6, 0x94, 0xA3, 0x94, 0x3A, 0x3A, 0x94, 0xA3, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x38, 0xE9, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xAA, 0xF5, 0xE9, 0xB6, 0xA3, 0x38, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xEE, 0xA8, 0x69, 0x7E, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x88, 0x89, 0x93, 0xDF, 0xFB, 0xFC, 0xFD, 0xFD, 0xE9, 0xB6, 0xEA, 0xF0, 0xB7, 0x41, 0x2C, 0x7,
- 0x0, 0x0, 0x0, 0x0, 0x1, 0x8, 0x94, 0xF5, 0xF9, 0xF4, 0xD9, 0x8D, 0x86, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x88, 0x93, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xD8, 0xAA, 0xAA, 0xB4, 0xBD, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x2C, 0xA3, 0xE, 0xFD, 0xFD, 0xBD, 0x38,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0x94, 0xE, 0x2C, 0xAA, 0xBD, 0xF0, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xED, 0xB3, 0x72, 0x66, 0x7E, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x89, 0x92, 0xDD, 0xF4, 0xFB, 0xF0, 0xB7, 0xB6, 0xBD, 0xEA, 0xF0, 0xE9, 0xB4,
- 0x3B, 0x2C, 0x7, 0x0, 0x0, 0x8, 0x41, 0xF0, 0xD9, 0x8D, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x89, 0xDA, 0xF4, 0xF4, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6, 0x3F, 0xFD, 0xFD, 0x2C, 0xEE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0x41, 0x33, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF7, 0xE0, 0x90, 0x84, 0x84, 0x82, 0x7E, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0x8F, 0xDD, 0xDF, 0xED, 0xD8, 0xB7, 0xB6, 0xB6, 0xBD, 0xE9,
- 0xEA, 0xD8, 0xB6, 0x3A, 0x1, 0x3, 0x41, 0xED, 0x8F, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x89, 0x8F, 0x8F, 0x92, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0x3F, 0x33, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xEA, 0xAE, 0x83, 0x87, 0x87, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x89, 0x92, 0xDF, 0xF4, 0xEB, 0xBD, 0xB7, 0xE9,
- 0xE9, 0xEA, 0xE9, 0xEE, 0x2C, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x92, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF8, 0xD8, 0x6D, 0x7E, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x8F, 0xDD, 0xD6, 0xEE, 0xB6,
- 0xBB, 0xEE, 0xD8, 0xE0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0xDD, 0xDF, 0xF4, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0xE, 0x2C, 0x41, 0xB6, 0xF5,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xBA, 0x74, 0x7F, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x75, 0xD6, 0x38,
- 0x2C, 0xB4, 0xE0, 0xDC, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x89, 0x89, 0x8F, 0x93, 0xF4, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF8, 0xBD, 0xA3, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF0, 0xAE, 0x63, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x37,
- 0x3, 0x3F, 0xD8, 0xDF, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x8F, 0x93, 0xFB, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xD6, 0x76, 0x80, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x37,
- 0x1, 0x3A, 0xD8, 0xDF, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x92, 0xFB, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xD8, 0xE, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xAE, 0x63, 0x80, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x37,
- 0x1, 0x3A, 0xD8, 0xDF, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0xD3, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x41, 0xBD, 0xFD, 0xF0, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xEA, 0xFD, 0x3C, 0xE, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xBB, 0xA7, 0x6A, 0x62, 0x7F, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x37,
- 0x1, 0x3B, 0xD8, 0xDC, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0xDD, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0x41, 0xE, 0x2C, 0xB6,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xBD, 0x38, 0xF7, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xE9, 0xB7, 0xA7, 0x6A, 0x62, 0x80, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x37,
- 0x1, 0x3B, 0xBB, 0xDC, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x89, 0xDD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF0, 0x33, 0xEA, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF7, 0xE9, 0xB6, 0x72, 0x6A, 0x62, 0x7F, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x37,
- 0x1, 0x2D, 0x3F, 0x38, 0x1, 0x8, 0x41, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x84, 0x91, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xEA,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xE, 0xA3, 0xFD, 0x2C, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xEA, 0xB8, 0xA7, 0x6A, 0x62, 0x7F, 0x85, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0xD1, 0x7A,
- 0x0, 0x1, 0x3, 0x1, 0x1, 0x8, 0x41, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x84, 0x8E, 0xDC, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xFD, 0xFD, 0xFD, 0x41, 0xFD, 0xFD, 0x2C,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF7, 0xEA, 0xB8, 0xA7, 0x6A, 0x61, 0x80, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x5F, 0x8B, 0xD2,
- 0x5, 0x0, 0x0, 0x0, 0x0, 0x8, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x89, 0x8A, 0xD3, 0xE0, 0xF7, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xAA, 0xFD, 0xBB, 0xE, 0xF0, 0xE9, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x41, 0xB6, 0xF0, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xE9, 0xB6, 0x6F, 0x5E, 0x80, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0x8F, 0x89, 0x5F, 0x60, 0xD9,
- 0x3E, 0x0, 0x0, 0x0, 0x1, 0x3, 0x3E, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x86, 0x8A, 0xD4, 0xED, 0xF7, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB4, 0xE, 0x31, 0xB6, 0xE, 0xE, 0xB6,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xB7, 0xB4, 0x38, 0x2C, 0x41, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xEB, 0xB0, 0x69, 0x7F, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x83, 0xD4, 0xDA, 0xDF, 0xD3, 0x61, 0x75,
- 0xDC, 0x37, 0x4, 0xFE, 0x0, 0x0, 0x3E, 0xDF, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x86, 0x8E, 0xED, 0xF7, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xA3, 0xFD, 0xFD, 0xF9, 0xBD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF4, 0xD9, 0x8D, 0x83, 0x85, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0x23, 0x72, 0xE0, 0xD4, 0x60,
- 0x76, 0xDA, 0xD2, 0x70, 0x30, 0x38, 0xD6, 0x92, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x89, 0xDD, 0xF4, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x31, 0xBD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF4, 0xD4, 0x90, 0x89, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x2D, 0xB0, 0xD4, 0x75,
- 0x75, 0x76, 0x8C, 0xD3, 0xD6, 0xD9, 0x8D, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x88, 0x8F, 0xDD, 0xDF, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xB4, 0x41, 0xFD, 0xFD, 0xAA, 0x38, 0xEE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0x2C, 0x41, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xF9, 0xEE, 0xD4, 0x90, 0x89, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0xA8, 0xDA, 0xD9,
- 0xD2, 0xD9, 0xD1, 0xD1, 0xDC, 0xDC, 0xDD, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x8F, 0x93, 0xDF, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xE9, 0xA3, 0xFD, 0xFD, 0xD8, 0x2C,
- 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xF7, 0xBB, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xEE, 0xD3, 0x8A, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0xA3, 0xED, 0xED,
- 0x23, 0xA7, 0xE0, 0xF0, 0x38, 0x72, 0xDC, 0xDD, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x89, 0x92, 0xDF, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD, 0xB6, 0xA8, 0xFD, 0xEE, 0xE,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xD8, 0xA3, 0xE, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF8, 0xE9, 0x8C, 0x86, 0x87, 0x85, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xB, 0x8, 0x94, 0xE0, 0xED,
- 0x4, 0x2D, 0xAA, 0xF0, 0x23, 0xE, 0xA8, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x8F, 0xDF, 0xFB, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xE, 0x2C, 0xBD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xB4, 0xF7, 0xD8, 0x33, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF7, 0xD8, 0x7A, 0x75, 0x63, 0x61, 0x62, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xB, 0x8, 0x94, 0xE0, 0xE0,
- 0x4, 0x8, 0x94, 0xF0, 0x23, 0x7, 0x41, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0xDD, 0xFB, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xF8, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF0, 0xBD, 0xB0, 0x78, 0x63, 0x80, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0x94, 0xDC, 0xE0,
- 0x4, 0x8, 0x94, 0xF0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x93, 0xFB,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xA3, 0xFD, 0xFD, 0xF8, 0x41, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A, 0xEE, 0xFD, 0xE9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF7, 0xE9, 0x7C, 0x86, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0x94, 0xDC, 0xE0,
- 0x4, 0x8, 0x94, 0xF0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0xDD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xA3, 0xBD, 0x31, 0xBD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x31, 0xE, 0x2C, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xF0, 0xAE, 0x83, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0x94, 0xE0, 0xE0,
- 0x4, 0x8, 0x94, 0xF0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x92,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0x31, 0x2C, 0xF8, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xF9, 0xEA, 0xA7, 0x61, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0xA3, 0xED, 0xED,
- 0x0, 0x8, 0x94, 0xF0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x85, 0x86, 0x89, 0xDD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0x31, 0xBD, 0xB6, 0xA3, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xD8, 0xA3, 0xE, 0x2C, 0x41, 0xBB, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF5, 0xB8, 0x6C, 0x62, 0x80, 0x80, 0x7F, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x63, 0xB3, 0xC, 0x8, 0xA4, 0xEE, 0xEE,
- 0x1, 0x8, 0x94, 0xF0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x8A, 0xDD, 0xF4,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x41, 0xF8, 0xFD, 0xFD, 0xB6, 0xA3, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xB4, 0xF7, 0xD8, 0x33, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xF9, 0xF0, 0xB6, 0x7A, 0x78, 0x69, 0x60, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x7D, 0x73, 0xBA, 0xE, 0x8, 0xA4, 0xF0, 0xF0,
- 0x7, 0x8, 0x94, 0xF0, 0x23, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0xDD, 0xFC,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xF8, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xF9, 0xF7, 0xEB, 0xB8, 0x70, 0x7E, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x84, 0x74, 0xAE, 0xBD, 0xE, 0x8, 0xA4, 0xF5, 0xF5,
- 0x7, 0x8, 0xA4, 0xF0, 0x2C, 0x1, 0x3F, 0xDF, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x80, 0x73, 0x73, 0x81, 0x80, 0x85, 0x87, 0x87, 0x87, 0x85, 0x86, 0x86, 0x89, 0x92, 0xFB,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A, 0xEE, 0xFD, 0xE9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBA, 0x74, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x88, 0x84, 0x8E, 0xD9, 0xBB, 0xB7, 0xBD, 0xE, 0x8, 0xAA, 0xF0, 0xF5,
- 0x8, 0x8, 0xA4, 0xF5, 0x2D, 0x1, 0x3F, 0xE0, 0x84, 0x85, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x88, 0x84, 0x7B, 0x7A, 0x70, 0x73, 0x82, 0x83, 0x84, 0x8B, 0xB1, 0xB1, 0xD3, 0xDF, 0xFC,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x31, 0xE, 0x2C, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xB7, 0x6A, 0x7E, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x89, 0x8D, 0xD9, 0xF4, 0xF8, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x48, 0xB6, 0xB4,
- 0x3, 0x12, 0xA4, 0xF5, 0x33, 0x1, 0x41, 0xEA, 0x7A, 0x61, 0x80, 0x87, 0x87, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x86, 0x8D, 0xD6, 0xB6, 0xAE, 0xD1, 0xD9, 0xEE, 0xF0, 0xF0, 0xF5, 0xF9, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xE9, 0xA8, 0x70, 0x63, 0x81, 0x80, 0x83, 0x61, 0x62, 0x85, 0x87,
- 0x87, 0x86, 0x8A, 0xD9, 0xF5, 0xF9, 0xFD, 0xFD, 0xE9, 0xBD, 0xE9, 0x31, 0x1, 0x12, 0x2D, 0xE,
- 0x1, 0x12, 0xA4, 0xF1, 0x34, 0x3, 0x41, 0xF0, 0xBB, 0x72, 0x6A, 0x60, 0x85, 0x87, 0x87, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x88, 0x92, 0xED, 0xF0, 0xF5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB7, 0x2C, 0xE, 0x38, 0xE9, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x2C, 0xE, 0x31, 0xAA, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xE9, 0xBA, 0xBA, 0xD6, 0xD8, 0xB4, 0x72, 0x74, 0x76,
- 0xD1, 0xDC, 0xF5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6, 0xEE, 0xAA, 0x1, 0x1, 0x1, 0x1,
- 0x1, 0x3, 0x2D, 0x2D, 0x1, 0x8, 0x94, 0xF5, 0xF8, 0xEE, 0xB7, 0xA7, 0x68, 0x62, 0x7F, 0x87,
- 0x87, 0x87, 0x87, 0x87, 0x87, 0x89, 0xDF, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF0, 0xFD, 0xF0, 0x3A, 0xB6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9, 0xFD, 0xF0, 0x3A, 0xA3, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF7, 0xF7, 0xF8, 0xF0, 0xE9, 0xD8, 0xE0,
- 0xF5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6, 0xD8, 0xEE, 0x31, 0x0, 0x0, 0x0,
- 0x1, 0x1, 0x1, 0x1, 0x0, 0x8, 0x94, 0xF7, 0xFD, 0xF9, 0xF7, 0xE9, 0xB4, 0x72, 0x69, 0x62,
- 0x85, 0x87, 0x87, 0x87, 0x89, 0x93, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x31, 0xBD, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xF9,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBD, 0xB6, 0xEE, 0xBD, 0x31, 0x1, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x1, 0x8, 0x41, 0xF7, 0xFD, 0xFD, 0xFD, 0xF9, 0xF5, 0xD8, 0xB0, 0x72,
- 0x61, 0x7E, 0x85, 0x89, 0xDD, 0xF4, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0x33, 0xFD, 0xFD, 0xF0, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x3A, 0xF0, 0xFD, 0xE9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xEE, 0xD8, 0xEA, 0xF8, 0xF0, 0xB4, 0x41,
- 0x2C, 0xE, 0x1, 0x0, 0x1, 0x1, 0x41, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF0, 0xE9,
- 0xB0, 0xAE, 0xB3, 0xDC, 0xFB, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xBB, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x31, 0xE, 0x2C, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF5, 0xE9, 0xE9, 0xA4, 0xBD, 0xF5, 0xF8, 0xF8,
- 0xF5, 0xEE, 0xAA, 0x2C, 0x1, 0xE, 0xB4, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF7, 0xF5, 0xF7, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xEA, 0xBD, 0xBD, 0xE, 0x33, 0xA4, 0xB6, 0xE9,
- 0xF5, 0xF5, 0xF0, 0xE9, 0xAA, 0xB7, 0xF0, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x2C, 0xE, 0x31, 0xAA, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x3A, 0xA3, 0xB6, 0xE9, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x1A, 0x34, 0x48,
- 0xBD, 0xF0, 0xEA, 0xE9, 0xF0, 0xF0, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9, 0xFD, 0xF0, 0x3A, 0xA3, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xE9, 0xB6, 0x3C, 0xE, 0x3A, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x1, 0xF, 0x12,
- 0x48, 0xBD, 0xF0, 0xEA, 0xBD, 0xEE, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xF9, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xBD, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x0, 0x1, 0x1, 0x1,
- 0x12, 0x94, 0xE9, 0xF5, 0x33, 0x3A, 0xD8, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xAA, 0x3A, 0xF0, 0xFD, 0xE9, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF9, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x0, 0x1, 0x1, 0x0,
- 0x1, 0x34, 0xB7, 0xF7, 0x31, 0x8, 0xA4, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x31, 0xE, 0x2C, 0xE9, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x2C, 0x38, 0xB4, 0xF5, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x1, 0x2D, 0x48, 0x3A,
- 0x0, 0x12, 0xAA, 0xF5, 0x31, 0x3, 0x94, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x3A, 0xFD, 0xF5, 0xAA, 0x33, 0xE, 0x2C, 0xA3, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x7, 0xA4, 0xF5, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xB6, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF5,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBD, 0xA3, 0x31, 0x2C, 0x3F, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0x31, 0xE, 0x31, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x33, 0x3, 0x41, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB4, 0xA8, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xBD, 0xFD, 0xE, 0xA3, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF5,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xF9, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xF8, 0xFD, 0xE, 0xF9, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF0, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x31, 0xE, 0xB6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x3A, 0xFD, 0xE, 0xF0, 0x2C, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB4, 0xB6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0xFD, 0xE, 0x2C, 0xD8, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x41, 0xBB, 0xF7, 0xF9, 0xE, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x31, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xB6, 0x41, 0xE, 0xE, 0xB6, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xB6, 0x2C, 0xE, 0x33, 0xE9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF0,
- 0x7, 0x8, 0xA4, 0xF5, 0x33, 0x3, 0x48, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0xE9, 0xFD, 0xF0, 0x3A, 0xB6, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x8, 0xAA, 0xF5, 0xF0,
- 0x7, 0x7, 0x3B, 0xAB, 0x12, 0x3, 0x94, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6, 0xFD, 0xFD, 0xF9, 0xE, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xBD, 0xE, 0x7, 0xA4, 0xF5, 0xF5,
- 0x7, 0x1, 0x8, 0x8, 0x1, 0x8, 0x94, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x2C, 0x31, 0xE9, 0xF7, 0xB6, 0xB4, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xBD, 0xE9, 0x33, 0x7, 0x3B, 0xF0, 0xF8,
- 0x33, 0x0, 0x1, 0x1, 0x1, 0x8, 0x94, 0xF7, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xE, 0xA3, 0xD8, 0xF7, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xE9, 0xB6, 0xEA, 0xE9, 0xAA, 0xA4, 0xE9, 0xF0,
- 0xB6, 0x7, 0x0, 0x0, 0x1, 0x8, 0x41, 0xF5, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF7, 0xBB, 0x41, 0x2C, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF0, 0xB6, 0xB4, 0xBD, 0xE9, 0xEA, 0xBD, 0xB6,
- 0xF5, 0xA8, 0x7, 0x0, 0x0, 0x1, 0x41, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9, 0xF0, 0xD8, 0xB7, 0xBB, 0xE9, 0xD8, 0xB4,
- 0xBD, 0xF0, 0xB6, 0x3A, 0xE, 0x2C, 0xB7, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF8, 0xF7, 0xF5, 0xF8, 0xF7, 0xE9,
- 0xB4, 0xBD, 0xEA, 0xEA, 0xB7, 0xBD, 0xF0, 0xF8, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xF9,
- 0xF5, 0xF0, 0xF5, 0xF8, 0xF9, 0xF9, 0xF9, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD,
- 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD
-
-};
diff --git a/backends/platform/gp32/globals.h b/backends/platform/gp32/globals.h
deleted file mode 100644
index 49f11ddb4e..0000000000
--- a/backends/platform/gp32/globals.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GLOBALS_H
-#define __GLOBALS_H
-
-enum {
- FM_QUALITY_LOW = 0,
- FM_QUALITY_MED,
- FM_QUALITY_HI
-};
-
-struct GlobalVars {
- uint16 cpuSpeed;
- uint16 gammaRamp;
- uint8 fmQuality;
- uint32 sampleRate;
-};
-
-extern GlobalVars g_vars;
-
-#endif
diff --git a/backends/platform/gp32/gp32_launcher.cpp b/backends/platform/gp32/gp32_launcher.cpp
deleted file mode 100644
index 9931118f08..0000000000
--- a/backends/platform/gp32/gp32_launcher.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-#include "common/file.h"
-
-#include "engines/engine.h"
-
-#include "gp32std.h"
-#include "gp32std_grap.h"
-#include "gp32std_input.h"
-#include "gp32_launcher.h"
-
-#include "gfx_splash.h"
-#include "globals.h"
-
-uint16 cpuSpeedTable[15] = {40, 66, 100, 120, 133, 144, 156, 160, 166, 172, 176, 180, 188, 192, 200};
-uint16 gammaTable[16] = {5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000, 20000};
-char *oplTable[3] = {"LOW", "MEDIUM", "HIGH"};
-uint16 sampleTable[4] = {0, 11025, 22050, 44100};
-
-uint8 maxTable[5] = {15, 16, 3, 3, 2};
-uint8 currentSetting[5] = {2, 5, 1, 1, 0};
-
-void writeConfigVars() {
- Common::File file;
-
- g_vars.cpuSpeed = cpuSpeedTable[currentSetting[0]];
- g_vars.gammaRamp = gammaTable[currentSetting[1]];
- g_vars.fmQuality = currentSetting[2];
- g_vars.sampleRate = sampleTable[currentSetting[3]];
-
- if (!file.open("gp:\\gpetc\\scummvm.cfg", Common::File::kFileWriteMode)) {
- return;
- }
- file.writeByte(currentSetting[0]);
- file.writeByte(currentSetting[1]);
- file.writeByte(currentSetting[2]);
- file.writeByte(currentSetting[3]);
- file.close();
-}
-
-void readConfigVars() {
- Common::File file;
- if (!file.open("gp:\\gpetc\\scummvm.cfg", Common::File::kFileReadMode)) {
- currentSetting[0] = 2;
- currentSetting[1] = 5;
- currentSetting[2] = 1;
- currentSetting[3] = 1;
- writeConfigVars();
- return;
- }
- currentSetting[0] = file.readByte();
- currentSetting[1] = file.readByte();
- currentSetting[2] = file.readByte();
- currentSetting[3] = file.readByte();
- g_vars.cpuSpeed = cpuSpeedTable[currentSetting[0]];
- g_vars.gammaRamp = gammaTable[currentSetting[1]];
- g_vars.fmQuality = currentSetting[2];
- g_vars.sampleRate = sampleTable[currentSetting[3]];
- file.close();
-}
-
-void configMenu() {
- uint32 nKeyUD;
- uint16 nKeyP;
-
- int currentSelect = 0;
- char text[32];
-
- // OK / CANCEL
- currentSetting[4] = 0;
-
- while (1) {
- gp_fillRect(frameBuffer2, 0, 0, 320, 240, 0xffff);
- gp_textOut(frameBuffer2, 90, 10, "Configuration Menu", 0);
-
- gp_textOut(frameBuffer2, 30, 40, "CPU clock speed", 0);
- gp_textOut(frameBuffer2, 30, 80, "Gamma ramp", 0);
- gp_textOut(frameBuffer2, 30, 120, "FMOPL (AdLib) quality", 0);
- gp_textOut(frameBuffer2, 30, 160, "Sampling rate", 0);
-
- gp_textOut(frameBuffer2, 100, 210, "OK CANCEL", 0);
-
- if (currentSelect == 4) {
- gp_textOut(frameBuffer2, 80 + currentSetting[4] * 100, 210, "@", 0);
- } else
- gp_textOut(frameBuffer2, 20, (currentSelect + 1) * 40, "@", 0);
-
- sprintf(text, "%d MHz", cpuSpeedTable[currentSetting[0]]);
- gp_textOut(frameBuffer2, 220, 40, text, 0);
- sprintf(text, "%.2f", (float)gammaTable[currentSetting[1]] / 10000);
- gp_textOut(frameBuffer2, 220, 80, text, 0);
- gp_textOut(frameBuffer2, 220, 120, oplTable[currentSetting[2]], 0);
- if (sampleTable[currentSetting[3]] == 0) {
- strcpy(text, "NO SOUND");
- } else {
- sprintf(text, "%d Hz", sampleTable[currentSetting[3]]);
- }
- gp_textOut(frameBuffer2, 220, 160, text, 0);
-
- gp_flipScreen();
-
- gp_getButtonEvent(&nKeyUD, &nKeyP);
-
- if (gpd_getButtonDown(nKeyUD, GPC_VK_UP)) {
- if (currentSelect > 0)
- currentSelect--;
- }
- if (gpd_getButtonDown(nKeyUD, GPC_VK_DOWN)) {
- if (currentSelect < 4)
- currentSelect++;
- }
- if (gpd_getButtonDown(nKeyUD, GPC_VK_LEFT)) {
- if (currentSelect <= 4)
- if (currentSetting[currentSelect] > 0)
- currentSetting[currentSelect]--;
- }
- if (gpd_getButtonDown(nKeyUD, GPC_VK_RIGHT)) {
- if (currentSelect <= 4)
- if (currentSetting[currentSelect] < maxTable[currentSelect] - 1)
- currentSetting[currentSelect]++;
- }
-
- if (gpd_getButtonUp(nKeyUD, GPC_VK_START) ||
- gpd_getButtonUp(nKeyUD, GPC_VK_FA)) {
- if (currentSelect == 4) {
- if (currentSetting[currentSelect] == 0) { // OK
- writeConfigVars();
- return;
- } else { // CANCEL
- return;
- }
- }
- }
- }
-}
-
-void splashScreen() {
- uint32 nKeyUD;
- uint16 nKeyP;
-
- while (1) {
- uint16 *buffer = frameBuffer2;//&frameBuffer1[240 - _screenHeight];
- uint8 *picBuffer = gfx_splash;
-
- for (int c = 0; c < LCD_WIDTH * LCD_HEIGHT; c++) {
- *buffer++ = gfx_splash_Pal[*picBuffer++];
- }
-
- gp_flipScreen();
-
- while (1) {
- gp_getButtonEvent(&nKeyUD, &nKeyP);
-
- if (gpd_getButtonUp(nKeyUD, GPC_VK_START) ||
- gpd_getButtonUp(nKeyUD, GPC_VK_FA)) {
- gp_fillRect(frameBuffer1, 0, 0, 320, 240, 0xffff);
- gp_fillRect(frameBuffer2, 0, 0, 320, 240, 0xffff);
- return;
- }
- if (gpd_getButtonUp(nKeyUD, GPC_VK_SELECT)) {
- configMenu();
- break;
- }
- }
- }
-}
diff --git a/backends/platform/gp32/gp32_launcher.h b/backends/platform/gp32/gp32_launcher.h
deleted file mode 100644
index fee9e9b60e..0000000000
--- a/backends/platform/gp32/gp32_launcher.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32_LAUNCHER_H
-#define __GP32_LAUNCHER_H
-
-#include "common/scummsys.h"
-
-extern void readConfigVars();
-
-extern void splashScreen();
-
-#endif
diff --git a/backends/platform/gp32/gp32_main.cpp b/backends/platform/gp32/gp32_main.cpp
deleted file mode 100644
index 3db3dfe553..0000000000
--- a/backends/platform/gp32/gp32_main.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-
-#include "common/config-manager.h"
-
-#include "base/main.h"
-
-#include "gp32std.h"
-#include "gp32std_grap.h"
-
-#include "gp32_launcher.h"
-#include "gp32_osys.h"
-#include "globals.h"
-
-GlobalVars g_vars;
-
-void init() {
- gp_setCpuSpeed(40); // Default CPU Speed
-
- GpGraphicModeSet(16, NULL);
-
- //if (type == NLU || type == FLU || type == BLU)
- // gp_initFramebuffer(frameBuffer, 16, 85);
- //else if (type == BLUPLUS)
- // gp_initFramebufferBP(frameBuffer, 16, 85);
- // else
- // error("Invalid Console");
- gp_initFrameBuffer();
-
- GpFatInit();
- GpRelativePathSet("gp:\\gpmm");
-}
-
-void GpMain(void *arg) {
- extern void memBlockInit();
- memBlockInit();
-
- init();
-
- readConfigVars();
-
- splashScreen();
-
- //doConfig
- gp_initGammaTable((float)g_vars.gammaRamp / 10000);
- gp_setCpuSpeed(g_vars.cpuSpeed);
- GPDEBUG("Set CPU Speed: %d", g_vars.cpuSpeed);
-
- // FOR DEBUG PURPOSE!
- //int argc = 4;
- //char *argv[] = { "scummvm", "-enull", "-pgp:\\game\\dott\\", "tentacle" };
- //int argc = 2;
- //char *argv[] = { "scummvm", "-d5" };
-
- extern OSystem *OSystem_GP32_create();
- g_system = OSystem_GP32_create();
- assert(g_system);
-
- // Invoke the actual ScummVM main entry point:
- //int res = scummvm_main(argc, argv);
- int res = scummvm_main(1, NULL);
-
- extern void memBlockDeinit();
- memBlockDeinit();
-
- g_system->quit(); // TODO: Consider removing / replacing this!
-
- //return res;
-}
diff --git a/backends/platform/gp32/gp32_osys.cpp b/backends/platform/gp32/gp32_osys.cpp
deleted file mode 100644
index 866d97e966..0000000000
--- a/backends/platform/gp32/gp32_osys.cpp
+++ /dev/null
@@ -1,792 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-#include "common/system.h"
-
-#include "common/rect.h"
-#include "common/savefile.h"
-#include "common/config-manager.h"
-#include "graphics/surface.h"
-
-#include "gp32_osys.h"
-#include "globals.h"
-
-static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
- {0, 0, 0}
-};
-
-OSystem_GP32::OSystem_GP32() :
- _screenWidth(0), _screenHeight(0), _gameScreen(NULL), _hwScreen(NULL),
- _overlayVisible(false), _forceFull(false), _adjustAspectRatio(false),
- /*_paletteDirtyStart(0), _paletteDirtyEnd(0),*/
- _mouseBuf(NULL), _mouseHeight(0), _mouseWidth(0), _mouseKeyColor(0),
- _mouseHotspotX(0), _mouseHotspotY(0) {
- NP("OSys::OSystem_GP32()");
- // allocate palette storage
- memset(_currentPalette, 0, 256 * sizeof(uint16));
-
- memset(&_km, 0, sizeof(_km));
-
- // HACK: bring mouse cursor to center
- _mouseX = 160;
- _mouseY = 120;
-}
-
-OSystem_GP32::~OSystem_GP32() {
- NP("OSys::~OSystem_GP32()");
-}
-
-bool OSystem_GP32::hasFeature(Feature f) {
- NP("OSys::hasFeature()");
- return false;
-}
-
-void OSystem_GP32::setFeatureState(Feature f, bool enable) {
- NP("OSys::setFeatureState()");
-}
-
-bool OSystem_GP32::getFeatureState(Feature f) {
- NP("OSys::getFeatureState()");
- return false;
-}
-
-const OSystem::GraphicsMode* OSystem_GP32::getSupportedGraphicsModes() const {
- NP("OSys::getSupportedGraphicsModes()");
- return s_supportedGraphicsModes;
-}
-
-
-int OSystem_GP32::getDefaultGraphicsMode() const {
- NP("OSys::getSupportedGraphicsModes()");
- return -1;
-}
-
-bool OSystem_GP32::setGraphicsMode(int mode) {
- NP("OSys::setGraphicsMode()");
- return true;
-}
-
-bool OSystem_GP32::setGraphicsMode(const char *name) {
- NP("OSys::setGraphicsMode()");
- return true;
-}
-
-int OSystem_GP32::getGraphicsMode() const {
- NP("OSys::getGraphicsMode()");
- return -1;
-}
-
-void OSystem_GP32::initSize(uint width, uint height) {
- NP("OSys::initSize()");
-
- if (width == _screenWidth && height == _screenHeight)
- return;
-
- _screenWidth = width;
- _screenHeight = height;
-
- if (height != 200)
- _adjustAspectRatio = false;
-
- _overlayWidth = width;
- _overlayHeight = height;
-// _overlayWidth = 320;
-// _overlayHeight = 240;
-
- // Create the surface that contains the 8 bit game data
- _gameScreen = new uint8[_screenWidth * _screenHeight];
-
- // Create the surface that contains the scaled graphics in 16 bit mode
- _tmpScreen = frameBuffer2;
-
- // Create the surface that is connected with hardware screen
- _hwScreen = frameBuffer1;
-
- _overlayBuffer = new OverlayColor[_overlayWidth * _overlayHeight];
-
- _km.x_max = _screenWidth - 1;
- _km.y_max = _screenHeight - 1;
- _km.x = _mouseX;
- _km.y = _mouseY;
- _km.delay_time = 25;
- _km.last_time = 0;
-
- // Clear Screen
- gp_fillRect(_hwScreen, 0, 0, 320, 240, 0xFFFF);
-}
-
-int16 OSystem_GP32::getHeight() {
- //NP("OSys::getHeight()");
- return _screenHeight;
-}
-
-int16 OSystem_GP32::getWidth() {
- //NP("OSys::getWidth()");
- return _screenWidth;
-}
-
-void OSystem_GP32::setPalette(const byte *colors, uint start, uint num) {
- //NP("OSys::setPalette()");
- const byte *b = colors;
- uint i;
- uint16 *base = _currentPalette + start;
- for (i = 0; i < num; i++) {
- base[i] = gp_RGBTo16(b[0], b[1], b[2]);
- b += 4;
- }
-
-// if (start < _paletteDirtyStart)
-// _paletteDirtyStart = start;
-
-// if (start + num > _paletteDirtyEnd)
-// _paletteDirtyEnd = start + num;
-}
-
-void OSystem_GP32::grabPalette(byte *colors, uint start, uint num) {
- NP("OSys::grabPalette()");
-}
-
-void OSystem_GP32::copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h) {
- //NP("OSys::copyRectToScreen()");
- //Clip the coordinates
- if (x < 0) {
- w += x;
- src -= x;
- x = 0;
- }
-
- if (y < 0) {
- h += y;
- src -= y * pitch;
- y = 0;
- }
-
- if (w > _screenWidth - x) {
- w = _screenWidth - x;
- }
-
- if (h > _screenHeight - y) {
- h = _screenHeight - y;
- }
-
- if (w <= 0 || h <= 0)
- return;
-
- byte *dst = _gameScreen + y * _screenWidth + x;
-
- if (_screenWidth == pitch && pitch == w) {
- memcpy(dst, src, h * w);
- } else {
- do {
- memcpy(dst, src, w);
- src += pitch;
- dst += _screenWidth;
- } while (--h);
- }
-}
-
-Graphics::Surface *OSystem_GP32::lockScreen() {
- _framebuffer.pixels = _gameScreen;
- _framebuffer.w = _screenWidth;
- _framebuffer.h = _screenHeight;
- _framebuffer.pitch = _screenWidth;
- _framebuffer.bytesPerPixel = 1;
-
- return &_framebuffer;
-}
-
-void OSystem_GP32::unlockScreen() {
- // The screen is always completely update anyway, so we don't have to force a full update here.
-}
-
-//TODO: Implement Dirty rect?
-void OSystem_GP32::updateScreen() {
- uint16 *buffer;
- //TODO: adjust shakePos
-
- // draw gamescreen
- buffer = &_tmpScreen[240 - _screenHeight];
- for (int x = 0; x < _screenWidth; x++) {
- for (int y = 0; y < _screenHeight; y++) {
- *buffer++ = _currentPalette[_gameScreen[((_screenHeight - 1) - y) * _screenWidth + x]];
- }
- buffer += 240 - _screenHeight;
- }
-
- // draw overlay
- if (_overlayVisible) {
- buffer = &_tmpScreen[240 - _overlayHeight];
- for (int x = 0; x < _overlayWidth; x++) {
- for (int y = 0; y < _overlayHeight; y++) {
- *buffer++ = _overlayBuffer[((_overlayHeight - 1) - y) * _overlayWidth + x];
- }
- buffer += 240 - _overlayHeight;
- }
- }
-
- // draw mouse
- //adjust cursor position
- int mX = _mouseX - _mouseHotspotX;
- int mY = _mouseY - _mouseHotspotY;
- //if (_overlayVisible)
- //else
- if (_mouseVisible)
- for (int y = 0; y < _mouseHeight; y++) {
- for (int x = 0; x < _mouseWidth; x++) {
- if (mX + x < _screenWidth && mY + y < _screenHeight && mX + x >= 0 && mY + y >= 0)
- if (_mouseBuf[y * _mouseWidth + x] != _mouseKeyColor)
- gpd_drawPixel16(_tmpScreen, mX + x, mY + y, _currentPalette[_mouseBuf[y * _mouseWidth + x]]);
- }
- }
-
- //TODO: draw softkeyboard
- //gp_flipScreen();
- //_hwScreen = frameBuffer1;
- //_tmpScreen = frameBuffer2;
- memcpy(_hwScreen, _tmpScreen, LCD_WIDTH * LCD_HEIGHT * sizeof(uint16));
-}
-
-void OSystem_GP32::setShakePos(int shakeOffset) {
- //NP("OSys::setShakePos()");
-}
-
-void OSystem_GP32::showOverlay() {
- //NP("OSys::showOverlay()");
- _overlayVisible = true;
- clearOverlay();
-}
-
-void OSystem_GP32::hideOverlay() {
- //NP("OSys::hideOverlay()");
- _overlayVisible = false;
- clearOverlay();
- _forceFull = true;
-}
-
-// Clear overlay with game screen
-//TODO: Optimize?
-void OSystem_GP32::clearOverlay() {
- //NP("OSys::clearOverlay()");
- if (!_overlayVisible)
- return;
-
- uint8 *s = _gameScreen;
- OverlayColor *d = _overlayBuffer;
- uint8 c;
- for (int y = 0; y < _overlayHeight; y++) {
- for (int x = 0; x < _overlayWidth; x++) {
- c = *s;
- *d++ = _currentPalette[c];
- s++;
- }
- }
-
- _forceFull = true;
-}
-
-void OSystem_GP32::grabOverlay(OverlayColor *buf, int pitch) {
- //NP("OSys::grabOverlay()");
- int h = _overlayHeight;
- OverlayColor *src = _overlayBuffer;
-
- do {
- memcpy(buf, src, _overlayWidth * sizeof(OverlayColor));
- src += _overlayWidth;
- buf += pitch;
- } while (--h);
-}
-
-void OSystem_GP32::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) {
- //NP("OSys::copyRectToOverlay()");
-
- //Clip the coordinates
- if (x < 0) {
- w += x;
- buf -= x;
- x = 0;
- }
-
- if (y < 0) {
- h += y;
- buf -= y * pitch;
- y = 0;
- }
-
- if (w > _overlayWidth - x) {
- w = _overlayWidth - x;
- }
-
- if (h > _overlayHeight - y) {
- h = _overlayHeight - y;
- }
-
- if (w <= 0 || h <= 0)
- return;
-
-
- OverlayColor *dst = _overlayBuffer + y * _overlayWidth + x;
- if (_overlayWidth == pitch && pitch == w) {
- memcpy(dst, buf, h * w * sizeof(OverlayColor));
- } else {
- do {
- memcpy(dst, buf, w * sizeof(OverlayColor));
- buf += pitch;
- dst += _overlayWidth;
- } while (--h);
- }
-}
-
-int16 OSystem_GP32::getOverlayHeight() {
- return getHeight();
-}
-
-int16 OSystem_GP32::getOverlayWidth() {
- return getWidth();
-}
-
-OverlayColor OSystem_GP32::RGBToColor(uint8 r, uint8 g, uint8 b) {
- return gp_RGBTo16(r, g, b);
-}
-
-void OSystem_GP32::colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b) {
- gp_16ToRGB(color, &r, &g, &b);
-}
-
-bool OSystem_GP32::showMouse(bool visible) {
- NP("OSys::showMouse()");
- if (_mouseVisible == visible)
- return visible;
-
- bool last = _mouseVisible;
- _mouseVisible = visible;
-
- updateScreen();
-
- return last;
-}
-
-void OSystem_GP32::warpMouse(int x, int y) {
- //NP("OSys::warpMouse()");
- //assert(x > 0 && x < _screenWidth);
- //assert(y > 0 && y < _screenHeight);
- _mouseX = x;
- _mouseY = y;
-}
-
-void OSystem_GP32::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale) {
- //NP("OSys::setMouseCursor()");
- _mouseWidth = w;
- _mouseHeight = h;
-
- _mouseHotspotX = hotspotX;
- _mouseHotspotY = hotspotY;
-
- _mouseKeyColor = keycolor;
-
- if (_mouseBuf)
- free(_mouseBuf);
-
- _mouseBuf = (byte *)malloc(w * h);
- memcpy(_mouseBuf, buf, w * h);
-}
-
-void OSystem_GP32::handleKbdMouse() {
- uint32 curTime = getMillis();
- if (curTime >= _km.last_time + _km.delay_time) {
- _km.last_time = curTime;
- if (_km.x_down_count == 1) {
- _km.x_down_time = curTime;
- _km.x_down_count = 2;
- }
- if (_km.y_down_count == 1) {
- _km.y_down_time = curTime;
- _km.y_down_count = 2;
- }
-
- if (_km.x_vel || _km.y_vel) {
- if (_km.x_down_count) {
- if (curTime > _km.x_down_time + _km.delay_time * 12) {
- if (_km.x_vel > 0)
- _km.x_vel++;
- else
- _km.x_vel--;
- } else if (curTime > _km.x_down_time + _km.delay_time * 8) {
- if (_km.x_vel > 0)
- _km.x_vel = 5;
- else
- _km.x_vel = -5;
- }
- }
- if (_km.y_down_count) {
- if (curTime > _km.y_down_time + _km.delay_time * 12) {
- if (_km.y_vel > 0)
- _km.y_vel++;
- else
- _km.y_vel--;
- } else if (curTime > _km.y_down_time + _km.delay_time * 8) {
- if (_km.y_vel > 0)
- _km.y_vel = 5;
- else
- _km.y_vel = -5;
- }
- }
-
- //GPDEBUG("%d %d - %d %d", _km.x, _km.y, _km.x_vel, _km.y_vel);
- _km.x += _km.x_vel;
- _km.y += _km.y_vel;
-
- if (_km.x < 0) {
- _km.x = 0;
- _km.x_vel = -1;
- _km.x_down_count = 1;
- } else if (_km.x > _km.x_max) {
- _km.x = _km.x_max;
- _km.x_vel = 1;
- _km.x_down_count = 1;
- }
-
- if (_km.y < 0) {
- _km.y = 0;
- _km.y_vel = -1;
- _km.y_down_count = 1;
- } else if (_km.y > _km.y_max) {
- _km.y = _km.y_max;
- _km.y_vel = 1;
- _km.y_down_count = 1;
- }
-
- warpMouse(_km.x, _km.y);
- }
- }
-}
-
-void OSystem_GP32::fillMouseEvent(Common::Event &event, int x, int y) {
- event.mouse.x = x;
- event.mouse.y = y;
-
- // Update the "keyboard mouse" coords
- _km.x = x;
- _km.y = y;
-
- // Optionally perform aspect ratio adjusting
- //if (_adjustAspectRatio)
- // event.mouse.y = aspect2Real(event.mouse.y);
-}
-
-bool OSystem_GP32::pollEvent(Common::Event &event) {
- //NP("OSys::pollEvent()");
- GP32BtnEvent ev;
-
- handleKbdMouse();
-
- if (!gp_pollButtonEvent(&ev))
- return false;
-
- switch(ev.type) {
- case BUTTON_DOWN:
- if (ev.button == GPC_VK_LEFT) {
- _km.x_vel = -1;
- _km.x_down_count = 1;
- }
- if (ev.button == GPC_VK_RIGHT) {
- _km.x_vel = 1;
- _km.x_down_count = 1;
- }
- if (ev.button == GPC_VK_UP) {
- _km.y_vel = -1;
- _km.y_down_count = 1;
- }
- if (ev.button == GPC_VK_DOWN) {
- _km.y_vel = 1;
- _km.y_down_count = 1;
- }
- if (ev.button == GPC_VK_START) { // START = menu/enter
- event.type = Common::EVENT_KEYDOWN;
- if (_overlayVisible)
- event.kbd.keycode = event.kbd.ascii = 13;
- else {
- event.kbd.keycode = Common::KEYCODE_F5;
- event.kbd.ascii = Common::ASCII_F5;
- }
- return true;
- }
- if (ev.button == GPC_VK_SELECT) { // SELECT = pause
- event.type = Common::EVENT_KEYDOWN;
- event.kbd.keycode = event.kbd.ascii = 32;
- return true;
- }
- if (ev.button == GPC_VK_FL) {
- event.type = Common::EVENT_KEYDOWN;
- event.kbd.keycode = event.kbd.ascii = '0';
- return true;
- }
- if (ev.button == GPC_VK_FR) { // R = ESC
- event.type = Common::EVENT_KEYDOWN;
- event.kbd.keycode = event.kbd.ascii = 27;
- return true;
- }
- if (ev.button == GPC_VK_FA) {
- event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- if (ev.button == GPC_VK_FB) {
- event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- break;
- case BUTTON_UP:
- if (ev.button == GPC_VK_LEFT) {
- if (_km.x_vel < 0) {
- _km.x_vel = 0;
- _km.x_down_count = 0;
- }
- event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- if (ev.button == GPC_VK_RIGHT) {
- if (_km.x_vel > 0) {
- _km.x_vel = 0;
- _km.x_down_count = 0;
- }
- event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- if (ev.button == GPC_VK_UP) {
- if (_km.y_vel < 0) {
- _km.y_vel = 0;
- _km.y_down_count = 0;
- }
- event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- if (ev.button == GPC_VK_DOWN) {
- if (_km.y_vel > 0) {
- _km.y_vel = 0;
- _km.y_down_count = 0;
- }
- event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
-
- if (ev.button == GPC_VK_START) {
- event.type = Common::EVENT_KEYUP;
- if (_overlayVisible)
- event.kbd.keycode = event.kbd.ascii = 13;
- else {
- event.kbd.keycode = Common::KEYCODE_F5;
- event.kbd.ascii = Common::ASCII_F5;
- }
- return true;
- }
- if (ev.button == GPC_VK_SELECT) {
- event.type = Common::EVENT_KEYUP;
- event.kbd.keycode = event.kbd.ascii = 32;
- return true;
- }
- if (ev.button == GPC_VK_FL) {
- event.type = Common::EVENT_KEYUP;
- event.kbd.keycode = event.kbd.ascii = '0';
- return true;
- }
- if (ev.button == GPC_VK_FR) {
- event.type = Common::EVENT_KEYUP;
- event.kbd.keycode = event.kbd.ascii = 27;
- return true;
- }
- if (ev.button == GPC_VK_FA) {
- event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- if (ev.button == GPC_VK_FB) {
- event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- break;
- default:
- error("Unknown Common::Event!");
- }
-
- if (gp_getButtonPressed(GPC_VK_LEFT) ||
- gp_getButtonPressed(GPC_VK_RIGHT) ||
- gp_getButtonPressed(GPC_VK_UP) ||
- gp_getButtonPressed(GPC_VK_DOWN)) {
- event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
- return true;
- }
- return false;
-}
-
-uint32 OSystem_GP32::getMillis() {
- return GpTickCountGet();
-}
-
-void OSystem_GP32::delayMillis(uint msecs) {
- int startTime = GpTickCountGet();
- while (GpTickCountGet() < startTime + msecs);
-}
-
-// Add a new callback timer
-//FIXME: Add to member
-int _timerInterval;
-int (*_timerCallback)(int);
-
-static void _timerCallbackVoid() {
- //NP("timer running");
- _timerCallback(_timerInterval); //FIXME ?? (*_timercallback)(_timerinterval);
-}
-
-void OSystem_GP32::setTimerCallback(TimerProc callback, int interval) {
- //NP("OSys::setTimerCallback()");
-
- int timerNo = 1;
-
- if (callback == NULL) {
- GpTimerKill(timerNo);
- return;
- }
-
- if (GpTimerOptSet(timerNo, interval, 0, _timerCallbackVoid) == GPOS_ERR_ALREADY_USED) {
- error("Timer slot is already used");
- }
-
- _timerInterval = interval;
- _timerCallback = callback;
-
- GpTimerSet(timerNo);
-}
-
-OSystem::MutexRef OSystem_GP32::createMutex() {
-// NP("OSys::createMutex()");
- return NULL;
-}
-
-void OSystem_GP32::lockMutex(MutexRef mutex) {
-// NP("OSys::lockMutex()");
-}
-
-void OSystem_GP32::unlockMutex(MutexRef mutex) {
-// NP("OSys::unlockMutex()");
-}
-
-void OSystem_GP32::deleteMutex(MutexRef mutex) {
-// NP("OSys::deleteMutex()");
-}
-
-bool OSystem_GP32::setSoundCallback(SoundProc proc, void *param) {
- //NP("OSys::setSoundCallback()");
-
- GPSOUNDBUF gpSoundBuf;
-
- ConfMan.setBool("FM_medium_quality", (g_vars.fmQuality == FM_QUALITY_MED));
- ConfMan.setBool("FM_high_quality", (g_vars.fmQuality == FM_QUALITY_HI));
- //ConfMan.set("output_rate", (int)g_vars.sampleRate);
-
- if (ConfMan.hasKey("output_rate"))
- _samplesPerSec = ConfMan.getInt("output_rate");
-
- _samplesPerSec = (int)g_vars.sampleRate; //hack
-
- if (_samplesPerSec == 0) {
- return false;
- }
-
- if (_samplesPerSec < 0)
- _samplesPerSec = SAMPLES_PER_SEC;
-
- // Originally, we always used 2048 samples. This loop will produce the
- // same result at 22050 Hz, and should hopefully produce something
- // sensible for other frequencies. Note that it must be a power of two.
-
- uint32 samples = 0x8000;
-
- for (;;) {
- if ((1000 * samples) / _samplesPerSec < 100)
- break;
- samples >>= 1;
- }
-
- switch(_samplesPerSec) {
- case 44100:
- case 22050:
- case 11025:
- break;
- default:
- _samplesPerSec = 11025;
- }
-
- gpSoundBuf.freq = _samplesPerSec;
- gpSoundBuf.format = 16;
- gpSoundBuf.channels = 2;
- gpSoundBuf.samples = samples;
- gpSoundBuf.userdata = param;
- gpSoundBuf.callback = proc;
- gp_soundBufStart(&gpSoundBuf);
-
- // For Safety...
- GPDEBUG("_samplesPerSec = %d, samples = %d", _samplesPerSec, samples);
- gp_delay(1000);
- return true;
-}
-
-void OSystem_GP32::clearSoundCallback() {
- //NP("OSys::clearSoundCallback()");
- if (_samplesPerSec != 0)
- gp_soundBufStop();
-}
-
-int OSystem_GP32::getOutputSampleRate() const {
- //NP("OSys::getOutputSampleRate()");
- return _samplesPerSec;
-}
-
-void OSystem_GP32::quit() {
- //NP("OSys::quit()");
- clearSoundCallback();
- setTimerCallback(0, 0);
- exit(0);
-}
-
-void OSystem_GP32::setWindowCaption(const char *caption) {
- NP("OSys::setWindowCaption(%s)", caption);
-}
-
-void OSystem_GP32::displayMessageOnOSD(const char *msg) {
- NP("OSys::displayMessageOnOSD(%s)", msg);
-}
-
-OSystem *OSystem_GP32_create() {
- NP("OSys::OSystem_GP32_create()");
- return new OSystem_GP32();
-}
diff --git a/backends/platform/gp32/gp32_osys.h b/backends/platform/gp32/gp32_osys.h
deleted file mode 100644
index 9938671962..0000000000
--- a/backends/platform/gp32/gp32_osys.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef GP32_OSYS_H
-#define GP32_OSYS_H
-
-//Standard ScummVM includes.
-#include "common/scummsys.h"
-#include "common/system.h"
-
-#include "engines/engine.h"
-
-#include "gp32std.h"
-#include "gp32std_grap.h"
-#include "gp32std_input.h"
-#include "gp32std_sound.h"
-
-class OSystem_GP32 : public OSystem {
-public:
- static OSystem *instance();
-
-protected:
- uint16 _screenWidth, _screenHeight;
- uint8 *_gameScreen;
- uint16 *_tmpScreen, *_hwScreen;
- OverlayColor *_overlayBuffer;
-
- Graphics::Surface _framebuffer;
-
- int _overlayWidth, _overlayHeight;
- bool _overlayVisible;
- uint32 _shakePos;
-
- // Keyboard mouse emulation
- struct KbdMouse {
- int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
- uint32 last_time, delay_time, x_down_time, y_down_time;
- };
-
- struct MousePos {
- int16 x, y, w, h;
- };
-
- // mouse
- KbdMouse _km;
- bool _mouseVisible;
- int _mouseX, _mouseY;
- int _mouseWidth, _mouseHeight;
- int _mouseHotspotX, _mouseHotspotY;
- byte _mouseKeyColor;
- byte *_mouseBuf;
-
- bool _adjustAspectRatio;
-
- /** Force full redraw on next updateScreen */
- bool _forceFull;
-
- uint16 _currentPalette[256];
-// uint _paletteDirtyStart, _paletteDirtyEnd;
-
- int32 _samplesPerSec;
-
-public:
-
- OSystem_GP32();
- ~OSystem_GP32();
-
- bool hasFeature(Feature f);
- void setFeatureState(Feature f, bool enable);
- bool getFeatureState(Feature f);
- const GraphicsMode *getSupportedGraphicsModes() const;
- int getDefaultGraphicsMode() const;
- bool setGraphicsMode(int mode);
- bool setGraphicsMode(const char *name);
- int getGraphicsMode() const;
- void initSize(uint width, uint height);
- int16 getHeight();
- int16 getWidth();
- void setPalette(const byte *colors, uint start, uint num);
- void grabPalette(byte *colors, uint start, uint num);
-
- void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h);
- void updateScreen();
- void setShakePos(int shakeOffset);
-
- void showOverlay();
- void hideOverlay();
- void clearOverlay();
- void grabOverlay(OverlayColor *buf, int pitch);
- void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h);
-
- virtual Graphics::Surface *lockScreen();
- virtual void unlockScreen();
-
- int16 getOverlayHeight();
- int16 getOverlayWidth();
-
- OverlayColor RGBToColor(uint8 r, uint8 g, uint8 b);
- void colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b);
-
- bool showMouse(bool visible);
-
- void warpMouse(int x, int y);
- void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int cursorTargetScale = 1);
-
- bool pollEvent(Common::Event &event);
- uint32 getMillis();
- void delayMillis(uint msecs);
-
- void setTimerCallback(TimerProc callback, int interval);
-
- MutexRef createMutex(void);
- void lockMutex(MutexRef mutex);
- void unlockMutex(MutexRef mutex);
- void deleteMutex(MutexRef mutex);
-
- bool setSoundCallback(SoundProc proc, void *param);
- void clearSoundCallback();
- int getOutputSampleRate() const;
-
- void quit();
-
- void setWindowCaption(const char *caption);
-
- void displayMessageOnOSD(const char *msg);
-
- void fillMouseEvent(Common::Event &event, int x, int y);
- void handleKbdMouse();
-};
-
-#else
- #warning GP32_OSYS.H Called more then once.
-#endif /* GP32_H */
diff --git a/backends/platform/gp32/gp32std.cpp b/backends/platform/gp32/gp32std.cpp
deleted file mode 100644
index 13c055ebfa..0000000000
--- a/backends/platform/gp32/gp32std.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-//#include "graphics/scaler.h"
-#include "common/system.h"
-
-#include "engines/engine.h"
-
-#include "gp32std.h"
-#include "gp32std_grap.h"
-#include "gp32std_memory.h"
-
-#define DEBUG_MAX 5
-char debline[DEBUG_MAX][256];
-static int debnext = 0;
-
-void _dprintf(const char *s, ...) {
- int deba, deb;
- char buf[1024];
- va_list va;
-
- va_start(va, s);
- vsprintf(buf, s, va);
- va_end(va);
-
- strcpy(debline[debnext++], buf);
-
- if (debnext == DEBUG_MAX)
- debnext = 0;
- gp_fillRect(frameBuffer1, 0, 243 - (DEBUG_MAX * 8) - 4, 320, (DEBUG_MAX * 8), 0);
-
- for (deb = debnext, deba = 0; deb < DEBUG_MAX; deb++, deba++) {
- //gp_fillRect(frameBuffer1, 0, (243 - (DEBUG_MAX * 8) - 4) + 8 * deba, 320, 8, 0);
- gp_textOut(frameBuffer1, 0, (240 - (DEBUG_MAX * 8) - 4) + 8 * deba, debline[deb], 0xFFFF);
- }
- for (deb = 0; deb < debnext; deb++, deba++) {
- //gp_fillRect(frameBuffer1, 0, (243 - (DEBUG_MAX * 8) - 4) + 8 * deba, 320, 8, 0);
- gp_textOut(frameBuffer1, 0, (240 - (DEBUG_MAX * 8) - 4) + 8 * deba, debline[deb], 0xFFFF);
- }
-
-// gp_delay(100);
-}
-
-////////////////////
-//String functions
-char *gp_strcpy(char *dst, const char *src) {
- char *pDst = dst;
-
- while (*pDst++ = *src++)
- ;
-
- return dst;
-}
-
-char *gp_strncpy(char *dst, const char *src, size_t count) {
- char *start = dst;
-
- while (count && (*dst++ = *src++))
- count--;
-
- if (count)
- while (--count)
- *dst++ = '\0';
-
- return start;
-}
-
-char *gp_strcat(char *dst, const char *src) {
- char *pDst = dst;
-
- while (*pDst)
- pDst++;
-
- while (*pDst++ = *src++)
- ;
-
- return dst;
-
-}
-
-char *gp_strdup(const char *str) {
- char *memory;
-
- if (!str)
- return NULL;
-
- if (memory = (char *)gp_malloc(strlen(str) + 1))
- return gp_strcpy(memory, str);
-
- return NULL;
-}
-
-int gp_strcasecmp(const char *dst, const char *src) {
- int f, l;
- do {
- f = tolower((unsigned char)(*(dst++)));
- l = tolower((unsigned char)(*(src++)));
- } while (f && (f == l));
-
- return f - l;
-}
-
-int gp_strncasecmp(const char *dst, const char *src, size_t count) {
- int f,l;
-
- if (count) {
- do {
- f = tolower((unsigned char)(*(dst++)));
- l = tolower((unsigned char)(*(src++)));
- } while (--count && f && (f == l));
- return f - l;
- }
-
- return 0;
-}
-
-//FIXME: Handle LONG string
-void gp_sprintf(char *str, const char *fmt, ...) {
- char s[512];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 512, fmt, marker);
- va_end(marker);
-
- gp_strcpy(str, s);
-}
-
-int gp_printf(const char *fmt, ...) {
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- _dprintf("%s", s);
- //gp_delay(100);
- return 0;
-}
-
-void gp_delay(uint32 msecs) {
- int startTime = GpTickCountGet();
- while (GpTickCountGet() < startTime + msecs);
-}
-
-void gp_clockSpeedChange(int freq, int magic, int div) {
- #define rTCFG0 (*(volatile unsigned *)0x15100000)
- #define rTCFG1 (*(volatile unsigned *)0x15100004)
- #define rTCNTB4 (*(volatile unsigned *)0x1510003c)
- unsigned int pclk;
- unsigned int prescaler0;
-
- // Change CPU Speed
- GpClockSpeedChange(freq, magic, div);
- pclk = GpPClkGet();
-
- // Repair SDK timer - it forgets to set prescaler
- prescaler0 = (pclk / (8000 * 40)) - 1;
- rTCFG0 = (rTCFG0 & 0xFFFFFF00) | prescaler0;
- rTCFG1 = 0x30033;
-
- // Repair GpTickCountGet
- rTCNTB4 = pclk / 1600;
-}
-
-void gp_setCpuSpeed(int freq) {
- // Default value for 40 mhz
- static int CLKDIV = 0x48013;
- static int MCLK = 40000000;
- static int CLKMODE = 0;
- static int HCLK = 40000000;
- static int PCLK = 40000000;
-
- switch (freq) {
- // overclocked
- case 168: { CLKDIV = 0x14000; MCLK = 168000000; CLKMODE = 3; break; }
- case 172: { CLKDIV = 0x23010; MCLK = 172000000; CLKMODE = 3; break; }
- case 176: { CLKDIV = 0x24010; MCLK = 176000000; CLKMODE = 3; break; }
- case 180: { CLKDIV = 0x16000; MCLK = 180000000; CLKMODE = 3; break; }
- case 184: { CLKDIV = 0x26010; MCLK = 184000000; CLKMODE = 3; break; }
- case 188: { CLKDIV = 0x27010; MCLK = 188000000; CLKMODE = 3; break; }
- case 192: { CLKDIV = 0x18000; MCLK = 192000000; CLKMODE = 3; break; }
- case 196: { CLKDIV = 0x29010; MCLK = 196000000; CLKMODE = 3; break; }
- case 200: { CLKDIV = 0x2A010; MCLK = 200000000; CLKMODE = 3; break; }
- case 204: { CLKDIV = 0x2b010; MCLK = 204000000; CLKMODE = 3; break; }
- case 208: { CLKDIV = 0x2c010; MCLK = 208000000; CLKMODE = 3; break; }
- case 212: { CLKDIV = 0x2d010; MCLK = 212000000; CLKMODE = 3; break; }
- case 216: { CLKDIV = 0x2e010; MCLK = 216000000; CLKMODE = 3; break; }
- case 220: { CLKDIV = 0x2f010; MCLK = 220000000; CLKMODE = 3; break; }
- case 224: { CLKDIV = 0x30010; MCLK = 224000000; CLKMODE = 3; break; }
- case 228: { CLKDIV = 0x1e000; MCLK = 228000000; CLKMODE = 3; break; }
- case 232: { CLKDIV = 0x32010; MCLK = 232000000; CLKMODE = 3; break; }
- case 236: { CLKDIV = 0x33010; MCLK = 236000000; CLKMODE = 3; break; }
- case 240: { CLKDIV = 0x20000; MCLK = 240000000; CLKMODE = 3; break; }
- case 244: { CLKDIV = 0x35010; MCLK = 244000000; CLKMODE = 3; break; }
- case 248: { CLKDIV = 0x36010; MCLK = 248000000; CLKMODE = 3; break; }
- case 252: { CLKDIV = 0x22000; MCLK = 252000000; CLKMODE = 3; break; }
- case 256: { CLKDIV = 0x38010; MCLK = 256000000; CLKMODE = 3; break; }
-
- // normal
-// case 166: { CLKDIV = 0x4B011; MCLK = 166000000; CLKMODE = 3; break; }
- case 166: { CLKDIV = 0x2f001; MCLK = 165000000; CLKMODE = 3; break; }
- case 164: { CLKDIV = 0x4a011; MCLK = 164000000; CLKMODE = 3; break; }
- case 160: { CLKDIV = 0x48011; MCLK = 160000000; CLKMODE = 3; break; }
- case 156: { CLKDIV = 0x2c001; MCLK = 156000000; CLKMODE = 3; break; }
- case 144: { CLKDIV = 0x28001; MCLK = 144000000; CLKMODE = 3; break; }
- case 133: { CLKDIV = 0x51021; MCLK = 133500000; CLKMODE = 2; break; }
- case 132: { CLKDIV = 0x3a011; MCLK = 132000000; CLKMODE = 3; break; }
- case 120: { CLKDIV = 0x24001; MCLK = 120000000; CLKMODE = 2; break; }
- case 100: { CLKDIV = 0x2b011; MCLK = 102000000; CLKMODE = 2; break; }
- case 66: { CLKDIV = 0x25002; MCLK = 67500000; CLKMODE = 2; break; }
- case 50: { CLKDIV = 0x2a012; MCLK = 50000000; CLKMODE = 0; break; }
-// case 40: { CLKDIV = 0x48013; MCLK = 40000000; CLKMODE = 0; break; }
- case 40: { CLKDIV = 0x48013; MCLK = 40000000; CLKMODE = 1; break; }
-// case 33: { CLKDIV = 0x25003; MCLK = 33750000; CLKMODE = 0; break; }
- case 33: { CLKDIV = 0x25003; MCLK = 33750000; CLKMODE = 2; break; }
- case 22: { CLKDIV = 0x33023; MCLK = 22125000; CLKMODE = 0; break; }
- default:
- error("Invalid CPU frequency!");
- }
- if (CLKMODE == 0) { HCLK = MCLK; PCLK = MCLK; }
- if (CLKMODE == 1) { HCLK = MCLK; PCLK = MCLK / 2; }
- if (CLKMODE == 2) { HCLK = MCLK / 2; PCLK = MCLK / 2; }
- if (CLKMODE == 3) { HCLK = MCLK / 2; PCLK = MCLK / 4; }
-
- gp_clockSpeedChange(MCLK, CLKDIV, CLKMODE);
-}
-
-void gp_Reset() {
- gp_setCpuSpeed(66);
- asm volatile("swi #4\n");
-}
-
-void gp_exit(int code) {
- if (!code) {
- printf(" ----------------------------------------");
- printf(" Your GP32 is now restarting... ");
- printf(" ----------------------------------------");
- printf("");
-
- gp_delay(3000);
-
- GpAppExit();
- } else {
- printf("Exit Code %d", code);
- while (1);
- }
-}
-
-// Debug functions
-void GPDEBUG(const char *fmt, ...) {
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- _dprintf("%s", s);
-}
-
-void NP(const char *fmt, ...) {
-// return;
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- _dprintf("NP:%s", s);
- gp_delay(50);
-}
-
-void LP(const char *fmt, ...) {
-// return;
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- _dprintf("LP:%s", s);
- gp_delay(300);
-}
-
-void SP(const char *fmt, ...) {
-// return;
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- _dprintf("SP:%s", s);
- gp_delay(50);
-}
-
-void BP(const char *fmt, ...) {
-// return;
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- _dprintf("BP:%s", s);
- gp_delay(2000);
-}
diff --git a/backends/platform/gp32/gp32std.h b/backends/platform/gp32/gp32std.h
deleted file mode 100644
index 746b096d29..0000000000
--- a/backends/platform/gp32/gp32std.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32STD_H
-#define __GP32STD_H
-
-#include <gpfont.h>
-#include <gpfont_port.h>
-#include <gpgraphic.h>
-#include <gpmm.h>
-#include <gpmem.h>
-#include <gpos_def.h>
-#include <gpstdio.h>
-#include <gpstdlib.h>
-#include <gpdef.h>
-
-#define LCD_WIDTH 320
-#define LCD_HEIGHT 240
-
-extern char * gp_strcpy(char *dst, const char *src);
-extern char * gp_strncpy(char *dst, const char *src, size_t count);
-extern char * gp_strcat(char *dst, const char *src);
-extern char * gp_strdup(const char *str);
-extern int gp_strcasecmp(const char *dst, const char *src);
-extern int gp_strncasecmp(const char *dst, const char *src, size_t count);
-extern void gp_sprintf(char *str, const char *fmt, ...);
-
-extern void gp_setCpuSpeed(int freq);
-extern int gp_printf(const char *fmt, ...);
-extern void gp_delay(unsigned long msecs);
-extern void gp_exit(int code);
-
-extern void GPDEBUG(const char *fmt, ...);
-extern void LP(const char *fmt, ...);
-extern void NP(const char *fmt, ...);
-extern void SP(const char *fmt, ...);
-extern void BP(const char *fmt, ...);
-
-#endif
diff --git a/backends/platform/gp32/gp32std_file.cpp b/backends/platform/gp32/gp32std_file.cpp
deleted file mode 100644
index 6c7076c4d4..0000000000
--- a/backends/platform/gp32/gp32std_file.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-
-#include "common/scummsys.h"
-//#include "graphics/scaler.h"
-#include "common/system.h"
-
-#include "gp32std.h"
-#include "gp32std_file.h"
-
-FILE *gp_stderr = NULL;
-FILE *gp_stdout = NULL;
-FILE *gp_stdin = NULL;
-
-// Cache Idea / Code borrowed from the ps2 port
-#define USE_CACHE
-
-//////////////////
-//File functions
-
-
-// CACHE
-inline bool gp_cacheInPos(GPFILE *stream) {
- return (stream->cachePos <= stream->filePos && stream->filePos < stream->cachePos + stream->bytesInCache);
-}
-
-int gp_cacheMiss(GPFILE *stream) {
- unsigned long readcount = 0;
-
- int copyLen = stream->fileSize - stream->filePos;
- if (copyLen > FCACHE_SIZE)
- copyLen = FCACHE_SIZE;
-
- stream->cachePos = stream->filePos;
- stream->cacheBufOffs = 0;
- stream->bytesInCache = copyLen;
-
- ERR_CODE err = GpFileRead(stream->handle, stream->cacheData, copyLen, &readcount);
-
- stream->physFilePos += copyLen;
-
- return err;
-}
-
-int gp_flushWriteCache(GPFILE *stream) {
- if (stream->bytesInCache == 0)
- return 0;
-
- ERR_CODE err = GpFileWrite(stream->handle, stream->cacheData, stream->bytesInCache); // flush cache
-
- stream->filePos += stream->bytesInCache;
- stream->physFilePos += stream->bytesInCache;
- stream->bytesInCache = 0;
-
- return err;
-}
-
-///////////////////////////////////////////////////////////////
-
-GPFILE *gp_fopen(const char *fileName, const char *openMode) {
- uint32 mode;
- GPFILE *file;
- ERR_CODE err;
- char tempPath[256];
-
- if (!strchr(fileName, '.')) {
- sprintf(tempPath, "%s.", fileName);
- fileName = tempPath;
- }
-
- file = new GPFILE;
-
-// NP("%s(\"%s\", \"%s\")", __FUNCTION__, fileName, openMode);
-
- // FIXME add binary/text support
- if (tolower(openMode[0]) == 'r') {
- mode = OPEN_R;
- GpFileGetSize(fileName, &file->fileSize);
- err = GpFileOpen(fileName, mode, &file->handle);
- } else if (tolower(openMode[0]) == 'w') {
- file->fileSize = 0;
- mode = OPEN_W;
- err = GpFileCreate(fileName, ALWAYS_CREATE, &file->handle);
- } else if (tolower(openMode[0]) == 'a') {
- warning("We do not support 'a' file open mode.");
- delete file;
- return NULL;
- } else {
- error("wrong file mode");
- }
-
- if (!file) {
- error("%s: cannot create FILE structure", __FUNCTION__);
- }
-
- if (err) {
- printf("gp_fopen(): IO error %d", err);
- delete file;
- return NULL;
- }
-
- file->mode = mode;
- file->cachePos = 0;
- file->filePos = 0;
- file->cacheBufOffs = 0;
- file->physFilePos = 0;
- file->bytesInCache = 0;
-
- return file;
-}
-
-int gp_fclose(GPFILE *stream) {
- if (!stream) {
- //warning("closing null file");
- return 1;
- }
-
-/* if (*(uint32 *)((char *)stream - sizeof(uint32)) == 0x4321) {
- debug(0, "Double closing", __FUNCTION__);
- return 1;
- }
-*/
-
-#ifdef USE_CACHE
- if (stream->bytesInCache && stream->mode == OPEN_W) {
- gp_flushWriteCache(stream);
- }
-#endif
-
- ERR_CODE err = GpFileClose(stream->handle);
- delete stream;
-
- return err;
-}
-
-int gp_fseek(GPFILE *stream, long offset, int whence) {
- switch (whence) {
- case SEEK_SET:
- whence = FROM_BEGIN;
- break;
- case SEEK_CUR:
- whence = FROM_CURRENT;
- break;
- case SEEK_END:
- whence = FROM_END;
- break;
- }
-
- ERR_CODE err;
-#ifdef USE_CACHE
- // need to flush cache
- if (stream->mode == OPEN_W) { // write
- gp_flushWriteCache(stream);
- err = GpFileSeek(stream->handle, whence, offset, (long *)&stream->filePos);
- } else { // read
- if (whence == SEEK_CUR)
- offset += stream->physFilePos - stream->filePos;
-
- err = GpFileSeek(stream->handle, whence, offset, (long *)&stream->physFilePos);
- stream->filePos = stream->physFilePos;
-
- if (!gp_cacheInPos(stream)) { // cache miss
- gp_cacheMiss(stream);
- }
- }
-#endif
-
- return 1;
- //return 0; //FIXME?
-}
-
-size_t gp_fread(void *ptr, size_t size, size_t n, GPFILE *stream) {
- unsigned int len = size * n;
- uint8 *dest = (uint8 *)ptr;
-
-#ifdef USE_CACHE
- while (len && !gp_feof(stream)) {
- if (gp_cacheInPos(stream)) {
- uint32 startPos = (stream->cacheBufOffs + (stream->filePos - stream->cachePos)) % FCACHE_SIZE;
- uint32 copyLen = stream->bytesInCache - (stream->filePos - stream->cachePos);
- if (copyLen > len)
- copyLen = len;
- if (startPos + copyLen > FCACHE_SIZE)
- copyLen = FCACHE_SIZE - startPos;
-
- memcpy(dest, stream->cacheData + startPos, copyLen);
-
- stream->filePos += copyLen;
- dest += copyLen;
- len -= copyLen;
- } else { // cache miss or cache empty
- gp_cacheMiss(stream);
- }
- }
-#else
- ulong readcount = 0;
- ERR_CODE err = GpFileRead(stream->handle, ptr, len, &readcount);
- stream->physFilePos += len;
- stream->filePos += len;
-#endif
-
- // FIXME: Fingolfin asks: why is there a FIXME here? Please either clarify what
- // needs fixing, or remove it!
- return 1; //readcount / size; //FIXME
-}
-
-size_t gp_fwrite(const void *ptr, size_t size, size_t n, GPFILE *stream) {
- int len = size * n;
- uint8 *srcBuf = (uint8 *)ptr;
-
- if (!stream) {
- //warning("writing to null file");
- return 0;
- }
-
-#ifdef USE_CACHE
- while (len) {
- uint32 copyLen;
- if (stream->bytesInCache + len > FCACHE_SIZE)
- copyLen = FCACHE_SIZE - stream->bytesInCache;
- else
- copyLen = len;
-
- srcBuf += copyLen;
- len -= copyLen;
-
- if (stream->bytesInCache == FCACHE_SIZE) {
- gp_flushWriteCache(stream);
- }
- }
-#else
- ERR_CODE err = GpFileWrite(stream->handle, ptr, len);
- if (!err)
- return n;
- else
- return -err;
-#endif
- return 1;
-}
-
-long gp_ftell(GPFILE *stream) {
- ulong pos = 0;
- pos = stream->filePos;
- //ERR_CODE err = GpFileSeek(stream->handle, FROM_CURRENT, 0, (long*)&pos);
- return pos;
-}
-
-void gp_clearerr(GPFILE *stream)
-{
-}
-
-int gp_feof(GPFILE *stream) {
- return (unsigned long)gp_ftell(stream) >= stream->fileSize;
-}
-
-char gp_fgetc(GPFILE *stream) {
- char c[1];
-
- gp_fread(&c[0], 1, 1, stream);
- return c[0];
-}
-
-char *gp_fgets(char *s, int n, GPFILE *stream) {
- int i = 0;
-
- while (!gp_feof(stream) && i < n) {
- gp_fread(&s[i], 1, 1, stream);
- if (s[i] == '\n') {
- s[i + 1] = 0;
- return s;
- }
- i++;
- }
- if (gp_feof(stream))
- return NULL;
- else
- return s;
-}
-
-int gp_fprintf(GPFILE *stream, const char *fmt, ...) {
- char s[256];
- va_list marker;
-
- va_start(marker, fmt);
- vsnprintf(s, 256, fmt, marker);
- va_end(marker);
-
- return gp_fwrite(s, 1, strlen(s), stream);
-}
-
-int gp_fflush(GPFILE *stream) {
- return 0;
-}
-
-int gp_ferror(GPFILE *stream) {
- return 0;
-}
diff --git a/backends/platform/gp32/gp32std_file.h b/backends/platform/gp32/gp32std_file.h
deleted file mode 100644
index a515a63590..0000000000
--- a/backends/platform/gp32/gp32std_file.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32STD_FILE_H
-#define __GP32STD_FILE_H
-
-#define FCACHE_SIZE 8 * 1024
-
-typedef struct {
- F_HANDLE handle;
- unsigned long mode;
- unsigned long fileSize;
- unsigned long filePos;
- unsigned long physFilePos;
- unsigned long cachePos;
- unsigned long cacheBufOffs;
- unsigned long bytesInCache;
- unsigned char cacheData[FCACHE_SIZE];
-} GPFILE;
-
-extern GPFILE *gp_stderr;
-extern GPFILE *gp_stdout;
-extern GPFILE *gp_stdin;
-
-extern GPFILE * gp_fopen(const char *filename, const char *mode);
-extern int gp_fclose(GPFILE *stream);
-extern int gp_fseek(GPFILE *stream, long offset, int whence);
-extern size_t gp_fread(void *ptr, size_t size, size_t n, GPFILE *stream);
-extern size_t gp_fwrite(const void *ptr, size_t size, size_t n, GPFILE *stream);
-extern long gp_ftell(GPFILE *stream);
-extern void gp_clearerr(GPFILE *stream);
-extern int gp_feof(GPFILE *stream);
-extern char gp_fgetc(GPFILE *stream);
-extern char * gp_fgets(char *s, int n, GPFILE *stream);
-extern int gp_fflush(GPFILE *stream);
-extern int gp_ferror(GPFILE *stream);
-extern int gp_fprintf(GPFILE *stream, const char *fmt, ...);
-
-#endif
diff --git a/backends/platform/gp32/gp32std_grap.cpp b/backends/platform/gp32/gp32std_grap.cpp
deleted file mode 100644
index a60f61c66b..0000000000
--- a/backends/platform/gp32/gp32std_grap.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-#include "common/system.h"
-
-#include "gp32std.h"
-#include "gp32std_grap.h"
-
-#include "globals.h"
-
-GPDRAWSURFACE lcdSurface[2];
-
-uint8 flipIndex = 1;
-
-uint16 *frameBuffer1;
-uint16 *frameBuffer2;
-
-uint8 gammaLUT[256];
-uint8 gammaLUTInv[256];
-
-extern const unsigned char fontresEng1[];
-extern const unsigned char fontresKor1[];
-
-void gp_putBitmap8x16(uint16 *frameBuffer, int x, int y, byte *lpBitmap, uint16 wColor) {
- byte *pBitmap = lpBitmap;
- for (int nRow = 0; nRow < 12; nRow ++) {
- byte data = *pBitmap++;
- for (int nCol = 0; nCol < 7; nCol ++) {
- if (data & 0x80)
- if (x + nCol >= 0 && y + nRow >= 0 && x + nCol < 320 && y + nRow < 240)
- gpd_drawPixel16(frameBuffer, x + nCol, y + nRow, wColor);
-
- data <<= 1;
- }
- }
-}
-
-void gp_putEngFont(uint16 *frameBuffer, int x, int y, char c, uint16 wColor) {
- byte *pBitmap = (byte *) &fontresEng1[c * 16];
- gp_putBitmap8x16(frameBuffer, x, y, pBitmap, wColor);
-}
-
-void gp_textOut(uint16 *frameBuffer, int x, int y, char* lpszText, uint16 wColor) {
- // TODO: Handle korean font
- int nPos = x;
- char* pszText = lpszText;
-
- while (*pszText != '\0') {
- if (*pszText == '\n') {
- nPos = x;
- y += 8;
- } else {
- gp_putEngFont(frameBuffer, nPos, y, *pszText, wColor);
- nPos += 7;
- }
-
- pszText++;
- }
-}
-
-void gp_fillRect(uint16 *frameBuffer, int16 x, int16 y, int16 w, int16 h, uint16 color) {
- uint16 *buffer = &frameBuffer[(240 - (y + h)) + (240 * x)];
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- *buffer++ = color;
- }
- buffer += 240 - h;
- }
-}
-
-void gp_initGammaTable(float value)
-{
- for (int i = 0; i < 256; i++) {
- if (value == 1.0f) {
- gammaLUT[i] = i;
- gammaLUTInv[i] = i;
- } else {
- gammaLUT[i] = (uint8)(pow((double)i / 256, 1 / (double)value) * 256);
- gammaLUTInv[i] = (uint8)(pow((double)i / 256, (double)value) * 256);
- }
- }
-}
-
-uint16 gp_RGBTo16(uint16 r, uint16 g, uint16 b) {
- // GP32 16bit color 5551
- if (g_vars.gammaRamp != 10000) {
- r = gammaLUT[r];
- g = gammaLUT[g];
- b = gammaLUT[b];
- }
- return (((r >> 3) & 0x1F) << 11) | (((g >> 3) & 0x1F) << 6) | ((b >> 3) & 0x1F) << 1;
-}
-
-void gp_16ToRGB(uint16 color, uint8 *r, uint8 *g, uint8 *b) {
- *r = ((((color) >> 11) & 0x1F) << 3);
- *g = ((((color) >> 6) & 0x1F) << 3); //(((color>>5)&0x3F) << 2);
- *b = ((((color) >> 1) & 0x1F) << 3); //((color&0x1F) << 3);
-
- if (g_vars.gammaRamp != 10000) {
- *r = gammaLUTInv[*r];
- *g = gammaLUTInv[*g];
- *b = gammaLUTInv[*b];
- }
-}
-
-void gp_flipScreen() {
- uint16 *frameBuffer1_old = frameBuffer1;
- uint16 *frameBuffer2_old = frameBuffer2;
-
- GpSurfaceFlip(&lcdSurface[flipIndex]);
- flipIndex = 1 - flipIndex;
- frameBuffer1 = frameBuffer2_old;
- frameBuffer2 = frameBuffer1_old;
-}
-
-void gp_initFrameBuffer() {
- GpLcdSurfaceGet(&lcdSurface[0], 0);
- GpLcdSurfaceGet(&lcdSurface[1], 1);
- GpSurfaceSet(&lcdSurface[0]);
- frameBuffer1 = (uint16 *)lcdSurface[0].ptbuffer;
- frameBuffer2 = (uint16 *)lcdSurface[1].ptbuffer;
-
- memset(frameBuffer1, 0xFF, LCD_WIDTH * LCD_HEIGHT * sizeof(uint16));
- memset(frameBuffer2, 0xFF, LCD_WIDTH * LCD_HEIGHT * sizeof(uint16));
-}
diff --git a/backends/platform/gp32/gp32std_grap.h b/backends/platform/gp32/gp32std_grap.h
deleted file mode 100644
index 79bc312779..0000000000
--- a/backends/platform/gp32/gp32std_grap.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32STD_GRAP_H
-#define __GP32STD_GRAP_H
-
-extern GPDRAWSURFACE lcdSurface[2];
-extern uint8 flipIndex;
-
-extern uint16 *frameBuffer1;
-extern uint16 *frameBuffer2;
-
-extern void gp_fillRect(uint16 *frameBuffer, int16 x, int16 y, int16 w, int16 h, uint16 color);
-extern uint16 gp_RGBTo16(uint16 r, uint16 g, uint16 b);
-extern void gp_16ToRGB(uint16 color, uint8 *r, uint8 *g, uint8 *b);
-
-extern void gp_textOut(uint16 *frameBuffer, int x, int y, char* lpszText, uint16 wColor);
-
-extern void gp_initGammaTable(float value);
-extern void gp_initFrameBuffer();
-extern void gp_flipScreen();
-
-#define gpd_drawPixel16(dst,x,y,color) (dst)[(239 - (y)) + (240 * (x))] = (color)
-
-#endif
diff --git a/backends/platform/gp32/gp32std_input.cpp b/backends/platform/gp32/gp32std_input.cpp
deleted file mode 100644
index 41689d9472..0000000000
--- a/backends/platform/gp32/gp32std_input.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-
-#include "gp32std.h"
-#include "gp32std_input.h"
-
-static uint32 buttonState = 0;
-static uint16 buttonPressState = 0;
-
-#define GET_BUTTON_PRESSED(a) (buttonPressState & (a))
-#define ON_BUTTON_PRESSED(a) (buttonPressState |= (a))
-#define OFF_BUTTON_PRESSED(a) (buttonPressState &= ~(a))
-
-#define GET_BUTTON_DOWN(a) (buttonState & (a) << 12)
-#define ON_BUTTON_DOWN(a) buttonState |= ((a) << 12)
-#define OFF_BUTTON_DOWN(a) buttonState &= ~((a) << 12)
-
-#define GET_BUTTON_UP(a) (buttonState & (a))
-#define ON_BUTTON_UP(a) buttonState |= (a)
-#define OFF_BUTTON_UP(a) buttonState &= ~(a)
-
-#define rKEY_A 0x4000
-#define rKEY_B 0x2000
-#define rKEY_L 0x1000
-#define rKEY_R 0x8000
-#define rKEY_UP 0x0800
-#define rKEY_DOWN 0x0200
-#define rKEY_LEFT 0x0100
-#define rKEY_RIGHT 0x0400
-#define rKEY_START 0x0040
-#define rKEY_SELECT 0x0080
-#define rPBDAT (*(volatile unsigned *)0x1560000c)
-#define rPEDAT (*(volatile unsigned *)0x15600030)
-
-/****************************************************************
- GP32 Input mappings - Returns Button Pressed.
-****************************************************************/
-int gp_trapKey() {
- int value = 0;
-
- unsigned long gpb = rPBDAT; // 0x156
- unsigned long gpe = rPEDAT;
-
- if ((gpb & rKEY_LEFT) == 0)
- value |= GPC_VK_LEFT;
- if ((gpb & rKEY_RIGHT) == 0)
- value |= GPC_VK_RIGHT;
- if ((gpb & rKEY_UP) == 0)
- value |= GPC_VK_UP;
- if ((gpb & rKEY_DOWN) == 0)
- value |= GPC_VK_DOWN;
- if ((gpb & rKEY_A) == 0)
- value |= GPC_VK_FA;
- if ((gpb & rKEY_B) == 0)
- value |= GPC_VK_FB;
- if ((gpb & rKEY_L) == 0)
- value |= GPC_VK_FL;
- if ((gpb & rKEY_R) == 0)
- value |= GPC_VK_FR;
- if ((gpe & rKEY_SELECT) == 0)
- value |= GPC_VK_SELECT;
- if ((gpe & rKEY_START) == 0)
- value |= GPC_VK_START;
-
- return value;
-}
-
-bool gp_getButtonEvent(uint32 *nKeyUD, uint16 *nKeyP) {
-// int nKey = GpKeyGet();
- int nKey = gp_trapKey();
-
- const int keyBitMask[10] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200};
-
- for (int i = 0; i < 10; i++) {
- OFF_BUTTON_DOWN(keyBitMask[i]);
- OFF_BUTTON_UP(keyBitMask[i]);
- if (nKey & keyBitMask[i]) {
- if (!GET_BUTTON_PRESSED(keyBitMask[i])) {
-// GPDEBUG("DOWN %d", i);
- ON_BUTTON_PRESSED(keyBitMask[i]);
- ON_BUTTON_DOWN(keyBitMask[i]);
- }
- } else {
- if (GET_BUTTON_PRESSED(keyBitMask[i])) {
-// GPDEBUG("UP %d", i);
- OFF_BUTTON_PRESSED(keyBitMask[i]);
- ON_BUTTON_UP(keyBitMask[i]);
- }
- }
- }
-
-// GPDEBUG("%08x %04x", buttonState, buttonPressState);
- *nKeyUD = buttonState;
- *nKeyP = buttonPressState;
- return true;
-}
-
-#define MAX_EVENTS 32
-
-struct EventQueue {
-protected:
- int front, rear;
- int numElement;
- GP32BtnEvent event[MAX_EVENTS];
-
-public:
- void push(GP32BtnEvent *ev) {
- if ((rear + 1) % MAX_EVENTS == front) {
- GPDEBUG("Queue Overflow!");
- return;
- }
- numElement++;
-
- event[rear].type = ev->type;
- event[rear].button = ev->button;
- rear = (rear + 1) % MAX_EVENTS;
- }
-
- bool isEmpty() {
- return (numElement == 0);
- }
-
- bool isFull() {
- return (numElement == MAX_EVENTS);
- }
-
- bool get(GP32BtnEvent *ev) {
- if (front == rear) {
- return false;
- }
- numElement--;
- ev->type = event[front].type;
- ev->button = event[front].button;
- front = (front + 1) % MAX_EVENTS;
- return true;
- }
-};
-
-EventQueue eventQueue;
-
-bool gp_pumpButtonEvent() {
- int nKey = gp_trapKey();
- GP32BtnEvent ev;
-
- const int keyBitMask[10] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200};
-
- for (int i = 0; i < 10; i++) {
- if (nKey & keyBitMask[i]) {
- if (!GET_BUTTON_PRESSED(keyBitMask[i])) {
- ON_BUTTON_PRESSED(keyBitMask[i]);
- ev.type = BUTTON_DOWN;
- ev.button = keyBitMask[i];
- eventQueue.push(&ev);
- //ON_BUTTON_DOWN(keyBitMask[i]);
- }
- } else {
- if (GET_BUTTON_PRESSED(keyBitMask[i])) {
- OFF_BUTTON_PRESSED(keyBitMask[i]);
- ev.type = BUTTON_UP;
- ev.button = keyBitMask[i];
- eventQueue.push(&ev);
- //ON_BUTTON_UP(keyBitMask[i]);
- }
- }
- }
-
- return true;
-}
-
-bool gp_pollButtonEvent(GP32BtnEvent *ev) {
- gp_pumpButtonEvent();
-
- if (eventQueue.isEmpty()) {
- return false;
- }
-
- eventQueue.get(ev);
-// GPDEBUG("Event poll %d %d", ev->type, ev->button);
-
- return true;
-}
-
-bool gp_getButtonPressed(uint16 button)
-{
- return buttonPressState & button;
-}
diff --git a/backends/platform/gp32/gp32std_input.h b/backends/platform/gp32/gp32std_input.h
deleted file mode 100644
index bd784d3432..0000000000
--- a/backends/platform/gp32/gp32std_input.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32STD_INPUT_H
-#define __GP32STD_INPUT_H
-
-#include "common/scummsys.h"
-
-#define BUTTON_DOWN 1
-#define BUTTON_UP 2
-
-struct GP32BtnEvent {
- uint16 type;
- uint16 button;
-};
-
-extern int gp_trapKey();
-
-extern bool gp_getButtonEvent(uint32 *nKeyUD, uint16 *nKeyP);
-
-#define gpd_getEventDown(a) (((a) >> 12) & 0x0fff)
-#define gpd_getEventUp(a) ((a) & 0x0fff)
-#define gpd_getEventPressed(a) ((a) & 0x0fff)
-#define gpd_getButtonDown(a,button) ((a) & (button) << 12)
-#define gpd_getButtonUp(a,button) ((a) & (button))
-#define gpd_getButtonPressed(a,button) ((a) & (button))
-
-extern bool gp_pollButtonEvent(GP32BtnEvent *ev);
-extern bool gp_getButtonPressed(uint16 button);
-
-#endif
diff --git a/backends/platform/gp32/gp32std_memory.cpp b/backends/platform/gp32/gp32std_memory.cpp
deleted file mode 100644
index 9d7ef9a124..0000000000
--- a/backends/platform/gp32/gp32std_memory.cpp
+++ /dev/null
@@ -1,318 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-//#include "graphics/scaler.h"
-#include "common/system.h"
-
-#include "engines/engine.h"
-
-#include "gp32std.h"
-#include "gp32std_grap.h"
-#include "gp32std_memory.h"
-
-/////////////////////
-//Memory management
-
-#define USER_MEMORY_SIZE (256 * 1024)
-#define USER_BLOCK_SIZE 24
-#define NUM_BLOCK (USER_MEMORY_SIZE / USER_BLOCK_SIZE)
-// use fixed block size for small allocations
-// consumes about 128k for block array
-// consumes 256k for user memory
-
-class MemBlock {
-protected:
- static byte *userMem;
-// static size_t allocSize;
-// static MemBlock *head;
- static int numBlock;
- static int prevBlock;
-
- // Linked list is slow for this task. :)
- static MemBlock *block;
-
- byte *blockData;
- size_t size;
-
-// MemBlock *next;
-
- int used;
-
-public:
- static void init();
- static void deinit();
-
- static void *addBlock(size_t size);
- static void deleteBlock(void *dstBlock);
-};
-
-byte *MemBlock::userMem = NULL;
-//MemBlock *MemBlock::head = NULL;
-//size_t MemBlock::allocSize = 0;
-int MemBlock::numBlock = 0;
-int MemBlock::prevBlock = 0;
-MemBlock *MemBlock::block = NULL;
-
-void MemBlock::init()
-{
- userMem = (byte *)gm_malloc(USER_MEMORY_SIZE + USER_BLOCK_SIZE);
- block = (MemBlock *)gm_malloc(NUM_BLOCK * sizeof(MemBlock));
-
- if (!(userMem && block)) {
- //error
- }
-
- memset(userMem, 0, USER_MEMORY_SIZE + USER_BLOCK_SIZE);
- memset(block, 0, NUM_BLOCK * sizeof(MemBlock));
-}
-
-void MemBlock::deinit()
-{
- if (!(userMem && block)) {
- //error
- }
- gm_free(userMem);
- gm_free(block);
- userMem = NULL;
- block = NULL;
-}
-
-void *MemBlock::addBlock(size_t size)
-{
- int i;
- MemBlock *blk = &block[prevBlock];
-
- // some optimizaion with loop
- for (i = prevBlock; i < NUM_BLOCK; i++) {
- if (!blk->used) {
- break;
- }
- blk++;
- }
- if (i == NUM_BLOCK) {
- blk = &block[0];
- for (i = 0; i < prevBlock; i++) {
- if (!blk->used) {
- break;
- }
- blk++;
- }
- if (i == prevBlock) {
- prevBlock = 0;
- return gm_malloc(size);
- }
- }
-
- byte *ptr = userMem + (i * USER_BLOCK_SIZE);
-
- blk->size = size;
- blk->blockData = ptr;
- blk->used = 1;
-
- prevBlock = i;
-
- return (void *) ptr;
-}
-
-void MemBlock::deleteBlock(void *dstBlock)
-{
- // Faster method
- uint32 np = (uint32) dstBlock - (uint32) userMem;
-
- if ((np / USER_BLOCK_SIZE) * USER_BLOCK_SIZE != np) {
- gm_free(dstBlock);
-// warning("wrong block! (%d / %d)", (np / USER_BLOCK_SIZE) * USER_BLOCK_SIZE, np);
- return;
- }
- int i = np / USER_BLOCK_SIZE;
- if (i > NUM_BLOCK) {
- gm_free(dstBlock);
- return;
- }
- block[i].used = 0;
-
-/*
- int i = 0;
- for (i = 0; i < NUM_BLOCK; i++) {
- if (block[i].blockData == dstBlock)
- break;
- }
- if (i == NUM_BLOCK) {
- gm_free(dstBlock); //fixme?
- //warning("wrong block! %x", (uint32)block - (uint32)userMem);
- } else {
- GPDEBUG("deleteing block %d", i);
- block[i].used = 0;
- }*/
-}
-
-// HACK not to include struct MemBlock
-void memBlockInit()
-{
- MemBlock::init();
-}
-
-void memBlockDeinit()
-{
- MemBlock::deinit();
-}
-
-#undef memcpy
-#undef memset
-void *gp_memcpy(void *dst, const void *src, size_t count) {
- return memcpy(dst, src, count);
-}
-
-void *gp_memset(void *dst, int val, size_t count) {
- return memset(dst, val, count);
-}
-
-#define MALLOC_MASK 0xAB800000
-
-// WE HAVE TO ALIGN MEMORY ADDRESS ON THE ARM PROCESSOR!
-#define ALIGNED_SIZE(size) ((size) + (4 - ((size) & 3)))
-
-void *gp_malloc(size_t size) {
- uint32 np;
- uint32 *up;
-
- // size + 8 bytes : stores block size
- int allocSize = ALIGNED_SIZE(size) + sizeof(uint32) + sizeof(uint32);
- if (allocSize <= USER_BLOCK_SIZE) {
- np = (uint32) MemBlock::addBlock(allocSize);
- } else {
- np = (uint32) gm_malloc(allocSize);
- }
-
- if (np) {
- up = (uint32 *)np;
- *up = ALIGNED_SIZE(size) | MALLOC_MASK; // mem size: up to 8mb
- up = (uint32 *)(np + ALIGNED_SIZE(size) + sizeof(uint32));
- *up = 0x1234; // catches oob acess
- return (void *)(np + sizeof(uint32));
- }
-
- return NULL;
-}
-
-void gp_free(void *block) {
- uint32 np;
- uint32 *up;
-
- if (!block) {
- return;
- }
-
- np = ((uint32) block) - sizeof(uint32);
- up = (uint32 *) np;
- if (*up == 0x4321) {
- warning("%s: double deallocation", __FUNCTION__);
- return;
- }
-
- if (*up & MALLOC_MASK != MALLOC_MASK) {
- warning("%s: corrupt block", __FUNCTION__);
- return;
- }
-
- int blockSize = (*up & 0x7fffff);
- up = (uint32 *)(np + blockSize + sizeof(uint32));
- if (*up != 0x1234) {
- warning("gp_free: corrupt block - OOB access", __FUNCTION__);
- return;
- }
-
- np = ((uint32) block) - sizeof(uint32);
- up = (uint32 *) np;
- *up = 0x4321;
-
- if (blockSize + 8 <= USER_BLOCK_SIZE) {
- MemBlock::deleteBlock(up);
- } else {
- gm_free(up);
- }
-}
-
-void *gp_calloc(size_t nitems, size_t size) {
- void *p = gp_malloc(nitems * size); //gpcalloc doesnt clear?
-
- gp_memset(p, 0, nitems * size);
-
-// if (*(uint8 *)p != 0)
-// warning("%s: calloc doesn't clear", __FUNCTION__); //fixme: was error
-
- return p;
-}
-
-//////////////////////////////////////////////////
-// GP32 stuff
-//////////////////////////////////////////////////
-static char usedMemStr[16];
-int gUsedMem = 1024 * 1024;
-
-//#define CLEAN_MEMORY_WITH_0xE7
-//#define CHECK_USED_MEMORY
-//#define CHECK_NEW_TIME
-//#define CHECK_NEW_SIZE
-
-void *operator new(size_t size) {
-#if defined(CHECK_NEW_TIME)
- static int ftick;
- ftick = GpTickCountGet();
-#endif
-// printf("BP:operator new(%d)", size);
- void *ptr = gp_malloc(size);
-
-#if defined(CLEAN_MEMORY_WITH_0xE7)
- if (ptr != NULL) {
- gp_memset(ptr, 0xE7, size);
- }
-#endif
-#if defined(CHECK_USED_MEMORY)
- // Check free memory.
- gUsedMem = ((int)(ptr) + size) - 0xc000000;
-
- sprintf(usedMemStr, "%8d", gUsedMem);
- gp_fillRect(frameBuffer1, 0, 0, 64, 12, 0);
- gp_textOut(frameBuffer1, 0, 0, usedMemStr, 0xfffff);
-#endif
-#if defined(CHECK_NEW_TIME)
- sprintf(usedMemStr, "%2d", GpTickCountGet() - ftick);
- gp_fillRect(frameBuffer1, 72, 0, 24, 12, 0);
- gp_textOut(frameBuffer1, 72, 0, usedMemStr, 0xfffff);
-#endif
-#if defined(CHECK_NEW_SIZE)
- sprintf(usedMemStr, "%8d", size);
- gp_fillRect(frameBuffer1, 108, 0, 64, 12, 0);
- gp_textOut(frameBuffer1, 108, 0, usedMemStr, 0xfffff);
-#endif
- return ptr;
-}
-
-void operator delete(void *ptr) {
-// printf("operator delete(%x)", ptr);
- gp_free(ptr);
-}
diff --git a/backends/platform/gp32/gp32std_memory.h b/backends/platform/gp32/gp32std_memory.h
deleted file mode 100644
index b824e33838..0000000000
--- a/backends/platform/gp32/gp32std_memory.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32STD_MEMORY_H
-#define __GP32STD_MEMORY_H
-
-extern void * gp_memcpy(void *dst, const void *src, size_t count);
-extern void * gp_memset(void *dst, int val, size_t count);
-extern void * gp_malloc(size_t size);
-extern void * gp_calloc(size_t nitems, size_t size);
-extern void gp_free(void *block);
-
-#endif
diff --git a/backends/platform/gp32/gp32std_sound.cpp b/backends/platform/gp32/gp32std_sound.cpp
deleted file mode 100644
index 68b33b95f2..0000000000
--- a/backends/platform/gp32/gp32std_sound.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/scummsys.h"
-
-#include "gp32std.h"
-#include "gp32std_sound.h"
-
-#define GP32_TIMER_AUDIO_IDX 0
-
-// Global variables
-static volatile unsigned int frame = 0;
-static volatile unsigned int *soundPos = 0;
-static volatile int idx_buf;
-static volatile unsigned int shiftVal = 0;
-static void *buffer;
-static GPSOUNDBUF soundBuf;
-
-// This routine gets called by the timer interrupt and
-// polls the current playing position within the buffer.
-
-static void soundTimer() {
- static int locked = false;
-
- if (locked) {
- return;
- }
-
- locked = true;
-
- unsigned int sampleshiftVal = soundBuf.samples << shiftVal;
- unsigned int t = (((unsigned int)(*soundPos) - (unsigned int)buffer) >> shiftVal) >= soundBuf.samples ? 1 : 0;
- if (t != frame) {
- unsigned int offs = ((frame == 1) ? (sampleshiftVal) : 0);
- //memset((uint8 *)buffer + offs, 0, sampleshiftVal);
- soundBuf.callback(soundBuf.userdata, (uint8 *)((unsigned int)buffer + offs), sampleshiftVal);
- frame = t;
- {
- // Play silence
- register uint16 *d = (uint16 *)((uint8 *)buffer + offs); // alignment-safe
- register uint32 max = (uint32)((uint8 *)buffer + offs + sampleshiftVal);
- do {
- *d++ ^= 0x8000; // 1
- *d++ ^= 0x8000; // 2
- *d++ ^= 0x8000; // 3
- *d++ ^= 0x8000; // 4
- *d++ ^= 0x8000; // 5
- *d++ ^= 0x8000; // 6
- *d++ ^= 0x8000; // 7
- *d++ ^= 0x8000; // 8
- *d++ ^= 0x8000; // 9
- *d++ ^= 0x8000; // 10
- *d++ ^= 0x8000; // 11
- *d++ ^= 0x8000; // 12
- *d++ ^= 0x8000; // 13
- *d++ ^= 0x8000; // 14
- *d++ ^= 0x8000; // 15
- *d++ ^= 0x8000; // 16
- *d++ ^= 0x8000; // 17
- *d++ ^= 0x8000; // 18
- *d++ ^= 0x8000; // 19
- *d++ ^= 0x8000; // 20
- *d++ ^= 0x8000; // 21
- *d++ ^= 0x8000; // 22
- *d++ ^= 0x8000; // 23
- *d++ ^= 0x8000; // 24
- *d++ ^= 0x8000; // 25
- *d++ ^= 0x8000; // 26
- *d++ ^= 0x8000; // 27
- *d++ ^= 0x8000; // 28
- *d++ ^= 0x8000; // 29
- *d++ ^= 0x8000; // 30
- *d++ ^= 0x8000; // 31
- *d++ ^= 0x8000; // 32
- } while ((uint32)d < max);
- }
- }
-
- locked = false;
-}
-
-int gp_soundBufStart(GPSOUNDBUF *sb) {
- int bufferSize = 0;
-
- PCM_SR gpFreq = PCM_S11;
- PCM_BIT gpFormat = PCM_16BIT;
-
- frame = 0;
-
- // Copy the structure
- memcpy(&soundBuf, sb, sizeof(GPSOUNDBUF));
-
- // Calculate size of a single sample in bytes
- // and a corresponding shift value
- shiftVal = 0;
-
- switch (soundBuf.format) {
- case 8:
- gpFormat = PCM_8BIT;
- break;
- case 16:
- gpFormat = PCM_16BIT;
- shiftVal++;
- break;
- }
-
- switch (soundBuf.freq) {
- case 11025:
- if (soundBuf.channels == 2) {
- gpFreq = PCM_S11;
- shiftVal++;
- } else
- gpFreq = PCM_M11;
- break;
- case 22050:
- if (soundBuf.channels == 2) {
- gpFreq = PCM_S22;
- shiftVal++;
- } else
- gpFreq = PCM_M22;
- break;
- case 44100:
- if (soundBuf.channels == 2) {
- gpFreq = PCM_S44;
- shiftVal++;
- } else
- gpFreq = PCM_M44;
- break;
- }
-
- soundBuf.samplesize = 1 << shiftVal;
-
- // Allocate memory for the playing buffer
- bufferSize = soundBuf.samplesize * soundBuf.samples * 2;
- buffer = malloc(bufferSize);
-
- // Clear the buffer
- uint16 *tmpBuf = (uint16 *)buffer;
- for (int i = 0; i < bufferSize / 2; i++)
- tmpBuf[i] = 0x8000;
-
- // Frequency of the timer interrupt which polls the playing position
- // FIXME: This frequency should not be multiplied by 4.
- soundBuf.pollfreq = 4 * (2 * soundBuf.freq) / soundBuf.samples;
-
- // Set timer interrupt
- if (GpTimerOptSet(GP32_TIMER_AUDIO_IDX, soundBuf.pollfreq, 0, soundTimer) == GPOS_ERR_ALREADY_USED) {
- GPDEBUG(" Timer is already used... kill timer");
- GpTimerKill(GP32_TIMER_AUDIO_IDX);
- }
- GpTimerSet(GP32_TIMER_AUDIO_IDX);
-
- GpPcmInit(gpFreq, gpFormat);
- GpPcmPlay((unsigned short *)buffer, bufferSize, 1);
- GpPcmLock((unsigned short *)buffer, (int *)&idx_buf, (unsigned int *)&soundPos);
-
- return 0;
-}
-
-void gp_soundBufStop() {
- GpTimerKill(GP32_TIMER_AUDIO_IDX);
- GpPcmStop();
- GpPcmRemove((unsigned short *)buffer);
- free(buffer);
-}
diff --git a/backends/platform/gp32/gp32std_sound.h b/backends/platform/gp32/gp32std_sound.h
deleted file mode 100644
index ad3f18a17f..0000000000
--- a/backends/platform/gp32/gp32std_sound.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef __GP32STD_SOUND_H
-#define __GP32STD_SOUND_H
-
-// GPSOUNDBUF.userdata / Pointer to the buffer which needs to be refilled / Length of the buffer in bytes
-typedef void SoundProc(void *param, byte *buf, int len);
-
-typedef struct TGPSOUNDBUF {
- int32 freq;
- uint16 format;
- uint16 samples; // Buffer length (in samples)
- uint16 channels;
- uint16 padding; // Fix alignment problem
- void *userdata; // Userdata which gets passed to the callback function
- SoundProc *callback; // Callback function (just like in SDL)
- unsigned int pollfreq; // Frequency of the timer interrupt which polls the playing position
- // recommended value: 2*(playingfreq in Hz/GPSOUNDBUF.samples)
- unsigned int samplesize; // Size of one sample (8bit mono->1, 16bit stereo->4) - don't touch this
-} GPSOUNDBUF;
-
-int gp_soundBufStart(GPSOUNDBUF *sb);
-void gp_soundBufStop();
-
-#endif
diff --git a/backends/platform/gp32/gp_asmlib.s b/backends/platform/gp32/gp_asmlib.s
deleted file mode 100644
index e1f1d8cb39..0000000000
--- a/backends/platform/gp32/gp_asmlib.s
+++ /dev/null
@@ -1,426 +0,0 @@
- .ALIGN
-@ .ARM
-
- .GLOBAL cpu_speed
- .GLOBAL mmu_change
- .GLOBAL gp_enableIRQ
- .GLOBAL gp_disableIRQ
- .GLOBAL gp_installSWIIRQ
- .GLOBAL gp_removeSWIIRQ
-
-cpu_speed:
- stmdb r13!, {r0-r12,lr}
- stmdb sp!, {r0, r1, r2}
- mov r0, sp
- swi #0x0d
- add sp, sp, #12
- ldmia r13!, {r0-r12,lr}
- bx lr
- nop
-
-mmu_change:
- stmdb r13!, {r0-r12,lr}
- swi #0x02
- ldmia r13!, {r0-r12,lr}
- bx lr
- nop
-
-gp_enableIRQ:
- stmdb r13!, {r0,lr}
- mrs r0, CPSR
- bic r0, r0, #0x80
- msr CPSR, r0
- ldmia r13!, {r0,pc}
- bx lr
-
-gp_disableIRQ:
- stmdb r13!, {r0,lr}
- MRS r0, CPSR
- ORR r0, r0, #0xc0
- MSR CPSR, r0
- ldmia r13!, {r0,pc}
- bx lr
-
-gp_installSWIIRQ:
- stmdb r13!, {r14}
- swi 0x9
- ldmia r13!, {pc}
- bx lr
-
-gp_removeSWIIRQ:
- stmdb r13!, {r14}
- swi 0xa
- ldmia r13!, {pc}
- bx lr
-
-
-@ ******** ASMFastSolidBlit(unsigned char *src4, unsigned char *dst4, int nbx, int nby, int height2, int trans, int coul) ********
-
- .ALIGN
- .GLOBAL ASMFastSolidBlit
- .TYPE ASMFastSolidBlit, function
- .CODE 32
-
-@r0 = src4
-@r1 = dst4
-@r2 = nbx
-@r3 = nby
-
-@r4 = height2
-@r5 = trans
-@r6 = coul
-@r7 = tmp
-@r8 = tmpnby
-@r9 = tmp2
-
-_bx7:
- ldrb r8,[r0,+r3] @lecture 1er pixel
- subs r7,r3,#1
- bmi _sauty2
-
-_sauty2: @ecriture r8
- TEQ r8,r5
- STRNEB r8,[r1,+r7]
- SUB r0,r0,r4
- SUB r1,r1,#240
- SUBS r2,r2,#1
- BPL _bx7
-
- ldmfd r13!,{r4-r8}
- add sp,sp,#8
- bx lr
-
-ASMFastSolidBlit:
-
- sub sp,sp,#12
- stmfd r13!,{r4-r9}
- ldr r4,[r13,#36]
- ldr r5,[r13,#40]
- ldr r6,[r13,#44]
-
-_bx8:
- ldrb r9,[r0,+r3] @lecture 1er pixel
- subs r8,r3,#1
- bmi _sauty2
-
-_by8:
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3
- LDRB r7,[r0,+r8]
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
- BMI _sauty3b
- LDRB r9,[r0,+r8]
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUBS r8,r8,#1
-
- BPL _by8
-
-_sauty3: @ecriture pour r9
- TEQ r9,r5
- STRNEB r6,[r1,+r8]
- SUB r0,r0,r4
- SUB r1,r1,#240
- SUBS r2,r2,#1
- BPL _bx8
-
- ldmfd r13!,{r4-r9}
- add sp,sp,#12
- bx lr
-
-_sauty3b: @ecriture pour r7
- TEQ r7,r5
- STRNEB r6,[r1,+r8]
- SUB r0,r0,r4
- SUB r1,r1,#240
- SUBS r2,r2,#1
- BPL _bx8
-
- ldmfd r13!,{r4-r9}
- add sp,sp,#12
- bx lr
-
-
-@ ******** ASMSaveBitmap(unsigned char *src4, unsigned char *dst, int nbx, int nby, int height2) ********
-
- .ALIGN
- .GLOBAL ASMSaveBitmap
- .TYPE ASMSaveBitmap, function
- .CODE 32
-
-@r0 = src4
-@r1 = dst + 1
-@r2 = nbx
-@r3 = nby
-
-@r7 = height2
-@r8 = tmp
-@r9 = tmpnby
-@r10 = dst4
-
-ASMSaveBitmap:
-
- sub sp,sp,#4
- stmfd r13!,{r7-r10}
- LDR r7,[r13,#20]
-
-_bx6:
- MLA r10,r2,r7,r1
- MOV r9,r3
-
-_by6:
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
- BMI _fincol6
- LDRB r8,[r0,+r9]
- SUBS r9,r9,#1
- STRB r8,[r10,+r9]
-
- BPL _by6
-
-_fincol6:
- SUB r0,r0,#240
- SUBS r2,r2,#1
- BPL _bx6
-
- ldmfd r13!,{r7-r10}
- add sp,sp,#4
- bx lr
-
-
- .ALIGN
- .GLOBAL gp_clearFramebuffer
- .TYPE gp_clearFramebuffer, function
- .CODE 32
-gp_clearFramebuffer:
- @ r0 = framebuffer
- @ r1 = color
- orr r1,r1,r1,lsl #16 @hi halfword = lo halfword
- mov r2,#38400
-clear: str r1,[r0],#4
- subs r2,r2,#1
- bne clear
- bx lr
-
-
-@ ******** ASMFastClear(unsigned char *dst4, int nbx, int nby) ********
-
- .ALIGN
- .GLOBAL ASMFastClear
- .TYPE ASMFastClear, function
- .CODE 32
-
-@r0 = dst4
-@r1 = nbx
-@r2 = nby
-
-@r3 = #0
-@r4 = tmpnby
-
-@optimis?pour h=20
-
-ASMFastClear:
-
- str r4,[sp,#-4]!
- MOV r3,#0
-
-_bx9:
- MOV r4,r2
-
-_by9:
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
- BMI _sauty4
- STRB r3,[r0,+r4]
- SUBS r4,r4,#1
-
- BPL _by9
-
-_sauty4:
- SUB r0,r0,#240
- SUBS r1,r1,#1
- BPL _bx9
-
- ldr r4,[sp],#4
- bx lr
diff --git a/backends/platform/gp32/gp_clipped.c b/backends/platform/gp32/gp_clipped.c
deleted file mode 100644
index 5bcb9358d3..0000000000
--- a/backends/platform/gp32/gp_clipped.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-//Some global variables and macros
-
-#define screen_width 320
-#define screen_height 240
-
-void gp_FastSolidBlit(void *framebuffer, int dx, const int dy, const int width, const int height, const unsigned char *src, const int trans, const int coul) {
- int xmin, ymin, xmax, ymax;
- int height2 = ( (height + 3) >> 2) << 2;
-
- if(dx < 0) {
- xmin = -dx;
- } else xmin = 0;
- if( (dx++ + width) > screen_width) {
- xmax = screen_width - dx;
- } else xmax = width - 1;
- if(dy < 0) {
- ymax = height + dy - 1;
- } else ymax = height - 1;
- if( (dy + height) > screen_height) {
- ymin = dy + height - screen_height;
- } else ymin = 0;
- if( (xmin > xmax) || (ymin > ymax) ) return;
-
- unsigned char *dst4 = framebuffer + (dx + xmax) * screen_height - height - dy + 1 + ymin;
- src += (xmax * height2 + ymin);
- ASMFastSolidBlit(src, dst4, xmax - xmin, ymax - ymin, height2, trans, coul);
-}
-
-//Copy from framebuffer to dest
-void gp_SaveBitmap(void *framebuffer, int dx, const int dy, const int width, const int height, const unsigned char *dest) { //Sur l'icran
- int xmin, ymin, xmax, ymax;
- int height2 = ( (height + 3) >> 2) << 2;
-
- if(dx < 0) {
- xmin = -dx;
- } else xmin = 0;
- if( (dx++ + width) > screen_width) {
- xmax = screen_width - dx;
- } else xmax = width - 1;
- if(dy < 0) {
- ymax = height + dy - 1;
- } else ymax = height - 1;
- if( (dy + height) > screen_height) {
- ymin = dy + height - screen_height;
- } else ymin = 0;
- if( (xmin > xmax) || (ymin > ymax) ) return;
-
- unsigned char *src4 = framebuffer + (dx + xmax) * screen_height - height - dy + ymin;
- dest += (xmin * height2 + ymin + 1);
- ASMSaveBitmap(src4, dest, xmax - xmin, ymax - ymin, height2);
-}
-
-//Clears area with color #0, should not trigger clicky noise
-
-void gp_FastClear(void *framebuffer, int dx, int dy, int width, int height) {
- int xmin, ymin, xmax, ymax;
-
- if(dx < 0) {
- xmin = -dx;
- } else xmin = 0;
- if( (dx++ + width) > screen_width) {
- xmax = screen_width - dx;
- } else xmax = width - 1;
- if(dy < 0) {
- ymax = height + dy - 1;
- } else ymax = height - 1;
- if( (dy + height) > screen_height) {
- ymin = dy + height - screen_height;
- } else ymin = 0;
- if( (xmin > xmax) || (ymin > ymax) ) return;
-
- int decaly = screen_height - height - dy;
-
- unsigned char *dst4 = framebuffer + (dx + xmax) * screen_height - height - dy + ymin;
- ASMFastClear(dst4, xmax - xmin, ymax - ymin);
-}
diff --git a/backends/platform/gp32/gpmad/readme.txt b/backends/platform/gp32/gpmad/readme.txt
deleted file mode 100644
index edceb8494d..0000000000
--- a/backends/platform/gp32/gpmad/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-You may put libgpmad.a and the header files in this directory when you build with MAD library. \ No newline at end of file
diff --git a/backends/platform/gp32/gptremor/readme.txt b/backends/platform/gp32/gptremor/readme.txt
deleted file mode 100644
index fa1b02b198..0000000000
--- a/backends/platform/gp32/gptremor/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-You may put libgptremor.a and the header files in this directory when you build with Tremor library. \ No newline at end of file
diff --git a/backends/platform/gp32/memcpy.S b/backends/platform/gp32/memcpy.S
deleted file mode 100644
index 12853dbfc4..0000000000
--- a/backends/platform/gp32/memcpy.S
+++ /dev/null
@@ -1,498 +0,0 @@
-/* $NetBSD: memcpy.S,v 1.3 1997/11/22 03:27:12 mark Exp $ */
-
-/*-
-* Copyright (c) 1997 The NetBSD Foundation, Inc.
-* All rights reserved.
-*
-* This code is derived from software contributed to The NetBSD Foundation
-* by Neil A. Carson and Mark Brinicombe
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-* 1. Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-* 2. Redistributions in binary form must reproduce the above copyright
-* notice, this list of conditions and the following disclaimer in the
-* documentation and/or other materials provided with the distribution.
-* 3. All advertising materials mentioning features or use of this software
-* must display the following acknowledgement:
-* This product includes software developed by the NetBSD
-* Foundation, Inc. and its contributors.
-* 4. Neither the name of The NetBSD Foundation nor the names of its
-* contributors may be used to endorse or promote products derived
-* from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-* ``AS IS\'\' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* This was modified by Jay Monkman <jmonkman@smoothsmoothie.com> to
-* save and restore r12. This is necessary for RTEMS.
-*/
-/* #include <machine/asm.h>*/
-
-#define ENTRY(_LABEL) \
- .global _LABEL; _LABEL:
-/*
-.globl memcpy
-memcpy:
-*/
-ENTRY(memcpy)
-stmfd sp!, {r0, r12, lr}
-bl _memcpy
-ldmfd sp!, {r0, r12, pc}
-
-
-/*
-.globl memove
-memmove:
-*/
-ENTRY(memmove)
-stmfd sp!, {r0, r12, lr}
-bl _memcpy
-ldmfd sp!, {r0, r12, pc}
-
-
-
-/*
-* This is one fun bit of code ...
-* Some easy listening music is suggested while trying to understand this
-* code e.g. Iron Maiden
-*
-* For anyone attempting to understand it :
-*
-* The core code is implemented here with simple stubs for memcpy()
-* memmove() and bcopy().
-*
-* All local labels are prefixed with Lmemcpy_
-* Following the prefix a label starting f is used in the forward copy code
-* while a label using b is used in the backwards copy code
-* The source and destination addresses determine whether a forward or
-* backward copy is performed.
-* Separate bits of code are used to deal with the following situations
-* for both the forward and backwards copy.
-* unaligned source address
-* unaligned destination address
-* Separate copy routines are used to produce an optimised result for each
-* of these cases.
-* The copy code will use LDM/STM instructions to copy up to 32 bytes at
-* a time where possible.
-*
-* Note: r12 (aka ip) can be trashed during the function along with
-* r0-r3 although r0-r2 have defined uses i.e. src, dest, len through out.
-* Additional registers are preserved prior to use i.e. r4, r5 & lr
-*
-* Apologies for the state of the comments;-)
-*/
-
-
-/*
-_memcpy:
-*/
-ENTRY(_memcpy)
-/* Determine copy direction */
-cmp r1, r0
-bcc Lmemcpy_backwards
-
-moveq r0, #0 /* Quick abort for len=0 */
-moveq pc, lr
-
-stmdb sp!, {r0, lr} /* memcpy() returns dest addr */
-subs r2, r2, #4
-blt Lmemcpy_fl4 /* less than 4 bytes */
-ands r12, r0, #3
-bne Lmemcpy_fdestul /* oh unaligned destination addr */
-ands r12, r1, #3
-bne Lmemcpy_fsrcul /* oh unaligned source addr */
-
-Lmemcpy_ft8:
-/* We have aligned source and destination */
-subs r2, r2, #8
-blt Lmemcpy_fl12 /* less than 12 bytes (4 from above) */
-subs r2, r2, #0x14
-blt Lmemcpy_fl32 /* less than 32 bytes (12 from above) */
-stmdb sp!, {r4} /* borrow r4 */
-
-/* blat 32 bytes at a time */
-/* XXX for really big copies perhaps we should use more registers */
-Lmemcpy_floop32:
-ldmia r1!, {r3, r4, r12, lr}
-stmia r0!, {r3, r4, r12, lr}
-ldmia r1!, {r3, r4, r12, lr}
-stmia r0!, {r3, r4, r12, lr}
-subs r2, r2, #0x20
-bge Lmemcpy_floop32
-
-cmn r2, #0x10
-ldmgeia r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
-stmgeia r0!, {r3, r4, r12, lr}
-subge r2, r2, #0x10
-ldmia sp!, {r4} /* return r4 */
-
-Lmemcpy_fl32:
-adds r2, r2, #0x14
-
-/* blat 12 bytes at a time */
-Lmemcpy_floop12:
-ldmgeia r1!, {r3, r12, lr}
-stmgeia r0!, {r3, r12, lr}
-subges r2, r2, #0x0c
-bge Lmemcpy_floop12
-
-Lmemcpy_fl12:
-adds r2, r2, #8
-blt Lmemcpy_fl4
-
-subs r2, r2, #4
-ldrlt r3, [r1], #4
-strlt r3, [r0], #4
-ldmgeia r1!, {r3, r12}
-stmgeia r0!, {r3, r12}
-subge r2, r2, #4
-
-Lmemcpy_fl4:
-/* less than 4 bytes to go */
-adds r2, r2, #4
-ldmeqia sp!, {r0, pc} /* done */
-
-/* copy the crud byte at a time */
-cmp r2, #2
-ldrb r3, [r1], #1
-strb r3, [r0], #1
-ldrgeb r3, [r1], #1
-strgeb r3, [r0], #1
-ldrgtb r3, [r1], #1
-strgtb r3, [r0], #1
-ldmia sp!, {r0, pc}
-
-/* erg - unaligned destination */
-Lmemcpy_fdestul:
-rsb r12, r12, #4
-cmp r12, #2
-
-/* align destination with byte copies */
-ldrb r3, [r1], #1
-strb r3, [r0], #1
-ldrgeb r3, [r1], #1
-strgeb r3, [r0], #1
-ldrgtb r3, [r1], #1
-strgtb r3, [r0], #1
-subs r2, r2, r12
-blt Lmemcpy_fl4 /* less the 4 bytes */
-
-ands r12, r1, #3
-beq Lmemcpy_ft8 /* we have an aligned source */
-
-/* erg - unaligned source */
-/* This is where it gets nasty ... */
-Lmemcpy_fsrcul:
-bic r1, r1, #3
-ldr lr, [r1], #4
-cmp r12, #2
-bgt Lmemcpy_fsrcul3
-beq Lmemcpy_fsrcul2
-cmp r2, #0x0c
-blt Lmemcpy_fsrcul1loop4
-sub r2, r2, #0x0c
-stmdb sp!, {r4, r5}
-
-Lmemcpy_fsrcul1loop16:
-mov r3, lr, lsr #8
-ldmia r1!, {r4, r5, r12, lr}
-orr r3, r3, r4, lsl #24
-mov r4, r4, lsr #8
-orr r4, r4, r5, lsl #24
-mov r5, r5, lsr #8
-orr r5, r5, r12, lsl #24
-mov r12, r12, lsr #8
-orr r12, r12, lr, lsl #24
-stmia r0!, {r3-r5, r12}
-subs r2, r2, #0x10
-bge Lmemcpy_fsrcul1loop16
-ldmia sp!, {r4, r5}
-adds r2, r2, #0x0c
-blt Lmemcpy_fsrcul1l4
-
-Lmemcpy_fsrcul1loop4:
-mov r12, lr, lsr #8
-ldr lr, [r1], #4
-orr r12, r12, lr, lsl #24
-str r12, [r0], #4
-subs r2, r2, #4
-bge Lmemcpy_fsrcul1loop4
-
-Lmemcpy_fsrcul1l4:
-sub r1, r1, #3
-b Lmemcpy_fl4
-
-Lmemcpy_fsrcul2:
-cmp r2, #0x0c
-blt Lmemcpy_fsrcul2loop4
-sub r2, r2, #0x0c
-stmdb sp!, {r4, r5}
-
-Lmemcpy_fsrcul2loop16:
-mov r3, lr, lsr #16
-ldmia r1!, {r4, r5, r12, lr}
-orr r3, r3, r4, lsl #16
-mov r4, r4, lsr #16
-orr r4, r4, r5, lsl #16
-mov r5, r5, lsr #16
-orr r5, r5, r12, lsl #16
-mov r12, r12, lsr #16
-orr r12, r12, lr, lsl #16
-stmia r0!, {r3-r5, r12}
-subs r2, r2, #0x10
-bge Lmemcpy_fsrcul2loop16
-ldmia sp!, {r4, r5}
-adds r2, r2, #0x0c
-blt Lmemcpy_fsrcul2l4
-
-Lmemcpy_fsrcul2loop4:
-mov r12, lr, lsr #16
-ldr lr, [r1], #4
-orr r12, r12, lr, lsl #16
-str r12, [r0], #4
-subs r2, r2, #4
-bge Lmemcpy_fsrcul2loop4
-
-Lmemcpy_fsrcul2l4:
-sub r1, r1, #2
-b Lmemcpy_fl4
-
-Lmemcpy_fsrcul3:
-cmp r2, #0x0c
-blt Lmemcpy_fsrcul3loop4
-sub r2, r2, #0x0c
-stmdb sp!, {r4, r5}
-
-Lmemcpy_fsrcul3loop16:
-mov r3, lr, lsr #24
-ldmia r1!, {r4, r5, r12, lr}
-orr r3, r3, r4, lsl #8
-mov r4, r4, lsr #24
-orr r4, r4, r5, lsl #8
-mov r5, r5, lsr #24
-orr r5, r5, r12, lsl #8
-mov r12, r12, lsr #24
-orr r12, r12, lr, lsl #8
-stmia r0!, {r3-r5, r12}
-subs r2, r2, #0x10
-bge Lmemcpy_fsrcul3loop16
-ldmia sp!, {r4, r5}
-adds r2, r2, #0x0c
-blt Lmemcpy_fsrcul3l4
-
-Lmemcpy_fsrcul3loop4:
-mov r12, lr, lsr #24
-ldr lr, [r1], #4
-orr r12, r12, lr, lsl #8
-str r12, [r0], #4
-subs r2, r2, #4
-bge Lmemcpy_fsrcul3loop4
-
-Lmemcpy_fsrcul3l4:
-sub r1, r1, #1
-b Lmemcpy_fl4
-
-Lmemcpy_backwards:
-add r1, r1, r2
-add r0, r0, r2
-subs r2, r2, #4
-blt Lmemcpy_bl4 /* less than 4 bytes */
-ands r12, r0, #3
-bne Lmemcpy_bdestul /* oh unaligned destination addr */
-ands r12, r1, #3
-bne Lmemcpy_bsrcul /* oh unaligned source addr */
-
-Lmemcpy_bt8:
-/* We have aligned source and destination */
-subs r2, r2, #8
-blt Lmemcpy_bl12 /* less than 12 bytes (4 from above) */
-stmdb sp!, {r4, lr}
-subs r2, r2, #0x14 /* less than 32 bytes (12 from above) */
-blt Lmemcpy_bl32
-
-/* blat 32 bytes at a time */
-/* XXX for really big copies perhaps we should use more registers */
-Lmemcpy_bloop32:
-ldmdb r1!, {r3, r4, r12, lr}
-stmdb r0!, {r3, r4, r12, lr}
-ldmdb r1!, {r3, r4, r12, lr}
-stmdb r0!, {r3, r4, r12, lr}
-subs r2, r2, #0x20
-bge Lmemcpy_bloop32
-
-Lmemcpy_bl32:
-cmn r2, #0x10
-ldmgedb r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
-stmgedb r0!, {r3, r4, r12, lr}
-subge r2, r2, #0x10
-adds r2, r2, #0x14
-ldmgedb r1!, {r3, r12, lr} /* blat a remaining 12 bytes */
-stmgedb r0!, {r3, r12, lr}
-subge r2, r2, #0x0c
-ldmia sp!, {r4, lr}
-
-Lmemcpy_bl12:
-adds r2, r2, #8
-blt Lmemcpy_bl4
-subs r2, r2, #4
-ldrlt r3, [r1, #-4]!
-strlt r3, [r0, #-4]!
-ldmgedb r1!, {r3, r12}
-stmgedb r0!, {r3, r12}
-subge r2, r2, #4
-
-Lmemcpy_bl4:
-/* less than 4 bytes to go */
-adds r2, r2, #4
-moveq pc, lr /* done */
-
-/* copy the crud byte at a time */
-cmp r2, #2
-ldrb r3, [r1, #-1]!
-strb r3, [r0, #-1]!
-ldrgeb r3, [r1, #-1]!
-strgeb r3, [r0, #-1]!
-ldrgtb r3, [r1, #-1]!
-strgtb r3, [r0, #-1]!
-mov pc, lr
-
-/* erg - unaligned destination */
-Lmemcpy_bdestul:
-cmp r12, #2
-
-/* align destination with byte copies */
-ldrb r3, [r1, #-1]!
-strb r3, [r0, #-1]!
-ldrgeb r3, [r1, #-1]!
-strgeb r3, [r0, #-1]!
-ldrgtb r3, [r1, #-1]!
-strgtb r3, [r0, #-1]!
-subs r2, r2, r12
-blt Lmemcpy_bl4 /* less than 4 bytes to go */
-ands r12, r1, #3
-beq Lmemcpy_bt8 /* we have an aligned source */
-
-/* erg - unaligned source */
-/* This is where it gets nasty ... */
-Lmemcpy_bsrcul:
-bic r1, r1, #3
-ldr r3, [r1, #0]
-cmp r12, #2
-blt Lmemcpy_bsrcul1
-beq Lmemcpy_bsrcul2
-cmp r2, #0x0c
-blt Lmemcpy_bsrcul3loop4
-sub r2, r2, #0x0c
-stmdb sp!, {r4, r5, lr}
-
-Lmemcpy_bsrcul3loop16:
-mov lr, r3, lsl #8
-ldmdb r1!, {r3-r5, r12}
-orr lr, lr, r12, lsr #24
-mov r12, r12, lsl #8
-orr r12, r12, r5, lsr #24
-mov r5, r5, lsl #8
-orr r5, r5, r4, lsr #24
-mov r4, r4, lsl #8
-orr r4, r4, r3, lsr #24
-stmdb r0!, {r4, r5, r12, lr}
-subs r2, r2, #0x10
-bge Lmemcpy_bsrcul3loop16
-ldmia sp!, {r4, r5, lr}
-adds r2, r2, #0x0c
-blt Lmemcpy_bsrcul3l4
-
-Lmemcpy_bsrcul3loop4:
-mov r12, r3, lsl #8
-ldr r3, [r1, #-4]!
-orr r12, r12, r3, lsr #24
-str r12, [r0, #-4]!
-subs r2, r2, #4
-bge Lmemcpy_bsrcul3loop4
-
-Lmemcpy_bsrcul3l4:
-add r1, r1, #3
-b Lmemcpy_bl4
-
-Lmemcpy_bsrcul2:
-cmp r2, #0x0c
-blt Lmemcpy_bsrcul2loop4
-sub r2, r2, #0x0c
-stmdb sp!, {r4, r5, lr}
-
-Lmemcpy_bsrcul2loop16:
-mov lr, r3, lsl #16
-ldmdb r1!, {r3-r5, r12}
-orr lr, lr, r12, lsr #16
-mov r12, r12, lsl #16
-orr r12, r12, r5, lsr #16
-mov r5, r5, lsl #16
-orr r5, r5, r4, lsr #16
-mov r4, r4, lsl #16
-orr r4, r4, r3, lsr #16
-stmdb r0!, {r4, r5, r12, lr}
-subs r2, r2, #0x10
-bge Lmemcpy_bsrcul2loop16
-ldmia sp!, {r4, r5, lr}
-adds r2, r2, #0x0c
-blt Lmemcpy_bsrcul2l4
-
-Lmemcpy_bsrcul2loop4:
-mov r12, r3, lsl #16
-ldr r3, [r1, #-4]!
-orr r12, r12, r3, lsr #16
-str r12, [r0, #-4]!
-subs r2, r2, #4
-bge Lmemcpy_bsrcul2loop4
-
-Lmemcpy_bsrcul2l4:
-add r1, r1, #2
-b Lmemcpy_bl4
-
-Lmemcpy_bsrcul1:
-cmp r2, #0x0c
-blt Lmemcpy_bsrcul1loop4
-sub r2, r2, #0x0c
-stmdb sp!, {r4, r5, lr}
-
-Lmemcpy_bsrcul1loop32:
-mov lr, r3, lsl #24
-ldmdb r1!, {r3-r5, r12}
-orr lr, lr, r12, lsr #8
-mov r12, r12, lsl #24
-orr r12, r12, r5, lsr #8
-mov r5, r5, lsl #24
-orr r5, r5, r4, lsr #8
-mov r4, r4, lsl #24
-orr r4, r4, r3, lsr #8
-stmdb r0!, {r4, r5, r12, lr}
-subs r2, r2, #0x10
-bge Lmemcpy_bsrcul1loop32
-ldmia sp!, {r4, r5, lr}
-adds r2, r2, #0x0c
-blt Lmemcpy_bsrcul1l4
-
-Lmemcpy_bsrcul1loop4:
-mov r12, r3, lsl #24
-ldr r3, [r1, #-4]!
-orr r12, r12, r3, lsr #8
-str r12, [r0, #-4]!
-subs r2, r2, #4
-bge Lmemcpy_bsrcul1loop4
-
-Lmemcpy_bsrcul1l4:
-add r1, r1, #1
-b Lmemcpy_bl4
diff --git a/backends/platform/gp32/minilzo/readme.txt b/backends/platform/gp32/minilzo/readme.txt
deleted file mode 100644
index 5cf1a9b360..0000000000
--- a/backends/platform/gp32/minilzo/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-You may put libminlzo.a and the header files in this directory when you build with MINILZO library. \ No newline at end of file
diff --git a/backends/platform/gp32/portdefs.h b/backends/platform/gp32/portdefs.h
deleted file mode 100644
index dd0d70a25a..0000000000
--- a/backends/platform/gp32/portdefs.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef PORTDEFS_H
-#define PORTDEFS_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <math.h>
-#include <time.h>
-#include <cctype>
-
-#include "gp32std.h"
-#include "gp32std_file.h"
-#include "gp32std_memory.h"
-
-#undef byte
-
-#undef malloc
-#undef calloc
-#undef free
-
-#undef stderr
-#undef stdout
-#undef stdin
-
-#undef fopen
-#undef fread
-#undef fwrite
-#undef fclose
-#undef ftell
-#undef rewind
-#undef fseek
-
-#undef ferror
-#undef clearerr
-
-#undef feof
-#undef getc
-
-#define FILE GPFILE
-
-#define stderr gp_stderr
-#define stdout gp_stdout
-#define stdin gp_stdin
-
-#define fopen gp_fopen
-#define fread gp_fread
-#define fwrite gp_fwrite
-#define fclose gp_fclose
-#define fseek gp_fseek
-#define ftell gp_ftell
-#define ferror gp_ferror
-#define clearerr gp_clearerr
-
-#define feof gp_feof
-#define fgets gp_fgets
-#define fgetc gp_fgetc
-#define getc gp_fgetc
-
-#define fprintf gp_fprintf
-#define fflush gp_fflush
-
-#define printf gp_printf
-
-#define exit gp_exit
-
-#define strcpy gp_strcpy
-#define strncpy gp_strncpy
-#define strcat gp_strcat
-#define strdup gp_strdup
-#define sprintf gp_sprintf
-#define strcasecmp gp_strcasecmp
-#define strncasecmp gp_strncasecmp
-
-#define memcpy gp_memcpy
-#define memset gp_memset
-#define malloc gp_malloc
-#define calloc gp_calloc //gm_calloc
-#define free gp_free
-
-#define FUNCTION GPDEBUG("FUNC: %s", __FUNCTION__);
-
-#define DELAY gp_delay(500);
-
-#define MARK printf("MARK: %s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
-
-#define assert(e) ((e) ? 0 : (printf("!AS: " #e " (%s, %d)\n", __FILE__, __LINE__)))
-#define ASSERT assert
-
-#define ENDLESSLOOP while (1)
-
-#endif /* PORTDEFS_H */
diff --git a/backends/platform/gp32/scummvm.bmp b/backends/platform/gp32/scummvm.bmp
deleted file mode 100644
index 4f9dce2eb7..0000000000
--- a/backends/platform/gp32/scummvm.bmp
+++ /dev/null
Binary files differ
diff --git a/backends/platform/gp32/startup.c b/backends/platform/gp32/startup.c
deleted file mode 100644
index ad1022ca3c..0000000000
--- a/backends/platform/gp32/startup.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <gpdef.h>
-#include <gpstdlib.h>
-#include <gpfont.h>
-#include <gpfont_port.h>
-#include <gpfontres.dat>
-
-#include <initval_port.h>
-
-#ifdef USE_GP_MEM
- #include <gpmem.h>
-#endif
-
-unsigned int HEAPSTART;
-unsigned int HEAPEND;
-
-void InitializeFont (void);
-extern void GpKeyPollingTimeSet (int loop_cnt);
-extern void GpMain(void *arg);
-
-int main (int arg_len, char * arg_v)
- {
- GM_HEAP_DEF gm_heap_def;
-
- _gp_sdk_init();
-
- // keyboard polling count setting
- GpKeyPollingTimeSet (KEYPOLLING_NUM);
-
- #ifdef USE_GP_MEM
- gm_heap_def.heapstart = (void*)(HEAPSTART);
- gm_heap_def.heapend = (void *)(HEAPEND & ~3);
- gm_heap_init (&gm_heap_def);
-
- gp_mem_func.malloc = gm_malloc;
- gp_mem_func.zimalloc = gm_zi_malloc;
- gp_mem_func.calloc = gm_calloc;
- gp_mem_func.free = gm_free;
- gp_mem_func.availablemem = gm_availablesize;
- gp_mem_func.malloc_ex = gm_malloc_ex;
- gp_mem_func.free_ex = gm_free_ex;
- gp_mem_func.make_mem_partition = gm_make_mem_part;
-
- gp_str_func.memset = gm_memset;
- gp_str_func.memcpy = gm_memcpy;
- gp_str_func.strcpy = gm_strcpy;
- gp_str_func.strncpy = gm_strncpy;
- gp_str_func.strcat = gm_strcat;
- gp_str_func.strncat = gm_strncat;
- gp_str_func.gpstrlen = gm_lstrlen;
- gp_str_func.sprintf = gm_sprintf;
- gp_str_func.uppercase = gm_uppercase;
- gp_str_func.lowercase = gm_lowercase;
- gp_str_func.compare = gm_compare;
- gp_str_func.trim_right = gm_trim_right;
- #endif /*USE_GP_MEM*/
-
- //Font initialize
- InitializeFont ();
-
- GpKernelInitialize ();
-
- GpKernelStart ();
-
- GpAppExit ();
- while (1) {}
- }
-
-void InitializeFont (void)
- {
- BGFONTINFO mInfo;
- mInfo.kor_w = KORFONT_W;
- mInfo.kor_h = KORFONT_H;
- mInfo.eng_w = ENGFONT_W;
- mInfo.eng_h = ENGFONT_H;
- mInfo.chargap = FONT_CHARGAP;
- mInfo.linegap = FONT_LINEGAP;
- GpFontInit (&mInfo);
- GpFontResSet ((unsigned char*)fontresKor, (unsigned char*)fontresEng);
- }
-
-int GpPredefinedStackGet (H_THREAD th)
- {
- switch (th)
- {
- case H_THREAD_GPMAIN:
- return GPMAIN_STACK_SIZE;
- case H_THREAD_NET:
- return NET_STACK_SIZE;
- case H_THREAD_TMR0:
- case H_THREAD_TMR1:
- case H_THREAD_TMR2:
- case H_THREAD_TMR3:
- return USER_STACK_SIZE;
- default:
- return 0;
- }
- }
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 866f5299a0..b750864ad8 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -403,10 +403,10 @@ bool OSystem_SDL::setSoundCallback(SoundProc proc, void *param) {
_samplesPerSec = SAMPLES_PER_SEC;
// Determine the sample buffer size. We want it to store enough data for
- // about 1/10th of a second. Note that it must be a power of two.
+ // about 1/32th of a second. Note that it must be a power of two.
// So e.g. at 22050 Hz, we request a sample buffer size of 2048.
- int samples = 0x8000;
- while (10 * samples >= _samplesPerSec) {
+ int samples = 8192;
+ while (32 * samples >= _samplesPerSec) {
samples >>= 1;
}
diff --git a/backends/platform/wince/CELauncherDialog.cpp b/backends/platform/wince/CELauncherDialog.cpp
index d474110f26..edfdad84b3 100644
--- a/backends/platform/wince/CELauncherDialog.cpp
+++ b/backends/platform/wince/CELauncherDialog.cpp
@@ -28,7 +28,7 @@
#include "CELauncherDialog.h"
-#include "engines/engine.h"
+#include "engines/metaengine.h"
#include "gui/newgui.h"
#include "gui/widget.h"
diff --git a/base/commandLine.cpp b/base/commandLine.cpp
index d2f286cc4a..b9fd4ecfb7 100644
--- a/base/commandLine.cpp
+++ b/base/commandLine.cpp
@@ -46,6 +46,8 @@
#endif
#elif defined(__SYMBIAN32__)
#define DEFAULT_SAVE_PATH "Savegames"
+#elif defined(PALMOS_MODE)
+#define DEFAULT_SAVE_PATH "/PALM/Programs/ScummVM/Saved"
#endif
#define DETECTOR_TESTING_HACK
@@ -146,7 +148,7 @@ static void usage(const char *s, ...) {
vsnprintf(buf, STRINGBUFLEN, s, va);
va_end(va);
-#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__) || defined (__SYMBIAN32__))
+#if !(defined(__GP32__) || defined (__SYMBIAN32__))
printf(USAGE_STRING, s_appName, buf, s_appName, s_appName);
#endif
exit(1);
@@ -229,6 +231,9 @@ void registerDefaults() {
ConfMan.registerDefault("savepath", savePath);
#elif defined (IPHONE)
ConfMan.registerDefault("savepath", OSystem_IPHONE::getSavePath());
+
+#elif defined(PALMOS_MODE)
+ ConfMan.registerDefault("savepath", DEFAULT_SAVE_PATH);
#endif
#endif // #ifdef DEFAULT_SAVE_PATH
@@ -559,8 +564,8 @@ static void listGames() {
printf("Game ID Full Title \n"
"-------------------- ------------------------------------------------------\n");
- const EnginePlugin::list &plugins = EngineMan.getPlugins();
- EnginePlugin::list::const_iterator iter = plugins.begin();
+ const EnginePlugin::List &plugins = EngineMan.getPlugins();
+ EnginePlugin::List::const_iterator iter = plugins.begin();
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
GameList list = (**iter)->getSupportedGames();
for (GameList::iterator v = list.begin(); v != list.end(); ++v) {
diff --git a/base/main.cpp b/base/main.cpp
index 126700ef17..dbf740c2ec 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -90,17 +90,20 @@ static const EnginePlugin *detectPlugin() {
ConfMan.set("gameid", gameid);
// Query the plugins and find one that will handle the specified gameid
- printf("Looking for %s\n", gameid.c_str());
+ printf("User picked target '%s' (gameid '%s')...\n", ConfMan.getActiveDomainName().c_str(), gameid.c_str());
+ printf(" Looking for a plugin supporting this gameid... ");
GameDescriptor game = EngineMan.findGame(gameid, &plugin);
if (plugin == 0) {
- printf("Failed game detection\n");
+ printf("failed\n");
warning("%s is an invalid gameid. Use the --list-games option to list supported gameid", gameid.c_str());
return 0;
+ } else {
+ printf("%s\n", plugin->getName());
}
// FIXME: Do we really need this one?
- printf("Trying to start game '%s'\n", game.description().c_str());
+ printf(" Starting '%s'\n", game.description().c_str());
return plugin;
}
diff --git a/base/plugins.cpp b/base/plugins.cpp
index ac8e498469..7c365c7eb6 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -25,6 +25,8 @@
#include "base/plugins.h"
+#include "common/func.h"
+
#ifdef DYNAMIC_MODULES
#include "common/config-manager.h"
#endif
@@ -284,10 +286,8 @@ void PluginManager::loadPlugins() {
for (ProviderList::iterator pp = _providers.begin();
pp != _providers.end();
++pp) {
- PluginList pl((**pp).getPlugins());
- for (PluginList::iterator plugin = pl.begin(); plugin != pl.end(); ++plugin) {
- tryLoadPlugin(*plugin);
- }
+ PluginList pl((*pp)->getPlugins());
+ Common::for_each(pl.begin(), pl.end(), Common::bind1st(Common::mem_fun(&PluginManager::tryLoadPlugin), this));
}
}
@@ -303,7 +303,7 @@ void PluginManager::unloadPluginsExcept(PluginType type, const Plugin *plugin) {
if (*p == plugin) {
found = *p;
} else {
- (**p).unloadPlugin();
+ (*p)->unloadPlugin();
delete *p;
}
}
@@ -355,13 +355,13 @@ DECLARE_SINGLETON(EngineManager);
GameDescriptor EngineManager::findGame(const Common::String &gameName, const EnginePlugin **plugin) const {
// Find the GameDescriptor for this target
- const EnginePlugin::list &plugins = getPlugins();
+ const EnginePlugin::List &plugins = getPlugins();
GameDescriptor result;
if (plugin)
*plugin = 0;
- EnginePlugin::list::const_iterator iter = plugins.begin();
+ EnginePlugin::List::const_iterator iter = plugins.begin();
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
result = (**iter)->findGame(gameName.c_str());
if (!result.gameid().empty()) {
@@ -376,11 +376,11 @@ GameDescriptor EngineManager::findGame(const Common::String &gameName, const Eng
GameList EngineManager::detectGames(const FSList &fslist) const {
GameList candidates;
- const EnginePlugin::list &plugins = getPlugins();
+ const EnginePlugin::List &plugins = getPlugins();
// Iterate over all known games and for each check if it might be
// the game in the presented directory.
- EnginePlugin::list::const_iterator iter;
+ EnginePlugin::List::const_iterator iter;
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
candidates.push_back((**iter)->detectGames(fslist));
}
@@ -388,8 +388,8 @@ GameList EngineManager::detectGames(const FSList &fslist) const {
return candidates;
}
-const EnginePlugin::list &EngineManager::getPlugins() const {
- return (const EnginePlugin::list&)PluginManager::instance().getPlugins(PLUGIN_TYPE_ENGINE);
+const EnginePlugin::List &EngineManager::getPlugins() const {
+ return (const EnginePlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_ENGINE);
}
@@ -399,6 +399,6 @@ const EnginePlugin::list &EngineManager::getPlugins() const {
DECLARE_SINGLETON(MidiManager);
-const MidiPlugin::list &MidiManager::getPlugins() const {
- return (const MidiPlugin::list&)PluginManager::instance().getPlugins(PLUGIN_TYPE_MIDI);
+const MidiPlugin::List &MidiManager::getPlugins() const {
+ return (const MidiPlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_MIDI);
}
diff --git a/base/plugins.h b/base/plugins.h
index d03a240922..2eaa290ed7 100644
--- a/base/plugins.h
+++ b/base/plugins.h
@@ -63,6 +63,7 @@
enum PluginType {
PLUGIN_TYPE_ENGINE = 0,
PLUGIN_TYPE_MIDI,
+ /* PLUGIN_TYPE_SCALER, */ // TODO: Add graphics scaler plugins
PLUGIN_TYPE_MAX
};
@@ -81,16 +82,10 @@ extern int pluginTypeVersions[PLUGIN_TYPE_MAX];
#define DYNAMIC_PLUGIN 2
#define PLUGIN_ENABLED_STATIC(ID) \
- (defined(ENABLE_##ID) && !PLUGIN_ENABLED_DYNAMIC(ID))
-
-// HACK for MSVC
-#if defined(_MSC_VER)
- #undef PLUGIN_ENABLED_STATIC
- #define PLUGIN_ENABLED_STATIC(ID) 1
-#endif
+ (defined( ENABLE_##ID ) && !PLUGIN_ENABLED_DYNAMIC(ID))
#define PLUGIN_ENABLED_DYNAMIC(ID) \
- (defined(ENABLE_##ID) && (ENABLE_##ID == DYNAMIC_PLUGIN) && defined(DYNAMIC_MODULES))
+ (defined( ENABLE_##ID ) && (ENABLE_##ID == DYNAMIC_PLUGIN) && defined(DYNAMIC_MODULES))
/**
* REGISTER_PLUGIN_STATIC is a convenience macro which is used to declare
@@ -192,7 +187,7 @@ public:
return (PO_t *)_pluginObject;
}
- typedef Common::Array<PluginSubclass *> list;
+ typedef Common::Array<PluginSubclass *> List;
};
/**
@@ -245,7 +240,7 @@ protected:
* @param filename the name of the loadable code module
* @return a pointer to a Plugin instance, or 0 if an error occurred.
*/
- virtual Plugin* createPlugin(const Common::String &filename) const = 0;
+ virtual Plugin *createPlugin(const Common::String &filename) const = 0;
/**
* Check if the supplied filename corresponds to a loadable plugin file in
diff --git a/common/advancedDetector.h b/common/advancedDetector.h
index 2dc4b44b5f..bec03d5585 100644
--- a/common/advancedDetector.h
+++ b/common/advancedDetector.h
@@ -219,7 +219,7 @@ public:
* @note The fslist parameter may be 0 -- in that case, it is assumed
* that the callback searchs the current directory.
*/
- const Common::ADGameDescription *fallbackDetect(const FSList *fslist) const {
+ virtual const Common::ADGameDescription *fallbackDetect(const FSList *fslist) const {
return 0;
}
};
diff --git a/common/file.h b/common/file.h
index 25c51a0afe..8a69318128 100644
--- a/common/file.h
+++ b/common/file.h
@@ -108,10 +108,10 @@ public:
*
* @return: true if the end of file is reached, false otherwise.
*/
- bool eof() const;
+ virtual bool eof() const;
- uint32 pos() const;
- uint32 size() const;
+ virtual uint32 pos() const;
+ virtual uint32 size() const;
void seek(int32 offs, int whence = SEEK_SET);
uint32 read(void *dataPtr, uint32 dataSize);
uint32 write(const void *dataPtr, uint32 dataSize);
diff --git a/common/hashmap.h b/common/hashmap.h
index 81a4b0d17e..1bae44e98e 100644
--- a/common/hashmap.h
+++ b/common/hashmap.h
@@ -535,6 +535,7 @@ void HashMap<Key, Val, HashFunc, EqualFunc>::erase(const Key &key) {
}
}
_arr[i] = NULL;
+ _nele--;
return;
}
diff --git a/common/system.cpp b/common/system.cpp
index 8c9ca46da6..f133f3c4e3 100644
--- a/common/system.cpp
+++ b/common/system.cpp
@@ -35,8 +35,6 @@
#include "gui/message.h"
#include "sound/mixer.h"
-#include <time.h>
-
OSystem *g_system = 0;
OSystem::OSystem() {
@@ -124,14 +122,6 @@ void OSystem::clearScreen() {
unlockScreen();
}
-void OSystem::getTimeAndDate(struct tm &t) const {
-#ifndef __PLAYSTATION2__
- // PS2SDK doesn't provide localtime, so this code doesn't compile
- time_t curTime = time(0);
- t = *localtime(&curTime);
-#endif
-}
-
/*
* Include header files needed for the getFilesystemFactory() method.
*
@@ -140,8 +130,6 @@ void OSystem::getTimeAndDate(struct tm &t) const {
*/
#if defined(__DS__)
#include "backends/fs/ds/ds-fs-factory.h"
-#elif defined(__GP32__)
- #include "backends/fs/gp32/gp32-fs-factory.h"
#elif defined(PALMOS_MODE)
#include "backends/fs/palmos/palmos-fs-factory.h"
#elif defined(__PLAYSTATION2__)
@@ -149,13 +137,9 @@ void OSystem::getTimeAndDate(struct tm &t) const {
#endif
FilesystemFactory *OSystem::getFilesystemFactory() {
- #if defined(__amigaos4__) || defined(__DC__) || defined(__SYMBIAN32__) || defined(UNIX) || defined(WIN32) || defined(__PSP__)
+ #if defined(__amigaos4__) || defined(__DC__) || defined(__SYMBIAN32__) || defined(UNIX) || defined(WIN32) || defined(__PSP__) || defined(__DS__)
// These ports already implement this function, so it should never be called.
return 0;
- #elif defined(__DS__)
- return &DSFilesystemFactory::instance();
- #elif defined(__GP32__)
- return &GP32FilesystemFactory::instance();
#elif defined(PALMOS_MODE)
return &PalmOSFilesystemFactory::instance();
#elif defined(__PLAYSTATION2__)
diff --git a/common/system.h b/common/system.h
index 7989cabfbd..204ea9383a 100644
--- a/common/system.h
+++ b/common/system.h
@@ -662,7 +662,7 @@ public:
* Move ("warp") the mouse cursor to the specified position in virtual
* screen coordinates.
* @param x the new x position of the mouse
- * @param y the new x position of the mouse
+ * @param y the new y position of the mouse
*/
virtual void warpMouse(int x, int y) = 0;
@@ -727,8 +727,12 @@ public:
/** Delay/sleep for the specified amount of milliseconds. */
virtual void delayMillis(uint msecs) = 0;
- /** Get the current time and date. Correspond to time()+localtime(). */
- virtual void getTimeAndDate(struct tm &t) const;
+ /**
+ * Get the current time and date, in the local timezone.
+ * Corresponds on many systems to the combination of time()
+ * and localtime().
+ */
+ virtual void getTimeAndDate(struct tm &t) const = 0;
/**
* Return the timer manager singleton. For more information, refer
diff --git a/common/util.cpp b/common/util.cpp
index 1f48a6ddd9..6f0fdcb233 100644
--- a/common/util.cpp
+++ b/common/util.cpp
@@ -394,18 +394,40 @@ const char *getRenderModeDescription(RenderMode id) {
#pragma mark -
-static Array<EngineDebugLevel> gDebugLevels;
-static uint32 gDebugLevelsEnabled = 0;
+namespace {
+
+DebugLevelContainer gDebugLevels;
+uint32 gDebugLevelsEnabled = 0;
+
+struct DebugLevelSort {
+ bool operator()(const EngineDebugLevel &l, const EngineDebugLevel &r) {
+ return (l.option.compareToIgnoreCase(r.option) < 0);
+ }
+};
+
+struct DebugLevelSearch {
+ const String &_option;
+
+ DebugLevelSearch(const String &option) : _option(option) {}
+
+ bool operator()(const EngineDebugLevel &l) {
+ return _option.equalsIgnoreCase(l.option);
+ }
+};
+
+}
bool addSpecialDebugLevel(uint32 level, const String &option, const String &description) {
- for (uint i = 0; i < gDebugLevels.size(); ++i) {
- if (!scumm_stricmp(option.c_str(), gDebugLevels[i].option.c_str())) {
- warning("Declared engine debug level '%s' again", option.c_str());
- gDebugLevels[i] = EngineDebugLevel(level, option, description);
- return true;
- }
+ DebugLevelContainer::iterator i = find_if(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSearch(option));
+
+ if (i != gDebugLevels.end()) {
+ warning("Declared engine debug level '%s' again", option.c_str());
+ *i = EngineDebugLevel(level, option, description);
+ } else {
+ gDebugLevels.push_back(EngineDebugLevel(level, option, description));
+ sort(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSort());
}
- gDebugLevels.push_back(EngineDebugLevel(level, option, description));
+
return true;
}
@@ -415,43 +437,43 @@ void clearAllSpecialDebugLevels() {
}
bool enableSpecialDebugLevel(const String &option) {
- for (uint i = 0; i < gDebugLevels.size(); ++i) {
- if (!scumm_stricmp(option.c_str(), gDebugLevels[i].option.c_str())) {
- gDebugLevelsEnabled |= gDebugLevels[i].level;
- gDebugLevels[i].enabled = true;
- return true;
- }
+ DebugLevelContainer::iterator i = find_if(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSearch(option));
+
+ if (i != gDebugLevels.end()) {
+ gDebugLevelsEnabled |= i->level;
+ i->enabled = true;
+
+ return true;
+ } else {
+ return false;
}
- return false;
}
void enableSpecialDebugLevelList(const String &option) {
- uint start = 0;
- uint end = 0;
-
- const char *str = option.c_str();
- for (end = start + 1; end <= option.size(); ++end) {
- if (str[end] == ',' || end == option.size()) {
- if (!enableSpecialDebugLevel(Common::String(&str[start], end-start))) {
- warning("Engine does not support debug level '%s'", Common::String(&str[start], end-start).c_str());
- }
- start = end + 1;
- }
+ StringTokenizer tokenizer(option, " ,");
+ String token;
+
+ while (!tokenizer.empty()) {
+ token = tokenizer.nextToken();
+ if (!enableSpecialDebugLevel(token))
+ warning("Engine does not support debug level '%s'", token.c_str());
}
}
bool disableSpecialDebugLevel(const String &option) {
- for (uint i = 0; i < gDebugLevels.size(); ++i) {
- if (!scumm_stricmp(option.c_str(), gDebugLevels[i].option.c_str())) {
- gDebugLevelsEnabled &= ~gDebugLevels[i].level;
- gDebugLevels[i].enabled = false;
- return true;
- }
+ DebugLevelContainer::iterator i = find_if(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSearch(option));
+
+ if (i != gDebugLevels.end()) {
+ gDebugLevelsEnabled &= ~i->level;
+ i->enabled = false;
+
+ return true;
+ } else {
+ return false;
}
- return false;
}
-const Array<EngineDebugLevel> &listSpecialDebugLevels() {
+const DebugLevelContainer &listSpecialDebugLevels() {
return gDebugLevels;
}
@@ -578,14 +600,8 @@ void NORETURN CDECL error(const char *s, ...) {
// Print the error message to stderr
-#ifdef __GP32__
- printf("ERROR: %s\n", buf_output);
-#else
fprintf(stderr, "%s!\n", buf_output);
-#endif
-
-#ifndef __GP32__
// Unless this error -originated- within the debugger itself, we
// now invoke the debugger, if available / supported.
if (g_engine) {
@@ -599,7 +615,6 @@ void NORETURN CDECL error(const char *s, ...) {
debugger->onFrame();
}
}
-#endif
#if defined( USE_WINDBG )
@@ -641,13 +656,10 @@ void CDECL warning(const char *s, ...) {
vsnprintf(buf, STRINGBUFLEN, s, va);
va_end(va);
-#ifdef __GP32__ //ph0x FIXME: implement fprint?
- printf("WARNING: %s\n", buf);
-#else
#if !defined (__SYMBIAN32__)
fprintf(stderr, "WARNING: %s!\n", buf);
#endif
-#endif
+
#if defined( USE_WINDBG )
strcat(buf, "\n");
#if defined( _WIN32_WCE )
diff --git a/common/util.h b/common/util.h
index 1f680d28c1..c23513596c 100644
--- a/common/util.h
+++ b/common/util.h
@@ -27,7 +27,7 @@
#include "common/scummsys.h"
#include "common/str.h"
-#include "common/array.h"
+#include "common/list.h"
#ifdef MIN
#undef MIN
@@ -308,11 +308,13 @@ void enableSpecialDebugLevelList(const String &option);
*/
bool disableSpecialDebugLevel(const String &option);
+typedef List<EngineDebugLevel> DebugLevelContainer;
+
/**
* Lists all debug levels
* @return returns a arry with all debug levels
*/
-const Array<EngineDebugLevel> &listSpecialDebugLevels();
+const DebugLevelContainer &listSpecialDebugLevels();
/**
* Return the active debug flag mask (i.e. all active debug flags ORed
diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat
index c1504ebba8..7171707e8b 100644
--- a/dists/engine-data/kyra.dat
+++ b/dists/engine-data/kyra.dat
Binary files differ
diff --git a/dists/msvc7/saga.vcproj b/dists/msvc7/saga.vcproj
index ecbdec967b..1a1cb29555 100644
--- a/dists/msvc7/saga.vcproj
+++ b/dists/msvc7/saga.vcproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="windows-1252"?>
+<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.00"
@@ -151,9 +151,6 @@
RelativePath="..\..\engines\saga\gfx.h">
</File>
<File
- RelativePath="..\..\engines\saga\ihnm_introproc.cpp">
- </File>
- <File
RelativePath="..\..\engines\saga\image.cpp">
</File>
<File
@@ -166,13 +163,16 @@
RelativePath="..\..\engines\saga\interface.h">
</File>
<File
- RelativePath="..\..\engines\saga\isomap.cpp">
+ RelativePath="..\..\engines\saga\introproc_ihnm.cpp">
</File>
<File
- RelativePath="..\..\engines\saga\isomap.h">
+ RelativePath="..\..\engines\saga\introproc_ite.cpp">
+ </File>
+ <File
+ RelativePath="..\..\engines\saga\isomap.cpp">
</File>
<File
- RelativePath="..\..\engines\saga\ite_introproc.cpp">
+ RelativePath="..\..\engines\saga\isomap.h">
</File>
<File
RelativePath="..\..\engines\saga\itedata.cpp">
@@ -226,9 +226,6 @@
RelativePath="..\..\engines\saga\saga.h">
</File>
<File
- RelativePath="..\..\engines\saga\sagaresnames.h">
- </File>
- <File
RelativePath="..\..\engines\saga\saveload.cpp">
</File>
<File
diff --git a/dists/msvc7/scummvm.vcproj b/dists/msvc7/scummvm.vcproj
index 55358a2cc6..aedfbe80f4 100644
--- a/dists/msvc7/scummvm.vcproj
+++ b/dists/msvc7/scummvm.vcproj
@@ -21,7 +21,7 @@
AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702"
Optimization="0"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
MinimalRebuild="TRUE"
ExceptionHandling="TRUE"
BasicRuntimeChecks="3"
@@ -74,7 +74,7 @@
InlineFunctionExpansion="1"
OmitFramePointers="TRUE"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
StringPooling="TRUE"
MinimalRebuild="FALSE"
ExceptionHandling="TRUE"
diff --git a/dists/msvc71/saga.vcproj b/dists/msvc71/saga.vcproj
index 1e1333a9c7..388dd64ff2 100644
--- a/dists/msvc71/saga.vcproj
+++ b/dists/msvc71/saga.vcproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="windows-1252"?>
+<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
@@ -165,9 +165,6 @@
RelativePath="..\..\engines\saga\gfx.h">
</File>
<File
- RelativePath="..\..\engines\saga\ihnm_introproc.cpp">
- </File>
- <File
RelativePath="..\..\engines\saga\image.cpp">
</File>
<File
@@ -180,13 +177,16 @@
RelativePath="..\..\engines\saga\interface.h">
</File>
<File
- RelativePath="..\..\engines\saga\isomap.cpp">
+ RelativePath="..\..\engines\saga\introproc_ihnm.cpp">
</File>
<File
- RelativePath="..\..\engines\saga\isomap.h">
+ RelativePath="..\..\engines\saga\introproc_ite.cpp">
+ </File>
+ <File
+ RelativePath="..\..\engines\saga\isomap.cpp">
</File>
<File
- RelativePath="..\..\engines\saga\ite_introproc.cpp">
+ RelativePath="..\..\engines\saga\isomap.h">
</File>
<File
RelativePath="..\..\engines\saga\itedata.cpp">
@@ -240,9 +240,6 @@
RelativePath="..\..\engines\saga\saga.h">
</File>
<File
- RelativePath="..\..\engines\saga\sagaresnames.h">
- </File>
- <File
RelativePath="..\..\engines\saga\saveload.cpp">
</File>
<File
diff --git a/dists/msvc71/scummvm.vcproj b/dists/msvc71/scummvm.vcproj
index 5e1100b788..7b7b5b72c8 100644
--- a/dists/msvc71/scummvm.vcproj
+++ b/dists/msvc71/scummvm.vcproj
@@ -21,7 +21,7 @@
AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702"
Optimization="0"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
MinimalRebuild="TRUE"
ExceptionHandling="TRUE"
BasicRuntimeChecks="3"
@@ -80,7 +80,7 @@
InlineFunctionExpansion="1"
OmitFramePointers="TRUE"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
StringPooling="TRUE"
MinimalRebuild="FALSE"
ExceptionHandling="TRUE"
diff --git a/dists/msvc8/saga.vcproj b/dists/msvc8/saga.vcproj
index d40332b470..79f7d35fb5 100644
--- a/dists/msvc8/saga.vcproj
+++ b/dists/msvc8/saga.vcproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="windows-1252"?>
+<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
@@ -233,10 +233,6 @@
>
</File>
<File
- RelativePath="..\..\engines\saga\ihnm_introproc.cpp"
- >
- </File>
- <File
RelativePath="..\..\engines\saga\image.cpp"
>
</File>
@@ -253,15 +249,19 @@
>
</File>
<File
- RelativePath="..\..\engines\saga\isomap.cpp"
+ RelativePath="..\..\engines\saga\introproc_ihnm.cpp"
>
</File>
<File
- RelativePath="..\..\engines\saga\isomap.h"
+ RelativePath="..\..\engines\saga\introproc_ite.cpp"
>
</File>
<File
- RelativePath="..\..\engines\saga\ite_introproc.cpp"
+ RelativePath="..\..\engines\saga\isomap.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\engines\saga\isomap.h"
>
</File>
<File
@@ -333,10 +333,6 @@
>
</File>
<File
- RelativePath="..\..\engines\saga\sagaresnames.h"
- >
- </File>
- <File
RelativePath="..\..\engines\saga\saveload.cpp"
>
</File>
diff --git a/dists/msvc8/scummvm.vcproj b/dists/msvc8/scummvm.vcproj
index db5c10efd3..a5cd6a9169 100644
--- a/dists/msvc8/scummvm.vcproj
+++ b/dists/msvc8/scummvm.vcproj
@@ -42,7 +42,7 @@
AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702 /wd4996"
Optimization="0"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
MinimalRebuild="true"
ExceptionHandling="1"
BasicRuntimeChecks="3"
@@ -130,7 +130,7 @@
InlineFunctionExpansion="1"
OmitFramePointers="true"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
StringPooling="true"
MinimalRebuild="false"
ExceptionHandling="1"
diff --git a/dists/msvc9/saga.vcproj b/dists/msvc9/saga.vcproj
index 8d70a3d411..9675dda2e9 100644
--- a/dists/msvc9/saga.vcproj
+++ b/dists/msvc9/saga.vcproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="windows-1252"?>
+<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
@@ -234,10 +234,6 @@
>
</File>
<File
- RelativePath="..\..\engines\saga\ihnm_introproc.cpp"
- >
- </File>
- <File
RelativePath="..\..\engines\saga\image.cpp"
>
</File>
@@ -254,15 +250,19 @@
>
</File>
<File
- RelativePath="..\..\engines\saga\isomap.cpp"
+ RelativePath="..\..\engines\saga\introproc_ihnm.cpp"
>
</File>
<File
- RelativePath="..\..\engines\saga\isomap.h"
+ RelativePath="..\..\engines\saga\introproc_ite.cpp"
>
</File>
<File
- RelativePath="..\..\engines\saga\ite_introproc.cpp"
+ RelativePath="..\..\engines\saga\isomap.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\engines\saga\isomap.h"
>
</File>
<File
@@ -334,10 +334,6 @@
>
</File>
<File
- RelativePath="..\..\engines\saga\sagaresnames.h"
- >
- </File>
- <File
RelativePath="..\..\engines\saga\saveload.cpp"
>
</File>
diff --git a/dists/msvc9/scummvm.vcproj b/dists/msvc9/scummvm.vcproj
index 0de6bdc616..d5904961a7 100644
--- a/dists/msvc9/scummvm.vcproj
+++ b/dists/msvc9/scummvm.vcproj
@@ -43,7 +43,7 @@
AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702 /wd4996"
Optimization="0"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_NASM;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
MinimalRebuild="true"
ExceptionHandling="1"
BasicRuntimeChecks="3"
@@ -133,7 +133,7 @@
InlineFunctionExpansion="1"
OmitFramePointers="true"
AdditionalIncludeDirectories="../..;../../engines"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;USE_ZLIB;USE_MAD;USE_VORBIS;USE_MPEG2;USE_MT32EMU;ENABLE_AGI;ENABLE_AGOS;ENABLE_CINE;ENABLE_CRUISE;ENABLE_DRASCULA;ENABLE_GOB;ENABLE_IGOR;ENABLE_KYRA;ENABLE_LURE;ENABLE_M4;ENABLE_MADE;ENABLE_PARALLACTION;ENABLE_QUEEN;ENABLE_SAGA;ENABLE_SCUMM;ENABLE_SKY;ENABLE_SWORD1;ENABLE_SWORD2;ENABLE_TOUCHE;ENABLE_SCUMM_7_8;ENABLE_HE"
StringPooling="true"
MinimalRebuild="false"
ExceptionHandling="1"
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index 80fbe28c0c..7880d407b8 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -23,7 +23,7 @@
*
*/
-
+#include <time.h> // for AGOSEngine::getTime()
#include "common/config-manager.h"
#include "common/file.h"
@@ -38,8 +38,6 @@
#include "sound/mididrv.h"
#include "sound/mods/protracker.h"
-#include <time.h> // for AGOSEngine::getTime()
-
using Common::File;
namespace AGOS {
@@ -928,25 +926,31 @@ GUI::Debugger *AGOSEngine::getDebugger() {
return _debugger;
}
-void AGOSEngine::pause() {
- _keyPressed.reset();
- _pause = true;
- bool ambient_status = _ambientPaused;
- bool music_status = _musicPaused;
+void AGOSEngine::pauseEngineIntern(bool pauseIt) {
+ if (pauseIt) {
+ _keyPressed.reset();
+ _pause = true;
+
+ _midi.pause(true);
+ _mixer->pauseAll(true);
+ _sound->ambientPause(true);
+ } else {
+ _pause = false;
+
+ _midi.pause(_musicPaused);
+ _mixer->pauseAll(false);
+ _sound->ambientPause(_ambientPaused);
+ }
+}
- _midi.pause(true);
- _mixer->pauseAll(true);
- _sound->ambientPause(true);
+void AGOSEngine::pause() {
+ pauseEngine(true);
while (_pause && !_quit) {
delay(1);
if (_keyPressed.keycode == Common::KEYCODE_p)
- _pause = false;
+ pauseEngine(false);
}
-
- _midi.pause(music_status);
- _mixer->pauseAll(false);
- _sound->ambientPause(ambient_status);
}
int AGOSEngine::go() {
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index bd8ff9d63c..74a0b026e9 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -1207,6 +1207,7 @@ protected:
void checkTimerCallback();
void delay(uint delay);
void pause();
+ virtual void pauseEngineIntern(bool pause);
void waitForMark(uint i);
void scrollScreen();
diff --git a/engines/cine/anim.cpp b/engines/cine/anim.cpp
index 6edc714da7..73837308ca 100644
--- a/engines/cine/anim.cpp
+++ b/engines/cine/anim.cpp
@@ -53,6 +53,7 @@ AnimData animDataTable[NUM_MAX_ANIMDATA];
static const AnimDataEntry transparencyData[] = {
{"ALPHA", 0xF},
+ {"TITRE", 0xF},
{"TITRE2", 0xF},
{"ET", 0xC},
{"L311", 0x3},
diff --git a/engines/cine/bg.cpp b/engines/cine/bg.cpp
index b6c07a05cb..c5b7fb4e3d 100644
--- a/engines/cine/bg.cpp
+++ b/engines/cine/bg.cpp
@@ -37,7 +37,7 @@ uint16 bgVar0;
byte *additionalBgTable[9];
byte currentAdditionalBgIdx = 0, currentAdditionalBgIdx2 = 0;
-byte loadCt(const char *ctName) {
+byte loadCtFW(const char *ctName) {
uint16 header[32];
byte *ptr, *dataPtr;
@@ -46,79 +46,62 @@ byte loadCt(const char *ctName) {
ptr = dataPtr = readBundleFile(findFileInBundle(ctName));
- if (g_cine->getGameType() == Cine::GType_OS) {
- uint16 bpp = READ_BE_UINT16(ptr); ptr += 2;
- if (bpp == 8) {
- ctColorMode = 1;
- memcpy(newPalette, ptr, 256 * 3);
- ptr += 3 * 256;
- memcpy(page3Raw, ptr, 320 * 200);
- } else {
- ctColorMode = 0;
- for (int i = 0; i < 16; i++) {
- tempPalette[i] = READ_BE_UINT16(ptr);
- ptr += 2;
- }
-
- gfxResetRawPage(page3Raw);
- gfxConvertSpriteToRaw(page3Raw, ptr, 160, 200);
- }
- } else {
- loadRelatedPalette(ctName);
+ loadRelatedPalette(ctName);
- assert(strstr(ctName, ".NEO"));
+ assert(strstr(ctName, ".NEO"));
- Common::MemoryReadStream readS(ptr, 32);
-
- for (int i = 0; i < 16; i++) {
- header[i] = readS.readUint16BE();
- }
+ Common::MemoryReadStream readS(ptr, 32);
- gfxConvertSpriteToRaw(page3Raw, ptr + 0x80, 160, 200);
+ for (int i = 0; i < 16; i++) {
+ header[i] = readS.readUint16BE();
}
+ gfxConvertSpriteToRaw(page3Raw, ptr + 0x80, 160, 200);
+
free(dataPtr);
return 0;
}
-void loadBgHigh(const char *currentPtr) {
- memcpy(newPalette, currentPtr, 256 * 3);
- currentPtr += 256 * 3;
+byte loadCtOS(const char *ctName) {
+ byte *ptr, *dataPtr;
- memcpy(page2Raw, currentPtr, 320 * 200);
+ if (currentCtName != ctName)
+ strcpy(currentCtName, ctName);
+
+ ptr = dataPtr = readBundleFile(findFileInBundle(ctName));
- newColorMode = 2;
- bgColorMode = 1;
+ uint16 bpp = READ_BE_UINT16(ptr);
+ ptr += 2;
+
+ if (bpp == 8) {
+ memcpy(page3Raw, ptr + 256 * 3, 320 * 200);
+ renderer->loadCt256(ptr, ctName);
+ } else {
+ gfxConvertSpriteToRaw(page3Raw, ptr + 32, 160, 200);
+ renderer->loadCt16(ptr, ctName);
+ }
+ free(dataPtr);
+ return 0;
}
byte loadBg(const char *bgName) {
byte *ptr, *dataPtr;
- if (currentBgName[0] != bgName)
- strcpy(currentBgName[0], bgName);
-
byte fileIdx = findFileInBundle(bgName);
ptr = dataPtr = readBundleFile(fileIdx);
- uint16 bpp = READ_BE_UINT16(ptr); ptr += 2;
+ uint16 bpp = READ_BE_UINT16(ptr);
+ ptr += 2;
+
if (bpp == 8) {
- loadBgHigh((const char *)ptr);
+ renderer->loadBg256(ptr, bgName);
} else {
- newColorMode = 1;
- bgColorMode = 0;
-
- for (int i = 0; i < 16; i++) {
- tempPalette[i] = READ_BE_UINT16(ptr);
- ptr += 2;
- }
-
if (g_cine->getGameType() == Cine::GType_FW) {
loadRelatedPalette(bgName);
}
- gfxResetRawPage(page2Raw);
- gfxConvertSpriteToRaw(page2Raw, ptr, 160, 200);
+ renderer->loadBg16(ptr, bgName);
}
free(dataPtr);
return 0;
@@ -127,28 +110,15 @@ byte loadBg(const char *bgName) {
void addBackground(const char *bgName, uint16 bgIdx) {
byte *ptr, *dataPtr;
- strcpy(currentBgName[bgIdx], bgName);
-
byte fileIdx = findFileInBundle(bgName);
ptr = dataPtr = readBundleFile(fileIdx);
- additionalBgTable[bgIdx] = (byte *) malloc(320 * 200);
-
uint16 bpp = READ_BE_UINT16(ptr); ptr += 2;
if (bpp == 8) {
- bgColorMode = 1;
- memcpy(newPalette, ptr, 256 * 3);
- ptr += 3 * 256;
- memcpy(additionalBgTable[bgIdx], ptr, 320 * 200);
+ renderer->loadBg256(ptr, bgName, bgIdx);
} else {
- bgColorMode = 0;
- for (int i = 0; i < 16; i++) {
- tempPalette[i] = READ_BE_UINT16(ptr);
- ptr += 2;
- }
-
- gfxConvertSpriteToRaw(additionalBgTable[bgIdx], ptr, 160, 200);
+ renderer->loadBg16(ptr, bgName, bgIdx);
}
free(dataPtr);
}
diff --git a/engines/cine/bg.h b/engines/cine/bg.h
index ca5c222131..5fa8209131 100644
--- a/engines/cine/bg.h
+++ b/engines/cine/bg.h
@@ -27,20 +27,9 @@
#define CINE_BG_H
namespace Cine {
-struct bgData {
- byte *data;
- byte colorMode;
- byte *highPalette;
- uint16 *lowPalette;
-};
-
byte loadBg(const char *bgName);
-byte loadCt(const char *bgName);
-
-//extern bgData additionalBgTable[9];
-extern byte *additionalBgTable[9];
-extern byte currentAdditionalBgIdx;
-extern byte currentAdditionalBgIdx2;
+byte loadCtFW(const char *bgName);
+byte loadCtOS(const char *bgName);
void addBackground(const char *bgName, uint16 bgIdx);
diff --git a/engines/cine/bg_list.cpp b/engines/cine/bg_list.cpp
index a70733dc68..cf25f1d355 100644
--- a/engines/cine/bg_list.cpp
+++ b/engines/cine/bg_list.cpp
@@ -40,62 +40,20 @@ Common::List<BGIncrust> bgIncrustList;
/*! \brief Add masked sprite to the background
* \param objIdx Sprite description
- * \param addList Add sprite to incrust list if true
- * \todo Fix incrust objects on CT background. Always drawing incrust elements
- * on CT background breaks game zones
*/
-void addToBGList(int16 objIdx, bool addList) {
- int16 x = objectTable[objIdx].x;
- int16 y = objectTable[objIdx].y;
- int16 width = animDataTable[objectTable[objIdx].frame]._var1;
- int16 height = animDataTable[objectTable[objIdx].frame]._height;
- const byte *data = animDataTable[objectTable[objIdx].frame].data();
- const byte *mask = animDataTable[objectTable[objIdx].frame].mask();
-// int16 part = objectTable[objIdx].part;
-
- // Operation Stealth may switch among multiple backgrounds
- if (g_cine->getGameType() == GType_OS) {
- for (int i = 0; i < 8; i++) {
- if (additionalBgTable[i]) {
- drawSpriteRaw2(data, objectTable[objIdx].part, width, height, additionalBgTable[i], x, y);
- }
- }
- } else {
- drawSpriteRaw(data, mask, width, height, page2Raw, x, y);
- }
+void addToBGList(int16 objIdx) {
+ renderer->incrustSprite(objectTable[objIdx]);
- if (addList)
- createBgIncrustListElement(objIdx, 0);
+ createBgIncrustListElement(objIdx, 0);
}
/*! \brief Add filled sprite to the background
* \param objIdx Sprite description
- * \param addList Add sprite to incrust list if true
- * \todo Fix incrust objects on CT background. Always drawing incrust elements
- * on CT background breaks game zones
*/
-void addSpriteFilledToBGList(int16 objIdx, bool addList) {
- int16 x = objectTable[objIdx].x;
- int16 y = objectTable[objIdx].y;
- int16 width = animDataTable[objectTable[objIdx].frame]._realWidth;
- int16 height = animDataTable[objectTable[objIdx].frame]._height;
- const byte *data = animDataTable[objectTable[objIdx].frame].data();
-
- if (data) {
- // Operation Stealth may switch among multiple backgrounds
- if (g_cine->getGameType() == GType_OS) {
- for (int i = 0; i < 8; i++) {
- if (additionalBgTable[i]) {
- gfxFillSprite(data, width, height, additionalBgTable[i], x, y);
- }
- }
- } else {
- gfxFillSprite(data, width, height, page2Raw, x, y);
- }
- }
+void addSpriteFilledToBGList(int16 objIdx) {
+ renderer->incrustMask(objectTable[objIdx]);
- if (addList)
- createBgIncrustListElement(objIdx, 1);
+ createBgIncrustListElement(objIdx, 1);
}
/*! \brief Add new element to incrust list
@@ -115,7 +73,7 @@ void createBgIncrustListElement(int16 objIdx, int16 param) {
bgIncrustList.push_back(tmp);
}
-/*! \brief Reset var8 (probably something related to bgIncrustList
+/*! \brief Reset var8 (probably something related to bgIncrustList)
*/
void resetBgIncrustList(void) {
var8 = 0;
@@ -142,9 +100,9 @@ void loadBgIncrustFromSave(Common::InSaveFile &fHandle) {
bgIncrustList.push_back(tmp);
if (tmp.param == 0) {
- addToBGList(tmp.objIdx, false);
+ renderer->incrustSprite(objectTable[tmp.objIdx]);
} else {
- addSpriteFilledToBGList(tmp.objIdx, false);
+ renderer->incrustMask(objectTable[tmp.objIdx]);
}
}
}
diff --git a/engines/cine/bg_list.h b/engines/cine/bg_list.h
index 9ceae0acf5..1849d6ec3d 100644
--- a/engines/cine/bg_list.h
+++ b/engines/cine/bg_list.h
@@ -46,8 +46,8 @@ struct BGIncrust {
extern Common::List<BGIncrust> bgIncrustList;
extern uint32 var8;
-void addToBGList(int16 objIdx, bool addList = true);
-void addSpriteFilledToBGList(int16 idx, bool addList = true);
+void addToBGList(int16 objIdx);
+void addSpriteFilledToBGList(int16 idx);
void createBgIncrustListElement(int16 objIdx, int16 param);
void resetBgIncrustList(void);
diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp
index 52474d13a9..6cf9e2fb26 100644
--- a/engines/cine/cine.cpp
+++ b/engines/cine/cine.cpp
@@ -97,7 +97,9 @@ int CineEngine::init() {
int CineEngine::go() {
CursorMan.showMouse(true);
mainLoop(1);
- gfxDestroy();
+
+ delete renderer;
+ delete[] page3Raw;
delete g_sound;
return 0;
}
@@ -107,8 +109,14 @@ void CineEngine::initialize() {
setupOpcodes();
initLanguage(g_cine->getLanguage());
- gfxInit();
+ if (g_cine->getGameType() == Cine::GType_OS) {
+ renderer = new OSRenderer;
+ } else {
+ renderer = new FWRenderer;
+ }
+
+ page3Raw = new byte[320 * 200];
textDataPtr = (byte *)malloc(8000);
partBuffer = (PartBuffer *)malloc(NUM_MAX_PARTDATA * sizeof(PartBuffer));
diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp
index 2730a92e62..e20dd46c53 100644
--- a/engines/cine/gfx.cpp
+++ b/engines/cine/gfx.cpp
@@ -27,6 +27,7 @@
#include "cine/bg.h"
#include "cine/bg_list.h"
#include "cine/various.h"
+#include "cine/pal.h"
#include "common/endian.h"
#include "common/system.h"
@@ -35,18 +36,8 @@
namespace Cine {
-uint16 c_palette[256];
-byte colorMode256 = 0;
-byte palette256[256 * 3];
-byte newPalette[256 * 3];
-byte newColorMode = 0;
-byte ctColorMode = 0;
-byte bgColorMode = 0;
-
-byte *screenBuffer;
-byte *page1Raw;
-byte *page2Raw;
byte *page3Raw;
+FWRenderer *renderer = NULL;
static const byte mouseCursorNormal[] = {
0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x70, 0x00,
@@ -96,28 +87,1189 @@ static const byte cursorPalette[] = {
0xff, 0xff, 0xff, 0xff
};
-void gfxInit() {
- screenBuffer = (byte *)malloc(320 * 200);
- page1Raw = (byte *)malloc(320 * 200);
- page2Raw = (byte *)malloc(320 * 200);
- page3Raw = (byte *)malloc(320 * 200);
- if (!screenBuffer || !page1Raw || !page2Raw || !page3Raw) {
- error("Unable to allocate offscreen buffers");
+/*! \brief Initialize renderer
+ */
+FWRenderer::FWRenderer() : _background(NULL), _palette(NULL), _cmd(""),
+ _cmdY(0), _messageBg(0), _backBuffer(new byte[_screenSize]),
+ _activeLowPal(NULL), _changePal(0) {
+
+ assert(_backBuffer);
+
+ memset(_backBuffer, 0, _screenSize);
+ memset(_bgName, 0, sizeof (_bgName));
+}
+
+/* \brief Destroy renderer
+ */
+FWRenderer::~FWRenderer() {
+ delete[] _background;
+ delete[] _palette;
+ delete[] _backBuffer;
+ delete[] _activeLowPal;
+}
+
+/* \brief Reset renderer state
+ */
+void FWRenderer::clear() {
+ delete[] _background;
+ delete[] _palette;
+ delete[] _activeLowPal;
+
+ _background = NULL;
+ _palette = NULL;
+ _activeLowPal = NULL;
+
+ memset(_backBuffer, 0, _screenSize);
+
+ _cmd = "";
+ _cmdY = 0;
+ _messageBg = 0;
+ _changePal = 0;
+}
+
+/*! \brief Draw 1bpp sprite using selected color
+ * \param obj Object info
+ * \param fillColor Sprite color
+ */
+void FWRenderer::fillSprite(const objectStruct &obj, uint8 color) {
+ const byte *data = animDataTable[obj.frame].data();
+ int x, y, width, height;
+
+ x = obj.x;
+ y = obj.y;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ gfxFillSprite(data, width, height, _backBuffer, x, y, color);
+}
+
+/*! \brief Draw 1bpp sprite using selected color on background
+ * \param obj Object info
+ * \param fillColor Sprite color
+ */
+void FWRenderer::incrustMask(const objectStruct &obj, uint8 color) {
+ const byte *data = animDataTable[obj.frame].data();
+ int x, y, width, height;
+
+ x = obj.x;
+ y = obj.y;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ gfxFillSprite(data, width, height, _background, x, y, color);
+}
+
+/*! \brief Draw color sprite using with external mask
+ * \param obj Object info
+ * \param mask External mask
+ */
+void FWRenderer::drawMaskedSprite(const objectStruct &obj, const byte *mask) {
+ const byte *data = animDataTable[obj.frame].data();
+ int x, y, width, height;
+
+ x = obj.x;
+ y = obj.y;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ assert(mask);
+
+ drawSpriteRaw(data, mask, width, height, _backBuffer, x, y);
+}
+
+/*! \brief Draw color sprite
+ * \param obj Object info
+ */
+void FWRenderer::drawSprite(const objectStruct &obj) {
+ const byte *mask = animDataTable[obj.frame].mask();
+ drawMaskedSprite(obj, mask);
+}
+
+/*! \brief Draw color sprite on background
+ * \param obj Object info
+ */
+void FWRenderer::incrustSprite(const objectStruct &obj) {
+ const byte *data = animDataTable[obj.frame].data();
+ const byte *mask = animDataTable[obj.frame].mask();
+ int x, y, width, height;
+
+ x = obj.x;
+ y = obj.y;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ assert(mask);
+
+ drawSpriteRaw(data, mask, width, height, _background, x, y);
+}
+
+/*! \brief Draw command box on screen
+ */
+void FWRenderer::drawCommand() {
+ unsigned int i;
+ int x = 10, y = _cmdY;
+
+ drawPlainBox(x, y, 301, 11, 0);
+ drawBorder(x - 1, y - 1, 302, 12, 2);
+
+ x += 2;
+ y += 2;
+
+ for (i = 0; i < _cmd.size(); i++) {
+ x = drawChar(_cmd[i], x, y);
+ }
+}
+
+/*! \brief Draw message in a box
+ * \param str Message to draw
+ * \param x Top left message box corner coordinate
+ * \param y Top left message box corner coordinate
+ * \param width Message box width
+ * \param color Message box background color
+ */
+void FWRenderer::drawMessage(const char *str, int x, int y, int width, byte color) {
+ int i, tx, ty, tw;
+ int line = 0, words = 0, cw = 0;
+ int space = 0, extraSpace = 0;
+
+ drawPlainBox(x, y, width, 4, color);
+ tx = x + 4;
+ ty = str[0] ? y - 5 : y + 4;
+ tw = width - 8;
+
+ for (i = 0; str[i]; i++, line--) {
+ // Fit line of text into textbox
+ if (!line) {
+ while (str[i] == ' ') i++;
+ line = fitLine(str + i, tw, words, cw);
+
+ if ( str[i + line] != '\0' && str[i + line] != 0x7C && words) {
+ space = (tw - cw) / words;
+ extraSpace = (tw - cw) % words;
+ } else {
+ space = 5;
+ extraSpace = 0;
+ }
+
+ ty += 9;
+ drawPlainBox(x, ty, width, 9, color);
+ tx = x + 4;
+ }
+
+ // draw characters
+ if (str[i] == ' ') {
+ tx += space + extraSpace;
+
+ if (extraSpace) {
+ extraSpace = 0;
+ }
+ } else {
+ tx = drawChar(str[i], tx, ty);
+ }
+ }
+
+ ty += 9;
+ drawPlainBox(x, ty, width, 4, color);
+ drawDoubleBorder(x, y, width, ty - y + 4, 2);
+}
+
+/*! \brief Draw rectangle on screen
+ * \param x Top left corner coordinate
+ * \param y Top left corner coordinate
+ * \param width Rectangle width
+ * \param height Rectangle height
+ * \param color Fill color
+ */
+void FWRenderer::drawPlainBox(int x, int y, int width, int height, byte color) {
+ int i;
+ byte *dest = _backBuffer + y * 320 + x;
+
+ if (width < 0) {
+ x += width;
+ width = -width;
+ }
+
+ if (height < 0) {
+ y += height;
+ height = -height;
+ }
+
+ for (i = 0; i < height; i++) {
+ memset(dest + i * 320, color, width);
+ }
+}
+
+/*! \brief Draw empty rectangle
+ * \param x Top left corner coordinate
+ * \param y Top left corner coordinate
+ * \param width Rectangle width
+ * \param height Rectangle height
+ * \param color Line color
+ */
+void FWRenderer::drawBorder(int x, int y, int width, int height, byte color) {
+ drawLine(x, y, width, 1, color);
+ drawLine(x, y + height, width, 1, color);
+ drawLine(x, y, 1, height, color);
+ drawLine(x + width, y, 1, height + 1, color);
+}
+
+/*! \brief Draw empty 2 color rectangle (inner line color is black)
+ * \param x Top left corner coordinate
+ * \param y Top left corner coordinate
+ * \param width Rectangle width
+ * \param height Rectangle height
+ * \param color Outter line color
+ */
+void FWRenderer::drawDoubleBorder(int x, int y, int width, int height, byte color) {
+ drawBorder(x + 1, y + 1, width - 2, height - 2, 0);
+ drawBorder(x, y, width, height, color);
+}
+
+/*! \brief Draw text character on screen
+ * \param character Character to draw
+ * \param x Character coordinate
+ * \param y Character coordinate
+ */
+int FWRenderer::drawChar(char character, int x, int y) {
+ int width, idx;
+
+ if (character == ' ') {
+ x += 5;
+ } else if ((width = fontParamTable[character].characterWidth)) {
+ idx = fontParamTable[character].characterIdx;
+ drawSpriteRaw(textTable[idx][0], textTable[idx][1], 16, 8, _backBuffer, x, y);
+ x += width + 1;
+ }
+
+ return x;
+}
+
+/*! \brief Draw Line
+ * \param x Line end coordinate
+ * \param y Line end coordinate
+ * \param width Horizontal line length
+ * \param height Vertical line length
+ * \param color Line color
+ * \note Either width or height must be equal to 1
+ */
+void FWRenderer::drawLine(int x, int y, int width, int height, byte color) {
+ // this line is a special case of rectangle ;-)
+ drawPlainBox(x, y, width, height, color);
+}
+
+/*! \brief Hide invisible parts of the sprite
+ * \param[in,out] mask Mask to be updated
+ * \param it Overlay info from overlayList
+ */
+void FWRenderer::remaskSprite(byte *mask, Common::List<overlay>::iterator it) {
+ AnimData &sprite = animDataTable[objectTable[it->objIdx].frame];
+ int x, y, width, height, idx;
+ int mx, my, mw, mh;
+
+ x = objectTable[it->objIdx].x;
+ y = objectTable[it->objIdx].y;
+ width = sprite._realWidth;
+ height = sprite._height;
+
+ for (++it; it != overlayList.end(); ++it) {
+ if (it->type != 5) {
+ continue;
+ }
+
+ idx = ABS(objectTable[it->objIdx].frame);
+ mx = objectTable[it->objIdx].x;
+ my = objectTable[it->objIdx].y;
+ mw = animDataTable[idx]._realWidth;
+ mh = animDataTable[idx]._height;
+
+ gfxUpdateSpriteMask(mask, x, y, width, height, animDataTable[idx].data(), mx, my, mw, mh);
+ }
+}
+
+/*! \brief Draw background to backbuffer
+ */
+void FWRenderer::drawBackground() {
+ assert(_background);
+ memcpy(_backBuffer, _background, _screenSize);
+}
+
+/*! \brief Draw one overlay
+ * \param it Overlay info
+ */
+void FWRenderer::renderOverlay(const Common::List<overlay>::iterator &it) {
+ int idx, len, width;
+ objectStruct *obj;
+ AnimData *sprite;
+ byte *mask;
+
+ switch (it->type) {
+ // color sprite
+ case 0:
+ sprite = animDataTable + objectTable[it->objIdx].frame;
+ len = sprite->_realWidth * sprite->_height;
+ mask = new byte[len];
+ memcpy(mask, sprite->mask(), len);
+ remaskSprite(mask, it);
+ drawMaskedSprite(objectTable[it->objIdx], mask);
+ delete[] mask;
+ break;
+
+ // game message
+ case 2:
+ if (it->objIdx >= messageTable.size()) {
+ return;
+ }
+
+ _messageLen += messageTable[it->objIdx].size();
+ drawMessage(messageTable[it->objIdx].c_str(), it->x, it->y, it->width, it->color);
+ break;
+
+ // action failure message
+ case 3:
+ idx = it->objIdx * 4 + g_cine->_rnd.getRandomNumber(3);
+ len = strlen(failureMessages[idx]);
+ _messageLen += len;
+ width = 6 * len + 20;
+ width = width > 300 ? 300 : width;
+
+ drawMessage(failureMessages[idx], (320 - width) / 2, 80, width, 4);
+ break;
+
+ // bitmap
+ case 4:
+ assert(it->objIdx < NUM_MAX_OBJECT);
+ obj = objectTable + it->objIdx;
+
+ if (obj->frame < 0) {
+ return;
+ }
+
+ if (!animDataTable[obj->frame].data()) {
+ return;
+ }
+
+ fillSprite(*obj);
+ break;
+ }
+}
+
+/*! \brief Draw overlays
+ */
+void FWRenderer::drawOverlays() {
+ Common::List<overlay>::iterator it;
+
+ for (it = overlayList.begin(); it != overlayList.end(); ++it) {
+ renderOverlay(it);
+ }
+}
+
+/*! \brief Draw another frame
+ */
+void FWRenderer::drawFrame() {
+ drawBackground();
+ drawOverlays();
+
+ if (!_cmd.empty()) {
+ drawCommand();
+ }
+
+ if (_changePal) {
+ refreshPalette();
+ }
+
+ blit();
+}
+
+/*! \brief Update screen
+ */
+void FWRenderer::blit() {
+ g_system->copyRectToScreen(_backBuffer, 320, 0, 0, 320, 200);
+}
+
+/*! \brief Set player command string
+ * \param cmd New command string
+ */
+void FWRenderer::setCommand(const char *cmd) {
+ _cmd = cmd;
+}
+
+/*! \brief Refresh current palette
+ */
+void FWRenderer::refreshPalette() {
+ int i;
+ byte pal[16*4];
+
+ assert(_activeLowPal);
+
+ for (i = 0; i < 16; i++) {
+ // This seems to match the output from DOSbox.
+ pal[i * 4 + 2] = ((_activeLowPal[i] & 0x00f) >> 0) * 32;
+ pal[i * 4 + 1] = ((_activeLowPal[i] & 0x0f0) >> 4) * 32;
+ pal[i * 4 + 0] = ((_activeLowPal[i] & 0xf00) >> 8) * 32;
+ pal[i * 4 + 3] = 0;
+ }
+
+ g_system->setPalette(pal, 0, 16);
+ _changePal = 0;
+}
+
+/*! \brief Load palette of current background
+ */
+void FWRenderer::reloadPalette() {
+ assert(_palette);
+
+ if (!_activeLowPal) {
+ _activeLowPal = new uint16[_lowPalSize];
}
- memset(page1Raw, 0, 320 * 200);
- memset(page2Raw, 0, 320 * 200);
- memset(page3Raw, 0, 320 * 200);
- memset(additionalBgTable, 0, sizeof(additionalBgTable));
- additionalBgTable[0] = page2Raw;
- additionalBgTable[8] = page3Raw;
+ assert(_activeLowPal);
+
+ memcpy(_activeLowPal, _palette, _lowPalSize * sizeof (uint16));
+ _changePal = 1;
+}
+
+/*! \brief Load background into renderer
+ * \param bg Raw background data
+ */
+void FWRenderer::loadBg16(const byte *bg, const char *name) {
+ int i;
+
+ if (!_background) {
+ _background = new byte[_screenSize];
+ }
+
+ if (!_palette) {
+ _palette = new uint16[_lowPalSize];
+ }
+
+ assert(_background && _palette);
+
+ strcpy(_bgName, name);
+
+ for (i = 0; i < _lowPalSize; i++, bg += 2) {
+ _palette[i] = READ_BE_UINT16(bg);
+ }
+
+ gfxConvertSpriteToRaw(_background, bg, 160, 200);
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::loadBg16(const byte *bg, const char *name, unsigned int idx) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::loadCt16(const byte *ct, const char *name) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::loadBg256(const byte *bg, const char *name) {
+ error("Future Wars renderer doesn't support 256 color mode");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::loadBg256(const byte *bg, const char *name, unsigned int idx) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::loadCt256(const byte *ct, const char *name) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::selectBg(unsigned int idx) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
}
-void gfxDestroy() {
- free(screenBuffer);
- free(page1Raw);
- free(page2Raw);
- free(page3Raw);
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::selectScrollBg(unsigned int idx) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::setScroll(unsigned int shift) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+/*! \brief Placeholder for Operation Stealth implementation
+ */
+void FWRenderer::removeBg(unsigned int idx) {
+ error("Future Wars renderer doesn't support multiple backgrounds");
+}
+
+void FWRenderer::saveBg(Common::OutSaveFile &fHandle) {
+ fHandle.write(_bgName, 13);
+}
+
+/*! \brief Restore active and backup palette from save
+ * \param fHandle Savefile open for reading
+ */
+void FWRenderer::restorePalette(Common::InSaveFile &fHandle) {
+ int i;
+
+ if (!_palette) {
+ _palette = new uint16[_lowPalSize];
+ }
+
+ if (!_activeLowPal) {
+ _activeLowPal = new uint16[_lowPalSize];
+ }
+
+ assert(_palette && _activeLowPal);
+
+ for (i = 0; i < _lowPalSize; i++) {
+ _activeLowPal[i] = fHandle.readUint16BE();
+ }
+
+ for (i = 0; i < _lowPalSize; i++) {
+ _palette[i] = fHandle.readUint16BE();
+ }
+
+ _changePal = 1;
+}
+
+/*! \brief Write active and backup palette to save
+ * \param fHandle Savefile open for writing
+ */
+void FWRenderer::savePalette(Common::OutSaveFile &fHandle) {
+ int i;
+
+ assert(_palette && _activeLowPal);
+
+ for (i = 0; i < _lowPalSize; i++) {
+ fHandle.writeUint16BE(_activeLowPal[i]);
+ }
+
+ for (i = 0; i < _lowPalSize; i++) {
+ fHandle.writeUint16BE(_palette[i]);
+ }
+}
+
+/*! \brief Rotate active palette
+ * \param a First color to rotate
+ * \param b Last color to rotate
+ * \param c Possibly rotation step, must be equal to 1 at the moment
+ */
+void FWRenderer::rotatePalette(int a, int b, int c) {
+ palRotate(_activeLowPal, a, b, c);
+ refreshPalette();
+}
+
+/*! \brief Copy part of backup palette to active palette and transform
+ * \param first First color to transform
+ * \param last Last color to transform
+ * \param r Red channel transformation
+ * \param g Green channel transformation
+ * \param b Blue channel transformation
+ */
+void FWRenderer::transformPalette(int first, int last, int r, int g, int b) {
+ if (!_activeLowPal) {
+ _activeLowPal = new uint16[_lowPalSize];
+ memset(_activeLowPal, 0, _lowPalSize * sizeof (uint16));
+ }
+
+ transformPaletteRange(_activeLowPal, _palette, first, last, r, g, b);
+ refreshPalette();
+}
+
+/*! \brief Draw menu box, one item per line with possible highlight
+ * \param items Menu items
+ * \param height Item count
+ * \param x Top left menu corner coordinate
+ * \param y Top left menu corner coordinate
+ * \param width Menu box width
+ * \param selected Index of highlighted item (no highlight if less than 0)
+ */
+void FWRenderer::drawMenu(const CommandeType *items, unsigned int height, int x, int y, int width, int selected) {
+ int tx, ty, th = height * 9 + 10;
+ unsigned int i, j;
+
+ if (x + width > 319) {
+ x = 319 - width;
+ }
+
+ if (y + th > 199) {
+ y = 199 - th;
+ }
+
+ drawPlainBox(x, y, width, 4, _messageBg);
+
+ ty = y + 4;
+
+ for (i = 0; i < height; i++, ty += 9) {
+ drawPlainBox(x, ty, width, 9, (int)i == selected ? 0 : _messageBg);
+ tx = x + 4;
+
+ for (j = 0; items[i][j]; j++) {
+ tx = drawChar(items[i][j], tx, ty);
+ }
+ }
+
+ drawPlainBox(x, ty, width, 4, _messageBg);
+ drawDoubleBorder(x, y, width, ty - y + 4, 2);
+}
+
+/*! \brief Draw text input box
+ * \param info Input box message
+ * \param input Text entered in the input area
+ * \param cursor Cursor position in the input area
+ * \param x Top left input box corner coordinate
+ * \param y Top left input box corner coordinate
+ * \param width Input box width
+ */
+void FWRenderer::drawInputBox(const char *info, const char *input, int cursor, int x, int y, int width) {
+ int i, tx, ty, tw;
+ int line = 0, words = 0, cw = 0;
+ int space = 0, extraSpace = 0;
+
+ drawPlainBox(x, y, width, 4, _messageBg);
+ tx = x + 4;
+ ty = info[0] ? y - 5 : y + 4;
+ tw = width - 8;
+
+ // input box info message
+ for (i = 0; info[i]; i++, line--) {
+ // fit line of text
+ if (!line) {
+ line = fitLine(info + i, tw, words, cw);
+
+ if ( info[i + line] != '\0' && words) {
+ space = (tw - cw) / words;
+ extraSpace = (tw - cw) % words;
+ } else {
+ space = 5;
+ extraSpace = 0;
+ }
+
+ ty += 9;
+ drawPlainBox(x, ty, width, 9, _messageBg);
+ tx = x + 4;
+ }
+
+ // draw characters
+ if (info[i] == ' ') {
+ tx += space + extraSpace;
+
+ if (extraSpace) {
+ extraSpace = 0;
+ }
+ } else {
+ tx = drawChar(info[i], tx, ty);
+ }
+ }
+
+ // input area background
+ ty += 9;
+ drawPlainBox(x, ty, width, 9, _messageBg);
+ drawPlainBox(x + 16, ty - 1, width - 32, 9, 0);
+ tx = x + 20;
+
+ // text in input area
+ for (i = 0; input[i]; i++) {
+ tx = drawChar(input[i], tx, ty);
+
+ if (cursor == i + 2) {
+ drawLine(tx, ty - 1, 1, 9, 2);
+ }
+ }
+
+ if (!input[0] || cursor == 1) {
+ drawLine(x + 20, ty - 1, 1, 9, 2);
+ }
+
+ ty += 9;
+ drawPlainBox(x, ty, width, 4, _messageBg);
+ drawDoubleBorder(x, y, width, ty - y + 4, 2);
+}
+
+/*! \brief Fade to black
+ */
+void FWRenderer::fadeToBlack() {
+ assert(_activeLowPal);
+
+ for (int i = 0; i < 8; i++) {
+ for (int j = 0; j < 16; j++) {
+ _activeLowPal[j] = transformColor(_activeLowPal[j], -1, -1, -1);
+ }
+
+ refreshPalette();
+ g_system->updateScreen();
+ g_system->delayMillis(50);
+ }
+}
+
+/*! \brief Initialize Operation Stealth renderer
+ */
+OSRenderer::OSRenderer() : _activeHiPal(NULL), _currentBg(0), _scrollBg(0),
+ _bgShift(0) {
+
+ int i;
+ for (i = 0; i < 9; i++) {
+ _bgTable[i].bg = NULL;
+ _bgTable[i].lowPal = NULL;
+ _bgTable[i].hiPal = NULL;
+ memset(_bgTable[i].name, 0, sizeof (_bgTable[i].name));
+ }
+}
+
+/*! \brief Destroy Operation Stealth renderer
+ */
+OSRenderer::~OSRenderer() {
+ delete[] _activeHiPal;
+
+ for (int i = 0; i < 9; i++) {
+ delete[] _bgTable[i].bg;
+ delete[] _bgTable[i].lowPal;
+ delete[] _bgTable[i].hiPal;
+ }
+}
+
+/*! \brief Reset Operation Stealth renderer state
+ */
+void OSRenderer::clear() {
+ delete[] _activeHiPal;
+ _activeHiPal = NULL;
+
+ for (int i = 0; i < 9; i++) {
+ delete[] _bgTable[i].bg;
+ delete[] _bgTable[i].lowPal;
+ delete[] _bgTable[i].hiPal;
+
+ _bgTable[i].bg = NULL;
+ _bgTable[i].lowPal = NULL;
+ _bgTable[i].hiPal = NULL;
+ memset(_bgTable[i].name, 0, sizeof (_bgTable[i].name));
+ }
+
+ _currentBg = 0;
+ _scrollBg = 0;
+ _bgShift = 0;
+
+ FWRenderer::clear();
+}
+
+/*! \brief Draw 1bpp sprite using selected color on backgrounds
+ * \param obj Object info
+ * \param fillColor Sprite color
+ */
+void OSRenderer::incrustMask(const objectStruct &obj, uint8 color) {
+ const byte *data = animDataTable[obj.frame].data();
+ int x, y, width, height, i;
+
+ x = obj.x;
+ y = obj.y;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ for (i = 0; i < 8; i++) {
+ if (!_bgTable[i].bg) {
+ continue;
+ }
+
+ gfxFillSprite(data, width, height, _bgTable[i].bg, x, y, color);
+ }
+}
+
+/*! \brief Draw color sprite
+ * \param obj Object info
+ */
+void OSRenderer::drawSprite(const objectStruct &obj) {
+ const byte *data = animDataTable[obj.frame].data();
+ int x, y, width, height, transColor;
+
+ x = obj.x;
+ y = obj.y;
+ transColor = obj.part;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ drawSpriteRaw2(data, transColor, width, height, _backBuffer, x, y);
+}
+
+/*! \brief Draw color sprite
+ * \param obj Object info
+ */
+void OSRenderer::incrustSprite(const objectStruct &obj) {
+ const byte *data = animDataTable[obj.frame].data();
+ int x, y, width, height, transColor, i;
+
+ x = obj.x;
+ y = obj.y;
+ transColor = obj.part;
+ width = animDataTable[obj.frame]._realWidth;
+ height = animDataTable[obj.frame]._height;
+
+ for (i = 0; i < 8; i++) {
+ if (!_bgTable[i].bg) {
+ continue;
+ }
+
+ drawSpriteRaw2(data, transColor, width, height, _bgTable[i].bg, x, y);
+ }
+}
+
+/*! \brief Draw text character on screen
+ * \param character Character to draw
+ * \param x Character coordinate
+ * \param y Character coordinate
+ */
+int OSRenderer::drawChar(char character, int x, int y) {
+ int width, idx;
+
+ if (character == ' ') {
+ x += 5;
+ } else if ((width = fontParamTable[character].characterWidth)) {
+ idx = fontParamTable[character].characterIdx;
+ drawSpriteRaw2(textTable[idx][0], 0, 16, 8, _backBuffer, x, y);
+ x += width + 1;
+ }
+
+ return x;
+}
+
+/*! \brief Draw background to backbuffer
+ */
+void OSRenderer::drawBackground() {
+ byte *main;
+
+ main = _bgTable[_currentBg].bg;
+ assert(main);
+
+ if (!_bgShift) {
+ memcpy(_backBuffer, main, _screenSize);
+ } else {
+ byte *scroll = _bgTable[_scrollBg].bg;
+ int mainShift = _bgShift * _screenWidth;
+ int mainSize = _screenSize - mainShift;
+
+ assert(scroll);
+
+ memcpy(_backBuffer, main + mainShift, mainSize);
+ memcpy(_backBuffer + mainSize, scroll, mainShift);
+ }
+}
+
+/*! \brief Draw one overlay
+ * \param it Overlay info
+ */
+void OSRenderer::renderOverlay(const Common::List<overlay>::iterator &it) {
+ int len;
+ objectStruct *obj;
+ AnimData *sprite;
+ byte *mask;
+
+ switch (it->type) {
+ // color sprite
+ case 0:
+ sprite = animDataTable + objectTable[it->objIdx].frame;
+ len = sprite->_realWidth * sprite->_height;
+ mask = new byte[len];
+ generateMask(sprite->data(), mask, len, objectTable[it->objIdx].part);
+ remaskSprite(mask, it);
+ drawMaskedSprite(objectTable[it->objIdx], mask);
+ delete[] mask;
+ break;
+
+ // masked background
+ case 20:
+ assert(it->objIdx < NUM_MAX_OBJECT);
+ obj = objectTable + it->objIdx;
+ sprite = animDataTable + obj->frame;
+
+ if (obj->frame < 0 || it->x > 8 || !_bgTable[it->x].bg || sprite->_bpp != 1) {
+ break;
+ }
+
+ maskBgOverlay(_bgTable[it->x].bg, sprite->data(), sprite->_realWidth, sprite->_height, _backBuffer, obj->x, obj->y);
+ break;
+
+ // something else
+ default:
+ FWRenderer::renderOverlay(it);
+ break;
+ }
+}
+
+/*! \brief Refresh current palette
+ */
+void OSRenderer::refreshPalette() {
+ if (!_activeHiPal) {
+ FWRenderer::refreshPalette();
+ return;
+ }
+
+ int i;
+ byte pal[256*4];
+
+ for (i = 0; i < 256; i++) {
+ pal[i * 4 + 0] = _activeHiPal[i * 3 + 0];
+ pal[i * 4 + 1] = _activeHiPal[i * 3 + 1];
+ pal[i * 4 + 2] = _activeHiPal[i * 3 + 2];
+ pal[i * 4 + 3] = 0;
+ }
+
+ g_system->setPalette(pal, 0, 256);
+ _changePal = 0;
+}
+
+/*! \brief Load palette of current background
+ */
+void OSRenderer::reloadPalette() {
+ // selected background in plane takeoff scene has swapped colors 12
+ // and 14, shift background has it right
+ palBg *bg = _bgShift ? &_bgTable[_scrollBg] : &_bgTable[_currentBg];
+
+ assert(bg->lowPal || bg->hiPal);
+
+ if (bg->lowPal) {
+ if (!_activeLowPal) {
+ _activeLowPal = new uint16[_lowPalSize];
+ }
+
+ assert(_activeLowPal);
+
+ delete[] _activeHiPal;
+ _activeHiPal = NULL;
+
+ memcpy(_activeLowPal, bg->lowPal, _lowPalSize * sizeof (uint16));
+ } else {
+ if (!_activeHiPal) {
+ _activeHiPal = new byte[_hiPalSize];
+ }
+
+ assert(_activeHiPal);
+
+ delete[] _activeLowPal;
+ _activeLowPal = NULL;
+
+ memcpy(_activeHiPal, bg->hiPal, _hiPalSize);
+ }
+ _changePal = 1;
+}
+
+/*! \brief Rotate active palette
+ * \param a First color to rotate
+ * \param b Last color to rotate
+ * \param c Possibly rotation step, must be equal to 1 at the moment
+ */
+void OSRenderer::rotatePalette(int a, int b, int c) {
+ if (_activeLowPal) {
+ FWRenderer::rotatePalette(a, b, c);
+ return;
+ }
+
+ palRotate(_activeHiPal, a, b, c);
+ refreshPalette();
+}
+
+/*! \brief Copy part of backup palette to active palette and transform
+ * \param first First color to transform
+ * \param last Last color to transform
+ * \param r Red channel transformation
+ * \param g Green channel transformation
+ * \param b Blue channel transformation
+ */
+void OSRenderer::transformPalette(int first, int last, int r, int g, int b) {
+ palBg *bg = _bgShift ? &_bgTable[_scrollBg] : &_bgTable[_currentBg];
+
+ if (!bg->lowPal) {
+ if (!_activeHiPal) {
+ _activeHiPal = new byte[_hiPalSize];
+ memset(_activeHiPal, 0, _hiPalSize);
+ }
+
+ delete[] _activeLowPal;
+ _activeLowPal = NULL;
+
+ transformPaletteRange(_activeHiPal, bg->hiPal, first, last, r, g, b);
+ } else {
+ if (!_activeLowPal) {
+ _activeLowPal = new uint16[_lowPalSize];
+ memset(_activeLowPal, 0, _lowPalSize * sizeof (uint16));
+ }
+
+ delete[] _activeHiPal;
+ _activeHiPal = NULL;
+
+ transformPaletteRange(_activeLowPal, bg->lowPal, first, last, r, g, b);
+ }
+
+ refreshPalette();
+}
+
+/*! \brief Load 16 color background into renderer
+ * \param bg Raw background data
+ * \param name Background filename
+ */
+void OSRenderer::loadBg16(const byte *bg, const char *name) {
+ loadBg16(bg, name, 0);
+}
+
+/*! \brief Load 16 color background into renderer
+ * \param bg Raw background data
+ * \param name Background filename
+ * \param pos Background index
+ */
+void OSRenderer::loadBg16(const byte *bg, const char *name, unsigned int idx) {
+ int i;
+ assert(idx < 9);
+
+ if (!_bgTable[idx].bg) {
+ _bgTable[idx].bg = new byte[_screenSize];
+ }
+
+ if (!_bgTable[idx].lowPal) {
+ _bgTable[idx].lowPal = new uint16[_lowPalSize];
+ }
+
+ assert(_bgTable[idx].bg && _bgTable[idx].lowPal);
+
+ delete[] _bgTable[idx].hiPal;
+ _bgTable[idx].hiPal = NULL;
+
+ strcpy(_bgTable[idx].name, name);
+
+ for (i = 0; i < _lowPalSize; i++, bg += 2) {
+ _bgTable[idx].lowPal[i] = READ_BE_UINT16(bg);
+ }
+
+ gfxConvertSpriteToRaw(_bgTable[idx].bg, bg, 160, 200);
+}
+
+/*! \brief Load 16 color CT data as background into renderer
+ * \param ct Raw CT data
+ * \param name Background filename
+ */
+void OSRenderer::loadCt16(const byte *ct, const char *name) {
+ loadBg16(ct, name, 8);
+}
+
+/*! \brief Load 256 color background into renderer
+ * \param bg Raw background data
+ * \param name Background filename
+ */
+void OSRenderer::loadBg256(const byte *bg, const char *name) {
+ loadBg256(bg, name, 0);
+}
+
+/*! \brief Load 256 color background into renderer
+ * \param bg Raw background data
+ * \param name Background filename
+ * \param pos Background index
+ */
+void OSRenderer::loadBg256(const byte *bg, const char *name, unsigned int idx) {
+ assert(idx < 9);
+
+ if (!_bgTable[idx].bg) {
+ _bgTable[idx].bg = new byte[_screenSize];
+ }
+
+ if (!_bgTable[idx].hiPal) {
+ _bgTable[idx].hiPal = new byte[_hiPalSize];
+ }
+
+ assert(_bgTable[idx].bg && _bgTable[idx].hiPal);
+
+ delete[] _bgTable[idx].lowPal;
+ _bgTable[idx].lowPal = NULL;
+
+ strcpy(_bgTable[idx].name, name);
+ memcpy(_bgTable[idx].hiPal, bg, _hiPalSize);
+ memcpy(_bgTable[idx].bg, bg + _hiPalSize, _screenSize);
+}
+
+/*! \brief Load 256 color CT data as background into renderer
+ * \param ct Raw CT data
+ * \param name Background filename
+ */
+void OSRenderer::loadCt256(const byte *ct, const char *name) {
+ loadBg256(ct, name, 8);
+}
+
+/*! \brief Select active background and load its palette
+ * \param idx Background index
+ */
+void OSRenderer::selectBg(unsigned int idx) {
+ assert(idx < 9 && _bgTable[idx].bg);
+ assert(_bgTable[idx].lowPal || _bgTable[idx].hiPal);
+
+ _currentBg = idx;
+ reloadPalette();
+}
+
+/*! \brief Select scroll background
+ * \param idx Scroll background index
+ */
+void OSRenderer::selectScrollBg(unsigned int idx) {
+ assert(idx < 9);
+
+ if (_bgTable[idx].bg) {
+ _scrollBg = idx;
+ }
+ reloadPalette();
+}
+
+/*! \brief Set background scroll
+ * \param shift Background scroll in pixels
+ */
+void OSRenderer::setScroll(unsigned int shift) {
+ assert(shift <= 200);
+
+ _bgShift = shift;
+}
+
+/*! \brief Unload background from renderer
+ * \param idx Background to unload
+ */
+void OSRenderer::removeBg(unsigned int idx) {
+ assert(idx > 0 && idx < 9);
+
+ if (_currentBg == idx) {
+ _currentBg = 0;
+ }
+
+ if (_scrollBg == idx) {
+ _scrollBg = 0;
+ }
+
+ delete[] _bgTable[idx].bg;
+ delete[] _bgTable[idx].lowPal;
+ delete[] _bgTable[idx].hiPal;
+ _bgTable[idx].bg = NULL;
+ _bgTable[idx].lowPal = NULL;
+ _bgTable[idx].hiPal = NULL;
+ memset(_bgTable[idx].name, 0, sizeof (_bgTable[idx].name));
+}
+
+/*! \brief Fade to black
+ * \bug Operation Stealth sometimes seems to fade to black using
+ * transformPalette resulting in double fadeout
+ */
+void OSRenderer::fadeToBlack() {
+ if (!_activeHiPal) {
+ FWRenderer::fadeToBlack();
+ return;
+ }
+
+ for (int i = 0; i < 8; i++) {
+ for (int j = 0; j < _hiPalSize; j++) {
+ _activeHiPal[j] = CLIP(_activeHiPal[j] - 32, 0, 255);
+ }
+
+ refreshPalette();
+ g_system->updateScreen();
+ g_system->delayMillis(50);
+ }
}
void setMouseCursor(int cursor) {
@@ -147,21 +1299,6 @@ void setMouseCursor(int cursor) {
}
}
-static uint16 transformColor(uint16 baseColor, int8 r, int8 g, int8 b) {
- int8 oriR = CLIP( (baseColor & 0x007) + r, 0, 7);
- int8 oriG = CLIP(((baseColor & 0x070) >> 4) + g, 0, 7);
- int8 oriB = CLIP(((baseColor & 0x700) >> 8) + b, 0, 7);
-
- return oriR | (oriG << 4) | (oriB << 8);
-}
-
-void transformPaletteRange(byte startColor, byte stopColor, int8 r, int8 g, int8 b) {
- for (byte i = startColor; i <= stopColor; i++) {
- c_palette[i] = transformColor(tempPalette[i], b, g, r);
- }
- //gfxFlipPage(page2);
-}
-
void gfxFillSprite(const byte *spritePtr, uint16 width, uint16 height, byte *page, int16 x, int16 y, uint8 fillColor) {
int16 i, j;
@@ -170,17 +1307,12 @@ void gfxFillSprite(const byte *spritePtr, uint16 width, uint16 height, byte *pag
destPtr += i * 320;
for (j = 0; j < width; j++) {
- if (x + j >= 0 && x + j < 320 && i + y >= 0
- && i + y < 200) {
- if (!*(spritePtr++)) {
- *(destPtr++) = fillColor;
- } else {
- destPtr++;
- }
- } else {
- destPtr++;
- spritePtr++;
+ if (x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200 && !*spritePtr) {
+ *destPtr = fillColor;
}
+
+ destPtr++;
+ spritePtr++;
}
}
}
@@ -360,53 +1492,7 @@ void gfxConvertSpriteToRaw(byte *dst, const byte *src, uint16 w, uint16 h) {
}
}
-void gfxCopyRawPage(byte *source, byte *dest) {
- memcpy(dest, source, 320 * 200);
-}
-
-void gfxFlipRawPage(byte *frontBuffer) {
- byte *page = frontBuffer;
- int x, y, i;
- byte *pixels = (byte *) screenBuffer;
- byte c;
- byte pal[256 * 4];
-
- for (y = 0; y < 200; y++) {
- for (x = 0; x < 320; x++) {
- c = *(page++);
-
- if (!colorMode256) {
- c = c & 15;
- }
-
- pixels[x + 0 + y * 320] = c;
- }
- }
-
- if (colorMode256) {
- for (i = 0; i < 256; i++) {
- pal[i * 4 + 0] = palette256[i * 3 + 0];
- pal[i * 4 + 1] = palette256[i * 3 + 1];
- pal[i * 4 + 2] = palette256[i * 3 + 2];
- pal[i * 4 + 3] = 0;
- }
- g_system->setPalette(pal, 0, 256);
- } else {
- for (i = 0; i < 16; i++) {
- // This seems to match the output from DOSbox.
- pal[i * 4 + 2] = ((c_palette[i] & 0x00f) >> 0) * 32;
- pal[i * 4 + 1] = ((c_palette[i] & 0x0f0) >> 4) * 32;
- pal[i * 4 + 0] = ((c_palette[i] & 0xf00) >> 8) * 32;
- pal[i * 4 + 3] = 0;
- }
- g_system->setPalette(pal, 0, 16);
- }
-
- g_system->copyRectToScreen(screenBuffer, 320, 0, 0, 320, 200);
-}
-
-void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int16 height,
- byte *page, int16 x, int16 y) {
+void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int16 height, byte *page, int16 x, int16 y) {
int16 i, j;
// FIXME: Is it a bug if maskPtr == NULL?
@@ -417,9 +1503,8 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1
byte *destPtr = page + x + y * 320;
destPtr += i * 320;
- for (j = 0; j < width * 8; j++) {
- if (((g_cine->getGameType() == Cine::GType_FW && (!maskPtr || !(*maskPtr))) || (g_cine->getGameType() == Cine::GType_OS)) && (x + j >= 0
- && x + j < 320 && i + y >= 0 && i + y < 200)) {
+ for (j = 0; j < width; j++) {
+ if ((!maskPtr || !(*maskPtr)) && x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200) {
*(destPtr++) = *(spritePtr++);
} else {
destPtr++;
@@ -432,21 +1517,19 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1
}
}
-void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height,
- byte *page, int16 x, int16 y) {
+void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y) {
int16 i, j;
for (i = 0; i < height; i++) {
byte *destPtr = page + x + y * 320;
destPtr += i * 320;
- for (j = 0; j < width * 8; j++) {
- if ((*(spritePtr) != transColor) && (x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200)) {
- *(destPtr++) = *(spritePtr++);
- } else {
- destPtr++;
- spritePtr++;
+ for (j = 0; j < width; j++) {
+ if ((*spritePtr != transColor) && (x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200)) {
+ *destPtr = *spritePtr;
}
+ destPtr++;
+ spritePtr++;
}
}
}
@@ -499,93 +1582,4 @@ void maskBgOverlay(const byte *bgPtr, const byte *maskPtr, int16 width, int16 he
}
}
-/*! \todo Fix rendering to prevent fadein artifacts
- */
-void fadeFromBlack() {
- int i, j;
- int r, g, b, tr, tg, tb;
- if (newColorMode == 2) {
- colorMode256 = 1;
- memset(palette256, 0, 256*3);
- } else if (newColorMode == 1) {
- colorMode256 = 0;
- memset(c_palette, 0, 16 * sizeof(uint16));
- }
-
- for (i = 0; i < 8; i++ ) {
- gfxFlipRawPage(page1Raw);
- g_system->updateScreen();
- g_system->delayMillis(50);
-
- if (colorMode256) {
- for (j = 0; j < 256*3; j++) {
- r = palette256[j] + (newPalette[j] + 7) / 8;
- palette256[j] = CLIP(r, 0, (int)newPalette[j]);
- }
- } else {
- for (j = 0; j < 16; j++) {
- r = c_palette[j] & 0xf;
- g = (c_palette[j] & 0xf0) >> 4;
- b = (c_palette[j] & 0xf00) >> 8;
-
- tr = tempPalette[j] & 0xf;
- tg = (tempPalette[j] & 0xf0) >> 4;
- tb = (tempPalette[j] & 0xf00) >> 8;
-
- r = CLIP(r + (tr + 7) / 8, 0, tr);
- g = CLIP(g + (tg + 7) / 8, 0, tg);
- b = CLIP(b + (tb + 7) / 8, 0, tb);
-
- c_palette[j] = r | (g << 4) | (b << 8);
- }
-
- }
- }
-
- if (colorMode256) {
- memcpy(palette256, newPalette, 256*3);
- } else {
- memcpy(c_palette, tempPalette, sizeof(uint16) * 16);
- }
-}
-
-void fadeToBlack() {
- for (int i = 0; i < 8; i++) {
- if (colorMode256) {
- for (int j = 0; j < 256*3; j++) {
- palette256[j] = CLIP(palette256[j] - 32, 0, 255);
- }
- } else {
- for (int j = 0; j < 16; j++) {
- c_palette[j] = transformColor(c_palette[j], -1, -1, -1);
- }
- }
- gfxFlipRawPage(page1Raw);
- g_system->updateScreen();
- g_system->delayMillis(50);
- }
-}
-
-void blitRawScreen(byte *frontBuffer) {
- gfxFlipRawPage(frontBuffer);
-}
-
-void flip(void) {
- blitRawScreen(page1Raw);
- if (fadeRequired) {
- if (newColorMode == 3) {
- newColorMode = ctColorMode + 1;
- }
-
- if (newColorMode == 2) {
- colorMode256 = 1;
- memcpy(palette256, newPalette, 256*3);
- } else {
- colorMode256 = 0;
- memcpy(c_palette, tempPalette, sizeof(uint16) * 16);
- }
- fadeRequired = false;
- }
-}
-
} // End of namespace Cine
diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h
index 3812b52113..c63c79ac82 100644
--- a/engines/cine/gfx.h
+++ b/engines/cine/gfx.h
@@ -26,24 +26,158 @@
#ifndef CINE_GFX_H
#define CINE_GFX_H
+#include "common/noncopyable.h"
+#include "cine/object.h"
+
namespace Cine {
+/*! \brief Background with palette
+ */
+struct palBg {
+ byte *bg; ///< Background data
+ byte *hiPal; ///< 256 color palette
+ uint16 *lowPal; ///< 16 color palette
+ char name[15]; ///< Background filename
+};
+
+/*! \brief Future Wars renderer
+ *
+ * Screen backbuffer is not cleared between frames, you can draw menus etc.
+ * without calling drawFrame() all the time
+ */
+class FWRenderer : public Common::NonCopyable {
+private:
+ byte *_background; ///< Current background
+ char _bgName[13]; ///< Background filename
+ uint16 *_palette; ///< 16 color backup palette
+
+ Common::String _cmd; ///< Player command string
+
+protected:
+ static const int _screenSize = 320 * 200; ///< Screen size
+ static const int _screenWidth = 320; ///< Screen width
+ static const int _screenHeight = 200; ///< Screen height
+ static const int _lowPalSize = 16; ///< 16 color palette size
+
+ byte *_backBuffer; ///< Screen backbuffer
+ uint16 *_activeLowPal; ///< Active 16 color palette
+ int _changePal; ///< Load active palette to video backend on next frame
+
+ void fillSprite(const objectStruct &obj, uint8 color = 0);
+ void drawMaskedSprite(const objectStruct &obj, const byte *mask);
+ virtual void drawSprite(const objectStruct &obj);
+
+ void drawCommand();
+ void drawMessage(const char *str, int x, int y, int width, byte color);
+ void drawPlainBox(int x, int y, int width, int height, byte color);
+ void drawBorder(int x, int y, int width, int height, byte color);
+ void drawDoubleBorder(int x, int y, int width, int height, byte color);
+ virtual int drawChar(char character, int x, int y);
+ void drawLine(int x, int y, int width, int height, byte color);
+ void remaskSprite(byte *mask, Common::List<overlay>::iterator it);
+ virtual void drawBackground();
+
+ virtual void renderOverlay(const Common::List<overlay>::iterator &it);
+ void drawOverlays();
+
+public:
+ uint16 _messageBg; ///< Message box background color
+ uint16 _cmdY; ///< Player command string position on screen
+
+ FWRenderer();
+ virtual ~FWRenderer();
+
+ /*! \brief Test if renderer is ready to draw */
+ virtual bool ready() { return _background != NULL; }
+
+ virtual void clear();
+
+ void drawFrame();
+ void blit();
+ void setCommand(const char *cmd);
+
+ virtual void incrustMask(const objectStruct &obj, uint8 color = 0);
+ virtual void incrustSprite(const objectStruct &obj);
+
+ virtual void loadBg16(const byte *bg, const char *name);
+ virtual void loadBg16(const byte *bg, const char *name, unsigned int idx);
+ virtual void loadCt16(const byte *ct, const char *name);
+ virtual void loadBg256(const byte *bg, const char *name);
+ virtual void loadBg256(const byte *bg, const char *name, unsigned int idx);
+ virtual void loadCt256(const byte *ct, const char *name);
+ virtual void selectBg(unsigned int idx);
+ virtual void selectScrollBg(unsigned int idx);
+ virtual void setScroll(unsigned int shift);
+ virtual void removeBg(unsigned int idx);
+ void saveBg(Common::OutSaveFile &fHandle);
+
+ virtual void refreshPalette();
+ virtual void reloadPalette();
+ void restorePalette(Common::InSaveFile &fHandle);
+ void savePalette(Common::OutSaveFile &fHandle);
+ virtual void rotatePalette(int a, int b, int c);
+ virtual void transformPalette(int first, int last, int r, int g, int b);
+
+ void drawMenu(const CommandeType *items, unsigned int height, int x, int y, int width, int selected);
+ void drawInputBox(const char *info, const char *input, int cursor, int x, int y, int width);
+
+ virtual void fadeToBlack();
+};
+
+/*! \brief Operation Stealth renderer
+ */
+class OSRenderer : public FWRenderer {
+private:
+ palBg _bgTable[9]; ///< Table of backgrounds loaded into renderer
+ byte *_activeHiPal; ///< Active 256 color palette
+ unsigned int _currentBg; ///< Current background
+ unsigned int _scrollBg; ///< Current scroll background
+ unsigned int _bgShift; ///< Background shift
+
+protected:
+ static const int _hiPalSize = 256 * 3; ///< 256 color palette size
+
+ void drawSprite(const objectStruct &obj);
+ int drawChar(char character, int x, int y);
+ void drawBackground();
+ void renderOverlay(const Common::List<overlay>::iterator &it);
+
+public:
+ OSRenderer();
+ ~OSRenderer();
+
+ /*! \brief Test if renderer is ready to draw */
+ bool ready() { return _bgTable[_currentBg].bg != NULL; }
+
+ void clear();
+
+ void incrustMask(const objectStruct &obj, uint8 color = 0);
+ void incrustSprite(const objectStruct &obj);
+
+ void loadBg16(const byte *bg, const char *name);
+ void loadBg16(const byte *bg, const char *name, unsigned int idx);
+ void loadCt16(const byte *ct, const char *name);
+ void loadBg256(const byte *bg, const char *name);
+ void loadBg256(const byte *bg, const char *name, unsigned int idx);
+ void loadCt256(const byte *ct, const char *name);
+ void selectBg(unsigned int idx);
+ void selectScrollBg(unsigned int idx);
+ void setScroll(unsigned int shift);
+ void removeBg(unsigned int idx);
+
+ void refreshPalette();
+ void reloadPalette();
+ void rotatePalette(int a, int b, int c);
+ void transformPalette(int first, int last, int r, int g, int b);
+
+ void fadeToBlack();
+};
+
void gfxDrawSprite(byte *src4, uint16 sw, uint16 sh, byte *dst4, int16 sx, int16 sy);
-extern byte *page1Raw;
-extern byte *page2Raw;
extern byte *page3Raw;
+extern FWRenderer *renderer;
-extern uint16 c_palette[256];
-extern byte colorMode256;
-extern byte palette256[256 * 3];
-extern byte newPalette[256 * 3];
-extern byte newColorMode;
-extern byte ctColorMode;
-extern byte bgColorMode;
-
-void gfxInit();
-void gfxDestroy();
void setMouseCursor(int cursor);
void gfxCopyPage(byte *source, byte *dest);
diff --git a/engines/cine/main_loop.cpp b/engines/cine/main_loop.cpp
index 098ce84ae5..0c5096c0d6 100644
--- a/engines/cine/main_loop.cpp
+++ b/engines/cine/main_loop.cpp
@@ -182,7 +182,6 @@ int getKeyData() {
void CineEngine::mainLoop(int bootScriptIdx) {
bool playerAction;
uint16 quitFlag;
- uint16 i;
byte di;
uint16 mouseButton;
@@ -190,7 +189,6 @@ void CineEngine::mainLoop(int bootScriptIdx) {
exitEngine = 0;
if (_preLoad == false) {
- resetSeqList();
resetBgIncrustList();
setTextWindow(0, 0, 20, 200);
@@ -224,17 +222,10 @@ void CineEngine::mainLoop(int bootScriptIdx) {
globalVars[VAR_LOW_MEMORY] = 0; // set to 1 to disable some animations, sounds etc.
}
- for (i = 0; i < 16; i++) {
- c_palette[i] = 0;
- }
-
- _paletteNeedUpdate = true;
-
strcpy(newPrcName, "");
strcpy(newRelName, "");
strcpy(newObjectName, "");
strcpy(newMsgName, "");
- strcpy(currentBgName[0], "");
strcpy(currentCtName, "");
strcpy(currentPartName, "");
@@ -258,8 +249,9 @@ void CineEngine::mainLoop(int bootScriptIdx) {
setMouseCursor(MOUSE_CURSOR_CROSS);
}
- drawOverlays();
- flip();
+ if (renderer->ready()) {
+ renderer->drawFrame();
+ }
if (waitForPlayerClick) {
playerAction = false;
@@ -290,6 +282,8 @@ void CineEngine::mainLoop(int bootScriptIdx) {
} while (mouseButton != 0);
waitForPlayerClick = 0;
+
+ removeMessages();
}
if (checkForPendingDataLoadSwitch) {
diff --git a/engines/cine/object.cpp b/engines/cine/object.cpp
index 36f7b17a69..89d6b99592 100644
--- a/engines/cine/object.cpp
+++ b/engines/cine/object.cpp
@@ -236,6 +236,10 @@ uint16 compareObjectParam(byte objIdx, byte type, int16 value) {
return compareResult;
}
+/*! \bug In Operation Stealth, if you try to go downstairs to the sea in the
+ * location between bank and hotel, getObjectParam is called with paramIdx 16
+ * and crashes
+ */
int16 getObjectParam(uint16 objIdx, uint16 paramIdx) {
assert(objIdx <= NUM_MAX_OBJECT);
diff --git a/engines/cine/pal.cpp b/engines/cine/pal.cpp
index 9341563898..3e6f5adf40 100644
--- a/engines/cine/pal.cpp
+++ b/engines/cine/pal.cpp
@@ -28,8 +28,6 @@
namespace Cine {
-uint16 tempPalette[256];
-
uint16 palEntriesCount;
PalEntry *palPtr = NULL;
@@ -113,4 +111,64 @@ void loadRelatedPalette(const char *fileName) {
}
}
+void palRotate(uint16 *pal, byte a, byte b, byte c) {
+ assert(pal);
+
+ if (c == 1) {
+ uint16 currentColor = pal[b];
+
+ for (int i = b; i > a; i--) {
+ pal[i] = pal[i - 1];
+ }
+
+ pal[a] = currentColor;
+ }
+}
+
+void palRotate(byte *pal, byte a, byte b, byte c) {
+ assert(pal);
+
+ if (c == 1) {
+ byte currentR = pal[3 * b + 0];
+ byte currentG = pal[3 * b + 1];
+ byte currentB = pal[3 * b + 2];
+
+ for (int i = b; i > a; i--) {
+ pal[3 * i + 0] = pal[3 * (i - 1) + 0];
+ pal[3 * i + 1] = pal[3 * (i - 1) + 1];
+ pal[3 * i + 2] = pal[3 * (i - 1) + 2];
+ }
+
+ pal[3 * a + 0] = currentR;
+ pal[3 * a + 1] = currentG;
+ pal[3 * a + 2] = currentB;
+ }
+}
+
+uint16 transformColor(uint16 baseColor, int r, int g, int b) {
+ int8 oriR = CLIP( (baseColor & 0x007) + b, 0, 7);
+ int8 oriG = CLIP(((baseColor & 0x070) >> 4) + g, 0, 7);
+ int8 oriB = CLIP(((baseColor & 0x700) >> 8) + r, 0, 7);
+
+ return oriR | (oriG << 4) | (oriB << 8);
+}
+
+void transformPaletteRange(uint16 *dstPal, uint16 *srcPal, int startColor, int stopColor, int r, int g, int b) {
+ assert(srcPal && dstPal);
+
+ for (int i = startColor; i <= stopColor; i++) {
+ dstPal[i] = transformColor(srcPal[i], r, g, b);
+ }
+}
+
+void transformPaletteRange(byte *dstPal, byte *srcPal, int startColor, int stopColor, int r, int g, int b) {
+ assert(srcPal && dstPal);
+
+ for (int i = startColor; i <= stopColor; i++) {
+ dstPal[3 * i + 0] = CLIP(srcPal[3 * i + 0] + r * 32, 0, 255);
+ dstPal[3 * i + 1] = CLIP(srcPal[3 * i + 1] + g * 32, 0, 255);
+ dstPal[3 * i + 2] = CLIP(srcPal[3 * i + 2] + b * 32, 0, 255);
+ }
+}
+
} // End of namespace Cine
diff --git a/engines/cine/pal.h b/engines/cine/pal.h
index da822fa1a1..70fcc0d98a 100644
--- a/engines/cine/pal.h
+++ b/engines/cine/pal.h
@@ -36,10 +36,14 @@ struct PalEntry {
void loadPal(const char *fileName);
-extern uint16 tempPalette[256];
-
void loadRelatedPalette(const char *fileName);
+void palRotate(uint16 *pal, byte a, byte b, byte c);
+void palRotate(byte *pal, byte a, byte b, byte c);
+uint16 transformColor(uint16 baseColor, int r, int g, int b);
+void transformPaletteRange(uint16 *srcPal, uint16 *dstPal, int startColor, int stopColor, int r, int g, int b);
+void transformPaletteRange(byte *srcPal, byte *dstPal, int startColor, int stopColor, int r, int g, int b);
+
} // End of namespace Cine
#endif
diff --git a/engines/cine/prc.cpp b/engines/cine/prc.cpp
index 0f068a197e..402c97b1a6 100644
--- a/engines/cine/prc.cpp
+++ b/engines/cine/prc.cpp
@@ -98,10 +98,10 @@ void loadPrc(const char *pPrcName) {
char buffer[256];
for (s = 0; s < numScripts; s++) {
- if (scriptTable[s].size) {
+ if (scriptTable[s]->_size) {
sprintf(buffer, "%s_%03d.txt", pPrcName, s);
- decompileScript(scriptTable[s].ptr, scriptTable[s].stack, scriptTable[s].size, s);
+ decompileScript((const byte *)scriptTable[s]->getString(0), scriptTable[s]->_size, s);
dumpScript(buffer);
}
}
diff --git a/engines/cine/rel.cpp b/engines/cine/rel.cpp
index f550efed27..dd2d0f68b6 100644
--- a/engines/cine/rel.cpp
+++ b/engines/cine/rel.cpp
@@ -81,10 +81,10 @@ void loadRel(char *pRelName) {
char buffer[256];
for (s = 0; s < numEntry; s++) {
- if (relTable[s].size) {
+ if (relTable[s]->_size) {
sprintf(buffer, "%s_%03d.txt", pRelName, s);
- decompileScript(relTable[s].data, NULL, relTable[s].size, s);
+ decompileScript((const byte *)relTable[s]->getString(0), relTable[s]->_size, s);
dumpScript(buffer);
}
}
diff --git a/engines/cine/script.h b/engines/cine/script.h
index 4a2e7072ee..23bb179ee5 100644
--- a/engines/cine/script.h
+++ b/engines/cine/script.h
@@ -230,6 +230,7 @@ protected:
int o1_unloadMask5();
// pointers to member functions in C++ suck...
+ int o2_loadCt();
int o2_loadPart();
int o2_addSeqListElement();
int o2_removeSeq();
@@ -362,7 +363,7 @@ extern ScriptVars globalVars;
void setupOpcodes();
-void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16 scriptIdx);
+void decompileScript(const byte *scriptPtr, uint16 scriptSize, uint16 scriptIdx);
void dumpScript(char *dumpName);
#define OP_loadPart 0x3F
diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp
index f833d7c30b..4f6749517e 100644
--- a/engines/cine/script_fw.cpp
+++ b/engines/cine/script_fw.cpp
@@ -41,11 +41,6 @@ namespace Cine {
ScriptVars globalVars(NUM_MAX_VAR);
uint16 compareVars(int16 a, int16 b);
-void palRotate(byte a, byte b, byte c);
-void removeSeq(uint16 param1, uint16 param2, uint16 param3);
-uint16 isSeqRunning(uint16 param1, uint16 param2, uint16 param3);
-void addGfxElementA0(int16 param1, int16 param2);
-void removeGfxElementA0(int16 idx, int16 param);
const Opcode FWScript::_opcodeTable[] = {
/* 00 */
@@ -1299,7 +1294,7 @@ int FWScript::o1_loadCt() {
const char *param = getNextString();
debugC(5, kCineDebugScript, "Line: %d: loadCt(\"%s\")", _line, param);
- loadCt(param);
+ loadCtFW(param);
return 0;
}
@@ -1355,31 +1350,29 @@ int FWScript::o1_blitAndFade() {
debugC(5, kCineDebugScript, "Line: %d: request fadein", _line);
// TODO: use real code
- drawOverlays();
- fadeRequired = true;
- flip();
-
// fadeFromBlack();
+
+ renderer->reloadPalette();
return 0;
}
int FWScript::o1_fadeToBlack() {
debugC(5, kCineDebugScript, "Line: %d: request fadeout", _line);
- fadeToBlack();
+ renderer->fadeToBlack();
return 0;
}
int FWScript::o1_transformPaletteRange() {
byte startColor = getNextByte();
byte numColor = getNextByte();
- uint16 r = getNextWord();
- uint16 g = getNextWord();
- uint16 b = getNextWord();
+ int16 r = getNextWord();
+ int16 g = getNextWord();
+ int16 b = getNextWord();
debugC(5, kCineDebugScript, "Line: %d: transformPaletteRange(from:%d,numIdx:%d,r:%d,g:%d,b:%d)", _line, startColor, numColor, r, g, b);
- transformPaletteRange(startColor, numColor, r, g, b);
+ renderer->transformPalette(startColor, numColor, r, g, b);
return 0;
}
@@ -1387,7 +1380,8 @@ int FWScript::o1_setDefaultMenuColor2() {
byte param = getNextByte();
debugC(5, kCineDebugScript, "Line: %d: setDefaultMenuColor2(%d)", _line, param);
- defaultMenuBoxColor2 = param;
+
+ renderer->_messageBg = param;
return 0;
}
@@ -1397,7 +1391,8 @@ int FWScript::o1_palRotate() {
byte c = getNextByte();
debugC(5, kCineDebugScript, "Line: %d: palRotate(%d,%d,%d)", _line, a, b, c);
- palRotate(a, b, c);
+
+ renderer->rotatePalette(a, b, c);
return 0;
}
@@ -1475,11 +1470,7 @@ int FWScript::o1_compareGlobalVar() {
debugC(5, kCineDebugScript, "Line: %d: compare globalVars[%d] and %d", _line, varIdx, value);
- if (varIdx == 255 && (g_cine->getGameType() == Cine::GType_FW)) { // TODO: fix
- _compare = 1;
- } else {
- _compare = compareVars(_globalVars[varIdx], value);
- }
+ _compare = compareVars(_globalVars[varIdx], value);
}
return 0;
@@ -1558,7 +1549,8 @@ int FWScript::o1_setDefaultMenuColor() {
byte param = getNextByte();
debugC(5, kCineDebugScript, "Line: %d: setDefaultMenuColor(%d)", _line, param);
- defaultMenuBoxColor = param;
+
+ renderer->_cmdY = param;
return 0;
}
@@ -1728,18 +1720,6 @@ int FWScript::o1_unloadMask5() {
//-----------------------------------------------------------------------
-void palRotate(byte a, byte b, byte c) {
- if (c == 1) {
- uint16 currentColor = c_palette[b];
-
- for (int16 i = b; i > a; i--) {
- c_palette[i] = c_palette[i - 1];
- }
-
- c_palette[a] = currentColor;
- }
-}
-
void addScriptToList0(uint16 idx) {
ScriptPtr tmp(scriptInfo->create(*scriptTable[idx], idx));
assert(tmp);
@@ -1863,14 +1843,13 @@ const char *getObjPramName(byte paramIdx) {
}
}
-void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16 scriptIdx) {
+void decompileScript(const byte *scriptPtr, uint16 scriptSize, uint16 scriptIdx) {
char lineBuffer[256];
- byte *localScriptPtr = scriptPtr;
+ const byte *localScriptPtr = scriptPtr;
uint16 exitScript;
uint32 position = 0;
assert(scriptPtr);
- // assert(stackPtr);
exitScript = 0;
@@ -2292,7 +2271,7 @@ void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16
sprintf(lineBuffer, "loadPart(%s)\n", localScriptPtr + position);
}
- position += strlen((char *)localScriptPtr + position) + 1;
+ position += strlen((const char *)localScriptPtr + position) + 1;
break;
}
case 0x40:
@@ -2309,7 +2288,7 @@ void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16
sprintf(lineBuffer, "loadPrc(%d,%s)\n", param, localScriptPtr + position);
- position += strlen((char *)localScriptPtr + position) + 1;
+ position += strlen((const char *)localScriptPtr + position) + 1;
break;
}
case OP_requestCheckPendingDataLoad: // nop
@@ -2461,7 +2440,7 @@ void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16
{
sprintf(lineBuffer, "comment: %s\n", localScriptPtr + position);
- position += strlen((char *)localScriptPtr + position);
+ position += strlen((const char *)localScriptPtr + position);
break;
}
case 0x5A:
@@ -2540,7 +2519,7 @@ void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16
{
sprintf(lineBuffer, "loadDat(%s)\n", localScriptPtr + position);
- position += strlen((char *)localScriptPtr + position) + 1;
+ position += strlen((const char *)localScriptPtr + position) + 1;
break;
}
case 0x6E: // nop
@@ -2801,7 +2780,7 @@ void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16
sprintf(lineBuffer, "ADDBG(%d,%s)\n", param1, localScriptPtr + position);
- position += strlen((char *)localScriptPtr + position);
+ position += strlen((const char *)localScriptPtr + position);
break;
}
@@ -2825,7 +2804,7 @@ void decompileScript(byte *scriptPtr, int16 *stackPtr, uint16 scriptSize, uint16
sprintf(lineBuffer, "loadABS(%d,%s)\n", param1, localScriptPtr + position);
- position += strlen((char *)localScriptPtr + position);
+ position += strlen((const char *)localScriptPtr + position);
break;
}
diff --git a/engines/cine/script_os.cpp b/engines/cine/script_os.cpp
index 1f5ea2b838..7c88e3ffe3 100644
--- a/engines/cine/script_os.cpp
+++ b/engines/cine/script_os.cpp
@@ -73,7 +73,7 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o1_loadMask4, "b" },
{ &FWScript::o1_unloadMask4, "b" },
{ &FWScript::o1_addSpriteFilledToBgList, "b" },
- { &FWScript::o1_op1B, "" },
+ { &FWScript::o1_op1B, "" }, /* TODO: Name this opcode properly. */
/* 1C */
{ 0, 0 },
{ &FWScript::o1_label, "l" },
@@ -116,7 +116,7 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o1_loadAnim, "s" },
/* 3C */
{ &FWScript::o1_loadBg, "s" },
- { &FWScript::o1_loadCt, "s" },
+ { &FWScript::o2_loadCt, "s" },
{ 0, 0 },
{ &FWScript::o2_loadPart, "s" },
/* 40 */
@@ -173,7 +173,7 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o1_setDefaultMenuColor, "b" },
{ &FWScript::o1_allowPlayerInput, "" },
{ &FWScript::o1_disallowPlayerInput, "" },
- { &FWScript::o1_changeDataDisk, "b" },
+ { &FWScript::o1_changeDataDisk, "b" }, /* Same as opcodes 0x95 and 0xA9. */
/* 6C */
{ 0, 0 },
{ &FWScript::o1_loadMusic, "s" },
@@ -181,9 +181,9 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o1_fadeOutMusic, "" },
/* 70 */
{ &FWScript::o1_stopSample, "" },
- { &FWScript::o1_op71, "bw" },
- { &FWScript::o1_op72, "wbw" },
- { &FWScript::o1_op72, "wbw" },
+ { &FWScript::o1_op71, "bw" }, /* TODO: Name this opcode properly. */
+ { &FWScript::o1_op72, "wbw" }, /* Same as opcode 0x73. TODO: Name this opcode properly. */
+ { &FWScript::o1_op72, "wbw" }, /* Same as opcode 0x72. */
/* 74 */
{ 0, 0 },
{ 0, 0 },
@@ -193,7 +193,7 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o2_playSampleAlt, "bbwbww" },
{ &FWScript::o1_disableSystemMenu, "b" },
{ &FWScript::o1_loadMask5, "b" },
- { &FWScript::o1_unloadMask5, "b" },
+ { &FWScript::o1_unloadMask5, "b" }, /* Last opcode used by Future Wars. */
/* 7C */
{ 0, 0 },
{ 0, 0 },
@@ -201,8 +201,8 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o2_addSeqListElement, "bbbbwww" },
/* 80 */
{ &FWScript::o2_removeSeq, "bb" },
- { &FWScript::o2_op81, "" },
- { &FWScript::o2_op82, "bbw" },
+ { &FWScript::o2_op81, "" }, /* TODO: Name this opcode properly. */
+ { &FWScript::o2_op82, "bbwwb" }, /* TODO: Name this opcode properly. */
{ &FWScript::o2_isSeqRunning, "bb" },
/* 84 */
{ &FWScript::o2_gotoIfSupNearest, "b" },
@@ -216,7 +216,7 @@ const Opcode OSScript::_opcodeTable[] = {
{ &FWScript::o2_startObjectScript, "b" },
/* 8C */
{ &FWScript::o2_stopObjectScript, "b" },
- { &FWScript::o2_op8D, "wwwwwwww" },
+ { &FWScript::o2_op8D, "wwwwwwww" }, /* TODO: Name this opcode properly. */
{ &FWScript::o2_addBackground, "bs" },
{ &FWScript::o2_removeBackground, "b" },
/* 90 */
@@ -226,32 +226,32 @@ const Opcode OSScript::_opcodeTable[] = {
{ 0, 0 },
/* 94 */
{ 0, 0 },
- { &FWScript::o1_changeDataDisk, "b" },
+ { &FWScript::o1_changeDataDisk, "b" }, /* Same as opcodes 0x6B and 0xA9. */
{ 0, 0 },
{ 0, 0 },
/* 98 */
{ 0, 0 },
{ 0, 0 },
- { &FWScript::o2_wasZoneChecked, "" },
- { &FWScript::o2_op9B, "wwwwwwww" },
+ { &FWScript::o2_wasZoneChecked, "b" },
+ { &FWScript::o2_op9B, "wwwwwwww" }, /* TODO: Name this opcode properly. */
/* 9C */
- { &FWScript::o2_op9C, "wwww" },
+ { &FWScript::o2_op9C, "wwww" }, /* TODO: Name this opcode properly. */
{ &FWScript::o2_useBgScroll, "b" },
{ &FWScript::o2_setAdditionalBgVScroll, "c" },
- { &FWScript::o2_op9F, "ww" },
+ { &FWScript::o2_op9F, "ww" }, /* TODO: Name this opcode properly. */
/* A0 */
- { &FWScript::o2_addGfxElementA0, "ww" },
- { &FWScript::o2_removeGfxElementA0, "ww" },
- { &FWScript::o2_opA2, "ww" },
- { &FWScript::o2_opA3, "ww" },
+ { &FWScript::o2_addGfxElementA0, "ww" }, /* TODO: Name this opcode properly. */
+ { &FWScript::o2_removeGfxElementA0, "ww" }, /* TODO: Name this opcode properly. */
+ { &FWScript::o2_opA2, "ww" }, /* TODO: Name this opcode properly. */
+ { &FWScript::o2_opA3, "ww" }, /* TODO: Name this opcode properly. */
/* A4 */
- { &FWScript::o2_loadMask22, "b" },
- { &FWScript::o2_unloadMask22, "b" },
+ { &FWScript::o2_loadMask22, "b" }, /* TODO: Name this opcode properly. */
+ { &FWScript::o2_unloadMask22, "b" }, /* TODO: Name this opcode properly. */
{ 0, 0 },
{ 0, 0 },
/* A8 */
{ 0, 0 },
- { &FWScript::o1_changeDataDisk, "b" }
+ { &FWScript::o1_changeDataDisk, "b" } /* Same as opcodes 0x6B and 0x95. */
};
const unsigned int OSScript::_numOpcodes = ARRAYSIZE(OSScript::_opcodeTable);
@@ -365,6 +365,14 @@ FWScript *OSScriptInfo::create(const RawObjectScript &script, int16 index, const
// OPERATION STEALTH opcodes
// ------------------------------------------------------------------------
+int FWScript::o2_loadCt() {
+ const char *param = getNextString();
+
+ debugC(5, kCineDebugScript, "Line: %d: loadCt(\"%s\")", _line, param);
+ loadCtOS(param);
+ return 0;
+}
+
int FWScript::o2_loadPart() {
const char *param = getNextString();
@@ -447,7 +455,9 @@ int FWScript::o2_op82() {
byte a = getNextByte();
byte b = getNextByte();
uint16 c = getNextWord();
- warning("STUB: o2_op82(%x, %x, %x)", a, b, c);
+ uint16 d = getNextWord();
+ byte e = getNextByte();
+ warning("STUB: o2_op82(%x, %x, %x, %x, %x)", a, b, c, d, e);
return 0;
}
@@ -615,20 +625,7 @@ int FWScript::o2_removeBackground() {
debugC(5, kCineDebugScript, "Line: %d: removeBackground(%d)", _line, param);
- if (additionalBgTable[param]) {
- free(additionalBgTable[param]);
- additionalBgTable[param] = NULL;
- }
-
- if (currentAdditionalBgIdx == param) {
- currentAdditionalBgIdx = 0;
- }
-
- if (currentAdditionalBgIdx2 == param) {
- currentAdditionalBgIdx2 = 0;
- }
-
- strcpy(currentBgName[param], "");
+ renderer->removeBg(param);
return 0;
}
@@ -644,29 +641,20 @@ int FWScript::o2_loadAbs() {
int FWScript::o2_loadBg() {
byte param = getNextByte();
- assert(param <= 8);
+ assert(param < 9);
debugC(5, kCineDebugScript, "Line: %d: useBg(%d)", _line, param);
- if (additionalBgTable[param]) {
- currentAdditionalBgIdx = param;
- if (param == 8) {
- newColorMode = 3;
- } else {
- newColorMode = bgColorMode + 1;
- }
- //if (_screenNeedFadeOut == 0) {
- // adBgVar1 = 1;
- //}
- fadeRequired = true;
- }
+ renderer->selectBg(param);
return 0;
}
-/*! \todo Implement this instruction
+/*! \todo Check the current implementation for correctness
*/
int FWScript::o2_wasZoneChecked() {
- warning("STUB: o2_wasZoneChecked()");
+ byte param = getNextByte();
+ _compare = (param < 16 && zoneData[param]);
+ debugC(5, kCineDebugScript, "Line: %d: o2_wasZoneChecked(%d)", _line, param);
return 0;
}
@@ -699,13 +687,11 @@ int FWScript::o2_op9C() {
int FWScript::o2_useBgScroll() {
byte param = getNextByte();
- assert(param <= 8);
+ assert(param < 9);
debugC(5, kCineDebugScript, "Line: %d: useBgScroll(%d)", _line, param);
- if (additionalBgTable[param]) {
- currentAdditionalBgIdx2 = param;
- }
+ renderer->selectScrollBg(param);
return 0;
}
@@ -716,12 +702,12 @@ int FWScript::o2_setAdditionalBgVScroll() {
byte param2 = getNextByte();
debugC(5, kCineDebugScript, "Line: %d: additionalBgVScroll = var[%d]", _line, param2);
- additionalBgVScroll = _localVars[param2];
+ renderer->setScroll(_localVars[param2]);
} else {
uint16 param2 = getNextWord();
debugC(5, kCineDebugScript, "Line: %d: additionalBgVScroll = %d", _line, param2);
- additionalBgVScroll = param2;
+ renderer->setScroll(param2);
}
return 0;
}
diff --git a/engines/cine/texte.cpp b/engines/cine/texte.cpp
index e41626cad1..91a209074d 100644
--- a/engines/cine/texte.cpp
+++ b/engines/cine/texte.cpp
@@ -611,65 +611,49 @@ void freePoldatDat() {
fontParamTable = 0;
}
-uint16 computeMessageLength(const byte *ptr, uint16 width, uint16 *numWords, uint16 *messageWidth, uint16 *lineResult) {
- const byte *localPtr = ptr;
-
- uint16 var_2 = 0;
- uint16 localLineResult = 0;
- uint16 var_6 = 0;
- uint16 var_8 = 0;
- uint16 localMessageWidth = 0;
- uint16 var_16 = 0;
- uint16 finished = 0;
- uint16 si = 0;
- uint16 di = 0;
-
- while (!finished) {
- byte character = *(localPtr++);
-
- if (character == ' ') {
- var_8 = var_16;
- var_6 = localMessageWidth;
- localLineResult = si;
- var_2 = di;
-
- if (si + 5 < width) {
- var_16++;
- si += 5;
- } else {
- finished = 1;
- }
- } else if (character == 0x7C || character == 0) {
- finished = 1;
- si = 0;
+/*! \brief Fit a substring of text into one line of fixed width text box
+ * \param str Text to fit
+ * \param maxWidth Text box width
+ * \param[out] words Number of words that fit
+ * \param[out] width Total width of nonblank characters that fit
+ * \return Length of substring which fits
+ */
+int fitLine(const char *str, int maxWidth, int &words, int &width) {
+ int i, bkpWords = 0, bkpWidth = 0, bkpLen = 0;
+ int charWidth = 0, fullWidth = 0;
+
+ words = 0;
+ width = 0;
+
+ for (i = 0; str[i]; i++) {
+ if (str[i] == 0x7C) {
+ i++;
+ break;
+ } else if (str[i] == ' ') {
+ charWidth = 5;
+ bkpWords = words++;
+ bkpWidth = width;
+ bkpLen = i + 1;
} else {
- if (fontParamTable[character].characterWidth) {
- uint16 var_C = fontParamTable[character].characterWidth + 1;
-
- if (si + var_C < width) {
- si += var_C;
- localMessageWidth += var_C;
- } else {
- finished = 1;
-
- if (localLineResult) {
- var_16 = var_8;
- localMessageWidth = var_6;
- si = localLineResult;
- di = var_2;
- }
- }
- }
+ charWidth = fontParamTable[str[i]].characterWidth + 1;
+ width += charWidth;
}
- di++;
- }
+ if (!charWidth) {
+ continue;
+ }
- *numWords = var_16;
- *messageWidth = localMessageWidth;
- *lineResult = si;
+ if (fullWidth + charWidth < maxWidth) {
+ fullWidth += charWidth;
+ } else if (fullWidth) {
+ words = bkpWords;
+ width = bkpWidth;
+ i = bkpLen;
+ break;
+ }
+ }
- return di;
+ return i;
}
} // End of namespace Cine
diff --git a/engines/cine/texte.h b/engines/cine/texte.h
index b5eaef9211..ae82832aea 100644
--- a/engines/cine/texte.h
+++ b/engines/cine/texte.h
@@ -56,7 +56,7 @@ void freeErrmessDat(void);
void loadPoldatDat(const char *fname);
void freePoldatDat(void);
-uint16 computeMessageLength(const byte *ptr, uint16 width, uint16 *numWords, uint16 *messageWidth, uint16 *lineResult);
+int fitLine(const char *ptr, int maxWidth, int &words, int &width);
} // End of namespace Cine
diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp
index a6bd9964c0..9b98ddb253 100644
--- a/engines/cine/various.cpp
+++ b/engines/cine/various.cpp
@@ -87,7 +87,6 @@ char newPrcName[20];
char newRelName[20];
char newObjectName[20];
char newMsgName[20];
-char currentBgName[8][15];
char currentCtName[15];
char currentPartName[15];
char currentDatName[30];
@@ -96,8 +95,6 @@ int16 saveVar2;
byte isInPause = 0;
-uint16 defaultMenuBoxColor;
-
byte inputVar1 = 0;
uint16 inputVar2 = 0, inputVar3 = 0;
@@ -114,7 +111,6 @@ CommandeType objectListCommand[20];
int16 objListTab[20];
uint16 exitEngine;
-uint16 defaultMenuBoxColor2;
uint16 zoneData[NUM_MAX_ZONE];
@@ -140,6 +136,7 @@ void addPlayerCommandMessage(int16 cmd) {
tmp.type = 3;
overlayList.push_back(tmp);
+ waitForPlayerClick = 1;
}
int16 getRelEntryForObject(uint16 param1, uint16 param2, SelectedObjStruct *pSelectedObject) {
@@ -393,11 +390,14 @@ bool brokenSave(Common::InSaveFile &fHandle) {
return broken;
}
+/*! \todo Implement Operation Stealth loading, this is obviously Future Wars only
+ */
bool CineEngine::makeLoad(char *saveName) {
int16 i;
int16 size;
bool broken;
Common::InSaveFile *fHandle;
+ char bgName[13];
fHandle = g_saveFileMan->openForLoading(saveName);
@@ -440,7 +440,6 @@ bool CineEngine::makeLoad(char *saveName) {
strcpy(newRelName, "");
strcpy(newObjectName, "");
strcpy(newMsgName, "");
- strcpy(currentBgName[0], "");
strcpy(currentCtName, "");
allowPlayerInput = 0;
@@ -455,9 +454,7 @@ bool CineEngine::makeLoad(char *saveName) {
fadeRequired = false;
- for (i = 0; i < 16; i++) {
- c_palette[i] = 0;
- }
+ renderer->clear();
checkForPendingDataLoadSwitch = 0;
@@ -473,7 +470,7 @@ bool CineEngine::makeLoad(char *saveName) {
fHandle->read(currentPrcName, 13);
fHandle->read(currentRelName, 13);
fHandle->read(currentMsgName, 13);
- fHandle->read(currentBgName[0], 13);
+ fHandle->read(bgName, 13);
fHandle->read(currentCtName, 13);
checkDataDisk(currentDisk);
@@ -490,12 +487,12 @@ bool CineEngine::makeLoad(char *saveName) {
loadRel(currentRelName);
}
- if (strlen(currentBgName[0])) {
- loadBg(currentBgName[0]);
+ if (strlen(bgName)) {
+ loadBg(bgName);
}
if (strlen(currentCtName)) {
- loadCt(currentCtName);
+ loadCtFW(currentCtName);
}
fHandle->readUint16BE();
@@ -511,13 +508,7 @@ bool CineEngine::makeLoad(char *saveName) {
objectTable[i].part = fHandle->readUint16BE();
}
- for (i = 0; i < 16; i++) {
- c_palette[i] = fHandle->readUint16BE();
- }
-
- for (i = 0; i < 16; i++) {
- tempPalette[i] = fHandle->readUint16BE();
- }
+ renderer->restorePalette(*fHandle);
globalVars.load(*fHandle, NUM_MAX_VAR - 1);
@@ -530,8 +521,10 @@ bool CineEngine::makeLoad(char *saveName) {
}
fHandle->read(commandBuffer, 0x50);
+ renderer->setCommand(commandBuffer);
+
+ renderer->_cmdY = fHandle->readUint16BE();
- defaultMenuBoxColor = fHandle->readUint16BE();
bgVar0 = fHandle->readUint16BE();
allowPlayerInput = fHandle->readUint16BE();
playerCommand = fHandle->readSint16BE();
@@ -542,7 +535,8 @@ bool CineEngine::makeLoad(char *saveName) {
var3 = fHandle->readUint16BE();
var2 = fHandle->readUint16BE();
commandVar2 = fHandle->readSint16BE();
- defaultMenuBoxColor2 = fHandle->readUint16BE();
+
+ renderer->_messageBg = fHandle->readUint16BE();
fHandle->readUint16BE();
fHandle->readUint16BE();
@@ -615,7 +609,7 @@ void makeSave(char *saveFileName) {
fHandle->write(currentPrcName, 13);
fHandle->write(currentRelName, 13);
fHandle->write(currentMsgName, 13);
- fHandle->write(currentBgName[0], 13);
+ renderer->saveBg(*fHandle);
fHandle->write(currentCtName, 13);
fHandle->writeUint16BE(0xFF);
@@ -631,13 +625,7 @@ void makeSave(char *saveFileName) {
fHandle->writeUint16BE(objectTable[i].part);
}
- for (i = 0; i < 16; i++) {
- fHandle->writeUint16BE(c_palette[i]);
- }
-
- for (i = 0; i < 16; i++) {
- fHandle->writeUint16BE(tempPalette[i]);
- }
+ renderer->savePalette(*fHandle);
globalVars.save(*fHandle, NUM_MAX_VAR - 1);
@@ -651,7 +639,8 @@ void makeSave(char *saveFileName) {
fHandle->write(commandBuffer, 0x50);
- fHandle->writeUint16BE(defaultMenuBoxColor);
+ fHandle->writeUint16BE(renderer->_cmdY);
+
fHandle->writeUint16BE(bgVar0);
fHandle->writeUint16BE(allowPlayerInput);
fHandle->writeUint16BE(playerCommand);
@@ -662,7 +651,8 @@ void makeSave(char *saveFileName) {
fHandle->writeUint16BE(var3);
fHandle->writeUint16BE(var2);
fHandle->writeUint16BE(commandVar2);
- fHandle->writeUint16BE(defaultMenuBoxColor2);
+
+ fHandle->writeUint16BE(renderer->_messageBg);
fHandle->writeUint16BE(0xFF);
fHandle->writeUint16BE(0x1E);
@@ -864,26 +854,6 @@ void CineEngine::makeSystemMenu(void) {
}
}
-int drawChar(byte character, int16 x, int16 y) {
- if (character == ' ') {
- x += 5;
- } else {
- byte characterWidth = fontParamTable[character].characterWidth;
-
- if (characterWidth) {
- byte characterIdx = fontParamTable[character].characterIdx;
- if (g_cine->getGameType() == Cine::GType_OS) {
- drawSpriteRaw2(textTable[characterIdx][0], 0, 2, 8, page1Raw, x, y);
- } else {
- drawSpriteRaw(textTable[characterIdx][0], textTable[characterIdx][1], 2, 8, page1Raw, x, y);
- }
- x += characterWidth + 1;
- }
- }
-
- return x;
-}
-
void drawMessageBox(int16 x, int16 y, int16 width, int16 currentY, int16 offset, int16 color, byte* page) {
gfxDrawLine(x + offset, y + offset, x + width - offset, y + offset, color, page); // top
gfxDrawLine(x + offset, currentY + 4 - offset, x + width - offset, currentY + 4 - offset, color, page); // bottom
@@ -896,49 +866,6 @@ void drawDoubleMessageBox(int16 x, int16 y, int16 width, int16 currentY, int16 c
drawMessageBox(x, y, width, currentY, 0, color, page);
}
-void makeTextEntry(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y, uint16 width) {
- byte color = 2;
- byte color2 = defaultMenuBoxColor2;
- int16 paramY = (height * 9) + 10;
- int16 currentX, currentY;
- int16 i;
- uint16 j;
- byte currentChar;
-
- if (X + width > 319) {
- X = 319 - width;
- }
-
- if (Y + paramY > 199) {
- Y = 199 - paramY;
- }
-
- hideMouse();
- blitRawScreen(page1Raw);
-
- gfxDrawPlainBoxRaw(X, Y, X + width, Y + 4, color2, page1Raw);
-
- currentX = X + 4;
- currentY = Y + 4;
-
- for (i = 0; i < height; i++) {
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 9, color2, page1Raw);
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[i]); j++) {
- currentChar = commandList[i][j];
- currentX = drawChar(currentChar, currentX, currentY);
- }
-
- currentY += 9;
- }
-
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 4, color2, page1Raw); // bottom part
- drawDoubleMessageBox(X, Y, width, currentY, color, page1Raw);
-
- blitRawScreen(page1Raw);
-}
-
void processInventory(int16 x, int16 y) {
int16 listSize = buildObjectListCommand(-2);
uint16 button;
@@ -946,7 +873,8 @@ void processInventory(int16 x, int16 y) {
if (!listSize)
return;
- makeTextEntry(objectListCommand, listSize, x, y, 140);
+ renderer->drawMenu(objectListCommand, listSize, x, y, 140, -1);
+ renderer->blit();
do {
manageEvents();
@@ -1085,7 +1013,7 @@ void makeCommandLine(void) {
}
if (!disableSystemMenu) {
- isDrawCommandEnabled = 1;
+ renderer->setCommand(commandBuffer);
}
}
@@ -1094,13 +1022,8 @@ uint16 needMouseSave = 0;
uint16 menuVar4 = 0;
uint16 menuVar5 = 0;
-int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y,
- uint16 width, bool recheckValue) {
- byte color = 2;
- byte color2 = defaultMenuBoxColor2;
+int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y, uint16 width, bool recheckValue) {
int16 paramY;
- int16 currentX, currentY;
- int16 i;
uint16 button;
int16 var_A;
int16 di;
@@ -1110,7 +1033,6 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
int16 var_14;
int16 currentSelection, oldSelection;
int16 var_4;
- byte currentChar;
if (disableSystemMenu)
return -1;
@@ -1125,30 +1047,8 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
Y = 199 - paramY;
}
- hideMouse();
- blitRawScreen(page1Raw);
-
- gfxDrawPlainBoxRaw(X, Y, X + width, Y + 4, color2, page1Raw);
-
- currentX = X + 4;
- currentY = Y + 4;
-
- for (i = 0; i < height; i++) {
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 9, color2, page1Raw);
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[i]); j++) {
- currentChar = commandList[i][j];
- currentX = drawChar(currentChar, currentX, currentY);
- }
-
- currentY += 9;
- }
-
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 4, color2, page1Raw); // bottom part
- drawDoubleMessageBox(X, Y, width, currentY, color, page1Raw);
-
- blitRawScreen(page1Raw);
+ renderer->drawMenu(commandList, height, X, Y, width, -1);
+ renderer->blit();
do {
manageEvents();
@@ -1160,15 +1060,9 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
currentSelection = 0;
di = currentSelection * 9 + Y + 4;
- gfxDrawPlainBoxRaw(X + 2, di - 1, X + width - 2, di + 7, 0, page1Raw); // draw black box behind selection
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[currentSelection]); j++) {
- currentChar = commandList[currentSelection][j];
- currentX = drawChar(currentChar, currentX, di);
- }
- blitRawScreen(page1Raw);
+ renderer->drawMenu(commandList, height, X, Y, width, currentSelection);
+ renderer->blit();
manageEvents();
getMouseData(mouseUpdateStatus, &button, (uint16 *)&mouseX, (uint16 *)&mouseY);
@@ -1219,29 +1113,10 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
hideMouse();
}
- di = oldSelection * 9 + Y + 4;
-
- gfxDrawPlainBoxRaw(X + 2, di - 1, X + width - 2, di + 7, color2, page1Raw); // restore color
-
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[oldSelection]); j++) {
- currentChar = commandList[oldSelection][j];
- currentX = drawChar(currentChar, currentX, di);
- }
-
di = currentSelection * 9 + Y + 4;
- gfxDrawPlainBoxRaw(X + 2, di - 1, X + width - 2, di + 7, 0, page1Raw); // black new
-
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[currentSelection]); j++) {
- currentChar = commandList[currentSelection][j];
- currentX = drawChar(currentChar, currentX, di);
- }
-
- blitRawScreen(page1Raw);
+ renderer->drawMenu(commandList, height, X, Y, width, currentSelection);
+ renderer->blit();
// if (needMouseSave) {
// gfxRedrawMouseCursor();
@@ -1271,38 +1146,6 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
return currentSelection;
}
-void drawMenuBox(char *command, int16 x, int16 y) {
- byte j;
- byte lColor = 2;
-
- hideMouse();
-
- gfxDrawPlainBoxRaw(x, y, x + 300, y + 10, 0, page2Raw);
-
- drawMessageBox(x, y, 300, y + 6, -1, lColor, page2Raw);
-
- x += 2;
- y += 2;
-
- for (j = 0; j < strlen(command); j++) {
- byte currentChar = command[j];
-
- if (currentChar == ' ') {
- x += 5;
- } else {
- byte characterWidth = fontParamTable[currentChar].characterWidth;
-
- if (characterWidth) {
- byte characterIdx = fontParamTable[currentChar].characterIdx;
- drawSpriteRaw(textTable[characterIdx][0], textTable[characterIdx][1], 2, 8, page2Raw, x, y);
- x += characterWidth + 1;
- }
- }
- }
-
-// gfxRedrawMouseCursor();
-}
-
void makeActionMenu(void) {
uint16 mouseButton;
uint16 mouseX;
@@ -1342,11 +1185,6 @@ uint16 executePlayerInput(void) {
}
if (allowPlayerInput) {
- if (isDrawCommandEnabled) {
- drawMenuBox(commandBuffer, 10, defaultMenuBoxColor);
- isDrawCommandEnabled = 0;
- }
-
getMouseData(mouseUpdateStatus, &mouseButton, &mouseX, &mouseY);
while (mouseButton && currentEntry < 200) {
@@ -1393,7 +1231,6 @@ uint16 executePlayerInput(void) {
if (choiceResultTable[playerCommand] == commandVar1) {
int16 relEntry;
- drawMenuBox(commandBuffer, 10, defaultMenuBoxColor);
SelectedObjStruct obj;
obj.idx = commandVar3[0];
obj.param = commandVar3[1];
@@ -1410,41 +1247,40 @@ uint16 executePlayerInput(void) {
commandVar1 = 0;
strcpy(commandBuffer, "");
+ renderer->setCommand("");
}
} else {
globalVars[VAR_MOUSE_X_POS] = mouseX;
globalVars[VAR_MOUSE_Y_POS] = mouseY;
}
}
- } else {
- if (mouseButton & 2) {
- if (mouseButton & 1) {
- g_cine->makeSystemMenu();
- }
+ } else if (mouseButton & 2) {
+ if (mouseButton & 1) {
+ g_cine->makeSystemMenu();
+ }
- makeActionMenu();
- makeCommandLine();
- } else {
- int16 objIdx;
+ makeActionMenu();
+ makeCommandLine();
+ } else {
+ int16 objIdx;
- objIdx = getObjectUnderCursor(mouseX, mouseY);
+ objIdx = getObjectUnderCursor(mouseX, mouseY);
- if (commandVar2 != objIdx) {
- if (objIdx != -1) {
- char command[256];
+ if (commandVar2 != objIdx) {
+ if (objIdx != -1) {
+ char command[256];
- strcpy(command, commandBuffer);
- strcat(command, " ");
- strcat(command, objectTable[objIdx].name);
+ strcpy(command, commandBuffer);
+ strcat(command, " ");
+ strcat(command, objectTable[objIdx].name);
- drawMenuBox(command, 10, defaultMenuBoxColor);
- } else {
- isDrawCommandEnabled = 1;
- }
+ renderer->setCommand(command);
+ } else {
+ isDrawCommandEnabled = 1;
}
-
- commandVar2 = objIdx;
}
+
+ commandVar2 = objIdx;
}
} else {
if (mouseButton & 2) {
@@ -1653,257 +1489,9 @@ void drawSprite(Common::List<overlay>::iterator it, const byte *spritePtr, const
free(msk);
}
-int16 additionalBgVScroll = 0;
-
-void backupOverlayPage(void) {
- byte *scrollBg;
- byte *bgPage = additionalBgTable[currentAdditionalBgIdx];
-
- if (bgPage) {
- if (!additionalBgVScroll) {
- memcpy(page1Raw, bgPage, 320 * 200);
- } else {
- scrollBg = additionalBgTable[currentAdditionalBgIdx2];
-
- for (int16 i = additionalBgVScroll; i < 200 + additionalBgVScroll; i++) {
- if (i > 200) {
- memcpy(page1Raw + (i - additionalBgVScroll) * 320, scrollBg + (i - 200) * 320, 320);
- } else {
- memcpy(page1Raw + (i - additionalBgVScroll) * 320, bgPage + (i-1) * 320, 320);
- }
- }
- }
- }
-}
-
-void drawMessage(const char *messagePtr, int16 x, int16 y, int16 width, int16 color) {
- byte color2 = 2;
- byte endOfMessageReached = 0;
- int16 localX, localY, localWidth;
- uint16 messageLength = 0, numWords = 0, messageWidth = 0;
- uint16 lineResult, fullLineWidth;
- uint16 interWordSize, interWordSizeRemain;
- const char *endOfMessagePtr;
- byte currentChar; //, characterWidth;
-
- gfxDrawPlainBoxRaw(x, y, x + width, y + 4, color, page1Raw);
-
- localX = x + 4;
- localY = y + 4;
- localWidth = width - 8;
-
- do {
- messageLength = 0;
-
- while (messagePtr[messageLength] == ' ') {
- messageLength++;
- }
-
- messagePtr += messageLength;
-
- messageLength = computeMessageLength((const byte *)messagePtr, localWidth, &numWords, &messageWidth, &lineResult);
-
- endOfMessagePtr = messagePtr + messageLength;
-
- if (lineResult) {
- fullLineWidth = localWidth - messageWidth;
-
- if (numWords) {
- interWordSize = fullLineWidth / numWords;
- interWordSizeRemain = fullLineWidth % numWords;
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
-
- gfxDrawPlainBoxRaw(x, localY, x + width, localY + 9, color, page1Raw);
-
- do {
- currentChar = *(messagePtr++);
-
- if (currentChar == 0) {
- endOfMessageReached = 1;
- } else if (currentChar == ' ') {
- localX += interWordSizeRemain + interWordSize;
-
- if (interWordSizeRemain)
- interWordSizeRemain = 0;
- } else {
- localX = drawChar(currentChar, localX, localY);
- }
- } while ((messagePtr < endOfMessagePtr) && !endOfMessageReached);
-
- localX = x + 4;
- localY += 9;
- } while (!endOfMessageReached);
-
- gfxDrawPlainBoxRaw(x, localY, x + width, localY + 4, color, page1Raw);
-
- drawDoubleMessageBox(x, y, width, localY, color2, page1Raw);
-}
-
-void drawDialogueMessage(byte msgIdx, int16 x, int16 y, int16 width, int16 color) {
- if (msgIdx >= messageTable.size()) {
-// removeOverlay(msgIdx, 2);
- return;
- }
-
- _messageLen += messageTable[msgIdx].size();
- drawMessage(messageTable[msgIdx].c_str(), x, y, width, color);
-
- // this invalidates the iterator in drawOverlays()
-// removeOverlay(msgIdx, 2);
-}
-
-void drawFailureMessage(byte cmd) {
- byte msgIdx = cmd * 4 + g_cine->_rnd.getRandomNumber(3);
-
- const char *messagePtr = failureMessages[msgIdx];
- int len = strlen(messagePtr);
-
- _messageLen += len;
-
- int16 width = 6 * len + 20;
-
- if (width > 300)
- width = 300;
-
- int16 x = (320 - width) / 2;
- int16 y = 80;
- int16 color = 4;
-
- drawMessage(messagePtr, x, y, width, color);
-
- // this invalidates the iterator in drawOverlays()
-// removeOverlay(cmd, 3);
-}
-
-void drawOverlays(void) {
- uint16 width, height;
- AnimData *pPart;
- int16 x, y;
- objectStruct *objPtr;
- byte messageIdx;
+void removeMessages() {
Common::List<overlay>::iterator it;
- backupOverlayPage();
-
- _messageLen = 0;
-
- for (it = overlayList.begin(); it != overlayList.end(); ++it) {
- switch (it->type) {
- case 0: // sprite
- assert(it->objIdx < NUM_MAX_OBJECT);
-
- objPtr = &objectTable[it->objIdx];
- x = objPtr->x;
- y = objPtr->y;
-
- if (objPtr->frame < 0) {
- continue;
- }
-
- pPart = &animDataTable[objPtr->frame];
- width = pPart->_realWidth;
- height = pPart->_height;
-
- if (!pPart->data()) {
- continue;
- }
-
- // drawSprite ignores masks of Operation Stealth sprites
- drawSprite(it, pPart->data(), pPart->mask(), width, height, page1Raw, x, y);
- break;
-
- case 2: // text
- // gfxWaitVSync();
- // hideMouse();
-
- messageIdx = it->objIdx;
- x = it->x;
- y = it->y;
- width = it->width;
- height = it->color;
-
- blitRawScreen(page1Raw);
-
- drawDialogueMessage(messageIdx, x, y, width, height);
-
- // blitScreen(page0, NULL);
- // gfxRedrawMouseCursor();
-
- waitForPlayerClick = 1;
-
- break;
-
- case 3:
- // gfxWaitSync()
- // hideMouse();
-
- blitRawScreen(page1Raw);
-
- drawFailureMessage(it->objIdx);
-
- // blitScreen(page0, NULL);
- // gfxRedrawMouseCursor();
-
- waitForPlayerClick = 1;
-
- break;
-
- case 4:
- assert(it->objIdx < NUM_MAX_OBJECT);
-
- objPtr = &objectTable[it->objIdx];
- x = objPtr->x;
- y = objPtr->y;
-
- if (objPtr->frame < 0) {
- continue;
- }
-
- assert(objPtr->frame < NUM_MAX_ANIMDATA);
-
- pPart = &animDataTable[objPtr->frame];
-
- width = pPart->_realWidth;
- height = pPart->_height;
-
- if (!pPart->data()) {
- continue;
- }
-
- gfxFillSprite(pPart->data(), width, height, page1Raw, x, y);
- break;
-
- case 20:
- assert(it->objIdx < NUM_MAX_OBJECT);
-
- objPtr = &objectTable[it->objIdx];
- x = objPtr->x;
- y = objPtr->y;
- var5 = it->x;
-
- if (objPtr->frame < 0 || var5 > 8 || !additionalBgTable[var5] || animDataTable[objPtr->frame]._bpp != 1) {
- continue;
- }
-
- width = animDataTable[objPtr->frame]._realWidth;
- height = animDataTable[objPtr->frame]._height;
-
- if (!animDataTable[objPtr->frame].data()) {
- continue;
- }
-
- maskBgOverlay(additionalBgTable[var5], animDataTable[objPtr->frame].data(), width, height, page1Raw, x, y);
- break;
- }
- }
-
for (it = overlayList.begin(); it != overlayList.end(); ) {
if (it->type == 2 || it->type == 3) {
it = overlayList.erase(it);
@@ -1978,115 +1566,96 @@ void addMessage(byte param1, int16 param2, int16 param3, int16 param4, int16 par
tmp.color = param5;
overlayList.push_back(tmp);
+ waitForPlayerClick = 1;
}
-SeqListElement seqList;
+Common::List<SeqListElement> seqList;
void removeSeq(uint16 param1, uint16 param2, uint16 param3) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
+ Common::List<SeqListElement>::iterator it;
- while (currentHead && (currentHead->var6 != param1 || currentHead->var4 != param2 || currentHead->varE != param3)) {
- tempHead = currentHead;
- currentHead = tempHead->next;
- }
-
- if (currentHead && currentHead->var6 == param1 && currentHead->var4 == param2 && currentHead->varE == param3) {
- currentHead->var4 = -1;
+ for (it = seqList.begin(); it != seqList.end(); ++it) {
+ if (it->objIdx == param1 && it->var4 == param2 && it->varE == param3) {
+ it->var4 = -1;
+ break;
+ }
}
}
uint16 isSeqRunning(uint16 param1, uint16 param2, uint16 param3) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
-
- while (currentHead && (currentHead->var6 != param1 || currentHead->var4 != param2 || currentHead->varE != param3)) {
- tempHead = currentHead;
- currentHead = tempHead->next;
- }
+ Common::List<SeqListElement>::iterator it;
- if (currentHead && currentHead->var6 == param1 && currentHead->var4 == param2 && currentHead->varE == param3) {
- return 1;
+ for (it = seqList.begin(); it != seqList.end(); ++it) {
+ if (it->objIdx == param1 && it->var4 == param2 && it->varE == param3) {
+ return 1;
+ }
}
return 0;
}
-void addSeqListElement(int16 param0, int16 param1, int16 param2, int16 param3, int16 param4, int16 param5, int16 param6, int16 param7, int16 param8) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
- SeqListElement *newElement;
-
- currentHead = tempHead->next;
-
- while (currentHead && currentHead->varE < param7) {
- tempHead = currentHead;
- currentHead = tempHead->next;
- }
-
- newElement = new SeqListElement;
-
- newElement->next = tempHead->next;
- tempHead->next = newElement;
-
- newElement->var6 = param0;
- newElement->var4 = param1;
- newElement->var8 = param2;
- newElement->varA = param3;
- newElement->varC = param4;
- newElement->var14 = 0;
- newElement->var16 = 0;
- newElement->var18 = param5;
- newElement->var1A = param6;
- newElement->varE = param7;
- newElement->var10 = param8;
- newElement->var12 = param8;
- newElement->var1C = 0;
- newElement->var1E = 0;
-}
-
-void resetSeqList() {
- seqList.next = NULL;
+void addSeqListElement(uint16 objIdx, int16 param1, int16 param2, int16 frame, int16 param4, int16 param5, int16 param6, int16 param7, int16 param8) {
+ Common::List<SeqListElement>::iterator it;
+ SeqListElement tmp;
+
+ for (it = seqList.begin(); it != seqList.end() && it->varE < param7; ++it) ;
+
+ tmp.objIdx = objIdx;
+ tmp.var4 = param1;
+ tmp.var8 = param2;
+ tmp.frame = frame;
+ tmp.varC = param4;
+ tmp.var14 = 0;
+ tmp.var16 = 0;
+ tmp.var18 = param5;
+ tmp.var1A = param6;
+ tmp.varE = param7;
+ tmp.var10 = param8;
+ tmp.var12 = param8;
+ tmp.var1C = 0;
+ tmp.var1E = 0;
+
+ seqList.insert(it, tmp);
}
-void computeMove1(SeqListElement *element, int16 x, int16 y, int16 param1,
+void computeMove1(SeqListElement &element, int16 x, int16 y, int16 param1,
int16 param2, int16 x2, int16 y2) {
- element->var16 = 0;
- element->var14 = 0;
+ element.var16 = 0;
+ element.var14 = 0;
if (y2) {
if (y - param2 > y2) {
- element->var16 = 2;
+ element.var16 = 2;
}
if (y + param2 < y2) {
- element->var16 = 1;
+ element.var16 = 1;
}
}
if (x2) {
if (x - param1 > x2) {
- element->var14 = 2;
+ element.var14 = 2;
}
if (x + param1 < x2) {
- element->var14 = 1;
+ element.var14 = 1;
}
}
}
-uint16 computeMove2(SeqListElement *element) {
+uint16 computeMove2(SeqListElement &element) {
int16 returnVar = 0;
- if (element->var16 == 1) {
+ if (element.var16 == 1) {
returnVar = 4;
- } else if (element->var16 == 2) {
+ } else if (element.var16 == 2) {
returnVar = 3;
}
- if (element->var14 == 1) {
+ if (element.var14 == 1) {
returnVar = 1;
- } else if (element->var14 == 2) {
+ } else if (element.var14 == 2) {
returnVar = 2;
}
@@ -2165,14 +1734,13 @@ void resetGfxEntityEntry(uint16 objIdx) {
#endif
}
-uint16 addAni(uint16 param1, uint16 param2, const byte *ptr, SeqListElement *element, uint16 param3, int16 *param4) {
+uint16 addAni(uint16 param1, uint16 objIdx, const byte *ptr, SeqListElement &element, uint16 param3, int16 *param4) {
const byte *currentPtr = ptr;
const byte *ptrData;
const byte *ptr2;
int16 di;
assert(ptr);
- assert(element);
assert(param4);
dummyU16 = READ_BE_UINT16((currentPtr + param1 * 2) + 8);
@@ -2181,25 +1749,25 @@ uint16 addAni(uint16 param1, uint16 param2, const byte *ptr, SeqListElement *ele
assert(*ptrData);
- di = (objectTable[param2].costume + 1) % (*ptrData);
+ di = (objectTable[objIdx].costume + 1) % (*ptrData);
ptr2 = (ptrData + (di * 8)) + 1;
- if ((checkCollision(param2, ptr2[0], ptr2[1], ptr2[2], ptr[0]) & 1)) {
+ if ((checkCollision(objIdx, ptr2[0], ptr2[1], ptr2[2], ptr[0]) & 1)) {
return 0;
}
- objectTable[param2].x += (int8)ptr2[4];
- objectTable[param2].y += (int8)ptr2[5];
- objectTable[param2].mask += (int8)ptr2[6];
+ objectTable[objIdx].x += (int8)ptr2[4];
+ objectTable[objIdx].y += (int8)ptr2[5];
+ objectTable[objIdx].mask += (int8)ptr2[6];
- if (objectTable[param2].frame) {
- resetGfxEntityEntry(param2);
+ if (objectTable[objIdx].frame) {
+ resetGfxEntityEntry(objIdx);
}
- objectTable[param2].frame = ptr2[7] + element->var8;
+ objectTable[objIdx].frame = ptr2[7] + element.var8;
- if (param3 || !element->var14) {
- objectTable[param2].costume = di;
+ if (param3 || !element.var14) {
+ objectTable[objIdx].costume = di;
} else {
*param4 = di;
}
@@ -2207,86 +1775,86 @@ uint16 addAni(uint16 param1, uint16 param2, const byte *ptr, SeqListElement *ele
return 1;
}
-void processSeqListElement(SeqListElement *element) {
- int16 x = objectTable[element->var6].x;
- int16 y = objectTable[element->var6].y;
- const byte *ptr1 = animDataTable[element->varA].data();
+void processSeqListElement(SeqListElement &element) {
+ int16 x = objectTable[element.objIdx].x;
+ int16 y = objectTable[element.objIdx].y;
+ const byte *ptr1 = animDataTable[element.frame].data();
int16 var_10;
int16 var_4;
int16 var_2;
- if (element->var12 < element->var10) {
- element->var12++;
+ if (element.var12 < element.var10) {
+ element.var12++;
return;
}
- element->var12 = 0;
+ element.var12 = 0;
if (ptr1) {
uint16 param1 = ptr1[1];
uint16 param2 = ptr1[2];
- if (element->varC != 255) {
+ if (element.varC != 255) {
// FIXME: Why is this here? Fingolfin gets lots of these
// in his copy of Operation Stealth (value 0 or 236) under
// Mac OS X. Maybe it's a endian issue? At least the graphics
// in the copy protection screen are partially messed up.
- warning("processSeqListElement: varC = %d", element->varC);
+ warning("processSeqListElement: varC = %d", element.varC);
}
if (globalVars[VAR_MOUSE_X_POS] || globalVars[VAR_MOUSE_Y_POS]) {
computeMove1(element, ptr1[4] + x, ptr1[5] + y, param1, param2, globalVars[VAR_MOUSE_X_POS], globalVars[VAR_MOUSE_Y_POS]);
} else {
- element->var16 = 0;
- element->var14 = 0;
+ element.var16 = 0;
+ element.var14 = 0;
}
var_10 = computeMove2(element);
if (var_10) {
- element->var1C = var_10;
- element->var1E = var_10;
+ element.var1C = var_10;
+ element.var1E = var_10;
}
var_4 = -1;
- if ((element->var16 == 1
- && !addAni(3, element->var6, ptr1, element, 0, &var_4)) || (element->var16 == 2 && !addAni(2, element->var6, ptr1, element, 0,
+ if ((element.var16 == 1
+ && !addAni(3, element.objIdx, ptr1, element, 0, &var_4)) || (element.var16 == 2 && !addAni(2, element.objIdx, ptr1, element, 0,
&var_4))) {
- if (element->varC == 255) {
+ if (element.varC == 255) {
globalVars[VAR_MOUSE_Y_POS] = 0;
}
}
- if ((element->var14 == 1
- && !addAni(0, element->var6, ptr1, element, 1, &var_2))) {
- if (element->varC == 255) {
+ if ((element.var14 == 1
+ && !addAni(0, element.objIdx, ptr1, element, 1, &var_2))) {
+ if (element.varC == 255) {
globalVars[VAR_MOUSE_X_POS] = 0;
if (var_4 != -1) {
- objectTable[element->var6].costume = var_4;
+ objectTable[element.objIdx].costume = var_4;
}
}
}
- if ((element->var14 == 2 && !addAni(1, element->var6, ptr1, element, 1, &var_2))) {
- if (element->varC == 255) {
+ if ((element.var14 == 2 && !addAni(1, element.objIdx, ptr1, element, 1, &var_2))) {
+ if (element.varC == 255) {
globalVars[VAR_MOUSE_X_POS] = 0;
if (var_4 != -1) {
- objectTable[element->var6].costume = var_4;
+ objectTable[element.objIdx].costume = var_4;
}
}
}
- if (element->var16 + element->var14) {
- if (element->var1C) {
- if (element->var1E) {
- objectTable[element->var6].costume = 0;
- element->var1E = 0;
+ if (element.var16 + element.var14) {
+ if (element.var1C) {
+ if (element.var1E) {
+ objectTable[element.objIdx].costume = 0;
+ element.var1E = 0;
}
- addAni(element->var1C + 3, element->var6, ptr1, element, 1, (int16 *) & var2);
+ addAni(element.var1C + 3, element.objIdx, ptr1, element, 1, (int16 *) & var2);
}
}
@@ -2295,119 +1863,28 @@ void processSeqListElement(SeqListElement *element) {
}
void processSeqList(void) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
+ Common::List<SeqListElement>::iterator it;
- currentHead = tempHead->next;
-
- while (currentHead) {
- if (currentHead->var4 != -1) {
- processSeqListElement(currentHead);
+ for (it = seqList.begin(); it != seqList.end(); ++it) {
+ if (it->var4 == -1) {
+ continue;
}
- tempHead = currentHead;
- currentHead = tempHead->next;
+ processSeqListElement(*it);
}
}
bool makeTextEntryMenu(const char *messagePtr, char *inputString, int stringMaxLength, int y) {
- int16 color = 2;
- byte color2 = defaultMenuBoxColor2;
- byte endOfMessageReached = 0;
- int16 localX, localY, localWidth;
- int margins = 16;
int len = strlen(messagePtr);
int16 width = 6 * len + 20;
- uint16 messageLength = 0, numWords = 0, messageWidth = 0;
- uint16 lineResult, fullLineWidth;
- uint16 interWordSize, interWordSizeRemain;
- const char *endOfMessagePtr;
- byte currentChar, characterWidth;
width = CLIP((int)width, 180, 250);
int16 x = (320 - width) / 2;
- gfxDrawPlainBoxRaw(x - margins, y, x + width + margins, y + 4, color2, page1Raw);
-
- localX = x + 4;
- localY = y + 4;
- localWidth = width;
-
getKeyData(); // clear input key
- do {
- messageLength = 0;
-
- while (messagePtr[messageLength] == ' ') {
- messageLength++;
- }
-
- messagePtr += messageLength;
-
- messageLength = computeMessageLength((const byte *)messagePtr, localWidth, &numWords, &messageWidth, &lineResult);
-
- endOfMessagePtr = messagePtr + messageLength;
-
- if (lineResult) {
- fullLineWidth = localWidth - messageWidth;
-
- if (numWords) {
- interWordSize = fullLineWidth / numWords;
- interWordSizeRemain = fullLineWidth % numWords;
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
-
- gfxDrawPlainBoxRaw(x - margins, localY, x + width + margins, localY + 9, color2, page1Raw);
-
- do {
- currentChar = *(messagePtr++);
-
- if (currentChar == 0) {
- endOfMessageReached = 1;
- } else if (currentChar == ' ') {
- localX += interWordSizeRemain + interWordSize;
-
- if (interWordSizeRemain)
- interWordSizeRemain = 0;
- } else {
- characterWidth = fontParamTable[currentChar].characterWidth;
-
- if (characterWidth) {
- byte characterIdx = fontParamTable[currentChar].characterIdx;
- drawSpriteRaw(textTable[characterIdx][0], textTable[characterIdx][1], 2, 8, page1Raw, localX, localY);
- localX += characterWidth + 1;
- }
- }
- } while ((messagePtr < endOfMessagePtr) && !endOfMessageReached);
-
- localX = x + 4;
- localY += 9;
- } while (!endOfMessageReached);
-
- // Input string
- gfxDrawPlainBoxRaw(x - margins, localY, x + width + margins, localY + 9, color2, page1Raw);
- localY += 9;
-
- x -= margins;
- width += margins * 2;
-
- gfxDrawPlainBoxRaw(x, localY, x + width, localY + 4, color2, page1Raw);
-
- drawDoubleMessageBox(x, y, width, localY, color, page1Raw);
-
- x += margins;
- width -= margins * 2;
- localY -= 9;
-
-
int quit = 0;
bool redraw = true;
CommandeType tempString;
@@ -2416,24 +1893,8 @@ bool makeTextEntryMenu(const char *messagePtr, char *inputString, int stringMaxL
while (!quit) {
if (redraw) {
- gfxDrawPlainBoxRaw(x, localY - 1, x + width, localY + 8, 0, page1Raw);
-
- int currentX = x + 4;
-
- for (uint j = 0; j < strlen(inputString); j++) {
- currentChar = inputString[j];
- currentX = drawChar(currentChar, currentX, localY);
-
- // draw cursor here
- if (inputPos == (int)(j + 2))
- gfxDrawLine(currentX, localY - 1, currentX, localY + 8, color, page1Raw);
-
- }
-
- if (strlen(inputString) == 0 || inputPos == 1) // cursor wasn't yet drawn
- gfxDrawLine(x + 4, localY - 1, x + 4, localY + 8, color, page1Raw);
-
- blitRawScreen(page1Raw);
+ renderer->drawInputBox(messagePtr, inputString, inputPos, x - 16, y, width + 32);
+ renderer->blit();
redraw = false;
}
diff --git a/engines/cine/various.h b/engines/cine/various.h
index f906b2aa19..91662c16ff 100644
--- a/engines/cine/various.h
+++ b/engines/cine/various.h
@@ -43,11 +43,10 @@ extern bool disableSystemMenu;
extern bool inMenu;
struct SeqListElement {
- struct SeqListElement *next;
int16 var4;
- int16 var6;
+ uint16 objIdx;
int16 var8;
- int16 varA;
+ int16 frame;
int16 varC;
int16 varE;
int16 var10;
@@ -60,7 +59,7 @@ struct SeqListElement {
int16 var1E;
};
-extern SeqListElement seqList;
+extern Common::List<SeqListElement> seqList;
extern uint16 var2;
extern uint16 var3;
@@ -97,7 +96,6 @@ extern char newRelName[20];
extern char newObjectName[20];
extern char newMsgName[20];
-extern char currentBgName[8][15];
extern char currentCtName[15];
extern char currentPartName[15];
@@ -130,20 +128,16 @@ struct SelectedObjStruct {
int16 param;
};
-extern uint16 defaultMenuBoxColor;
-extern uint16 defaultMenuBoxColor2;
-
#define NUM_MAX_ZONE 16
extern uint16 zoneData[NUM_MAX_ZONE];
void addMessage(byte param1, int16 param2, int16 param3, int16 param4, int16 param5);
-extern int16 additionalBgVScroll;
+void removeMessages();
void removeSeq(uint16 param1, uint16 param2, uint16 param3);
uint16 isSeqRunning(uint16 param1, uint16 param2, uint16 param3);
-void addSeqListElement(int16 param0, int16 param1, int16 param2, int16 param3, int16 param4, int16 param5, int16 param6, int16 param7, int16 param8);
-void resetSeqList();
+void addSeqListElement(uint16 objIdx, int16 param1, int16 param2, int16 frame, int16 param4, int16 param5, int16 param6, int16 param7, int16 param8);
void processSeqList(void);
bool makeTextEntryMenu(const char *caption, char *string, int strLen, int y);
diff --git a/engines/cine/xref.txt b/engines/cine/xref.txt
index 3640ef83d6..5a8d2eef0f 100644
--- a/engines/cine/xref.txt
+++ b/engines/cine/xref.txt
@@ -1,4 +1,4 @@
-script.cpp:
+script_fw.cpp:
setupOpcodes() - replaced with FWScript/OSScript class members
getNextByte() - replaced with RawScript/FWScript class members
getNextWord() - replaced with RawScript/FWScript class members
@@ -89,6 +89,9 @@ o1_disableSystemMenu() - replaced with FWScript::o1_disableSystemMenu()
o1_loadMask5() - replaced with FWScript::o1_loadMask5()
o1_unloadMask5() - replaced with FWScript::o1_unloadMask5()
+palRotate() - modified and moved to pal.cpp
+
+script_os.cpp:
o2_loadPart() - replaced with FWScript::o2_loadPart()
o2_addSeqListElement() - replaced with FWScript::o2_addSeqListElement()
o2_removeSeq() - replaced with FWScript::o2_removeSeq()
@@ -134,20 +137,48 @@ releaseObjectScripts() - removed (obsoleted by Common::List::clear())
various.cpp:
setupScriptList() - removed (obsoleted by new makeLoad() and
loadScriptFromSave() implementation)
+drawChar() - removed (obsoleted by FWRenderer::drawChar())
+makeTextEntry() - removed (obsoleted by FWRenderer::drawMenu())
+drawMenuBox() - removed (obsoleted by FWRenderer::drawCommand())
+backupOverlayPage() - removed (obsoleted by FWRenderer::drawBackground())
+drawMessage() - removed (obsoleted by FWRenderer::drawMessage())
+drawDialogueMessage() - removed (obsoleted by FWRenderer::renderOverlay())
+drawFailureMessage() - removed (obsoleted by FWRenderer::renderOverlay())
+drawOverlays() - removed (obsoleted by FWRenderer::drawOverlays())
+resetSeqList() - removed (obsoleted by Common::List)
anim.cpp:
freeAnimData() - replaced with animData::clear()
allocFrame() - replaced with animData::load()
reserveFrame() - replaced with animData::load()
-bg_list.cpp
+bg_list.cpp:
reincrustAllBg() - removed (obsoleted by new loadResourcesFromSave() and
loadBgIncrustFromSave() implementation)
freeBgIncrustList() - removed (obsoleted by Common::List::clear())
-object.cpp
+object.cpp:
unloadAllMasks() - removed (obsoleted by Common::List::clear())
resetMessageHead() - removed (obsoleted by Common::List)
freeOverlay() - removed (duplicate of removeOverlay)
removeOverlayElement() - renamed to removeOverlay
loadOverlayElement() - renamed to addOverlay
+
+gfx.cpp:
+gfxInit() - removed (obsoleted by FWRenderer)
+gfxDestroy() - removed (obsoleted by FWRenderer)
+transformColor() - moved to pal.cpp
+transformPaletteRange() - modified and moved to pal.cpp
+gfxCopyRawPage() - removed (obsoleted by FWRenderer)
+gfxFlipRawPage() - removed (obsoleted by FWRenderer::blit() and
+ FWRenderer::refreshPalette())
+fadeToBlack() - removed (obsoleted by FWRenderer::fadeToBlack())
+blitRawScreen() - removed (obsoleted by FWRenderer)
+flip() - removed (obsoleted by FWRenderer::reloadPalette())
+
+bg.cpp:
+loadCt() - split into loadCtFW() and loadCtOS()
+loadBgHigh() - removed (obsoleted by OSRenderer::loadBg256())
+
+texte.cpp:
+computeMessageLength() - replaced with fitLine()
diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp
index 7c0d167299..a2cd43eac2 100644
--- a/engines/drascula/animation.cpp
+++ b/engines/drascula/animation.cpp
@@ -65,7 +65,7 @@ void DrasculaEngine::animation_1_1() {
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
color_abc(RED);
- centra_texto("Transilvanya, 1993 d.c.", 160, 100);
+ centra_texto(_textmisc[_lang][1], 160, 100);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
@@ -81,15 +81,13 @@ void DrasculaEngine::animation_1_1() {
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
clearRoom();
- comienza_sound("s5.als");
+ playSound("s5.als");
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("scr2.bin", 17);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("scr2.bin", 17))
break;
- fin_sound_corte();
- anima("scr3.bin", 17);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ stopSound_corte();
+ if (anima("scr3.bin", 17))
break;
loadPic("cielo2.alg");
decompressPic(dir_zona_pantalla, 256);
@@ -198,11 +196,9 @@ void DrasculaEngine::animation_1_1() {
talk_dr_izq(_textd[_lang][3], "d3.als");
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("lib.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("lib.bin", 16))
break;
- anima("lib2.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("lib2.bin", 16))
break;
clearRoom();
color_solo = RED;
@@ -219,8 +215,7 @@ void DrasculaEngine::animation_1_1() {
talk_solo(_textd[_lang][5], "d5.als");
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("lib2.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("lib2.bin", 16))
break;
clearRoom();
loadPic("plan2.alg");
@@ -230,8 +225,7 @@ void DrasculaEngine::animation_1_1() {
talk_solo(_textd[_lang][6], "d6.als");
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("lib2.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("lib2.bin", 16))
break;
clearRoom();
loadPic("plan3.alg");
@@ -269,23 +263,18 @@ void DrasculaEngine::animation_1_1() {
talk_dr_izq(_textd[_lang][10], "d10.als");
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("rayo1.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("rayo1.bin", 16))
break;
- comienza_sound("s5.als");
- anima("rayo2.bin", 15);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ playSound("s5.als");
+ if (anima("rayo2.bin", 15))
break;
- anima("frel2.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("frel2.bin", 16))
break;
- anima("frel.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("frel.bin", 16))
break;
- anima("frel.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("frel.bin", 16))
break;
- fin_sound_corte();
+ stopSound_corte();
clearRoom();
black();
playMusic(23);
@@ -388,18 +377,12 @@ void DrasculaEngine::animation_1_1() {
}
void DrasculaEngine::talk_dr_grande(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
int x_talk[4] = {47, 93, 139, 185};
int cara;
int l = 0;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(RED);
@@ -444,8 +427,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
}
@@ -462,10 +445,12 @@ void DrasculaEngine::animation_2_1() {
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("ag.bin", 14);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("ag.bin", 14))
break;
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an11y13.alg");
decompressPic(dir_hare_dch, 1);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
@@ -475,15 +460,18 @@ void DrasculaEngine::animation_2_1() {
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
loadPic("97.alg");
decompressPic(dir_hare_dch, 1);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
pause(4);
- comienza_sound("s1.als");
+ playSound("s1.als");
hipo(18);
- fin_sound();
+ stopSound();
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
@@ -524,7 +512,7 @@ void DrasculaEngine::animation_2_1() {
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- strcpy(num_room, "16.alg");
+ roomNumber = 16;
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
@@ -545,8 +533,7 @@ void DrasculaEngine::animation_2_1() {
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("lev.bin", 15);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("lev.bin", 15))
break;
lleva_al_hare(100 + ancho_hare / 2, 99 + alto_hare);
@@ -556,28 +543,28 @@ void DrasculaEngine::animation_2_1() {
hare_x = 100;
hare_y = 95;
- talk_bj(_textbj[_lang][2], "BJ2.als");
- talk(_text[_lang][215], "215.als");
- talk_bj(_textbj[_lang][3], "BJ3.als");
- talk(_text[_lang][216], "216.als");
- talk_bj(_textbj[_lang][4], "BJ4.als");
- talk_bj(_textbj[_lang][5], "BJ5.als");
- talk_bj(_textbj[_lang][6], "BJ6.als");
- talk(_text[_lang][217], "217.als");
- talk_bj(_textbj[_lang][7], "BJ7.als");
- talk(_text[_lang][218], "218.als");
- talk_bj(_textbj[_lang][8], "BJ8.als");
- talk(_text[_lang][219], "219.als");
- talk_bj(_textbj[_lang][9], "BJ9.als");
- talk(_text[_lang][220], "220.als");
- talk(_text[_lang][221], "221.als");
- talk_bj(_textbj[_lang][10], "BJ10.als");
- talk(_text[_lang][222], "222.als");
- anima("gaf.bin", 15);
- anima("bjb.bin", 14);
- playMusic(9);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ talk_bj(2);
+ talk(215);
+ talk_bj(3);
+ talk(216);
+ talk_bj(4);
+ talk_bj(5);
+ talk_bj(6);
+ talk(217);
+ talk_bj(7);
+ talk(218);
+ talk_bj(8);
+ talk(219);
+ talk_bj(9);
+ talk(220);
+ talk(221);
+ talk_bj(10);
+ talk(222);
+ if (anima("gaf.bin", 15))
+ break;
+ if (anima("bjb.bin", 14))
break;
+ playMusic(9);
loadPic("97.alg");
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
@@ -616,33 +603,41 @@ void DrasculaEngine::animation_2_1() {
pause(60);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- talk(_text[_lang][224], "224.als");
+ talk(224);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- talk_bj(_textbj[_lang][12], "BJ12.als");
+ talk_bj(12);
lleva_al_hare(157, 98 + alto_hare);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- anima("bes.bin", 16);
+ if (anima("bes.bin", 16))
+ break;
playMusic(11);
- anima("rap.bin", 16);
- if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
+ if (anima("rap.bin", 16))
break;
sentido_hare = 3;
- strcpy(num_room, "no_bj.alg");
+ // The room number was originally changed here to "no_bj.alg",
+ // which doesn't exist. In reality, this was just a hack to
+ // set the room number to a non-existant one, so that BJ does
+ // not appear again when the room is refreshed after the
+ // animation where Count Drascula abducts her. We set the
+ // room number to -1 for the same purpose
+ // Also check animation_9_6(), where the same hack was used by
+ // the original
+ roomNumber = -1;
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
pause(8);
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- talk(_text[_lang][225], "225.als");
+ talk(225);
pause(76);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
sentido_hare = 1;
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- talk(_text[_lang][226], "226.als");
+ talk(226);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
updateRoom();
@@ -650,13 +645,16 @@ void DrasculaEngine::animation_2_1() {
pause(30);
if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE))
break;
- talk(_text[_lang][227],"227.als");
+ talk(227);
FundeAlNegro(0);
break;
}
}
void DrasculaEngine::animation_3_1() {
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an11y13.alg");
decompressPic(dir_hare_dch, 1);
@@ -683,11 +681,17 @@ void DrasculaEngine::animation_3_1() {
flags[0] = 1;
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
loadPic("97.alg");
decompressPic(dir_hare_dch, 1);
}
void DrasculaEngine::animation_4_1() {
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an12.alg");
decompressPic(dir_hare_dch, 1);
@@ -720,6 +724,9 @@ void DrasculaEngine::animation_4_1() {
talk_pianista(_textp[_lang][4], "p4.als");
talk(_text[_lang][209], "209.als");
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
flags[11] = 0;
loadPic("97.alg");
decompressPic(dir_hare_dch, 1);
@@ -775,7 +782,7 @@ void DrasculaEngine::animation_2_2() {
}
x = 0;
- comienza_sound("s2.als");
+ playSound("s2.als");
for (n = 0; n < 6; n++) {
x++;
@@ -807,13 +814,13 @@ void DrasculaEngine::animation_2_2() {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
+ stopSound();
pause (4);
- comienza_sound("s1.als");
+ playSound("s1.als");
hipo_sin_nadie(12);
- fin_sound();
+ stopSound();
}
void DrasculaEngine::animation_3_2() {
@@ -842,6 +849,9 @@ void DrasculaEngine::animation_4_2() {
loadPic("ciego5.alg");
decompressPic(dir_hare_frente, 1);
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
@@ -868,7 +878,7 @@ void DrasculaEngine::animation_4_2() {
talk_ciego(_textd[_lang][75],"d75.als", _textd1[_lang][75 - TEXTD_START]);
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- _system->delayMillis(1);
+ _system->delayMillis(1000);
talk_hacker(_textd[_lang][64], "d64.als");
talk_ciego(_textd[_lang][76], "d76.als", _textd1[_lang][76 - TEXTD_START]);
@@ -892,6 +902,9 @@ void DrasculaEngine::animation_4_2() {
decompressPic(dir_hare_fondo, 1);
withoutVerb();
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
flags[9] = 0;
flags[4] = 1;
}
@@ -953,10 +966,10 @@ void DrasculaEngine::animation_14_2() {
decompressPic(dir_dibujo1, 1);
- comienza_sound("s7.als");
+ playSound("s7.als");
hipo(15);
- fin_sound();
+ stopSound();
loadPic("99.alg");
decompressPic(dir_hare_fondo, 1);
@@ -1011,9 +1024,9 @@ void DrasculaEngine::animation_16_2() {
goto asco;
if (_lang == kSpanish)
- _system->delayMillis(3);
+ _system->delayMillis(3000);
else
- _system->delayMillis(4);
+ _system->delayMillis(4000);
key = getscan();
if (key != 0)
@@ -1038,9 +1051,9 @@ void DrasculaEngine::animation_16_2() {
goto asco;
if (_lang == kSpanish)
- _system->delayMillis(3);
+ _system->delayMillis(3000);
else
- _system->delayMillis(4);
+ _system->delayMillis(4000);
key = getscan();
if (key != 0)
@@ -1065,9 +1078,9 @@ void DrasculaEngine::animation_16_2() {
goto asco;
if (_lang == kSpanish)
- _system->delayMillis(3);
+ _system->delayMillis(3000);
else
- _system->delayMillis(4);
+ _system->delayMillis(4000);
key = getscan();
if (key != 0)
@@ -1092,9 +1105,9 @@ void DrasculaEngine::animation_16_2() {
goto asco;
if (_lang == kSpanish)
- _system->delayMillis(2);
+ _system->delayMillis(2000);
else
- _system->delayMillis(4);
+ _system->delayMillis(4000);
key = getscan();
if (key != 0)
@@ -1116,7 +1129,9 @@ void DrasculaEngine::animation_16_2() {
asco:
loadPic(roomDisk);
decompressPic(dir_dibujo3, 1);
- loadPic(num_room);
+ char rm[20];
+ sprintf(rm, "%i.alg", roomNumber);
+ loadPic(rm);
decompressPic(dir_dibujo1, HALF_PAL);
black();
updateRoom();
@@ -1135,24 +1150,24 @@ void DrasculaEngine::animation_17_2() {
}
void DrasculaEngine::animation_19_2() {
- talk_vbpuerta(_textvb[_lang][5], "VB5.als");
+ talk_vbpuerta(5);
}
void DrasculaEngine::animation_20_2() {
- talk_vbpuerta(_textvb[_lang][7], "VB7.als");
- talk_vbpuerta(_textvb[_lang][8], "VB8.als");
- talk(_text[_lang][383], "383.als");
- talk_vbpuerta(_textvb[_lang][9], "VB9.als");
- talk(_text[_lang][384], "384.als");
- talk_vbpuerta(_textvb[_lang][10], "VB10.als");
- talk(_text[_lang][385], "385.als");
- talk_vbpuerta(_textvb[_lang][11], "VB11.als");
+ talk_vbpuerta(7);
+ talk_vbpuerta(8);
+ talk(383);
+ talk_vbpuerta(9);
+ talk(384);
+ talk_vbpuerta(10);
+ talk(385);
+ talk_vbpuerta(11);
if (flags[23] == 0) {
- talk(_text[_lang][350], "350.als");
- talk_vbpuerta(_textvb[_lang][57], "VB57.als");
+ talk(350);
+ talk_vbpuerta(57);
} else {
- talk(_text[_lang][386], "386.als");
- talk_vbpuerta(_textvb[_lang][12], "VB12.als");
+ talk(386);
+ talk_vbpuerta(12);
flags[18] = 0;
flags[14] = 1;
openDoor(15, 1);
@@ -1169,7 +1184,7 @@ void DrasculaEngine::animation_20_2() {
}
void DrasculaEngine::animation_21_2() {
- talk_vbpuerta(_textvb[_lang][6], "VB6.als");
+ talk_vbpuerta(6);
}
void DrasculaEngine::animation_23_2() {
@@ -1179,26 +1194,26 @@ void DrasculaEngine::animation_23_2() {
flags[21] = 1;
if (flags[25] == 0) {
- talk_vb(_textvb[_lang][13], "VB13.als");
- talk_vb(_textvb[_lang][14], "VB14.als");
+ talk_vb(13);
+ talk_vb(14);
pause(10);
- talk(_text[_lang][387], "387.als");
+ talk(387);
}
- talk_vb(_textvb[_lang][15], "VB15.als");
+ talk_vb(15);
lleva_vb(42);
sentido_vb = 1;
- talk_vb(_textvb[_lang][16], "VB16.als");
+ talk_vb(16);
sentido_vb = 2;
lleva_al_hare(157, 147);
lleva_al_hare(131, 149);
sentido_hare = 0;
animation_14_2();
if (flags[25] == 0)
- talk_vb(_textvb[_lang][17], "VB17.als");
+ talk_vb(17);
pause(8);
sentido_vb = 1;
- talk_vb(_textvb[_lang][18], "VB18.als");
+ talk_vb(18);
if (flags[29] == 0)
animation_23_anexo();
@@ -1210,9 +1225,9 @@ void DrasculaEngine::animation_23_2() {
lleva_vb(99);
if (flags[29] == 0) {
- talk_vb(_textvb[_lang][19], "VB19.als");
+ talk_vb(19);
if (flags[25] == 0) {
- talk_vb(_textvb[_lang][20],"VB20.als");
+ talk_vb(20);
if (resta_objeto(7) == 0)
flags[30] = 1;
if (resta_objeto(18) == 0)
@@ -1220,7 +1235,7 @@ void DrasculaEngine::animation_23_2() {
if (resta_objeto(19) == 0)
flags[32] = 1;
}
- talk_vb(_textvb[_lang][21], "VB21.als");
+ talk_vb(21);
} else
animation_27_2();
@@ -1289,7 +1304,7 @@ void DrasculaEngine::animation_25_2() {
flags[24] = 0;
- comienza_sound("s6.als");
+ playSound("s6.als");
for (n = 0; n >= -160; n = n - 8) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
@@ -1306,7 +1321,7 @@ void DrasculaEngine::animation_25_2() {
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
- fin_sound();
+ stopSound();
loadPic("99.alg");
decompressPic(dir_hare_fondo, 1);
@@ -1319,63 +1334,63 @@ void DrasculaEngine::animation_27_2() {
resta_objeto(23);
suma_objeto(11);
- talk_vb(_textvb[_lang][23], "VB23.als");
- talk_vb(_textvb[_lang][24], "VB24.als");
+ talk_vb(23);
+ talk_vb(24);
if (flags[30] == 1)
suma_objeto(7);
if (flags[31] == 1)
suma_objeto(18);
if (flags[32] == 1)
suma_objeto(19);
- talk_vb(_textvb[_lang][25],"VB25.als");
- talk_vb(_textvb[_lang][26],"VB26.als");
+ talk_vb(25);
+ talk_vb(26);
}
void DrasculaEngine::animation_28_2() {
- talk_vb(_textvb[_lang][27], "VB27.als");
- talk_vb(_textvb[_lang][28], "VB28.als");
- talk_vb(_textvb[_lang][29], "VB29.als");
- talk_vb(_textvb[_lang][30], "VB30.als");
+ talk_vb(27);
+ talk_vb(28);
+ talk_vb(29);
+ talk_vb(30);
}
void DrasculaEngine::animation_29_2() {
if (flags[33] == 0) {
- talk_vb(_textvb[_lang][32], "VB32.als");
- talk(_text[_lang][398], "398.als");
- talk_vb(_textvb[_lang][33], "VB33.als");
- talk(_text[_lang][399], "399.als");
- talk_vb(_textvb[_lang][34], "VB34.als");
- talk_vb(_textvb[_lang][35], "VB35.als");
- talk(_text[_lang][400], "400.als");
- talk_vb(_textvb[_lang][36], "VB36.als");
- talk_vb(_textvb[_lang][37], "VB37.als");
- talk(_text[_lang][386], "386.als");
- talk_vb(_textvb[_lang][38], "VB38.als");
- talk_vb(_textvb[_lang][39], "VB39.als");
- talk(_text[_lang][401], "401.als");
- talk_vb(_textvb[_lang][40], "VB40.als");
- talk_vb(_textvb[_lang][41], "VB41.als");
+ talk_vb(32);
+ talk(398);
+ talk_vb(33);
+ talk(399);
+ talk_vb(34);
+ talk_vb(35);
+ talk(400);
+ talk_vb(36);
+ talk_vb(37);
+ talk(386);
+ talk_vb(38);
+ talk_vb(39);
+ talk(401);
+ talk_vb(40);
+ talk_vb(41);
flags[33] = 1;
} else
- talk_vb(_textvb[_lang][43], "VB43.als");
+ talk_vb(43);
- talk(_text[_lang][402], "402.als");
- talk_vb(_textvb[_lang][42], "VB42.als");
+ talk(402);
+ talk_vb(42);
if (flags[38] == 0) {
- talk(_text[_lang][403], "403.als");
+ talk(403);
rompo_y_salgo = 1;
} else
- talk(_text[_lang][386], "386.als");
+ talk(386);
}
void DrasculaEngine::animation_30_2() {
- talk_vb(_textvb[_lang][31], "VB31.als");
- talk(_text[_lang][396], "396.als");
+ talk_vb(31);
+ talk(396);
}
void DrasculaEngine::animation_31_2() {
- talk_vb(_textvb[_lang][44], "VB44.als");
+ talk_vb(44);
lleva_vb(-50);
pause(15);
lleva_al_hare(159, 140);
@@ -1389,25 +1404,25 @@ void DrasculaEngine::animation_31_2() {
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(22);
- talk(_text[_lang][406], "406.als");
+ talk(406);
lleva_vb(98);
- talk_vb(_textvb[_lang][45], "VB45.als");
- talk_vb(_textvb[_lang][46], "VB46.als");
- talk_vb(_textvb[_lang][47], "VB47.als");
- talk(_text[_lang][407], "407.als");
- talk_vb(_textvb[_lang][48], "VB48.als");
- talk_vb(_textvb[_lang][49], "VB49.als");
- talk(_text[_lang][408], "408.als");
- talk_vb(_textvb[_lang][50], "VB50.als");
- talk_vb(_textvb[_lang][51], "VB51.als");
- talk(_text[_lang][409], "409.als");
- talk_vb(_textvb[_lang][52], "VB52.als");
- talk_vb(_textvb[_lang][53], "VB53.als");
+ talk_vb(45);
+ talk_vb(46);
+ talk_vb(47);
+ talk(407);
+ talk_vb(48);
+ talk_vb(49);
+ talk(408);
+ talk_vb(50);
+ talk_vb(51);
+ talk(409);
+ talk_vb(52);
+ talk_vb(53);
pause(12);
- talk_vb(_textvb[_lang][54], "VB54.als");
- talk_vb(_textvb[_lang][55], "VB55.als");
- talk(_text[_lang][410], "410.als");
- talk_vb(_textvb[_lang][56], "VB56.als");
+ talk_vb(54);
+ talk_vb(55);
+ talk(410);
+ talk_vb(56);
rompo_y_salgo = 1;
@@ -1479,9 +1494,9 @@ void DrasculaEngine::animation_35_2() {
pause(19);
- comienza_sound("s1.als");
+ playSound("s1.als");
hipo_sin_nadie(18);
- fin_sound();
+ stopSound();
pause(10);
@@ -1793,7 +1808,7 @@ void DrasculaEngine::animation_rayo() {
pause(50);
- comienza_sound("s5.als");
+ playSound("s5.als");
updateScreen(0, 0, 0, 0, 320, 200, dir_hare_dch);
pause(3);
@@ -1806,7 +1821,7 @@ void DrasculaEngine::animation_rayo() {
updateScreen(0, 0, 0, 0, 320, 200, dir_dibujo3);
pause(3);
updateScreen(0, 0, 0, 0, 320, 200, dir_hare_frente);
- fin_sound();
+ stopSound();
}
void DrasculaEngine::animation_2_4() {
@@ -1848,26 +1863,26 @@ void DrasculaEngine::animation_7_4() {
void DrasculaEngine::animation_1_5() {
if (flags[0] == 0) {
talk(_text[_lang][430], "430.als");
- talk_bj(_textbj[_lang][16], "BJ16.als");
- talk_bj(_textbj[_lang][17], "BJ17.als");
- talk_bj(_textbj[_lang][18], "BJ18.als");
- talk(_text[_lang][217], "217.als");
- talk_bj(_textbj[_lang][19], "BJ19.als");
- talk(_text[_lang][229], "229.als");
+ talk_bj(16);
+ talk_bj(17);
+ talk_bj(18);
+ talk(217);
+ talk_bj(19);
+ talk(229);
pause(5);
lleva_al_hare(114, 170);
sentido_hare = 3;
- talk(_text[_lang][431], "431.als");
- talk_bj(_textbj[_lang][20], "BJ20.als");
+ talk(431);
+ talk_bj(20);
sentido_hare = 2;
pause(4);
- talk(_text[_lang][438], "438.als");
+ talk(438);
sitio_x = 120;
sitio_y = 157;
anda_a_objeto = 1;
sentido_final = 1;
empieza_andar();
- talk_bj(_textbj[_lang][21], "BJ21.als");
+ talk_bj(21);
for (;;) {
if (hare_se_mueve == 0)
@@ -1877,7 +1892,7 @@ void DrasculaEngine::animation_1_5() {
}
sentido_hare = 1;
- talk(_text[_lang][229], "229.als");
+ talk(229);
flags[0] = 1;
}
@@ -1886,11 +1901,11 @@ void DrasculaEngine::animation_1_5() {
}
void DrasculaEngine::animation_2_5() {
- talk_bj(_textbj[_lang][22], "BJ22.als");
+ talk_bj(22);
}
void DrasculaEngine::animation_3_5() {
- talk_bj(_textbj[_lang][23], "BJ23.als");
+ talk_bj(23);
pickObject(10);
rompo_y_salgo = 1;
}
@@ -1986,8 +2001,8 @@ void DrasculaEngine::animation_5_5(){
}
updateScreen(0, 0, 0, 0, 320, 200, dir_dibujo1);
- comienza_sound("s1.als");
- fin_sound();
+ playSound("s1.als");
+ stopSound();
loadPic("99.alg");
decompressPic(dir_hare_fondo, 1);
@@ -2063,7 +2078,7 @@ void DrasculaEngine::animation_12_5() {
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(27);
anima("rayo1.bin", 23);
- comienza_sound("s5.als");
+ playSound("s5.als");
anima("rayo2.bin", 17);
sentido_hare = 1;
updateRoom();
@@ -2073,9 +2088,9 @@ void DrasculaEngine::animation_12_5() {
for (color = 0; color < 255; color++)
for (componente = 0; componente < 3; componente++) {
- palFondo1[color][componente] = palJuego[color][componente];
- palFondo2[color][componente] = palJuego[color][componente];
- palFondo3[color][componente] = palJuego[color][componente];
+ palFondo1[color][componente] = gamePalette[color][componente];
+ palFondo2[color][componente] = gamePalette[color][componente];
+ palFondo3[color][componente] = gamePalette[color][componente];
}
for (fundido = 1; fundido >= 0; fundido--) {
@@ -2114,13 +2129,13 @@ void DrasculaEngine::animation_12_5() {
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
- fin_sound_corte();
+ stopSound_corte();
for (frame = 0; frame < 15; frame++) {
if (frame == 2 || frame == 4 || frame == 7 || frame == 9)
setPalette((byte *)&palFondo1);
else if (frame == 1 || frame == 5)
- setPalette((byte *)&palJuego);
+ setPalette((byte *)&gamePalette);
else
setPalette((byte *)&palFondo2);
@@ -2138,9 +2153,9 @@ void DrasculaEngine::animation_12_5() {
flags[1] = 1;
animation_13_5();
- comienza_sound("s1.als");
+ playSound("s1.als");
hipo(12);
- fin_sound();
+ stopSound();
loadPic("99.alg");
decompressPic(dir_hare_fondo, 1);
@@ -2204,19 +2219,19 @@ void DrasculaEngine::animation_13_5() {
void DrasculaEngine::animation_14_5() {
flags[11] = 1;
- comienza_sound("s3.als");
+ playSound("s3.als");
updateRoom();
updateScreen(0, 0, 0,0 , 320, 200, dir_zona_pantalla);
- fin_sound();
+ stopSound();
pause(17);
sentido_hare = 3;
talk(_text[_lang][246],"246.als");
lleva_al_hare(89, 160);
flags[10] = 1;
- comienza_sound("s7.als");
+ playSound("s7.als");
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
+ stopSound();
pause(14);
sentido_hare = 3;
updateRoom();
@@ -2313,6 +2328,10 @@ void DrasculaEngine::animation_1_6() {
talk_dr_dch(_textd[_lang][34], "d34.als");
sentido_dr = 0;
talk_dr_izq(_textd[_lang][35], "d35.als");
+
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
clearRoom();
carga_escoba("102.ald");
activa_pendulo();
@@ -2402,7 +2421,14 @@ void DrasculaEngine::animation_9_6() {
hare_x = -1;
obj_saliendo = 108;
carga_escoba("59.ald");
- strcpy(num_room, "nada.alg");
+ // The room number was originally changed here to "nada.alg",
+ // which is a non-existant file. In reality, this was just a
+ // hack to set the room number to a non-existant one, so that
+ // room sprites do not appear again when the room is refreshed.
+ // We set the room number to -1 for the same purpose.
+ // Also check animation_2_1(), where the same hack was used
+ // by the original
+ roomNumber = -1;
loadPic("nota2.alg");
decompressPic(dir_dibujo1, HALF_PAL);
black();
@@ -2465,12 +2491,12 @@ void DrasculaEngine::animation_9_6() {
}
void DrasculaEngine::animation_10_6() {
- comienza_sound ("s14.als");
+ playSound ("s14.als");
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateRefresh_pre();
copyBackground(164, 85, 155, 48, 113, 114, dir_dibujo3, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
+ stopSound();
talk_taber2(_textt[_lang][23], "t23.als");
flags[7] = 1;
}
@@ -2520,12 +2546,15 @@ void DrasculaEngine::animation_19_6() {
pause(6);
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- comienza_sound("s4.als");
+ playSound("s4.als");
pause(6);
- fin_sound();
+ stopSound();
}
void DrasculaEngine::animation_12_2() {
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an12.alg");
decompressPic(dir_hare_dch, 1);
@@ -2552,6 +2581,9 @@ void DrasculaEngine::animation_12_2() {
talk_pianista(_textp[_lang][5], "P5.als");
conversa("op_1.cal");
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
flags[11] = 0;
loadPic("974.alg");
decompressPic(dir_hare_dch, 1);
@@ -2560,6 +2592,9 @@ void DrasculaEngine::animation_12_2() {
void DrasculaEngine::animation_26_2() {
int n, x = 0;
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an12.alg");
decompressPic(dir_hare_dch, 1);
@@ -2606,11 +2641,11 @@ void DrasculaEngine::animation_26_2() {
updateScreen(225, 113, 225, 113, 50, 59, dir_zona_pantalla);
x = x + 50;
if (n == 2)
- comienza_sound("s9.als");
+ playSound("s9.als");
pause(3);
}
- fin_sound_corte();
+ stopSound_corte();
x = 0;
for (n = 0; n < 6; n++) {
x++;
@@ -2623,6 +2658,9 @@ void DrasculaEngine::animation_26_2() {
pickObject(11);
resta_objeto(12);
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
flags[11] = 0;
flags[39] = 1;
loadPic("974.alg");
@@ -2631,6 +2669,9 @@ void DrasculaEngine::animation_26_2() {
}
void DrasculaEngine::animation_11_2() {
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an11y13.alg");
decompressPic(dir_hare_dch, 1);
@@ -2644,6 +2685,9 @@ void DrasculaEngine::animation_11_2() {
pause(40);
talk_tabernero("No, nada", "d82.als");
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
loadPic("974.alg");
decompressPic(dir_hare_dch, 1);
}
@@ -2671,8 +2715,8 @@ void DrasculaEngine::animation_13_2() {
}
void DrasculaEngine::animation_18_2() {
- talk(_text[_lang][378], "378.als");
- talk_vbpuerta(_textvb[_lang][4], "VB4.als");
+ talk(378);
+ talk_vbpuerta(4);
conversa("op_3.cal");
}
@@ -2682,15 +2726,15 @@ void DrasculaEngine::animation_22_2() {
sentido_hare=2;
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- comienza_sound("s13.als");
- fin_sound();
+ playSound("s13.als");
+ stopSound();
sentido_hare = 1;
- talk_vbpuerta(_textvb[_lang][1], "VB1.als");
- talk(_text[_lang][375], "375.als");
- talk_vbpuerta(_textvb[_lang][2], "VB2.als");
- talk(_text[_lang][376], "376.als");
- talk_vbpuerta(_textvb[_lang][3], "VB3.als");
+ talk_vbpuerta(1);
+ talk(375);
+ talk_vbpuerta(2);
+ talk(376);
+ talk_vbpuerta(3);
flags[18] = 1;
}
@@ -2703,7 +2747,7 @@ void DrasculaEngine::animation_24_2() {
pause(3);
sentido_hare = 0;
- talk(_text[_lang][356], "356.als");
+ talk(356);
loadPic("an24.alg");
decompressPic(dir_hare_frente, 1);
@@ -2712,7 +2756,7 @@ void DrasculaEngine::animation_24_2() {
flags[21] = 1;
- talk_vb(_textvb[_lang][22], "VB22.als");
+ talk_vb(22);
if (flags[22] == 0)
conversa("op_4.cal");
@@ -2805,7 +2849,7 @@ void DrasculaEngine::animation_34_2() {
}
x = 0;
- comienza_sound("s8.als");
+ playSound("s8.als");
for (n = 0; n < 3; n++) {
x++;
@@ -2814,7 +2858,7 @@ void DrasculaEngine::animation_34_2() {
x = x + 83;
pause(3);
}
- fin_sound();
+ stopSound();
pause(30);
@@ -2829,6 +2873,9 @@ void DrasculaEngine::animation_34_2() {
}
void DrasculaEngine::animation_36_2() {
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
loadPic("an11y13.alg");
decompressPic(dir_hare_dch, 1);
@@ -2840,6 +2887,9 @@ void DrasculaEngine::animation_36_2() {
pause(40);
talk_tabernero("No, nada", "d82.als");
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
loadPic("974.alg");
decompressPic(dir_hare_dch, 1);
}
@@ -3166,7 +3216,7 @@ void DrasculaEngine::animation_5_2() {
pause(3);
}
- comienza_sound("s1.als");
+ playSound("s1.als");
x = 0;
@@ -3177,7 +3227,7 @@ void DrasculaEngine::animation_5_2() {
x = x + 52;
pause(3);
}
- fin_sound_corte();
+ stopSound_corte();
x = 0;
@@ -3207,6 +3257,9 @@ void DrasculaEngine::animation_6_2() {
stopMusic();
flags[9] = 1;
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
clearRoom();
loadPic("ciego1.alg");
decompressPic(dir_dibujo1, HALF_PAL);
@@ -3251,6 +3304,9 @@ void DrasculaEngine::animation_6_2() {
decompressPic(dir_hare_fondo, 1);
withoutVerb();
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
flags[9] = 0;
}
@@ -3274,6 +3330,9 @@ void DrasculaEngine::animation_33_2() {
loadPic("ciego5.alg");
decompressPic(dir_hare_frente, 1);
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_frente;
+
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
@@ -3307,6 +3366,9 @@ void DrasculaEngine::animation_33_2() {
decompressPic(dir_hare_fondo, 1);
withoutVerb();
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+
flags[33] = 1;
flags[9] = 0;
}
@@ -3400,10 +3462,9 @@ void DrasculaEngine::animation_5_4(){
}
void DrasculaEngine::animation_6_4() {
- char room[13];
+ int prevRoom = roomNumber;
- strcpy(room, num_room);
- strcpy(num_room, "26.alg");
+ roomNumber = 26;
clearRoom();
loadPic("26.alg");
decompressPic(dir_dibujo1, HALF_PAL);
@@ -3419,13 +3480,15 @@ void DrasculaEngine::animation_6_4() {
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(40);
talk_igor_frente(_texti[_lang][26], "I26.als");
- strcpy(num_room, room);
+ roomNumber = prevRoom;
clearRoom();
loadPic("96.alg");
decompressPic(dir_hare_frente, 1);
loadPic(roomDisk);
decompressPic(dir_dibujo3, 1);
- loadPic(num_room);
+ char rm[20];
+ sprintf(rm, "%i.alg", roomNumber);
+ loadPic(rm);
decompressPic(dir_dibujo1, HALF_PAL);
withoutVerb();
updateRoom();
diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp
index 80ea4f0eab..b3d8d964c8 100644
--- a/engines/drascula/detection.cpp
+++ b/engines/drascula/detection.cpp
@@ -58,6 +58,10 @@ uint16 DrasculaEngine::getVersion() const {
return _gameDescription->version;
}
+Common::Language DrasculaEngine::getLanguage() const {
+ return _gameDescription->desc.language;
+}
+
}
static const PlainGameDescriptor drasculaGames[] = {
@@ -75,7 +79,7 @@ static const DrasculaGameDescription gameDescriptions[] = {
{
"drascula",
0,
- AD_ENTRY1("14.ald", "09b2735953edcd43af115c65ae00b10e"),
+ AD_ENTRY1s("14.ald", "09b2735953edcd43af115c65ae00b10e", 1595),
Common::EN_ANY,
Common::kPlatformPC,
Common::ADGF_NO_FLAGS
@@ -85,13 +89,13 @@ static const DrasculaGameDescription gameDescriptions[] = {
0,
0,
},
-/*
+
{
// Drascula Spanish version
{
"drascula",
0,
- AD_ENTRY1("14.ald", "0746ed1a5cc8d9728f790c29813f4b43"),
+ AD_ENTRY1s("14.ald", "0746ed1a5cc8d9728f790c29813f4b43", 23059),
Common::ES_ESP,
Common::kPlatformPC,
Common::ADGF_NO_FLAGS
@@ -100,7 +104,55 @@ static const DrasculaGameDescription gameDescriptions[] = {
0,
0,
0,
- },*/
+ },
+
+ {
+ // Drascula German version
+ {
+ "drascula",
+ 0,
+ AD_ENTRY1s("14.ald", "72e46089033d56bad1c179ac36e2a9d2", 610),
+ Common::DE_DEU,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ 0,
+ 0,
+ 0,
+ 0,
+ },
+
+ {
+ // Drascula French version
+ {
+ "drascula",
+ 0,
+ AD_ENTRY1s("14.ald", "eeeee96b82169003630e08992248296c", 608),
+ Common::FR_FRA,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ 0,
+ 0,
+ 0,
+ 0,
+ },
+
+ {
+ // Drascula Italian version
+ {
+ "drascula",
+ 0,
+ AD_ENTRY1s("14.ald", "02b49a18328d0bf2efe6ba658c9c7a1d", 2098),
+ Common::IT_ITA,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ 0,
+ 0,
+ 0,
+ 0,
+ },
{ AD_TABLE_END_MARKER, 0, 0, 0, 0 }
};
@@ -182,7 +234,8 @@ const Common::ADGameDescription *DrasculaMetaEngine::fallbackDetect(const FSList
Drascula::g_fallbackDesc.features = 0;
Drascula::g_fallbackDesc.version = 0;
- return (const Common::ADGameDescription *)&Drascula::g_fallbackDesc;
+ //return (const Common::ADGameDescription *)&Drascula::g_fallbackDesc;
+ return NULL;
}
#if PLUGIN_ENABLED_DYNAMIC(DRASCULA)
diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp
index d6b1904689..5c274b1ef0 100644
--- a/engines/drascula/drascula.cpp
+++ b/engines/drascula/drascula.cpp
@@ -79,16 +79,30 @@ DrasculaEngine::~DrasculaEngine() {
delete _rnd;
}
-static const int x_obj[44] = {0, X_OBJ1, X_OBJ2, X_OBJ3, X_OBJ4, X_OBJ5, X_OBJ6, X_OBJ7, X_OBJ8, X_OBJ9, X_OBJ10,
- X_OBJ11, X_OBJ12, X_OBJ13, X_OBJ14, X_OBJ15, X_OBJ16, X_OBJ17, X_OBJ18, X_OBJ19, X_OBJ20,
- X_OBJ21, X_OBJ22, X_OBJ23, X_OBJ24, X_OBJ25, X_OBJ26, X_OBJ27, X_OBJ28, X_OBJ29, X_OBJ30,
- X_OBJ31, X_OBJ32, X_OBJ33, X_OBJ34, X_OBJ35, X_OBJ36, X_OBJ37, X_OBJ38, X_OBJ39, X_OBJ40,
- X_OBJ41, X_OBJ42, X_OBJ43};
-static const int y_obj[44] = {0, Y_OBJ1, Y_OBJ2, Y_OBJ3, Y_OBJ4, Y_OBJ5, Y_OBJ6, Y_OBJ7, Y_OBJ8, Y_OBJ9, Y_OBJ10,
- Y_OBJ11, Y_OBJ12, Y_OBJ13, Y_OBJ14, Y_OBJ15, Y_OBJ16, Y_OBJ17, Y_OBJ18, Y_OBJ19, Y_OBJ20,
- Y_OBJ21, Y_OBJ22, Y_OBJ23, Y_OBJ24, Y_OBJ25, Y_OBJ26, Y_OBJ27, Y_OBJ28, Y_OBJ29, Y_OBJ30,
- Y_OBJ31, Y_OBJ32, Y_OBJ33, Y_OBJ34, Y_OBJ35, Y_OBJ36, Y_OBJ37, Y_OBJ38, Y_OBJ39, Y_OBJ40,
- Y_OBJ41, Y_OBJ42, Y_OBJ43};
+struct ItemLocation {
+ int x;
+ int y;
+};
+
+ItemLocation itemLocations[] = {
+ { 0, 0 }, // empty
+ { 5, 10 }, { 50, 10 }, { 95, 10 }, // 1-3
+ { 140, 10 }, { 185, 10 }, { 230, 10 }, // 4-6
+ { 275, 10 }, { 5, 40 }, { 50, 40 }, // 7-9
+ { 95, 40 }, { 140, 40 }, { 185, 40 }, // 10-12
+ { 230, 40 }, { 275, 40 }, { 5, 70 }, // 13-15
+ { 50, 70 }, { 95, 70 }, { 140, 70 }, // 16-18
+ { 185, 70 }, { 230, 70 }, { 275, 70 }, // 19-21
+ { 5, 100 }, { 50, 100 }, { 95, 100 }, // 22-24
+ { 140, 100 }, { 185, 100 }, { 230, 100 }, // 25-27
+ { 275, 100 }, { 5, 130 }, { 50, 130 }, // 28-30
+ { 95, 130 }, { 140, 130 }, { 185, 130 }, // 31-33
+ { 230, 130 }, { 275, 130 }, { 5, 160 }, // 34-36
+ { 50, 160 }, { 95, 160 }, { 140, 160 }, // 37-39
+ { 185, 160 }, { 230, 160 }, { 275, 160 }, // 40-42
+ { 275, 160 } // 43
+};
+
static const int x_pol[44] = {0, 1, 42, 83, 124, 165, 206, 247, 83, 1, 206,
1, 42, 83, 124, 165, 206, 247, 83, 1, 206,
247, 83, 165, 1, 206, 42, 124, 83, 1, 247,
@@ -114,6 +128,27 @@ int DrasculaEngine::init() {
_system->initSize(320, 200);
_system->endGFXTransaction();
+ switch (getLanguage()) {
+ case Common::EN_ANY:
+ _lang = 0;
+ break;
+ case Common::ES_ESP:
+ _lang = 1;
+ break;
+ case Common::DE_DEU:
+ _lang = 2;
+ break;
+ case Common::FR_FRA:
+ _lang = 3;
+ break;
+ case Common::IT_ITA:
+ _lang = 4;
+ break;
+ default:
+ warning("Unknown game language. Falling back to English");
+ _lang = 0;
+ }
+
return 0;
}
@@ -137,7 +172,7 @@ int DrasculaEngine::go() {
step_x = PASO_HARE_X; step_y = PASO_HARE_Y;
alto_hare = CHARACTER_HEIGHT; ancho_hare = CHARACTER_WIDTH; alto_pies = PIES_HARE;
alto_talk = ALTO_TALK_HARE; ancho_talk = ANCHO_TALK_HARE;
- hay_respuesta = 0;
+ hay_answer = 0;
conta_ciego_vez = 0;
cambio_de_color = 0;
rompo_y_salgo = 0;
@@ -334,7 +369,7 @@ void DrasculaEngine::paleta_hare() {
for (color = 235; color < 253; color++)
for (componente = 0; componente < 3; componente++)
- palHare[color][componente] = palJuego[color][componente];
+ palHare[color][componente] = gamePalette[color][componente];
}
void DrasculaEngine::hare_oscuro() {
@@ -342,7 +377,7 @@ void DrasculaEngine::hare_oscuro() {
for (color = 235; color < 253; color++ )
for (componente = 0; componente < 3; componente++)
- palJuego[color][componente] = palHareOscuro[color][componente];
+ gamePalette[color][componente] = palHareOscuro[color][componente];
updatePalette();
}
@@ -351,9 +386,9 @@ void DrasculaEngine::setRGB(byte *dir_lectura, int plt) {
int x, cnt = 0;
for (x = 0; x < plt; x++) {
- palJuego[x][0] = dir_lectura[cnt++] / 4;
- palJuego[x][1] = dir_lectura[cnt++] / 4;
- palJuego[x][2] = dir_lectura[cnt++] / 4;
+ gamePalette[x][0] = dir_lectura[cnt++] / 4;
+ gamePalette[x][1] = dir_lectura[cnt++] / 4;
+ gamePalette[x][2] = dir_lectura[cnt++] / 4;
}
updatePalette();
}
@@ -374,7 +409,7 @@ void DrasculaEngine::black() {
}
void DrasculaEngine::updatePalette() {
- setPalette((byte *)&palJuego);
+ setPalette((byte *)&gamePalette);
}
void DrasculaEngine::setPalette(byte *PalBuf) {
@@ -393,10 +428,9 @@ void DrasculaEngine::setPalette(byte *PalBuf) {
void DrasculaEngine::copyBackground(int xorg, int yorg, int xdes, int ydes, int width,
int height, byte *src, byte *dest) {
- int x;
dest += xdes + ydes * 320;
src += xorg + yorg * 320;
- for (x = 0; x < height; x++) {
+ for (int x = 0; x < height; x++) {
memcpy(dest, src, width);
dest += 320;
src += 320;
@@ -450,12 +484,11 @@ void DrasculaEngine::copyRectClip(int *Array, byte *src, byte *dest) {
}
void DrasculaEngine::updateScreen(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *buffer) {
- int x;
byte *ptr = VGA;
ptr += xdes + ydes * 320;
buffer += xorg + yorg * 320;
- for (x = 0; x < height; x++) {
+ for (int x = 0; x < height; x++) {
memcpy(ptr, buffer, width);
ptr += 320;
buffer += 320;
@@ -468,7 +501,10 @@ void DrasculaEngine::updateScreen(int xorg, int yorg, int xdes, int ydes, int wi
bool DrasculaEngine::escoba() {
int n;
- dir_texto = dir_mesa;
+ if (_lang == kSpanish)
+ dir_texto = dir_hare_dch;
+ else
+ dir_texto = dir_mesa;
previousMusic = -1;
@@ -481,7 +517,7 @@ bool DrasculaEngine::escoba() {
}
for (n = 1; n < 43; n++)
- objetos_que_tengo[n] = 0;
+ inventoryObjects[n] = 0;
for (n = 0; n < NUM_FLAGS; n++)
flags[n] = 0;
@@ -493,7 +529,7 @@ bool DrasculaEngine::escoba() {
}
for (n = 1; n < 7; n++)
- objetos_que_tengo[n] = n;
+ inventoryObjects[n] = n;
if (num_ejec == 1) {
pickObject(28);
@@ -609,11 +645,11 @@ bucles:
}
if (num_ejec == 2) {
- if ((!strcmp(num_room, "3.alg")) && (hare_x == 279) && (hare_y + alto_hare == 101))
+ if (roomNumber == 3 && (hare_x == 279) && (hare_y + alto_hare == 101))
animation_1_2();
- else if ((!strcmp(num_room, "14.alg")) && (hare_x == 214) && (hare_y + alto_hare == 121))
+ else if (roomNumber == 14 && (hare_x == 214) && (hare_y + alto_hare == 121))
lleva_al_hare(190, 130);
- else if ((!strcmp(num_room, "14.alg")) && (hare_x == 246) && (hare_y + alto_hare == 112))
+ else if (roomNumber == 14 && (hare_x == 246) && (hare_y + alto_hare == 112))
lleva_al_hare(190, 130);
}
@@ -633,20 +669,20 @@ bucles:
if (menu_scr == 0 && lleva_objeto == 1)
comprueba_objetos();
- if (boton_dch == 1 && menu_scr == 1) {
+ if (button_dch == 1 && menu_scr == 1) {
delay(100);
if (num_ejec == 2)
loadPic(fondo_y_menu);
else
loadPic("99.alg");
decompressPic(dir_hare_fondo, 1);
- setPalette((byte *)&palJuego);
+ setPalette((byte *)&gamePalette);
menu_scr = 0;
espera_soltar();
if (num_ejec != 3)
cont_sv = 0;
}
- if (boton_dch == 1 && menu_scr == 0) {
+ if (button_dch == 1 && menu_scr == 0) {
delay(100);
hare_se_mueve = 0;
if (sentido_hare == 2)
@@ -667,25 +703,25 @@ bucles:
cont_sv = 0;
}
- if (boton_izq == 1 && menu_bar == 1) {
+ if (button_izq == 1 && menu_bar == 1) {
delay(100);
elige_en_barra();
if (num_ejec != 3)
cont_sv = 0;
- } else if (boton_izq == 1 && lleva_objeto == 0) {
+ } else if (button_izq == 1 && lleva_objeto == 0) {
delay(100);
if (comprueba1())
return true;
if (num_ejec != 3)
cont_sv = 0;
- } else if (boton_izq == 1 && lleva_objeto == 1) {
+ } else if (button_izq == 1 && lleva_objeto == 1) {
if (comprueba2())
return true;
if (num_ejec != 3)
cont_sv = 0;
}
- if (y_raton < 24 && menu_scr == 0)
+ if (mouseY < 24 && menu_scr == 0)
menu_bar = 1;
else
menu_bar = 0;
@@ -746,7 +782,7 @@ bucles:
return false;
if (num_ejec != 3)
cont_sv = 0;
- } else if (num_ejec == 6 && key == Common::KEYCODE_0 && !strcmp(num_room, "61.alg")) {
+ } else if (num_ejec == 6 && key == Common::KEYCODE_0 && roomNumber == 61) {
loadPic("alcbar.alg");
decompressPic(dir_dibujo1, 255);
} else if (cont_sv == 1500) {
@@ -780,32 +816,29 @@ void DrasculaEngine::pickObject(int objeto) {
void DrasculaEngine::chooseObject(int objeto) {
if (num_ejec == 5) {
- if (lleva_objeto == 1 && menu_scr == 0 && objeto_que_lleva != 16)
- suma_objeto(objeto_que_lleva);
+ if (lleva_objeto == 1 && menu_scr == 0 && pickedObject != 16)
+ suma_objeto(pickedObject);
} else {
if (lleva_objeto == 1 && menu_scr == 0)
- suma_objeto(objeto_que_lleva);
+ suma_objeto(pickedObject);
}
copyBackground(x1d_menu[objeto], y1d_menu[objeto], 0, 0, OBJWIDTH,OBJHEIGHT, dir_hare_fondo, dir_dibujo3);
lleva_objeto = 1;
- objeto_que_lleva = objeto;
+ pickedObject = objeto;
}
int DrasculaEngine::resta_objeto(int osj) {
- int h, q = 0;
+ int result = 1;
- for (h = 1; h < 43; h++) {
- if (objetos_que_tengo[h] == osj) {
- objetos_que_tengo[h] = 0;
- q = 1;
+ for (int h = 1; h < 43; h++) {
+ if (inventoryObjects[h] == osj) {
+ inventoryObjects[h] = 0;
+ result = 0;
break;
}
}
- if (q == 1)
- return 0;
- else
- return 1;
+ return result;
}
void DrasculaEngine::withoutVerb() {
@@ -813,11 +846,11 @@ void DrasculaEngine::withoutVerb() {
if (menu_scr == 1)
c = 0;
if (num_ejec == 5) {
- if (lleva_objeto == 1 && objeto_que_lleva != 16)
- suma_objeto(objeto_que_lleva);
+ if (lleva_objeto == 1 && pickedObject != 16)
+ suma_objeto(pickedObject);
} else {
if (lleva_objeto == 1)
- suma_objeto(objeto_que_lleva);
+ suma_objeto(pickedObject);
}
copyBackground(0, c, 0, 0, OBJWIDTH,OBJHEIGHT, dir_hare_fondo, dir_dibujo3);
@@ -852,9 +885,7 @@ static char *getLine(Common::File *fp, char *buf, int len) {
c = ~fp->readByte();
if (c == '\r')
continue;
- if (c == '\n')
- break;
- if (b - buf >= (len - 1))
+ if (c == '\n' || b - buf >= (len - 1))
break;
*b++ = c;
}
@@ -886,8 +917,7 @@ void DrasculaEngine::carga_escoba(const char *nom_fich) {
}
int size = ald->size();
getLine(ald, buffer, size);
- sscanf(buffer, "%s", num_room);
- strcat(num_room, ".alg");
+ roomNumber = atoi(buffer);
getLine(ald, buffer, size);
sscanf(buffer, "%d", &roomMusic);
@@ -1024,7 +1054,9 @@ martini:
loadPic(roomDisk);
decompressPic(dir_dibujo3, 1);
- loadPic(num_room);
+ char rm[20];
+ sprintf(rm, "%i.alg", roomNumber);
+ loadPic(rm);
decompressPic(dir_dibujo1, HALF_PAL);
copyBackground(0, 171, 0, 0, OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_dibujo3);
@@ -1056,14 +1088,14 @@ martini:
}
}
- if (!strcmp(num_room, "24.alg")) {
+ if (roomNumber == 24) {
for (l = suelo_y1 - 1; l > 74; l--) {
factor_red[l] = (int)(far - pequegnez);
pequegnez = pequegnez + chiquez;
}
}
- if (num_ejec == 5 && !strcmp(num_room, "54.alg")) {
+ if (num_ejec == 5 && roomNumber == 54) {
for (l = suelo_y1 - 1; l > 84; l--) {
factor_red[l] = (int)(far - pequegnez);
pequegnez = pequegnez + chiquez;
@@ -1101,13 +1133,13 @@ martini:
isDoor[7] = 0;
if (num_ejec == 2) {
- if (!strcmp(num_room, "14.alg") && flags[39] == 1)
+ if (roomNumber == 14 && flags[39] == 1)
roomMusic = 16;
- else if (!strcmp(num_room, "15.alg") && flags[39] == 1)
+ else if (roomNumber == 15 && flags[39] == 1)
roomMusic = 16;
- if (!strcmp(num_room, "14.alg") && flags[5] == 1)
+ if (roomNumber == 14 && flags[5] == 1)
roomMusic = 0;
- else if (!strcmp(num_room, "15.alg") && flags[5] == 1)
+ else if (roomNumber == 15 && flags[5] == 1)
roomMusic = 0;
if (previousMusic != roomMusic && roomMusic != 0)
@@ -1120,21 +1152,21 @@ martini:
}
if (num_ejec == 2) {
- if ((!strcmp(num_room, "9.alg")) || (strcmp(num_room, "2.alg")) || (!strcmp(num_room, "14.alg")) || (!strcmp(num_room, "18.alg")))
+ if (roomNumber == 9 || roomNumber == 2 || roomNumber == 14 || roomNumber == 18)
conta_ciego_vez = vez();
}
if (num_ejec == 4) {
- if (!strcmp(num_room, "26.alg"))
+ if (roomNumber == 26)
conta_ciego_vez = vez();
}
- if (num_ejec == 4 && !strcmp(num_room, "24.alg") && flags[29] == 1)
+ if (num_ejec == 4 && roomNumber == 24 && flags[29] == 1)
animation_7_4();
if (num_ejec == 5) {
- if (!strcmp(num_room, "45.alg"))
+ if (roomNumber == 45)
hare_se_ve = 0;
- if (!strcmp(num_room, "49.alg") && flags[7] == 0)
+ if (roomNumber == 49 && flags[7] == 0)
animation_4_5();
}
@@ -1190,7 +1222,7 @@ void DrasculaEngine::mueve_cursor() {
} else if (menu_scr == 0 && _color != LIGHT_GREEN)
color_abc(LIGHT_GREEN);
if (hay_nombre == 1 && menu_scr == 0)
- centra_texto(texto_nombre, x_raton, y_raton);
+ centra_texto(texto_nombre, mouseX, mouseY);
if (menu_scr == 1)
menu_sin_volcar();
else if (menu_bar == 1)
@@ -1198,8 +1230,8 @@ void DrasculaEngine::mueve_cursor() {
pos_cursor[0] = 0;
pos_cursor[1] = 0;
- pos_cursor[2] = x_raton - 20;
- pos_cursor[3] = y_raton - 17;
+ pos_cursor[2] = mouseX - 20;
+ pos_cursor[3] = mouseY - 17;
pos_cursor[4] = OBJWIDTH;
pos_cursor[5] = OBJHEIGHT;
copyRectClip(pos_cursor, dir_dibujo3, dir_zona_pantalla);
@@ -1209,8 +1241,8 @@ void DrasculaEngine::comprueba_objetos() {
int l, veo = 0;
for (l = 0; l < numRoomObjs; l++) {
- if (x_raton > x1[l] && y_raton > y1[l]
- && x_raton < x2[l] && y_raton < y2[l]
+ if (mouseX > x1[l] && mouseY > y1[l]
+ && mouseX < x2[l] && mouseY < y2[l]
&& visible[l] == 1 && isDoor[l] == 0) {
strcpy(texto_nombre, objName[l]);
hay_nombre = 1;
@@ -1219,15 +1251,15 @@ void DrasculaEngine::comprueba_objetos() {
}
if (num_ejec == 2) {
- if (x_raton > hare_x + 2 && y_raton > hare_y + 2
- && x_raton < hare_x + ancho_hare - 2 && y_raton < hare_y + alto_hare - 2) {
+ if (mouseX > hare_x + 2 && mouseY > hare_y + 2
+ && mouseX < hare_x + ancho_hare - 2 && mouseY < hare_y + alto_hare - 2) {
strcpy(texto_nombre, "hacker");
hay_nombre = 1;
veo = 1;
}
} else {
- if (x_raton > hare_x + 2 && y_raton > hare_y + 2
- && x_raton < hare_x + ancho_hare - 2 && y_raton < hare_y + alto_hare - 2 && veo == 0) {
+ if (mouseX > hare_x + 2 && mouseY > hare_y + 2
+ && mouseX < hare_x + ancho_hare - 2 && mouseY < hare_y + alto_hare - 2 && veo == 0) {
strcpy(texto_nombre, "hacker");
hay_nombre = 1;
veo = 1;
@@ -1250,7 +1282,7 @@ void DrasculaEngine::elige_en_barra() {
int n, num_verbo = -1;
for (n = 0; n < 7; n++)
- if (x_raton > x_barra[n] && x_raton < x_barra[n + 1])
+ if (mouseX > x_barra[n] && mouseX < x_barra[n + 1])
num_verbo = n;
if (num_verbo < 1)
@@ -1266,8 +1298,8 @@ bool DrasculaEngine::comprueba1() {
saca_objeto();
else {
for (l = 0; l < numRoomObjs; l++) {
- if (x_raton >= x1[l] && y_raton >= y1[l]
- && x_raton <= x2[l] && y_raton <= y2[l] && rompo == 0) {
+ if (mouseX >= x1[l] && mouseY >= y1[l]
+ && mouseX <= x2[l] && mouseY <= y2[l] && rompo == 0) {
if (sal_de_la_habitacion(l))
return true;
if (rompo == 1)
@@ -1275,13 +1307,13 @@ bool DrasculaEngine::comprueba1() {
}
}
- if (x_raton > hare_x && y_raton > hare_y
- && x_raton < hare_x + ancho_hare && y_raton < hare_y + alto_hare)
+ if (mouseX > hare_x && mouseY > hare_y
+ && mouseX < hare_x + ancho_hare && mouseY < hare_y + alto_hare)
rompo = 1;
for (l = 0; l < numRoomObjs; l++) {
- if (x_raton > x1[l] && y_raton > y1[l]
- && x_raton < x2[l] && y_raton < y2[l] && rompo == 0) {
+ if (mouseX > x1[l] && mouseY > y1[l]
+ && mouseX < x2[l] && mouseY < y2[l] && rompo == 0) {
sitio_x = sitiobj_x[l];
sitio_y = sitiobj_y[l];
sentido_final = sentidobj[l];
@@ -1292,8 +1324,8 @@ bool DrasculaEngine::comprueba1() {
}
if (rompo == 0) {
- sitio_x = x_raton;
- sitio_y = y_raton;
+ sitio_x = mouseX;
+ sitio_y = mouseY;
if (sitio_x < suelo_x1)
sitio_x = suelo_x1;
@@ -1324,8 +1356,8 @@ bool DrasculaEngine::comprueba2() {
return true;
} else {
for (l = 0; l < numRoomObjs; l++) {
- if (x_raton > x1[l] && y_raton > y1[l]
- && x_raton < x2[l] && y_raton < y2[l] && visible[l] == 1) {
+ if (mouseX > x1[l] && mouseY > y1[l]
+ && mouseX < x2[l] && mouseY < y2[l] && visible[l] == 1) {
sentido_final = sentidobj[l];
anda_a_objeto = 1;
lleva_al_hare(sitiobj_x[l], sitiobj_y[l]);
@@ -1362,20 +1394,20 @@ void DrasculaEngine::updateEvents() {
_keyPressed.keycode = Common::KEYCODE_INVALID;
break;
case Common::EVENT_MOUSEMOVE:
- x_raton = event.mouse.x;
- y_raton = event.mouse.y;
+ mouseX = event.mouse.x;
+ mouseY = event.mouse.y;
break;
case Common::EVENT_LBUTTONDOWN:
- boton_izq = 1;
+ button_izq = 1;
break;
case Common::EVENT_LBUTTONUP:
- boton_izq = 0;
+ button_izq = 0;
break;
case Common::EVENT_RBUTTONDOWN:
- boton_dch = 1;
+ button_dch = 1;
break;
case Common::EVENT_RBUTTONUP:
- boton_dch = 0;
+ button_dch = 0;
break;
case Common::EVENT_QUIT:
// TODO
@@ -1394,17 +1426,17 @@ void DrasculaEngine::elige_verbo(int verbo) {
if (menu_scr == 1)
c = 0;
if (num_ejec == 5) {
- if (lleva_objeto == 1 && objeto_que_lleva != 16)
- suma_objeto(objeto_que_lleva);
+ if (lleva_objeto == 1 && pickedObject != 16)
+ suma_objeto(pickedObject);
} else {
if (lleva_objeto == 1)
- suma_objeto(objeto_que_lleva);
+ suma_objeto(pickedObject);
}
copyBackground(OBJWIDTH * verbo, c, 0, 0, OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_dibujo3);
lleva_objeto = 1;
- objeto_que_lleva = verbo;
+ pickedObject = verbo;
}
void DrasculaEngine::mesa() {
@@ -1432,35 +1464,35 @@ void DrasculaEngine::mesa() {
MirarRaton();
- if (boton_dch == 1) {
+ if (button_dch == 1) {
delay(100);
break;
}
- if (boton_izq == 1) {
+ if (button_izq == 1) {
delay(100);
- if (x_raton > 80 && x_raton < 121) {
+ if (mouseX > 80 && mouseX < 121) {
int vol = _mixer->getVolumeForSoundType(Audio::Mixer::kPlainSoundType) / 16;
- if (y_raton < nivel_master && vol < 15)
+ if (mouseY < nivel_master && vol < 15)
vol++;
- if (y_raton > nivel_master && vol > 0)
+ if (mouseY > nivel_master && vol > 0)
vol--;
_mixer->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, vol * 16);
}
- if (x_raton > 136 && x_raton < 178) {
+ if (mouseX > 136 && mouseX < 178) {
int vol = _mixer->getVolumeForSoundType(Audio::Mixer::kSFXSoundType) / 16;
- if (y_raton < nivel_voc && vol < 15)
+ if (mouseY < nivel_voc && vol < 15)
vol++;
- if (y_raton > nivel_voc && vol > 0)
+ if (mouseY > nivel_voc && vol > 0)
vol--;
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, vol * 16);
}
- if (x_raton > 192 && x_raton < 233) {
+ if (mouseX > 192 && mouseX < 233) {
int vol = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) / 16;
- if (y_raton < nivel_cd && vol < 15)
+ if (mouseY < nivel_cd && vol < 15)
vol++;
- if (y_raton > nivel_cd && vol > 0)
+ if (mouseY > nivel_cd && vol > 0)
vol--;
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, vol * 16);
}
@@ -1473,22 +1505,24 @@ void DrasculaEngine::mesa() {
bool DrasculaEngine::saves() {
char nombres[10][23];
- char fichero[13];
+ char fichero[50];
+ char fileEpa[50];
int n, n2, num_sav = 0, y = 27;
Common::InSaveFile *sav;
clearRoom();
- if (!(sav = _saveFileMan->openForLoading("saves.epa"))) {
+ snprintf(fileEpa, 50, "%s.epa", _targetName.c_str());
+ if (!(sav = _saveFileMan->openForLoading(fileEpa))) {
Common::OutSaveFile *epa;
- if (!(epa = _saveFileMan->openForSaving("saves.epa")))
- error("Can't open saves.epa file.");
+ if (!(epa = _saveFileMan->openForSaving(fileEpa)))
+ error("Can't open %s file", fileEpa);
for (n = 0; n < NUM_SAVES; n++)
epa->writeString("*\n");
epa->finalize();
delete epa;
- if (!(sav = _saveFileMan->openForLoading("saves.epa"))) {
- error("Can't open saves.epa file.");
+ if (!(sav = _saveFileMan->openForLoading(fileEpa))) {
+ error("Can't open %s file", fileEpa);
}
}
for (n = 0; n < NUM_SAVES; n++)
@@ -1514,10 +1548,10 @@ bool DrasculaEngine::saves() {
MirarRaton();
- if (boton_izq == 1) {
+ if (button_izq == 1) {
delay(100);
for (n = 0; n < NUM_SAVES; n++) {
- if (x_raton > 115 && y_raton > y + (9 * n) && x_raton < 115 + 175 && y_raton < y + 10 + (9 * n)) {
+ if (mouseX > 115 && mouseY > y + (9 * n) && mouseX < 115 + 175 && mouseY < y + 10 + (9 * n)) {
strcpy(select, nombres[n]);
if (strcmp(select, "*"))
@@ -1526,11 +1560,11 @@ bool DrasculaEngine::saves() {
introduce_nombre();
strcpy(nombres[n], select);
if (hay_seleccion == 1) {
- sprintf(fichero, "gsave%02d", n + 1);
+ snprintf(fichero, 50, "%s%02d", _targetName.c_str(), n + 1);
para_grabar(fichero);
Common::OutSaveFile *tsav;
- if (!(tsav = _saveFileMan->openForSaving("saves.epa"))) {
- error("Can't open saves.epa file.");
+ if (!(tsav = _saveFileMan->openForSaving(fileEpa))) {
+ error("Can't open %s file", fileEpa);
}
for (n = 0; n < NUM_SAVES; n++) {
tsav->writeString(nombres[n]);
@@ -1548,13 +1582,13 @@ bool DrasculaEngine::saves() {
y = y + 9;
}
if (hay_seleccion == 1) {
- sprintf(fichero, "gsave%02d", n + 1);
+ snprintf(fichero, 50, "%s%02d", _targetName.c_str(), n + 1);
}
num_sav = n;
}
}
- if (x_raton > 117 && y_raton > 15 && x_raton < 295 && y_raton < 24 && hay_seleccion == 1) {
+ if (mouseX > 117 && mouseY > 15 && mouseX < 295 && mouseY < 24 && hay_seleccion == 1) {
introduce_nombre();
strcpy(nombres[num_sav], select);
print_abc(select, 117, 15);
@@ -1565,15 +1599,15 @@ bool DrasculaEngine::saves() {
}
}
- if (x_raton > 125 && y_raton > 123 && x_raton < 199 && y_raton < 149 && hay_seleccion == 1) {
+ if (mouseX > 125 && mouseY > 123 && mouseX < 199 && mouseY < 149 && hay_seleccion == 1) {
if (!para_cargar(fichero))
return false;
break;
- } else if (x_raton > 208 && y_raton > 123 && x_raton < 282 && y_raton < 149 && hay_seleccion == 1) {
+ } else if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149 && hay_seleccion == 1) {
para_grabar(fichero);
Common::OutSaveFile *tsav;
- if (!(tsav = _saveFileMan->openForSaving("saves.epa"))) {
- error("Can't open saves.epa file.");
+ if (!(tsav = _saveFileMan->openForSaving(fileEpa))) {
+ error("Can't open %s file", fileEpa);
}
for (n = 0; n < NUM_SAVES; n++) {
tsav->writeString(nombres[n]);
@@ -1581,7 +1615,7 @@ bool DrasculaEngine::saves() {
}
tsav->finalize();
delete tsav;
- } else if (x_raton > 168 && y_raton > 154 && x_raton < 242 && y_raton < 180)
+ } else if (mouseX > 168 && mouseY > 154 && mouseX < 242 && mouseY < 180)
break;
else if (hay_seleccion == 0) {
print_abc("elige una partida", 117, 15);
@@ -1590,10 +1624,14 @@ bool DrasculaEngine::saves() {
delay(400);
}
y = 26;
+
+ delay(10);
}
clearRoom();
- loadPic(num_room);
+ char rm[20];
+ sprintf(rm, "%i.alg", roomNumber);
+ loadPic(rm);
decompressPic(dir_dibujo1, HALF_PAL);
hay_seleccion = 0;
@@ -1602,11 +1640,11 @@ bool DrasculaEngine::saves() {
void DrasculaEngine::print_abc(const char *said, int x_pantalla, int y_pantalla) {
int pos_texto[8];
- int y_de_letra = 0, x_de_letra = 0, h, longitud;
- longitud = strlen(said);
+ int y_de_letra = 0, x_de_letra = 0, h, length;
+ length = strlen(said);
- for (h = 0; h < longitud; h++) {
- y_de_letra = Y_ABC;
+ for (h = 0; h < length; h++) {
+ y_de_letra = (_lang == kSpanish) ? Y_ABC_ESP : Y_ABC;
int c = toupper(said[h]);
if (c == 'A')
x_de_letra = X_A;
@@ -1660,10 +1698,14 @@ void DrasculaEngine::print_abc(const char *said, int x_pantalla, int y_pantalla)
x_de_letra = X_Y;
else if (c == 'Z')
x_de_letra = X_Z;
+ else if (c == '\245')
+ x_de_letra = X_GN;
+ else if (c == '\244')
+ x_de_letra = X_GN;
else if (c == 0xa7 || c == ' ')
x_de_letra = SPACE;
else {
- y_de_letra = Y_SIGNOS;
+ y_de_letra = (_lang == kSpanish) ? Y_SIGNOS_ESP : Y_SIGNOS;
if (c == '.')
x_de_letra = X_DOT;
else if (c == ',')
@@ -1672,7 +1714,7 @@ void DrasculaEngine::print_abc(const char *said, int x_pantalla, int y_pantalla)
x_de_letra = X_HYPHEN;
else if (c == '?')
x_de_letra = X_CIERRA_INTERROGACION;
- else if (c == 0xa8)
+ else if (c == '\250')
x_de_letra = X_ABRE_INTERROGACION;
// else if (c == '\'') // FIXME
// x_de_letra = SPACE; // space for now
@@ -1680,7 +1722,7 @@ void DrasculaEngine::print_abc(const char *said, int x_pantalla, int y_pantalla)
x_de_letra = X_COMILLAS;
else if (c == '!')
x_de_letra = X_CIERRA_EXCLAMACION;
- else if (c == 0xad)
+ else if (c == '\255')
x_de_letra = X_ABRE_EXCLAMACION;
else if (c == ';')
x_de_letra = X_PUNTO_Y_COMA;
@@ -1726,6 +1768,41 @@ void DrasculaEngine::print_abc(const char *said, int x_pantalla, int y_pantalla)
x_de_letra = X_N9;
else if (c == '0')
x_de_letra = X_N0;
+ else y_de_letra=Y_ACENTOS;
+
+ if (c == '\240') x_de_letra=X_A;
+ else if (c =='\202') x_de_letra = X_B;
+ else if (c =='\241') x_de_letra = X_C;
+ else if (c =='\242') x_de_letra = X_D;
+ else if (c =='\243') x_de_letra = X_E;
+ else if (c =='\205') x_de_letra = X_F;
+ else if (c =='\212') x_de_letra = X_G;
+ else if (c =='\215') x_de_letra = X_H;
+ else if (c =='\225') x_de_letra = X_I;
+ else if (c =='\227') x_de_letra = X_J;
+ else if (c =='\203') x_de_letra = X_K;
+ else if (c =='\210') x_de_letra = X_L;
+ else if (c =='\214') x_de_letra = X_M;
+ else if (c =='\223') x_de_letra = X_N;
+ else if (c =='\226') x_de_letra = X_GN;
+ else if (c =='\047') x_de_letra = X_O;
+ else if (c =='\200') x_de_letra = X_P;
+ else if (c =='\207') x_de_letra = X_P;
+ else if (c =='\265') x_de_letra = X_A;
+ else if (c =='\220') x_de_letra = X_B;
+ else if (c =='\326') x_de_letra = X_C;
+ else if (c =='\340') x_de_letra = X_D;
+ else if (c =='\351') x_de_letra = X_E;
+ else if (c =='\267') x_de_letra = X_F;
+ else if (c =='\324') x_de_letra = X_G;
+ else if (c =='\336') x_de_letra = X_H;
+ else if (c =='\343') x_de_letra = X_I;
+ else if (c =='\353') x_de_letra = X_J;
+ else if (c =='\266') x_de_letra = X_K;
+ else if (c =='\322') x_de_letra = X_L;
+ else if (c =='\327') x_de_letra = X_M;
+ else if (c =='\342') x_de_letra = X_N;
+ else if (c =='\352') x_de_letra = X_GN;
}
pos_texto[0] = x_de_letra;
@@ -1774,34 +1851,126 @@ bool DrasculaEngine::confirma_salir() {
void DrasculaEngine::salva_pantallas() {
int xr, yr;
+ byte *copia, *ghost;
+ Common::File file;
+ float coeff = 0, coeff2 = 0;
+ int count = 0;
+ int count2 = 0;
+ int tempLine[320];
+ int tempRow[200];
// FIXME: that part (*.ghost) need RE from efecto.lib file for some gfx special effect
// for now ignore
- return;
clearRoom();
loadPic("sv.alg");
decompressPic(dir_dibujo1, HALF_PAL);
- //TODO inicio_ghost();
- //TODO carga_ghost();
+
+ // inicio_ghost();
+ copia = (byte *)malloc(64000);
+ ghost = (byte *)malloc(65536);
+
+ // carga_ghost();
+ file.open("ghost.drv");
+ if (!file.isOpen())
+ error("Cannot open file ghost.drv");
+
+ file.read(ghost, 65536);
+ file.close();
MirarRaton();
- xr = x_raton;
- yr = y_raton;
+ xr = mouseX;
+ yr = mouseY;
for (;;) {
- //TODO efecto(dir_dibujo1);
+ // efecto(dir_dibujo1);
+
+ memcpy(copia, dir_dibujo1, 64000);
+ coeff += 0.1f;
+ coeff2 = coeff;
+
+ if (++count > 319)
+ count = 0;
+
+ for (int i = 0; i < 320; i++) {
+ tempLine[i] = (int)(sin(coeff2) * 16);
+ coeff2 += 0.02f;
+ if (tempLine[i] < 0)
+ tempLine[i] += 200;
+ if (tempLine[i] > 199)
+ tempLine[i] -= 200;
+ }
+
+ coeff2 = coeff;
+ for (int i = 0; i < 200; i++) {
+ tempRow[i] = (int)(sin(coeff2) * 16);
+ coeff2 += 0.02f;
+ if (tempRow[i] < 0)
+ tempRow[i] += 320;
+ if (tempRow[i] > 319)
+ tempRow[i] -= 320;
+ }
+
+ if (++count2 > 199)
+ count2 = 0;
+
+ int x1_, y1_, off1, off2;
+
+ for (int i = 0; i < 200; i++) {
+ for (int j = 0; j < 320; j++) {
+ x1_ = j + tempRow[i];
+ if (x1_ < 0)
+ x1_ += 320;
+ if (x1_ > 319)
+ x1_ -= 319;
+
+ y1_ = i + count2;
+ if (y1_ < 0)
+ y1_ += 200;
+ if (y1_ > 199)
+ y1_ -= 200;
+
+ off1 = 320 * y1_ + x1_;
+
+ x1_ = j + count;
+ if (x1_ < 0)
+ x1_ += 320;
+ if (x1_ > 319)
+ x1_ -= 320;
+
+ y1_ = i + tempLine[j];
+ if (y1_ < 0)
+ y1_ += 200;
+ if (y1_ > 199)
+ y1_ -= 200;
+ off2 = 320 * y1_ + x1_;
+
+ VGA[320 * i + j] = ghost[dir_dibujo1[off2] + (copia[off1] << 8)];
+ }
+ }
+ _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200);
+ _system->updateScreen();
+
+ _system->delayMillis(20);
+
+ // end of efecto()
+
MirarRaton();
- if (boton_dch == 1 || boton_izq == 1)
+ if (button_dch == 1 || button_izq == 1)
break;
- if (x_raton != xr)
+ if (mouseX != xr)
break;
- if (y_raton != yr)
+ if (mouseY != yr)
break;
}
- //TODO fin_ghost();
- loadPic(num_room);
+ // fin_ghost();
+ free(copia);
+ free(ghost);
+
+ char rm[20];
+ sprintf(rm, "%i.alg", roomNumber);
+ loadPic(rm);
decompressPic(dir_dibujo1, HALF_PAL);
}
@@ -1823,7 +1992,7 @@ void DrasculaEngine::FundeDelNegro(int VelocidadDeFundido) {
for (fundido = 0; fundido < 64; fundido++) {
for (color = 0; color < 256; color++) {
for (componente = 0; componente < 3; componente++) {
- palFundido[color][componente] = LimitaVGA(palJuego[color][componente] - 63 + fundido);
+ palFundido[color][componente] = LimitaVGA(gamePalette[color][componente] - 63 + fundido);
}
}
pause(VelocidadDeFundido);
@@ -1836,48 +2005,48 @@ void DrasculaEngine::color_abc(int cl) {
_color = cl;
if (cl == 0) {
- palJuego[254][0] = 0;
- palJuego[254][1] = 0;
- palJuego[254][2] = 0;
+ gamePalette[254][0] = 0;
+ gamePalette[254][1] = 0;
+ gamePalette[254][2] = 0;
} else if (cl == 1) {
- palJuego[254][0] = 0x10;
- palJuego[254][1] = 0x3E;
- palJuego[254][2] = 0x28;
+ gamePalette[254][0] = 0x10;
+ gamePalette[254][1] = 0x3E;
+ gamePalette[254][2] = 0x28;
} else if (cl == 3) {
- palJuego[254][0] = 0x16;
- palJuego[254][1] = 0x3F;
- palJuego[254][2] = 0x16;
+ gamePalette[254][0] = 0x16;
+ gamePalette[254][1] = 0x3F;
+ gamePalette[254][2] = 0x16;
} else if (cl == 4) {
- palJuego[254][0] = 0x9;
- palJuego[254][1] = 0x3F;
- palJuego[254][2] = 0x12;
+ gamePalette[254][0] = 0x9;
+ gamePalette[254][1] = 0x3F;
+ gamePalette[254][2] = 0x12;
} else if (cl == 5) {
- palJuego[254][0] = 0x3F;
- palJuego[254][1] = 0x3F;
- palJuego[254][2] = 0x15;
+ gamePalette[254][0] = 0x3F;
+ gamePalette[254][1] = 0x3F;
+ gamePalette[254][2] = 0x15;
} else if (cl == 7) {
- palJuego[254][0] = 0x38;
- palJuego[254][1] = 0;
- palJuego[254][2] = 0;
+ gamePalette[254][0] = 0x38;
+ gamePalette[254][1] = 0;
+ gamePalette[254][2] = 0;
} else if (cl == 8) {
- palJuego[254][0] = 0x3F;
- palJuego[254][1] = 0x27;
- palJuego[254][2] = 0x0B;
+ gamePalette[254][0] = 0x3F;
+ gamePalette[254][1] = 0x27;
+ gamePalette[254][2] = 0x0B;
} else if (cl == 9) {
- palJuego[254][0] = 0x2A;
- palJuego[254][1] = 0;
- palJuego[254][2] = 0x2A;
+ gamePalette[254][0] = 0x2A;
+ gamePalette[254][1] = 0;
+ gamePalette[254][2] = 0x2A;
} else if (cl == 10) {
- palJuego[254][0] = 0x30;
- palJuego[254][1] = 0x30;
- palJuego[254][2] = 0x30;
+ gamePalette[254][0] = 0x30;
+ gamePalette[254][1] = 0x30;
+ gamePalette[254][2] = 0x30;
} else if (cl == 11) {
- palJuego[254][0] = 98;
- palJuego[254][1] = 91;
- palJuego[254][2] = 100;
+ gamePalette[254][0] = 98;
+ gamePalette[254][1] = 91;
+ gamePalette[254][2] = 100;
};
- setPalette((byte *)&palJuego);
+ setPalette((byte *)&gamePalette);
}
char DrasculaEngine::LimitaVGA(char valor) {
@@ -1901,10 +2070,7 @@ void DrasculaEngine::centra_texto(const char *mensaje, int x_texto, int y_texto)
ya = 1;
strcpy(m1, mensaje);
- if (x_texto < 60)
- x_texto = 60;
- if (x_texto > 255)
- x_texto = 255;
+ x_texto = CLIP<int>(x_texto, 60, 255);
x_texto1 = x_texto;
@@ -1953,7 +2119,7 @@ imprimir:
}
}
-void DrasculaEngine::comienza_sound(const char *fichero) {
+void DrasculaEngine::playSound(const char *fichero) {
if (hay_sb == 1) {
sku = new Common::File;
sku->open(fichero);
@@ -1966,7 +2132,7 @@ void DrasculaEngine::comienza_sound(const char *fichero) {
ctvd_output(sku);
}
-void DrasculaEngine::anima(const char *animation, int FPS) {
+bool DrasculaEngine::anima(const char *animation, int FPS) {
Common::File FileIn;
unsigned j;
int NFrames = 1;
@@ -2017,9 +2183,11 @@ void DrasculaEngine::anima(const char *animation, int FPS) {
free(AuxBuffLast);
free(AuxBuffDes);
FileIn.close();
+
+ return ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE));
}
-void DrasculaEngine::animafin_sound_corte() {
+void DrasculaEngine::animastopSound_corte() {
if (hay_sb == 1) {
ctvd_stop();
delete sku;
@@ -2037,7 +2205,7 @@ void DrasculaEngine::FundeAlNegro(int VelocidadDeFundido) {
for (fundido = 63; fundido >= 0; fundido--) {
for (color = 0; color < 256; color++) {
for (componente = 0; componente < 3; componente++) {
- palFundido[color][componente] = LimitaVGA(palJuego[color][componente] - 63 + fundido);
+ palFundido[color][componente] = LimitaVGA(gamePalette[color][componente] - 63 + fundido);
}
}
pause(VelocidadDeFundido);
@@ -2144,7 +2312,7 @@ comienza:
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
-void DrasculaEngine::fin_sound() {
+void DrasculaEngine::stopSound() {
delay(1);
if (hay_sb == 1) {
@@ -2202,7 +2370,7 @@ bool DrasculaEngine::carga_partida(const char *nom_game) {
sentido_hare = sav->readSint32LE();
for (l = 1; l < 43; l++) {
- objetos_que_tengo[l] = sav->readSint32LE();
+ inventoryObjects[l] = sav->readSint32LE();
}
for (l = 0; l < NUM_FLAGS; l++) {
@@ -2210,7 +2378,7 @@ bool DrasculaEngine::carga_partida(const char *nom_game) {
}
lleva_objeto = sav->readSint32LE();
- objeto_que_lleva = sav->readSint32LE();
+ pickedObject = sav->readSint32LE();
hay_que_load = 0;
return true;
@@ -2220,87 +2388,51 @@ void DrasculaEngine::puertas_cerradas(int l) {
if (num_ejec == 1 || num_ejec == 3 || num_ejec == 5 || num_ejec == 6)
return;
else if (num_ejec == 2) {
- if (num_obj[l] == 138 && flags[0] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 138 && flags[0] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 136 && flags[8] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 136 && flags[8] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 156 && flags[16] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 156 && flags[16] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 163 && flags[17] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 163 && flags[17] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 177 && flags[15] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 177 && flags[15] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 175 && flags[40] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 175 && flags[40] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 173 && flags[36] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 173 && flags[36] == 1)
- isDoor[l] = 1;
+ if (num_obj[l] == 138)
+ isDoor[l] = flags[0];
+ else if (num_obj[l] == 136)
+ isDoor[l] = flags[8];
+ else if (num_obj[l] == 156)
+ isDoor[l] = flags[16];
+ else if (num_obj[l] == 163)
+ isDoor[l] = flags[17];
+ else if (num_obj[l] == 177)
+ isDoor[l] = flags[15];
+ else if (num_obj[l] == 175)
+ isDoor[l] = flags[40];
+ else if (num_obj[l] == 173)
+ isDoor[l] = flags[36];
} else if (num_ejec == 4) {
if (num_obj[l] == 101 && flags[0] == 0)
isDoor[l] = 0;
else if (num_obj[l] == 101 && flags[0] == 1 && flags[28] == 1)
isDoor[l] = 1;
- else if (num_obj[l] == 103 && flags[0] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 103 && flags[0] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 104 && flags[1] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 104 && flags[1] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 105 && flags[1] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 105 && flags[1] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 106 && flags[2] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 106 && flags[2] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 107 && flags[2] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 107 && flags[2] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 110 && flags[6] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 110 && flags[6] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 114 && flags[4] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 114 && flags[4] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 115 && flags[4] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 115 && flags[4] == 1)
- isDoor[l] = 1;
+ else if (num_obj[l] == 103)
+ isDoor[l] = flags[0];
+ else if (num_obj[l] == 104)
+ isDoor[l] = flags[1];
+ else if (num_obj[l] == 105)
+ isDoor[l] = flags[1];
+ else if (num_obj[l] == 106)
+ isDoor[l] = flags[2];
+ else if (num_obj[l] == 107)
+ isDoor[l] = flags[2];
+ else if (num_obj[l] == 110)
+ isDoor[l] = flags[6];
+ else if (num_obj[l] == 114)
+ isDoor[l] = flags[4];
+ else if (num_obj[l] == 115)
+ isDoor[l] = flags[4];
else if (num_obj[l] == 116 && flags[5] == 0)
isDoor[l] = 0;
else if (num_obj[l] == 116 && flags[5] == 1 && flags[23] == 1)
isDoor[l] = 1;
- else if (num_obj[l] == 117 && flags[5] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 117 && flags[5] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 120 && flags[8] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 120 && flags[8] == 1)
- isDoor[l] = 1;
- else if (num_obj[l] == 122 && flags[7] == 0)
- isDoor[l] = 0;
- else if (num_obj[l] == 122 && flags[7] == 1)
- isDoor[l] = 1;
+ else if (num_obj[l] == 117)
+ isDoor[l] = flags[5];
+ else if (num_obj[l] == 120)
+ isDoor[l] = flags[8];
+ else if (num_obj[l] == 122)
+ isDoor[l] = flags[7];
}
}
@@ -2309,7 +2441,7 @@ void DrasculaEngine::color_hare() {
for (color = 235; color < 253; color++) {
for (componente = 0; componente < 3; componente++) {
- palJuego[color][componente] = palHare[color][componente];
+ gamePalette[color][componente] = palHare[color][componente];
}
}
updatePalette();
@@ -2322,7 +2454,7 @@ void DrasculaEngine::funde_hare(int oscuridad) {
for (fundido = oscuridad; fundido >= 0; fundido--) {
for (color = 235; color < 253; color++) {
for (componente = 0; componente < 3; componente++)
- palJuego[color][componente] = LimitaVGA(palJuego[color][componente] - 8 + fundido);
+ gamePalette[color][componente] = LimitaVGA(gamePalette[color][componente] - 8 + fundido);
}
}
@@ -2334,7 +2466,7 @@ void DrasculaEngine::paleta_hare_claro() {
for (color = 235; color < 253; color++) {
for (componente = 0; componente < 3; componente++)
- palHareClaro[color][componente] = palJuego[color][componente];
+ palHareClaro[color][componente] = gamePalette[color][componente];
}
}
@@ -2343,7 +2475,7 @@ void DrasculaEngine::paleta_hare_oscuro() {
for (color = 235; color < 253; color++) {
for (componente = 0; componente < 3; componente++)
- palHareOscuro[color][componente] = palJuego[color][componente];
+ palHareOscuro[color][componente] = gamePalette[color][componente];
}
}
@@ -2352,7 +2484,7 @@ void DrasculaEngine::hare_claro() {
for (color = 235; color < 253; color++) {
for (componente = 0; componente < 3; componente++)
- palJuego[color][componente] = palHareClaro[color][componente];
+ gamePalette[color][componente] = palHareClaro[color][componente];
}
updatePalette();
@@ -2366,26 +2498,26 @@ void DrasculaEngine::empieza_andar() {
if (num_ejec == 2) {
if ((sitio_x < hare_x) && (sitio_y <= (hare_y + alto_hare)))
- cuadrante_1();
+ quadrant_1();
else if ((sitio_x < hare_x) && (sitio_y > (hare_y + alto_hare)))
- cuadrante_3();
+ quadrant_3();
else if ((sitio_x > hare_x + ancho_hare) && (sitio_y <= (hare_y + alto_hare)))
- cuadrante_2();
+ quadrant_2();
else if ((sitio_x > hare_x + ancho_hare) && (sitio_y > (hare_y + alto_hare)))
- cuadrante_4();
+ quadrant_4();
else if (sitio_y < hare_y + alto_hare)
anda_parriba();
else if (sitio_y > hare_y + alto_hare)
anda_pabajo();
} else {
if ((sitio_x < hare_x + ancho_hare / 2 ) && (sitio_y <= (hare_y + alto_hare)))
- cuadrante_1();
+ quadrant_1();
else if ((sitio_x < hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare)))
- cuadrante_3();
+ quadrant_3();
else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y <= (hare_y + alto_hare)))
- cuadrante_2();
+ quadrant_2();
else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare)))
- cuadrante_4();
+ quadrant_4();
else
hare_se_mueve = 0;
}
@@ -2538,29 +2670,29 @@ void DrasculaEngine::menu_sin_volcar() {
strcpy(texto_icono, iconName[x]);
for (n = 1; n < 43; n++) {
- h = objetos_que_tengo[n];
+ h = inventoryObjects[n];
if (h != 0) {
if (num_ejec == 6)
- copyBackground(x_pol[n], y_pol[n], x_obj[n], y_obj[n],
+ copyBackground(x_pol[n], y_pol[n], itemLocations[n].x, itemLocations[n].y,
OBJWIDTH, OBJHEIGHT, dir_mesa, dir_zona_pantalla);
else
- copyBackground(x_pol[n], y_pol[n], x_obj[n], y_obj[n],
+ copyBackground(x_pol[n], y_pol[n], itemLocations[n].x, itemLocations[n].y,
OBJWIDTH, OBJHEIGHT, dir_hare_frente, dir_zona_pantalla);
}
- copyRect(x1d_menu[h], y1d_menu[h], x_obj[n], y_obj[n],
+ copyRect(x1d_menu[h], y1d_menu[h], itemLocations[n].x, itemLocations[n].y,
OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_zona_pantalla);
}
if (x < 7)
- print_abc(texto_icono, x_obj[x] - 2, y_obj[x] - 7);
+ print_abc(texto_icono, itemLocations[x].x - 2, itemLocations[x].y - 7);
}
void DrasculaEngine::barra_menu() {
int n, sobre_verbo = 1;
for (n = 0; n < 7; n++) {
- if (x_raton > x_barra[n] && x_raton < x_barra[n + 1])
+ if (mouseX > x_barra[n] && mouseX < x_barra[n + 1])
sobre_verbo = 0;
copyRect(OBJWIDTH * n, OBJHEIGHT * sobre_verbo, x_barra[n], 2,
OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_zona_pantalla);
@@ -2575,8 +2707,8 @@ void DrasculaEngine::saca_objeto() {
for (n = 1; n < 43; n++){
if (sobre_que_objeto() == n) {
- h = objetos_que_tengo[n];
- objetos_que_tengo[n] = 0;
+ h = inventoryObjects[n];
+ inventoryObjects[n] = 0;
if (h != 0)
lleva_objeto = 1;
}
@@ -2737,19 +2869,19 @@ bool DrasculaEngine::sal_de_la_habitacion(int l) {
bool DrasculaEngine::coge_objeto() {
int h, n;
- h = objeto_que_lleva;
+ h = pickedObject;
comprueba_flags = 1;
updateRoom();
menu_sin_volcar();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- if (objeto_que_lleva < 7)
+ if (pickedObject < 7)
goto usando_verbos;
for (n = 1; n < 43; n++) {
- if (sobre_que_objeto() == n && objetos_que_tengo[n] == 0) {
- objetos_que_tengo[n] = h;
+ if (sobre_que_objeto() == n && inventoryObjects[n] == 0) {
+ inventoryObjects[n] = h;
lleva_objeto = 0;
comprueba_flags = 0;
}
@@ -2773,400 +2905,401 @@ bool DrasculaEngine::banderas(int fl) {
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- hay_respuesta = 1;
+ hay_answer = 1;
if (menu_scr == 1) {
if (num_ejec == 1) {
- if (objeto_que_lleva == LOOK && fl == 28)
+ if (pickedObject == kVerbLook && fl == 28)
talk(_text[_lang][328], "328.als");
} else if (num_ejec == 2) {
- if ((objeto_que_lleva == LOOK && fl == 22 && flags[23] == 0)
- || (objeto_que_lleva == OPEN && fl == 22 && flags[23] == 0)) {
+ if ((pickedObject == kVerbLook && fl == 22 && flags[23] == 0)
+ || (pickedObject == kVerbOpen && fl == 22 && flags[23] == 0)) {
talk(_text[_lang][164], "164.als");
flags[23] = 1;
withoutVerb();
suma_objeto(7);
suma_objeto(18);
- } else if (objeto_que_lleva == LOOK && fl == 22 && flags[23] == 1)
+ } else if (pickedObject == kVerbLook && fl == 22 && flags[23] == 1)
talk(_text[_lang][307], "307.als");
- else if (objeto_que_lleva == LOOK && fl == 28)
+ else if (pickedObject == kVerbLook && fl == 28)
talk(_text[_lang][328], "328.als");
- else if (objeto_que_lleva == LOOK && fl == 7)
+ else if (pickedObject == kVerbLook && fl == 7)
talk(_text[_lang][143], "143.als");
- else if (objeto_que_lleva == TALK && fl == 7)
+ else if (pickedObject == kVerbTalk && fl == 7)
talk(_text[_lang][144], "144.als");
- else if (objeto_que_lleva == LOOK && fl == 8)
+ else if (pickedObject == kVerbLook && fl == 8)
talk(_text[_lang][145], "145.als");
- else if (objeto_que_lleva == TALK && fl == 8)
+ else if (pickedObject == kVerbTalk && fl == 8)
talk(_text[_lang][146], "146.als");
- else if (objeto_que_lleva == LOOK && fl == 9)
+ else if (pickedObject == kVerbLook && fl == 9)
talk(_text[_lang][147], "147.als");
- else if (objeto_que_lleva == TALK && fl == 9)
+ else if (pickedObject == kVerbTalk && fl == 9)
talk(_text[_lang][148], "148.als");
- else if (objeto_que_lleva == LOOK && fl == 10)
+ else if (pickedObject == kVerbLook && fl == 10)
talk(_text[_lang][151], "151.als");
- else if (objeto_que_lleva == LOOK && fl == 11)
+ else if (pickedObject == kVerbLook && fl == 11)
talk(_text[_lang][152], "152.als");
- else if (objeto_que_lleva == TALK && fl == 11)
+ else if (pickedObject == kVerbTalk && fl == 11)
talk(_text[_lang][153], "153.als");
- else if (objeto_que_lleva == LOOK && fl == 12)
+ else if (pickedObject == kVerbLook && fl == 12)
talk(_text[_lang][154], "154.als");
- else if (objeto_que_lleva == LOOK && fl == 13)
+ else if (pickedObject == kVerbLook && fl == 13)
talk(_text[_lang][155], "155.als");
- else if (objeto_que_lleva == LOOK && fl == 14)
+ else if (pickedObject == kVerbLook && fl == 14)
talk(_text[_lang][157], "157.als");
- else if (objeto_que_lleva == LOOK && fl == 15)
+ else if (pickedObject == kVerbLook && fl == 15)
talk(_text[_lang][58], "58.als");
- else if (objeto_que_lleva == LOOK && fl == 16)
+ else if (pickedObject == kVerbLook && fl == 16)
talk(_text[_lang][158], "158.als");
- else if (objeto_que_lleva == LOOK && fl == 17)
+ else if (pickedObject == kVerbLook && fl == 17)
talk(_text[_lang][159], "159.als");
- else if (objeto_que_lleva == LOOK && fl == 18)
+ else if (pickedObject == kVerbLook && fl == 18)
talk(_text[_lang][160], "160.als");
- else if (objeto_que_lleva == LOOK && fl == 19)
+ else if (pickedObject == kVerbLook && fl == 19)
talk(_text[_lang][161], "161.als");
- else if (objeto_que_lleva == LOOK && fl == 20)
+ else if (pickedObject == kVerbLook && fl == 20)
talk(_text[_lang][162], "162.als");
- else if (objeto_que_lleva == LOOK && fl == 23)
+ else if (pickedObject == kVerbLook && fl == 23)
talk(_text[_lang][152], "152.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 3) {
- if (objeto_que_lleva == LOOK && fl == 22)
+ if (pickedObject == kVerbLook && fl == 22)
talk(_text[_lang][307], "307.als");
- else if (objeto_que_lleva == LOOK && fl == 28)
+ else if (pickedObject == kVerbLook && fl == 28)
talk(_text[_lang][328], "328.als");
- else if (objeto_que_lleva == LOOK && fl == 7)
+ else if (pickedObject == kVerbLook && fl == 7)
talk(_text[_lang][143], "143.als");
- else if (objeto_que_lleva == TALK && fl == 7)
+ else if (pickedObject == kVerbTalk && fl == 7)
talk(_text[_lang][144], "144.als");
- else if (objeto_que_lleva == LOOK && fl == 8)
+ else if (pickedObject == kVerbLook && fl == 8)
talk(_text[_lang][145], "145.als");
- else if (objeto_que_lleva == TALK && fl == 8)
+ else if (pickedObject == kVerbTalk && fl == 8)
talk(_text[_lang][146], "146.als");
- else if (objeto_que_lleva == LOOK && fl == 9)
+ else if (pickedObject == kVerbLook && fl == 9)
talk(_text[_lang][147], "147.als");
- else if (objeto_que_lleva == TALK && fl == 9)
+ else if (pickedObject == kVerbTalk && fl == 9)
talk(_text[_lang][148], "148.als");
- else if (objeto_que_lleva == LOOK && fl == 10)
+ else if (pickedObject == kVerbLook && fl == 10)
talk(_text[_lang][151], "151.als");
- else if (objeto_que_lleva == LOOK && fl == 11)
+ else if (pickedObject == kVerbLook && fl == 11)
talk(_text[_lang][152], "152.als");
- else if (objeto_que_lleva == TALK && fl == 11)
+ else if (pickedObject == kVerbTalk && fl == 11)
talk(_text[_lang][153], "153.als");
- else if (objeto_que_lleva == LOOK && fl == 12)
+ else if (pickedObject == kVerbLook && fl == 12)
talk(_text[_lang][154], "154.als");
- else if (objeto_que_lleva == LOOK && fl == 13)
+ else if (pickedObject == kVerbLook && fl == 13)
talk(_text[_lang][155], "155.als");
- else if (objeto_que_lleva == LOOK && fl == 14)
+ else if (pickedObject == kVerbLook && fl == 14)
talk(_text[_lang][157], "157.als");
- else if (objeto_que_lleva == LOOK && fl == 15)
+ else if (pickedObject == kVerbLook && fl == 15)
talk(_text[_lang][58], "58.als");
- else if (objeto_que_lleva == LOOK && fl == 16)
+ else if (pickedObject == kVerbLook && fl == 16)
talk(_text[_lang][158], "158.als");
- else if (objeto_que_lleva == LOOK && fl == 17)
+ else if (pickedObject == kVerbLook && fl == 17)
talk(_text[_lang][159], "159.als");
- else if (objeto_que_lleva == LOOK && fl == 18)
+ else if (pickedObject == kVerbLook && fl == 18)
talk(_text[_lang][160], "160.als");
- else if (objeto_que_lleva == LOOK && fl == 19)
+ else if (pickedObject == kVerbLook && fl == 19)
talk(_text[_lang][161], "161.als");
- else if (objeto_que_lleva == LOOK && fl == 20)
+ else if (pickedObject == kVerbLook && fl == 20)
talk(_text[_lang][162], "162.als");
- else if (objeto_que_lleva == LOOK && fl == 23)
+ else if (pickedObject == kVerbLook && fl == 23)
talk(_text[_lang][152], "152.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 4) {
- if ((objeto_que_lleva == 18 && fl == 19) || (objeto_que_lleva == 19 && fl == 18)) {
+ if ((pickedObject == 18 && fl == 19) || (pickedObject == 19 && fl == 18)) {
withoutVerb();
chooseObject(21);
resta_objeto(18);
resta_objeto(19);
- } else if ((objeto_que_lleva == 14 && fl == 19) || (objeto_que_lleva == 19 && fl == 14))
+ } else if ((pickedObject == 14 && fl == 19) || (pickedObject == 19 && fl == 14))
talk(_text[_lang][484], "484.als");
- else if (objeto_que_lleva == LOOK && fl == 28)
+ else if (pickedObject == kVerbLook && fl == 28)
talk(_text[_lang][328], "328.als");
- else if (objeto_que_lleva == LOOK && fl == 7)
+ else if (pickedObject == kVerbLook && fl == 7)
talk(_text[_lang][478], "478.als");
- else if (objeto_que_lleva == LOOK && fl == 8)
+ else if (pickedObject == kVerbLook && fl == 8)
talk(_text[_lang][480], "480.als");
- else if (objeto_que_lleva == LOOK && fl == 9) {
+ else if (pickedObject == kVerbLook && fl == 9) {
talk(_text[_lang][482], "482.als");
talk(_text[_lang][483], "483.als");
- } else if (objeto_que_lleva == LOOK && fl == 10)
+ } else if (pickedObject == kVerbLook && fl == 10)
talk(_text[_lang][485], "485.als");
- else if (objeto_que_lleva == LOOK && fl == 11)
+ else if (pickedObject == kVerbLook && fl == 11)
talk(_text[_lang][488], "488.als");
- else if (objeto_que_lleva == LOOK && fl == 12)
+ else if (pickedObject == kVerbLook && fl == 12)
talk(_text[_lang][486], "486.als");
- else if (objeto_que_lleva == LOOK && fl == 13)
+ else if (pickedObject == kVerbLook && fl == 13)
talk(_text[_lang][490], "490.als");
- else if (objeto_que_lleva == LOOK && fl == 14)
+ else if (pickedObject == kVerbLook && fl == 14)
talk(_text[_lang][122], "122.als");
- else if (objeto_que_lleva == LOOK && fl == 15)
+ else if (pickedObject == kVerbLook && fl == 15)
talk(_text[_lang][117], "117.als");
- else if (objeto_que_lleva == TALK && fl == 15)
+ else if (pickedObject == kVerbTalk && fl == 15)
talk(_text[_lang][118], "118.als");
- else if (objeto_que_lleva == OPEN && fl == 15)
+ else if (pickedObject == kVerbOpen && fl == 15)
talk(_text[_lang][119], "119.als");
- else if (objeto_que_lleva == LOOK && fl == 16)
+ else if (pickedObject == kVerbLook && fl == 16)
talk(_text[_lang][491], "491.als");
- else if (objeto_que_lleva == LOOK && fl == 17)
+ else if (pickedObject == kVerbLook && fl == 17)
talk(_text[_lang][478], "478.als");
- else if (objeto_que_lleva == LOOK && fl == 18)
+ else if (pickedObject == kVerbLook && fl == 18)
talk(_text[_lang][493], "493.als");
- else if (objeto_que_lleva == LOOK && fl == 19) {
+ else if (pickedObject == kVerbLook && fl == 19) {
talk(_text[_lang][494], "494.als");
talk(_text[_lang][495], "495.als");
- } else if (objeto_que_lleva == LOOK && fl == 20)
+ } else if (pickedObject == kVerbLook && fl == 20)
talk(_text[_lang][162], "162.als");
- else if (objeto_que_lleva == LOOK && fl == 21)
+ else if (pickedObject == kVerbLook && fl == 21)
talk(_text[_lang][496], "496.als");
- else if (objeto_que_lleva == LOOK && fl == 22)
+ else if (pickedObject == kVerbLook && fl == 22)
talk(_text[_lang][161], "161.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 5) {
- if (objeto_que_lleva == LOOK && fl == 28)
+ if (pickedObject == kVerbLook && fl == 28)
talk(_text[_lang][328], "328.als");
- else if (objeto_que_lleva == LOOK && fl == 7)
+ else if (pickedObject == kVerbLook && fl == 7)
talk(_text[_lang][478],"478.als");
- else if (objeto_que_lleva == LOOK && fl == 8)
+ else if (pickedObject == kVerbLook && fl == 8)
talk(_text[_lang][120], "120.als");
- else if (objeto_que_lleva == LOOK && fl == 9) {
+ else if (pickedObject == kVerbLook && fl == 9) {
talk(_text[_lang][482], "482.als");
talk(_text[_lang][483], "483.als");
- } else if (objeto_que_lleva == LOOK && fl == 11)
+ } else if (pickedObject == kVerbLook && fl == 11)
talk(_text[_lang][488], "488.als");
- else if (objeto_que_lleva == LOOK && fl == 13)
+ else if (pickedObject == kVerbLook && fl == 13)
talk(_text[_lang][490], "490.als");
- else if (objeto_que_lleva == LOOK && fl == 14)
+ else if (pickedObject == kVerbLook && fl == 14)
talk(_text[_lang][121], "121.als");
- else if (objeto_que_lleva == LOOK && fl == 15)
+ else if (pickedObject == kVerbLook && fl == 15)
talk(_text[_lang][117], "117.als");
- else if (objeto_que_lleva == TALK && fl == 15)
+ else if (pickedObject == kVerbTalk && fl == 15)
talk(_text[_lang][118], "118.als");
- else if (objeto_que_lleva == OPEN && fl == 15)
+ else if (pickedObject == kVerbOpen && fl == 15)
talk(_text[_lang][119], "119.als");
- else if (objeto_que_lleva == LOOK && fl == 17)
+ else if (pickedObject == kVerbLook && fl == 17)
talk(_text[_lang][478], "478.als");
- else if (objeto_que_lleva == LOOK && fl == 20)
+ else if (pickedObject == kVerbLook && fl == 20)
talk(_text[_lang][162], "162.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 6) {
- if (objeto_que_lleva == LOOK && fl == 28)
+ if (pickedObject == kVerbLook && fl == 28)
talk(_text[_lang][328], "328.als");
- else if (objeto_que_lleva == LOOK && fl == 9) {
+ else if (pickedObject == kVerbLook && fl == 9) {
talk(_text[_lang][482], "482.als");
talk(_text[_lang][483], "483.als");
- } else if (objeto_que_lleva == LOOK && fl == 20)
+ } else if (pickedObject == kVerbLook && fl == 20)
talk(_text[_lang][123], "123.als");
- else if (objeto_que_lleva == LOOK && fl == 21)
+ else if (pickedObject == kVerbLook && fl == 21)
talk(_text[_lang][441], "441.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
} else {
if (num_ejec == 1) {
- if (objeto_que_lleva == LOOK && fl == 50)
+ if (pickedObject == kVerbLook && fl == 50)
talk(_text[_lang][308], "308.als");
- else if (objeto_que_lleva == OPEN && fl == 50)
+ else if (pickedObject == kVerbOpen && fl == 50)
talk(_text[_lang][310], "310.als");
- else if (objeto_que_lleva == CLOSE && fl == 50)
+ else if (pickedObject == kVerbClose && fl == 50)
talk(_text[_lang][311], "311.als");
- else if (objeto_que_lleva == MOVE && fl == 50)
+ else if (pickedObject == kVerbMove && fl == 50)
talk(_text[_lang][312], "312.als");
- else if (objeto_que_lleva == PICK && fl == 50)
+ else if (pickedObject == kVerbPick && fl == 50)
talk(_text[_lang][313], "313.als");
- else if (objeto_que_lleva == TALK && fl == 50)
+ else if (pickedObject == kVerbTalk && fl == 50)
talk(_text[_lang][314], "314.als");
- else if (!strcmp(num_room, "62.alg"))
+ else if (roomNumber == 62)
room_62(fl);
- else if (!strcmp(num_room, "63.alg"))
+ else if (roomNumber == 63)
room_63(fl);
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 2) {
- if (objeto_que_lleva == LOOK && fl == 50)
+ if (pickedObject == kVerbLook && fl == 50)
talk(_text[_lang][308], "308.als");
- else if (objeto_que_lleva == OPEN && fl == 50)
+ else if (pickedObject == kVerbOpen && fl == 50)
talk(_text[_lang][310], "310.als");
- else if (objeto_que_lleva == CLOSE && fl == 50)
+ else if (pickedObject == kVerbClose && fl == 50)
talk(_text[_lang][311], "311.als");
- else if (objeto_que_lleva == MOVE && fl == 50)
+ else if (pickedObject == kVerbMove && fl == 50)
talk(_text[_lang][312], "312.als");
- else if (objeto_que_lleva == PICK && fl == 50)
+ else if (pickedObject == kVerbPick && fl == 50)
talk(_text[_lang][313], "313.als");
- else if (objeto_que_lleva == TALK && fl == 50)
+ else if (pickedObject == kVerbTalk && fl == 50)
talk(_text[_lang][314], "314.als");
- else if (objeto_que_lleva == 11 && fl == 50 && flags[22] == 0 && strcmp(num_room, "18.alg"))
+ // Note: the original check was strcmp(num_room, "18.alg")
+ else if (pickedObject == 11 && fl == 50 && flags[22] == 0 && roomNumber != 18)
talk(_text[_lang][315], "315.als");
- else if (objeto_que_lleva == 13 && fl == 50)
+ else if (pickedObject == 13 && fl == 50)
talk(_text[_lang][156], "156.als");
- else if (objeto_que_lleva == 20 && fl == 50)
+ else if (pickedObject == 20 && fl == 50)
talk(_text[_lang][163], "163.als");
- else if (!strcmp(num_room, "1.alg"))
+ else if (roomNumber == 1)
room_1(fl);
- else if (!strcmp(num_room, "3.alg"))
+ else if (roomNumber == 3)
room_3(fl);
- else if (!strcmp(num_room, "4.alg"))
+ else if (roomNumber == 4)
room_4(fl);
- else if (!strcmp(num_room, "5.alg"))
+ else if (roomNumber == 5)
room_5(fl);
- else if (!strcmp(num_room, "6.alg"))
+ else if (roomNumber == 6)
room_6(fl);
- else if (!strcmp(num_room, "7.alg"))
+ else if (roomNumber == 7)
room_7(fl);
- else if (!strcmp(num_room, "8.alg"))
+ else if (roomNumber == 8)
room_8(fl);
- else if (!strcmp(num_room, "9.alg"))
+ else if (roomNumber == 9)
room_9(fl);
- else if (!strcmp(num_room, "12.alg"))
+ else if (roomNumber == 12)
room_12(fl);
- else if (!strcmp(num_room, "14.alg"))
+ else if (roomNumber == 14)
room_14(fl);
- else if (!strcmp(num_room, "15.alg"))
+ else if (roomNumber == 15)
room_15(fl);
- else if (!strcmp(num_room, "16.alg"))
+ else if (roomNumber == 16)
room_16(fl);
- else if (!strcmp(num_room, "17.alg"))
+ else if (roomNumber == 17)
room_17(fl);
- else if (!strcmp(num_room, "18.alg"))
+ else if (roomNumber == 18)
room_18(fl);
- else if (!strcmp(num_room, "19.alg"))
+ else if (roomNumber == 19)
room_19(fl);
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 3) {
- if (objeto_que_lleva == LOOK && fl == 50)
+ if (pickedObject == kVerbLook && fl == 50)
talk(_text[_lang][309], "309.als");
- else if (objeto_que_lleva == OPEN && fl == 50)
+ else if (pickedObject == kVerbOpen && fl == 50)
talk(_text[_lang][310], "310.als");
- else if (objeto_que_lleva == CLOSE && fl == 50)
+ else if (pickedObject == kVerbClose && fl == 50)
talk(_text[_lang][311], "311.als");
- else if (objeto_que_lleva == MOVE && fl == 50)
+ else if (pickedObject == kVerbMove && fl == 50)
talk(_text[_lang][312], "312.als");
- else if (objeto_que_lleva == PICK && fl == 50)
+ else if (pickedObject == kVerbPick && fl == 50)
talk(_text[_lang][313], "313.als");
- else if (objeto_que_lleva == TALK && fl == 50)
+ else if (pickedObject == kVerbTalk && fl == 50)
talk(_text[_lang][314], "314.als");
- else if (!strcmp(num_room, "13.alg")) {
+ else if (roomNumber == 13) {
if (room_13(fl))
return true;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 4) {
- if (!strcmp(num_room, "28.alg"))
+ if (roomNumber == 28)
talk(_text[_lang][178], "178.als");
- else if (objeto_que_lleva == LOOK && fl == 50)
+ else if (pickedObject == kVerbLook && fl == 50)
talk(_text[_lang][309], "309.als");
- else if (objeto_que_lleva == OPEN && fl == 50)
+ else if (pickedObject == kVerbOpen && fl == 50)
talk(_text[_lang][310], "310.als");
- else if (objeto_que_lleva == CLOSE && fl == 50)
+ else if (pickedObject == kVerbClose && fl == 50)
talk(_text[_lang][311], "311.als");
- else if (objeto_que_lleva == MOVE && fl == 50)
+ else if (pickedObject == kVerbMove && fl == 50)
talk(_text[_lang][312], "312.als");
- else if (objeto_que_lleva == PICK && fl == 50)
+ else if (pickedObject == kVerbPick && fl == 50)
talk(_text[_lang][313], "313.als");
- else if (objeto_que_lleva == TALK && fl == 50)
+ else if (pickedObject == kVerbTalk && fl == 50)
talk(_text[_lang][314], "314.als");
- else if (objeto_que_lleva == 8 && fl == 50 && flags[18] == 0)
+ else if (pickedObject == 8 && fl == 50 && flags[18] == 0)
talk(_text[_lang][481], "481.als");
- else if (objeto_que_lleva == 9 && fl == 50)
+ else if (pickedObject == 9 && fl == 50)
talk(_text[_lang][484], "484.als");
- else if (objeto_que_lleva == 12 && fl == 50 && flags[18] == 0)
+ else if (pickedObject == 12 && fl == 50 && flags[18] == 0)
talk(_text[_lang][487], "487.als");
- else if (objeto_que_lleva == 20 && fl == 50)
+ else if (pickedObject == 20 && fl == 50)
talk(_text[_lang][487], "487.als");
- else if (!strcmp(num_room, "21.alg")) {
+ else if (roomNumber == 21) {
if (room_21(fl))
return true;
- } else if (!strcmp(num_room, "22.alg"))
+ } else if (roomNumber == 22)
room_22(fl);
- else if (!strcmp(num_room, "23.alg"))
+ else if (roomNumber == 23)
room_23(fl);
- else if (!strcmp(num_room, "24.alg"))
+ else if (roomNumber == 24)
room_24(fl);
- else if (!strcmp(num_room, "26.alg"))
+ else if (roomNumber == 26)
room_26(fl);
- else if (!strcmp(num_room, "27.alg"))
+ else if (roomNumber == 27)
room_27(fl);
- else if (!strcmp(num_room, "29.alg"))
+ else if (roomNumber == 29)
room_29(fl);
- else if (!strcmp(num_room, "30.alg"))
+ else if (roomNumber == 30)
room_30(fl);
- else if (!strcmp(num_room, "31.alg"))
+ else if (roomNumber == 31)
room_31(fl);
- else if (!strcmp(num_room, "34.alg"))
+ else if (roomNumber == 34)
room_34(fl);
- else if (!strcmp(num_room, "35.alg"))
+ else if (roomNumber == 35)
room_35(fl);
- else if (!strcmp(num_room, "44.alg"))
+ else if (roomNumber == 44)
room_44(fl);
else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 5) {
- if (objeto_que_lleva == LOOK && fl == 50)
+ if (pickedObject == kVerbLook && fl == 50)
talk("Cuanto mas me miro, mas me gusto", "54.als");
- else if (objeto_que_lleva == OPEN && fl == 50)
+ else if (pickedObject == kVerbOpen && fl == 50)
talk("y luego como me cierro", "19.als");
- else if (objeto_que_lleva == CLOSE && fl == 50)
+ else if (pickedObject == kVerbClose && fl == 50)
talk("Tendre que abrirme primero no", "19.als");
- else if (objeto_que_lleva == MOVE && fl == 50)
+ else if (pickedObject == kVerbMove && fl == 50)
talk("Estoy bien donde estoy", "19.als");
- else if (objeto_que_lleva == PICK && fl == 50)
+ else if (pickedObject == kVerbPick && fl == 50)
talk("Ya me tengo", "11.als");
- else if (objeto_que_lleva == TALK && fl == 50)
+ else if (pickedObject == kVerbTalk && fl == 50)
talk("hola yo", "16.als");
- else if (objeto_que_lleva == 20 && fl == 50)
+ else if (pickedObject == 20 && fl == 50)
talk(_text[_lang][487], "487.als");
- else if (!strcmp(num_room, "49.alg"))
+ else if (roomNumber == 49)
room_49(fl);
- else if (!strcmp(num_room, "53.alg"))
+ else if (roomNumber == 53)
room_53(fl);
- else if (!strcmp(num_room, "54.alg"))
+ else if (roomNumber == 54)
room_54(fl);
- else if (!strcmp(num_room, "55.alg"))
+ else if (roomNumber == 55)
room_55(fl);
- else if (!strcmp(num_room, "56.alg")) {
+ else if (roomNumber == 56) {
if (room_56(fl))
return true;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
} else if (num_ejec == 6) {
- if (objeto_que_lleva == LOOK && fl == 50 && flags[0] == 1)
+ if (pickedObject == kVerbLook && fl == 50 && flags[0] == 1)
talk(_text[_lang][308], "308.als");
- else if (objeto_que_lleva == LOOK && fl == 50 && flags[0] == 0)
+ else if (pickedObject == kVerbLook && fl == 50 && flags[0] == 0)
talk(_text[_lang][310], "250.als" );
- else if (objeto_que_lleva == OPEN && fl == 50)
+ else if (pickedObject == kVerbOpen && fl == 50)
talk(_text[_lang][310], "310.als" );
- else if (objeto_que_lleva == CLOSE && fl == 50)
+ else if (pickedObject == kVerbClose && fl == 50)
talk(_text[_lang][311], "311.als" );
- else if (objeto_que_lleva == MOVE && fl == 50)
+ else if (pickedObject == kVerbMove && fl == 50)
talk(_text[_lang][312], "312.als" );
- else if (objeto_que_lleva == PICK && fl == 50)
+ else if (pickedObject == kVerbPick && fl == 50)
talk(_text[_lang][313], "313.als" );
- else if (objeto_que_lleva == TALK && fl == 50)
+ else if (pickedObject == kVerbTalk && fl == 50)
talk(_text[_lang][314], "314.als" );
- else if (!strcmp(num_room, "102.alg"))
+ else if (roomNumber == 102)
room_pendulo(fl);
- else if (!strcmp(num_room, "58.alg"))
+ else if (roomNumber == 58)
room_58(fl);
- else if (!strcmp(num_room, "59.alg"))
+ else if (roomNumber == 59)
room_59(fl);
- else if (!strcmp(num_room, "60.alg")) {
+ else if (roomNumber == 60) {
if (room_60(fl))
return true;
- } else if (!strcmp(num_room, "61.alg"))
+ } else if (roomNumber == 61)
room_61(fl);
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
}
- if (hay_respuesta == 0 && hay_nombre == 1)
+ if (hay_answer == 0 && hay_nombre == 1)
room_0();
- else if (hay_respuesta == 0 && menu_scr == 1)
+ else if (hay_answer == 0 && menu_scr == 1)
room_0();
return false;
@@ -3177,8 +3310,8 @@ void DrasculaEngine::cursor_mesa() {
pos_cursor[0] = 225;
pos_cursor[1] = 56;
- pos_cursor[2] = x_raton - 20;
- pos_cursor[3] = y_raton - 12;
+ pos_cursor[2] = mouseX - 20;
+ pos_cursor[3] = mouseY - 12;
pos_cursor[4] = 40;
pos_cursor[5] = 25;
@@ -3198,80 +3331,12 @@ void DrasculaEngine::introduce_nombre() {
key = getscan();
delay(70);
if (key != 0) {
- if (key == Common::KEYCODE_q)
- select2[v] = 'q';
- else if (key == Common::KEYCODE_w)
- select2[v] = 'w';
- else if (key == Common::KEYCODE_e)
- select2[v] = 'e';
- else if (key == Common::KEYCODE_r)
- select2[v] = 'r';
- else if (key == Common::KEYCODE_t)
- select2[v] = 't';
- else if (key == Common::KEYCODE_y)
- select2[v] = 'y';
- else if (key == Common::KEYCODE_u)
- select2[v] = 'u';
- else if (key == Common::KEYCODE_i)
- select2[v] = 'i';
- else if (key == Common::KEYCODE_o)
- select2[v] = 'o';
- else if (key == Common::KEYCODE_p)
- select2[v] = 'p';
- else if (key == Common::KEYCODE_a)
- select2[v] = 'a';
- else if (key == Common::KEYCODE_s)
- select2[v] = 's';
- else if (key == Common::KEYCODE_d)
- select2[v] = 'd';
- else if (key == Common::KEYCODE_f)
- select2[v] = 'f';
- else if (key == Common::KEYCODE_g)
- select2[v] = 'g';
- else if (key == Common::KEYCODE_h)
- select2[v] = 'h';
- else if (key == Common::KEYCODE_j)
- select2[v] = 'j';
- else if (key == Common::KEYCODE_k)
- select2[v] = 'k';
- else if (key == Common::KEYCODE_l)
- select2[v] = 'l';
+ if (key >= 0 && key <= 0xFF && isalpha(key))
+ select2[v] = tolower(key);
else if ((key == Common::KEYCODE_LCTRL) || (key == Common::KEYCODE_RCTRL))
select2[v] = '\164';
- else if (key == Common::KEYCODE_z)
- select2[v] = 'z';
- else if (key == Common::KEYCODE_x)
- select2[v] = 'x';
- else if (key == Common::KEYCODE_c)
- select2[v] = 'c';
- else if (key == Common::KEYCODE_v)
- select2[v] = 'v';
- else if (key == Common::KEYCODE_b)
- select2[v] = 'b';
- else if (key == Common::KEYCODE_n)
- select2[v] = 'n';
- else if (key == Common::KEYCODE_m)
- select2[v] = 'm';
- else if (key == Common::KEYCODE_1)
- select2[v] = '1';
- else if (key == Common::KEYCODE_2)
- select2[v] = '2';
- else if (key == Common::KEYCODE_3)
- select2[v] = '3';
- else if (key == Common::KEYCODE_4)
- select2[v] = '4';
- else if (key == Common::KEYCODE_5)
- select2[v] = '5';
- else if (key == Common::KEYCODE_6)
- select2[v] = '6';
- else if (key == Common::KEYCODE_7)
- select2[v] = '7';
- else if (key == Common::KEYCODE_8)
- select2[v] = '8';
- else if (key == Common::KEYCODE_9)
- select2[v] = '9';
- else if (key == Common::KEYCODE_0)
- select2[v] = '0';
+ else if (key >= Common::KEYCODE_0 && key <= Common::KEYCODE_9)
+ select2[v] = key;
else if (key == Common::KEYCODE_SPACE)
select2[v] = '\167';
else if (key == ESC)
@@ -3303,8 +3368,8 @@ void DrasculaEngine::introduce_nombre() {
void DrasculaEngine::para_grabar(char nom_game[]) {
saveGame(nom_game);
- comienza_sound("99.als");
- fin_sound();
+ playSound("99.als");
+ stopSound();
}
void DrasculaEngine::OpenSSN(const char *Name, int Pause) {
@@ -3566,87 +3631,87 @@ char DrasculaEngine::codifica(char car) {
return ~car;
}
-void DrasculaEngine::cuadrante_1() {
- float distancia_x, distancia_y;
+void DrasculaEngine::quadrant_1() {
+ float distance_x, distance_y;
if (num_ejec == 2)
- distancia_x = hare_x - sitio_x;
+ distance_x = hare_x - sitio_x;
else
- distancia_x = hare_x + ancho_hare / 2 - sitio_x;
+ distance_x = hare_x + ancho_hare / 2 - sitio_x;
- distancia_y = (hare_y + alto_hare) - sitio_y;
+ distance_y = (hare_y + alto_hare) - sitio_y;
- if (distancia_x < distancia_y) {
+ if (distance_x < distance_y) {
direccion_hare = 0;
sentido_hare = 2;
- step_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y));
+ step_x = (int)(distance_x / (distance_y / PASO_HARE_Y));
} else {
direccion_hare = 7;
sentido_hare = 0;
- step_y = (int)(distancia_y / (distancia_x / PASO_HARE_X));
+ step_y = (int)(distance_y / (distance_x / PASO_HARE_X));
}
}
-void DrasculaEngine::cuadrante_2() {
- float distancia_x, distancia_y;
+void DrasculaEngine::quadrant_2() {
+ float distance_x, distance_y;
if (num_ejec == 2)
- distancia_x = abs(hare_x + ancho_hare - sitio_x);
+ distance_x = abs(hare_x + ancho_hare - sitio_x);
else
- distancia_x = abs(hare_x + ancho_hare / 2 - sitio_x);
+ distance_x = abs(hare_x + ancho_hare / 2 - sitio_x);
- distancia_y = (hare_y + alto_hare) - sitio_y;
+ distance_y = (hare_y + alto_hare) - sitio_y;
- if (distancia_x < distancia_y) {
+ if (distance_x < distance_y) {
direccion_hare = 1;
sentido_hare = 2;
- step_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y));
+ step_x = (int)(distance_x / (distance_y / PASO_HARE_Y));
} else {
direccion_hare = 2;
sentido_hare = 1;
- step_y = (int)(distancia_y / (distancia_x / PASO_HARE_X));
+ step_y = (int)(distance_y / (distance_x / PASO_HARE_X));
}
}
-void DrasculaEngine::cuadrante_3() {
- float distancia_x, distancia_y;
+void DrasculaEngine::quadrant_3() {
+ float distance_x, distance_y;
if (num_ejec == 2)
- distancia_x = hare_x - sitio_x;
+ distance_x = hare_x - sitio_x;
else
- distancia_x = hare_x + ancho_hare / 2 - sitio_x;
+ distance_x = hare_x + ancho_hare / 2 - sitio_x;
- distancia_y = sitio_y - (hare_y + alto_hare);
+ distance_y = sitio_y - (hare_y + alto_hare);
- if (distancia_x < distancia_y) {
+ if (distance_x < distance_y) {
direccion_hare = 5;
sentido_hare = 3;
- step_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y));
+ step_x = (int)(distance_x / (distance_y / PASO_HARE_Y));
} else {
direccion_hare = 6;
sentido_hare = 0;
- step_y = (int)(distancia_y / (distancia_x / PASO_HARE_X));
+ step_y = (int)(distance_y / (distance_x / PASO_HARE_X));
}
}
-void DrasculaEngine::cuadrante_4() {
- float distancia_x, distancia_y;
+void DrasculaEngine::quadrant_4() {
+ float distance_x, distance_y;
if (num_ejec == 2)
- distancia_x = abs(hare_x + ancho_hare - sitio_x);
+ distance_x = abs(hare_x + ancho_hare - sitio_x);
else
- distancia_x = abs(hare_x + ancho_hare / 2 - sitio_x);
+ distance_x = abs(hare_x + ancho_hare / 2 - sitio_x);
- distancia_y = sitio_y - (hare_y + alto_hare);
+ distance_y = sitio_y - (hare_y + alto_hare);
- if (distancia_x < distancia_y) {
+ if (distance_x < distance_y) {
direccion_hare = 4;
sentido_hare = 3;
- step_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y));
+ step_x = (int)(distance_x / (distance_y / PASO_HARE_Y));
} else {
direccion_hare = 3;
sentido_hare = 1;
- step_y = (int)(distancia_y / (distancia_x / PASO_HARE_X));
+ step_y = (int)(distance_y / (distance_x / PASO_HARE_X));
}
}
@@ -3664,7 +3729,7 @@ void DrasculaEngine::saveGame(char nom_game[]) {
out->writeSint32LE(sentido_hare);
for (l = 1; l < 43; l++) {
- out->writeSint32LE(objetos_que_tengo[l]);
+ out->writeSint32LE(inventoryObjects[l]);
}
for (l = 0; l < NUM_FLAGS; l++) {
@@ -3672,7 +3737,7 @@ void DrasculaEngine::saveGame(char nom_game[]) {
}
out->writeSint32LE(lleva_objeto);
- out->writeSint32LE(objeto_que_lleva);
+ out->writeSint32LE(pickedObject);
out->finalize();
if (out->ioFailed())
@@ -3690,28 +3755,16 @@ void DrasculaEngine::aumenta_num_frame() {
if (num_frame == 6)
num_frame = 0;
- if (direccion_hare == 0) {
+ if (direccion_hare == 0 || direccion_hare == 7) {
hare_x = hare_x - step_x;
hare_y = hare_y - step_y;
- } else if (direccion_hare == 7) {
- hare_x = hare_x - step_x;
- hare_y = hare_y - step_y;
- } else if (direccion_hare == 1) {
- hare_x = hare_x + step_x;
- hare_y = hare_y - step_y;
- } else if (direccion_hare == 2) {
+ } else if (direccion_hare == 1 || direccion_hare == 2) {
hare_x = hare_x + step_x;
hare_y = hare_y - step_y;
- } else if (direccion_hare == 3) {
- hare_x = hare_x + step_x;
- hare_y = hare_y + step_y;
- } else if (direccion_hare == 4) {
+ } else if (direccion_hare == 3 || direccion_hare == 4) {
hare_x = hare_x + step_x;
hare_y = hare_y + step_y;
- } else if (direccion_hare == 5) {
- hare_x = hare_x - step_x;
- hare_y = hare_y + step_y;
- } else if (direccion_hare == 6) {
+ } else if (direccion_hare == 5 || direccion_hare == 6) {
hare_x = hare_x - step_x;
hare_y = hare_y + step_y;
}
@@ -3731,8 +3784,8 @@ int DrasculaEngine::sobre_que_objeto() {
int n = 0;
for (n = 1; n < 43; n++) {
- if (x_raton > x_obj[n] && y_raton > y_obj[n]
- && x_raton < x_obj[n] + OBJWIDTH && y_raton < y_obj[n] + OBJHEIGHT)
+ if (mouseX > itemLocations[n].x && mouseY > itemLocations[n].y
+ && mouseX < itemLocations[n].x + OBJWIDTH && mouseY < itemLocations[n].y + OBJHEIGHT)
break;
}
@@ -3744,7 +3797,7 @@ bool DrasculaEngine::comprueba_banderas_menu() {
for (n = 0; n < 43; n++) {
if (sobre_que_objeto() == n) {
- h = objetos_que_tengo[n];
+ h = inventoryObjects[n];
if (h != 0)
if (banderas(h))
return true;
@@ -3756,23 +3809,23 @@ bool DrasculaEngine::comprueba_banderas_menu() {
void DrasculaEngine::conversa(const char *nom_fich) {
int h;
- int juego1 = 1, juego2 = 1, juego3 = 1, juego4 = 1;
- char frase1[78];
- char frase2[78];
- char frase3[87];
- char frase4[78];
+ int game1 = 1, game2 = 1, game3 = 1, game4 = 1;
+ char phrase1[78];
+ char phrase2[78];
+ char phrase3[87];
+ char phrase4[78];
char para_codificar[13];
- char suena1[13];
- char suena2[13];
- char suena3[13];
- char suena4[13];
- int longitud;
- int respuesta1;
- int respuesta2;
- int respuesta3;
- int usado1 = 0;
- int usado2 = 0;
- int usado3 = 0;
+ char sound1[13];
+ char sound2[13];
+ char sound3[13];
+ char sound4[13];
+ int length;
+ int answer1;
+ int answer2;
+ int answer3;
+ int used1 = 0;
+ int used2 = 0;
+ int used3 = 0;
char buffer[256];
rompo_y_salgo = 0;
@@ -3790,67 +3843,67 @@ void DrasculaEngine::conversa(const char *nom_fich) {
int size = ald->size();
getLine(ald, buffer, size);
- sscanf(buffer, "%s", frase1);
+ sscanf(buffer, "%s", phrase1);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", frase2);
+ sscanf(buffer, "%s", phrase2);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", frase3);
+ sscanf(buffer, "%s", phrase3);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", frase4);
+ sscanf(buffer, "%s", phrase4);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", suena1);
+ sscanf(buffer, "%s", sound1);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", suena2);
+ sscanf(buffer, "%s", sound2);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", suena3);
+ sscanf(buffer, "%s", sound3);
getLine(ald, buffer, size);
- sscanf(buffer, "%s", suena4);
+ sscanf(buffer, "%s", sound4);
getLine(ald, buffer, size);
- sscanf(buffer, "%d", &respuesta1);
+ sscanf(buffer, "%d", &answer1);
getLine(ald, buffer, size);
- sscanf(buffer, "%d", &respuesta2);
+ sscanf(buffer, "%d", &answer2);
getLine(ald, buffer, size);
- sscanf(buffer, "%d", &respuesta3);
+ sscanf(buffer, "%d", &answer3);
delete ald;
ald = NULL;
if (num_ejec == 2 && !strcmp(nom_fich, "op_5.cal") && flags[38] == 1 && flags[33] == 1) {
- strcpy(frase3, _text[_lang][405]);
- strcpy(suena3, "405.als");
- respuesta3 = 31;
+ strcpy(phrase3, _text[_lang][405]);
+ strcpy(sound3, "405.als");
+ answer3 = 31;
}
if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[7] == 1) {
- strcpy(frase3, _text[_lang][273]);
- strcpy(suena3, "273.als");
- respuesta3 = 14;
+ strcpy(phrase3, _text[_lang][273]);
+ strcpy(sound3, "273.als");
+ answer3 = 14;
}
if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[10] == 1) {
- strcpy(frase3, " cuanto queda para que acabe el partido?");
- strcpy(suena3, "274.als");
- respuesta3 = 15;
+ strcpy(phrase3, " cuanto queda para que acabe el partido?");
+ strcpy(sound3, "274.als");
+ answer3 = 15;
}
- longitud = strlen(frase1);
- for (h = 0; h < longitud; h++)
- if (frase1[h] == (char)0xa7)
- frase1[h] = ' ';
+ length = strlen(phrase1);
+ for (h = 0; h < length; h++)
+ if (phrase1[h] == (char)0xa7)
+ phrase1[h] = ' ';
- longitud = strlen(frase2);
- for (h = 0; h < longitud; h++)
- if (frase2[h] == (char)0xa7)
- frase2[h] = ' ';
+ length = strlen(phrase2);
+ for (h = 0; h < length; h++)
+ if (phrase2[h] == (char)0xa7)
+ phrase2[h] = ' ';
- longitud = strlen(frase3);
- for (h = 0; h < longitud; h++)
- if (frase3[h] == (char)0xa7)
- frase3[h] = ' ';
+ length = strlen(phrase3);
+ for (h = 0; h < length; h++)
+ if (phrase3[h] == (char)0xa7)
+ phrase3[h] = ' ';
- longitud = strlen(frase4);
- for (h = 0; h < longitud; h++)
- if (frase4[h] == (char)0xa7)
- frase4[h] = ' ';
+ length = strlen(phrase4);
+ for (h = 0; h < length; h++)
+ if (phrase4[h] == (char)0xa7)
+ phrase4[h] = ' ';
loadPic("car.alg");
decompressPic(dir_hare_fondo, 1);
@@ -3876,89 +3929,89 @@ bucle_opc:
MirarRaton();
- if (y_raton > 0 && y_raton < 9) {
- if (usado1 == 1 && _color != WHITE)
+ if (mouseY > 0 && mouseY < 9) {
+ if (used1 == 1 && _color != WHITE)
color_abc(WHITE);
- else if (usado1 == 0 && _color != LIGHT_GREEN)
+ else if (used1 == 0 && _color != LIGHT_GREEN)
color_abc(LIGHT_GREEN);
- } else if (y_raton > 8 && y_raton < 17) {
- if (usado2 == 1 && _color != WHITE)
+ } else if (mouseY > 8 && mouseY < 17) {
+ if (used2 == 1 && _color != WHITE)
color_abc(WHITE);
- else if (usado2 == 0 && _color != LIGHT_GREEN)
+ else if (used2 == 0 && _color != LIGHT_GREEN)
color_abc(LIGHT_GREEN);
- } else if (y_raton > 16 && y_raton < 25) {
- if (usado3 == 1 && _color != WHITE)
+ } else if (mouseY > 16 && mouseY < 25) {
+ if (used3 == 1 && _color != WHITE)
color_abc(WHITE);
- else if (usado3 == 0 && _color != LIGHT_GREEN)
+ else if (used3 == 0 && _color != LIGHT_GREEN)
color_abc(LIGHT_GREEN);
} else if (_color != LIGHT_GREEN)
color_abc(LIGHT_GREEN);
- if (y_raton > 0 && y_raton < 9)
- juego1 = 2;
- else if (y_raton > 8 && y_raton < 17)
- juego2 = 2;
- else if (y_raton > 16 && y_raton < 25)
- juego3 = 2;
- else if (y_raton > 24 && y_raton < 33)
- juego4 = 2;
+ if (mouseY > 0 && mouseY < 9)
+ game1 = 2;
+ else if (mouseY > 8 && mouseY < 17)
+ game2 = 2;
+ else if (mouseY > 16 && mouseY < 25)
+ game3 = 2;
+ else if (mouseY > 24 && mouseY < 33)
+ game4 = 2;
- print_abc_opc(frase1, 1, 2, juego1);
- print_abc_opc(frase2, 1, 10, juego2);
- print_abc_opc(frase3, 1, 18, juego3);
- print_abc_opc(frase4, 1, 26, juego4);
+ print_abc_opc(phrase1, 1, 2, game1);
+ print_abc_opc(phrase2, 1, 10, game2);
+ print_abc_opc(phrase3, 1, 18, game3);
+ print_abc_opc(phrase4, 1, 26, game4);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- if ((boton_izq == 1) && (juego1 == 2)) {
+ if ((button_izq == 1) && (game1 == 2)) {
delay(100);
- usado1 = 1;
- talk(frase1, suena1);
+ used1 = 1;
+ talk(phrase1, sound1);
if (num_ejec == 3)
grr();
else
- responde(respuesta1);
- } else if ((boton_izq == 1) && (juego2 == 2)) {
+ response(answer1);
+ } else if ((button_izq == 1) && (game2 == 2)) {
delay(100);
- usado2 = 1;
- talk(frase2, suena2);
+ used2 = 1;
+ talk(phrase2, sound2);
if (num_ejec == 3)
grr();
else
- responde(respuesta2);
- } else if ((boton_izq == 1) && (juego3 == 2)) {
+ response(answer2);
+ } else if ((button_izq == 1) && (game3 == 2)) {
delay(100);
- usado3 = 1;
- talk(frase3, suena3);
+ used3 = 1;
+ talk(phrase3, sound3);
if (num_ejec == 3)
grr();
else
- responde(respuesta3);
- } else if ((boton_izq == 1) && (juego4 == 2)) {
+ response(answer3);
+ } else if ((button_izq == 1) && (game4 == 2)) {
delay(100);
- talk(frase4, suena4);
+ talk(phrase4, sound4);
rompo_y_salgo = 1;
}
- if (boton_izq == 1) {
+ if (button_izq == 1) {
delay(100);
color_abc(LIGHT_GREEN);
}
- if (usado1 == 0)
- juego1 = 1;
+ if (used1 == 0)
+ game1 = 1;
else
- juego1 = 3;
- if (usado2 == 0)
- juego2 = 1;
+ game1 = 3;
+ if (used2 == 0)
+ game2 = 1;
else
- juego2 = 3;
- if (usado3 == 0)
- juego3 = 1;
+ game2 = 3;
+ if (used3 == 0)
+ game3 = 1;
else
- juego3 = 3;
+ game3 = 3;
- juego4 = 1;
+ game4 = 1;
if (rompo_y_salgo == 0)
goto bucle_opc;
@@ -3972,16 +4025,16 @@ bucle_opc:
withoutVerb();
}
-void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_pantalla, int juego) {
+void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_pantalla, int game) {
int pos_texto[6];
- int y_de_signos, y_de_letra, x_de_letra = 0, h, longitud;
- longitud = strlen(said);
+ int y_de_signos, y_de_letra, x_de_letra = 0, h, length;
+ length = strlen(said);
- for (h = 0; h < longitud; h++) {
- if (juego == 1) {
+ for (h = 0; h < length; h++) {
+ if (game == 1) {
y_de_letra = Y_ABC_OPC_1;
y_de_signos = Y_SIGNOS_OPC_1;
- } else if (juego == 3) {
+ } else if (game == 3) {
y_de_letra = Y_ABC_OPC_3;
y_de_signos = Y_SIGNOS_OPC_3;
} else {
@@ -3992,14 +4045,22 @@ void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_panta
int c = toupper(said[h]);
if (c == 'A')
x_de_letra = X_A_OPC;
+ else if (c == '\265') x_de_letra = X_A_OPC;
+ else if (c == '\267') x_de_letra = X_A_OPC;
+ else if (c == '\266') x_de_letra = X_A_OPC;
else if (c == 'B')
x_de_letra = X_B_OPC;
else if (c == 'C')
x_de_letra = X_C_OPC;
+ else if (c == '\200') x_de_letra = X_C_OPC;
+ else if (c == '\207') x_de_letra = X_C_OPC;
else if (c == 'D')
x_de_letra = X_D_OPC;
else if (c == 'E')
x_de_letra = X_E_OPC;
+ else if (c == '\220') x_de_letra = X_E_OPC;
+ else if (c == '\324') x_de_letra = X_E_OPC;
+ else if (c == '\322') x_de_letra = X_E_OPC;
else if (c == 'F')
x_de_letra = X_F_OPC;
else if (c == 'G')
@@ -4008,6 +4069,9 @@ void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_panta
x_de_letra = X_H_OPC;
else if (c == 'I')
x_de_letra = X_I_OPC;
+ else if (c == '\326') x_de_letra = X_I_OPC;
+ else if (c == '\336') x_de_letra = X_I_OPC;
+ else if (c == '\327') x_de_letra = X_I_OPC;
else if (c == 'J')
x_de_letra = X_J_OPC;
else if (c == 'K')
@@ -4018,10 +4082,14 @@ void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_panta
x_de_letra = X_M_OPC;
else if (c == 'N')
x_de_letra = X_N_OPC;
+ else if (c == '\047') x_de_letra = X_GN_OPC;
else if (c == 'O')
x_de_letra = X_O_OPC;
else if (c == 'P')
x_de_letra = X_P_OPC;
+ else if (c == '\340') x_de_letra = X_O_OPC;
+ else if (c == '\342') x_de_letra = X_O_OPC;
+ else if (c == '\343') x_de_letra = X_O_OPC;
else if (c == 'Q')
x_de_letra = X_Q_OPC;
else if (c == 'R')
@@ -4032,6 +4100,9 @@ void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_panta
x_de_letra = X_T_OPC;
else if (c == 'U')
x_de_letra = X_U_OPC;
+ else if (c == '\353') x_de_letra = X_U_OPC;
+ else if (c == '\352') x_de_letra = X_U_OPC;
+ else if (c == '\351') x_de_letra = X_U_OPC;
else if (c == 'V')
x_de_letra = X_V_OPC;
else if (c == 'W')
@@ -4123,7 +4194,7 @@ void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_panta
}
}
-void DrasculaEngine::responde(int funcion) {
+void DrasculaEngine::response(int funcion) {
if (num_ejec == 1) {
if (funcion == 10)
talk_borracho(_textb[_lang][1], "B1.als");
@@ -4205,25 +4276,25 @@ void DrasculaEngine::responde(int funcion) {
}
void DrasculaEngine::suma_objeto(int osj) {
- int h, puesto = 0;
+ int h, position = 0;
for (h = 1; h < 43; h++) {
- if (objetos_que_tengo[h] == osj)
- puesto = 1;
+ if (inventoryObjects[h] == osj)
+ position = 1;
}
- if (puesto == 0) {
+ if (position == 0) {
for (h = 1; h < 43; h++) {
- if (objetos_que_tengo[h] == 0) {
- objetos_que_tengo[h] = osj;
- puesto = 1;
+ if (inventoryObjects[h] == 0) {
+ inventoryObjects[h] = osj;
+ position = 1;
break;
}
}
}
}
-void DrasculaEngine::fin_sound_corte() {
+void DrasculaEngine::stopSound_corte() {
if (hay_sb == 1) {
ctvd_stop();
delete sku;
@@ -4284,69 +4355,69 @@ void DrasculaEngine::updateData() {
if (num_ejec == 1) {
// nothing
} else if (num_ejec == 2) {
- if (!strcmp(num_room,"2.alg") && flags[40] == 0)
+ if (roomNumber == 2 && flags[40] == 0)
visible[3] = 0;
- else if (!strcmp(num_room, "3.alg") && flags[3] == 1)
+ else if (roomNumber == 3 && flags[3] == 1)
visible[8] = 0;
- else if (!strcmp(num_room, "6.alg") && flags[1] == 1 && flags[10] == 0) {
+ else if (roomNumber == 6 && flags[1] == 1 && flags[10] == 0) {
visible[2] = 0;
visible[4] = 1;
- } else if (!strcmp(num_room, "7.alg") && flags[35] == 1)
+ } else if (roomNumber == 7 && flags[35] == 1)
visible[3] = 0;
- else if (!strcmp(num_room, "14.alg") && flags[5] == 1)
+ else if (roomNumber == 14 && flags[5] == 1)
visible[4] = 0;
- else if (!strcmp(num_room, "18.alg") && flags[28] == 1)
+ else if (roomNumber == 18 && flags[28] == 1)
visible[2] = 0;
} else if (num_ejec == 3) {
// nothing
} else if (num_ejec == 4) {
- if (!strcmp(num_room, "23.alg") && flags[0] == 0 && flags[11] == 0)
+ if (roomNumber == 23 && flags[0] == 0 && flags[11] == 0)
visible[2] = 1;
- if (!strcmp(num_room, "23.alg") && flags[0] == 1 && flags[11] == 0)
+ if (roomNumber == 23 && flags[0] == 1 && flags[11] == 0)
visible[2] = 0;
- if (!strcmp(num_room, "21.alg") && flags[10] == 1)
+ if (roomNumber == 21 && flags[10] == 1)
visible[2] = 0;
- if (!strcmp(num_room, "22.alg") && flags[26] == 1) {
+ if (roomNumber == 22 && flags[26] == 1) {
visible[2] = 0;
visible[1] = 1;
}
- if (!strcmp(num_room, "22.alg") && flags[27] == 1)
+ if (roomNumber == 22 && flags[27] == 1)
visible[3] = 0;
- if (!strcmp(num_room, "26.alg") && flags[21] == 0)
+ if (roomNumber == 26 && flags[21] == 0)
strcpy(objName[2], _textmisc[_lang][0]);
- if (!strcmp(num_room, "26.alg") && flags[18] == 1)
+ if (roomNumber == 26 && flags[18] == 1)
visible[2] = 0;
- if (!strcmp(num_room, "26.alg") && flags[12] == 1)
+ if (roomNumber == 26 && flags[12] == 1)
visible[1] = 0;
- if (!strcmp(num_room, "35.alg") && flags[14] == 1)
+ if (roomNumber == 35 && flags[14] == 1)
visible[2] = 0;
- if (!strcmp(num_room, "35.alg") && flags[17] == 1)
+ if (roomNumber == 35 && flags[17] == 1)
visible[3] = 1;
- if (!strcmp(num_room, "35.alg") && flags[15] == 1)
+ if (roomNumber == 35 && flags[15] == 1)
visible[1] = 0;
} else if (num_ejec == 5) {
- if (!strcmp(num_room,"49.alg") && flags[6] == 1)
+ if (roomNumber == 49 && flags[6] == 1)
visible[2] = 0;
- if (!strcmp(num_room,"49.alg") && flags[6] == 0)
+ if (roomNumber == 49 && flags[6] == 0)
visible[1] = 0;
- if (!strcmp(num_room,"49.alg") && flags[6] == 1)
+ if (roomNumber == 49 && flags[6] == 1)
visible[1] = 1;
- if (!strcmp(num_room,"45.alg") && flags[6] == 1)
+ if (roomNumber == 45 && flags[6] == 1)
visible[3] = 1;
- if (!strcmp(num_room,"53.alg") && flags[2] == 1)
+ if (roomNumber == 53 && flags[2] == 1)
visible[3] = 0;
- if (!strcmp(num_room,"54.alg") && flags[13] == 1)
+ if (roomNumber == 54 && flags[13] == 1)
visible[3] = 0;
- if (!strcmp(num_room,"55.alg") && flags[8] == 1)
+ if (roomNumber == 55 && flags[8] == 1)
visible[1] = 0;
} else if (num_ejec == 6) {
- if ((!strcmp(num_room, "58.alg")) && flags[8] == 0)
+ if (roomNumber == 58 && flags[8] == 0)
isDoor[1] = 0;
- if ((!strcmp(num_room, "58.alg")) && flags[8] == 1)
+ if (roomNumber == 58 && flags[8] == 1)
isDoor[1] = 1;
- if (!strcmp(num_room, "59.alg"))
+ if (roomNumber == 59)
isDoor[1] = 0;
- if (!strcmp(num_room, "60.alg")) {
+ if (roomNumber == 60) {
sentido_dr = 0;
x_dr = 155;
y_dr = 69;
@@ -4465,23 +4536,23 @@ comienza:
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
-void DrasculaEngine::openDoor(int nflag, int n_puerta) {
+void DrasculaEngine::openDoor(int nflag, int doorNum) {
if (flags[nflag] == 0) {
if (num_ejec == 1 /*|| num_ejec == 4*/) {
if (nflag != 7) {
- comienza_sound("s3.als");
+ playSound("s3.als");
flags[nflag] = 1;
}
} else {
- comienza_sound("s3.als");
+ playSound("s3.als");
flags[nflag] = 1;
}
- if (n_puerta != NO_DOOR)
- puertas_cerradas(n_puerta);
+ if (doorNum != NO_DOOR)
+ puertas_cerradas(doorNum);
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
+ stopSound();
withoutVerb();
}
}
@@ -4490,8 +4561,8 @@ void DrasculaEngine::mapa() {
int l, veo = 0;
for (l = 0; l < numRoomObjs; l++) {
- if (x_raton > x1[l] && y_raton > y1[l]
- && x_raton < x2[l] && y_raton < y2[l]
+ if (mouseX > x1[l] && mouseY > y1[l]
+ && mouseX < x2[l] && mouseY < y2[l]
&& visible[l] == 1) {
strcpy(texto_nombre, objName[l]);
hay_nombre = 1;
@@ -4504,8 +4575,7 @@ void DrasculaEngine::mapa() {
}
void DrasculaEngine::grr() {
- int longitud;
- longitud = 30;
+ int length = 30;
color_abc(DARK_GREEN);
@@ -4539,8 +4609,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -4551,7 +4621,7 @@ bucless:
void DrasculaEngine::activa_pendulo() {
flags[1] = 2;
hare_se_ve = 0;
- strcpy(num_room, "102.alg");
+ roomNumber = 102;
loadPic("102.alg");
decompressPic(dir_dibujo1, HALF_PAL);
loadPic("an_p1.alg");
@@ -4566,15 +4636,15 @@ void DrasculaEngine::activa_pendulo() {
conta_ciego_vez = vez();
}
-void DrasculaEngine::cierra_puerta(int nflag, int n_puerta) {
+void DrasculaEngine::closeDoor(int nflag, int doorNum) {
if (flags[nflag] == 1) {
- comienza_sound("s4.als");
+ playSound("s4.als");
flags[nflag] = 0;
- if (n_puerta != NO_DOOR)
- puertas_cerradas(n_puerta);
+ if (doorNum != NO_DOOR)
+ puertas_cerradas(doorNum);
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
+ stopSound();
withoutVerb();
}
}
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index 5cbc1fd403..512ebb9950 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -56,9 +56,20 @@ enum Languages {
kItalian = 4
};
+enum Verbs {
+ kVerbDefault = -1,
+ kVerbLook = 1,
+ kVerbPick = 2,
+ kVerbOpen = 3,
+ kVerbClose = 4,
+ kVerbTalk = 5,
+ kVerbMove = 6
+};
+
#define TEXTD_START 68
struct DrasculaGameDescription;
+struct RoomTalkAction;
#define NUM_SAVES 10
#define NUM_FLAGS 50
@@ -72,110 +83,19 @@ struct DrasculaGameDescription;
#define F8 0x42
#define F9 0x43
#define F10 0x44
-#define LOOK 1
-#define PICK 2
-#define OPEN 3
-#define CLOSE 4
-#define TALK 5
-#define MOVE 6
#define DIF_MASK 55
#define OBJWIDTH 40
#define OBJHEIGHT 25
-#define X_OBJ1 5
-#define Y_OBJ1 10
-#define X_OBJ2 50
-#define Y_OBJ2 10
-#define X_OBJ3 95
-#define Y_OBJ3 10
-#define X_OBJ4 140
-#define Y_OBJ4 10
-#define X_OBJ5 185
-#define Y_OBJ5 10
-#define X_OBJ6 230
-#define Y_OBJ6 10
-#define X_OBJ7 275
-#define Y_OBJ7 10
-#define X_OBJ8 5
-#define Y_OBJ8 40
-#define X_OBJ9 50
-#define Y_OBJ9 40
-#define X_OBJ10 95
-#define Y_OBJ10 40
-#define X_OBJ11 140
-#define Y_OBJ11 40
-#define X_OBJ12 185
-#define Y_OBJ12 40
-#define X_OBJ13 230
-#define Y_OBJ13 40
-#define X_OBJ14 275
-#define Y_OBJ14 40
-#define X_OBJ15 5
-#define Y_OBJ15 70
-#define X_OBJ16 50
-#define Y_OBJ16 70
-#define X_OBJ17 95
-#define Y_OBJ17 70
-#define X_OBJ18 140
-#define Y_OBJ18 70
-#define X_OBJ19 185
-#define Y_OBJ19 70
-#define X_OBJ20 230
-#define Y_OBJ20 70
-#define X_OBJ21 275
-#define Y_OBJ21 70
-#define X_OBJ22 5
-#define Y_OBJ22 100
-#define X_OBJ23 50
-#define Y_OBJ23 100
-#define X_OBJ24 95
-#define Y_OBJ24 100
-#define X_OBJ25 140
-#define Y_OBJ25 100
-#define X_OBJ26 185
-#define Y_OBJ26 100
-#define X_OBJ27 230
-#define Y_OBJ27 100
-#define X_OBJ28 275
-#define Y_OBJ28 100
-#define X_OBJ29 5
-#define Y_OBJ29 130
-#define X_OBJ30 50
-#define Y_OBJ30 130
-#define X_OBJ31 95
-#define Y_OBJ31 130
-#define X_OBJ32 140
-#define Y_OBJ32 130
-#define X_OBJ33 185
-#define Y_OBJ33 130
-#define X_OBJ34 230
-#define Y_OBJ34 130
-#define X_OBJ35 275
-#define Y_OBJ35 130
-#define X_OBJ36 5
-#define Y_OBJ36 160
-#define X_OBJ37 50
-#define Y_OBJ37 160
-#define X_OBJ38 95
-#define Y_OBJ38 160
-#define X_OBJ39 140
-#define Y_OBJ39 160
-#define X_OBJ40 185
-#define Y_OBJ40 160
-#define X_OBJ41 230
-#define Y_OBJ41 160
-#define X_OBJ42 275
-#define Y_OBJ42 160
-#define X_OBJ43 275
-#define Y_OBJ43 160
-
#define DIF_MASK_HARE 72
#define DIF_MASK_ABC 22
#define CHAR_WIDTH 8
#define CHAR_HEIGHT 6
#define Y_ABC 158
+#define Y_ABC_ESP 149
#define Y_SIGNOS 169
+#define Y_SIGNOS_ESP 160
#define Y_ACENTOS 180
#define X_A 6
@@ -356,6 +276,7 @@ public:
uint32 getFeatures() const;
uint16 getVersion() const;
Common::Platform getPlatform() const;
+ Common::Language getLanguage() const;
void updateEvents();
Audio::SoundHandle _soundHandle;
@@ -380,7 +301,7 @@ public:
void copyRectClip(int *Array, byte *src, byte *dest);
void updateScreen(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *buffer);
- DacPalette256 palJuego;
+ DacPalette256 gamePalette;
DacPalette256 palHare;
DacPalette256 palHareClaro;
DacPalette256 palHareOscuro;
@@ -406,7 +327,8 @@ public:
int hay_sb;
int nivel_osc, previousMusic, roomMusic;
- char num_room[20], roomDisk[20];
+ int roomNumber;
+ char roomDisk[20];
char currentData[20];
int numRoomObjs;
char fondo_y_menu[20];
@@ -416,11 +338,11 @@ public:
int num_obj[40], visible[40], isDoor[40];
int sitiobj_x[40], sitiobj_y[40], sentidobj[40];
- int objetos_que_tengo[43];
+ int inventoryObjects[43];
char alapantallakeva[40][20];
int x_alakeva[40], y_alakeva[40], sentido_alkeva[40], alapuertakeva[40];
int x1[40], y1[40], x2[40], y2[40];
- int lleva_objeto, objeto_que_lleva;
+ int lleva_objeto, pickedObject;
int withVoices;
int menu_bar, menu_scr, hay_nombre;
char texto_nombre[20];
@@ -444,7 +366,7 @@ public:
int sentido_final, anda_a_objeto;
int obj_saliendo;
int diff_vez, conta_vez;
- int hay_respuesta;
+ int hay_answer;
int conta_ciego_vez;
int cambio_de_color;
int rompo_y_salgo;
@@ -469,15 +391,17 @@ public:
int corta_musica;
char select[23];
int hay_seleccion;
- int x_raton;
- int y_raton;
- int y_raton_ant;
- int boton_izq;
- int boton_dch;
+ int mouseX;
+ int mouseY;
+ int mouseY_ant;
+ int button_izq;
+ int button_dch;
bool escoba();
void black();
+ void talk_vb(int);
void talk_vb(const char *, const char *);
+ void talk_vbpuerta(int);
void talk_vbpuerta(const char *said, const char *filename);
void talk_ciego(const char *, const char *, const char *);
void talk_hacker(const char *, const char *);
@@ -487,7 +411,7 @@ public:
void pon_vb();
void lleva_vb(int punto_x);
void hipo_sin_nadie(int counter);
- void openDoor(int nflag, int n_puerta);
+ void openDoor(int nflag, int doorNum);
void mapa();
void animation_1_1();
void animation_2_1();
@@ -598,15 +522,16 @@ public:
char LimitaVGA(char valor);
void color_abc(int cl);
void centra_texto(const char *,int,int);
- void comienza_sound(const char *);
- void anima(const char *animation, int FPS);
- void fin_sound_corte();
+ void playSound(const char *);
+ bool anima(const char *animation, int FPS);
+ void stopSound_corte();
void FundeAlNegro(int VelocidadDeFundido);
void pause(int);
void talk_dr_grande(const char *said, const char *filename);
void pon_igor();
void pon_bj();
void pon_dr();
+ void talkInit(const char *filename);
void talk_igor_dch(const char *said, const char *filename);
void talk_dr_dch(const char *said, const char *filename);
void talk_dr_izq(const char *said, const char *filename);
@@ -616,19 +541,21 @@ public:
void talk_igorpuerta(const char *said, const char *filename);
void talk_igor_peluca(const char *said, const char *filename);
void hipo(int);
- void fin_sound();
+ void stopSound();
+ void talk_bj(int);
void talk_bj(const char *, const char *);
void talk_baul(const char *said, const char *filename);
+ void talk(int);
void talk(const char *, const char *);
void talk_sinc(const char *, const char *, const char *);
- void cierra_puerta(int nflag, int n_puerta);
+ void closeDoor(int nflag, int doorNum);
void playMusic(int p);
void stopMusic();
int musicStatus();
void updateRoom();
bool carga_partida(const char *);
void puertas_cerradas(int);
- void animafin_sound_corte();
+ void animastopSound_corte();
void color_hare();
void funde_hare(int oscuridad);
void paleta_hare_claro();
@@ -684,10 +611,10 @@ public:
int vez();
void reduce_hare_chico(int, int, int, int, int, int, int, byte *, byte *);
char codifica(char);
- void cuadrante_1();
- void cuadrante_2();
- void cuadrante_3();
- void cuadrante_4();
+ void quadrant_1();
+ void quadrant_2();
+ void quadrant_3();
+ void quadrant_4();
void update_62();
void update_62_pre();
void update_63();
@@ -695,6 +622,7 @@ public:
void aumenta_num_frame();
int sobre_que_objeto();
bool comprueba_banderas_menu();
+ bool roomParse(RoomTalkAction*, int);
void room_0();
void room_1(int);
void room_2(int);
@@ -728,7 +656,7 @@ public:
void room_63(int);
void conversa(const char *);
void print_abc_opc(const char *, int, int, int);
- void responde(int);
+ void response(int);
void talk_borracho(const char *said, const char *filename);
void talk_pianista(const char *said, const char *filename);
@@ -822,6 +750,7 @@ public:
void talk_pen(const char *, const char *);
void talk_pen2(const char *, const char *);
void talk_taber2(const char *, const char *);
+ void talk_bj_cama(int);
void talk_bj_cama(const char *said, const char * filename);
void talk_htel(const char *said, const char *filename);
@@ -842,7 +771,7 @@ extern const char *_textvb[][63];
extern const char *_textsys[][4];
extern const char *_texthis[][5];
extern const char *_textverbs[][6];
-extern const char *_textmisc[][1];
+extern const char *_textmisc[][2];
extern const char *_textd1[][11];
} // End of namespace Drascula
diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp
index 7f6fa8f8b3..50f1110c23 100644
--- a/engines/drascula/rooms.cpp
+++ b/engines/drascula/rooms.cpp
@@ -32,132 +32,252 @@ static const char mirar_v[3][14] = {"100.als", "101.als", "54.als"};
static const int poder_t[6] = {11, 109, 111, 110, 115, 116};
static const char poder_v[6][14] = {"11.als", "109.als", "111.als", "110.als", "115.als", "116.als"};
+struct RoomTalkAction {
+ int num;
+ int action;
+ int objectID;
+ int speechID;
+};
+
+// TODO: move these elsewhere, or in a .dat file?
+// Note: default action needs to be LAST for each group
+// of actions with the same number
+RoomTalkAction room0Actions[] = {
+ // num action object speech
+ { 1, kVerbLook, -1, 54 },
+ { 1, kVerbMove, -1, 19 },
+ { 1, kVerbPick, -1, 11 },
+ { 1, kVerbOpen, -1, 9 },
+ { 1, kVerbClose, -1, 9 },
+ { 1, kVerbTalk, -1, 16 },
+ { 1, kVerbDefault, -1, 11 },
+ // -------------------------------
+ { 2, kVerbMove, -1, 19 },
+ { 2, kVerbOpen, -1, 9 },
+ { 2, kVerbClose, -1, 9 },
+ { 2, kVerbTalk, -1, 16 },
+ // -------------------------------
+ { 3, kVerbLook, -1, 316 },
+ { 3, kVerbMove, -1, 317 },
+ { 3, kVerbPick, -1, 318 },
+ { 3, kVerbOpen, -1, 319 },
+ { 3, kVerbClose, -1, 319 },
+ { 3, kVerbTalk, -1, 320 },
+ { 3, kVerbDefault, -1, 318 },
+ // -------------------------------
+ { 4, kVerbMove, -1, 19 },
+ { 4, kVerbOpen, -1, 9 },
+ { 4, kVerbClose, -1, 9 },
+ { 4, kVerbTalk, -1, 16 },
+ // -------------------------------
+ { 5, kVerbOpen, -1, 9 },
+ { 5, kVerbClose, -1, 9 },
+ { 5, kVerbTalk, -1, 16 },
+ // -------------------------------
+ { 6, kVerbMove, -1, 19 },
+ { 6, kVerbOpen, -1, 9 },
+ { 6, kVerbClose, -1, 9 },
+ { 6, kVerbTalk, -1, 16 }
+};
+
+RoomTalkAction room1Actions[] = {
+ // num action object speech
+ { -1, kVerbPick, 118, 5 },
+ { -1, kVerbOpen, 118, 3 },
+ { -1, kVerbClose, 118, 4 },
+ { -1, kVerbTalk, 118, 6 },
+ // -------------------------------
+ { -1, kVerbLook, 119, 8 },
+ { -1, kVerbMove, 119, 13 },
+ { -1, kVerbClose, 119, 10 },
+ { -1, kVerbTalk, 119, 12 },
+ // -------------------------------
+ { -1, kVerbMove, 120, 13 },
+ { -1, kVerbOpen, 120, 18 },
+ { -1, kVerbTalk, 120, 15 }
+};
+
+RoomTalkAction room3Actions[] = {
+ // num action object speech
+ { -1, kVerbLook, 129, 21 },
+ { -1, kVerbPick, 129, 5 },
+ { -1, kVerbMove, 129, 24 },
+ { -1, kVerbOpen, 129, 22 },
+ { -1, kVerbClose, 129, 10 },
+ // -------------------------------
+ { -1, kVerbLook, 131, 27 },
+ { -1, kVerbPick, 131, 5 },
+ { -1, kVerbMove, 131, 24 },
+ { -1, kVerbOpen, 131, 22 },
+ { -1, kVerbClose, 131, 10 },
+ { -1, kVerbTalk, 131, 23 },
+ // -------------------------------
+ { -1, kVerbLook, 132, 28 },
+ { -1, kVerbPick, 132, 5 },
+ { -1, kVerbMove, 132, 24 },
+ { -1, kVerbOpen, 132, 22 },
+ { -1, kVerbClose, 132, 10 },
+ { -1, kVerbTalk, 132, 23 },
+ // -------------------------------
+ { -1, kVerbLook, 133, 321 },
+ { -1, kVerbPick, 133, 31 },
+ { -1, kVerbMove, 133, 34 },
+ { -1, kVerbOpen, 133, 30 },
+ { -1, kVerbClose, 133, 10 },
+ // -------------------------------
+ { -1, kVerbLook, 166, 55 },
+ { -1, kVerbPick, 166, 7 },
+ // -------------------------------
+ { -1, kVerbLook, 211, 184 }
+};
+
+RoomTalkAction room4Actions[] = {
+ // num action object speech
+ { -1, kVerbLook, 189, 182 },
+ // -------------------------------
+ { -1, kVerbLook, 207, 175 },
+ { -1, kVerbTalk, 207, 176 },
+ // -------------------------------
+ { -1, kVerbLook, 208, 177 },
+ // -------------------------------
+ { -1, kVerbLook, 209, 179 },
+ // -------------------------------
+ { -1, kVerbLook, 210, 180 },
+ { -1, kVerbOpen, 210, 181 }
+};
+
+RoomTalkAction room5Actions[] = {
+ // num action object speech
+ { -1, kVerbMove, 136, 13 },
+ { -1, kVerbOpen, 136, 18 },
+ { -1, kVerbTalk, 136, 15 },
+ // -------------------------------
+ { -1, kVerbLook, 212, 187 },
+ { -1, kVerbTalk, 212, 188 },
+ // -------------------------------
+ { -1, kVerbLook, 213, 189 },
+ { -1, kVerbOpen, 213, 190 }
+};
+
+RoomTalkAction room6Actions[] = {
+ // num action object speech
+ { -1, kVerbPick, 144, 43 },
+ // -------------------------------
+ { -1, kVerbLook, 138, 35 },
+ { -1, kVerbTalk, 138, 6 },
+ // -------------------------------
+ { -1, kVerbLook, 143, 37 },
+ { -1, kVerbPick, 143, 7 },
+ { -1, kVerbMove, 143, 7 },
+ { -1, kVerbTalk, 143, 38 },
+ // -------------------------------
+ { -1, kVerbLook, 139, 36 },
+ // -------------------------------
+ { -1, kVerbLook, 140, 147 }
+};
+
+RoomTalkAction room12Actions[] = {
+ // num action object speech
+ { -1, kVerbLook, 154, 329 },
+ { -1, kVerbTalk, 154, 330 },
+ // -------------------------------
+ { -1, kVerbMove, 155, 48 },
+ { -1, kVerbTalk, 155, 331 },
+ // -------------------------------
+ { -1, kVerbLook, 156, 35 },
+ { -1, kVerbMove, 156, 48 },
+ { -1, kVerbTalk, 156, 50 },
+};
+
+bool DrasculaEngine::roomParse(RoomTalkAction* roomActions, int fl) {
+ bool didAction = false;
+
+ for (int i = 0; i < ARRAYSIZE(roomActions); i++) {
+ if (roomActions[i].num == num_ejec ||
+ roomActions[i].num == -1) {
+ if (roomActions[i].action == pickedObject ||
+ roomActions[i].action == kVerbDefault) {
+ if (roomActions[i].objectID == fl ||
+ roomActions[i].objectID == -1) {
+ talk(roomActions[i].speechID);
+ didAction = true;
+ break;
+ }
+ }
+ }
+ }
+
+ return didAction;
+}
+
void DrasculaEngine::room_0() {
- if (num_ejec == 1) {
- if (objeto_que_lleva == LOOK)
- talk(_text[_lang][54], "54.als");
- else if (objeto_que_lleva == MOVE)
- talk(_text[_lang][19], "19.als");
- else if (objeto_que_lleva == PICK)
- talk(_text[_lang][11], "11.als");
- else if (objeto_que_lleva == OPEN)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == CLOSE)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == TALK)
- talk(_text[_lang][16], "16.als");
- else
- talk(_text[_lang][11],"11.als");
- } else if (num_ejec == 2) {
- if (objeto_que_lleva == LOOK) {
+ if (roomParse(room0Actions, -1))
+ return;
+
+ // non-default actions
+ if (num_ejec == 2) {
+ if (pickedObject == kVerbLook) {
talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]);
c_mirar++;
if (c_mirar == 3)
c_mirar = 0;
- } else if (objeto_que_lleva == MOVE) {
- talk(_text[_lang][19], "19.als");
- } else if (objeto_que_lleva == PICK) {
+ } else if (pickedObject == kVerbPick) {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
- } else if (objeto_que_lleva == OPEN)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == CLOSE)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == TALK)
- talk(_text[_lang][16], "16.als");
- else {
+ } else {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
}
- } else if (num_ejec == 3) {
- if (objeto_que_lleva == LOOK)
- talk(_text[_lang][316], "316.als");
- else if (objeto_que_lleva == MOVE)
- talk(_text[_lang][317], "317.als");
- else if (objeto_que_lleva == PICK)
- talk(_text[_lang][318], "318.als");
- else if (objeto_que_lleva == OPEN)
- talk(_text[_lang][319], "319.als");
- else if (objeto_que_lleva == CLOSE)
- talk(_text[_lang][319], "319.als");
- else if (objeto_que_lleva == TALK)
- talk(_text[_lang][320], "320.als");
- else
- talk(_text[_lang][318], "318.als");
} else if (num_ejec == 4) {
- if (objeto_que_lleva == LOOK) {
+ if (pickedObject == kVerbLook) {
talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]);
c_mirar++;
if (c_mirar == 3)
c_mirar = 0;
- } else if (objeto_que_lleva == MOVE)
- talk(_text[_lang][19], "19.als");
- else if (objeto_que_lleva == PICK) {
+ } else if (pickedObject == kVerbPick) {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
- } else if (objeto_que_lleva == OPEN)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == CLOSE)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == TALK)
- talk(_text[_lang][16], "16.als");
- else {
+ } else {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
}
} else if (num_ejec == 5) {
- if (objeto_que_lleva == LOOK) {
+ if (pickedObject == kVerbLook) {
talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]);
c_mirar++;
if (c_mirar == 3)
c_mirar = 0;
- } else if (objeto_que_lleva == MOVE)
- talk(_text[_lang][19], "19.als");
- else if (objeto_que_lleva == PICK) {
+ } else if (pickedObject == kVerbPick) {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
- } else if (objeto_que_lleva == OPEN)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == CLOSE)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == TALK)
- talk(_text[_lang][16], "16.als");
- else {
+ } else {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
}
} else if (num_ejec == 6) {
- if (objeto_que_lleva == LOOK) {
+ if (pickedObject == kVerbLook) {
talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]);
c_mirar++;
if (c_mirar == 3)
c_mirar = 0;
- } else if (objeto_que_lleva == MOVE)
- talk(_text[_lang][19], "19.als");
- else if (objeto_que_lleva == PICK) {
+ } else if (pickedObject == kVerbPick) {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
c_poder = 0;
- } else if (objeto_que_lleva == OPEN)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == CLOSE)
- talk(_text[_lang][9], "9.als");
- else if (objeto_que_lleva == TALK)
- talk(_text[_lang][16], "16.als");
- else {
+ } else {
talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]);
c_poder++;
if (c_poder == 6)
@@ -167,97 +287,37 @@ void DrasculaEngine::room_0() {
}
void DrasculaEngine::room_1(int fl) {
- if (objeto_que_lleva == LOOK && fl == 118) {
- talk(_text[_lang][1], "1.als");
+ if (roomParse(room1Actions, fl))
+ return;
+
+ if (pickedObject == kVerbLook && fl == 118) {
+ talk(1);
pause(10);
- talk(_text[_lang][2], "2.als");
- } else if (objeto_que_lleva == PICK && fl == 118)
- talk(_text[_lang][5], "5.als");
- else if (objeto_que_lleva == OPEN && fl == 118)
- talk(_text[_lang][3], "3.als");
- else if (objeto_que_lleva == CLOSE && fl == 118)
- talk(_text[_lang][4], "4.als");
- else if (objeto_que_lleva == TALK && fl == 118)
- talk(_text[_lang][6], "6.als");
- else if (objeto_que_lleva == LOOK && fl == 119)
- talk(_text[_lang][8], "8.als");
- else if (objeto_que_lleva == MOVE && fl == 119)
- talk(_text[_lang][13], "13.als");
- else if (objeto_que_lleva == CLOSE && fl == 119)
- talk(_text[_lang][10], "10.als");
- else if (objeto_que_lleva == TALK && fl == 119)
- talk(_text[_lang][12], "12.als");
- else if (objeto_que_lleva == LOOK && fl == 120 && flags[8] == 0)
- talk(_text[_lang][14], "14.als");
- else if (objeto_que_lleva == MOVE && fl == 120)
- talk(_text[_lang][13], "13.als");
- else if (objeto_que_lleva == OPEN && fl == 120)
- talk(_text[_lang][18], "18.als");
- else if (objeto_que_lleva == TALK && fl == 120)
- talk(_text[_lang][15], "15.als");
+ talk(2);
+ } else if (pickedObject == kVerbLook && fl == 120 && flags[8] == 0)
+ talk(14);
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_3(int fl) {
- if (objeto_que_lleva == LOOK && fl == 129)
- talk(_text[_lang][21], "21.als");
- else if (objeto_que_lleva == PICK && fl == 129)
- talk(_text[_lang][5], "5.als");
- else if (objeto_que_lleva == MOVE && fl == 129)
- talk(_text[_lang][24], "24.als");
- else if (objeto_que_lleva == OPEN && fl == 129)
- talk(_text[_lang][22], "22.als");
- else if (objeto_que_lleva == CLOSE && fl == 129)
- talk(_text[_lang][10], "10.als");
- else if (objeto_que_lleva == TALK && fl == 129) {
- talk(_text[_lang][23], "23.als");
+ if (roomParse(room3Actions, fl))
+ return;
+
+ if (pickedObject == kVerbTalk && fl == 129) {
+ talk(23);
pause(6);
talk_sinc(_text[_lang][50], "50.als", "11111111111144432554433");
- } else if (objeto_que_lleva == LOOK && fl == 131)
- talk(_text[_lang][27], "27.als");
- else if (objeto_que_lleva == PICK && fl == 131)
- talk(_text[_lang][5], "5.als");
- else if (objeto_que_lleva == MOVE && fl == 131)
- talk(_text[_lang][24], "24.als");
- else if (objeto_que_lleva == OPEN && fl == 131)
- talk(_text[_lang][22], "22.als");
- else if (objeto_que_lleva == CLOSE && fl == 131)
- talk(_text[_lang][10], "10.als");
- else if (objeto_que_lleva == TALK && fl == 131)
- talk(_text[_lang][23], "23.als");
- else if (objeto_que_lleva == LOOK && fl == 132)
- talk(_text[_lang][28], "28.als");
- else if (objeto_que_lleva == PICK && fl == 132)
- talk(_text[_lang][5], "5.als");
- else if (objeto_que_lleva == MOVE && fl == 132)
- talk(_text[_lang][24], "24.als");
- else if (objeto_que_lleva == OPEN && fl == 132)
- talk(_text[_lang][22], "22.als");
- else if (objeto_que_lleva == CLOSE && fl == 132)
- talk(_text[_lang][10], "10.als");
- else if (objeto_que_lleva == TALK && fl == 132)
- talk(_text[_lang][23], "23.als");
- else if (objeto_que_lleva == LOOK && fl == 133)
- talk(_text[_lang][321], "321.als");
- else if (objeto_que_lleva == PICK && fl == 133)
- talk(_text[_lang][31], "31.als");
- else if (objeto_que_lleva == MOVE && fl == 133)
- talk(_text[_lang][34], "34.als");
- else if (objeto_que_lleva == OPEN && fl == 133)
- talk(_text[_lang][30], "30.als");
- else if (objeto_que_lleva == CLOSE && fl == 133)
- talk(_text[_lang][10], "10.als");
- else if (objeto_que_lleva == TALK && fl == 133) {
+ } else if (pickedObject == kVerbTalk && fl == 133) {
talk_sinc(_text[_lang][322], "322.als", "13333334125433333333");
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(25);
- talk(_text[_lang][33], "33.als");
- } else if (objeto_que_lleva == LOOK && fl == 165) {
- talk(_text[_lang][149], "149.als");
- talk(_text[_lang][150], "150.als");
- } else if (objeto_que_lleva == PICK && fl == 165) {
+ talk(33);
+ } else if (pickedObject == kVerbLook && fl == 165) {
+ talk(149);
+ talk(150);
+ } else if (pickedObject == kVerbPick && fl == 165) {
copyBackground(0, 0, 0,0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateRefresh_pre();
copyRect(44, 1, hare_x, hare_y, 41, 70, dir_dibujo2, dir_zona_pantalla);
@@ -267,134 +327,92 @@ void DrasculaEngine::room_3(int fl) {
pickObject(10);
flags[3] = 1;
visible[8] = 0;
- } else if (objeto_que_lleva == LOOK && fl == 166)
- talk(_text[_lang][55], "55.als");
- else if (objeto_que_lleva == PICK && fl == 166)
- talk(_text[_lang][7], "7.als");
- else if (objeto_que_lleva == 14 && fl == 166 && flags[37] == 0) {
+ } else if (pickedObject == 14 && fl == 166 && flags[37] == 0) {
animation_7_2();
pickObject(8);
- } else if (objeto_que_lleva == 14 && fl == 166 && flags[37] == 1)
- talk(_text[_lang][323], "323.als");
- else if (objeto_que_lleva == LOOK && fl == 211)
- talk(_text[_lang][184], "184.als");
- else if (objeto_que_lleva == TALK && fl == 211) {
- talk(_text[_lang][185], "185.als");
- talk(_text[_lang][186], "186.als");
+ } else if (pickedObject == 14 && fl == 166 && flags[37] == 1)
+ talk(323);
+ else if (pickedObject == kVerbTalk && fl == 211) {
+ talk(185);
+ talk(186);
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_4(int fl) {
- if (objeto_que_lleva == MOVE && fl == 189 && flags[34] == 0) {
- talk(_text[_lang][327], "327.als");
+ if (roomParse(room4Actions, fl))
+ return;
+
+ if (pickedObject == kVerbMove && fl == 189 && flags[34] == 0) {
+ talk(327);
pickObject(13);
flags[34] = 1;
if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1)
flags[38] = 1;
- } else if (objeto_que_lleva == LOOK && fl == 189)
- talk(_text[_lang][182], "182.als");
- else if (objeto_que_lleva == LOOK && fl == 207)
- talk(_text[_lang][175], "175.als");
- else if (objeto_que_lleva == TALK && fl == 207)
- talk(_text[_lang][176], "176.als");
- else if (objeto_que_lleva == LOOK && fl == 208)
- talk(_text[_lang][177], "177.als");
- else if (objeto_que_lleva == LOOK && fl == 209)
- talk(_text[_lang][179], "179.als");
- else if (objeto_que_lleva == LOOK && fl == 210)
- talk(_text[_lang][180], "180.als");
- else if (objeto_que_lleva == OPEN && fl == 210)
- talk(_text[_lang][181], "181.als");
- else
- hay_respuesta = 0;
+ } else
+ hay_answer = 0;
}
void DrasculaEngine::room_5(int fl) {
- if (objeto_que_lleva == LOOK && fl == 136 && flags[8]==0) talk(_text[_lang][14], "14.als");
- else if (objeto_que_lleva == MOVE && fl == 136)
- talk(_text[_lang][13], "13.als");
- else if (objeto_que_lleva == OPEN && fl == 136)
- talk(_text[_lang][18], "18.als");
- else if (objeto_que_lleva == TALK && fl == 136)
- talk(_text[_lang][15], "15.als");
- else if (objeto_que_lleva == 10 && fl == 136) {
+ if (roomParse(room5Actions, fl))
+ return;
+
+ if (pickedObject == kVerbLook && fl == 136 && flags[8] == 0)
+ talk(14);
+ else if (pickedObject == 10 && fl == 136) {
animation_5_2();
resta_objeto(10);
- } else if (objeto_que_lleva == LOOK && fl == 212)
- talk(_text[_lang][187], "187.als");
- else if (objeto_que_lleva == TALK && fl == 212)
- talk(_text[_lang][188], "188.als");
- else if (objeto_que_lleva == LOOK && fl == 213)
- talk(_text[_lang][189], "189.als");
- else if (objeto_que_lleva == OPEN && fl == 213)
- talk(_text[_lang][190], "190.als");
- else
- hay_respuesta = 0;
+ } else
+ hay_answer = 0;
}
void DrasculaEngine::room_6(int fl){
- if (objeto_que_lleva == LOOK && fl==144) {
- talk(_text[_lang][41], "41.als");
- talk(_text[_lang][42], "42.als");
- } else if (objeto_que_lleva == PICK && fl == 144)
- talk(_text[_lang][43], "43.als");
- else if (objeto_que_lleva == LOOK && fl == 138)
- talk(_text[_lang][35], "35.als");
- else if (objeto_que_lleva == OPEN && fl == 138)
+ if (roomParse(room6Actions, fl))
+ return;
+
+ if (pickedObject == kVerbLook && fl==144) {
+ talk(41);
+ talk(42);
+ } else if (pickedObject == kVerbOpen && fl == 138)
openDoor(0, 1);
- else if (objeto_que_lleva == CLOSE && fl == 138)
- cierra_puerta(0, 1);
- else if (objeto_que_lleva == TALK && fl == 138)
- talk(_text[_lang][6], "6.als");
- else if (objeto_que_lleva == LOOK && fl == 143)
- talk(_text[_lang][37], "37.als");
- else if (objeto_que_lleva == PICK && fl == 143)
- talk(_text[_lang][7], "7.als");
- else if (objeto_que_lleva == MOVE && fl == 143)
- talk(_text[_lang][7], "7.als");
- else if (objeto_que_lleva == OPEN && fl == 143 && flags[2] == 0) {
+ else if (pickedObject == kVerbClose && fl == 138)
+ closeDoor(0, 1);
+ else if (pickedObject == kVerbOpen && fl == 143 && flags[2] == 0) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
- updateRefresh_pre();
- copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, dir_dibujo3, dir_zona_pantalla);
- updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- pause(10);
- comienza_sound("s3.als");
- flags[2] = 1;
- updateRoom();
- updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
- } else if (objeto_que_lleva == CLOSE && fl == 143 && flags[2] == 1) {
+ updateRefresh_pre();
+ copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, dir_dibujo3, dir_zona_pantalla);
+ updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
+ pause(10);
+ playSound("s3.als");
+ flags[2] = 1;
+ updateRoom();
+ updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
+ stopSound();
+ } else if (pickedObject == kVerbClose && fl == 143 && flags[2] == 1) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
flags[2] = 0;
updateRefresh_pre();
copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, dir_dibujo3, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(5);
- comienza_sound("s4.als");
+ playSound("s4.als");
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
- } else if (objeto_que_lleva == TALK && fl == 143)
- talk(_text[_lang][38], "38.als");
- else if (objeto_que_lleva == LOOK && fl == 139)
- talk(_text[_lang][36], "36.als");
- else if (objeto_que_lleva == OPEN && fl == 139 && flags[1] == 0) {
+ stopSound();
+ } else if (pickedObject == kVerbOpen && fl == 139 && flags[1] == 0) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateRefresh_pre();
copyRect(267, 1, hare_x - 14, hare_y - 2, 52, 73, dir_dibujo3, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(19);
- comienza_sound("s3.als");
+ playSound("s3.als");
flags[1] = 1;
visible[4] = 1;
visible[2] = 0;
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- fin_sound();
- } else if (objeto_que_lleva == LOOK && fl == 140)
- talk(_text[_lang][147], "147.als");
- else if (objeto_que_lleva == PICK && fl == 140) {
+ stopSound();
+ } else if (pickedObject == kVerbPick && fl == 140) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateRefresh_pre();
copyRect(267, 1, hare_x - 14, hare_y - 2, 52, 73, dir_dibujo3, dir_zona_pantalla);
@@ -403,192 +421,181 @@ void DrasculaEngine::room_6(int fl){
pickObject(9);
visible[4] = 0;
flags[10] = 1;
- } else if (objeto_que_lleva == OPEN && fl == 140)
- hay_respuesta = 1;
+ } else if (pickedObject == kVerbOpen && fl == 140)
+ hay_answer = 1;
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_7(int fl){
- if (objeto_que_lleva == LOOK && fl == 169)
- talk(_text[_lang][44], "44.als");
- else if (objeto_que_lleva == LOOK && fl == 164)
- talk(_text[_lang][35], "35.als" );
- else if (objeto_que_lleva == PICK && fl == 190) {
+ if (pickedObject == kVerbLook && fl == 169)
+ talk(44);
+ else if (pickedObject == kVerbLook && fl == 164)
+ talk(35);
+ else if (pickedObject == kVerbPick && fl == 190) {
pickObject(17);
flags[35] = 1;
visible[3] = 0;
if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1)
flags[38] = 1;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_8(int fl) {
- if (objeto_que_lleva == LOOK && fl == 147 && flags[7] == 0) {
- talk(_text[_lang][58], "58.als");
+ if (pickedObject == kVerbLook && fl == 147 && flags[7] == 0) {
+ talk(58);
pickObject(15);
flags[7] = 1;
if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1)
flags[38] = 1;
- } else if (objeto_que_lleva == LOOK && fl == 147)
- talk(_text[_lang][59], "59.als");
+ } else if (pickedObject == kVerbLook && fl == 147)
+ talk(59);
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_9(int fl){
- if (objeto_que_lleva == LOOK && fl == 150)
- talk(_text[_lang][35], "35.als");
- else if (objeto_que_lleva == TALK && fl == 150)
- talk(_text[_lang][6], "6.als");
- else if (objeto_que_lleva == LOOK && fl == 51)
- talk(_text[_lang][60], "60.als");
- else if (objeto_que_lleva == TALK && fl == 51 && flags[4] == 0)
+ if (pickedObject == kVerbLook && fl == 150)
+ talk(35);
+ else if (pickedObject == kVerbTalk && fl == 150)
+ talk(6);
+ else if (pickedObject == kVerbLook && fl == 51)
+ talk(60);
+ else if (pickedObject == kVerbTalk && fl == 51 && flags[4] == 0)
animation_4_2();
- else if (objeto_que_lleva == TALK && fl == 51 && flags[4] == 1)
+ else if (pickedObject == kVerbTalk && fl == 51 && flags[4] == 1)
animation_33_2();
- else if (objeto_que_lleva == 7 && fl == 51) {
+ else if (pickedObject == 7 && fl == 51) {
animation_6_2();
resta_objeto(7);
pickObject(14);}
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_12(int fl){
- if (objeto_que_lleva == LOOK && fl == 154)
- talk(_text[_lang][329], "329.als");
- else if (objeto_que_lleva == TALK && fl == 154)
- talk(_text[_lang][330], "330.als");
- else if (objeto_que_lleva == MOVE && fl == 155)
- talk(_text[_lang][48], "48.als");
- else if (objeto_que_lleva == TALK && fl == 155)
- talk(_text[_lang][331], "331.als");
- else if (objeto_que_lleva == LOOK && fl == 156)
- talk(_text[_lang][35], "35.als");
- else if (objeto_que_lleva == MOVE && fl == 156)
- talk(_text[_lang][48], "48.als");
- else if (objeto_que_lleva == TALK && fl == 156)
- talk(_text[_lang][50], "50.als");
- else if (objeto_que_lleva == OPEN && fl == 156)
+ if (roomParse(room12Actions, fl))
+ return;
+
+ if (pickedObject == kVerbOpen && fl == 156)
openDoor(16, 4);
- else if (objeto_que_lleva == CLOSE && fl == 156)
- cierra_puerta(16, 4);
+ else if (pickedObject == kVerbClose && fl == 156)
+ closeDoor(16, 4);
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
bool DrasculaEngine::room_13(int fl) {
- if (objeto_que_lleva == LOOK && fl == 51) {
- talk(_text[_lang][411], "411.als");
+ if (pickedObject == kVerbLook && fl == 51) {
+ talk(411);
sentido_hare = 3;
- talk(_text[_lang][412], "412.als");
+ talk(412);
strcpy(objName[1], "yoda");
- } else if (objeto_que_lleva == TALK && fl == 51)
+ } else if (pickedObject == kVerbTalk && fl == 51)
conversa("op_7.cal");
- else if (objeto_que_lleva == 19 && fl == 51)
+ else if (pickedObject == 19 && fl == 51)
animation_1_3();
- else if (objeto_que_lleva == 9 && fl == 51) {
+ else if (pickedObject == 9 && fl == 51) {
animation_2_3();
return true;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
return false;
}
void DrasculaEngine::room_14(int fl) {
- if (objeto_que_lleva == TALK && fl == 54 && flags[39] == 0)
+ if (pickedObject == kVerbTalk && fl == 54 && flags[39] == 0)
animation_12_2();
- else if (objeto_que_lleva == TALK && fl == 54 && flags[39] == 1)
- talk(_text[_lang][109], "109.als");
- else if (objeto_que_lleva == 12 && fl == 54)
+ else if (pickedObject == kVerbTalk && fl == 54 && flags[39] == 1)
+ talk(109);
+ else if (pickedObject == 12 && fl == 54)
animation_26_2();
- else if (objeto_que_lleva == TALK && fl == 52 && flags[5] == 0)
+ else if (pickedObject == kVerbTalk && fl == 52 && flags[5] == 0)
animation_11_2();
- else if (objeto_que_lleva == TALK && fl == 52 && flags[5] == 1)
+ else if (pickedObject == kVerbTalk && fl == 52 && flags[5] == 1)
animation_36_2();
- else if (objeto_que_lleva == TALK && fl == 53)
+ else if (pickedObject == kVerbTalk && fl == 53)
animation_13_2();
- else if (objeto_que_lleva == LOOK && fl == 200)
- talk(_text[_lang][165], "165.als");
- else if (objeto_que_lleva == LOOK && fl == 201)
- talk(_text[_lang][166], "166.als");
- else if (objeto_que_lleva == LOOK && fl == 202)
- talk(_text[_lang][167], "167.als");
- else if (objeto_que_lleva == LOOK && fl == 203)
- talk(_text[_lang][168], "168.als");
- else if (objeto_que_lleva == PICK && fl == 203)
- talk(_text[_lang][170], "170.als");
- else if (objeto_que_lleva == MOVE && fl == 203)
- talk(_text[_lang][170], "170.als");
- else if (objeto_que_lleva == TALK && fl == 203)
- talk(_text[_lang][169], "169.als");
- else if (objeto_que_lleva == LOOK && fl == 204)
- talk(_text[_lang][171], "171.als");
+ else if (pickedObject == kVerbLook && fl == 200)
+ talk(165);
+ else if (pickedObject == kVerbLook && fl == 201)
+ talk(166);
+ else if (pickedObject == kVerbLook && fl == 202)
+ talk(167);
+ else if (pickedObject == kVerbLook && fl == 203)
+ talk(168);
+ else if (pickedObject == kVerbPick && fl == 203)
+ talk(170);
+ else if (pickedObject == kVerbMove && fl == 203)
+ talk(170);
+ else if (pickedObject == kVerbTalk && fl == 203)
+ talk(169);
+ else if (pickedObject == kVerbLook && fl == 204)
+ talk(171);
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_15(int fl) {
- if (objeto_que_lleva == TALK && fl == 188)
- talk(_text[_lang][333], "333.als");
- else if (objeto_que_lleva == LOOK && fl == 188)
- talk(_text[_lang][334], "334.als");
- else if (objeto_que_lleva == 19 && fl == 188 && flags[27] == 0)
- talk(_text[_lang][335], "335.als");
- else if (objeto_que_lleva == 19 && fl == 188 && flags[27] == 1) {
- talk(_text[_lang][336], "336.als");
+ if (pickedObject == kVerbTalk && fl == 188)
+ talk(333);
+ else if (pickedObject == kVerbLook && fl == 188)
+ talk(334);
+ else if (pickedObject == 19 && fl == 188 && flags[27] == 0)
+ talk(335);
+ else if (pickedObject == 19 && fl == 188 && flags[27] == 1) {
+ talk(336);
sentido_hare = 3;
- talk(_text[_lang][337], "337.als");
+ talk(337);
talk_sinc(_text[_lang][46], "46.als", "4442444244244");
sentido_hare = 1;
- } else if (objeto_que_lleva == 18 && fl == 188 && flags[26] == 0) {
+ } else if (pickedObject == 18 && fl == 188 && flags[26] == 0) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
copyRect(133, 135, hare_x + 6, hare_y, 39, 63, dir_dibujo3, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- comienza_sound("s8.als");
- fin_sound();
+ playSound("s8.als");
+ stopSound();
talk(_text[_lang][338], "338.als");
flags[27] = 0;
pickObject(19);
resta_objeto(18);
- } else if (objeto_que_lleva == MOVE && fl == 188 && flags[27] == 0) {
+ } else if (pickedObject == kVerbMove && fl == 188 && flags[27] == 0) {
animation_34_2();
- talk(_text[_lang][339], "339.als");
+ talk(339);
pickObject(16);
flags[26] = 1;
flags[27] = 1;
if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1)
flags[38] = 1;
- } else if (objeto_que_lleva == LOOK && fl == 205)
- talk(_text[_lang][172], "172.als");
- else if (objeto_que_lleva == LOOK && fl == 206)
- talk(_text[_lang][173], "173.als");
- else if (objeto_que_lleva == MOVE && fl == 206)
- talk(_text[_lang][174], "174.als");
- else if (objeto_que_lleva == OPEN && fl == 206)
- talk(_text[_lang][174], "174.als");
+ } else if (pickedObject == kVerbLook && fl == 205)
+ talk(172);
+ else if (pickedObject == kVerbLook && fl == 206)
+ talk(173);
+ else if (pickedObject == kVerbMove && fl == 206)
+ talk(174);
+ else if (pickedObject == kVerbOpen && fl == 206)
+ talk(174);
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_16(int fl) {
- if (objeto_que_lleva == TALK && fl == 163)
+ if (pickedObject == kVerbTalk && fl == 163)
talk(_text[_lang][6], "6.als");
- else if (objeto_que_lleva == OPEN && fl == 163)
+ else if (pickedObject == kVerbOpen && fl == 163)
openDoor(17, 0);
- else if (objeto_que_lleva == CLOSE && fl == 163)
- cierra_puerta(17, 0);
- else if (objeto_que_lleva == LOOK && fl == 183)
+ else if (pickedObject == kVerbClose && fl == 163)
+ closeDoor(17, 0);
+ else if (pickedObject == kVerbLook && fl == 183)
talk(_text[_lang][340], "340.als");
- else if (objeto_que_lleva == TALK && fl == 183) {
+ else if (pickedObject == kVerbTalk && fl == 183) {
talk(_text[_lang][341], "341.als");
pause(10);
talk_sinc(_text[_lang][50], "50.als", "11111111111144432554433");
pause(3);
talk_baul(_text[_lang][83], "d83.als");
- } else if (objeto_que_lleva == OPEN && fl == 183) {
+ } else if (pickedObject == kVerbOpen && fl == 183) {
openDoor(19, NO_DOOR);
if (flags[20] == 0) {
flags[20] = 1;
@@ -598,60 +605,60 @@ void DrasculaEngine::room_16(int fl) {
talk(_text[_lang][342], "342.als");
pickObject(22);
}
- } else if (objeto_que_lleva == CLOSE && fl == 183)
- cierra_puerta(19, NO_DOOR);
- else if (objeto_que_lleva == LOOK && fl == 185)
+ } else if (pickedObject == kVerbClose && fl == 183)
+ closeDoor(19, NO_DOOR);
+ else if (pickedObject == kVerbLook && fl == 185)
talk(_text[_lang][37], "37.als");
- else if (objeto_que_lleva == PICK && fl == 185)
+ else if (pickedObject == kVerbPick && fl == 185)
talk(_text[_lang][7], "7.als");
- else if (objeto_que_lleva == MOVE && fl == 185)
+ else if (pickedObject == kVerbMove && fl == 185)
talk(_text[_lang][7], "7.als");
- else if (objeto_que_lleva == TALK && fl == 185)
+ else if (pickedObject == kVerbTalk && fl == 185)
talk(_text[_lang][38], "38.als");
- else if (objeto_que_lleva == LOOK && fl == 187) {
+ else if (pickedObject == kVerbLook && fl == 187) {
talk(_text[_lang][343], "343.als");
sentido_hare = 3;
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
talk(_text[_lang][344], "344.als");
- } else if (objeto_que_lleva == TALK && fl == 187)
+ } else if (pickedObject == kVerbTalk && fl == 187)
talk(_text[_lang][345], "345.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_17(int fl) {
- if (objeto_que_lleva == LOOK && fl == 177)
+ if (pickedObject == kVerbLook && fl == 177)
talk(_text[_lang][35], "35.als");
- else if (objeto_que_lleva == TALK && fl == 177 && flags[18] == 0)
+ else if (pickedObject == kVerbTalk && fl == 177 && flags[18] == 0)
talk(_text[_lang][6], "6.als");
- else if (objeto_que_lleva == TALK && fl == 177 && flags[18] == 1)
+ else if (pickedObject == kVerbTalk && fl == 177 && flags[18] == 1)
animation_18_2();
- else if (objeto_que_lleva == OPEN && fl == 177 && flags[18] == 1)
+ else if (pickedObject == kVerbOpen && fl == 177 && flags[18] == 1)
talk(_text[_lang][346], "346.als");
- else if (objeto_que_lleva == OPEN && fl == 177 && flags[14] == 0 && flags[18] == 0)
+ else if (pickedObject == kVerbOpen && fl == 177 && flags[14] == 0 && flags[18] == 0)
animation_22_2();
- else if (objeto_que_lleva == OPEN && fl == 177 && flags[14] == 1)
+ else if (pickedObject == kVerbOpen && fl == 177 && flags[14] == 1)
openDoor(15, 1);
- else if (objeto_que_lleva == CLOSE && fl == 177 && flags[14] == 1)
- cierra_puerta(15, 1);
- else if (objeto_que_lleva == 11 && fl == 50 && flags[22] == 0) {
+ else if (pickedObject == kVerbClose && fl == 177 && flags[14] == 1)
+ closeDoor(15, 1);
+ else if (pickedObject == 11 && fl == 50 && flags[22] == 0) {
talk(_text[_lang][347], "347.als");
flags[29] = 1;
pickObject(23);
resta_objeto(11);
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_18(int fl) {
- if (objeto_que_lleva == TALK && fl == 55 && flags[36] == 0)
+ if (pickedObject == kVerbTalk && fl == 55 && flags[36] == 0)
animation_24_2();
- else if (objeto_que_lleva == TALK && fl == 55 && flags[36] == 1)
+ else if (pickedObject == kVerbTalk && fl == 55 && flags[36] == 1)
talk(_text[_lang][109], "109.als");
- else if (objeto_que_lleva == LOOK && fl == 181)
+ else if (pickedObject == kVerbLook && fl == 181)
talk(_text[_lang][348], "348.als");
- else if (objeto_que_lleva == PICK && fl == 182) {
+ else if (pickedObject == kVerbPick && fl == 182) {
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateRefresh_pre();
copyRect(44, 1, hare_x, hare_y, 41, 70, dir_dibujo2, dir_zona_pantalla);
@@ -661,29 +668,29 @@ void DrasculaEngine::room_18(int fl) {
pickObject(12);
visible[2] = 0;
flags[28] = 1;
- } else if (objeto_que_lleva == LOOK && fl == 182)
+ } else if (pickedObject == kVerbLook && fl == 182)
talk(_text[_lang][154], "154.als");
- else if (objeto_que_lleva == 8 && fl == 55 && flags[38] == 0 && flags[33] == 1)
+ else if (pickedObject == 8 && fl == 55 && flags[38] == 0 && flags[33] == 1)
talk(_text[_lang][349], "349.als");
- else if (objeto_que_lleva == 13 && fl == 55 && flags[38] == 0 && flags[33] == 1)
+ else if (pickedObject == 13 && fl == 55 && flags[38] == 0 && flags[33] == 1)
talk(_text[_lang][349], "349.als");
- else if (objeto_que_lleva == 15 && fl == 55 && flags[38] == 0 && flags[33] == 1)
+ else if (pickedObject == 15 && fl == 55 && flags[38] == 0 && flags[33] == 1)
talk(_text[_lang][349], "349.als");
- else if (objeto_que_lleva == 16 && fl == 55 && flags[38] == 0 && flags[33] == 1)
+ else if (pickedObject == 16 && fl == 55 && flags[38] == 0 && flags[33] == 1)
talk(_text[_lang][349], "349.als");
- else if (objeto_que_lleva == 17 && fl == 55 && flags[38] == 0 && flags[33] == 1)
+ else if (pickedObject == 17 && fl == 55 && flags[38] == 0 && flags[33] == 1)
talk(_text[_lang][349], "349.als");
- else if (objeto_que_lleva == 8 && fl == 55 && flags[38] == 1 && flags[33] == 1)
+ else if (pickedObject == 8 && fl == 55 && flags[38] == 1 && flags[33] == 1)
animation_24_2();
- else if (objeto_que_lleva == 13 && fl == 55 && flags[38] == 1 && flags[33] == 1)
+ else if (pickedObject == 13 && fl == 55 && flags[38] == 1 && flags[33] == 1)
animation_24_2();
- else if (objeto_que_lleva == 15 && fl == 55 && flags[38] == 1 && flags[33] == 1)
+ else if (pickedObject == 15 && fl == 55 && flags[38] == 1 && flags[33] == 1)
animation_24_2();
- else if (objeto_que_lleva == 16 && fl == 55 && flags[38] == 1 && flags[33] == 1)
+ else if (pickedObject == 16 && fl == 55 && flags[38] == 1 && flags[33] == 1)
animation_24_2();
- else if (objeto_que_lleva == 17 && fl == 55 && flags[38] == 1 && flags[33] == 1)
+ else if (pickedObject == 17 && fl == 55 && flags[38] == 1 && flags[33] == 1)
animation_24_2();
- else if (objeto_que_lleva == 11 && fl == 50 && flags[22] == 0) {
+ else if (pickedObject == 11 && fl == 50 && flags[22] == 0) {
sentido_hare = 3;
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
@@ -698,85 +705,85 @@ void DrasculaEngine::room_18(int fl) {
pickObject(23);
resta_objeto(11);
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_19(int fl) {
- if (objeto_que_lleva == LOOK && fl == 214)
+ if (pickedObject == kVerbLook && fl == 214)
talk(_text[_lang][191], "191.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
bool DrasculaEngine::room_21(int fl) {
- if (objeto_que_lleva == OPEN && fl == 101 && flags[28] == 0)
+ if (pickedObject == kVerbOpen && fl == 101 && flags[28] == 0)
talk(_text[_lang][419], "419.als");
- else if (objeto_que_lleva == OPEN && fl == 101 && flags[28] == 1)
+ else if (pickedObject == kVerbOpen && fl == 101 && flags[28] == 1)
openDoor(0, 1);
- else if (objeto_que_lleva == CLOSE && fl == 101)
- cierra_puerta(0, 1);
- else if(objeto_que_lleva == PICK && fl == 141) {
+ else if (pickedObject == kVerbClose && fl == 101)
+ closeDoor(0, 1);
+ else if(pickedObject == kVerbPick && fl == 141) {
pickObject(19);
visible[2] = 0;
flags[10] = 1;
- } else if(objeto_que_lleva == 7 && fl == 101) {
+ } else if(pickedObject == 7 && fl == 101) {
flags[28] = 1;
openDoor(0, 1);
withoutVerb();
- } else if (objeto_que_lleva == 21 && fl == 179) {
+ } else if (pickedObject == 21 && fl == 179) {
animation_9_4();
return true;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
return false;
}
void DrasculaEngine::room_22(int fl) {
- if (objeto_que_lleva == PICK && fl == 140)
+ if (pickedObject == kVerbPick && fl == 140)
talk(_text[_lang][7], "7.als");
- else if (objeto_que_lleva == 11 && fl == 140) {
+ else if (pickedObject == 11 && fl == 140) {
pickObject(18);
visible[1] = 0;
flags[24] = 1;
- } else if (objeto_que_lleva == 22 && fl == 52) {
+ } else if (pickedObject == 22 && fl == 52) {
anima("up.bin",14);
flags[26]=1;
- comienza_sound("s1.als");
+ playSound("s1.als");
hipo(14);
- fin_sound();
+ stopSound();
withoutVerb();
resta_objeto(22);
updateData();
sentido_hare = 3;
talk(_text[_lang][499], "499.als");
talk(_text[_lang][500], "500.als");
- } else if (objeto_que_lleva == LOOK && fl == 52)
+ } else if (pickedObject == kVerbLook && fl == 52)
talk(_text[_lang][497], "497.als");
- else if (objeto_que_lleva == TALK && fl == 52)
+ else if (pickedObject == kVerbTalk && fl == 52)
talk(_text[_lang][498], "498.als");
- else if (objeto_que_lleva == PICK && fl == 180 && flags[26] == 0)
+ else if (pickedObject == kVerbPick && fl == 180 && flags[26] == 0)
talk(_text[_lang][420], "420.als");
- else if (objeto_que_lleva == PICK && fl == 180 && flags[26] == 1) {
+ else if (pickedObject == kVerbPick && fl == 180 && flags[26] == 1) {
pickObject(7);
visible[3] = 0;
flags[27] = 1;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_23(int fl) {
- if (objeto_que_lleva == OPEN && fl == 103) {
+ if (pickedObject == kVerbOpen && fl == 103) {
openDoor(0, 0);
updateData();
- } else if(objeto_que_lleva == CLOSE && fl == 103) {
- cierra_puerta(0, 0);
+ } else if(pickedObject == kVerbClose && fl == 103) {
+ closeDoor(0, 0);
updateData();
- } else if(objeto_que_lleva == OPEN && fl == 104)
+ } else if(pickedObject == kVerbOpen && fl == 104)
openDoor(1, 1);
- else if(objeto_que_lleva == CLOSE && fl == 104)
- cierra_puerta(1, 1);
- else if(objeto_que_lleva == PICK && fl == 142) {
+ else if(pickedObject == kVerbClose && fl == 104)
+ closeDoor(1, 1);
+ else if(pickedObject == kVerbPick && fl == 142) {
pickObject(8);
visible[2] = 0;
flags[11] = 1;
@@ -785,129 +792,129 @@ void DrasculaEngine::room_23(int fl) {
if (flags[18] == 1)
animation_6_4();
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_24(int fl) {
- if (objeto_que_lleva == OPEN && fl == 105)
+ if (pickedObject == kVerbOpen && fl == 105)
openDoor(1, 0);
- else if (objeto_que_lleva == CLOSE && fl == 105)
- cierra_puerta(1, 0);
- else if (objeto_que_lleva == OPEN && fl == 106)
+ else if (pickedObject == kVerbClose && fl == 105)
+ closeDoor(1, 0);
+ else if (pickedObject == kVerbOpen && fl == 106)
openDoor(2, 1);
- else if (objeto_que_lleva == CLOSE && fl == 106)
- cierra_puerta(2, 1);
- else if (objeto_que_lleva == LOOK && fl == 151)
+ else if (pickedObject == kVerbClose && fl == 106)
+ closeDoor(2, 1);
+ else if (pickedObject == kVerbLook && fl == 151)
talk(_text[_lang][461], "461.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_26(int fl) {
- if (objeto_que_lleva == OPEN && fl == 107 && flags[30] == 0)
+ if (pickedObject == kVerbOpen && fl == 107 && flags[30] == 0)
openDoor(2, 0);
- else if (objeto_que_lleva == OPEN && fl == 107 && flags[30] == 1)
+ else if (pickedObject == kVerbOpen && fl == 107 && flags[30] == 1)
talk(_text[_lang][421], "421.als");
- else if (objeto_que_lleva == CLOSE && fl == 107)
- cierra_puerta(2, 0);
- else if (objeto_que_lleva == 10 && fl == 50 && flags[18] == 1 && flags[12] == 1)
+ else if (pickedObject == kVerbClose && fl == 107)
+ closeDoor(2, 0);
+ else if (pickedObject == 10 && fl == 50 && flags[18] == 1 && flags[12] == 1)
animation_5_4();
- else if (objeto_que_lleva == 8 && fl == 50 && flags[18] == 1 && flags[12] == 1)
+ else if (pickedObject == 8 && fl == 50 && flags[18] == 1 && flags[12] == 1)
animation_5_4();
- else if (objeto_que_lleva == 12 && fl == 50 && flags[18] == 1 && flags[12] == 1)
+ else if (pickedObject == 12 && fl == 50 && flags[18] == 1 && flags[12] == 1)
animation_5_4();
- else if (objeto_que_lleva == 16 && fl == 50 && flags[18] == 1 && flags[12] == 1)
+ else if (pickedObject == 16 && fl == 50 && flags[18] == 1 && flags[12] == 1)
animation_5_4();
- else if (objeto_que_lleva == PICK && fl == 143 && flags[18] == 1) {
+ else if (pickedObject == kVerbPick && fl == 143 && flags[18] == 1) {
lleva_al_hare(260, 180);
pickObject(10);
visible[1] = 0;
flags[12] = 1;
- cierra_puerta(2, 0);
+ closeDoor(2, 0);
sentido_hare = 2;
talk_igorpuerta(_texti[_lang][27], "I27.als");
flags[30] = 1;
talk_igorpuerta(_texti[_lang][28], "I28.als");
lleva_al_hare(153, 180);
- } else if (objeto_que_lleva == PICK && fl == 143 && flags[18] == 0) {
+ } else if (pickedObject == kVerbPick && fl == 143 && flags[18] == 0) {
lleva_al_hare(260, 180);
copyBackground(80, 78, 199, 94, 38, 27, dir_dibujo3, dir_zona_pantalla);
updateScreen(199, 94, 199, 94, 38, 27, dir_zona_pantalla);
pause(3);
talk_igor_peluca(_texti[_lang][25], "I25.als");
lleva_al_hare(153, 180);
- } else if (objeto_que_lleva == TALK && fl == 51)
+ } else if (pickedObject == kVerbTalk && fl == 51)
animation_1_4();
- else if (objeto_que_lleva == OPEN && fl == 167)
+ else if (pickedObject == kVerbOpen && fl == 167)
talk(_text[_lang][467], "467.als");
- else if (objeto_que_lleva == LOOK && fl == 164)
+ else if (pickedObject == kVerbLook && fl == 164)
talk(_text[_lang][470], "470.als");
- else if (objeto_que_lleva == OPEN && fl == 164)
+ else if (pickedObject == kVerbOpen && fl == 164)
talk(_text[_lang][471], "471.als");
- else if (objeto_que_lleva == LOOK && fl == 163)
+ else if (pickedObject == kVerbLook && fl == 163)
talk(_text[_lang][472], "472.als");
- else if (objeto_que_lleva == PICK && fl == 163)
+ else if (pickedObject == kVerbPick && fl == 163)
talk(_text[_lang][473], "473.als");
- else if (objeto_que_lleva == LOOK && fl == 165)
+ else if (pickedObject == kVerbLook && fl == 165)
talk(_text[_lang][474], "474.als");
- else if (objeto_que_lleva == LOOK && fl == 168)
+ else if (pickedObject == kVerbLook && fl == 168)
talk(_text[_lang][476], "476.als");
- else if (objeto_que_lleva == PICK && fl == 168)
+ else if (pickedObject == kVerbPick && fl == 168)
talk(_text[_lang][477], "477.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_27(int fl) {
- if (objeto_que_lleva == OPEN && fl == 110)
+ if (pickedObject == kVerbOpen && fl == 110)
openDoor(6, 1);
- else if (objeto_que_lleva == CLOSE && fl == 110)
- cierra_puerta(6, 1);
- else if (objeto_que_lleva == OPEN && fl == 116 && flags[23] == 0)
+ else if (pickedObject == kVerbClose && fl == 110)
+ closeDoor(6, 1);
+ else if (pickedObject == kVerbOpen && fl == 116 && flags[23] == 0)
talk(_text[_lang][419], "419.als");
- else if (objeto_que_lleva == OPEN && fl == 116 && flags[23] == 1)
+ else if (pickedObject == kVerbOpen && fl == 116 && flags[23] == 1)
openDoor(5, 3);
- else if (objeto_que_lleva == 17 && fl == 116) {
+ else if (pickedObject == 17 && fl == 116) {
flags[23] = 1;
openDoor(5,3);
withoutVerb();
- } else if (objeto_que_lleva == LOOK && fl == 175)
+ } else if (pickedObject == kVerbLook && fl == 175)
talk(_text[_lang][429], "429.als");
else if (fl == 150)
talk(_text[_lang][460], "460.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_29(int fl) {
- if (objeto_que_lleva == OPEN && fl == 114)
+ if (pickedObject == kVerbOpen && fl == 114)
openDoor(4, 1);
- else if (objeto_que_lleva == CLOSE && fl == 114)
- cierra_puerta(4, 1);
- else if (objeto_que_lleva == LOOK && fl == 152)
+ else if (pickedObject == kVerbClose && fl == 114)
+ closeDoor(4, 1);
+ else if (pickedObject == kVerbLook && fl == 152)
talk(_text[_lang][463], "463.als");
- else if (objeto_que_lleva == OPEN && fl == 152)
+ else if (pickedObject == kVerbOpen && fl == 152)
talk(_text[_lang][464], "464.als");
- else if (objeto_que_lleva == LOOK && fl == 153)
+ else if (pickedObject == kVerbLook && fl == 153)
talk(_text[_lang][465], "465.als");
- else if (objeto_que_lleva == PICK && fl == 154)
+ else if (pickedObject == kVerbPick && fl == 154)
talk(_text[_lang][466], "466.als");
- else if (objeto_que_lleva == OPEN && fl == 156)
+ else if (pickedObject == kVerbOpen && fl == 156)
talk(_text[_lang][467], "467.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_30(int fl) {
- if (objeto_que_lleva == OPEN && fl == 115)
+ if (pickedObject == kVerbOpen && fl == 115)
openDoor(4, 0);
- else if (objeto_que_lleva == CLOSE && fl == 115)
- cierra_puerta(4, 0);
- else if (objeto_que_lleva == OPEN && fl == 144 && flags[19] == 0)
+ else if (pickedObject == kVerbClose && fl == 115)
+ closeDoor(4, 0);
+ else if (pickedObject == kVerbOpen && fl == 144 && flags[19] == 0)
talk(_text[_lang][422], "422.als");
- else if (objeto_que_lleva == OPEN && fl == 144 && flags[19] == 1 && flags[22] == 1)
+ else if (pickedObject == kVerbOpen && fl == 144 && flags[19] == 1 && flags[22] == 1)
openDoor(16, 1);
- else if (objeto_que_lleva == OPEN && fl == 144 && flags[19] == 1 && flags[22] == 0) {
+ else if (pickedObject == kVerbOpen && fl == 144 && flags[19] == 1 && flags[22] == 0) {
openDoor(16, 1);
talk(_text[_lang][423], "423.als");
flags[22] = 1;
@@ -916,59 +923,59 @@ void DrasculaEngine::room_30(int fl) {
flags[18] = 1;
if (flags[18] == 1)
animation_6_4();
- } else if (objeto_que_lleva == CLOSE && fl == 144)
- cierra_puerta(16, 1);
- else if (objeto_que_lleva == 13 && fl == 144) {
+ } else if (pickedObject == kVerbClose && fl == 144)
+ closeDoor(16, 1);
+ else if (pickedObject == 13 && fl == 144) {
talk(_text[_lang][424], "424.als");
flags[19] = 1;
- } else if (objeto_que_lleva == OPEN && fl == 157)
+ } else if (pickedObject == kVerbOpen && fl == 157)
talk(_text[_lang][468], "468.als");
- else if (objeto_que_lleva == LOOK && fl == 158)
+ else if (pickedObject == kVerbLook && fl == 158)
talk(_text[_lang][469], "469.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_31(int fl) {
- if (objeto_que_lleva == PICK && fl == 145) {
+ if (pickedObject == kVerbPick && fl == 145) {
pickObject(11);
visible[1] = 0;
flags[13] = 1;
- } else if (objeto_que_lleva == OPEN && fl == 117)
+ } else if (pickedObject == kVerbOpen && fl == 117)
openDoor(5, 0);
- else if (objeto_que_lleva == CLOSE && fl == 117)
- cierra_puerta(5, 0);
- else if (objeto_que_lleva == LOOK && fl == 161)
+ else if (pickedObject == kVerbClose && fl == 117)
+ closeDoor(5, 0);
+ else if (pickedObject == kVerbLook && fl == 161)
talk(_text[_lang][470], "470.als");
- else if (objeto_que_lleva == OPEN && fl == 161)
+ else if (pickedObject == kVerbOpen && fl == 161)
talk(_text[_lang][471], "471.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_34(int fl) {
- if (objeto_que_lleva == MOVE && fl == 146)
+ if (pickedObject == kVerbMove && fl == 146)
animation_8_4();
- else if (objeto_que_lleva == LOOK && fl == 146)
+ else if (pickedObject == kVerbLook && fl == 146)
talk(_text[_lang][458], "458.als");
- else if (objeto_que_lleva == PICK && fl == 146)
+ else if (pickedObject == kVerbPick && fl == 146)
talk(_text[_lang][459], "459.als");
- else if (objeto_que_lleva == OPEN && fl == 120 && flags[25] == 1)
+ else if (pickedObject == kVerbOpen && fl == 120 && flags[25] == 1)
openDoor(8, 2);
- else if (objeto_que_lleva == OPEN && fl == 120 && flags[25] == 0) {
+ else if (pickedObject == kVerbOpen && fl == 120 && flags[25] == 0) {
openDoor(8, 2);
sentido_hare = 3;
talk(_text[_lang][425], "425.als");
pickObject(14);
flags[25] = 1;
- } else if (objeto_que_lleva == CLOSE && fl == 120)
- cierra_puerta(8, 2);
+ } else if (pickedObject == kVerbClose && fl == 120)
+ closeDoor(8, 2);
else
- hay_respuesta=0;
+ hay_answer=0;
}
void DrasculaEngine::room_35(int fl) {
- if (objeto_que_lleva == PICK && fl == 148) {
+ if (pickedObject == kVerbPick && fl == 148) {
pickObject(16);
visible[2] = 0;
flags[14] = 1;
@@ -976,85 +983,85 @@ void DrasculaEngine::room_35(int fl) {
flags[18] = 1;
if (flags[18] == 1)
animation_6_4();
- } else if (objeto_que_lleva == PICK && fl == 147) {
+ } else if (pickedObject == kVerbPick && fl == 147) {
talk(_text[_lang][426], "426.als");
pickObject(15);
visible[1] = 0;
flags[15] = 1;
flags[17] = 1;
updateData();
- } else if (objeto_que_lleva == PICK && fl == 149) {
+ } else if (pickedObject == kVerbPick && fl == 149) {
pickObject(13);
visible[3] = 0;
flags[17] = 0;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_44(int fl) {
- if (objeto_que_lleva == LOOK && fl == 172)
+ if (pickedObject == kVerbLook && fl == 172)
talk(_text[_lang][428], "428.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_49(int fl){
- if (objeto_que_lleva == TALK && fl ==51)
+ if (pickedObject == kVerbTalk && fl ==51)
conversa("op_9.cal");
- else if (objeto_que_lleva == LOOK && fl == 51)
+ else if (pickedObject == kVerbLook && fl == 51)
talk(_text[_lang][132], "132.als");
- else if ((objeto_que_lleva == 8 && fl == 51) || (objeto_que_lleva == 8 && fl == 203))
+ else if ((pickedObject == 8 && fl == 51) || (pickedObject == 8 && fl == 203))
animation_5_5();
- else if (objeto_que_lleva == LOOK && fl == 200)
+ else if (pickedObject == kVerbLook && fl == 200)
talk(_text[_lang][133], "133.als");
- else if (objeto_que_lleva == TALK && fl == 200)
+ else if (pickedObject == kVerbTalk && fl == 200)
talk(_text[_lang][134], "134.als");
- else if (objeto_que_lleva == LOOK && fl == 201)
+ else if (pickedObject == kVerbLook && fl == 201)
talk(_text[_lang][135], "135.als");
- else if (objeto_que_lleva == LOOK && fl == 203)
+ else if (pickedObject == kVerbLook && fl == 203)
talk(_text[_lang][137], "137.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_53(int fl) {
- if (objeto_que_lleva == PICK && fl == 120) {
+ if (pickedObject == kVerbPick && fl == 120) {
pickObject(16);
visible[3] = 0;
- } else if (objeto_que_lleva == LOOK && fl == 121)
+ } else if (pickedObject == kVerbLook && fl == 121)
talk(_text[_lang][128], "128.als");
- else if (objeto_que_lleva == LOOK && fl == 209)
+ else if (pickedObject == kVerbLook && fl == 209)
talk(_text[_lang][129], "129.als");
- else if (objeto_que_lleva == MOVE && fl == 123)
+ else if (pickedObject == kVerbMove && fl == 123)
animation_11_5();
- else if (objeto_que_lleva == LOOK && fl == 52)
+ else if (pickedObject == kVerbLook && fl == 52)
talk(_text[_lang][447], "447.als");
- else if (objeto_que_lleva == TALK && fl == 52)
+ else if (pickedObject == kVerbTalk && fl == 52)
talk(_text[_lang][131], "131.als");
- else if (objeto_que_lleva == 12 && fl == 52)
+ else if (pickedObject == 12 && fl == 52)
animation_10_5();
- else if (objeto_que_lleva == 15 && fl == 52)
+ else if (pickedObject == 15 && fl == 52)
animation_9_5();
- else if (objeto_que_lleva == 16 && fl == 121) {
+ else if (pickedObject == 16 && fl == 121) {
flags[2] = 1;
withoutVerb();
updateData();
- } else if (objeto_que_lleva == 16) {
+ } else if (pickedObject == 16) {
talk(_text[_lang][439], "439.als");
withoutVerb();
visible[3] = 1;
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_54(int fl) {
- if ((objeto_que_lleva == TALK && fl == 118) || (objeto_que_lleva == LOOK && fl == 118 && flags[0] == 0))
+ if ((pickedObject == kVerbTalk && fl == 118) || (pickedObject == kVerbLook && fl == 118 && flags[0] == 0))
animation_1_5();
- else if (objeto_que_lleva == LOOK && fl == 118 && flags[0]==1)
+ else if (pickedObject == kVerbLook && fl == 118 && flags[0]==1)
talk(_text[_lang][124], "124.als");
- else if (objeto_que_lleva == LOOK && fl == 53)
+ else if (pickedObject == kVerbLook && fl == 53)
talk(_text[_lang][127], "127.als");
- else if (objeto_que_lleva == TALK && fl == 53 && flags[14] == 0) {
+ else if (pickedObject == kVerbTalk && fl == 53 && flags[14] == 0) {
talk(_text[_lang][288], "288.als");
flags[12] = 1;
pause(10);
@@ -1065,96 +1072,96 @@ void DrasculaEngine::room_54(int fl) {
conversa("op_10.cal");
flags[12] = 0;
flags[14] = 1;
- } else if (objeto_que_lleva == TALK && fl == 53 && flags[14] == 1)
+ } else if (pickedObject == kVerbTalk && fl == 53 && flags[14] == 1)
talk(_text[_lang][109], "109.als");
- else if (objeto_que_lleva == PICK && fl == 9999 && flags[13] == 0) {
+ else if (pickedObject == kVerbPick && fl == 9999 && flags[13] == 0) {
pickObject(8);
flags[13] = 1;
talk_mus(_texte[_lang][10], "e10.als");
updateData();
- } else if (objeto_que_lleva == OPEN && fl == 119)
+ } else if (pickedObject == kVerbOpen && fl == 119)
talk(_text[_lang][125], "125.als");
- else if (objeto_que_lleva == LOOK && fl == 119)
+ else if (pickedObject == kVerbLook && fl == 119)
talk(_text[_lang][126], "126.als");
- else if (objeto_que_lleva == 10 && fl == 119) {
+ else if (pickedObject == 10 && fl == 119) {
pause(4);
talk(_text[_lang][436], "436.als");
withoutVerb();
resta_objeto(10);
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_55(int fl) {
- if (objeto_que_lleva == PICK && fl == 122) {
+ if (pickedObject == kVerbPick && fl == 122) {
pickObject(12);
flags[8] = 1;
updateData();
- } else if (objeto_que_lleva == LOOK && fl == 122)
+ } else if (pickedObject == kVerbLook && fl == 122)
talk(_text[_lang][138], "138.als");
- else if (objeto_que_lleva == LOOK && fl == 204)
+ else if (pickedObject == kVerbLook && fl == 204)
talk(_text[_lang][139], "139.als");
- else if (objeto_que_lleva == LOOK && fl == 205)
+ else if (pickedObject == kVerbLook && fl == 205)
talk(_text[_lang][140], "140.als");
else if (fl == 206) {
- comienza_sound("s11.als");
+ playSound("s11.als");
anima("det.bin", 17);
- fin_sound();
+ stopSound();
lleva_al_hare(hare_x - 3, hare_y + alto_hare + 6);
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
bool DrasculaEngine::room_56(int fl) {
- if (objeto_que_lleva == OPEN && fl == 124) {
+ if (pickedObject == kVerbOpen && fl == 124) {
animation_14_5();
return true;
- } else if (objeto_que_lleva == LOOK && fl == 124)
+ } else if (pickedObject == kVerbLook && fl == 124)
talk(_text[_lang][450], "450.als");
- else if (objeto_que_lleva == OPEN && fl == 207)
+ else if (pickedObject == kVerbOpen && fl == 207)
talk(_text[_lang][141], "141.als");
- else if (objeto_que_lleva == LOOK && fl == 208)
+ else if (pickedObject == kVerbLook && fl == 208)
talk(_text[_lang][142], "142.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
return false;
}
void DrasculaEngine::room_58(int fl) {
- if (objeto_que_lleva == MOVE && fl == 103)
+ if (pickedObject == kVerbMove && fl == 103)
animation_7_6();
- else if (objeto_que_lleva == LOOK && fl == 104)
+ else if (pickedObject == kVerbLook && fl == 104)
talk(_text[_lang][454], "454.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_59(int fl) {
- if ((objeto_que_lleva == TALK && fl == 51) || (objeto_que_lleva == LOOK && fl == 51)) {
+ if ((pickedObject == kVerbTalk && fl == 51) || (pickedObject == kVerbLook && fl == 51)) {
flags[9] = 1;
- talk(_text[_lang][259], "259.als");
- talk_bj_cama(_textbj[_lang][13], "bj13.als");
- talk(_text[_lang][263], "263.als");
- talk_bj_cama(_textbj[_lang][14], "bj14.als");
+ talk(259);
+ talk_bj_cama(13);
+ talk(263);
+ talk_bj_cama(14);
pause(40);
- talk(_text[_lang][264], "264.als");
- talk_bj_cama(_textbj[_lang][15], "BJ15.als");
- talk(_text[_lang][265], "265.als");
+ talk(264);
+ talk_bj_cama(15);
+ talk(265);
flags[9] = 0;
if (flags[11] == 0) {
- comienza_sound("s12.als");
+ playSound("s12.als");
delay(40);
- fin_sound();
+ stopSound();
delay(10);
lleva_al_hare(174, 168);
sentido_hare = 2;
updateRoom();
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
pause(40);
- comienza_sound("s12.als");
+ playSound("s12.als");
pause(19);
- fin_sound_corte();
+ stopSound_corte();
hare_se_ve = 0;
updateRoom();
copyRect(101, 34, hare_x - 4, hare_y - 1, 37, 70, dir_dibujo3, dir_zona_pantalla);
@@ -1201,244 +1208,244 @@ void DrasculaEngine::room_59(int fl) {
flags[11] = 1;
}
} else
- hay_respuesta = 0;
+ hay_answer = 0;
}
bool DrasculaEngine::room_60(int fl) {
- if (objeto_que_lleva == MOVE && fl == 112)
+ if (pickedObject == kVerbMove && fl == 112)
animation_10_6();
- else if (objeto_que_lleva == LOOK && fl == 112)
+ else if (pickedObject == kVerbLook && fl == 112)
talk(_text[_lang][440], "440.als");
- else if (objeto_que_lleva == TALK && fl == 52) {
+ else if (pickedObject == kVerbTalk && fl == 52) {
talk(_text[_lang][266], "266.als");
talk_taber2(_textt[_lang][1], "t1.als");
conversa("op_12.cal");
withoutVerb();
- objeto_que_lleva = 0;
- } else if (objeto_que_lleva == TALK && fl == 115)
+ pickedObject = 0;
+ } else if (pickedObject == kVerbTalk && fl == 115)
talk(_text[_lang][455], "455.als");
- else if (objeto_que_lleva == TALK && fl == 56)
+ else if (pickedObject == kVerbTalk && fl == 56)
talk(_text[_lang][455], "455.als");
- else if (objeto_que_lleva == LOOK && fl == 114)
+ else if (pickedObject == kVerbLook && fl == 114)
talk(_text[_lang][167], "167.als");
- else if (objeto_que_lleva == LOOK && fl == 113)
+ else if (pickedObject == kVerbLook && fl == 113)
talk(_text[_lang][168], "168.als");
- else if (objeto_que_lleva == PICK && fl == 113)
+ else if (pickedObject == kVerbPick && fl == 113)
talk(_text[_lang][170], "170.als");
- else if (objeto_que_lleva == MOVE && fl == 113)
+ else if (pickedObject == kVerbMove && fl == 113)
talk(_text[_lang][170], "170.als");
- else if (objeto_que_lleva == TALK && fl == 113)
+ else if (pickedObject == kVerbTalk && fl == 113)
talk(_text[_lang][169], "169.als");
- else if (objeto_que_lleva == 21 && fl == 56)
+ else if (pickedObject == 21 && fl == 56)
animation_18_6();
- else if (objeto_que_lleva == 9 && fl == 56 && flags[6] == 1) {
+ else if (pickedObject == 9 && fl == 56 && flags[6] == 1) {
animation_9_6();
return true;
- } else if (objeto_que_lleva == 9 && fl == 56 && flags[6] == 0) {
+ } else if (pickedObject == 9 && fl == 56 && flags[6] == 0) {
anima("cnf.bin", 14);
talk(_text[_lang][455], "455.als");
} else
- hay_respuesta = 0;
+ hay_answer = 0;
return false;
}
void DrasculaEngine::room_61(int fl) {
- if (objeto_que_lleva == LOOK && fl == 116)
+ if (pickedObject == kVerbLook && fl == 116)
talk(_text[_lang][172], "172.als");
- else if (objeto_que_lleva == LOOK && fl == 117)
+ else if (pickedObject == kVerbLook && fl == 117)
talk(_text[_lang][173], "173.als");
- else if (objeto_que_lleva == MOVE && fl == 117)
+ else if (pickedObject == kVerbMove && fl == 117)
talk(_text[_lang][174], "174.als");
- else if (objeto_que_lleva == OPEN && fl == 117)
+ else if (pickedObject == kVerbOpen && fl == 117)
talk(_text[_lang][174], "174.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_62(int fl) {
- if (objeto_que_lleva == TALK && fl == 53)
+ if (pickedObject == kVerbTalk && fl == 53)
conversa("op_13.cal");
- else if (objeto_que_lleva == TALK && fl == 52 && flags[0] == 0)
+ else if (pickedObject == kVerbTalk && fl == 52 && flags[0] == 0)
animation_3_1();
- else if (objeto_que_lleva == TALK && fl == 52 && flags[0] == 1)
+ else if (pickedObject == kVerbTalk && fl == 52 && flags[0] == 1)
talk(_text[_lang][109], "109.als");
- else if (objeto_que_lleva == TALK && fl == 54)
+ else if (pickedObject == kVerbTalk && fl == 54)
animation_4_1();
- else if (objeto_que_lleva == LOOK && fl == 100)
+ else if (pickedObject == kVerbLook && fl == 100)
talk(_text[_lang][168], "168.als");
- else if (objeto_que_lleva == TALK && fl == 100)
+ else if (pickedObject == kVerbTalk && fl == 100)
talk(_text[_lang][169], "169.als");
- else if (objeto_que_lleva == PICK && fl == 100)
+ else if (pickedObject == kVerbPick && fl == 100)
talk(_text[_lang][170], "170.als");
- else if (objeto_que_lleva == LOOK && fl == 101)
+ else if (pickedObject == kVerbLook && fl == 101)
talk(_text[_lang][171], "171.als");
- else if (objeto_que_lleva == LOOK && fl == 102)
+ else if (pickedObject == kVerbLook && fl == 102)
talk(_text[_lang][167], "167.als");
- else if (objeto_que_lleva == LOOK && fl == 103)
+ else if (pickedObject == kVerbLook && fl == 103)
talk(_text[_lang][166], "166.als");
- else hay_respuesta = 0;
+ else hay_answer = 0;
}
void DrasculaEngine::room_63(int fl) {
- if (objeto_que_lleva == LOOK && fl == 110)
+ if (pickedObject == kVerbLook && fl == 110)
talk(_text[_lang][172], "172.als");
- else if (objeto_que_lleva == LOOK && fl == 109)
+ else if (pickedObject == kVerbLook && fl == 109)
talk(_text[_lang][173], "173.als");
- else if (objeto_que_lleva == MOVE && fl == 109)
+ else if (pickedObject == kVerbMove && fl == 109)
talk(_text[_lang][174], "174.als");
- else if (objeto_que_lleva == LOOK && fl == 108)
+ else if (pickedObject == kVerbLook && fl == 108)
talk(_text[_lang][334], "334.als");
- else if (objeto_que_lleva == TALK && fl == 108)
+ else if (pickedObject == kVerbTalk && fl == 108)
talk(_text[_lang][333], "333.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::room_pendulo(int fl) {
- if (objeto_que_lleva == LOOK && fl == 100)
+ if (pickedObject == kVerbLook && fl == 100)
talk(_text[_lang][452], "452.als");
- else if (objeto_que_lleva == LOOK && fl == 101)
+ else if (pickedObject == kVerbLook && fl == 101)
talk (_text[_lang][123], "123.als");
- else if (objeto_que_lleva == PICK && fl == 101)
+ else if (pickedObject == kVerbPick && fl == 101)
pickObject(20);
- else if (objeto_que_lleva == 20 && fl == 100)
+ else if (pickedObject == 20 && fl == 100)
animation_6_6();
- else if (objeto_que_lleva == PICK || objeto_que_lleva == OPEN)
+ else if (pickedObject == kVerbPick || pickedObject == kVerbOpen)
talk(_text[_lang][453], "453.als");
else
- hay_respuesta = 0;
+ hay_answer = 0;
}
void DrasculaEngine::updateRefresh() {
if (num_ejec == 1) {
- if (!strcmp(num_room, "63.alg"))
+ if (roomNumber == 63)
update_63();
- else if (!strcmp(num_room, "62.alg"))
+ else if (roomNumber == 62)
update_62();
} else if (num_ejec == 2) {
- if (!strcmp(num_room, "3.alg"))
+ if (roomNumber == 3)
update_3();
- else if (!strcmp(num_room, "2.alg"))
+ else if (roomNumber == 2)
update_2();
- else if (!strcmp(num_room, "4.alg"))
+ else if (roomNumber == 4)
update_4();
- else if (!strcmp(num_room, "5.alg"))
+ else if (roomNumber == 5)
update_5();
- else if (!strcmp(num_room, "15.alg"))
+ else if (roomNumber == 15)
update_15();
- else if (!strcmp(num_room, "17.alg"))
+ else if (roomNumber == 17)
update_17();
- else if (!strcmp(num_room, "18.alg"))
+ else if (roomNumber == 18)
update_18();
- else if (!strcmp(num_room, "10.alg"))
+ else if (roomNumber == 10)
mapa();
} else if (num_ejec == 3) {
- if (!strcmp(num_room, "20.alg"))
+ if (roomNumber == 20)
update_20();
- else if (!strcmp(num_room, "13.alg"))
+ else if (roomNumber == 13)
update_13();
} else if (num_ejec == 4) {
- if (!strcmp(num_room, "29.alg"))
+ if (roomNumber == 29)
update_29();
- else if (!strcmp(num_room, "26.alg"))
+ else if (roomNumber == 26)
update_26();
- else if (!strcmp(num_room, "27.alg"))
+ else if (roomNumber == 27)
update_27();
- else if (!strcmp(num_room, "31.alg"))
+ else if (roomNumber == 31)
update_31();
- else if (!strcmp(num_room, "34.alg"))
+ else if (roomNumber == 34)
update_34();
- else if (!strcmp(num_room, "35.alg"))
+ else if (roomNumber == 35)
update_35();
} else if (num_ejec == 5) {
- if (!strcmp(num_room, "45.alg"))
+ if (roomNumber == 45)
mapa();
- else if (!strcmp(num_room, "50.alg"))
+ else if (roomNumber == 50)
update_50();
- else if (!strcmp(num_room, "57.alg"))
+ else if (roomNumber == 57)
update_57();
} else if (num_ejec == 6) {
- if (!strcmp(num_room, "60.alg"))
+ if (roomNumber == 60)
update_60();
- else if (!strcmp(num_room, "61.alg"))
+ else if (roomNumber == 61)
update_61();
- else if (!strcmp(num_room, "58.alg"))
+ else if (roomNumber == 58)
update_58();
}
}
void DrasculaEngine::updateRefresh_pre() {
if (num_ejec == 1) {
- if (!strcmp(num_room, "62.alg"))
+ if (roomNumber == 62)
update_62_pre();
- else if (!strcmp(num_room, "16.alg"))
+ else if (roomNumber == 16)
pon_bj();
} else if (num_ejec == 2) {
- if (!strcmp(num_room, "1.alg"))
+ if (roomNumber == 1)
update_1_pre();
- else if (!strcmp(num_room, "3.alg"))
+ else if (roomNumber == 3)
update_3_pre();
- else if (!strcmp(num_room, "5.alg"))
+ else if (roomNumber == 5)
update_5_pre();
- else if (!strcmp(num_room, "6.alg"))
+ else if (roomNumber == 6)
update_6_pre();
- else if (!strcmp(num_room, "7.alg"))
+ else if (roomNumber == 7)
update_7_pre();
- else if (!strcmp(num_room, "9.alg"))
+ else if (roomNumber == 9)
update_9_pre();
- else if (!strcmp(num_room, "12.alg"))
+ else if (roomNumber == 12)
update_12_pre();
- else if (!strcmp(num_room, "14.alg"))
+ else if (roomNumber == 14)
update_14_pre();
- else if (!strcmp(num_room, "16.alg"))
+ else if (roomNumber == 16)
update_16_pre();
- else if (!strcmp(num_room, "17.alg"))
+ else if (roomNumber == 17)
update_17_pre();
- else if (!strcmp(num_room, "18.alg"))
+ else if (roomNumber == 18)
update_18_pre();
} else if (num_ejec == 3) {
// nothing
} else if (num_ejec == 4) {
- if (!strcmp(num_room, "21.alg"))
+ if (roomNumber == 21)
update_21_pre();
- else if (!strcmp(num_room, "22.alg"))
+ else if (roomNumber == 22)
update_22_pre();
- else if (!strcmp(num_room, "23.alg"))
+ else if (roomNumber == 23)
update_23_pre();
- else if (!strcmp(num_room, "24.alg"))
+ else if (roomNumber == 24)
update_24_pre();
- else if (!strcmp(num_room, "26.alg"))
+ else if (roomNumber == 26)
update_26_pre();
- else if (!strcmp(num_room, "27.alg"))
+ else if (roomNumber == 27)
update_27_pre();
- else if (!strcmp(num_room, "29.alg"))
+ else if (roomNumber == 29)
update_29_pre();
- else if (!strcmp(num_room, "30.alg"))
+ else if (roomNumber == 30)
update_30_pre();
- else if (!strcmp(num_room, "31.alg"))
+ else if (roomNumber == 31)
update_31_pre();
- else if (!strcmp(num_room, "34.alg"))
+ else if (roomNumber == 34)
update_34_pre();
- else if (!strcmp(num_room, "35.alg"))
+ else if (roomNumber == 35)
update_35_pre();
} else if (num_ejec == 5) {
- if (!strcmp(num_room,"49.alg"))
+ if (roomNumber == 49)
update_49_pre();
- else if (!strcmp(num_room,"53.alg"))
+ else if (roomNumber == 53)
update_53_pre();
- else if (!strcmp(num_room,"54.alg"))
+ else if (roomNumber == 54)
update_54_pre();
- else if (!strcmp(num_room,"56.alg"))
+ else if (roomNumber == 56)
update_56_pre();
} else if (num_ejec == 6) {
- if (!strcmp(num_room, "102.alg"))
+ if (roomNumber == 102)
update_pendulo();
- else if (!strcmp(num_room, "58.alg"))
+ else if (roomNumber == 58)
update_58_pre();
- else if (!strcmp(num_room, "59.alg"))
+ else if (roomNumber == 59)
update_59_pre();
- else if (!strcmp(num_room, "60.alg"))
+ else if (roomNumber == 60)
update_60_pre();
}
}
diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp
index 62f44c31d3..d6f393aa2a 100644
--- a/engines/drascula/talk.cpp
+++ b/engines/drascula/talk.cpp
@@ -27,22 +27,7 @@
namespace Drascula {
-void DrasculaEngine::talk_igor_dch(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
- int x_talk[8] = { 56, 82, 108, 134, 160, 186, 212, 238 };
- int cara;
-
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
-
- color_abc(WHITE);
-
+void DrasculaEngine::talkInit(const char *filename) {
if (hay_sb == 1) {
sku = new Common::File;
sku->open(filename);
@@ -53,6 +38,18 @@ void DrasculaEngine::talk_igor_dch(const char *said, const char *filename) {
ctvd_speaker(1);
ctvd_output(sku);
}
+}
+
+void DrasculaEngine::talk_igor_dch(const char *said, const char *filename) {
+ int x_talk[8] = { 56, 82, 108, 134, 160, 186, 212, 238 };
+ int cara;
+ int length = strlen(said);
+
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
+
+ color_abc(WHITE);
+
+ talkInit(filename);
bucless:
@@ -89,8 +86,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
@@ -100,31 +97,15 @@ bucless:
}
void DrasculaEngine::talk_dr_izq(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 };
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(RED);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -166,8 +147,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -178,31 +159,15 @@ bucless:
}
void DrasculaEngine::talk_dr_dch(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 };
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(RED);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -243,8 +208,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -259,31 +224,16 @@ bucless:
}
void DrasculaEngine::talk_solo(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
if (num_ejec == 1)
color_abc(color_solo);
else if (num_ejec == 4)
color_abc(RED);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
if (num_ejec == 6)
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
@@ -312,8 +262,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
if (num_ejec == 6) {
@@ -323,31 +273,15 @@ bucless:
}
void DrasculaEngine::talk_igor_frente(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[8] = { 56, 86, 116, 146, 176, 206, 236, 266 };
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -386,8 +320,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -404,31 +338,15 @@ bucless:
}
void DrasculaEngine::talk_tabernero(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[9] = { 1, 23, 45, 67, 89, 111, 133, 155, 177 };
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(MAROON);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -466,8 +384,8 @@ bucless:
delete(sku);
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -475,32 +393,22 @@ bucless:
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
-void DrasculaEngine::talk_bj(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+void DrasculaEngine::talk_bj(int index) {
+ char name[20];
+ sprintf(name, "BJ%i.als", index);
+ talk_bj(_textbj[_lang][index], name);
+}
+void DrasculaEngine::talk_bj(const char *said, const char *filename) {
int x_talk[5] = { 64, 92, 120, 148, 176 };
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
if (num_ejec != 5) {
@@ -545,8 +453,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -554,10 +462,13 @@ bucless:
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
-void DrasculaEngine::talk(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+void DrasculaEngine::talk(int index) {
+ char name[20];
+ sprintf(name, "%i.als", index);
+ talk(_text[_lang][index], name);
+}
+void DrasculaEngine::talk(const char *said, const char *filename) {
int suma_1_pixel = 0;
if (num_ejec != 2)
suma_1_pixel = 1;
@@ -566,24 +477,20 @@ void DrasculaEngine::talk(const char *said, const char *filename) {
int x_talk_dch[6] = { 1, 25, 49, 73, 97, 121 };
int x_talk_izq[6] = { 145, 169, 193, 217, 241, 265 };
int cara;
-
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
if (num_ejec == 6) {
- if (flags[0] == 0 && (!strcmp(num_room, "102.alg"))) {
+ if (flags[0] == 0 && roomNumber == 102) {
talk_pen(said, filename);
return;
}
- if (flags[0] == 0 && (!strcmp(num_room, "58.alg"))) {
+ if (flags[0] == 0 && roomNumber == 58) {
talk_pen2(said, filename);
return;
}
}
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
if (num_ejec != 2) {
if (factor_red[hare_y + alto_hare] == 100)
@@ -591,22 +498,14 @@ void DrasculaEngine::talk(const char *said, const char *filename) {
}
if (num_ejec == 4) {
- if (strcmp(num_room, "24.alg") || flags[29] == 0) {
+ if (roomNumber == 24 || flags[29] == 0) {
color_abc(YELLOW);
}
} else {
color_abc(YELLOW);
}
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+
+ talkInit(filename);
bucless:
@@ -692,8 +591,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -707,29 +606,15 @@ bucless:
}
void DrasculaEngine::talk_pianista(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
int x_talk[4] = { 97, 145, 193, 241 };
int cara;
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -761,8 +646,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -771,17 +656,11 @@ bucless:
}
void DrasculaEngine::talk_borracho(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[8] = { 1, 21, 41, 61, 81, 101, 121, 141 };
int cara;
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
if (num_ejec == 1) {
loadPic("an11y13.alg");
@@ -800,16 +679,7 @@ bebiendo:
color_abc(DARK_GREEN);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz\n");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -840,8 +710,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -863,32 +733,22 @@ bucless:
}
}
-void DrasculaEngine::talk_vb(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+void DrasculaEngine::talk_vb(int index) {
+ char name[20];
+ sprintf(name, "VB%i.als", index);
+ talk_vb(_textvb[_lang][index], name);
+}
+void DrasculaEngine::talk_vb(const char *said, const char *filename) {
int x_talk[6] = {1, 27, 53, 79, 105, 131};
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(VON_BRAUN);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
copyBackground(vb_x + 5, 64, OBJWIDTH + 1, 0, 25, 27, dir_dibujo1, dir_dibujo3);
@@ -923,8 +783,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -934,29 +794,20 @@ bucless:
playMusic(roomMusic);
}
-void DrasculaEngine::talk_vbpuerta(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+void DrasculaEngine::talk_vbpuerta(int index) {
+ char name[20];
+ sprintf(name, "VB%i.als", index);
+ talk_vb(_textvb[_lang][index], name);
+}
- int longitud;
- longitud = strlen(said);
+void DrasculaEngine::talk_vbpuerta(const char *said, const char *filename) {
+ int length = strlen(said);
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(VON_BRAUN);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -975,8 +826,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -990,26 +841,14 @@ void DrasculaEngine::talk_ciego(const char *said, const char *filename, const ch
byte *num_cara;
int p = 0;
int pos_ciego[6];
- int cara = 0;
-
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
color_abc(VON_BRAUN);
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
pos_ciego[1] = 2;
pos_ciego[2] = 73;
@@ -1021,39 +860,23 @@ bucless:
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
pos_ciego[5] = 149;
char c = toupper(sincronia[p]);
- if (c == '0')
- cara = 0;
- if (c == '1')
- cara = 1;
- if (c == '2')
- cara = 2;
- if (c == '3')
- cara = 3;
- if (c == '4')
- cara = 4;
- if (c == '5')
- cara = 5;
- if (c == '6')
- cara = 6;
- if (c == '7')
- cara = 7;
- if (cara == 0 || cara == 2 || cara == 4 || cara == 6)
+ if (c == '0' || c == '2' || c == '4' || c == '6')
pos_ciego[0] = 1;
else
pos_ciego[0] = 132;
- if (cara == 0)
+ if (c == '0')
num_cara = dir_dibujo3;
- else if (cara == 1)
+ else if (c == '1')
num_cara = dir_dibujo3;
- else if (cara == 2)
+ else if (c == '2')
num_cara = dir_hare_dch;
- else if (cara == 3)
+ else if (c == '3')
num_cara = dir_hare_dch;
- else if (cara == 4)
+ else if (c == '4')
num_cara = dir_hare_fondo;
- else if (cara == 5)
+ else if (c == '5')
num_cara = dir_hare_fondo;
else {
num_cara = dir_hare_frente;
@@ -1079,38 +902,23 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
}
void DrasculaEngine::talk_hacker(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
color_abc(YELLOW);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
if (withVoices == 0)
@@ -1127,8 +935,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1136,31 +944,15 @@ bucless:
}
void DrasculaEngine::talk_lobo(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[9] = {52, 79, 106, 133, 160, 187, 214, 241, 268};
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(RED);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1191,8 +983,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1201,31 +993,15 @@ bucless:
}
void DrasculaEngine::talk_mus(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[8] = { 16, 35, 54, 73, 92, 111, 130, 149};
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1256,8 +1032,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1266,14 +1042,9 @@ bucless:
}
void DrasculaEngine::talk_pen(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[8] = {112, 138, 164, 190, 216, 242, 268, 294};
int cara;
-
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
flags[1] = 1;
@@ -1281,22 +1052,11 @@ void DrasculaEngine::talk_pen(const char *said, const char *filename) {
copyRect(44, 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla);
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(YELLOW);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1327,8 +1087,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1339,33 +1099,17 @@ bucless:
}
void DrasculaEngine::talk_pen2(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[5]={122, 148, 174, 200, 226};
int cara;
-
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
flags[1] = 1;
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(YELLOW);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1396,8 +1140,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1408,31 +1152,15 @@ bucless:
}
void DrasculaEngine::talk_taber2(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[6] = {1, 23, 45, 67, 89, 111};
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(MAROON);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1463,8 +1191,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1472,32 +1200,22 @@ bucless:
updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla);
}
-void DrasculaEngine::talk_bj_cama(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+void DrasculaEngine::talk_bj_cama(int index) {
+ char name[20];
+ sprintf(name, "BJ%i.als", index);
+ talk_bj_cama(_textbj[_lang][index], name);
+}
+void DrasculaEngine::talk_bj_cama(const char *said, const char *filename) {
int x_talk[5] = {51, 101, 151, 201, 251};
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1529,8 +1247,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
updateRoom();
@@ -1538,32 +1256,16 @@ bucless:
}
void DrasculaEngine::talk_htel(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
char *num_cara;
-
int x_talk[3] = {1, 94, 187};
int cara, pantalla;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(YELLOW);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1597,8 +1299,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1612,9 +1314,7 @@ void DrasculaEngine::talk_sinc(const char *said, const char *filename, const cha
int x_talk_dch[6] = {1, 25, 49, 73, 97, 121};
int x_talk_izq[6] = {145, 169, 193, 217, 241, 265};
int p, cara = 0;
-
- int longitud;
- longitud = strlen(said);
+ int length = strlen(said);
color_abc(YELLOW);
@@ -1625,16 +1325,7 @@ void DrasculaEngine::talk_sinc(const char *said, const char *filename, const cha
p = 0;
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1721,8 +1412,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1733,31 +1424,16 @@ bucless:
}
void DrasculaEngine::talk_baul(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
int cara = 0, cara_antes;
- int longitud;
+ int length = strlen(said);
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
cara_antes = flags[19];
color_abc(MAROON);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1786,8 +1462,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1797,28 +1473,13 @@ bucless:
}
void DrasculaEngine::talk_igorpuerta(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1){
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1837,8 +1498,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1847,31 +1508,15 @@ bucless:
}
void DrasculaEngine::talk_igor_sentado(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[4] = { 80, 102, 124, 146 };
int cara;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1) {
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1902,8 +1547,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
@@ -1912,31 +1557,15 @@ bucless:
}
void DrasculaEngine::talk_igor_peluca(const char *said, const char *filename) {
- int tiempou;
- long tiempol;
-
int x_talk[4] = {119, 158, 197, 236};
int cara = 0;
+ int length = strlen(said);
- int longitud;
- longitud = strlen(said);
-
- tiempol = _system->getMillis();
- tiempou = (unsigned int)tiempol / 2;
- _rnd->setSeed(tiempou);
+ _rnd->setSeed((unsigned int)_system->getMillis() / 2);
color_abc(WHITE);
- if (hay_sb == 1){
- sku = new Common::File;
- sku->open(filename);
- if (!sku->isOpen()) {
- error("no puedo abrir archivo de voz");
- }
- ctvd_init(2);
- ctvd_speaker(1);
- ctvd_output(sku);
- }
+ talkInit(filename);
bucless:
@@ -1967,8 +1596,8 @@ bucless:
sku = NULL;
ctvd_terminate();
} else {
- longitud = longitud - 2;
- if (longitud > 0)
+ length -= 2;
+ if (length > 0)
goto bucless;
}
diff --git a/engines/drascula/texts.cpp b/engines/drascula/texts.cpp
index 6389097c1d..c84f176d35 100644
--- a/engines/drascula/texts.cpp
+++ b/engines/drascula/texts.cpp
@@ -4677,7 +4677,7 @@ const char *_textt[][25] = {
"QU'EST-CE QU'IL Y A, QU'Y A-T-IL?",
"D'ACCORD. CHAMBRE 512. PAR LES ESCALIERS. LA CL EST SUR LA PORTE",
"LE COMTE DRASCULA?!",
- "NON, RIEN, CE TYPE A UNE MAUVAISE RPUTATION PAR ICI",
+ "NON, RIEN, CE TYPE A UNE MAUVAISE R\220PUTATION PAR ICI",
// 5
"EH BIEN, IL Y A DES RUMEURS QUI COURENT SUR LUI. CERTAINS DISENT QUE C'EST UN VAMPIRE ET QU'IL ENLEVE DU MONDE POUR SUCER LEUR SANG ",
"MAIS D'AUTRES PENSENT QU'IL EST SEULEMENT UN TRAFICANT D'ORGANES, ET C'EST POUR CELA QUE DES PERSONNES DPECES SONT APPARUES DANS LES ALENTOURS",
@@ -5308,20 +5308,20 @@ const char *_textverbs[][6] = {
"mover",
},
{
- "look", // TODO Translate it
- "take",
- "open",
- "close",
- "talk",
- "push",
+ "Schau",
+ "Nimm",
+ "oeFFNE",
+ "Schliesse",
+ "Rede",
+ "Druecke",
},
{
- "look", // TODO Translate it
- "take",
- "open",
- "close",
- "talk",
- "push",
+ "regardez",
+ "ramassez",
+ "ouvrez",
+ "fermez",
+ "parlez",
+ "poussez",
},
{
"esamina",
@@ -5334,21 +5334,26 @@ const char *_textverbs[][6] = {
};
-const char *_textmisc[][1] = {
+const char *_textmisc[][2] = {
{
"HUNCHBACKED",
+ "Transilvania, 1993 d.c.",
},
{
"jorobado",
+ "Transilvania, 1993 d.c. (despues de cenar)",
},
{
"HUNCHBACKED",
+ "Transilvania, 1993 d.c.",
},
{
"HUNCHBACKED",
+ "Transilvania, 1993 d.c.",
},
{
"HUNCHBACKED",
+ "Transilvania, 1993 d.c.",
},
};
diff --git a/engines/gob/coktelvideo.cpp b/engines/gob/coktelvideo.cpp
index c3625574d0..415790e67b 100644
--- a/engines/gob/coktelvideo.cpp
+++ b/engines/gob/coktelvideo.cpp
@@ -123,8 +123,9 @@ bool Imd::load(Common::SeekableReadStream &stream) {
return false;
}
- _soundSliceLength = 1000 / (_soundFreq / _soundSliceSize);
- _frameLength = _soundSliceLength;
+ _soundSliceLength = (uint32) (((double) (1000 << 16)) /
+ ((double) _soundFreq / (double) _soundSliceSize));
+ _frameLength = _soundSliceLength >> 16;
_soundStage = 1;
_hasSound = true;
@@ -325,11 +326,11 @@ void Imd::waitEndFrame() {
return;
if (_skipFrames == 0) {
- int32 waitTime = (_curFrame * _soundSliceLength) -
- (g_system->getMillis() - _soundStartTime);
+ int32 waitTime = (int16) (((_curFrame * _soundSliceLength) -
+ ((g_system->getMillis() - _soundStartTime) << 16)) >> 16);
if (waitTime < 0) {
- _skipFrames = -waitTime / _soundSliceLength;
+ _skipFrames = -waitTime / (_soundSliceLength >> 16);
warning("Video A/V sync broken, skipping %d frame(s)", _skipFrames + 1);
} else if (waitTime > 0)
g_system->delayMillis(waitTime);
@@ -340,6 +341,11 @@ void Imd::waitEndFrame() {
g_system->delayMillis(_frameLength);
}
+void Imd::notifyPaused(uint32 duration) {
+ if (_soundStage == 2)
+ _soundStartTime += duration;
+}
+
void Imd::copyCurrentFrame(byte *dest,
uint16 left, uint16 top, uint16 width, uint16 height,
uint16 x, uint16 y, uint16 pitch, int16 transp) {
@@ -938,10 +944,9 @@ bool Vmd::load(Common::SeekableReadStream &stream) {
_soundSliceSize = -_soundSliceSize;
}
- _soundSliceLength = (uint16) (1000.0 /
+ _soundSliceLength = (uint32) (((double) (1000 << 16)) /
((double) _soundFreq / (double) _soundSliceSize));
-
- _frameLength = _soundSliceLength;
+ _frameLength = _soundSliceLength >> 16;
_soundStage = 1;
_audioStream = Audio::makeAppendableAudioStream(_soundFreq,
@@ -1073,8 +1078,8 @@ CoktelVideo::State Vmd::processFrame(uint16 frame) {
state.flags |= kStateNoVideoData;
state.left = 0x7FFF;
- state.right = 0x7FFF;
- state.top = 0;
+ state.top = 0x7FFF;
+ state.right = 0;
state.bottom = 0;
if (!_vidMem)
@@ -1128,6 +1133,8 @@ CoktelVideo::State Vmd::processFrame(uint16 frame) {
} else if (part.type == kPartTypeVideo) {
state.flags &= ~kStateNoVideoData;
+ uint32 size = part.size;
+
// New palette
if (part.flags & 2) {
uint8 index = _stream->readByte();
@@ -1137,9 +1144,12 @@ CoktelVideo::State Vmd::processFrame(uint16 frame) {
_stream->skip((255 - count) * 3);
state.flags |= kStatePalette;
+
+ size -= (768 + 2);
}
- _stream->read(_frameData, part.size);
+ _stream->read(_frameData, size);
+
if (renderFrame(part.left, part.top, part.right, part.bottom)) {
// Rendering succeeded, merging areas
state.left = MIN(state.left, part.left);
diff --git a/engines/gob/coktelvideo.h b/engines/gob/coktelvideo.h
index 581ac2ae81..348e5e3ab1 100644
--- a/engines/gob/coktelvideo.h
+++ b/engines/gob/coktelvideo.h
@@ -134,7 +134,7 @@ public:
/** Use an own memory block as video memory. */
virtual void setVideoMemory() = 0;
- /** Play sound (if the IMD has sound). */
+ /** Play sound (if the video has sound). */
virtual void enableSound(Audio::Mixer &mixer) = 0;
/** Don't play sound or stop currently playing sound. */
virtual void disableSound() = 0;
@@ -155,6 +155,9 @@ public:
/** Wait for the frame to end. */
virtual void waitEndFrame() = 0;
+ /** Notifies the video that it was paused for duration ms. */
+ virtual void notifyPaused(uint32 duration) = 0;
+
/** Copy the current frame.
*
* @param dest The memory to which to copy the current frame.
@@ -187,7 +190,11 @@ public:
int16 getHeight() const { return _height; }
uint16 getFramesCount() const { return _framesCount; }
uint16 getCurrentFrame() const { return _curFrame; }
- int16 getFrameRate() const { if (_hasSound) return 1000 / _soundSliceLength; return _frameRate; }
+ int16 getFrameRate() const {
+ if (_hasSound)
+ return 1000 / (_soundSliceLength >> 16);
+ return _frameRate;
+ }
uint32 getSyncLag() const { return _skipFrames; }
const byte *getPalette() const { return _palette; }
@@ -213,6 +220,8 @@ public:
State nextFrame();
void waitEndFrame();
+ void notifyPaused(uint32 duration);
+
void copyCurrentFrame(byte *dest,
uint16 left, uint16 top, uint16 width, uint16 height,
uint16 x, uint16 y, uint16 pitch, int16 transp = -1);
@@ -255,7 +264,7 @@ protected:
int16 _soundFreq;
int16 _soundSliceSize;
int16 _soundSlicesCount;
- uint16 _soundSliceLength;
+ uint32 _soundSliceLength;
Audio::AppendableAudioStream *_audioStream;
Audio::SoundHandle _audioHandle;
diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp
index cbc9272e80..8351f2ecfb 100644
--- a/engines/gob/detection.cpp
+++ b/engines/gob/detection.cpp
@@ -1684,6 +1684,71 @@ static const GOBGameDescription gameDescriptions[] = {
kFeatures640,
"intro"
},
+ { // Supplied by DjDiabolik in bug report #1971294
+ {
+ "woodruff",
+ "",
+ AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736),
+ EN_GRB,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ kGameTypeWoodruff,
+ kFeatures640,
+ "intro"
+ },
+ { // Supplied by DjDiabolik in bug report #1971294
+ {
+ "woodruff",
+ "",
+ AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736),
+ DE_DEU,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ kGameTypeWoodruff,
+ kFeatures640,
+ "intro"
+ },
+ { // Supplied by DjDiabolik in bug report #1971294
+ {
+ "woodruff",
+ "",
+ AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736),
+ FR_FRA,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ kGameTypeWoodruff,
+ kFeatures640,
+ "intro"
+ },
+ { // Supplied by DjDiabolik in bug report #1971294
+ {
+ "woodruff",
+ "",
+ AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736),
+ IT_ITA,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ kGameTypeWoodruff,
+ kFeatures640,
+ "intro"
+ },
+ { // Supplied by DjDiabolik in bug report #1971294
+ {
+ "woodruff",
+ "",
+ AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736),
+ ES_ESP,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ kGameTypeWoodruff,
+ kFeatures640,
+ "intro"
+ },
{
{
"dynasty",
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index 1195e35e93..8c12079b83 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -247,10 +247,7 @@ void Draw_v2::printTotText(int16 id) {
if (_renderFlags & RENDERFLAG_FROMSPLIT) {
int16 start;
- if (_vm->_video->_splitHeight1 < _vm->_height)
- start = _vm->_video->_splitHeight1;
- else
- start = _vm->_video->_splitStart;
+ start = _vm->_video->_splitStart;
destY = start;
spriteBottom = READ_LE_UINT16(ptr + 6) - READ_LE_UINT16(ptr + 2);
@@ -654,22 +651,23 @@ void Draw_v2::spriteOperation(int16 operation) {
int16 destSurface = _destSurface;
int16 sourceSurface = _sourceSurface;
- if ((_destSpriteY >= _vm->_video->_splitHeight1) &&
- ((_destSurface == 20) || (_destSurface == 21))) {
-
- if (_vm->_video->_splitHeight1 < _vm->_height) {
- _destSpriteY = (_destSpriteY - _vm->_video->_splitHeight1) + _vm->_video->_splitStart;
+ if (_vm->_video->_splitSurf && ((_destSurface == 20) || (_destSurface == 21))) {
+ if ((_destSpriteY >= _vm->_video->_splitStart)) {
+ _destSpriteY -= _vm->_video->_splitStart;
if ((operation == DRAW_DRAWLINE) ||
((operation >= DRAW_DRAWBAR) && (operation <= DRAW_FILLRECTABS)))
- _spriteBottom = (_spriteBottom - _vm->_video->_splitHeight1) + _vm->_video->_splitStart;
+ _spriteBottom -= _vm->_video->_splitStart;
+
+ _destSurface += 4;
}
- }
+ if ((_spriteTop >= _vm->_video->_splitStart) && (operation == DRAW_BLITSURF)) {
+ _spriteTop -= _vm->_video->_splitStart;
+ if (_destSurface < 24)
+ _destSurface += 4;
+ }
- if ((_spriteTop >= _vm->_video->_splitHeight1) && (operation == DRAW_BLITSURF) &&
- ((_destSurface == 20) || (_destSurface == 21)))
- if (_vm->_video->_splitHeight1 < _vm->_height)
- _spriteTop = (_spriteTop - _vm->_video->_splitHeight1) + _vm->_video->_splitStart;
+ }
adjustCoords(0, &_destSpriteX, &_destSpriteY);
if ((operation != DRAW_LOADSPRITE) && (_needAdjust != 2)) {
diff --git a/engines/gob/driver_vga.cpp b/engines/gob/driver_vga.cpp
index c4861ca146..f68ce47783 100644
--- a/engines/gob/driver_vga.cpp
+++ b/engines/gob/driver_vga.cpp
@@ -109,10 +109,16 @@ void VGAVideoDriver::drawSprite(SurfaceDesc *source, SurfaceDesc *dest,
int16 width = MIN((right - left) + 1, (int) dest->getWidth());
int16 height = MIN((bottom - top) + 1, (int) dest->getHeight());
+ if ((width < 1) || (height < 1))
+ return;
+
byte *srcPos = source->getVidMem() + (top * source->getWidth()) + left;
byte *destPos = dest->getVidMem() + (y * dest->getWidth()) + x;
+ uint32 size = width * height;
+
if (transp) {
+
while (height--) {
for (int16 i = 0; i < width; ++i) {
if (srcPos[i])
@@ -122,13 +128,26 @@ void VGAVideoDriver::drawSprite(SurfaceDesc *source, SurfaceDesc *dest,
srcPos += source->getWidth();
destPos += dest->getWidth();
}
+
+ } else if (((srcPos >= destPos) && (srcPos <= (destPos + size))) ||
+ ((destPos >= srcPos) && (destPos <= (srcPos + size)))) {
+
+ while (height--) {
+ memmove(destPos, srcPos, width);
+
+ srcPos += source->getWidth();
+ destPos += dest->getWidth();
+ }
+
} else {
+
while (height--) {
memcpy(destPos, srcPos, width);
srcPos += source->getWidth();
destPos += dest->getWidth();
}
+
}
}
diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp
index ff444f4a69..e783f5bfb5 100644
--- a/engines/gob/game_v2.cpp
+++ b/engines/gob/game_v2.cpp
@@ -632,13 +632,15 @@ void Game_v2::collisionsBlock(void) {
Collision *collArea;
int16 timeKey;
byte *savedIP;
+ byte collAreaStart;
if (_shouldPushColls)
pushCollisions(0);
- collArea = _collisionAreas;
- while (collArea->left != 0xFFFF)
- collArea++;
+ collAreaStart = 0;
+ while (_collisionAreas[collAreaStart].left != 0xFFFF)
+ collAreaStart++;
+ collArea = &_collisionAreas[collAreaStart];
_shouldPushColls = 0;
collResId = -1;
@@ -964,7 +966,7 @@ void Game_v2::collisionsBlock(void) {
continue;
_activeCollResId = collPtr->id;
- _activeCollIndex = i;
+ _activeCollIndex = i + collAreaStart;
_vm->_inter->storeMouse();
if (VAR(16) != 0)
break;
@@ -1006,7 +1008,7 @@ void Game_v2::collisionsBlock(void) {
if ((collPtr->id & 0xF000) == 0x8000)
if (++counter == descIndex) {
_activeCollResId = collPtr->id;
- _activeCollIndex = i;
+ _activeCollIndex = i + collAreaStart;
break;
}
}
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index 5871151d6e..a3fe0ebbe2 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -75,6 +75,8 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst) {
_scenery = 0; _draw = 0; _util = 0;
_video = 0; _saveLoad = 0;
+ _pauseStart = 0;
+
// Setup mixer
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
@@ -85,12 +87,13 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst) {
Common::addSpecialDebugLevel(kDebugFuncOp, "FuncOpcodes", "Script FuncOpcodes debug level");
Common::addSpecialDebugLevel(kDebugDrawOp, "DrawOpcodes", "Script DrawOpcodes debug level");
Common::addSpecialDebugLevel(kDebugGobOp, "GoblinOpcodes", "Script GoblinOpcodes debug level");
- Common::addSpecialDebugLevel(kDebugMusic, "Music", "CD, Adlib and Infogrames music debug level");
+ Common::addSpecialDebugLevel(kDebugSound, "Sound", "Sound output debug level");
Common::addSpecialDebugLevel(kDebugParser, "Parser", "Parser debug level");
Common::addSpecialDebugLevel(kDebugGameFlow, "Gameflow", "Gameflow debug level");
Common::addSpecialDebugLevel(kDebugFileIO, "FileIO", "File Input/Output debug level");
Common::addSpecialDebugLevel(kDebugSaveLoad, "SaveLoad", "Saving/Loading debug level");
Common::addSpecialDebugLevel(kDebugGraphics, "Graphics", "Graphics debug level");
+ Common::addSpecialDebugLevel(kDebugVideo, "Video", "IMD/VMD video debug level");
Common::addSpecialDebugLevel(kDebugCollisions, "Collisions", "Collisions debug level");
syst->getEventManager()->registerRandomSource(_rnd, "gob");
@@ -247,6 +250,23 @@ int GobEngine::init() {
return 0;
}
+void GobEngine::pauseEngineIntern(bool pause) {
+ if (pause) {
+ _pauseStart = _system->getMillis();
+ } else {
+ uint32 duration = _system->getMillis() - _pauseStart;
+
+ _vm->_vidPlayer->notifyPaused(duration);
+
+ _vm->_game->_startTimeKey += duration;
+ _vm->_draw->_cursorTimeKey += duration;
+ if (_vm->_inter->_soundEndTimeKey != 0)
+ _vm->_inter->_soundEndTimeKey += duration;
+ }
+
+ _mixer->pauseAll(pause);
+}
+
bool GobEngine::initGameParts() {
_noMusic = MidiDriver::parseMusicDriver(ConfMan.get("music_driver")) == MD_NULL;
diff --git a/engines/gob/gob.h b/engines/gob/gob.h
index 0a82bceed5..efc9718098 100644
--- a/engines/gob/gob.h
+++ b/engines/gob/gob.h
@@ -100,13 +100,14 @@ enum {
kDebugFuncOp = 1 << 0,
kDebugDrawOp = 1 << 1,
kDebugGobOp = 1 << 2,
- kDebugMusic = 1 << 3, // CD, Adlib and Infogrames music
+ kDebugSound = 1 << 3,
kDebugParser = 1 << 4,
kDebugGameFlow = 1 << 5,
kDebugFileIO = 1 << 6,
kDebugSaveLoad = 1 << 7,
kDebugGraphics = 1 << 8,
- kDebugCollisions = 1 << 9
+ kDebugVideo = 1 << 9,
+ kDebugCollisions = 1 << 10
};
inline char *strncpy0(char *dest, const char *src, size_t n) {
@@ -177,9 +178,12 @@ private:
int32 _features;
Common::Platform _platform;
+ uint32 _pauseStart;
+
int go();
int init();
+ void pauseEngineIntern(bool pause);
bool initGameParts();
void deinitGameParts();
diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp
index dd3fdf3684..9e5005f443 100644
--- a/engines/gob/inter.cpp
+++ b/engines/gob/inter.cpp
@@ -23,6 +23,8 @@
*
*/
+#include <time.h> // FIXME: for Inter::renewTimeInVars()
+
#include "common/endian.h"
#include "gob/gob.h"
@@ -35,8 +37,6 @@
#include "gob/scenery.h"
#include "gob/sound/sound.h"
-#include <time.h> // FIXME: for Inter::renewTimeInVars()
-
namespace Gob {
Inter::Inter(GobEngine *vm) : _vm(vm) {
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 582e57a2d4..e43cb4e891 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -519,6 +519,7 @@ protected:
virtual const char *getOpcodeFuncDesc(byte i, byte j);
virtual const char *getOpcodeGoblinDesc(int i);
+ void o4_initScreen();
void o4_playVmdOrMusic();
};
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 493efa8438..e442ec4eca 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -1087,6 +1087,8 @@ void Inter_v2::o2_playCDTrack() {
}
void Inter_v2::o2_waitCDTrackEnd() {
+ debugC(1, kDebugSound, "CDROM: Waiting for playback to end");
+
while (_vm->_sound->cdGetTrackPos() >= 0)
_vm->_util->longDelay(1);
}
@@ -1431,49 +1433,17 @@ void Inter_v2::o2_initScreen() {
if (height > 0)
_vm->_video->_surfHeight = height;
- if (videoMode == 0x18) {
-
- if (_vm->_video->_surfWidth < _vm->_width)
- _vm->_video->_screenDeltaX = (_vm->_width - _vm->_video->_surfWidth) / 2;
- else
- _vm->_video->_screenDeltaX = 0;
-
- _vm->_global->_mouseMinX = _vm->_video->_screenDeltaX;
- _vm->_global->_mouseMaxX = _vm->_video->_screenDeltaX + _vm->_video->_surfWidth - 1;
-
-
- int16 screenHeight = _vm->_video->_surfHeight;
-
- if (screenHeight < _vm->_height) {
- _vm->_video->_surfHeight += offY;
- _vm->_video->_splitStart = screenHeight;
- } else
- _vm->_video->_splitStart = screenHeight - offY;
-
- _vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, screenHeight - offY);
- _vm->_video->_splitHeight2 = offY;
-
- if ((_vm->_video->_surfHeight + offY) < _vm->_height)
- _vm->_video->_screenDeltaY = (_vm->_height - (screenHeight + offY)) / 2;
- else
- _vm->_video->_screenDeltaY = 0;
-
- _vm->_global->_mouseMaxY = (screenHeight + _vm->_video->_screenDeltaY) - offY - 1;
- _vm->_global->_mouseMinY = _vm->_video->_screenDeltaY;
+ _vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, _vm->_video->_surfHeight - offY);
+ _vm->_video->_splitHeight2 = offY;
+ _vm->_video->_splitStart = _vm->_video->_surfHeight - offY;
- } else {
- _vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, _vm->_video->_surfHeight - offY);
- _vm->_video->_splitHeight2 = offY;
- _vm->_video->_splitStart = _vm->_video->_surfHeight - offY;
+ _vm->_video->_screenDeltaX = 0;
+ _vm->_video->_screenDeltaY = 0;
- _vm->_video->_screenDeltaX = 0;
- _vm->_video->_screenDeltaY = 0;
-
- _vm->_global->_mouseMinX = 0;
- _vm->_global->_mouseMinY = 0;
- _vm->_global->_mouseMaxX = _vm->_width;
- _vm->_global->_mouseMaxY = _vm->_height - _vm->_video->_splitHeight2 - 1;
- }
+ _vm->_global->_mouseMinX = 0;
+ _vm->_global->_mouseMinY = 0;
+ _vm->_global->_mouseMaxX = _vm->_width;
+ _vm->_global->_mouseMaxY = _vm->_height - _vm->_video->_splitHeight2 - 1;
_vm->_draw->closeScreen();
_vm->_util->clearPalette();
@@ -1532,18 +1502,27 @@ void Inter_v2::o2_scroll() {
}
void Inter_v2::o2_setScrollOffset() {
- int16 offset;
+ int16 offsetX, offsetY;
- offset = _vm->_parse->parseValExpr();
+ offsetX = _vm->_parse->parseValExpr();
+ offsetY = _vm->_parse->parseValExpr();
- if (offset == -1) {
- _vm->_parse->parseValExpr();
+ if (offsetX == -1) {
WRITE_VAR(2, _vm->_draw->_scrollOffsetX);
WRITE_VAR(3, _vm->_draw->_scrollOffsetY);
} else {
- _vm->_draw->_scrollOffsetX = offset;
- _vm->_draw->_scrollOffsetY = _vm->_parse->parseValExpr();
+ int16 screenW = _vm->_video->_surfWidth;
+ int16 screenH = _vm->_video->_surfHeight;
+
+ if (screenW > _vm->_width)
+ screenW -= _vm->_width;
+ if (screenH > _vm->_height)
+ screenH -= _vm->_height;
+
+ _vm->_draw->_scrollOffsetX = CLIP<int16>(offsetX, 0, screenW);
+ _vm->_draw->_scrollOffsetY = CLIP<int16>(offsetY, 0, screenH);
}
+
_vm->_util->setScrollOffset();
_noBusyWait = true;
}
@@ -1574,6 +1553,10 @@ void Inter_v2::o2_playImd() {
palEnd = _vm->_parse->parseValExpr();
palCmd = 1 << (flags & 0x3F);
+ debugC(1, kDebugVideo, "Playing video \"%s\" @ %d+%d, frames %d - %d, "
+ "paletteCmd %d (%d - %d), flags %X", _vm->_global->_inter_resStr, x, y,
+ startFrame, lastFrame, palCmd, palStart, palEnd, flags);
+
if ((imd[0] != 0) && !_vm->_vidPlayer->primaryOpen(imd, x, y, flags)) {
WRITE_VAR(11, -1);
return;
@@ -1607,6 +1590,12 @@ void Inter_v2::o2_getImdInfo() {
varWidth = _vm->_parse->parseVarIndex();
varHeight = _vm->_parse->parseVarIndex();
+ // WORKAROUND: The nut rolling animation in the administration center
+ // in Woodruff is called "noixroul", but the scripts think it's "noixroule".
+ if ((_vm->getGameType() == kGameTypeWoodruff) &&
+ (!scumm_stricmp(_vm->_global->_inter_resStr, "noixroule")))
+ strcpy(_vm->_global->_inter_resStr, "noixroul");
+
_vm->_vidPlayer->writeVideoInfo(_vm->_global->_inter_resStr, varX, varY,
varFrames, varWidth, varHeight);
}
@@ -2056,7 +2045,6 @@ void Inter_v2::o2_loadInfogramesIns(OpGobParams &params) {
strncpy0(fileName, GET_VAR_STR(varName), 15);
strcat(fileName, ".INS");
- debugC(1, kDebugMusic, "Loading Infogrames instrument file \"%s\"", fileName);
_vm->_sound->infogramesLoadInstruments(fileName);
}
@@ -2069,7 +2057,6 @@ void Inter_v2::o2_playInfogrames(OpGobParams &params) {
strncpy0(fileName, GET_VAR_STR(varName), 15);
strcat(fileName, ".DUM");
- debugC(1, kDebugMusic, "Playing Infogrames music file \"%s\"", fileName);
_vm->_sound->infogramesLoadSong(fileName);
_vm->_sound->infogramesPlay();
diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp
index 76b11752e0..fd90b731a2 100644
--- a/engines/gob/inter_v4.cpp
+++ b/engines/gob/inter_v4.cpp
@@ -29,6 +29,7 @@
#include "gob/gob.h"
#include "gob/inter.h"
#include "gob/global.h"
+#include "gob/draw.h"
#include "gob/game.h"
#include "gob/parse.h"
#include "gob/videoplayer.h"
@@ -279,7 +280,7 @@ void Inter_v4::setupOpcodes() {
{NULL, ""},
{NULL, ""},
/* 80 */
- OPCODE(o2_initScreen),
+ OPCODE(o4_initScreen),
OPCODE(o2_scroll),
OPCODE(o2_setScrollOffset),
OPCODE(o4_playVmdOrMusic),
@@ -504,7 +505,7 @@ void Inter_v4::setupOpcodes() {
/* 30 */
OPCODE(o1_returnTo),
OPCODE(o1_loadSpriteContent),
- OPCODE(o3_copySprite),
+ OPCODE(o1_copySprite),
OPCODE(o1_fillRect),
/* 34 */
OPCODE(o1_drawLine),
@@ -687,6 +688,8 @@ void Inter_v4::executeGoblinOpcode(int i, OpGobParams &params) {
}
if (op == NULL) {
+ warning("unimplemented opcodeGoblin: %d", i);
+
int16 val;
_vm->_global->_inter_execPtr -= 2;
@@ -714,6 +717,86 @@ const char *Inter_v4::getOpcodeGoblinDesc(int i) {
return "";
}
+void Inter_v4::o4_initScreen() {
+ int16 offY;
+ int16 videoMode;
+ int16 width, height;
+
+ offY = load16();
+
+ videoMode = offY & 0xFF;
+ offY = (offY >> 8) & 0xFF;
+
+ width = _vm->_parse->parseValExpr();
+ height = _vm->_parse->parseValExpr();
+
+ _vm->_video->clearScreen();
+
+ _vm->_global->_fakeVideoMode = videoMode;
+
+ // Some versions require this
+ if (videoMode == 0xD)
+ videoMode = _vm->_mode;
+
+ if ((videoMode == _vm->_global->_videoMode) && (width == -1))
+ return;
+
+ if (width > 0)
+ _vm->_video->_surfWidth = width;
+ if (height > 0)
+ _vm->_video->_surfHeight = height;
+
+ _vm->_video->_screenDeltaX = 0;
+ if (_vm->_video->_surfWidth < _vm->_width)
+ _vm->_video->_screenDeltaX = (_vm->_width - _vm->_video->_surfWidth) / 2;
+
+ _vm->_global->_mouseMinX = _vm->_video->_screenDeltaX;
+ _vm->_global->_mouseMaxX = _vm->_video->_screenDeltaX + _vm->_video->_surfWidth - 1;
+
+ _vm->_video->_splitStart = _vm->_video->_surfHeight - offY;
+
+ _vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, _vm->_video->_surfHeight);
+ _vm->_video->_splitHeight2 = offY;
+
+ if ((_vm->_video->_surfHeight + offY) < _vm->_height)
+ _vm->_video->_screenDeltaY = (_vm->_height - (_vm->_video->_surfHeight + offY)) / 2;
+ else
+ _vm->_video->_screenDeltaY = 0;
+
+ _vm->_global->_mouseMaxY = (_vm->_video->_surfHeight + _vm->_video->_screenDeltaY) - offY - 1;
+ _vm->_global->_mouseMinY = _vm->_video->_screenDeltaY;
+
+ _vm->_draw->closeScreen();
+ _vm->_util->clearPalette();
+ memset(_vm->_global->_redPalette, 0, 256);
+ memset(_vm->_global->_greenPalette, 0, 256);
+ memset(_vm->_global->_bluePalette, 0, 256);
+
+ _vm->_video->_splitSurf = 0;
+ _vm->_draw->_spritesArray[24] = 0;
+ _vm->_draw->_spritesArray[25] = 0;
+
+ _vm->_global->_videoMode = videoMode;
+ _vm->_video->initPrimary(videoMode);
+ WRITE_VAR(15, _vm->_global->_fakeVideoMode);
+
+ _vm->_global->_setAllPalette = true;
+
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX,
+ _vm->_global->_inter_mouseY);
+ _vm->_util->clearPalette();
+
+ _vm->_draw->initScreen();
+
+ _vm->_util->setScrollOffset();
+
+ if (offY > 0) {
+ _vm->_draw->_spritesArray[24] = new SurfaceDesc(videoMode, _vm->_width, offY);
+ _vm->_draw->_spritesArray[25] = new SurfaceDesc(videoMode, _vm->_width, offY);
+ _vm->_video->_splitSurf = _vm->_draw->_spritesArray[25];
+ }
+}
+
void Inter_v4::o4_playVmdOrMusic() {
char fileName[128];
int16 x, y;
@@ -729,6 +812,12 @@ void Inter_v4::o4_playVmdOrMusic() {
evalExpr(0);
strncpy0(fileName, _vm->_global->_inter_resStr, 127);
+ // WORKAROUND: The nut rolling animation in the administration center
+ // in Woodruff is called "noixroul", but the scripts think it's "noixroule".
+ if ((_vm->getGameType() == kGameTypeWoodruff) &&
+ (!scumm_stricmp(fileName, "noixroule")))
+ strcpy(fileName, "noixroul");
+
x = _vm->_parse->parseValExpr();
y = _vm->_parse->parseValExpr();
startFrame = _vm->_parse->parseValExpr();
@@ -739,11 +828,14 @@ void Inter_v4::o4_playVmdOrMusic() {
palEnd = _vm->_parse->parseValExpr();
palCmd = 1 << (flags & 0x3F);
+ debugC(1, kDebugVideo, "Playing video \"%s\" @ %d+%d, frames %d - %d, "
+ "paletteCmd %d (%d - %d), flags %X", fileName, x, y, startFrame, lastFrame,
+ palCmd, palStart, palEnd, flags);
+
close = false;
if (lastFrame == -1) {
close = true;
} else if (lastFrame == -3) {
-// warning("Woodruff Stub: Video/Music command -3: Play background video %s, %d, %d, %d, %d", fileName, startFrame, x, y, VAR_OFFSET(7872));
_vm->_mult->_objects[startFrame].pAnimData->animation = -startFrame - 1;
@@ -767,17 +859,16 @@ void Inter_v4::o4_playVmdOrMusic() {
warning("Woodruff Stub: Video/Music command -4: Play background video %s", fileName);
return;
} else if (lastFrame == -5) {
-// warning("Woodruff Stub: Video/Music command -5: Stop background music");
_vm->_sound->bgStop();
return;
} else if (lastFrame == -6) {
-// warning("Woodruff Stub: Video/Music command -6: Load background video %s", fileName);
+ return;
+ } else if (lastFrame == -7) {
return;
} else if (lastFrame == -8) {
warning("Woodruff Stub: Video/Music command -8: Play background video %s", fileName);
return;
} else if (lastFrame == -9) {
-// warning("Woodruff Stub: Video/Music command -9: Play background music %s (%d-%d)", fileName, palEnd, palStart);
_vm->_sound->bgStop();
_vm->_sound->bgSetPlayMode(BackgroundAtmosphere::kPlayModeRandom);
_vm->_sound->bgPlay(fileName, palStart);
diff --git a/engines/gob/map_v4.cpp b/engines/gob/map_v4.cpp
index 721f040341..a3c3222213 100644
--- a/engines/gob/map_v4.cpp
+++ b/engines/gob/map_v4.cpp
@@ -113,7 +113,7 @@ void Map_v4::loadMapObjects(const char *avjFile) {
}
if (_widthByte == 4)
- _mapWidth = (int16) READ_VARO_UINT16(68);
+ _mapWidth = VAR(17);
_passWidth = _mapWidth;
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index 8a299649c7..3a83ac1867 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -755,7 +755,7 @@ void Mult_v2::newCycleAnim(Mult_Object &animObj) {
animData.frame = 0;
if ((animData.animation < 0) && (animObj.videoSlot > 0)) {
_vm->_vidPlayer->slotClose(animObj.videoSlot - 1);
- animObj.videoSlot = 0;
+ animObj.videoSlot = 0;
}
break;
@@ -764,12 +764,14 @@ void Mult_v2::newCycleAnim(Mult_Object &animObj) {
case 7:
animData.frame--;
animData.isPaused = 1;
+/*
if ((animData.animation < 0) && (animObj.videoSlot > 0)) {
if (_vm->_vidPlayer->getFlags(animObj.videoSlot - 1) & 0x1000) {
_vm->_vidPlayer->slotClose(animObj.videoSlot - 1);
animObj.videoSlot = 0;
}
}
+*/
break;
case 10:
diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp
index 25df5b7e71..6b52cdbbd6 100644
--- a/engines/gob/scenery.cpp
+++ b/engines/gob/scenery.cpp
@@ -100,7 +100,6 @@ int16 Scenery::loadStatic(char search) {
byte *extData = 0;
byte *dataPtr;
Static *ptr;
- int16 pictDescId;
int16 width;
int16 height;
int16 sprResId;
@@ -143,8 +142,6 @@ int16 Scenery::loadStatic(char search) {
dataPtr += 2;
ptr->layers = new StaticLayer[ptr->layersCount];
- ptr->pieces = new PieceDesc*[picsCount];
- ptr->piecesFromExt = new bool[picsCount];
for (int i = 0; i < ptr->layersCount; i++) {
int16 offset = READ_LE_UINT16(dataPtr + i * 2);
@@ -166,18 +163,13 @@ int16 Scenery::loadStatic(char search) {
backsPtr++;
}
+ ptr->pieces = new PieceDesc*[picsCount];
+ ptr->piecesCount = new uint32[picsCount];
+
for (int i = 0; i < picsCount; i++) {
- pictDescId = _vm->_inter->load16();
+ int16 pictDescId = _vm->_inter->load16();
- if (pictDescId >= 30000) {
- ptr->pieces[i] =
- (PieceDesc *) _vm->_game->loadExtData(pictDescId, 0, 0);
- ptr->piecesFromExt[i] = true;
- } else {
- ptr->pieces[i] =
- (PieceDesc *) _vm->_game->loadTotResource(pictDescId);
- ptr->piecesFromExt[i] = false;
- }
+ loadPieces(pictDescId, ptr->pieces[i], ptr->piecesCount[i]);
width = _vm->_inter->load16();
height = _vm->_inter->load16();
@@ -224,8 +216,7 @@ void Scenery::freeStatic(int16 index) {
return;
for (int i = 0; i < _staticPictCount[index]; i++) {
- if (_statics[index].piecesFromExt[i])
- delete[] _statics[index].pieces[i];
+ delete[] _statics[index].pieces[i];
spr = _staticPictToSprite[index * 7 + i];
_spriteRefs[spr]--;
@@ -239,7 +230,7 @@ void Scenery::freeStatic(int16 index) {
delete[] _statics[index].layers[i].planes;
delete[] _statics[index].layers;
delete[] _statics[index].pieces;
- delete[] _statics[index].piecesFromExt;
+ delete[] _statics[index].piecesCount;
_statics[index].layersCount = 0;
_staticPictCount[index] = -1;
@@ -253,8 +244,8 @@ void Scenery::renderStatic(int16 scenery, int16 layer) {
int16 order;
int16 plane;
- int16 pieceIndex;
- int16 pictIndex;
+ uint16 pieceIndex;
+ uint16 pictIndex;
int16 left;
int16 right;
@@ -286,12 +277,21 @@ void Scenery::renderStatic(int16 scenery, int16 layer) {
pieceIndex = planePtr->pieceIndex;
pictIndex = planePtr->pictIndex - 1;
+ if (pictIndex >= _staticPictCount[scenery])
+ continue;
+
+ if (!ptr->pieces || !ptr->pieces[pictIndex])
+ continue;
+
+ if (pieceIndex >= ptr->piecesCount[pictIndex])
+ continue;
+
_vm->_draw->_destSpriteX = planePtr->destX;
_vm->_draw->_destSpriteY = planePtr->destY;
- left = FROM_LE_16(ptr->pieces[pictIndex][pieceIndex].left);
- right = FROM_LE_16(ptr->pieces[pictIndex][pieceIndex].right);
- top = FROM_LE_16(ptr->pieces[pictIndex][pieceIndex].top);
- bottom = FROM_LE_16(ptr->pieces[pictIndex][pieceIndex].bottom);
+ left = ptr->pieces[pictIndex][pieceIndex].left;
+ right = ptr->pieces[pictIndex][pieceIndex].right;
+ top = ptr->pieces[pictIndex][pieceIndex].top;
+ bottom = ptr->pieces[pictIndex][pieceIndex].bottom;
_vm->_draw->_sourceSurface =
_staticPictToSprite[scenery * 7 + pictIndex];
@@ -313,8 +313,8 @@ void Scenery::updateStatic(int16 orderFrom, byte index, byte layer) {
int16 planeCount;
int16 order;
int16 plane;
- int16 pieceIndex;
- int16 pictIndex;
+ uint16 pieceIndex;
+ uint16 pictIndex;
int16 left;
int16 right;
@@ -338,16 +338,22 @@ void Scenery::updateStatic(int16 orderFrom, byte index, byte layer) {
pieceIndex = planePtr->pieceIndex;
pictIndex = planePtr->pictIndex - 1;
- if ((pictIndex >= _staticPictCount[index]) || (!pictPtr[pictIndex]))
+ if (pictIndex >= _staticPictCount[index])
+ continue;
+
+ if (!pictPtr || !pictPtr[pictIndex])
+ continue;
+
+ if (pieceIndex >= _statics[index].piecesCount[pictIndex])
continue;
_vm->_draw->_destSpriteX = planePtr->destX;
_vm->_draw->_destSpriteY = planePtr->destY;
- left = FROM_LE_16(pictPtr[pictIndex][pieceIndex].left);
- right = FROM_LE_16(pictPtr[pictIndex][pieceIndex].right);
- top = FROM_LE_16(pictPtr[pictIndex][pieceIndex].top);
- bottom = FROM_LE_16(pictPtr[pictIndex][pieceIndex].bottom);
+ left = pictPtr[pictIndex][pieceIndex].left;
+ right = pictPtr[pictIndex][pieceIndex].right;
+ top = pictPtr[pictIndex][pieceIndex].top;
+ bottom = pictPtr[pictIndex][pieceIndex].bottom;
if (_vm->_draw->_destSpriteX > _toRedrawRight)
continue;
@@ -418,7 +424,6 @@ int16 Scenery::loadAnim(char search) {
byte *extData;
byte *dataPtr;
Animation *ptr;
- int16 pictDescId;
int16 width;
int16 height;
int16 sprResId;
@@ -457,9 +462,6 @@ int16 Scenery::loadAnim(char search) {
dataPtr += 2;
ptr->layers = new AnimLayer[ptr->layersCount];
- ptr->pieces = new PieceDesc*[picsCount];
- ptr->piecesFromExt = new bool[picsCount];
- ptr->sizes = new uint16[picsCount];
for (i = 0; i < ptr->layersCount; i++) {
int16 offset = READ_LE_UINT16(dataPtr + i * 2);
@@ -495,23 +497,13 @@ int16 Scenery::loadAnim(char search) {
}
}
+ ptr->pieces = new PieceDesc*[picsCount];
+ ptr->piecesCount = new uint32[picsCount];
+
for (i = 0; i < picsCount; i++) {
- pictDescId = _vm->_inter->load16();
- if (pictDescId >= 30000) {
- uint32 size;
-
- ptr->pieces[i] =
- (PieceDesc *) _vm->_game->loadExtData(pictDescId, 0, 0, &size);
- ptr->piecesFromExt[i] = true;
- ptr->sizes[i] = size / 8;
- } else {
- int16 size;
+ int16 pictDescId = _vm->_inter->load16();
- ptr->pieces[i] =
- (PieceDesc *) _vm->_game->loadTotResource(pictDescId, &size);
- ptr->piecesFromExt[i] = false;
- ptr->sizes[i] = size / 8;
- }
+ loadPieces(pictDescId, ptr->pieces[i], ptr->piecesCount[i]);
width = _vm->_inter->load16();
height = _vm->_inter->load16();
@@ -557,8 +549,7 @@ void Scenery::freeAnim(int16 index) {
return;
for (int i = 0; i < _animPictCount[index]; i++) {
- if (_animations[index].piecesFromExt[i])
- delete[] _animations[index].pieces[i];
+ delete[] _animations[index].pieces[i];
spr = _animPictToSprite[index * 7 + i];
_spriteRefs[spr]--;
@@ -572,8 +563,7 @@ void Scenery::freeAnim(int16 index) {
delete[] _animations[index].layers[i].frames;
delete[] _animations[index].layers;
delete[] _animations[index].pieces;
- delete[] _animations[index].piecesFromExt;
- delete[] _animations[index].sizes;
+ delete[] _animations[index].piecesCount;
_animPictCount[index] = 0;
}
@@ -623,8 +613,8 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,
Mult::Mult_Object &obj = _vm->_mult->_objects[-animation - 1];
- if (!_vm->_vidPlayer->slotIsOpen(obj.videoSlot - 1)) {
- _toRedrawLeft = -1234;
+ if ((obj.videoSlot == 0) || !_vm->_vidPlayer->slotIsOpen(obj.videoSlot - 1)) {
+ _toRedrawLeft = -12345;
return;
}
@@ -736,7 +726,7 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,
}
- if (flags & 4) {
+ if (!(flags & 4)) {
_animLeft = _toRedrawLeft = left;
_animTop = _toRedrawTop = top;
_animRight = _toRedrawRight = right;
@@ -824,20 +814,19 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,
pictIndex = (pictIndex & 15) - 1;
- if ((pictIndex == 0xFFFF) || (_animPictCount[animation] <= pictIndex)) {
- warning("Scenery::updateAnim: pictIndex out of range");
- return;
- }
+ if (pictIndex >= _animPictCount[animation])
+ continue;
- if (_animations[animation].sizes[pictIndex] <= pieceIndex) {
- warning("Scenery::updateAnim: pieceIndex out of range");
+ if (!pictPtr[pictIndex])
+ continue;
+
+ if (pieceIndex >= _animations[animation].piecesCount[pictIndex])
continue;
- }
- left = READ_LE_UINT16(&pictPtr[pictIndex][pieceIndex].left);
- right = READ_LE_UINT16(&pictPtr[pictIndex][pieceIndex].right);
- top = READ_LE_UINT16(&pictPtr[pictIndex][pieceIndex].top);
- bottom = READ_LE_UINT16(&pictPtr[pictIndex][pieceIndex].bottom);
+ left = pictPtr[pictIndex][pieceIndex].left;
+ right = pictPtr[pictIndex][pieceIndex].right;
+ top = pictPtr[pictIndex][pieceIndex].top;
+ bottom = pictPtr[pictIndex][pieceIndex].bottom;
if (flags & 2) {
if (destX < _vm->_mult->_animLeft) {
@@ -958,4 +947,42 @@ Scenery::AnimLayer *Scenery::getAnimLayer(uint16 index, uint16 layer) {
return &_animations[index].layers[layer];
}
+void Scenery::loadPieces(int16 pictDescId, PieceDesc *&pieceDesc, uint32 &piecesCount) {
+ byte *data;
+ uint32 size;
+ bool fromExt = false;
+
+ if (pictDescId >= 30000) {
+ fromExt = true;
+
+ uint32 eSize;
+
+ data = _vm->_game->loadExtData(pictDescId, 0, 0, &eSize);
+ size = eSize;
+ } else {
+ int16 tSize;
+
+ data = _vm->_game->loadTotResource(pictDescId, &tSize);
+ size = tSize;
+ }
+
+ if (!data)
+ error("Scenery::loadPieces(): Can't load pictDescId %d", pictDescId);
+
+ piecesCount = size / 8;
+ pieceDesc = new PieceDesc[piecesCount];
+
+ Common::MemoryReadStream pieceData(data, size);
+
+ for (uint32 i = 0; i < piecesCount; i++) {
+ pieceDesc[i].left = (int16) pieceData.readUint16LE();
+ pieceDesc[i].right = (int16) pieceData.readUint16LE();
+ pieceDesc[i].top = (int16) pieceData.readUint16LE();
+ pieceDesc[i].bottom = (int16) pieceData.readUint16LE();
+ }
+
+ if (fromExt)
+ delete[] data;
+}
+
} // End of namespace Gob
diff --git a/engines/gob/scenery.h b/engines/gob/scenery.h
index 03ef84e16d..21bf29deda 100644
--- a/engines/gob/scenery.h
+++ b/engines/gob/scenery.h
@@ -34,10 +34,10 @@ public:
#include "common/pack-start.h" // START STRUCT PACKING
struct PieceDesc {
- int16 left; //NOTE:
- int16 right; //These are stored in Little Endian format
- int16 top; //And should be converted by client code when accessed
- int16 bottom; //i.e. use FROM_LE_16()
+ int16 left;
+ int16 right;
+ int16 top;
+ int16 bottom;
} PACKED_STRUCT;
struct StaticPlane {
@@ -82,19 +82,16 @@ public:
int16 layersCount;
StaticLayer *layers;
PieceDesc **pieces;
- bool *piecesFromExt;
- Static() : layersCount(0), layers(0), pieces(0),
- piecesFromExt(0) {}
+ uint32 *piecesCount;
+ Static() : layersCount(0), layers(0), pieces(0), piecesCount(0) {}
};
struct Animation {
int16 layersCount;
AnimLayer *layers;
PieceDesc **pieces;
- bool *piecesFromExt;
- uint16 *sizes;
- Animation() : layersCount(0), layers(0), pieces(0),
- piecesFromExt(0) {}
+ uint32 *piecesCount;
+ Animation() : layersCount(0), layers(0), pieces(0), piecesCount(0) {}
};
int16 _curStatic;
@@ -151,6 +148,8 @@ protected:
GobEngine *_vm;
+ void loadPieces(int16 pictDescId, PieceDesc *&pieceDesc, uint32 &piecesCount);
+
void updateStatic(int16 orderFrom, byte index, byte layer);
};
diff --git a/engines/gob/sound/adlib.cpp b/engines/gob/sound/adlib.cpp
index fb0d9d58c1..b3d392ad1e 100644
--- a/engines/gob/sound/adlib.cpp
+++ b/engines/gob/sound/adlib.cpp
@@ -125,7 +125,7 @@ int AdLib::readBuffer(int16 *buffer, const int numSamples) {
}
void AdLib::writeOPL(byte reg, byte val) {
- debugC(6, kDebugMusic, "writeOPL(%02X, %02X)", reg, val);
+ debugC(6, kDebugSound, "writeOPL(%02X, %02X)", reg, val);
OPLWriteReg(_opl, reg, val);
}
diff --git a/engines/gob/sound/cdrom.cpp b/engines/gob/sound/cdrom.cpp
index f3bc70807e..eef8025cc2 100644
--- a/engines/gob/sound/cdrom.cpp
+++ b/engines/gob/sound/cdrom.cpp
@@ -83,8 +83,6 @@ void CDROM::startTrack(const char *trackName) {
if (!_LICbuffer)
return;
- debugC(1, kDebugMusic, "CDROM::startTrack(%s)", trackName);
-
byte *matchPtr = getTrackBuffer(trackName);
if (!matchPtr) {
warning("Track \"%s\" not found", trackName);
@@ -114,8 +112,6 @@ void CDROM::play(uint32 from, uint32 to) {
// HSG encodes frame information into a double word:
// minute multiplied by 4500, plus second multiplied by 75,
// plus frame, minus 150
- debugC(1, kDebugMusic, "CDROM::play(%d, %d)", from, to);
-
AudioCD.play(1, 1, from, to - from + 1);
_cdPlaying = true;
}
@@ -159,8 +155,6 @@ void CDROM::stopPlaying() {
}
void CDROM::stop() {
- debugC(1, kDebugMusic, "CDROM::stop()");
-
_curTrackBuffer = 0;
AudioCD.stop();
_cdPlaying = false;
diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp
index 63b74ca36f..a90afe0e27 100644
--- a/engines/gob/sound/sound.cpp
+++ b/engines/gob/sound/sound.cpp
@@ -56,6 +56,8 @@ Sound::~Sound() {
delete _blaster;
delete _adlib;
delete _infogrames;
+ delete _cdrom;
+ delete _bgatmos;
for (int i = 0; i < kSoundsCount; i++)
_sounds[i].free();
@@ -92,6 +94,8 @@ bool Sound::sampleLoad(SoundDesc *sndDesc, const char *fileName, bool tryExist)
if (!sndDesc)
return false;
+ debugC(2, kDebugSound, "Loading sample \"%s\"", fileName);
+
int16 handle = _vm->_dataIO->openData(fileName);
if (handle < 0) {
warning("Can't open sample file \"%s\"", fileName);
@@ -137,6 +141,8 @@ void Sound::speakerOn(int16 frequency, int32 length) {
if (!_pcspeaker)
return;
+ debugC(1, kDebugSound, "PCSpeaker: Playing tone (%d, %d)", frequency, length);
+
_pcspeaker->speakerOn(frequency, length);
}
@@ -144,6 +150,8 @@ void Sound::speakerOff() {
if (!_pcspeaker)
return;
+ debugC(1, kDebugSound, "PCSpeaker: Stopping tone");
+
_pcspeaker->speakerOff();
}
@@ -158,6 +166,8 @@ bool Sound::infogramesLoadInstruments(const char *fileName) {
if (!_infogrames)
return false;
+ debugC(1, kDebugSound, "Infogrames: Loading instruments \"%s\"", fileName);
+
return _infogrames->loadInstruments(fileName);
}
@@ -165,6 +175,8 @@ bool Sound::infogramesLoadSong(const char *fileName) {
if (!_infogrames)
return false;
+ debugC(1, kDebugSound, "Infogrames: Loading song \"%s\"", fileName);
+
return _infogrames->loadSong(fileName);
}
@@ -172,6 +184,8 @@ void Sound::infogramesPlay() {
if (!_infogrames)
return;
+ debugC(1, kDebugSound, "Infogrames: Starting playback");
+
_infogrames->play();
}
@@ -179,6 +193,8 @@ void Sound::infogramesStop() {
if (!_infogrames)
return;
+ debugC(1, kDebugSound, "Infogrames: Stopping playback");
+
_infogrames->stop();
}
@@ -186,6 +202,8 @@ bool Sound::adlibLoad(const char *fileName) {
if (!_adlib)
return false;
+ debugC(1, kDebugSound, "Adlib: Loading data (\"%s\")", fileName);
+
return _adlib->load(fileName);
}
@@ -193,6 +211,8 @@ bool Sound::adlibLoad(byte *data, uint32 size, int index) {
if (!_adlib)
return false;
+ debugC(1, kDebugSound, "Adlib: Loading data (%d)", index);
+
return _adlib->load(data, size, index);
}
@@ -200,6 +220,8 @@ void Sound::adlibUnload() {
if (!_adlib)
return;
+ debugC(1, kDebugSound, "Adlib: Unloading data");
+
_adlib->unload();
}
@@ -207,7 +229,7 @@ void Sound::adlibPlayTrack(const char *trackname) {
if (!_adlib || _adlib->isPlaying())
return;
- debugC(1, kDebugMusic, "Adlib::playTrack(%s)", trackname);
+ debugC(1, kDebugSound, "Adlib: Playing track \"%s\"", trackname);
_adlib->unload();
_adlib->load(trackname);
@@ -235,6 +257,8 @@ void Sound::adlibPlay() {
if (!_adlib)
return;
+ debugC(1, kDebugSound, "Adlib: Starting playback");
+
_adlib->startPlay();
}
@@ -242,6 +266,8 @@ void Sound::adlibStop() {
if (!_adlib)
return;
+ debugC(1, kDebugSound, "Adlib: Stopping playback");
+
_adlib->stopPlay();
}
@@ -278,6 +304,9 @@ void Sound::blasterPlay(SoundDesc *sndDesc, int16 repCount,
if (!_blaster || !sndDesc)
return;
+ debugC(1, kDebugSound, "SoundBlaster: Playing sample (%d, %d, %d)",
+ repCount, frequency, fadeLength);
+
_blaster->playSample(*sndDesc, repCount, frequency, fadeLength);
}
@@ -285,6 +314,8 @@ void Sound::blasterStop(int16 fadeLength, SoundDesc *sndDesc) {
if (!_blaster)
return;
+ debugC(1, kDebugSound, "SoundBlaster: Stopping playback");
+
_blaster->stopSound(fadeLength, sndDesc);
}
@@ -293,6 +324,9 @@ void Sound::blasterPlayComposition(int16 *composition, int16 freqVal,
if (!_blaster)
return;
+ debugC(1, kDebugSound, "SoundBlaster: Playing composition (%d, %d)",
+ freqVal, sndCount);
+
blasterWaitEndPlay();
_blaster->stopComposition();
@@ -306,6 +340,8 @@ void Sound::blasterStopComposition() {
if (!_blaster)
return;
+ debugC(1, kDebugSound, "SoundBlaster: Stopping composition");
+
_blaster->stopComposition();
}
@@ -327,6 +363,8 @@ void Sound::blasterWaitEndPlay(bool interruptible, bool stopComp) {
if (!_blaster)
return;
+ debugC(1, kDebugSound, "SoundBlaster: Waiting for playback to end");
+
if (stopComp)
_blaster->endComposition();
@@ -345,6 +383,8 @@ void Sound::cdLoadLIC(const char *fname) {
if (!_cdrom)
return;
+ debugC(1, kDebugSound, "CDROM: Loading LIC \"%s\"", fname);
+
int handle = _vm->_dataIO->openData(fname);
if (handle == -1)
@@ -366,6 +406,8 @@ void Sound::cdUnloadLIC() {
if (!_cdrom)
return;
+ debugC(1, kDebugSound, "CDROM: Unloading LIC");
+
_cdrom->freeLICBuffer();
}
@@ -400,6 +442,9 @@ void Sound::cdPlayBgMusic() {
for (int i = 0; i < ARRAYSIZE(tracks); i++)
if (!scumm_stricmp(_vm->_game->_curTotFile, tracks[i][0])) {
+ debugC(1, kDebugSound, "CDROM: Playing background music \"%s\" (\"%s\")",
+ tracks[i][1], _vm->_game->_curTotFile);
+
_cdrom->startTrack(tracks[i][1]);
break;
}
@@ -422,6 +467,9 @@ void Sound::cdPlayMultMusic() {
int language = _vm->_global->_language <= 4 ? _vm->_global->_language : 2;
for (int i = 0; i < ARRAYSIZE(tracks); i++)
if (!scumm_stricmp(_vm->_game->_curTotFile, tracks[i][0])) {
+ debugC(1, kDebugSound, "CDROM: Playing mult music \"%s\" (\"%s\")",
+ tracks[i][language + 1], _vm->_game->_curTotFile);
+
_cdrom->startTrack(tracks[i][language + 1]);
break;
}
@@ -431,6 +479,7 @@ void Sound::cdPlay(const char *trackName) {
if (!_cdrom)
return;
+ debugC(1, kDebugSound, "CDROM: Playing track \"%s\"", trackName);
_cdrom->startTrack(trackName);
}
@@ -438,6 +487,7 @@ void Sound::cdStop() {
if (!_cdrom)
return;
+ debugC(1, kDebugSound, "CDROM: Stopping playback");
_cdrom->stopPlaying();
}
@@ -473,6 +523,8 @@ void Sound::bgPlay(const char *base, int count) {
if (!_bgatmos)
return;
+ debugC(1, kDebugSound, "BackgroundAtmosphere: Playing \"%s\" (%d)", base, count);
+
_bgatmos->stop();
_bgatmos->queueClear();
@@ -495,6 +547,8 @@ void Sound::bgStop() {
if (!_bgatmos)
return;
+ debugC(1, kDebugSound, "BackgroundAtmosphere: Stopping playback");
+
_bgatmos->stop();
_bgatmos->queueClear();
}
@@ -510,6 +564,8 @@ void Sound::bgShade() {
if (!_bgatmos)
return;
+ debugC(1, kDebugSound, "BackgroundAtmosphere: Shading playback");
+
_bgatmos->shade();
}
@@ -517,6 +573,8 @@ void Sound::bgUnshade() {
if (!_bgatmos)
return;
+ debugC(1, kDebugSound, "BackgroundAtmosphere: Unshading playback");
+
_bgatmos->unshade();
}
diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp
index 3034a38079..453613d1ae 100644
--- a/engines/gob/video.cpp
+++ b/engines/gob/video.cpp
@@ -86,10 +86,14 @@ void SurfaceDesc::swap(SurfaceDesc &surf) {
Video::Video(GobEngine *vm) : _vm(vm) {
_doRangeClamp = false;
_videoDriver = 0;
+
_surfWidth = 320;
_surfHeight = 200;
+
_scrollOffsetX = 0;
_scrollOffsetY = 0;
+
+ _splitSurf = 0;
_splitHeight1 = 200;
_splitHeight2 = 0;
_splitStart = 0;
@@ -178,13 +182,25 @@ void Video::retrace(bool mouse) {
int screenOffset = _scrollOffsetY * _surfWidth + _scrollOffsetX;
int screenX = _screenDeltaX;
int screenY = _screenDeltaY;
- int screenWidth = MIN<int>(_surfWidth, _vm->_width);
- int screenHeight = MIN<int>(_splitHeight1, _vm->_height - _splitHeight2 - _screenDeltaY);
+ int screenWidth = MIN<int>(_surfWidth - _scrollOffsetX, _vm->_width);
+ int screenHeight = MIN<int>(_surfHeight - _splitHeight2 - _scrollOffsetY, _vm->_height);
g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset,
_surfWidth, screenX, screenY, screenWidth, screenHeight);
- if (_splitHeight2 > 0) {
+ if (_splitSurf) {
+
+ screenOffset = 0;
+ screenX = 0;
+ screenY = _vm->_height - _splitSurf->getHeight();
+ screenWidth = MIN<int>(_vm->_width, _splitSurf->getWidth());
+ screenHeight = _splitSurf->getHeight();
+
+ g_system->copyRectToScreen(_splitSurf->getVidMem() + screenOffset,
+ _splitSurf->getWidth(), screenX, screenY, screenWidth, screenHeight);
+
+ } else if (_splitHeight2 > 0) {
+
screenOffset = _splitStart * _surfWidth;
screenX = 0;
screenY = _vm->_height - _splitHeight2;
@@ -193,6 +209,7 @@ void Video::retrace(bool mouse) {
g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset,
_surfWidth, screenX, screenY, screenWidth, screenHeight);
+
}
g_system->updateScreen();
diff --git a/engines/gob/video.h b/engines/gob/video.h
index 1ab513205b..1338885588 100644
--- a/engines/gob/video.h
+++ b/engines/gob/video.h
@@ -98,13 +98,18 @@ public:
};
bool _doRangeClamp;
+
int16 _surfWidth;
int16 _surfHeight;
+
int16 _scrollOffsetX;
int16 _scrollOffsetY;
+
+ SurfaceDesc::Ptr _splitSurf;
int16 _splitHeight1;
int16 _splitHeight2;
int16 _splitStart;
+
int16 _screenDeltaX;
int16 _screenDeltaY;
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index c435136b75..4a337d48b4 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -348,15 +348,30 @@ int VideoPlayer::slotOpen(const char *videoFile, Type which) {
video->getVideo()->setVideoMemory();
video->getVideo()->enableSound(*_vm->_mixer);
- _videoSlots.push_back(video);
+ int slot = getNextFreeSlot();
+
+ _videoSlots[slot] = video;
WRITE_VAR(7, video->getVideo()->getFramesCount());
- return _videoSlots.size() - 1;
+ return slot;
+}
+
+int VideoPlayer::getNextFreeSlot() {
+ uint slot;
+
+ for (slot = 0; slot < _videoSlots.size(); slot++)
+ if (!_videoSlots[slot])
+ break;
+
+ if (slot == _videoSlots.size())
+ _videoSlots.push_back(0);
+
+ return slot;
}
void VideoPlayer::slotPlay(int slot, int16 frame) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()))
+ if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
return;
CoktelVideo &video = *(_videoSlots[slot]->getVideo());
@@ -377,18 +392,18 @@ void VideoPlayer::slotPlay(int slot, int16 frame) {
}
void VideoPlayer::slotClose(int slot) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()))
+ if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
return;
delete _videoSlots[slot];
- _videoSlots.remove_at(slot);
+ _videoSlots[slot] = 0;
}
void VideoPlayer::slotCopyFrame(int slot, byte *dest,
uint16 left, uint16 top, uint16 width, uint16 height,
uint16 x, uint16 y, uint16 pitch, int16 transp) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()))
+ if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
return;
_videoSlots[slot]->getVideo()->copyCurrentFrame(dest,
@@ -396,14 +411,14 @@ void VideoPlayer::slotCopyFrame(int slot, byte *dest,
}
void VideoPlayer::slotCopyPalette(int slot, int16 palStart, int16 palEnd) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()))
+ if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
return;
copyPalette(*(_videoSlots[slot]->getVideo()), palStart, palEnd);
}
void VideoPlayer::slotWaitEndFrame(int slot, bool onlySound) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()))
+ if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
return;
CoktelVideo &video = *(_videoSlots[slot]->getVideo());
@@ -413,7 +428,7 @@ void VideoPlayer::slotWaitEndFrame(int slot, bool onlySound) {
}
bool VideoPlayer::slotIsOpen(int slot) const {
- if ((slot >= 0) && (((uint) slot) < _videoSlots.size()))
+ if ((slot >= 0) && (((uint) slot) < _videoSlots.size()) && _videoSlots[slot])
return true;
return false;
@@ -423,7 +438,7 @@ const VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) const {
if (slot < 0) {
if (_primaryVideo->isOpen())
return _primaryVideo;
- } else if (((uint) slot) < _videoSlots.size())
+ } else if (((uint) slot) < _videoSlots.size() && _videoSlots[slot])
return _videoSlots[slot];
return 0;
@@ -527,7 +542,7 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey,
_vm->_draw->_noInvalidated = true;
}
- if (state.flags & CoktelVideo::kStatePalette) {
+ if ((state.flags & CoktelVideo::kStatePalette) && (palCmd > 1)) {
copyPalette(*(_primaryVideo->getVideo()), palStart, palEnd);
if (!_backSurf)
@@ -587,20 +602,19 @@ void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY,
if (primaryOpen(videoFile)) {
int16 x, y, width, height;
- if ((VAR_OFFSET(varX) != 0xFFFFFFFF) ||
- !_primaryVideo->getVideo()->getAnchor(1, 2, x, y, width, height)) {
+ x = _primaryVideo->getVideo()->getX();
+ y = _primaryVideo->getVideo()->getY();
+ width = _primaryVideo->getVideo()->getWidth();
+ height = _primaryVideo->getVideo()->getHeight();
- x = _primaryVideo->getVideo()->getX();
- y = _primaryVideo->getVideo()->getY();
- width = _primaryVideo->getVideo()->getWidth();
- height = _primaryVideo->getVideo()->getHeight();
- }
+ if (VAR_OFFSET(varX) == 0xFFFFFFFF)
+ _primaryVideo->getVideo()->getAnchor(1, 2, x, y, width, height);
WRITE_VAR_OFFSET(varX, x);
WRITE_VAR_OFFSET(varY, y);
WRITE_VAR_OFFSET(varFrames, _primaryVideo->getVideo()->getFramesCount());
WRITE_VAR_OFFSET(varWidth, width);
- WRITE_VAR_OFFSET(varHeight, height);
+ WRITE_VARO_UINT16(varHeight & 0xFFFFFFFC, height);
primaryClose();
} else {
@@ -619,4 +633,13 @@ void VideoPlayer::evalBgShading(CoktelVideo &video) {
_vm->_sound->bgUnshade();
}
+void VideoPlayer::notifyPaused(uint32 duration) {
+ if (_primaryVideo->isOpen())
+ _primaryVideo->getVideo()->notifyPaused(duration);
+
+ for (uint i = 0; i < _videoSlots.size(); i++)
+ if (_videoSlots[i] && _videoSlots[i]->isOpen())
+ _videoSlots[i]->getVideo()->notifyPaused(duration);
+}
+
} // End of namespace Gob
diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h
index 29531f7ce2..b7aa7313b0 100644
--- a/engines/gob/videoplayer.h
+++ b/engines/gob/videoplayer.h
@@ -83,6 +83,8 @@ public:
void writeVideoInfo(const char *videoFile, int16 varX, int16 varY,
int16 varFrames, int16 varWidth, int16 varHeight);
+ void notifyPaused(uint32 duration);
+
private:
class Video {
public:
@@ -128,6 +130,8 @@ private:
const Video *getVideoBySlot(int slot = -1) const;
+ int getNextFreeSlot();
+
void copyPalette(CoktelVideo &video, int16 palStart = -1, int16 palEnd = -1);
bool doPlay(int16 frame, int16 breakKey,
uint16 palCmd, int16 palStart, int16 palEnd,
diff --git a/engines/kyra/animator_hof.cpp b/engines/kyra/animator_hof.cpp
index 1192145530..c5d44d10af 100644
--- a/engines/kyra/animator_hof.cpp
+++ b/engines/kyra/animator_hof.cpp
@@ -127,12 +127,8 @@ void KyraEngine_HoF::updateItemAnimations() {
return;
const ItemAnimData_v2 *s = &_itemAnimData[_nextAnimItem];
- ActiveItemAnim *a = &_activeItemAnim[_nextAnimItem];
-
- if (++_nextAnimItem == 14) {
- _nextAnimItem = 0;
- return;
- }
+ ActiveItemAnim *a = &_activeItemAnim[_nextAnimItem];
+ _nextAnimItem = ++_nextAnimItem % _itemAnimDataSize;
uint32 ctime = _system->getMillis();
if (ctime < a->nextFrame)
diff --git a/engines/kyra/animator_mr.cpp b/engines/kyra/animator_mr.cpp
index f04ca0345d..9702499fe7 100644
--- a/engines/kyra/animator_mr.cpp
+++ b/engines/kyra/animator_mr.cpp
@@ -205,11 +205,7 @@ void KyraEngine_MR::updateItemAnimations() {
const ItemAnimData_v2 *s = &_itemAnimData[_nextAnimItem];
ActiveItemAnim *a = &_activeItemAnim[_nextAnimItem];
-
- if (++_nextAnimItem == 11) {
- _nextAnimItem = 0;
- return;
- }
+ _nextAnimItem = ++_nextAnimItem % 10;
uint32 ctime = _system->getMillis();
if (ctime < a->nextFrame)
diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp
index 0d170dbf05..7ae5414d82 100644
--- a/engines/kyra/debugger.cpp
+++ b/engines/kyra/debugger.cpp
@@ -192,6 +192,7 @@ bool Debugger::cmd_setTimerCountdown(int argc, const char **argv) {
Debugger_LoK::Debugger_LoK(KyraEngine_LoK *vm)
: Debugger(vm), _vm(vm) {
+ DCmd_Register("enter", WRAP_METHOD(Debugger_LoK, cmd_enterRoom));
DCmd_Register("rooms", WRAP_METHOD(Debugger_LoK, cmd_listRooms));
DCmd_Register("give", WRAP_METHOD(Debugger_LoK, cmd_giveItem));
DCmd_Register("birthstones", WRAP_METHOD(Debugger_LoK, cmd_listBirthstones));
diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp
index 3c4c87e12b..a3ca2f829e 100644
--- a/engines/kyra/detection.cpp
+++ b/engines/kyra/detection.cpp
@@ -41,22 +41,25 @@ struct KYRAGameDescription {
namespace {
-#define FLAGS(x, y, z, a, b, id) { Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, id }
-
-#define KYRA1_FLOPPY_FLAGS FLAGS(false, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_AMIGA_FLAGS FLAGS(false, false, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_TOWNS_FLAGS FLAGS(false, true, false, false, false, Kyra::GI_KYRA1)
-#define KYRA1_TOWNS_SJIS_FLAGS FLAGS(false, true, false, true, false, Kyra::GI_KYRA1)
-#define KYRA1_CD_FLAGS FLAGS(false, true, true, false, false, Kyra::GI_KYRA1)
-#define KYRA1_DEMO_FLAGS FLAGS(true, false, false, false, false, Kyra::GI_KYRA1)
-
-#define KYRA2_CD_FLAGS FLAGS(false, false, true, false, false, Kyra::GI_KYRA2)
-#define KYRA2_CD_DEMO_FLAGS FLAGS(true, false, true, false, false, Kyra::GI_KYRA2)
-#define KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_TOWNS_FLAGS FLAGS(false, false, false, false, false, Kyra::GI_KYRA2)
-#define KYRA2_TOWNS_SJIS_FLAGS FLAGS(false, false, false, true, false, Kyra::GI_KYRA2)
-
-#define KYRA3_CD_FLAGS FLAGS(false, false, true, false, true, Kyra::GI_KYRA3)
+#define FLAGS(x, y, z, a, b, c, id) { Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, c, id }
+
+#define KYRA1_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_AMIGA_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_TOWNS_FLAGS FLAGS(false, true, false, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_TOWNS_SJIS_FLAGS FLAGS(false, true, false, true, false, false, Kyra::GI_KYRA1)
+#define KYRA1_CD_FLAGS FLAGS(false, true, true, false, false, false, Kyra::GI_KYRA1)
+#define KYRA1_DEMO_FLAGS FLAGS(true, false, false, false, false, false, Kyra::GI_KYRA1)
+
+#define KYRA2_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, true, Kyra::GI_KYRA2)
+#define KYRA2_CD_FLAGS FLAGS(false, false, true, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_CD_DEMO_FLAGS FLAGS(true, false, true, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_TOWNS_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_KYRA2)
+#define KYRA2_TOWNS_SJIS_FLAGS FLAGS(false, false, false, true, false, false, Kyra::GI_KYRA2)
+
+#define KYRA3_CD_FLAGS FLAGS(false, false, true, false, true, true, Kyra::GI_KYRA3)
+#define KYRA3_CD_INS_FLAGS FLAGS(false, false, true, false, true, true, Kyra::GI_KYRA3)
const KYRAGameDescription adGameDescs[] = {
{
@@ -296,6 +299,66 @@ const KYRAGameDescription adGameDescs[] = {
KYRA1_DEMO_FLAGS
},
+ { // Floppy version
+ {
+ "kyra2",
+ 0,
+ AD_ENTRY1("WESTWOOD.001", "3f52dda68c4f7696c8309038be9f4151"),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ KYRA2_FLOPPY_CMP_FLAGS
+ },
+
+ { // Floppy version
+ {
+ "kyra2",
+ 0,
+ AD_ENTRY1("WESTWOOD.001", "d787b9559afddfe058b84c0b3a787224"),
+ Common::DE_DEU,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ KYRA2_FLOPPY_CMP_FLAGS
+ },
+
+ { // // Floppy version extracted
+ {
+ "kyra2",
+ "Extracted",
+ AD_ENTRY1("FATE.PAK", "1ba18be685ad8e5a0ab5d46a0ce4d345"),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ KYRA2_FLOPPY_FLAGS
+ },
+
+ { // Floppy version extracted
+ {
+ "kyra2",
+ "Extracted",
+ AD_ENTRY1("FATE.PAK", "262fb69dd8e52e596c7aefc6456f7c1b"),
+ Common::DE_DEU,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ KYRA2_FLOPPY_FLAGS
+ },
+
+ { // Floppy version extracted
+ {
+ "kyra2",
+ "Extracted",
+ AD_ENTRY1("FATE.PAK", "f7de11506b4c8fdf64bc763206c3e4e7"),
+ Common::FR_FRA,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ KYRA2_FLOPPY_FLAGS
+ },
+
{ // CD version
{
"kyra2",
@@ -417,7 +480,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::kPlatformPC,
Common::ADGF_DROPLANGUAGE
},
- KYRA3_CD_FLAGS
+ KYRA3_CD_INS_FLAGS
},
{
{
@@ -432,7 +495,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::kPlatformPC,
Common::ADGF_DROPLANGUAGE
},
- KYRA3_CD_FLAGS
+ KYRA3_CD_INS_FLAGS
},
{
{
@@ -447,7 +510,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::kPlatformPC,
Common::ADGF_DROPLANGUAGE
},
- KYRA3_CD_FLAGS
+ KYRA3_CD_INS_FLAGS
},
// installed version
@@ -497,7 +560,7 @@ const KYRAGameDescription adGameDescs[] = {
KYRA3_CD_FLAGS
},
- { AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0) }
+ { AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0) }
};
const PlainGameDescriptor gameList[] = {
diff --git a/engines/kyra/gui_hof.cpp b/engines/kyra/gui_hof.cpp
index 10f7f657a3..555934cb7f 100644
--- a/engines/kyra/gui_hof.cpp
+++ b/engines/kyra/gui_hof.cpp
@@ -455,12 +455,12 @@ void KyraEngine_HoF::showBookPage() {
char filename[16];
sprintf(filename, "PAGE%.01X.", _bookCurPage);
- strcat(filename, _languageExtension[_lang]);
+ strcat(filename, (_flags.isTalkie || _flags.platform == Common::kPlatformFMTowns || _lang) ? _languageExtension[_lang] : "TXT");
uint8 *leftPage = _res->fileData(filename, 0);
int leftPageY = _bookPageYOffset[_bookCurPage];
sprintf(filename, "PAGE%.01X.", _bookCurPage+1);
- strcat(filename, _languageExtension[_lang]);
+ strcat(filename, (_flags.isTalkie || _flags.platform == Common::kPlatformFMTowns || _lang) ? _languageExtension[_lang] : "TXT");
uint8 *rightPage = (_bookCurPage != _bookMaxPage) ? _res->fileData(filename, 0) : 0;
int rightPageY = _bookPageYOffset[_bookCurPage+1];
diff --git a/engines/kyra/gui_lok.cpp b/engines/kyra/gui_lok.cpp
index 2b823b1ae7..6fa30c9e9a 100644
--- a/engines/kyra/gui_lok.cpp
+++ b/engines/kyra/gui_lok.cpp
@@ -337,6 +337,8 @@ void GUI_LoK::setGUILabels() {
} else if (_vm->gameFlags().lang == Common::ES_ESP) {
offsetOn = offsetMainMenu = offsetOptions = offset = -4;
menuLabelGarbageOffset = 72;
+ } else if (_vm->gameFlags().lang == Common::IT_ITA) {
+ offsetOn = offsetMainMenu = offsetOptions = offset = 32;
} else if (_vm->gameFlags().lang == Common::DE_DEU) {
offset = offsetMainMenu = offsetOn = offsetOptions = 24;
} else if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) {
diff --git a/engines/kyra/items_lok.cpp b/engines/kyra/items_lok.cpp
index e86be25707..8eb62c20c2 100644
--- a/engines/kyra/items_lok.cpp
+++ b/engines/kyra/items_lok.cpp
@@ -176,7 +176,7 @@ void KyraEngine_LoK::placeItemInGenericMapScene(int item, int index) {
}
void KyraEngine_LoK::setHandItem(uint16 item) {
- debugC(9, kDebugLevelMain, "KyraEngine_LoK::setHandItem(%d)", item);
+ debugC(9, kDebugLevelMain, "KyraEngine_LoK::setHandItem(%u)", item);
_screen->hideMouse();
setMouseItem(item);
_itemInHand = item;
@@ -191,9 +191,9 @@ void KyraEngine_LoK::removeHandItem() {
_screen->showMouse();
}
-void KyraEngine_LoK::setMouseItem(int item) {
- debugC(9, kDebugLevelMain, "KyraEngine_LoK::setMouseItem(%d)", item);
- if (item == -1)
+void KyraEngine_LoK::setMouseItem(uint16 item) {
+ debugC(9, kDebugLevelMain, "KyraEngine_LoK::setMouseItem(%u)", item);
+ if (item == 0xFFFF)
_screen->setMouseCursor(1, 1, _shapes[6]);
else
_screen->setMouseCursor(8, 15, _shapes[216+item]);
diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp
index 0bc5162e94..9c5548c1f7 100644
--- a/engines/kyra/kyra_hof.cpp
+++ b/engines/kyra/kyra_hof.cpp
@@ -177,6 +177,39 @@ KyraEngine_HoF::~KyraEngine_HoF() {
_timOpcodes.clear();
}
+void KyraEngine_HoF::pauseEngineIntern(bool pause) {
+ KyraEngine_v2::pauseEngineIntern(pause);
+
+ if (!pause) {
+ uint32 pausedTime = _system->getMillis() - _pauseStart;
+ _pauseStart = 0;
+
+ // sequence player
+ //
+ // Timers in KyraEngine_HoF::seq_cmpFadeFrame() and KyraEngine_HoF::seq_animatedSubFrame()
+ // have been left out for now. I think we don't need them here.
+
+ _seqStartTime += pausedTime;
+ _seqSubFrameStartTime += pausedTime;
+ _seqEndTime += pausedTime;
+ _seqSubFrameEndTimeInternal += pausedTime;
+ _seqWsaChatTimeout += pausedTime;
+ _seqWsaChatFrameTimeout += pausedTime;
+
+ for (int x = 0; x < 10; x++) {
+ if (_activeText[x].duration != -1)
+ _activeText[x].startTime += pausedTime;
+ }
+
+ for (int x = 0; x < 8; x++) {
+ if (_activeWSA[x].flags != -1)
+ _activeWSA[x].nextFrame += pausedTime;
+ }
+
+ // TODO: item animation, idle animation, tim player, etc
+ }
+}
+
int KyraEngine_HoF::init() {
_screen = new Screen_HoF(this, _system);
assert(_screen);
@@ -254,6 +287,8 @@ int KyraEngine_HoF::go() {
if (_menuChoice != 4) {
// load just the pak files needed for ingame
_res->loadPakFile(StaticResource::staticDataFilename());
+ if (_flags.useInstallerPackage)
+ _res->loadPakFile("WESTWOOD.001");
if (_flags.platform == Common::kPlatformPC && _flags.isTalkie)
_res->loadFileList("FILEDATA.FDT");
else
diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h
index fe4b6390b7..866dd55d16 100644
--- a/engines/kyra/kyra_hof.h
+++ b/engines/kyra/kyra_hof.h
@@ -182,6 +182,8 @@ public:
KyraEngine_HoF(OSystem *system, const GameFlags &flags);
~KyraEngine_HoF();
+ void pauseEngineIntern(bool pause);
+
Screen *screen() { return _screen; }
Screen_v2 *screen_v2() const { return _screen; }
GUI_v2 *gui_v2() const { return _gui; }
@@ -856,7 +858,12 @@ protected:
uint32 _seqFrameDelay;
uint32 _seqStartTime;
+ uint32 _seqSubFrameStartTime;
uint32 _seqEndTime;
+ uint32 _seqSubFrameEndTimeInternal;
+ uint32 _seqWsaChatTimeout;
+ uint32 _seqWsaChatFrameTimeout;
+
int _seqFrameCounter;
int _seqScrollTextCounter;
int _seqWsaCurrentFrame;
diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp
index 0668cc7202..c852f6e3ee 100644
--- a/engines/kyra/kyra_lok.cpp
+++ b/engines/kyra/kyra_lok.cpp
@@ -91,6 +91,7 @@ KyraEngine_LoK::KyraEngine_LoK(OSystem *system, const GameFlags &flags)
memset(_panPagesTable, 0, sizeof(_panPagesTable));
memset(_sceneAnimTable, 0, sizeof(_sceneAnimTable));
_currHeadShape = 0;
+ _speechPlayTime = 0;
memset(&_itemBkgBackUp, 0, sizeof(_itemBkgBackUp));
}
diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h
index 5e244e4925..cb3062847e 100644
--- a/engines/kyra/kyra_lok.h
+++ b/engines/kyra/kyra_lok.h
@@ -113,6 +113,10 @@ public:
KyraEngine_LoK(OSystem *system, const GameFlags &flags);
~KyraEngine_LoK();
+ //TODO: proper extended implementation of KyraEngine_v1::pauseEngineIntern.
+ // _sprites and _seqplayer should be paused here too, to avoid some animation glitches,
+ // also parts of the hardcoded Malcolm fight might need some special handling.
+
Screen *screen() { return _screen; }
Animator_LoK *animator() { return _animator; }
virtual Movie *createWSAMovie();
@@ -205,8 +209,11 @@ public:
void snd_playWanderScoreViaMap(int command, int restart);
virtual void snd_playVoiceFile(int id);
void snd_voiceWaitForFinish(bool ingame = true);
+ uint32 snd_getVoicePlayTime();
protected:
+ int32 _speechPlayTime;
+
void saveGame(const char *fileName, const char *saveName);
void loadGame(const char *fileName);
@@ -284,7 +291,7 @@ protected:
// -> mouse item
void setHandItem(uint16 item);
void removeHandItem();
- void setMouseItem(int item);
+ void setMouseItem(uint16 item);
// -> graphics effects
void wipeDownMouseItem(int xpos, int ypos);
@@ -628,9 +635,6 @@ protected:
int _cdaTrackTableSize;
const AudioDataStruct * _soundData;
- static const int8 _charXPosTable[];
- static const int8 _charYPosTable[];
-
// positions of the inventory
static const uint16 _itemPosX[];
static const uint8 _itemPosY[];
@@ -791,9 +795,9 @@ protected:
int o1_pauseMusicSeconds(EMCState *script);
int o1_resetMaskRegion(EMCState *script);
int o1_setPaletteChangeFlag(EMCState *script);
- int o1_dummy(EMCState *script);
int o1_vocUnload(EMCState *script);
int o1_vocLoad(EMCState *script);
+ int o1_dummy(EMCState *script);
};
} // end of namespace Kyra
diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp
index c0c04cb370..c842e318ec 100644
--- a/engines/kyra/kyra_mr.cpp
+++ b/engines/kyra/kyra_mr.cpp
@@ -370,7 +370,10 @@ void KyraEngine_MR::playVQA(const char *name) {
snprintf(filename, sizeof(filename), "%s%d.VQA", name, size);
if (vqa.open(filename)) {
- _soundDigital->stopAllSounds();
+ for (int i = 0; i < 4; ++i) {
+ if (i != _musicSoundChannel)
+ _soundDigital->stopSound(i);
+ }
_screen->hideMouse();
memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
@@ -402,14 +405,12 @@ void KyraEngine_MR::playMenuAudioFile() {
if (_soundDigital->isPlaying(_musicSoundChannel))
return;
- _musicSoundChannel = _soundDigital->playSound(_menuAudioFile, 0xFF, Audio::Mixer::kMusicSoundType);
+ _musicSoundChannel = _soundDigital->playSound(_menuAudioFile, 0xFF, Audio::Mixer::kMusicSoundType, 255, true);
}
void KyraEngine_MR::snd_playWanderScoreViaMap(int track, int force) {
debugC(9, kDebugLevelMain, "KyraEngine_MR::snd_playWanderScoreViaMap(%d, %d)", track, force);
- // XXX byte_3C87C compare
-
if (_musicSoundChannel != -1 && !_soundDigital->isPlaying(_musicSoundChannel))
force = 1;
else if (_musicSoundChannel == -1)
diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h
index 4ec02c7849..5af138373c 100644
--- a/engines/kyra/kyra_mr.h
+++ b/engines/kyra/kyra_mr.h
@@ -50,6 +50,11 @@ public:
KyraEngine_MR(OSystem *system, const GameFlags &flags);
~KyraEngine_MR();
+ //TODO: proper extended implementation of KyraEngine_v2::pauseEngineIntern.
+ // Idle animation time, item animations and album animations should be taken
+ // care of, but since those would just produce minor glitches it's not that
+ // important.
+
Screen *screen() { return _screen; }
Screen_v2 *screen_v2() const { return _screen; }
GUI_v2 *gui_v2() const { return _gui; }
diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp
index a3d18f7713..1cc1d728bf 100644
--- a/engines/kyra/kyra_v1.cpp
+++ b/engines/kyra/kyra_v1.cpp
@@ -87,6 +87,11 @@ KyraEngine_v1::KyraEngine_v1(OSystem *system, const GameFlags &flags)
return _debugger;
}
+void KyraEngine_v1::pauseEngineIntern(bool pause) {
+ Engine::pauseEngineIntern(pause);
+ _timer->pause(pause);
+}
+
int KyraEngine_v1::init() {
registerDefaultSettings();
diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h
index 81a6254c7f..4f38ceca98 100644
--- a/engines/kyra/kyra_v1.h
+++ b/engines/kyra/kyra_v1.h
@@ -46,11 +46,12 @@ struct GameFlags {
Common::Language lang;
Common::Platform platform;
- bool isDemo : 1;
- bool useAltShapeHeader : 1; // alternative shape header (uses 2 bytes more, those are unused though)
- bool isTalkie : 1;
- bool useHiResOverlay : 1;
- bool useDigSound : 1;
+ bool isDemo : 1;
+ bool useAltShapeHeader : 1; // alternative shape header (uses 2 bytes more, those are unused though)
+ bool isTalkie : 1;
+ bool useHiResOverlay : 1;
+ bool useDigSound : 1;
+ bool useInstallerPackage : 1;
byte gameID;
};
@@ -109,6 +110,8 @@ public:
::GUI::Debugger *getDebugger();
+ virtual void pauseEngineIntern(bool pause);
+
bool quit() const { return _quitFlag; }
uint8 game() const { return _flags.gameID; }
@@ -263,6 +266,11 @@ protected:
static const int8 _addXPosTable[];
static const int8 _addYPosTable[];
+ // Character
+
+ static const int8 _charAddXPosTable[];
+ static const int8 _charAddYPosTable[];
+
// save/load
int _gameToLoad;
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp
index 7b720259cc..12da338843 100644
--- a/engines/kyra/kyra_v2.cpp
+++ b/engines/kyra/kyra_v2.cpp
@@ -68,6 +68,8 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags, const Engi
memset(&_mainCharacter, 0, sizeof(_mainCharacter));
memset(&_mainCharacter.inventory, -1, sizeof(_mainCharacter.inventory));
+
+ _pauseStart = 0;
}
KyraEngine_v2::~KyraEngine_v2() {
@@ -93,6 +95,22 @@ KyraEngine_v2::~KyraEngine_v2() {
delete[] _screenBuffer;
}
+void KyraEngine_v2::pauseEngineIntern(bool pause) {
+ KyraEngine_v1::pauseEngineIntern(pause);
+
+ if (!pause) {
+ uint32 pausedTime = _system->getMillis() - _pauseStart;
+
+ for (int i = 0; i < ARRAYSIZE(_sceneSpecialScriptsTimer); ++i) {
+ if (_sceneSpecialScriptsTimer[i])
+ _sceneSpecialScriptsTimer[i] += pausedTime;
+ }
+
+ } else {
+ _pauseStart = _system->getMillis();
+ }
+}
+
void KyraEngine_v2::delay(uint32 amount, bool updateGame, bool isMainLoop) {
debugC(9, kDebugLevelMain, "KyraEngine_v2::delay(%u, %d, %d)", amount, updateGame, isMainLoop);
@@ -326,8 +344,8 @@ int KyraEngine_v2::updateCharPos(int *table, int force) {
debugC(9, kDebugLevelMain, "KyraEngine_v2::updateCharPos(%p, %d)", (const void*)table, force);
if (_updateCharPosNextUpdate > _system->getMillis() && !force)
return 0;
- _mainCharacter.x1 += _updateCharPosXTable[_mainCharacter.facing];
- _mainCharacter.y1 += _updateCharPosYTable[_mainCharacter.facing];
+ _mainCharacter.x1 += _charAddXPosTable[_mainCharacter.facing];
+ _mainCharacter.y1 += _charAddYPosTable[_mainCharacter.facing];
updateCharAnimFrame(0, table);
_updateCharPosNextUpdate = _system->getMillis() + getCharacterWalkspeed() * _tickLength;
return 1;
diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h
index 2f6d8a6185..24f7aad614 100644
--- a/engines/kyra/kyra_v2.h
+++ b/engines/kyra/kyra_v2.h
@@ -75,6 +75,8 @@ public:
KyraEngine_v2(OSystem *system, const GameFlags &flags, const EngineDesc &desc);
~KyraEngine_v2();
+ virtual void pauseEngineIntern(bool pause);
+
virtual Screen_v2 *screen_v2() const = 0;
virtual GUI *gui_v2() const = 0;
@@ -85,6 +87,7 @@ protected:
EngineDesc _desc;
// run
+ uint32 _pauseStart;
bool _runFlag;
bool _showOutro;
@@ -355,8 +358,6 @@ protected:
void updateCharPosWithUpdate();
uint32 _updateCharPosNextUpdate;
- static const int8 _updateCharPosXTable[];
- static const int8 _updateCharPosYTable[];
virtual int getCharacterWalkspeed() const = 0;
virtual void updateCharAnimFrame(int num, int *table) = 0;
diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp
index 9d34c669a1..6b38a0f907 100644
--- a/engines/kyra/resource.cpp
+++ b/engines/kyra/resource.cpp
@@ -30,10 +30,10 @@
#include "common/fs.h"
#include "common/func.h"
-#include "gui/message.h"
-
#include "kyra/resource.h"
+#define INS_CACHE_THRESHOLD 300000 // all files with file size greater than this will be cached
+
namespace Kyra {
Resource::Resource(KyraEngine_v1 *vm) : _loaders(), _map(), _vm(vm) {
@@ -55,8 +55,7 @@ bool Resource::reset() {
if (!loadPakFile(StaticResource::staticDataFilename()) || !StaticResource::checkKyraDat()) {
Common::String errorMessage = "You're missing the '" + StaticResource::staticDataFilename() + "' file or it got corrupted, (re)get it from the ScummVM website";
- ::GUI::MessageDialog errorMsg(errorMessage);
- errorMsg.runModal();
+ _vm->GUIErrorMessage(errorMessage);
error(errorMessage.c_str());
}
@@ -69,17 +68,31 @@ bool Resource::reset() {
if (_vm->gameFlags().isTalkie)
loadPakFile("CHAPTER1.VRM");
} else if (_vm->game() == GI_KYRA2) {
+ if (_vm->gameFlags().useInstallerPackage)
+ loadPakFile("WESTWOOD.001");
+
// mouse pointer, fonts, etc. required for initializing
if (_vm->gameFlags().isDemo && !_vm->gameFlags().isTalkie) {
loadPakFile("GENERAL.PAK");
} else {
+ if (_vm->gameFlags().isTalkie) {
+ // Add default file directories
+ Common::File::addDefaultDirectory(ConfMan.get("path") + "hof_cd");
+ Common::File::addDefaultDirectory(ConfMan.get("path") + "HOF_CD");
+ }
+
loadPakFile("INTROGEN.PAK");
loadPakFile("OTHER.PAK");
}
return true;
} else if (_vm->game() == GI_KYRA3) {
- loadPakFile("WESTWOOD.001");
+ if (_vm->gameFlags().useInstallerPackage)
+ loadPakFile("WESTWOOD.001");
+ // Add default file directories
+ Common::File::addDefaultDirectory(ConfMan.get("path") + "malcolm");
+ Common::File::addDefaultDirectory(ConfMan.get("path") + "MALCOLM");
+
loadFileList("FILEDATA.FDT");
return true;
@@ -210,7 +223,7 @@ bool Resource::loadFileList(const Common::String &filedata) {
buffer[12] = 0;
f.seek(offset + 16, SEEK_SET);
- Common::String filename = (char*)buffer;
+ Common::String filename = Common::String((char*)buffer);
filename.toUppercase();
if (filename.hasSuffix(".PAK")) {
@@ -569,7 +582,7 @@ Common::SeekableReadStream *ResLoaderPak::loadFileFromArchive(const Common::Stri
return stream;
}
-class ResLoaderIns : public ResArchiveLoader {
+class ResLoaderInsKyra : public ResArchiveLoader {
public:
bool checkFilename(Common::String filename) const;
bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
@@ -577,16 +590,790 @@ public:
Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const;
ResFileEntry::kType getType() const {
- return ResFileEntry::kIns;
+ return ResFileEntry::kInsKyra;
+ }
+};
+
+bool ResLoaderInsKyra::checkFilename(Common::String filename) const {
+ return false;
+}
+
+bool ResLoaderInsKyra::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
+ return true;
+}
+
+bool ResLoaderInsKyra::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const {
+ return true;
+}
+
+Common::SeekableReadStream *ResLoaderInsKyra::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const {
+ return 0;
+}
+
+class FileExpanderSource {
+public:
+ FileExpanderSource(const uint8 *data) : _dataPtr(data), _bitsLeft(8), _key(0), _index(0) {}
+ ~FileExpanderSource() {}
+
+ void advSrcRefresh();
+ void advSrcBitsBy1();
+ void advSrcBitsByIndex(uint8 newIndex);
+
+ uint8 getKeyLower() { return _key & 0xff; }
+ void setIndex(uint8 index) { _index = index; }
+ uint16 getKeyMasked(uint8 newIndex);
+ uint16 keyMaskedAlign(uint16 val);
+
+ void copyBytes(uint8 *& dst);
+
+private:
+ const uint8 *_dataPtr;
+ uint16 _key;
+ int8 _bitsLeft;
+ uint8 _index;
+};
+
+void FileExpanderSource::advSrcBitsBy1() {
+ _key >>= 1;
+ if (!--_bitsLeft) {
+ _key = ((*_dataPtr++) << 8 ) | (_key & 0xff);
+ _bitsLeft = 8;
+ }
+}
+
+void FileExpanderSource::advSrcBitsByIndex(uint8 newIndex) {
+ _index = newIndex;
+ _bitsLeft -= _index;
+ if (_bitsLeft <= 0) {
+ _key >>= (_index + _bitsLeft);
+ _index = -_bitsLeft;
+ _bitsLeft = 8 - _index;
+ _key = (*_dataPtr++ << 8) | (_key & 0xff);
+ }
+ _key >>= _index;
+}
+
+uint16 FileExpanderSource::getKeyMasked(uint8 newIndex) {
+ static const uint8 mskTable[] = { 0x0F, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF };
+ _index = newIndex;
+ uint16 res = 0;
+
+ if (_index > 8) {
+ newIndex = _index - 8;
+ res = (_key & 0xff) & mskTable[8];
+ advSrcBitsByIndex(8);
+ _index = newIndex;
+ res |= (((_key & 0xff) & mskTable[_index]) << 8);
+ advSrcBitsByIndex(_index);
+ } else {
+ res = (_key & 0xff) & mskTable[_index];
+ advSrcBitsByIndex(_index);
}
+
+ return res;
+}
+
+void FileExpanderSource::copyBytes(uint8 *& dst) {
+ advSrcBitsByIndex(_bitsLeft);
+ uint16 r = (READ_LE_UINT16(_dataPtr) ^ _key) + 1;
+ _dataPtr += 2;
+
+ if (r)
+ error("decompression failure");
+
+ memcpy(dst, _dataPtr, _key);
+ _dataPtr += _key;
+ dst += _key;
+}
+
+uint16 FileExpanderSource::keyMaskedAlign(uint16 val) {
+ val -= 0x101;
+ _index = (val & 0xff) >> 2;
+ int16 b = ((_bitsLeft << 8) | _index) - 1;
+ _bitsLeft = b >> 8;
+ _index = b & 0xff;
+ return (((val & 3) + 4) << _index) + 0x101 + getKeyMasked(_index);
+}
+
+void FileExpanderSource::advSrcRefresh() {
+ _key = READ_LE_UINT16(_dataPtr);
+ _dataPtr += 2;
+ _bitsLeft = 8;
+}
+
+class FileExpander {
+public:
+ FileExpander();
+ ~FileExpander();
+
+ bool process(uint8 *dst, const uint8 *src, uint32 outsize, uint32 insize);
+
+private:
+ void generateTables(uint8 srcIndex, uint8 dstIndex, uint8 dstIndex2, int cnt);
+ uint8 calcCmdAndIndex(const uint8 *tbl, int16 &para);
+
+ FileExpanderSource *_src;
+ uint8 *_tables[9];
+ uint16 *_tables16[3];
};
-bool ResLoaderIns::checkFilename(Common::String filename) const {
+FileExpander::FileExpander() : _src(0) {
+ _tables[0] = new uint8[3914];
+ assert(_tables[0]);
+
+ _tables[1] = _tables[0] + 320;
+ _tables[2] = _tables[0] + 352;
+ _tables[3] = _tables[0] + 864;
+ _tables[4] = _tables[0] + 2016;
+ _tables[5] = _tables[0] + 2528;
+ _tables[6] = _tables[0] + 2656;
+ _tables[7] = _tables[0] + 2736;
+ _tables[8] = _tables[0] + 2756;
+
+ _tables16[0] = (uint16 *)(_tables[0] + 3268);
+ _tables16[1] = (uint16 *)(_tables[0] + 3302);
+ _tables16[2] = (uint16 *)(_tables[0] + 3338);
+}
+
+FileExpander::~FileExpander() {
+ delete _src;
+ delete[] _tables[0];
+}
+
+bool FileExpander::process(uint8 *dst, const uint8 *src, uint32 outsize, uint32 compressedSize) {
+ static const uint8 indexTable[] = {
+ 0x10, 0x11, 0x12, 0x00, 0x08, 0x07, 0x09, 0x06, 0x0A,
+ 0x05, 0x0B, 0x04, 0x0C, 0x03, 0x0D, 0x02, 0x0E, 0x01, 0x0F
+ };
+
+ memset(_tables[0], 0, 3914);
+
+ uint8 *d = dst;
+ uint16 tableSize0 = 0;
+ uint16 tableSize1 = 0;
+ bool needrefresh = true;
+ bool postprocess = false;
+
+ _src = new FileExpanderSource(src);
+
+ while (d < dst + outsize) {
+
+ if (needrefresh) {
+ needrefresh = false;
+ _src->advSrcRefresh();
+ }
+
+ _src->advSrcBitsBy1();
+
+ int mode = _src->getKeyMasked(2) - 1;
+ if (mode == 1) {
+ tableSize0 = _src->getKeyMasked(5) + 257;
+ tableSize1 = _src->getKeyMasked(5) + 1;
+ memset(_tables[7], 0, 19);
+
+ const uint8 *itbl = indexTable;
+ int numbytes = _src->getKeyMasked(4) + 4;
+
+ while (numbytes--)
+ _tables[7][*itbl++] = _src->getKeyMasked(3);
+
+ generateTables(7, 8, 255, 19);
+
+ int cnt = tableSize0 + tableSize1;
+ uint8 *tmp = _tables[0];
+
+ while (cnt) {
+ uint16 cmd = _src->getKeyLower();
+ cmd = READ_LE_UINT16(&_tables[8][cmd << 1]);
+ _src->advSrcBitsByIndex(_tables[7][cmd]);
+
+ if (cmd < 16) {
+ *tmp++ = cmd;
+ cnt--;
+ } else {
+ uint8 tmpI = 0;
+ if (cmd == 16) {
+ cmd = _src->getKeyMasked(2) + 3;
+ tmpI = *(tmp - 1);
+ } else if (cmd == 17) {
+ cmd = _src->getKeyMasked(3) + 3;
+ } else {
+ cmd = _src->getKeyMasked(7) + 11;
+ }
+ _src->setIndex(tmpI);
+ memset(tmp, tmpI, cmd);
+ tmp += cmd;
+
+ cnt -= cmd;
+ if (cnt < 0)
+ error("decompression failure");
+ }
+ }
+
+ memcpy(_tables[1], _tables[0] + tableSize0, tableSize1);
+ generateTables(0, 2, 3, tableSize0);
+ generateTables(1, 4, 5, tableSize1);
+ postprocess = true;
+ } else if (mode < 0) {
+ _src->copyBytes(d);
+ postprocess = false;
+ needrefresh = true;
+ } else if (mode == 0){
+ uint8 *d2 = _tables[0];
+ memset(d2, 8, 144);
+ memset(d2 + 144, 9, 112);
+ memset(d2 + 256, 7, 24);
+ memset(d2 + 280, 8, 8);
+ d2 = _tables[1];
+ memset(d2, 5, 32);
+ tableSize0 = 288;
+ tableSize1 = 32;
+
+ generateTables(0, 2, 3, tableSize0);
+ generateTables(1, 4, 5, tableSize1);
+ postprocess = true;
+ } else {
+ error("decompression failure");
+ }
+
+ if (!postprocess)
+ continue;
+
+ int16 cmd = 0;
+
+ do {
+ cmd = ((int16*) _tables[2])[_src->getKeyLower()];
+ _src->advSrcBitsByIndex(cmd < 0 ? calcCmdAndIndex(_tables[3], cmd) : _tables[0][cmd]);
+
+ if (cmd == 0x11d) {
+ cmd = 0x200;
+ } else if (cmd > 0x108) {
+ cmd = _src->keyMaskedAlign(cmd);
+ }
+
+ if (!(cmd >> 8)) {
+ *d++ = cmd & 0xff;
+ } else if (cmd != 0x100) {
+ cmd -= 0xfe;
+ int16 offset = ((int16*) _tables[4])[_src->getKeyLower()];
+ _src->advSrcBitsByIndex(offset < 0 ? calcCmdAndIndex(_tables[5], offset) : _tables[1][offset]);
+ if ((offset & 0xff) >= 4) {
+ uint8 newIndex = ((offset & 0xff) >> 1) - 1;
+ offset = (((offset & 1) + 2) << newIndex) + _src->getKeyMasked(newIndex);
+ }
+
+ uint8 *s2 = d - 1 - offset;
+ if (s2 >= dst) {
+ while (cmd--)
+ *d++ = *s2++;
+ } else {
+ uint32 pos = dst - s2;
+ s2 += (d - dst);
+
+ if (pos < (uint32) cmd) {
+ cmd -= pos;
+ while (pos--)
+ *d++ = *s2++;
+ s2 = dst;
+ }
+ while (cmd--)
+ *d++ = *s2++;
+ }
+ }
+ } while (cmd != 0x100);
+ }
+
+ delete _src;
+ _src = 0;
+
+ return true;
+}
+
+void FileExpander::generateTables(uint8 srcIndex, uint8 dstIndex, uint8 dstIndex2, int cnt) {
+ const uint8 *tbl1 = _tables[srcIndex];
+ const uint8 *tbl2 = _tables[dstIndex];
+ const uint8 *tbl3 = dstIndex2 == 0xff ? 0 : _tables[dstIndex2];
+
+ if (!cnt)
+ return;
+
+ const uint8 *s = tbl1;
+ memset(_tables16[0], 0, 32);
+
+ for (int i = 0; i < cnt; i++)
+ _tables16[0][(*s++)]++;
+
+ _tables16[1][1] = 0;
+
+ for (uint16 i = 1, r = 0; i < 16; i++) {
+ r = (r + _tables16[0][i]) << 1;
+ _tables16[1][i + 1] = r;
+ }
+
+ if (_tables16[1][16]) {
+ uint16 r = 0;
+ for (uint16 i = 1; i < 16; i++)
+ r += _tables16[0][i];
+ if (r > 1)
+ error("decompression failure");
+ }
+
+ s = tbl1;
+ uint16 *d = _tables16[2];
+ for (int i = 0; i < cnt; i++) {
+ uint16 t = *s++;
+ if (t) {
+ _tables16[1][t]++;
+ t = _tables16[1][t] - 1;
+ }
+ *d++ = t;
+ }
+
+ s = tbl1;
+ d = _tables16[2];
+ for (int i = 0; i < cnt; i++) {
+ int8 t = ((int8)(*s++)) - 1;
+ if (t > 0) {
+ uint16 v1 = *d;
+ uint16 v2 = 0;
+
+ do {
+ v2 = (v2 << 1) | (v1 & 1);
+ v1 >>= 1;
+ } while (--t && v1);
+
+ t++;
+ uint8 c1 = (v1 & 1);
+ while (t--) {
+ uint8 c2 = v2 >> 15;
+ v2 = (v2 << 1) | c1;
+ c1 = c2;
+ };
+
+ *d++ = v2;
+ } else {
+ d++;
+ }
+ }
+
+ memset((void*) tbl2, 0, 512);
+
+ cnt--;
+ s = tbl1 + cnt;
+ d = &_tables16[2][cnt];
+ uint16 * bt = (uint16*) tbl3;
+ uint16 inc = 0;
+ uint16 cnt2 = 0;
+
+ do {
+ uint8 t = *s--;
+ uint16 *s2 = (uint16*) tbl2;
+
+ if (t && t < 9) {
+ inc = 1 << t;
+ uint16 o = *d;
+
+ do {
+ s2[o] = cnt;
+ o += inc;
+ } while (!(o & 0xf00));
+
+ } else if (t > 8) {
+ if (!bt)
+ error("decompression failure");
+
+ t -= 8;
+ uint8 shiftCnt = 1;
+ uint8 v = (*d) >> 8;
+ s2 = &((uint16*) tbl2)[*d & 0xff];
+
+ do {
+ if (!*s2) {
+ *s2 = (uint16)(~cnt2);
+ *(uint32*)&bt[cnt2] = 0;
+ cnt2 += 2;
+ }
+
+ s2 = &bt[(uint16)(~*s2)];
+ if (v & shiftCnt)
+ s2++;
+
+ shiftCnt <<= 1;
+ } while (--t);
+ *s2 = cnt;
+ }
+ d--;
+ } while (--cnt >= 0);
+}
+
+uint8 FileExpander::calcCmdAndIndex(const uint8 *tbl, int16 &para) {
+ const uint16 *t = (const uint16*)tbl;
+ _src->advSrcBitsByIndex(8);
+ uint8 newIndex = 0;
+ uint16 v = _src->getKeyLower();
+
+ do {
+ newIndex++;
+ para = t[((~para) & 0xfffe) | (v & 1)];
+ v >>= 1;
+ } while (para < 0);
+
+ return newIndex;
+}
+
+class FileCache {
+public:
+ FileCache() : _size(0) {}
+ ~FileCache() {}
+
+ void add(ResFileEntry entry, const uint8 *data);
+ bool getData(ResFileEntry entry, uint8 *dst);
+ void flush();
+
+private:
+ struct FileCacheEntry {
+ ResFileEntry entry;
+ const uint8 *data;
+ };
+
+ Common::List<FileCacheEntry> _cachedFileList;
+ uint32 _size;
+};
+
+void FileCache::add(ResFileEntry entry, const uint8 *data) {
+ FileCacheEntry fileCacheEntry;
+ fileCacheEntry.entry.compressedSize = entry.compressedSize;
+ fileCacheEntry.entry.mounted = entry.mounted;
+ fileCacheEntry.entry.offset = entry.offset;
+ fileCacheEntry.entry.parent = entry.parent;
+ fileCacheEntry.entry.preload = entry.preload;
+ fileCacheEntry.entry.prot = entry.prot;
+ fileCacheEntry.entry.size = entry.size;
+ fileCacheEntry.entry.type = entry.type;
+ fileCacheEntry.entry.fileIndex = entry.fileIndex;
+ uint8 *dst = new uint8[entry.size];
+ assert(dst);
+ memcpy(dst, data, entry.size);
+ fileCacheEntry.data = dst;
+ _cachedFileList.push_back(fileCacheEntry);
+ _size += entry.size;
+}
+
+bool FileCache::getData(ResFileEntry entry, uint8 *dst) {
+ for (Common::List<FileCacheEntry>::const_iterator c = _cachedFileList.begin(); c != _cachedFileList.end(); ++c) {
+ if (c->entry.offset == entry.offset && c->entry.compressedSize == entry.compressedSize &&
+ c->entry.fileIndex == entry.fileIndex && c->entry.size == entry.size) {
+ memcpy(dst, c->data, c->entry.size);
+ return true;
+ }
+ }
+ return false;
+}
+
+void FileCache::flush() {
+ debug(1, "total amount of cache memory used: %d", _size);
+ for (Common::List<FileCacheEntry>::const_iterator c = _cachedFileList.begin(); c != _cachedFileList.end(); ++c)
+ delete[] c->data;
+ _cachedFileList.clear();
+ _size = 0;
+}
+
+class ResLoaderInsHof : public ResArchiveLoader {
+public:
+ ResLoaderInsHof() {}
+ ~ResLoaderInsHof() { _fileCache.flush(); }
+
+ bool checkFilename(Common::String filename) const;
+ bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
+ bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const;
+ Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const;
+
+ ResFileEntry::kType getType() const {
+ return ResFileEntry::kInsHof;
+ }
+private:
+ mutable FileCache _fileCache;
+};
+
+bool ResLoaderInsHof::checkFilename(Common::String filename) const {
+ filename.toUppercase();
+ if (!filename.hasSuffix(".001"))
+ return false;
+ filename.insertChar('2', filename.size() - 1);
+ filename.deleteLastChar();
+ if (!Common::File::exists(filename))
+ return false;
+ return true;
+}
+
+bool ResLoaderInsHof::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
+ uint8 fileId = stream.readByte();
+ uint32 size = stream.readUint32LE();
+
+ if (size < stream.size() + 1)
+ return false;
+
+ return (fileId == 1);
+}
+
+bool ResLoaderInsHof::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const {
+ Common::File tmpFile;
+
+ uint32 pos = 0;
+ uint32 bytesleft = 0;
+ bool startFile = true;
+
+ Common::String filenameBase(filename.c_str(), 10);
+ Common::String filenameTemp;
+ char filenameExt[4];
+
+ while (filenameBase.lastChar() != '.')
+ filenameBase.deleteLastChar();
+
+ InsHofArchive newArchive;
+
+ Common::List<InsHofArchive> archives;
+
+ for (int8 currentFile = 1; currentFile; currentFile++) {
+ sprintf(filenameExt, "%03d", currentFile);
+ filenameTemp = filenameBase + Common::String(filenameExt);
+
+ if (!tmpFile.open(filenameTemp)) {
+ debug(3, "couldn't open file '%s'\n", filenameTemp.c_str());
+ break;
+ }
+
+ tmpFile.seek(pos);
+ uint8 fileId = tmpFile.readByte();
+ pos++;
+
+ uint32 size = tmpFile.size() - 1;
+ if (startFile) {
+ size -= 4;
+ if (fileId == currentFile) {
+ size -= 6;
+ pos += 6;
+ tmpFile.seek(6, SEEK_CUR);
+ } else {
+ size = size + 1 - pos;
+ }
+ newArchive.filename = filenameBase;
+ bytesleft = newArchive.totalSize = tmpFile.readUint32LE();
+ pos += 4;
+ newArchive.firstFile = currentFile;
+ newArchive.startOffset = pos;
+ startFile = false;
+ }
+
+ uint32 cs = MIN(size, bytesleft);
+ bytesleft -= cs;
+
+ tmpFile.close();
+
+ pos += cs;
+ if (cs == size) {
+ if (!bytesleft) {
+ newArchive.lastFile = currentFile;
+ newArchive.endOffset = --pos;
+ archives.push_back(newArchive);
+ currentFile = -1;
+ } else {
+ pos = 0;
+ }
+ } else {
+ startFile = true;
+ bytesleft = size - cs;
+ newArchive.lastFile = currentFile--;
+ newArchive.endOffset = --pos;
+ archives.push_back(newArchive);
+ }
+ }
+
+ ResFileEntry newEntry;
+ pos = 0;
+
+ const uint32 kExecSize = 0x0bba;
+ const uint32 kHeaderSize = 30;
+ const uint32 kHeaderSize2 = 46;
+
+ for (Common::List<InsHofArchive>::iterator a = archives.begin(); a != archives.end(); ++a) {
+ startFile = true;
+ for (uint32 i = a->firstFile; i != (a->lastFile + 1); i++) {
+ sprintf(filenameExt, "%03d", i);
+ filenameTemp = a->filename + Common::String(filenameExt);
+
+ if (!tmpFile.open(filenameTemp)) {
+ debug(3, "couldn't open file '%s'\n", filenameTemp.c_str());
+ break;
+ }
+
+ uint32 size = (i == a->lastFile) ? a->endOffset : tmpFile.size();
+
+ if (startFile) {
+ startFile = false;
+ pos = a->startOffset + kExecSize;
+ if (pos > size) {
+ pos -= size;
+ tmpFile.close();
+ continue;
+ }
+ } else {
+ pos ++;
+ }
+
+ while (pos < size) {
+ uint8 hdr[43];
+ uint32 m = 0;
+ tmpFile.seek(pos);
+
+ if (pos + 42 > size) {
+ m = size - pos;
+ uint32 b = 42 - m;
+
+ if (m >= 4) {
+ uint32 id = tmpFile.readUint32LE();
+ if (id == 0x06054B50) {
+ startFile = true;
+ break;
+ } else {
+ tmpFile.seek(pos);
+ }
+ }
+
+ sprintf(filenameExt, "%03d", i + 1);
+ filenameTemp = a->filename + Common::String(filenameExt);
+
+ Common::File tmpFile2;
+ tmpFile2.open(filenameTemp);
+ tmpFile.read(hdr, m);
+ tmpFile2.read(hdr + m, b);
+ tmpFile2.close();
+
+ } else {
+ tmpFile.read(hdr, 42);
+ }
+
+ uint32 id = READ_LE_UINT32(hdr);
+
+ if (id == 0x04034B50) {
+ if (hdr[8] != 8)
+ error("compression type not implemented");
+ newEntry.compressedSize = READ_LE_UINT32(hdr + 18);
+ newEntry.size = READ_LE_UINT32(hdr + 22);
+
+ uint16 filestrlen = READ_LE_UINT16(hdr + 26);
+ *(hdr + 30 + filestrlen) = 0;
+ pos += (kHeaderSize + filestrlen - m);
+
+ newEntry.parent = filename;
+ newEntry.offset = pos;
+ newEntry.type = ResFileEntry::kAutoDetect;
+ newEntry.mounted = false;
+ newEntry.preload = false;
+ newEntry.prot = false;
+ newEntry.fileIndex = i;
+ files.push_back(File(Common::String((const char *)(hdr + 30)), newEntry));
+
+ pos += newEntry.compressedSize;
+ if (pos > size) {
+ pos -= size;
+ break;
+ }
+ } else {
+ uint32 filestrlen = READ_LE_UINT32(hdr + 28);
+ pos += (kHeaderSize2 + filestrlen - m);
+ }
+ }
+ tmpFile.close();
+ }
+ }
+
+ archives.clear();
+
+ return true;
+}
+
+Common::SeekableReadStream *ResLoaderInsHof::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const {
+ if (archive) {
+ delete archive;
+ archive = 0;
+ }
+
+ uint8 *outbuffer = (uint8 *)malloc(entry.size);
+ assert(outbuffer);
+
+ if (!_fileCache.getData(entry, outbuffer)) {
+ Common::File tmpFile;
+ char filename[13];
+ sprintf(filename, "WESTWOOD.%03d", entry.fileIndex);
+
+ if (!tmpFile.open(filename)) {
+ free(outbuffer);
+ return 0;
+ }
+
+ tmpFile.seek(entry.offset);
+
+ uint8 *inbuffer = new uint8[entry.compressedSize];
+ assert(inbuffer);
+
+ if ((entry.offset + entry.compressedSize) > tmpFile.size()) {
+ // this is for files that are split between two archive files
+ uint32 a = tmpFile.size() - entry.offset;
+ uint32 b = entry.compressedSize - a;
+
+ tmpFile.read(inbuffer, a);
+ tmpFile.close();
+
+ filename[strlen(filename) - 1]++;
+
+ if (!tmpFile.open(filename))
+ return 0;
+ tmpFile.seek(1);
+ tmpFile.read(inbuffer + a, b);
+ } else {
+ tmpFile.read(inbuffer, entry.compressedSize);
+ }
+
+ tmpFile.close();
+
+ FileExpander().process(outbuffer, inbuffer, entry.size, entry.compressedSize);
+ delete[] inbuffer;
+
+ if (entry.size > INS_CACHE_THRESHOLD)
+ _fileCache.add(entry, outbuffer);
+ }
+
+ Common::MemoryReadStream *stream = new Common::MemoryReadStream(outbuffer, entry.size, true);
+ assert(stream);
+
+ return stream;
+}
+
+class ResLoaderInsMalcolm : public ResArchiveLoader {
+public:
+ bool checkFilename(Common::String filename) const;
+ bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
+ bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const;
+ Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const;
+
+ ResFileEntry::kType getType() const {
+ return ResFileEntry::kInsMal;
+ }
+};
+
+bool ResLoaderInsMalcolm::checkFilename(Common::String filename) const {
filename.toUppercase();
- return (filename.hasSuffix(".001"));
+ if (!filename.hasSuffix(".001"))
+ return false;
+ filename.insertChar('2', filename.size() - 1);
+ filename.deleteLastChar();
+ if (Common::File::exists(filename))
+ return false;
+ return true;
}
-bool ResLoaderIns::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
+bool ResLoaderInsMalcolm::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
stream.seek(3);
uint32 size = stream.readUint32LE();
@@ -600,7 +1387,7 @@ bool ResLoaderIns::isLoadable(const Common::String &filename, Common::SeekableRe
return (buffer[0] == 0x0D && buffer[1] == 0x0A);
}
-bool ResLoaderIns::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const {
+bool ResLoaderInsMalcolm::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const {
Common::List<Common::String> filenames;
// thanks to eriktorbjorn for this code (a bit modified though)
@@ -645,7 +1432,7 @@ bool ResLoaderIns::loadFile(const Common::String &filename, Common::SeekableRead
return true;
}
-Common::SeekableReadStream *ResLoaderIns::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const {
+Common::SeekableReadStream *ResLoaderInsMalcolm::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const {
assert(archive);
archive->seek(entry.offset, SEEK_SET);
@@ -738,7 +1525,9 @@ Common::SeekableReadStream *ResLoaderTlk::loadFileFromArchive(const Common::Stri
void Resource::initializeLoaders() {
_loaders.push_back(LoaderList::value_type(new ResLoaderPak()));
- _loaders.push_back(LoaderList::value_type(new ResLoaderIns()));
+ _loaders.push_back(LoaderList::value_type(new ResLoaderInsKyra()));
+ _loaders.push_back(LoaderList::value_type(new ResLoaderInsHof()));
+ _loaders.push_back(LoaderList::value_type(new ResLoaderInsMalcolm()));
_loaders.push_back(LoaderList::value_type(new ResLoaderTlk()));
}
diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h
index a8de21b5ca..90405690a4 100644
--- a/engines/kyra/resource.h
+++ b/engines/kyra/resource.h
@@ -41,6 +41,15 @@
namespace Kyra {
+struct InsHofArchive {
+ Common::String filename;
+ uint32 firstFile;
+ uint32 startOffset;
+ uint32 lastFile;
+ uint32 endOffset;
+ uint32 totalSize;
+};
+
struct ResFileEntry {
Common::String parent;
uint32 size;
@@ -52,12 +61,17 @@ struct ResFileEntry {
enum kType {
kRaw = 0,
kPak = 1,
- kIns = 2,
- kTlk = 3,
+ kInsKyra = 2,
+ kInsHof = 3,
+ kInsMal = 4,
+ kTlk = 5,
kAutoDetect
};
kType type;
uint32 offset;
+
+ int fileIndex;
+ uint32 compressedSize;
};
typedef Common::HashMap<Common::String, ResFileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ResFileMap;
@@ -271,7 +285,7 @@ public:
bool prefetchId(int id);
void unloadId(int id);
private:
- void outputError();
+ void outputError(const Common::String &error);
KyraEngine_v1 *_vm;
diff --git a/engines/kyra/scene_lok.cpp b/engines/kyra/scene_lok.cpp
index 085332b525..e4ae67f751 100644
--- a/engines/kyra/scene_lok.cpp
+++ b/engines/kyra/scene_lok.cpp
@@ -295,13 +295,13 @@ int KyraEngine_LoK::setCharacterPosition(int character, int *facingTable) {
debugC(9, kDebugLevelMain, "KyraEngine_LoK::setCharacterPosition(%d, %p)", character, (const void *)facingTable);
if (character == 0) {
- _currentCharacter->x1 += _charXPosTable[_currentCharacter->facing];
- _currentCharacter->y1 += _charYPosTable[_currentCharacter->facing];
+ _currentCharacter->x1 += _charAddXPosTable[_currentCharacter->facing];
+ _currentCharacter->y1 += _charAddYPosTable[_currentCharacter->facing];
setCharacterPositionHelper(0, facingTable);
return 1;
} else {
- _characterList[character].x1 += _charXPosTable[_characterList[character].facing];
- _characterList[character].y1 += _charYPosTable[_characterList[character].facing];
+ _characterList[character].x1 += _charAddXPosTable[_characterList[character].facing];
+ _characterList[character].y1 += _charAddYPosTable[_characterList[character].facing];
if (_characterList[character].sceneId == _currentCharacter->sceneId)
setCharacterPositionHelper(character, 0);
}
@@ -1009,8 +1009,8 @@ int KyraEngine_LoK::changeScene(int facing) {
return 0;
}
- int xpos = _charXPosTable[facing] + _currentCharacter->x1;
- int ypos = _charYPosTable[facing] + _currentCharacter->y1;
+ int xpos = _charAddXPosTable[facing] + _currentCharacter->x1;
+ int ypos = _charAddYPosTable[facing] + _currentCharacter->y1;
if (xpos >= 12 && xpos <= 308) {
if (!lineIsPassable(xpos, ypos))
diff --git a/engines/kyra/scene_v2.cpp b/engines/kyra/scene_v2.cpp
index 7072cfc9a5..3bf81bfb39 100644
--- a/engines/kyra/scene_v2.cpp
+++ b/engines/kyra/scene_v2.cpp
@@ -98,7 +98,7 @@ int KyraEngine_v2::findWay(int x, int y, int toX, int toY, int *moveTable, int m
temp = pathfinderInitPositionIndexTable(temp, x, y);
pathfinderFinializePath(moveTable, temp, x, y, moveTableSize);
usePostProcess = false;
- }
+ }
return usePostProcess ? size : getMoveTableSize(moveTable);
}
@@ -106,13 +106,14 @@ bool KyraEngine_v2::directLinePassable(int x, int y, int toX, int toY) {
debugC(9, kDebugLevelMain, "KyraEngine_v2::directLinePassable(%d, %d, %d, %d)", x, y, toX, toY);
Screen *scr = screen();
- while (x != toX && y != toY) {
+ while (x != toX || y != toY) {
int facing = getFacingFromPointToPoint(x, y, toX, toY);
x += _addXPosTable[facing];
y += _addYPosTable[facing];
if (!scr->getShapeFlag1(x, y))
return false;
}
+
return true;
}
diff --git a/engines/kyra/script_hof.cpp b/engines/kyra/script_hof.cpp
index d2b6b08183..91fbfb3e49 100644
--- a/engines/kyra/script_hof.cpp
+++ b/engines/kyra/script_hof.cpp
@@ -760,7 +760,7 @@ int KyraEngine_HoF::o2_showItemString(EMCState *script) {
int KyraEngine_HoF::o2_isAnySoundPlaying(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_isAnySoundPlaying(%p) ()", (const void *)script);
- return _sound->voiceIsPlaying();
+ return _sound->voiceIsPlaying() ? 1 : 0;
}
int KyraEngine_HoF::o2_setDrawNoShapeFlag(EMCState *script) {
@@ -800,7 +800,7 @@ int KyraEngine_HoF::o2_showLetter(EMCState *script) {
_screen->fadeToBlack(0x14);
sprintf(filename, "LETTER%.1d.", letter);
- strcat(filename, _languageExtension[_lang]);
+ strcat(filename, (_flags.isTalkie || _flags.platform == Common::kPlatformFMTowns || _lang) ? _languageExtension[_lang] : "TXT");
uint8 *letterBuffer = _res->fileData(filename, 0);
if (letterBuffer) {
diff --git a/engines/kyra/script_lok.cpp b/engines/kyra/script_lok.cpp
index 670c7282e3..efa0f8e48f 100644
--- a/engines/kyra/script_lok.cpp
+++ b/engines/kyra/script_lok.cpp
@@ -35,6 +35,7 @@
#include "kyra/animator_lok.h"
#include "kyra/text.h"
#include "kyra/timer.h"
+#include "kyra/sound.h"
namespace Kyra {
int KyraEngine_LoK::o1_magicInMouseItem(EMCState *script) {
@@ -320,9 +321,20 @@ int KyraEngine_LoK::o1_setBrandonStatusBit(EMCState *script) {
}
int KyraEngine_LoK::o1_delaySecs(EMCState *script) {
- debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_delaySecs(%p) (%d)", (const void *)script, stackPos(0));
- if (stackPos(0) > 0 && !_skipFlag)
- delay(stackPos(0)*1000, true);
+ if (_flags.isTalkie && speechEnabled()) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_voiceDelay(%p) (%d)", (const void *)script, stackPos(0));
+ if (stackPos(0) == 0) {
+ snd_voiceWaitForFinish(true);
+ } else if (stackPos(0) < 0) {
+ uint32 time = ABS(stackPos(0)) * _tickLength;
+ delay(time, true);
+ }
+ } else {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_delaySecs(%p) (%d)", (const void *)script, stackPos(0));
+ if (stackPos(0) >= 0 && !_skipFlag)
+ delay(stackPos(0)*1000, true);
+ }
+
_skipFlag = false;
return 0;
}
@@ -700,7 +712,10 @@ int KyraEngine_LoK::o1_displayWSAFrameOnHidPage(EMCState *script) {
}
int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {
- debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSASequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6));
+ if (_flags.isTalkie)
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSASequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
+ else
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSASequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6));
int startFrame = stackPos(0);
int endFrame = stackPos(1);
int xpos = stackPos(2);
@@ -708,6 +723,40 @@ int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {
int waitTime = stackPos(4);
int wsaIndex = stackPos(5);
int maxTime = stackPos(6);
+
+ if (_flags.isTalkie) {
+ int specialTime = stackPos(7);
+ if (specialTime) {
+ uint32 voiceTime = snd_getVoicePlayTime();
+ if (voiceTime) {
+ int displayFrames = ABS(endFrame-startFrame)+1;
+ displayFrames *= maxTime;
+ assert(displayFrames != 0);
+
+ bool voiceSync = false;
+
+ if (specialTime < 0) {
+ voiceSync = true;
+ specialTime = ABS(specialTime);
+ }
+
+ voiceTime *= specialTime;
+ voiceTime /= 100;
+
+ if (voiceSync) {
+ uint32 voicePlayedTime = _sound->voicePlayedTime(_speechFile.c_str());
+ if (voicePlayedTime >= voiceTime)
+ voiceTime = 0;
+ else
+ voiceTime -= voicePlayedTime;
+ }
+
+ waitTime = voiceTime / displayFrames;
+ waitTime /= _tickLength;
+ }
+ }
+ }
+
if (maxTime - 1 <= 0)
maxTime = 1;
@@ -734,7 +783,8 @@ int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {
while (endFrame >= frame) {
uint32 continueTime = waitTime * _tickLength + _system->getMillis();
_movieObjects[wsaIndex]->displayFrame(frame);
- _animator->_updateScreen = true;
+ if (waitTime)
+ _animator->_updateScreen = true;
while (_system->getMillis() < continueTime) {
_sprites->updateSceneAnims();
_animator->updateAllObjectShapes();
@@ -751,7 +801,8 @@ int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {
while (endFrame <= frame) {
uint32 continueTime = waitTime * _tickLength + _system->getMillis();
_movieObjects[wsaIndex]->displayFrame(frame);
- _animator->_updateScreen = true;
+ if (waitTime)
+ _animator->_updateScreen = true;
while (_system->getMillis() < continueTime) {
_sprites->updateSceneAnims();
_animator->updateAllObjectShapes();
@@ -1691,7 +1742,7 @@ int KyraEngine_LoK::o1_pauseMusicSeconds(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_pauseMusicSeconds(%p) ()", (const void *)script);
// if music disabled
// return
- o1_delaySecs(script);
+ delay(stackPos(0)*1000, true);
return 0;
}
diff --git a/engines/kyra/script_v1.cpp b/engines/kyra/script_v1.cpp
index 7881605b9e..f74c7e3560 100644
--- a/engines/kyra/script_v1.cpp
+++ b/engines/kyra/script_v1.cpp
@@ -96,9 +96,9 @@ int KyraEngine_v1::o1_playWanderScoreViaMap(EMCState *script) {
return 0;
}
-int KyraEngine_v1::o1_fillRect(EMCState *script) {
+int KyraEngine_v1::o1_fillRect(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v1::o1_fillRect(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
- screen()->fillRect(stackPos(1), stackPos(2), stackPos(1)+stackPos(3), stackPos(2)+stackPos(4), stackPos(5), stackPos(0));
+ screen()->fillRect(stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(0));
return 0;
}
diff --git a/engines/kyra/sequences_hof.cpp b/engines/kyra/sequences_hof.cpp
index 3e9f6030ac..0751fc15db 100644
--- a/engines/kyra/sequences_hof.cpp
+++ b/engines/kyra/sequences_hof.cpp
@@ -231,7 +231,7 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
_seqFrameDelay = cseq.frameDelay;
_seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
while (!((skipFlag() && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
- uint32 starttime = _system->getMillis();
+ _seqSubFrameStartTime = _system->getMillis();
seq_processWSAs();
if (cb)
(this->*cb)(0, 0, 0, 0);
@@ -246,8 +246,8 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
if (now >= _seqEndTime && !_seqSubframePlaying)
break;
- uint32 tdiff = _seqEndTime - starttime;
- int32 dly = _tickLength - (now - starttime);
+ uint32 tdiff = _seqEndTime - _seqSubFrameStartTime;
+ int32 dly = _tickLength - (now - _seqSubFrameStartTime);
if (dly > 0)
delay(MIN<uint32>(dly, tdiff));
}
@@ -263,7 +263,7 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
_seqEndTime = _system->getMillis() + dl;
while (!((skipFlag() && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
- uint32 starttime = _system->getMillis();
+ _seqSubFrameStartTime = _system->getMillis();
seq_processWSAs();
_screen->copyPage(2, 0);
@@ -275,8 +275,8 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
break;
}
- uint32 tdiff = _seqEndTime - starttime;
- int32 dly = _tickLength - (now - starttime);
+ uint32 tdiff = _seqEndTime - _seqSubFrameStartTime;
+ int32 dly = _tickLength - (now - _seqSubFrameStartTime);
if (dly > 0)
delay(MIN<uint32>(dly, tdiff));
}
@@ -289,13 +289,7 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
_sound->voiceStop();
}
- if (_flags.isDemo && !_flags.isTalkie) {
- if (seqNum == kSequenceDemoFisher) {
- _abortIntroFlag = false;
- resetSkipFlag();
- seqNum = kSequenceDemoVirgin;
- }
- } else {
+ if (!_flags.isDemo || _flags.isTalkie) {
if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun &&
(_abortIntroFlag || skipFlag())) || seqNum == kSequenceZanfaun) {
_abortIntroFlag = false;
@@ -319,8 +313,13 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
}
}
+ if (_flags.isDemo && !_flags.isTalkie) {
+ _eventList.clear();
+ _screen->fadeToBlack();
+ }
+
if (!_menuChoice)
- delay(1000);
+ delay(1200);
_screen->setCurPage(oldPage);
_screen->showMouse();
@@ -375,13 +374,14 @@ int KyraEngine_HoF::seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm
uint8 *tmpPal = &(_screen->getPalette(3)[0x101]);
memset(tmpPal, 0, 256);
- uint32 endtime = 0, now = 0;
+ _seqSubFrameEndTimeInternal = 0;
+ uint32 now = 0;
switch (_seqFrameCounter) {
case 0:
_seqSubframePlaying = true;
_sound->playTrack(4);
- endtime = _system->getMillis() + 60 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 60 * _tickLength;
_seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
memset(_seqTextColorMap, _seqTextColor[1], 16);
@@ -390,8 +390,8 @@ int KyraEngine_HoF::seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm
_screen->setTextColorMap(_seqTextColorMap);
now = _system->getMillis();
- if (endtime > now)
- delay(endtime - now);
+ if (_seqSubFrameEndTimeInternal > now)
+ delay(_seqSubFrameEndTimeInternal - now);
break;
case 1:
@@ -830,7 +830,7 @@ int KyraEngine_HoF::seq_introHand3(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
}
int KyraEngine_HoF::seq_finaleFunters(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -851,12 +851,12 @@ int KyraEngine_HoF::seq_finaleFunters(WSAMovie_v2 *wsaObj, int x, int y, int frm
_seqTextColor[0] = _seqTextColorMap[1] = 0xff;
_screen->setTextColorMap(_seqTextColorMap);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(81, 240, 70, _seqTextColorMap, 252);
seq_printCreditsString(82, 240, 90, _seqTextColorMap, _seqTextColor[0]);
_screen->copyPage(2, 12);
- delay(endtime - _system->getMillis());
seq_playTalkText(_flags.isTalkie ? 28 : 24);
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqTextColor[0] = 1;
if (_flags.isTalkie) {
@@ -914,7 +914,7 @@ int KyraEngine_HoF::seq_finaleFunters(WSAMovie_v2 *wsaObj, int x, int y, int frm
}
int KyraEngine_HoF::seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -925,7 +925,7 @@ int KyraEngine_HoF::seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
switch (frm) {
case -2:
seq_sequenceCommand(9);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(34, 240, _flags.isTalkie ? 60 : 40, _seqTextColorMap, 252);
seq_printCreditsString(35, 240, _flags.isTalkie ? 70 : 50, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(36, 240, _flags.isTalkie ? 90 : 70, _seqTextColorMap, 252);
@@ -934,7 +934,7 @@ int KyraEngine_HoF::seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
seq_printCreditsString(39, 240, _flags.isTalkie ? 130 : 120, _seqTextColorMap, _seqTextColor[0]);
if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
seq_printCreditsString(103, 240, 130, _seqTextColorMap, _seqTextColor[0]);
- delay(endtime - _system->getMillis());
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqEndTime = 0;
break;
@@ -998,7 +998,7 @@ int KyraEngine_HoF::seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
}
int KyraEngine_HoF::seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -1007,7 +1007,7 @@ int KyraEngine_HoF::seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
switch (frm) {
case -2:
seq_sequenceCommand(9);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(40, 240, _flags.isTalkie ? 55 : 40, _seqTextColorMap, 252);
seq_printCreditsString(41, 240, _flags.isTalkie ? 65 : 50, _seqTextColorMap, _seqTextColor[0]);
@@ -1016,7 +1016,7 @@ int KyraEngine_HoF::seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
seq_printCreditsString(44, 240, _flags.isTalkie ? 105 : 90, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(93, 240, _flags.isTalkie ? 125 : 110, _seqTextColorMap, 252);
seq_printCreditsString(94, 240, _flags.isTalkie ? 135 : 120, _seqTextColorMap, _seqTextColor[0]);
- delay(endtime - _system->getMillis());
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqEndTime = 0;
break;
@@ -1075,7 +1075,7 @@ int KyraEngine_HoF::seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
}
int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -1089,7 +1089,7 @@ int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm)
_screen->copyPage(2, 0);
_screen->updateScreen();
seq_sequenceCommand(9);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(49, 240, 20, _seqTextColorMap, 252);
seq_printCreditsString(50, 240, 30, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(51, 240, 40, _seqTextColorMap, _seqTextColor[0]);
@@ -1106,7 +1106,7 @@ int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm)
seq_printCreditsString(63, 240, 150, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(64, 240, 160, _seqTextColorMap, _seqTextColor[0]);
- delay(endtime - _system->getMillis());
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqEndTime = 0;
break;
@@ -1157,7 +1157,7 @@ int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm)
}
int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -1169,7 +1169,7 @@ int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm)
_screen->copyPage(2, 0);
_screen->updateScreen();
seq_sequenceCommand(9);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(45, 240, 40, _seqTextColorMap, 252);
seq_printCreditsString(46, 240, 50, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(47, 240, 60, _seqTextColorMap, _seqTextColor[0]);
@@ -1182,7 +1182,7 @@ int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm)
seq_printCreditsString(69, 240, 150, _seqTextColorMap, _seqTextColor[0]);
if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
seq_printCreditsString(104, 240, 160, _seqTextColorMap, _seqTextColor[0]);
- delay(endtime - _system->getMillis());
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqEndTime = 0;
break;
@@ -1227,7 +1227,7 @@ int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm)
}
int KyraEngine_HoF::seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -1240,7 +1240,7 @@ int KyraEngine_HoF::seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm)
switch (frm) {
case -2:
seq_sequenceCommand(9);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(70, 240, 20, _seqTextColorMap, 252);
seq_printCreditsString(71, 240, 30, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(72, 240, 40, _seqTextColorMap, _seqTextColor[0]);
@@ -1255,7 +1255,7 @@ int KyraEngine_HoF::seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm)
seq_printCreditsString(90, 240, 130, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(91, 240, 140, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(92, 240, 150, _seqTextColorMap, _seqTextColor[0]);
- delay(endtime - _system->getMillis());
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqEndTime = 0;
break;
@@ -1327,7 +1327,7 @@ int KyraEngine_HoF::seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm)
}
int KyraEngine_HoF::seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
- uint32 endtime = 0;
+ _seqSubFrameEndTimeInternal = 0;
int chatX = 0;
int chatY = 0;
int chatW = 0;
@@ -1339,7 +1339,7 @@ int KyraEngine_HoF::seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm
_screen->copyPage(2, 0);
_screen->updateScreen();
seq_sequenceCommand(9);
- endtime = _system->getMillis() + 480 * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
seq_printCreditsString(76, 240, 40, _seqTextColorMap, 252);
seq_printCreditsString(77, 240, 50, _seqTextColorMap, 252);
seq_printCreditsString(78, 240, 60, _seqTextColorMap, _seqTextColor[0]);
@@ -1349,7 +1349,7 @@ int KyraEngine_HoF::seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm
seq_printCreditsString(85, 240, 110, _seqTextColorMap, _seqTextColor[0]);
seq_printCreditsString(99, 240, 130, _seqTextColorMap, 252);
seq_printCreditsString(100, 240, 140, _seqTextColorMap, _seqTextColor[0]);
- delay(endtime - _system->getMillis());
+ delay(_seqSubFrameEndTimeInternal - _system->getMillis());
_seqEndTime = 0;
break;
@@ -1811,7 +1811,7 @@ uint32 KyraEngine_HoF::seq_activeTextsTimeLeft() {
}
void KyraEngine_HoF::seq_processWSAs() {
- for (int i = 0; i < 8; i++) {
+ for (int i = 0; i < 8; i++) {
if (_activeWSA[i].flags != -1) {
if (seq_processNextSubFrame(i))
seq_resetActiveWSA(i);
@@ -2334,13 +2334,16 @@ void KyraEngine_HoF::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, i
int dur = int(strlen(_sequenceStrings[strIndex])) * (_flags.isTalkie ? 7 : 15);
int entry = textEnabled() ? seq_setTextEntry(strIndex, x, y, dur, width) : strIndex;
_activeText[entry].textcolor = textColor;
- uint32 chatTimeout = _system->getMillis() + dur * _tickLength;
+ _seqWsaChatTimeout = _system->getMillis() + dur * _tickLength;
int curframe = firstframe;
- if (vocIndex && speechEnabled())
+ if (vocIndex && speechEnabled()) {
+ while (_sound->voiceIsPlaying() && !skipFlag())
+ delay(4);
seq_playTalkText(vocIndex);
+ }
- while (_system->getMillis() < chatTimeout && !(_abortIntroFlag || skipFlag())) {
+ while (_system->getMillis() < _seqWsaChatTimeout && !(_abortIntroFlag || skipFlag())) {
if (lastframe < 0) {
int t = ABS(lastframe);
if (t < curframe)
@@ -2350,7 +2353,7 @@ void KyraEngine_HoF::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, i
if (ABS(lastframe) < curframe)
curframe = firstframe;
- uint32 frameTimeout = _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
+ _seqWsaChatFrameTimeout = _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
if (wsa) {
wsa->setDrawPage(2);
wsa->setX(wsaXpos);
@@ -2363,8 +2366,8 @@ void KyraEngine_HoF::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, i
seq_processText();
uint32 tm = _system->getMillis();
- if (frameTimeout > tm && chatTimeout > tm)
- delay(MIN(frameTimeout - tm, chatTimeout - tm));
+ if (_seqWsaChatFrameTimeout > tm && _seqWsaChatTimeout > tm)
+ delay(MIN(_seqWsaChatFrameTimeout - tm, _seqWsaChatTimeout - tm));
if (speechEnabled() && !textEnabled() && !snd_voiceIsPlaying())
break;
@@ -2377,11 +2380,8 @@ void KyraEngine_HoF::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, i
if (_abortIntroFlag || skipFlag())
_sound->voiceStop();
- if (lastframe < 0) {
- int t = ABS(lastframe);
- if (t < curframe)
- curframe = t;
- }
+ if (ABS(lastframe) < curframe)
+ curframe = ABS(lastframe);
if (curframe == firstframe)
curframe++;
@@ -2395,27 +2395,46 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
if (!data)
return;
- static const char mark[] = { 5, 13, 0};
+ static const char mark[] = { 5, 13, 0 };
_screen->clearPage(tempPage1);
_screen->clearPage(tempPage2);
_screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1);
- uint8 *tmp = new uint8[397];
- memset(tmp, 0, 397);
- uint8 **tmpStringTable = new uint8*[35];
+ struct ScrollTextData {
+ int16 x;
+ int16 y;
+ uint8 *text;
+ byte unk1;
+ byte height;
+ byte adjust;
+
+ ScrollTextData() {
+ x = 0; // 0 11
+ y = 0; // 2 13
+ text = 0; // 4 15
+ unk1 = 0; // 8 19
+ height = 0; // 9 20
+ adjust = 0; // 10 21
+ }
+ };
+
+ ScrollTextData *textData = new ScrollTextData[36];
uint8 *ptr = data;
- int strTblIndex = 0;
bool loop = true;
int cnt = 0;
while (loop) {
- uint32 endTime = _system->getMillis() + speed * _tickLength;
+ _seqSubFrameEndTimeInternal = _system->getMillis() + speed * _tickLength;
while (cnt < 35 && *ptr) {
- int m = cnt * 11;
- uint16 cH = cnt ? READ_LE_UINT16(&tmp[m + 2]) + tmp[m + 9] + (tmp[m + 9] >> 3) : d->h;
+ uint16 cH;
+
+ if (cnt)
+ cH = textData[cnt].y + textData[cnt].height + (textData[cnt].height >> 3);
+ else
+ cH = d->h;
char *str = (char*)ptr;
@@ -2423,12 +2442,15 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
if (!ptr)
ptr = (uint8*)strchr(str, 0);
- tmp[m + 19] = *ptr;
+ textData[cnt + 1].unk1 = *ptr;
*ptr = 0;
- if (tmp[m + 19])
+ if (textData[cnt + 1].unk1)
ptr++;
- tmp[m + 21] = (*str == 3 || *str == 4) ? tmp[m + 21] = *str++ : 0;
+ if (*str == 3 || *str == 4)
+ textData[cnt + 1].adjust = *str++;
+ else
+ textData[cnt + 1].adjust = 0;
_screen->setFont(fid1);
@@ -2439,18 +2461,25 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
str++;
}
- tmp[m + 20] = _screen->getFontHeight();
+ textData[cnt + 1].height = _screen->getFontHeight();
- WRITE_LE_UINT16(&tmp[m + 11], (tmp[m + 21] == 3) ? 157 - _screen->getTextWidth(str) :
- ((tmp[m + 21] == 4) ? 161 : (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1));
+ switch (textData[cnt + 1].adjust) {
+ case 3:
+ textData[cnt + 1].x = 157 - _screen->getTextWidth(str);
+ break;
+ case 4:
+ textData[cnt + 1].x = 161;
+ break;
+ default:
+ textData[cnt + 1].x = (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1;
+ break;
+ }
- if (tmp[m + 8] == 5)
- cH -= (tmp[m + 9] + (tmp[m + 9] >> 3));
+ if (textData[cnt].unk1 == 5)
+ cH -= (textData[cnt].height + (textData[cnt].height >> 3));
- WRITE_LE_UINT16(&tmp[m + 13], cH);
- WRITE_LE_UINT32(&tmp[m + 15], strTblIndex);
- tmpStringTable[strTblIndex] = (uint8*) str;
- strTblIndex = (strTblIndex + 1) % 35;
+ textData[cnt + 1].y = cH;
+ textData[cnt + 1].text = (uint8*) str;
cnt++;
}
@@ -2460,11 +2489,10 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
bool palCycle = 0;
while (cnt2 < cnt) {
- int m = cnt2 * 11;
- const char *str = (const char*)tmpStringTable[READ_LE_UINT32(&tmp[m + 15])];
+ const char *str = (const char*)textData[cnt2 + 1].text;
const char *str2 = str;
- uint16 cW = READ_LE_UINT16(&tmp[m + 11]) - 10;
- uint16 cH = READ_LE_UINT16(&tmp[m + 13]);
+ int16 cW = textData[cnt2 + 1].x - 10;
+ int16 cH = textData[cnt2 + 1].y;
int x = (d->sx << 3) + cW;
int y = d->sy + cH;
int col1 = 255;
@@ -2472,7 +2500,7 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
if (cH < d->h) {
_screen->setCurPage(tempPage2);
_screen->setFont(fid1);
- if (tmp[m + 20] != _screen->getFontHeight())
+ if (textData[cnt2 + 1].height != _screen->getFontHeight())
_screen->setFont(fid2);
if (specialData) {
@@ -2503,18 +2531,18 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
_screen->setCurPage(0);
}
- WRITE_LE_UINT16(&tmp[m + 13], READ_LE_UINT16(&tmp[m + 13]) - step);
+ textData[cnt2 + 1].y -= step;
cnt2++;
}
_screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0);
_screen->updateScreen();
- if ((int16)READ_LE_UINT16(&tmp[13]) < -10) {
- tmpStringTable[tmp[15]] += strlen((char*)tmpStringTable[tmp[15]]);
- tmpStringTable[tmp[15]][0] = tmp[19];
+ if (textData[1].y < -10) {
+ textData[1].text += strlen((char*)textData[1].text);
+ textData[1].text[0] = textData[1].unk1;
cnt--;
- memcpy(&tmp[11], &tmp[22], cnt * 11);
+ memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData));
}
if (palCycle) {
@@ -2524,9 +2552,9 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
_screen->setScreenPalette(_screen->_currentPalette);
}
- delayUntil(endTime);
+ delayUntil(_seqSubFrameEndTimeInternal);
- if ((cnt < 36) && ((d->sy + d->h) > (READ_LE_UINT16(&tmp[cnt * 11 + 2]) + tmp[cnt * 11 + 9])) && !skipFlag()) {
+ if ((cnt < 36) && ((d->sy + d->h) > (textData[cnt].y + textData[cnt].height)) && !skipFlag()) {
resetSkipFlag();
delay(_tickLength * 500);
cnt = 0;
@@ -2542,8 +2570,7 @@ void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int
_abortIntroFlag= false;
resetSkipFlag();
- delete[] tmp;
- delete[] tmpStringTable;
+ delete[] textData;
}
void KyraEngine_HoF::seq_scrollPage() {
@@ -2594,20 +2621,20 @@ void KyraEngine_HoF::seq_showStarcraftLogo() {
_screen->copyPage(2, 0);
_screen->fadeFromBlack();
for (int i = 1; i < endframe; i++) {
- uint32 endTime = _system->getMillis() + 50;
+ _seqEndTime = _system->getMillis() + 50;
if (skipFlag())
break;
ci->displayFrame(i, 0);
_screen->copyPage(2, 0);
_screen->updateScreen();
- delay(endTime - _system->getMillis());
+ delay(_seqEndTime - _system->getMillis());
}
if(!skipFlag()) {
- uint32 endTime = _system->getMillis() + 50;
+ _seqEndTime = _system->getMillis() + 50;
ci->displayFrame(0, 0);
_screen->copyPage(2, 0);
_screen->updateScreen();
- delay(endTime - _system->getMillis());
+ delay(_seqEndTime - _system->getMillis());
}
_screen->fadeToBlack();
_screen->showMouse();
@@ -2624,6 +2651,8 @@ void KyraEngine_HoF::seq_init() {
_res->unloadAllPakFiles();
_res->loadPakFile(StaticResource::staticDataFilename());
+ if (_flags.useInstallerPackage)
+ _res->loadPakFile("WESTWOOD.001");
_res->loadFileList(_sequencePakList, _sequencePakListSize);
int numShp = -1;
@@ -2783,3 +2812,4 @@ void KyraEngine_HoF::seq_makeBookAppear() {
} // end of namespace Kyra
+
diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp
index a8566a7309..8f9077705e 100644
--- a/engines/kyra/sound.cpp
+++ b/engines/kyra/sound.cpp
@@ -66,17 +66,14 @@ bool Sound::voiceFileIsPresent(const char *file) {
return false;
}
-bool Sound::voicePlay(const char *file, bool isSfx) {
- uint32 fileSize = 0;
- byte *fileData = 0;
- bool found = false;
+int32 Sound::voicePlay(const char *file, bool isSfx) {
char filenamebuffer[25];
int h = 0;
while (_mixer->isSoundHandleActive(_soundChannels[h].channelHandle) && h < kNumChannelHandles)
h++;
if (h >= kNumChannelHandles)
- return false;
+ return 0;
Audio::AudioStream *audioStream = 0;
@@ -88,29 +85,29 @@ bool Sound::voicePlay(const char *file, bool isSfx) {
if (!stream)
continue;
audioStream = _supportedCodes[i].streamFunc(stream, true, 0, 0, 1);
- found = true;
break;
}
- if (!found) {
+ if (!audioStream) {
strcpy(filenamebuffer, file);
strcat(filenamebuffer, ".VOC");
- fileData = _vm->resource()->fileData(filenamebuffer, &fileSize);
+ uint32 fileSize = 0;
+ byte *fileData = _vm->resource()->fileData(filenamebuffer, &fileSize);
if (!fileData)
- return false;
+ return 0;
Common::MemoryReadStream vocStream(fileData, fileSize);
audioStream = Audio::makeVOCStream(vocStream);
+
+ delete[] fileData;
+ fileSize = 0;
}
_soundChannels[h].file = file;
_mixer->playInputStream(isSfx ? Audio::Mixer::kSFXSoundType : Audio::Mixer::kSpeechSoundType, &_soundChannels[h].channelHandle, audioStream);
- delete[] fileData;
- fileSize = 0;
-
- return true;
+ return audioStream->getTotalPlayTime();
}
void Sound::voiceStop(const char *file) {
@@ -143,6 +140,18 @@ bool Sound::voiceIsPlaying(const char *file) {
return res;
}
+uint32 Sound::voicePlayedTime(const char *file) {
+ if (!file)
+ return 0;
+
+ for (int i = 0; i < kNumChannelHandles; ++i) {
+ if (_soundChannels[i].file == file)
+ return _mixer->getSoundElapsedTime(_soundChannels[i].channelHandle);
+ }
+
+ return 0;
+}
+
#pragma mark -
SoundMidiPC::SoundMidiPC(KyraEngine_v1 *vm, Audio::Mixer *mixer, MidiDriver *driver) : Sound(vm, mixer) {
@@ -529,12 +538,15 @@ void KyraEngine_v1::snd_playWanderScoreViaMap(int command, int restart) {
void KyraEngine_v1::snd_stopVoice() {
debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v1::snd_stopVoice()");
- _sound->voiceStop(_speechFile.empty() ? 0 : _speechFile.c_str());
+ if (!_speechFile.empty()) {
+ _sound->voiceStop(_speechFile.c_str());
+ _speechFile.clear();
+ }
}
bool KyraEngine_v1::snd_voiceIsPlaying() {
debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v1::snd_voiceIsPlaying()");
- return _sound->voiceIsPlaying(_speechFile.empty() ? 0 : _speechFile.c_str());
+ return _speechFile.empty() ? false : _sound->voiceIsPlaying(_speechFile.c_str());
}
// static res
diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h
index 595619c7e9..2427a6cdde 100644
--- a/engines/kyra/sound.h
+++ b/engines/kyra/sound.h
@@ -174,9 +174,9 @@ public:
*
* @param file file to be played
* @param isSfx marks file as sfx instead of voice
- * @return channel the voice file is played on
+ * @return playtime of the voice file (-1 marks unknown playtime)
*/
- virtual bool voicePlay(const char *file, bool isSfx = false);
+ virtual int32 voicePlay(const char *file, bool isSfx = false);
/**
* Checks if a voice is being played.
@@ -186,6 +186,13 @@ public:
bool voiceIsPlaying(const char *file = 0);
/**
+ * Checks how long a voice has been playing
+ *
+ * @return time in milliseconds
+ */
+ uint32 voicePlayedTime(const char *file);
+
+ /**
* Stops playback of the current voice.
*/
void voiceStop(const char *file = 0);
@@ -449,7 +456,7 @@ public:
void haltTrack();
void beginFadeOut();
- bool voicePlay(const char *file, bool isSfx = false);
+ int32 voicePlay(const char *file, bool isSfx = false);
void playSoundEffect(uint8) {}
private:
diff --git a/engines/kyra/sound_lok.cpp b/engines/kyra/sound_lok.cpp
index 728013cdaa..8a1d16a6b1 100644
--- a/engines/kyra/sound_lok.cpp
+++ b/engines/kyra/sound_lok.cpp
@@ -67,7 +67,7 @@ void KyraEngine_LoK::snd_playVoiceFile(int id) {
assert(id >= 0 && id < 9999);
sprintf(vocFile, "%03d", id);
_speechFile = vocFile;
- _sound->voicePlay(vocFile);
+ _speechPlayTime = _sound->voicePlay(vocFile);
}
void KyraEngine_LoK::snd_voiceWaitForFinish(bool ingame) {
@@ -80,4 +80,11 @@ void KyraEngine_LoK::snd_voiceWaitForFinish(bool ingame) {
}
}
+uint32 KyraEngine_LoK::snd_getVoicePlayTime() {
+ debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_LoK::snd_getVoicePlayTime()");
+ if (!snd_voiceIsPlaying())
+ return 0;
+ return (_speechPlayTime != -1 ? _speechPlayTime : 0);
+}
+
} // end of namespace Kyra
diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp
index 513f523194..4265533507 100644
--- a/engines/kyra/sound_towns.cpp
+++ b/engines/kyra/sound_towns.cpp
@@ -1301,6 +1301,7 @@ bool SoundTowns::loadInstruments() {
void SoundTowns::playEuphonyTrack(uint32 offset, int loop) {
uint8 * twm = _vm->resource()->fileData("twmusic.pak", 0);
+ Common::StackLock lock(_mutex);
if (!_parser) {
_parser = new MidiParser_EuD(_driver->queue());
@@ -1431,7 +1432,7 @@ void SoundTowns_v2::haltTrack() {
//_driver->reset();
}
-bool SoundTowns_v2::voicePlay(const char *file, bool) {
+int32 SoundTowns_v2::voicePlay(const char *file, bool) {
static const uint16 rates[] = { 0x10E1, 0x0CA9, 0x0870, 0x0654, 0x0438, 0x032A, 0x021C, 0x0194 };
int h = 0;
@@ -1439,7 +1440,7 @@ bool SoundTowns_v2::voicePlay(const char *file, bool) {
while (_mixer->isSoundHandleActive(_soundChannels[h].channelHandle) && h < kNumChannelHandles)
h++;
if (h >= kNumChannelHandles)
- return false;
+ return 0;
}
char filename [13];
@@ -1496,7 +1497,7 @@ bool SoundTowns_v2::voicePlay(const char *file, bool) {
_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_soundChannels[h].channelHandle, _currentSFX);
delete[] data;
- return true;
+ return 1;
}
void SoundTowns_v2::beginFadeOut() {
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index 7ba19e9966..302b92ab07 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -40,11 +40,9 @@
#include "kyra/gui_hof.h"
#include "kyra/gui_mr.h"
-#include "gui/message.h"
-
namespace Kyra {
-#define RESFILE_VERSION 27
+#define RESFILE_VERSION 28
bool StaticResource::checkKyraDat() {
Common::File kyraDat;
@@ -293,18 +291,20 @@ bool StaticResource::init() {
error("unknown game ID");
}
+ char errorBuffer[100];
int tempSize = 0;
uint8 *temp = getFile("INDEX", tempSize);
if (!temp) {
- warning("No matching INDEX file found ('%s')", getFilename("INDEX"));
- outputError();
+ snprintf(errorBuffer, sizeof(errorBuffer), "is missing an '%s' entry", getFilename("INDEX"));
+ outputError(errorBuffer);
return false;
}
if (tempSize != 3*4) {
delete[] temp;
- warning("'%s' has illegal filesize %d", getFilename("INDEX"), tempSize);
- outputError();
+
+ snprintf(errorBuffer, sizeof(errorBuffer), "has incorrect header size for entry '%s'", getFilename("INDEX"));
+ outputError(errorBuffer);
return false;
}
@@ -316,28 +316,25 @@ bool StaticResource::init() {
temp = 0;
if (version != RESFILE_VERSION) {
- warning("Invalid KYRA.DAT file version (%u, required %d)", version, RESFILE_VERSION);
- outputError();
+ snprintf(errorBuffer, sizeof(errorBuffer), "has invalid version %d required, you got %d", RESFILE_VERSION, version);
+ outputError(errorBuffer);
return false;
}
if (gameID != _vm->game()) {
- warning("Invalid game id (%u)", gameID);
- outputError();
+ outputError("does not include support for your game");
return false;
}
uint32 gameFeatures = createFeatures(_vm->gameFlags());
if ((featuresValue & GAME_FLAGS) != gameFeatures) {
- warning("Your data file has a different game flags (0x%.08X has the data and your version has 0x%.08X)", (featuresValue & GAME_FLAGS), gameFeatures);
- outputError();
+ outputError("does not include support for your game version");
return false;
}
// load all tables for now
if (!prefetchId(-1)) {
- warning("Couldn't load all needed resources from 'KYRA.DAT'");
- outputError();
+ outputError("is lacking entries for your game version");
return false;
}
return true;
@@ -347,11 +344,10 @@ void StaticResource::deinit() {
unloadId(-1);
}
-void StaticResource::outputError() {
- Common::String errorMessage = "Your '" + StaticResource::staticDataFilename() + "' file is outdated, reget it from the ScummVM website";
- ::GUI::MessageDialog errorMsg(errorMessage);
- errorMsg.runModal();
- error(errorMessage.c_str());
+void StaticResource::outputError(const Common::String &error) {
+ Common::String errorMessage = "Your '" + StaticResource::staticDataFilename() + "' file " + error + ", reget a correct version from the ScummVM website";
+ _vm->GUIErrorMessage(errorMessage);
+ ::error(errorMessage.c_str());
}
const char * const*StaticResource::loadStrings(int id, int &strings) {
@@ -1281,7 +1277,7 @@ void KyraEngine_HoF::initStaticResource() {
&KyraEngine_HoF::seq_introLibrary2, &KyraEngine_HoF::seq_introLibrary2,
&KyraEngine_HoF::seq_introMarco, &KyraEngine_HoF::seq_introHand1a,
&KyraEngine_HoF::seq_introHand1b, &KyraEngine_HoF::seq_introHand1c,
- &KyraEngine_HoF::seq_introHand2, &KyraEngine_HoF::seq_introHand3, 0
+ &KyraEngine_HoF::seq_introHand2, &KyraEngine_HoF::seq_introHand3, 0
};
static const SeqProc hofDemoSequenceCallbacks[] = {
@@ -1363,11 +1359,11 @@ const int8 KyraEngine_v1::_addYPosTable[] = {
0, -2, -2, -2, 0, 2, 2, 2
};
-const int8 KyraEngine_LoK::_charXPosTable[] = {
+const int8 KyraEngine_v1::_charAddXPosTable[] = {
0, 4, 4, 4, 0, -4, -4, -4
};
-const int8 KyraEngine_LoK::_charYPosTable[] = {
+const int8 KyraEngine_v1::_charAddYPosTable[] = {
-2, -2, 0, 2, 2, 2, 0, -2
};
@@ -1534,14 +1530,6 @@ const int KyraEngine_LoK::_dosTrackMapSize = ARRAYSIZE(KyraEngine_LoK::_dosTrack
// kyra engine v2 static data
-const int8 KyraEngine_v2::_updateCharPosXTable[] = {
- 0, 4, 4, 4, 0, -4, -4, -4
-};
-
-const int8 KyraEngine_v2::_updateCharPosYTable[] = {
- -2, -2, 0, 2, 2, 2, 0, -2
-};
-
const int GUI_v2::_sliderBarsPosition[] = {
0x92, 0x1F, 0x92, 0x30, 0x92, 0x41, 0x92, 0x52
};
@@ -1554,16 +1542,16 @@ const char *KyraEngine_HoF::_languageExtension[] = {
"ENG",
"FRE",
"GER",/*,
- "ITA", Italian and Spanish was never included
+ "ITA", Italian and Spanish were never included
"SPA"*/
- "JPN"
+ "JPN",
};
const char *KyraEngine_HoF::_scriptLangExt[] = {
"EMC",
"FMC",
"GMC",/*,
- "IMC", Italian and Spanish was never included
+ "IMC", Italian and Spanish were never included
"SMC"*/
"JMC"
};
@@ -1956,7 +1944,7 @@ const char *KyraEngine_MR::_languageExtension[] = {
"TRE",
"TRF",
"TRG"/*,
- "TRI", Italian and Spanish was never included
+ "TRI", Italian and Spanish were never included
"TRS"*/
};
diff --git a/engines/kyra/text.cpp b/engines/kyra/text.cpp
index 931c5fe1c9..f8eb10a85e 100644
--- a/engines/kyra/text.cpp
+++ b/engines/kyra/text.cpp
@@ -210,7 +210,7 @@ void TextDisplayer::printTalkTextMessage(const char *text, int x, int y, uint8 c
calcWidestLineBounds(x1, x2, w, x);
_talkCoords.x = x1;
_talkCoords.w = w + 2;
- _screen->copyRegion(_talkCoords.x, _talkMessageY, _talkCoords.x, _talkCoords.y, _talkCoords.w, _talkMessageH, srcPage, dstPage);
+ _screen->copyRegion(_talkCoords.x, _talkMessageY, _talkCoords.x, _talkCoords.y, _talkCoords.w, _talkMessageH, srcPage, dstPage, Screen::CR_NO_P_CHECK);
int curPage = _screen->_curPage;
_screen->_curPage = srcPage;
for (int i = 0; i < lineCount; ++i) {
diff --git a/engines/kyra/text_hof.cpp b/engines/kyra/text_hof.cpp
index 0d40827390..dd587c5112 100644
--- a/engines/kyra/text_hof.cpp
+++ b/engines/kyra/text_hof.cpp
@@ -107,8 +107,7 @@ char *TextDisplayer_HoF::preprocessString(const char *str) {
int textWidth = _screen->getTextWidth(p);
_screen->_charWidth = 0;
- // longer text strings for German versions
- int maxTextWidth = (_vm->language() == 2 ? 240 : 176);
+ int maxTextWidth = (_vm->language() == 0) ? 176 : 240;
if (textWidth > maxTextWidth) {
if (textWidth > (maxTextWidth*2)) {
diff --git a/engines/kyra/text_lok.cpp b/engines/kyra/text_lok.cpp
index ccca079e32..f6b0407a75 100644
--- a/engines/kyra/text_lok.cpp
+++ b/engines/kyra/text_lok.cpp
@@ -62,10 +62,8 @@ void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const
if (chatDuration != -1)
chatDuration *= _tickLength;
- if (vocFile != -1) {
- snd_voiceWaitForFinish();
+ if (vocFile != -1)
snd_playVoiceFile(vocFile);
- }
_timer->disable(14);
_timer->disable(18);
@@ -269,6 +267,8 @@ void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int8 charNu
if (_currentCharacter->sceneId == 210)
return;
+ snd_voiceWaitForFinish(true);
+
convoInitialized = initCharacterChat(charNum);
chatPartnerNum = getChatPartnerNum();
diff --git a/engines/kyra/text_mr.cpp b/engines/kyra/text_mr.cpp
index 13b37fa77a..16c56da099 100644
--- a/engines/kyra/text_mr.cpp
+++ b/engines/kyra/text_mr.cpp
@@ -55,25 +55,26 @@ char *TextDisplayer_MR::preprocessString(const char *str) {
int count = 0, offs = 0;
if (textWidth > (3*maxTextWidth)) {
count = getCharLength(p, textWidth/4);
- offs = dropCRIntoString(p, getCharLength(p, maxTextWidth), count);
+ offs = dropCRIntoString(p, count, getCharLength(p, maxTextWidth));
p += count + offs;
- }
-
+ // No update of textWidth here
+ }
+
if (textWidth > (2*maxTextWidth)) {
count = getCharLength(p, textWidth/3);
- offs = dropCRIntoString(p, getCharLength(p, maxTextWidth), count);
+ offs = dropCRIntoString(p, count, getCharLength(p, maxTextWidth));
p += count + offs;
textWidth = _screen->getTextWidth(p);
}
count = getCharLength(p, textWidth/2);
- offs = dropCRIntoString(p, getCharLength(p, maxTextWidth), count);
+ offs = dropCRIntoString(p, count, getCharLength(p, maxTextWidth));
p += count + offs;
textWidth = _screen->getTextWidth(p);
if (textWidth > maxTextWidth) {
count = getCharLength(p, textWidth/2);
- offs = dropCRIntoString(p, getCharLength(p, maxTextWidth), count);
+ offs = dropCRIntoString(p, count, getCharLength(p, maxTextWidth));
}
}
@@ -232,7 +233,7 @@ void KyraEngine_MR::objectChat(const char *str, int object, int vocHigh, int voc
"MTFR00S.EMC", "MTFR00Q.EMC", "MTFR00E.EMC", "MTFR00T.EMC",
"MTL00S.EMC", "MTL00Q.EMC", "MTL00E.EMC", "MTL00T.EMC",
"MTR00S.EMC", "MTR00Q.EMC", "MTR00E.EMC", "MTR00T.EMC",
- "MTA00S.EMC", "MTA00Q.EMC", "MTA00Q.EMC", "MTA00T.EMC"
+ "MTA00S.EMC", "MTA00Q.EMC", "MTA00E.EMC", "MTA00T.EMC"
};
int chat = talkScriptTable[chatType + _mainCharacter.facing * 4];
diff --git a/engines/kyra/vqa.cpp b/engines/kyra/vqa.cpp
index cea52e911e..3d18f27c7e 100644
--- a/engines/kyra/vqa.cpp
+++ b/engines/kyra/vqa.cpp
@@ -362,9 +362,8 @@ void VQAMovie::close() {
delete[] _partialCodeBook;
delete[] _vectorPointers;
- if (_vm->_mixer->isSoundHandleActive(_sound)) {
+ if (_vm->_mixer->isSoundHandleActive(_sound))
_vm->_mixer->stopHandle(_sound);
- }
_frameInfo = NULL;
_frame = NULL;
@@ -655,11 +654,10 @@ void VQAMovie::play() {
while (1) {
uint32 elapsedTime;
- if (_vm->_mixer->isSoundHandleActive(_sound)) {
+ if (_vm->_mixer->isSoundHandleActive(_sound))
elapsedTime = _vm->_mixer->getSoundElapsedTime(_sound);
- } else {
+ else
elapsedTime = _system->getMillis() - startTick;
- }
if (elapsedTime >= (i * 1000) / _header.frameRate)
break;
diff --git a/engines/lure/game.cpp b/engines/lure/game.cpp
index c87f81618a..f9b31c21c5 100644
--- a/engines/lure/game.cpp
+++ b/engines/lure/game.cpp
@@ -167,6 +167,7 @@ void Game::execute() {
if (system.getMillis() > timerVal + GAME_FRAME_DELAY) {
timerVal = system.getMillis();
nextFrame();
+ res.delayList().tick();
Sound.musicInterface_ContinuePlaying();
}
@@ -177,8 +178,6 @@ void Game::execute() {
tickCheck();
}
- res.delayList().tick();
-
while (events.pollEvent()) {
if (events.type() == Common::EVENT_KEYDOWN) {
uint16 roomNum = room.roomNumber();
diff --git a/engines/lure/lure.cpp b/engines/lure/lure.cpp
index de213b4f5a..06d3b1984e 100644
--- a/engines/lure/lure.cpp
+++ b/engines/lure/lure.cpp
@@ -154,6 +154,16 @@ int LureEngine::go() {
return 0;
}
+void LureEngine::pauseEngineIntern(bool pause) {
+ Engine::pauseEngineIntern(pause);
+
+ if (pause) {
+ Sound.pause();
+ } else {
+ Sound.resume();
+ }
+}
+
void LureEngine::quitGame() {
_system->quit();
}
diff --git a/engines/lure/lure.h b/engines/lure/lure.h
index fa70abc1f0..d66f446247 100644
--- a/engines/lure/lure.h
+++ b/engines/lure/lure.h
@@ -69,6 +69,7 @@ public:
virtual int init();
virtual int go();
+ virtual void pauseEngineIntern(bool pause);
void quitGame();
Disk &disk() { return *_disk; }
diff --git a/engines/lure/res_struct.cpp b/engines/lure/res_struct.cpp
index 913505c8c9..de09f982d1 100644
--- a/engines/lure/res_struct.cpp
+++ b/engines/lure/res_struct.cpp
@@ -760,10 +760,8 @@ RoomExitCoordinateData &RoomExitCoordinates::getData(uint16 destRoomNumber) {
// The following classes hold any sequence offsets that are being delayed
SequenceDelayData::SequenceDelayData(uint16 delay, uint16 seqOffset, bool canClearFlag) {
- OSystem &system = *g_system;
-
- // The delay is in number of seconds
- timeoutCtr = system.getMillis() + delay * 1000;
+ // The delay is in number of seconds - convert it to remaining milliseconds
+ timeoutCtr = delay * 1000;
sequenceOffset = seqOffset;
canClear = canClearFlag;
}
@@ -784,21 +782,23 @@ void SequenceDelayList::add(uint16 delay, uint16 seqOffset, bool canClear) {
}
void SequenceDelayList::tick() {
- uint32 currTime = g_system->getMillis();
SequenceDelayList::iterator i;
- debugC(ERROR_DETAILED, kLureDebugScripts, "Delay List check start at time %d", currTime);
+ debugC(ERROR_DETAILED, kLureDebugScripts, "Delay List check start at time %d",
+ g_system->getMillis());
for (i = begin(); i != end(); i++) {
SequenceDelayData *entry = (*i).get();
debugC(ERROR_DETAILED, kLureDebugScripts, "Delay List check %xh at time %d", entry->sequenceOffset, entry->timeoutCtr);
- if (currTime >= entry->timeoutCtr) {
+ if (entry->timeoutCtr <= GAME_FRAME_DELAY) {
// Timeout reached - delete entry from list and execute the sequence
uint16 seqOffset = entry->sequenceOffset;
erase(i);
Script::execute(seqOffset);
return;
+ } else {
+ entry->timeoutCtr -= GAME_FRAME_DELAY;
}
}
}
@@ -816,14 +816,12 @@ void SequenceDelayList::clear(bool forceClear) {
}
void SequenceDelayList::saveToStream(WriteStream *stream) {
- uint32 currTime = g_system->getMillis();
SequenceDelayList::iterator i;
for (i = begin(); i != end(); ++i) {
SequenceDelayData *entry = (*i).get();
stream->writeUint16LE(entry->sequenceOffset);
- stream->writeUint32LE((currTime > entry->timeoutCtr ) ? 0 :
- entry->timeoutCtr - currTime);
+ stream->writeUint32LE(entry->timeoutCtr);
stream->writeByte(entry->canClear);
}
@@ -833,10 +831,9 @@ void SequenceDelayList::saveToStream(WriteStream *stream) {
void SequenceDelayList::loadFromStream(ReadStream *stream) {
clear(true);
uint16 seqOffset;
- uint32 currTime = g_system->getMillis();
while ((seqOffset = stream->readUint16LE()) != 0) {
- uint32 delay = currTime + stream->readUint32LE();
+ uint32 delay = stream->readUint32LE();
bool canClear = stream->readByte() != 0;
push_back(SequenceDelayList::value_type(SequenceDelayData::load(delay, seqOffset, canClear)));
}
diff --git a/engines/m4/script.h b/engines/m4/script.h
index a59bf46e86..2a937040e9 100644
--- a/engines/m4/script.h
+++ b/engines/m4/script.h
@@ -300,7 +300,8 @@ public:
const T& toData(const ScriptValue &value) {
printf("ScriptInterpreter::toData() index = %d; type = %d; max = %d\n", value.value, _data[value.value]->type, _data.size());
assert((uint32)value.value < _data.size());
- return *(_dataCache->load<T>(_scriptFile, _data[value.value]->offset));
+ T *result = _dataCache->load<T>(_scriptFile, _data[value.value]->offset);
+ return *result;
}
const char *getGlobalString(int index) const {
diff --git a/engines/made/database.h b/engines/made/database.h
index 50e37d6936..0924200374 100644
--- a/engines/made/database.h
+++ b/engines/made/database.h
@@ -95,6 +95,8 @@ public:
return NULL;
}
+ uint getObjectCount() const { return _objects.size(); }
+
int16 getMainCodeObjectIndex() const { return _mainCodeObjectIndex; }
int16 getVar(int16 index);
diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp
index 7f12a85611..7d30873866 100644
--- a/engines/made/detection.cpp
+++ b/engines/made/detection.cpp
@@ -74,6 +74,10 @@ namespace Made {
static const MadeGameDescription gameDescriptions[] = {
{
+ // NOTE: Return to Zork entries with *.dat are used to detect the game via rtzcd.dat,
+ // which is packed inside rtzcd.red. Entries with *.red refer to the packed file
+ // directly, which is the "official" way.
+
// Return to Zork - English CD version 1.0 9/15/93
// Patch #1953654 submitted by spookypeanut
{
@@ -109,8 +113,6 @@ static const MadeGameDescription gameDescriptions[] = {
{
// Return to Zork - English CD version 1.1 12/7/93
- // NOTE: This detects the game via the rtzcd.dat which is inside rtzcd.red.
- // The entry below detects via rtzcd.red directly, which is the "official" way.
{
"rtz",
"CD",
@@ -143,6 +145,23 @@ static const MadeGameDescription gameDescriptions[] = {
{
// Return to Zork - English CD version 1.2 9/29/94
+ // Supplied by Dark-Star in the ScummVM forums
+ {
+ "rtz",
+ "CD",
+ AD_ENTRY1("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a"),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GID_RTZ,
+ 0,
+ GF_CD,
+ 0,
+ },
+
+ {
+ // Return to Zork - English CD version 1.2 9/29/94
{
"rtz",
"CD",
@@ -157,6 +176,41 @@ static const MadeGameDescription gameDescriptions[] = {
0,
},
+ {
+ // Return to Zork - German CD version 1.2 9/29/94
+ // (same as the English 1.2 version)
+ // Supplied by Dark-Star in the ScummVM forums
+ {
+ "rtz",
+ "CD",
+ AD_ENTRY1("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a"),
+ Common::DE_DEU,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GID_RTZ,
+ 0,
+ GF_CD,
+ 0,
+ },
+
+ {
+ // Return to Zork - German CD version 1.2 4/18/95
+ // (same as the English 1.2 version)
+ // Supplied by Dark-Star in the ScummVM forums
+ {
+ "rtz",
+ "CD",
+ AD_ENTRY1("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2"),
+ Common::DE_DEU,
+ Common::kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GID_RTZ,
+ 0,
+ GF_CD_COMPRESSED,
+ 0,
+ },
{
// Return to Zork - English floppy version
@@ -302,7 +356,8 @@ const Common::ADGameDescription *MadeMetaEngine::fallbackDetect(const FSList *fs
Made::g_fallbackDesc.features = 0;
Made::g_fallbackDesc.version = 0;
- return (const Common::ADGameDescription *)&Made::g_fallbackDesc;
+ //return (const Common::ADGameDescription *)&Made::g_fallbackDesc;
+ return NULL;
}
#if PLUGIN_ENABLED_DYNAMIC(MADE)
diff --git a/engines/made/graphics.cpp b/engines/made/graphics.cpp
index 081621ef18..ee702893a0 100644
--- a/engines/made/graphics.cpp
+++ b/engines/made/graphics.cpp
@@ -29,7 +29,24 @@
namespace Made {
-void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize, bool deltaFrame) {
+byte ValueReader::readPixel() {
+ byte value;
+ if (_nibbleMode) {
+ if (_nibbleSwitch) {
+ value = (_buffer[0] >> 4) & 0x0F;
+ _buffer++;
+ } else {
+ value = _buffer[0] & 0x0F;
+ }
+ _nibbleSwitch = !_nibbleSwitch;
+ } else {
+ value = _buffer[0];
+ _buffer++;
+ }
+ return value;
+}
+
+void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize, byte cmdFlags, byte pixelFlags, byte maskFlags, bool deltaFrame) {
const int offsets[] = {
0, 1, 2, 3,
@@ -43,11 +60,10 @@ void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, u
byte *cmdBuffer = source + cmdOffs;
byte *maskBuffer = source + maskOffs;
- byte *pixelBuffer = source + pixelOffs;
+ ValueReader pixelReader(source + pixelOffs, (pixelFlags & 2) != 0);
byte *destPtr = (byte*)surface.getBasePtr(0, 0);
- //byte lineBuf[320 * 4];
byte lineBuf[640 * 4];
byte bitBuf[40];
@@ -85,14 +101,14 @@ void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, u
switch (cmd) {
case 0:
- pixels[0] = *pixelBuffer++;
+ pixels[0] = pixelReader.readPixel();
for (int i = 0; i < 16; i++)
lineBuf[drawDestOfs + offsets[i]] = pixels[0];
break;
case 1:
- pixels[0] = *pixelBuffer++;
- pixels[1] = *pixelBuffer++;
+ pixels[0] = pixelReader.readPixel();
+ pixels[1] = pixelReader.readPixel();
mask = READ_LE_UINT16(maskBuffer);
maskBuffer += 2;
for (int i = 0; i < 16; i++) {
@@ -102,10 +118,10 @@ void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, u
break;
case 2:
- pixels[0] = *pixelBuffer++;
- pixels[1] = *pixelBuffer++;
- pixels[2] = *pixelBuffer++;
- pixels[3] = *pixelBuffer++;
+ pixels[0] = pixelReader.readPixel();
+ pixels[1] = pixelReader.readPixel();
+ pixels[2] = pixelReader.readPixel();
+ pixels[3] = pixelReader.readPixel();
mask = READ_LE_UINT32(maskBuffer);
maskBuffer += 4;
for (int i = 0; i < 16; i++) {
@@ -149,4 +165,112 @@ void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, u
}
+void decompressMovieImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize) {
+
+ uint16 width = surface.w;
+ uint16 height = surface.h;
+ uint16 bx = 0, by = 0, bw = ((width + 3) / 4) * 4;
+
+ byte *cmdBuffer = source + cmdOffs;
+ byte *maskBuffer = source + maskOffs;
+ byte *pixelBuffer = source + pixelOffs;
+
+ byte *destPtr = (byte*)surface.getBasePtr(0, 0);
+
+ byte bitBuf[40];
+
+ int bitBufLastOfs = (((lineSize + 1) >> 1) << 1) - 2;
+ int bitBufLastCount = ((width + 3) >> 2) & 7;
+ if (bitBufLastCount == 0)
+ bitBufLastCount = 8;
+
+ debug(1, "width = %d; bw = %d", width, bw);
+
+ while (height > 0) {
+
+ memcpy(bitBuf, cmdBuffer, lineSize);
+ cmdBuffer += lineSize;
+
+ for (uint16 bitBufOfs = 0; bitBufOfs < lineSize; bitBufOfs += 2) {
+
+ uint16 bits = READ_LE_UINT16(&bitBuf[bitBufOfs]);
+
+ int bitCount;
+ if (bitBufOfs == bitBufLastOfs)
+ bitCount = bitBufLastCount;
+ else
+ bitCount = 8;
+
+ for (int curCmd = 0; curCmd < bitCount; curCmd++) {
+ uint cmd = bits & 3;
+ bits >>= 2;
+
+ byte pixels[4], block[16];
+ uint32 mask;
+
+ switch (cmd) {
+
+ case 0:
+ pixels[0] = *pixelBuffer++;
+ for (int i = 0; i < 16; i++)
+ block[i] = pixels[0];
+ break;
+
+ case 1:
+ pixels[0] = *pixelBuffer++;
+ pixels[1] = *pixelBuffer++;
+ mask = READ_LE_UINT16(maskBuffer);
+ maskBuffer += 2;
+ for (int i = 0; i < 16; i++) {
+ block[i] = pixels[mask & 1];
+ mask >>= 1;
+ }
+ break;
+
+ case 2:
+ pixels[0] = *pixelBuffer++;
+ pixels[1] = *pixelBuffer++;
+ pixels[2] = *pixelBuffer++;
+ pixels[3] = *pixelBuffer++;
+ mask = READ_LE_UINT32(maskBuffer);
+ maskBuffer += 4;
+ for (int i = 0; i < 16; i++) {
+ block[i] = pixels[mask & 3];
+ mask >>= 2;
+ }
+ break;
+
+ case 3:
+ break;
+
+ }
+
+ if (cmd != 3) {
+ uint16 blockPos = 0;
+ uint32 maxW = MIN(4, surface.w - bx);
+ uint32 maxH = (MIN(4, surface.h - by) + by) * width;
+ for (uint32 yc = by * width; yc < maxH; yc += width) {
+ for (uint32 xc = 0; xc < maxW; xc++) {
+ destPtr[(bx + xc) + yc] = block[xc + blockPos];
+ }
+ blockPos += 4;
+ }
+ }
+
+ bx += 4;
+ if (bx >= bw) {
+ bx = 0;
+ by += 4;
+ }
+
+ }
+
+ }
+
+ height -= 4;
+
+ }
+
+}
+
} // End of namespace Made
diff --git a/engines/made/graphics.h b/engines/made/graphics.h
index 3c56bb4231..1a5cf72677 100644
--- a/engines/made/graphics.h
+++ b/engines/made/graphics.h
@@ -33,7 +33,18 @@
namespace Made {
-void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize, bool deltaFrame = false);
+class ValueReader {
+public:
+ ValueReader(byte *source, bool nibbleMode) : _buffer(source), _nibbleBuf(0), _nibbleMode(nibbleMode), _nibbleSwitch(false) {}
+ byte readPixel();
+protected:
+ byte _nibbleBuf;
+ bool _nibbleMode, _nibbleSwitch;
+ byte *_buffer;
+};
+
+void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize, byte cmdFlags, byte pixelFlags, byte maskFlags, bool deltaFrame = false);
+void decompressMovieImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize);
} // End of namespace Made
diff --git a/engines/made/made.cpp b/engines/made/made.cpp
index 4ec857547b..92efb881e2 100644
--- a/engines/made/made.cpp
+++ b/engines/made/made.cpp
@@ -109,7 +109,13 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng
_quit = false;
- _soundRate = 8000;
+ // Set default sound frequency
+ // Return to Zork sets it itself via a script funtion
+ if (getGameID() == GID_MANHOLE) {
+ _soundRate = 11025;
+ } else {
+ _soundRate = 8000;
+ }
}
@@ -171,6 +177,62 @@ Common::String MadeEngine::getSavegameFilename(int16 saveNum) {
return filename;
}
+void MadeEngine::handleEvents() {
+
+ Common::Event event;
+ Common::EventManager *eventMan = _system->getEventManager();
+
+ // NOTE: Don't reset _eventNum to 0 here or no events will get through to the scripts.
+
+ while (eventMan->pollEvent(event)) {
+ switch (event.type) {
+
+ case Common::EVENT_MOUSEMOVE:
+ _eventMouseX = event.mouse.x;
+ _eventMouseY = event.mouse.y;
+ break;
+
+ case Common::EVENT_LBUTTONDOWN:
+ _eventNum = 1;
+ break;
+
+ /*
+ case Common::EVENT_LBUTTONUP:
+ _eventNum = 2; // TODO: Is this correct?
+ break;
+ */
+
+ case Common::EVENT_RBUTTONDOWN:
+ _eventNum = 3;
+ break;
+
+ /*
+ case Common::EVENT_RBUTTONUP:
+ eventNum = 4; // TODO: Is this correct?
+ break;
+ */
+
+ case Common::EVENT_KEYDOWN:
+ _eventKey = event.kbd.ascii;
+ // For unknown reasons, the game accepts ASCII code
+ // 9 as backspace
+ if (_eventKey == Common::KEYCODE_BACKSPACE)
+ _eventKey = 9;
+ _eventNum = 5;
+ break;
+
+ case Common::EVENT_QUIT:
+ _quit = true;
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+}
+
int MadeEngine::go() {
for (int i = 0; i < ARRAYSIZE(_timers); i++)
@@ -205,8 +267,19 @@ int MadeEngine::go() {
error ("Unknown MADE game");
}
- _eventKey = _eventMouseX = _eventMouseY = 0;
+ // FIXME: This should make things a little faster until proper dirty rectangles
+ // are implemented.
+ // NOTE: Disabled again since it causes major graphics errors.
+ //_system->setFeatureState(OSystem::kFeatureAutoComputeDirtyRects, true);
+
+ _eventNum = _eventKey = _eventMouseX = _eventMouseY = 0;
+
+#ifdef DUMP_SCRIPTS
+ _script->dumpAllScripts();
+#else
+ _screen->setDefaultMouseCursor();
_script->runScript(_dat->getMainCodeObjectIndex());
+#endif
return 0;
}
diff --git a/engines/made/made.h b/engines/made/made.h
index 5491e8132f..5ee3828557 100644
--- a/engines/made/made.h
+++ b/engines/made/made.h
@@ -93,7 +93,6 @@ public:
uint32 getFeatures() const;
uint16 getVersion() const;
Common::Platform getPlatform() const;
- void update_events();
private:
public:
@@ -106,6 +105,7 @@ public:
bool _quit;
+ uint16 _eventNum;
int _eventMouseX, _eventMouseY;
uint16 _eventKey;
int _soundRate;
@@ -124,7 +124,9 @@ public:
const Common::String getTargetName() { return _targetName; }
Common::String getSavegameFilename(int16 saveNum);
-
+
+ void handleEvents();
+
};
} // End of namespace Made
diff --git a/engines/made/pmvplayer.cpp b/engines/made/pmvplayer.cpp
index db56235a67..1a8ca9c50a 100644
--- a/engines/made/pmvplayer.cpp
+++ b/engines/made/pmvplayer.cpp
@@ -48,12 +48,15 @@ void PmvPlayer::play(const char *filename) {
readChunk(chunkType, chunkSize); // "MHED"
// TODO: Evaluate header
- //_fd->skip(0x3A);
uint frameDelay = _fd->readUint16LE();
_fd->skip(10);
uint soundFreq = _fd->readUint16LE();
- // FIXME: weird frequencies... (11127 or 22254)
+ // Note: There seem to be weird sound frequencies in PMV videos.
+ // Not sure why, but leaving those original frequencies intact
+ // results to sound being choppy. Therefore, we set them to more
+ // "common" values here (11025 instead of 11127 and 22050 instead
+ // of 22254)
if (soundFreq == 11127) soundFreq = 11025;
if (soundFreq == 22254) soundFreq = 22050;
@@ -74,7 +77,7 @@ void PmvPlayer::play(const char *filename) {
uint32 frameCount = 0;
uint16 chunkCount = 0;
uint32 soundSize = 0;
- uint32 palChunkOfs = 0;
+ uint32 soundChunkOfs = 0, palChunkOfs = 0;
uint32 palSize = 0;
byte *frameData, *audioData, *soundData, *palData, *imageData;
bool firstTime = true;
@@ -100,23 +103,29 @@ void PmvPlayer::play(const char *filename) {
frameData = new byte[chunkSize];
_fd->read(frameData, chunkSize);
+
+ soundChunkOfs = READ_LE_UINT32(frameData + 8);
+ palChunkOfs = READ_LE_UINT32(frameData + 16);
// Handle audio
- audioData = frameData + READ_LE_UINT32(frameData + 8) - 8;
- chunkSize = READ_LE_UINT16(audioData + 4);
- chunkCount = READ_LE_UINT16(audioData + 6);
+ if (soundChunkOfs) {
+
+ audioData = frameData + soundChunkOfs - 8;
+ chunkSize = READ_LE_UINT16(audioData + 4);
+ chunkCount = READ_LE_UINT16(audioData + 6);
- if (chunkCount > 50) break; // FIXME: this is a hack
+ debug(1, "chunkCount = %d; chunkSize = %d; total = %d\n", chunkCount, chunkSize, chunkCount * chunkSize);
- debug(1, "chunkCount = %d; chunkSize = %d; total = %d\n", chunkCount, chunkSize, chunkCount * chunkSize);
+ if (chunkCount > 50) break; // FIXME: this is a hack
- soundSize = chunkCount * chunkSize;
- soundData = new byte[soundSize];
- decompressSound(audioData + 8, soundData, chunkSize, chunkCount);
- _audioStream->queueBuffer(soundData, soundSize);
+ soundSize = chunkCount * chunkSize;
+ soundData = new byte[soundSize];
+ decompressSound(audioData + 8, soundData, chunkSize, chunkCount);
+ _audioStream->queueBuffer(soundData, soundSize);
+
+ }
// Handle palette
- palChunkOfs = READ_LE_UINT32(frameData + 16);
if (palChunkOfs) {
palData = frameData + palChunkOfs - 8;
palSize = READ_LE_UINT32(palData + 4);
@@ -143,7 +152,7 @@ void PmvPlayer::play(const char *filename) {
_surface->create(width, height, 1);
}
- decompressImage(imageData, *_surface, cmdOffs, pixelOffs, maskOffs, lineSize, frameNum > 0);
+ decompressMovieImage(imageData, *_surface, cmdOffs, pixelOffs, maskOffs, lineSize);
if (firstTime) {
_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, _audioStream);
diff --git a/engines/made/resource.cpp b/engines/made/resource.cpp
index 8c9125127a..2cae8b276c 100644
--- a/engines/made/resource.cpp
+++ b/engines/made/resource.cpp
@@ -59,9 +59,9 @@ void PictureResource::load(byte *source, int size) {
Common::MemoryReadStream *sourceS = new Common::MemoryReadStream(source, size);
_hasPalette = (sourceS->readByte() != 0);
- sourceS->readByte();
- sourceS->readByte();
- sourceS->readByte();
+ byte cmdFlags = sourceS->readByte();
+ byte pixelFlags = sourceS->readByte();
+ byte maskFlags = sourceS->readByte();
uint16 cmdOffs = sourceS->readUint16LE();
uint16 pixelOffs = sourceS->readUint16LE();
uint16 maskOffs = sourceS->readUint16LE();
@@ -69,7 +69,11 @@ void PictureResource::load(byte *source, int size) {
/*uint16 u = */sourceS->readUint16LE();
uint16 width = sourceS->readUint16LE();
uint16 height = sourceS->readUint16LE();
-
+
+ if (cmdFlags || pixelFlags || maskFlags) {
+ warning("PictureResource::load() Graphic has flags set");
+ }
+
_paletteColorCount = (cmdOffs - 18) / 3; // 18 = sizeof header
debug(2, "width = %d; height = %d\n", width, height);
@@ -82,7 +86,7 @@ void PictureResource::load(byte *source, int size) {
_picture = new Graphics::Surface();
_picture->create(width, height, 1);
- decompressImage(source, *_picture, cmdOffs, pixelOffs, maskOffs, lineSize);
+ decompressImage(source, *_picture, cmdOffs, pixelOffs, maskOffs, lineSize, cmdFlags, pixelFlags, maskFlags);
delete sourceS;
@@ -94,7 +98,8 @@ AnimationResource::AnimationResource() {
}
AnimationResource::~AnimationResource() {
- // TODO: Free anim frames
+ for (uint i = 0; i < _frames.size(); i++)
+ delete _frames[i];
}
void AnimationResource::load(byte *source, int size) {
@@ -136,7 +141,7 @@ void AnimationResource::load(byte *source, int size) {
Graphics::Surface *frame = new Graphics::Surface();
frame->create(frameWidth, frameHeight, 1);
- decompressImage(source + frameOffs, *frame, cmdOffs, pixelOffs, maskOffs, lineSize, _flags & 1);
+ decompressImage(source + frameOffs, *frame, cmdOffs, pixelOffs, maskOffs, lineSize, 0, 0, 0, _flags & 1);
_frames.push_back(frame);
diff --git a/engines/made/screen.cpp b/engines/made/screen.cpp
index 563e059309..754a45016c 100644
--- a/engines/made/screen.cpp
+++ b/engines/made/screen.cpp
@@ -45,11 +45,13 @@ Screen::Screen(MadeEngine *vm) : _vm(vm) {
_workScreenDrawCtx.destSurface = _workScreen;
_clipArea.destSurface = _workScreen;
- // FIXME: Screen mask is only needed in v2 games
- _screenMask = new Graphics::Surface();
- _screenMask->create(320, 200, 1);
- _maskDrawCtx.clipRect = Common::Rect(320, 200);
- _maskDrawCtx.destSurface = _screenMask;
+ // Screen mask is only needed in v2 games
+ if (_vm->getGameID() != GID_RTZ) {
+ _screenMask = new Graphics::Surface();
+ _screenMask->create(320, 200, 1);
+ _maskDrawCtx.clipRect = Common::Rect(320, 200);
+ _maskDrawCtx.destSurface = _screenMask;
+ }
for (int i = 0; i <= 3; i++)
_excludeClipAreaEnabled[i] = false;
@@ -90,14 +92,16 @@ Screen::Screen(MadeEngine *vm) : _vm(vm) {
Screen::~Screen() {
delete _backgroundScreen;
delete _workScreen;
- delete _screenMask;
+ if (_vm->getGameID() != GID_RTZ)
+ delete _screenMask;
delete _fx;
}
void Screen::clearScreen() {
_backgroundScreen->fillRect(Common::Rect(0, 0, 320, 200), 0);
_workScreen->fillRect(Common::Rect(0, 0, 320, 200), 0);
- _screenMask->fillRect(Common::Rect(0, 0, 320, 200), 0);
+ if (_vm->getGameID() != GID_RTZ)
+ _screenMask->fillRect(Common::Rect(0, 0, 320, 200), 0);
_mask = 0;
_needPalette = true;
}
@@ -139,7 +143,7 @@ void Screen::setExcludeArea(uint16 x1, uint16 y1, uint16 x2, uint16 y2) {
void Screen::drawSurface(Graphics::Surface *sourceSurface, int x, int y, int16 flipX, int16 flipY, int16 mask, const ClipInfo &clipInfo) {
- byte *source, *dest, *maskp;
+ byte *source, *dest, *maskp = 0;
int startX = 0;
int startY = 0;
int clipWidth = sourceSurface->w;
@@ -167,7 +171,8 @@ void Screen::drawSurface(Graphics::Surface *sourceSurface, int x, int y, int16 f
source = (byte*)sourceSurface->getBasePtr(startX, startY);
dest = (byte*)clipInfo.destSurface->getBasePtr(x, y);
- maskp = (byte*)_maskDrawCtx.destSurface->getBasePtr(x, y);
+ if (_vm->getGameID() != GID_RTZ)
+ maskp = (byte*)_maskDrawCtx.destSurface->getBasePtr(x, y);
int32 sourcePitch, linePtrAdd;
byte *linePtr;
@@ -192,7 +197,7 @@ void Screen::drawSurface(Graphics::Surface *sourceSurface, int x, int y, int16 f
linePtr = source;
}
for (int16 xc = 0; xc < clipWidth; xc++) {
- if (*linePtr && (mask == 0 || maskp[xc] == 0)) {
+ if (*linePtr && (_vm->getGameID() == GID_RTZ || (mask == 0 || maskp[xc] == 0))) {
if (*linePtr)
dest[xc] = *linePtr;
}
@@ -200,7 +205,8 @@ void Screen::drawSurface(Graphics::Surface *sourceSurface, int x, int y, int16 f
}
source += sourcePitch;
dest += clipInfo.destSurface->pitch;
- maskp += _maskDrawCtx.destSurface->pitch;
+ if (_vm->getGameID() != GID_RTZ)
+ maskp += _maskDrawCtx.destSurface->pitch;
}
}
@@ -260,7 +266,6 @@ uint16 Screen::setChannelLocation(uint16 channelIndex, int16 x, int16 y) {
uint16 Screen::setChannelContent(uint16 channelIndex, uint16 index) {
if (channelIndex < 1 || channelIndex >= 100 || _channels[channelIndex - 1].type == 0)
return 0;
- //debug(2, "setChannelContent(%d, %04X)\n", channelIndex, index); fflush(stdout); g_system->delayMillis(5000);
_channels[channelIndex - 1].index = index;
return updateChannel(channelIndex - 1) + 1;
}
@@ -271,20 +276,6 @@ void Screen::setChannelUseMask(uint16 channelIndex) {
_channels[channelIndex - 1].mask = _mask;
}
-void Screen::setChannelOffsets(uint16 channelIndex, int16 xofs, int16 yofs) {
- if (channelIndex < 1 || channelIndex >= 100)
- return;
- _channels[channelIndex - 1].xofs = xofs;
- _channels[channelIndex - 1].yofs = yofs;
-}
-
-void Screen::getChannelOffsets(uint16 channelIndex, int16 &xofs, int16 &yofs) {
- if (channelIndex < 1 || channelIndex >= 100)
- return;
- xofs = _channels[channelIndex - 1].xofs;
- yofs = _channels[channelIndex - 1].yofs;
-}
-
void Screen::drawSpriteChannels(const ClipInfo &clipInfo, int16 includeStateMask, int16 excludeStateMask) {
for (int i = 0; i <= 3; i++)
@@ -361,6 +352,8 @@ void Screen::updateSprites() {
_vm->_system->copyRectToScreen((const byte*)_workScreen->pixels, _workScreen->pitch, 0, 0, _workScreen->w, _workScreen->h);
+ _vm->_system->updateScreen();
+
}
void Screen::clearChannels() {
@@ -475,8 +468,6 @@ uint16 Screen::placeSprite(uint16 channelIndex, uint16 flexIndex, int16 x, int16
_channels[channelIndex].x2 = x2;
_channels[channelIndex].y2 = y2;
_channels[channelIndex].area = (x2 - x1) * (y2 - y1);
- _channels[channelIndex].xofs = 0;
- _channels[channelIndex].yofs = 0;
if (_channelsUsedCount <= channelIndex)
_channelsUsedCount = channelIndex + 1;
@@ -818,4 +809,25 @@ void Screen::updateScreenAndWait(int delay) {
_vm->_system->delayMillis(delay);
}
+int16 Screen::addToSpriteList(int16 index, int16 xofs, int16 yofs) {
+ SpriteListItem item;
+ item.index = index;
+ item.xofs = xofs;
+ item.yofs = yofs;
+ _spriteList.push_back(item);
+ return _spriteList.size();
+}
+
+SpriteListItem Screen::getFromSpriteList(int16 index) {
+ return _spriteList[index - 1];
+}
+
+void Screen::clearSpriteList() {
+ _spriteList.clear();
+}
+
+void Screen::setDefaultMouseCursor() {
+ CursorMan.replaceCursor(defaultMouseCursor, 16, 16, 9, 2, 0);
+}
+
} // End of namespace Made
diff --git a/engines/made/screen.h b/engines/made/screen.h
index 910096cacd..20085bebdc 100644
--- a/engines/made/screen.h
+++ b/engines/made/screen.h
@@ -31,6 +31,7 @@
#include "common/rect.h"
#include "graphics/surface.h"
+#include "graphics/cursorman.h"
#include "made/resource.h"
#include "made/screenfx.h"
@@ -42,7 +43,7 @@ struct SpriteChannel {
int16 state;
int16 needRefresh;
uint16 index;
- int16 x, y, xofs, yofs;
+ int16 x, y;
int16 x1, y1, x2, y2;
uint32 area;
uint16 fontNum;
@@ -56,8 +57,31 @@ struct ClipInfo {
Graphics::Surface *destSurface;
};
+struct SpriteListItem {
+ int16 index, xofs, yofs;
+};
+
class MadeEngine;
+static const byte defaultMouseCursor[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 15, 15, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 15, 15, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 15, 15, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 15, 15, 1, 0, 0, 0, 0, 0,
+ 1, 1, 15, 1, 15, 1, 15, 1, 15, 15, 1, 0, 0, 0, 0, 0,
+ 1, 15, 15, 1, 15, 1, 15, 1, 15, 15, 1, 0, 0, 0, 0, 0,
+ 1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 0, 1, 1, 1, 0,
+ 1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 15, 15, 15, 1,
+ 1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 1,
+ 1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0,
+ 1, 1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0, 0,
+ 0, 1, 1, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0, 0, 0,
+ 0, 0, 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
+};
+
class Screen {
public:
Screen(MadeEngine *vm);
@@ -120,8 +144,6 @@ public:
uint16 setChannelLocation(uint16 channelIndex, int16 x, int16 y);
uint16 setChannelContent(uint16 channelIndex, uint16 index);
void setChannelUseMask(uint16 channelIndex);
- void setChannelOffsets(uint16 channelIndex, int16 xofs, int16 yofs);
- void getChannelOffsets(uint16 channelIndex, int16 &xofs, int16 &yofs);
void drawSpriteChannels(const ClipInfo &clipInfo, int16 includeStateMask, int16 excludeStateMask);
void updateSprites();
void clearChannels();
@@ -161,6 +183,12 @@ public:
void showWorkScreen();
void updateScreenAndWait(int delay);
+ int16 addToSpriteList(int16 index, int16 xofs, int16 yofs);
+ SpriteListItem getFromSpriteList(int16 index);
+ void clearSpriteList();
+
+ void setDefaultMouseCursor();
+
protected:
MadeEngine *_vm;
ScreenEffects *_fx;
@@ -194,6 +222,8 @@ protected:
uint16 _channelsUsedCount;
SpriteChannel _channels[100];
+ Common::Array<SpriteListItem> _spriteList;
+
};
} // End of namespace Made
diff --git a/engines/made/screenfx.cpp b/engines/made/screenfx.cpp
index feea365615..b65c3db60c 100644
--- a/engines/made/screenfx.cpp
+++ b/engines/made/screenfx.cpp
@@ -60,19 +60,35 @@ void ScreenEffects::run(int16 effectNum, Graphics::Surface *surface, byte *palet
switch (effectNum) {
- case 0:
+ case 0: // No effect
vfx00(surface, palette, newPalette, colorCount);
break;
- case 9:
+ case 2:
+ vfx02(surface, palette, newPalette, colorCount);
+ break;
+
+ case 9: // "Checkerboard" effect
vfx09(surface, palette, newPalette, colorCount);
break;
- case 14:
+ case 10: // "Screen wipe in", left to right
+ vfx10(surface, palette, newPalette, colorCount);
+ break;
+
+ case 12: // "Screen wipe in", top to bottom
+ vfx12(surface, palette, newPalette, colorCount);
+ break;
+
+ case 14: // "Screen open" effect
vfx14(surface, palette, newPalette, colorCount);
break;
- case 17:
+ case 15:
+ vfx15(surface, palette, newPalette, colorCount);
+ break;
+
+ case 17: // Palette fadeout/fadein
vfx17(surface, palette, newPalette, colorCount);
break;
@@ -108,12 +124,12 @@ void ScreenEffects::setBlendedPalette(byte *palette, byte *newPalette, int color
if (!_screen->isPaletteLocked()) {
int32 mulValue = (value * 64) / maxValue;
for (int i = 0; i < colorCount * 3; i++)
- _fxPalette[i] = newPalette[i] - (newPalette[i] - palette[i]) * mulValue / 64;
+ _fxPalette[i] = CLIP(newPalette[i] - (newPalette[i] - palette[i]) * mulValue / 64, 0, 255);
_screen->setRGBPalette(_fxPalette, 0, 256);
}
}
-void ScreenEffects::copyRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2) {
+void ScreenEffects::copyFxRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2) {
// TODO: Clean up
@@ -189,26 +205,72 @@ void ScreenEffects::copyRect(Graphics::Surface *surface, int16 x1, int16 y1, int
}
+void ScreenEffects::copyRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2) {
+ Graphics::Surface *vgaScreen = _screen->lockScreen();
+ byte *source = (byte*)surface->getBasePtr(x1, y1);
+ byte *dest = (byte*)vgaScreen->getBasePtr(x1, y1);
+ for (int y = 0; y < y2 - y1; y++) {
+ memcpy(dest, source, x2 - x1);
+ dest += 320;
+ source += 320;
+ }
+ _screen->unlockScreen();
+}
+
+// No effect
void ScreenEffects::vfx00(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
setPalette(palette);
_screen->showWorkScreen();
+ // FIXME: For Manhole; causes sluggish mouse
+ _screen->updateScreenAndWait(100);
+}
+
+void ScreenEffects::vfx02(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ for (int x = 312; x >= 0; x -= 8) {
+ copyRect(surface, x, 0, x + 8, 200);
+ setBlendedPalette(palette, newPalette, colorCount, 312 - x, 312);
+ _screen->updateScreenAndWait(25);
+ }
+ setPalette(palette);
}
+// "Checkerboard" effect
void ScreenEffects::vfx09(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
for (int i = 0; i < 8; i++) {
- copyRect(surface, 0, 0, 320, 200);
+ copyFxRect(surface, 0, 0, 320, 200);
for (int j = 0; j < 4; j++) {
- setBlendedPalette(palette, newPalette, colorCount, i * 4 + j, 32);
+ setBlendedPalette(palette, newPalette, colorCount, i * 4 + j, 36/*FIX?*/);
_screen->updateScreenAndWait(25);
}
}
setPalette(palette);
}
+// "Screen wipe in", left to right
+void ScreenEffects::vfx10(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ for (int x = -56; x < 312; x += 8) {
+ copyFxRect(surface, x, 0, x + 64, 200);
+ setBlendedPalette(palette, newPalette, colorCount, x + 56, 368);
+ _screen->updateScreenAndWait(25);
+ }
+ setPalette(palette);
+}
+
+// "Screen wipe in", top to bottom
+void ScreenEffects::vfx12(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ for (int y = -70; y < 312; y += 10) {
+ copyFxRect(surface, 0, y, 320, y + 80);
+ setBlendedPalette(palette, newPalette, colorCount, y + 70, 260);
+ _screen->updateScreenAndWait(25);
+ }
+ setPalette(palette);
+}
+
+// "Screen open" effect
void ScreenEffects::vfx14(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
int16 x = 8, y = 5;
for (int i = 0; i < 27; i++) {
- copyRect(surface, 160 - x, 100 - y, 160 + x, 100 + y);
+ copyFxRect(surface, 160 - x, 100 - y, 160 + x, 100 + y);
x += 8;
y += 5;
setBlendedPalette(palette, newPalette, colorCount, i, 27);
@@ -217,6 +279,18 @@ void ScreenEffects::vfx14(Graphics::Surface *surface, byte *palette, byte *newPa
setPalette(palette);
}
+void ScreenEffects::vfx15(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
+ int16 x = 8;
+ for (int i = 0; i < 27; i++) {
+ copyFxRect(surface, 160 - x, 0, 160 + x, 200);
+ x += 8;
+ setBlendedPalette(palette, newPalette, colorCount, i, 27);
+ _screen->updateScreenAndWait(25);
+ }
+ setPalette(palette);
+}
+
+// Palette fadeout/fadein
void ScreenEffects::vfx17(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) {
byte tempPalette[768];
diff --git a/engines/made/screenfx.h b/engines/made/screenfx.h
index e1f877b42e..1c36b3e1f1 100644
--- a/engines/made/screenfx.h
+++ b/engines/made/screenfx.h
@@ -51,10 +51,15 @@ private:
int16 vfxX1, vfxY1, vfxWidth, vfxHeight;
void setPalette(byte *palette);
void setBlendedPalette(byte *palette, byte *newPalette, int colorCount, int16 value, int16 maxValue);
+ void copyFxRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2);
void copyRect(Graphics::Surface *surface, int16 x1, int16 y1, int16 x2, int16 y2);
void vfx00(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
+ void vfx02(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
void vfx09(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
+ void vfx10(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
+ void vfx12(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
void vfx14(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
+ void vfx15(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
void vfx17(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount);
};
diff --git a/engines/made/script.cpp b/engines/made/script.cpp
index 8b5a48cdd7..4bda35dcc3 100644
--- a/engines/made/script.cpp
+++ b/engines/made/script.cpp
@@ -91,83 +91,87 @@ int16 *ScriptStack::getStackPtr() {
/* ScriptInterpreter */
ScriptInterpreter::ScriptInterpreter(MadeEngine *vm) : _vm(vm) {
-#define COMMAND(x) { &ScriptInterpreter::x, #x }
+#ifdef DUMP_SCRIPTS
+#define COMMAND(x, sig) { &ScriptInterpreter::x, #x, sig }
+#else
+#define COMMAND(x, sig) { &ScriptInterpreter::x, #x}
+#endif
static CommandEntry commandProcs[] = {
/* 01 */
- COMMAND(cmd_branchTrue),
- COMMAND(cmd_branchFalse),
- COMMAND(cmd_branch),
- COMMAND(cmd_true),
+ COMMAND(cmd_branchTrue, "W"),
+ COMMAND(cmd_branchFalse, "W"),
+ COMMAND(cmd_branch, "W"),
+ COMMAND(cmd_true, ""),
/* 05 */
- COMMAND(cmd_false),
- COMMAND(cmd_push),
- COMMAND(cmd_not),
- COMMAND(cmd_add),
+ COMMAND(cmd_false, ""),
+ COMMAND(cmd_push, ""),
+ COMMAND(cmd_not, ""),
+ COMMAND(cmd_add, ""),
/* 09 */
- COMMAND(cmd_sub),
- COMMAND(cmd_mul),
- COMMAND(cmd_div),
- COMMAND(cmd_mod),
+ COMMAND(cmd_sub, ""),
+ COMMAND(cmd_mul, ""),
+ COMMAND(cmd_div, ""),
+ COMMAND(cmd_mod, ""),
/* 13 */
- COMMAND(cmd_band),
- COMMAND(cmd_bor),
- COMMAND(cmd_bnot),
- COMMAND(cmd_lt),
+ COMMAND(cmd_band, ""),
+ COMMAND(cmd_bor, ""),
+ COMMAND(cmd_bnot, ""),
+ COMMAND(cmd_lt, ""),
/* 17 */
- COMMAND(cmd_eq),
- COMMAND(cmd_gt),
- COMMAND(cmd_loadConstant),
- COMMAND(cmd_loadVariable),
+ COMMAND(cmd_eq, ""),
+ COMMAND(cmd_gt, ""),
+ COMMAND(cmd_loadConstant, "w"),
+ COMMAND(cmd_loadVariable, "w"),
/* 21 */
- COMMAND(cmd_getObjectProperty),
- COMMAND(cmd_setObjectProperty),
- COMMAND(cmd_set),
- COMMAND(cmd_print),
+ COMMAND(cmd_getObjectProperty, ""),
+ COMMAND(cmd_setObjectProperty, ""),
+ COMMAND(cmd_set, "w"),
+ COMMAND(cmd_print, ""),
/* 25 */
- COMMAND(cmd_terpri),
- COMMAND(cmd_printNumber),
- COMMAND(cmd_vref),
- COMMAND(cmd_vset),
+ COMMAND(cmd_terpri, ""),
+ COMMAND(cmd_printNumber, ""),
+ COMMAND(cmd_vref, ""),
+ COMMAND(cmd_vset, ""),
/* 29 */
- COMMAND(cmd_vsize),
- COMMAND(cmd_exit),
- COMMAND(cmd_return),
- COMMAND(cmd_call),
+ COMMAND(cmd_vsize, ""),
+ COMMAND(cmd_exit, ""),
+ COMMAND(cmd_return, ""),
+ COMMAND(cmd_call, "b"),
/* 33 */
- COMMAND(cmd_svar),
- COMMAND(cmd_sset),
- COMMAND(cmd_split),
- COMMAND(cmd_snlit),
+ COMMAND(cmd_svar, ""),
+ COMMAND(cmd_sset, ""),
+ COMMAND(cmd_split, ""),
+ COMMAND(cmd_snlit, ""),
/* 37 */
- COMMAND(cmd_yorn),
- COMMAND(cmd_save),
- COMMAND(cmd_restore),
- COMMAND(cmd_arg),
+ COMMAND(cmd_yorn, ""),
+ COMMAND(cmd_save, ""),
+ COMMAND(cmd_restore, ""),
+ COMMAND(cmd_arg, "b"),
/* 41 */
- COMMAND(cmd_aset),
- COMMAND(cmd_tmp),
- COMMAND(cmd_tset),
- COMMAND(cmd_tspace),
+ COMMAND(cmd_aset, "b"),
+ COMMAND(cmd_tmp, "b"),
+ COMMAND(cmd_tset, "b"),
+ COMMAND(cmd_tspace, "b"),
/* 45 */
- COMMAND(cmd_class),
- COMMAND(cmd_objectp),
- COMMAND(cmd_vectorp),
- COMMAND(cmd_restart),
+ COMMAND(cmd_class, ""),
+ COMMAND(cmd_objectp, ""),
+ COMMAND(cmd_vectorp, ""),
+ COMMAND(cmd_restart, ""),
/* 49 */
- COMMAND(cmd_rand),
- COMMAND(cmd_randomize),
- COMMAND(cmd_send),
- COMMAND(cmd_extend),
+ COMMAND(cmd_rand, ""),
+ COMMAND(cmd_randomize, ""),
+ COMMAND(cmd_send, "b"),
+ COMMAND(cmd_extend, "Eb"),
/* 53 */
- COMMAND(cmd_catch),
- COMMAND(cmd_cdone),
- COMMAND(cmd_throw),
- COMMAND(cmd_functionp),
+ COMMAND(cmd_catch, ""),
+ COMMAND(cmd_cdone, ""),
+ COMMAND(cmd_throw, ""),
+ COMMAND(cmd_functionp, ""),
/* 57 */
- COMMAND(cmd_le),
- COMMAND(cmd_ge),
- COMMAND(cmd_varx),
- COMMAND(cmd_setx)
+ COMMAND(cmd_le, ""),
+ COMMAND(cmd_ge, ""),
+ COMMAND(cmd_varx, ""),
+ COMMAND(cmd_setx, "")
};
_commands = commandProcs;
_commandsMax = ARRAYSIZE(commandProcs) + 1;
@@ -183,7 +187,6 @@ ScriptInterpreter::~ScriptInterpreter() {
}
void ScriptInterpreter::runScript(int16 scriptObjectIndex) {
-
_vm->_quit = false;
_runningScriptObjectIndex = scriptObjectIndex;
@@ -193,15 +196,18 @@ void ScriptInterpreter::runScript(int16 scriptObjectIndex) {
_codeIp = _codeBase;
while (!_vm->_quit) {
+
+ _vm->handleEvents();
+
byte opcode = readByte();
if (opcode >= 1 && opcode <= _commandsMax) {
- debug(4, "[%04X:%04X] opcode = %s", _runningScriptObjectIndex, (uint) (_codeIp - _codeBase), _commands[opcode - 1].desc);
+ debug(4, "[%04X:%04X] %s", _runningScriptObjectIndex, (uint) (_codeIp - _codeBase), _commands[opcode - 1].desc);
(this->*_commands[opcode - 1].proc)();
} else {
warning("ScriptInterpreter::runScript(%d) Unknown opcode %02X", _runningScriptObjectIndex, opcode);
}
+
}
-
}
byte ScriptInterpreter::readByte() {
@@ -436,6 +442,7 @@ void ScriptInterpreter::cmd_return() {
void ScriptInterpreter::cmd_call() {
debug(4, "\nENTER: stackPtr = %d; _localStackPos = %d", _stack.getStackPos(), _localStackPos);
byte argc = readByte();
+
_stack.push(argc);
_stack.push(_codeIp - _codeBase);
_stack.push(_runningScriptObjectIndex);
@@ -448,22 +455,27 @@ void ScriptInterpreter::cmd_call() {
}
void ScriptInterpreter::cmd_svar() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_svar");
}
void ScriptInterpreter::cmd_sset() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_sset");
}
void ScriptInterpreter::cmd_split() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_split");
}
void ScriptInterpreter::cmd_snlit() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_snlit");
}
void ScriptInterpreter::cmd_yorn() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_yorn");
}
@@ -514,6 +526,7 @@ void ScriptInterpreter::cmd_tspace() {
}
void ScriptInterpreter::cmd_class() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_class");
}
@@ -526,10 +539,12 @@ void ScriptInterpreter::cmd_objectp() {
}
void ScriptInterpreter::cmd_vectorp() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_vectorp");
}
void ScriptInterpreter::cmd_restart() {
+ // TODO: Used in RTZ
warning("Unimplemented command: cmd_restart");
}
@@ -592,8 +607,7 @@ void ScriptInterpreter::cmd_extend() {
byte argc = readByte();
int16 *argv = _stack.getStackPtr();
- //debug(4, "func = %d (%s); argc = %d", func, extendFuncNames[func], argc);
- debug(2, "func = %d; argc = %d", func, argc);
+ debug(4, "func = %d (%s); argc = %d", func, _functions->getFuncName(func), argc);
for (int i = 0; i < argc; i++)
debug(2, "argv[%02d] = %04X (%d)", i, argv[i], argv[i]);
@@ -607,18 +621,22 @@ void ScriptInterpreter::cmd_extend() {
}
void ScriptInterpreter::cmd_catch() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_catch");
}
void ScriptInterpreter::cmd_cdone() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_cdone");
}
void ScriptInterpreter::cmd_throw() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_throw");
}
void ScriptInterpreter::cmd_functionp() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_functionp");
}
@@ -639,11 +657,131 @@ void ScriptInterpreter::cmd_ge() {
}
void ScriptInterpreter::cmd_varx() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_varx");
}
void ScriptInterpreter::cmd_setx() {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented command: cmd_setx");
}
+#ifdef DUMP_SCRIPTS
+void ScriptInterpreter::dumpScript(int16 objectIndex, int *opcodeStats, int *externStats) {
+
+ debug(1, "Dumping code for object %04X", objectIndex);
+
+ Object *obj = _vm->_dat->getObject(objectIndex);
+ byte *code = obj->getData(), *codeEnd = code + obj->getSize();
+
+ while (code < codeEnd) {
+ byte opcode = *code++;
+ if (opcode >= 1 && opcode <= _commandsMax) {
+ Common::String codeLine;
+ const char *desc = _commands[opcode - 1].desc;
+ const char *sig = _commands[opcode - 1].sig;
+ int valueType; /* 0: dec; 1: hex; 2: extended function */
+ int16 value;
+ char tempStr[32];
+ opcodeStats[opcode - 1]++;
+ codeLine += desc;
+ for (; *sig != '\0'; sig++) {
+ codeLine += " ";
+ switch (*sig) {
+ case 'b':
+ valueType = 0;
+ value = *code++;
+ break;
+ case 'B':
+ valueType = 1;
+ value = *code++;
+ break;
+ case 'w':
+ valueType = 0;
+ value = READ_LE_UINT16(code);
+ code += 2;
+ break;
+ case 'W':
+ valueType = 1;
+ value = READ_LE_UINT16(code);
+ code += 2;
+ break;
+ case 'E':
+ valueType = 2;
+ value = *code++;
+ break;
+ }
+ switch (valueType) {
+ case 0:
+ snprintf(tempStr, 32, "%d", value);
+ break;
+ case 1:
+ snprintf(tempStr, 32, "0x%X", value);
+ break;
+ case 2:
+ if (value < _functions->getCount()) {
+ snprintf(tempStr, 32, "%s", _functions->getFuncName(value));
+ externStats[value]++;
+ } else {
+ snprintf(tempStr, 32, "invalid: %d", value);
+ }
+ break;
+ }
+ codeLine += tempStr;
+ }
+ debug(1, "%s", codeLine.c_str());
+ } else {
+ error("ScriptInterpreter::dumpScript(%d) Unknown opcode %02X", objectIndex, opcode);
+ }
+ }
+ debug(1, "-------------------------------------------");
+}
+
+void ScriptInterpreter::dumpAllScripts() {
+ int *opcodeStats = new int[_commandsMax - 1];
+ int *externStats = new int[_functions->getCount()];
+
+ for (int i = 0; i < _commandsMax; i++)
+ opcodeStats[i] = 0;
+ for (int i = 0; i < _functions->getCount(); i++)
+ externStats[i] = 0;
+
+ for (uint objectIndex = 1; objectIndex <= _vm->_dat->getObjectCount(); objectIndex++) {
+ Object *obj = _vm->_dat->getObject(objectIndex);
+ // Check if it's a byte array which might contain code
+ if (obj->getClass() != 0x7FFF)
+ continue;
+ // Code objects aren't excplicitly marked as such, we need to check if
+ // the last byte is a cmd_return opcode.
+ byte *retByte = obj->getData() + obj->getSize() - 1;
+ if (*retByte == 0x1F) {
+ dumpScript(objectIndex, opcodeStats, externStats);
+ }
+ }
+
+ debug(1, "OPCODE statistics:");
+ for (int i = 0; i < _commandsMax - 1; i++)
+ if (opcodeStats[i] > 0)
+ debug(1, "%-30s: %d", _commands[i].desc, opcodeStats[i]);
+ debug(1, "UNUSED OPCODE statistics:");
+ for (int i = 0; i < _commandsMax - 1; i++)
+ if (opcodeStats[i] == 0)
+ debug(1, "%-30s: %d", _commands[i].desc, opcodeStats[i]);
+ debug(1, ".");
+
+ debug(1, "EXTERN statistics (%d):", _functions->getCount());
+ for (int i = 0; i < _functions->getCount(); i++)
+ if (externStats[i] > 0)
+ debug(1, "%-30s: %d", _functions->getFuncName(i), externStats[i]);
+ debug(1, "UNUSED EXTERN statistics (%d):", _functions->getCount());
+ for (int i = 0; i < _functions->getCount(); i++)
+ if (externStats[i] == 0)
+ debug(1, "%-30s: %d", _functions->getFuncName(i), externStats[i]);
+ debug(1, ".");
+
+ delete[] opcodeStats;
+ delete[] externStats;
+}
+#endif
+
} // End of namespace Made
diff --git a/engines/made/script.h b/engines/made/script.h
index 6c031f8708..459a088cb8 100644
--- a/engines/made/script.h
+++ b/engines/made/script.h
@@ -32,6 +32,11 @@
namespace Made {
+// Define this to dump all game scripts and a usage statistic of all
+// opcodes/extended functions instead of running the actual game.
+// Then run ScummVM with debuglevel 1.
+//#define DUMP_SCRIPTS
+
class MadeEngine;
class ScriptFunctions;
@@ -63,6 +68,8 @@ public:
ScriptInterpreter(MadeEngine *vm);
~ScriptInterpreter();
void runScript(int16 scriptObjectIndex);
+ void dumpScript(int16 objectIndex, int *opcodeStats, int *externStats);
+ void dumpAllScripts();
protected:
MadeEngine *_vm;
@@ -81,6 +88,9 @@ protected:
struct CommandEntry {
CommandProc proc;
const char *desc;
+#ifdef DUMP_SCRIPTS
+ const char *sig;
+#endif
};
const CommandEntry *_commands;
diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp
index 2819f127ef..f67b7c89c6 100644
--- a/engines/made/scriptfuncs.cpp
+++ b/engines/made/scriptfuncs.cpp
@@ -188,67 +188,18 @@ int16 ScriptFunctions::sfClearScreen(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfShowPage(int16 argc, int16 *argv) {
- _vm->_mixer->stopHandle(_audioStreamHandle);
+ if (_vm->getGameID() != GID_RTZ)
+ _vm->_mixer->stopHandle(_audioStreamHandle);
_vm->_screen->show();
return 0;
}
int16 ScriptFunctions::sfPollEvent(int16 argc, int16 *argv) {
- Common::Event event;
- Common::EventManager *eventMan = g_system->getEventManager();
-
- int16 eventNum = 0;
-
- if (eventMan->pollEvent(event)) {
- switch (event.type) {
-
- case Common::EVENT_MOUSEMOVE:
- _vm->_eventMouseX = event.mouse.x;
- _vm->_eventMouseY = event.mouse.y;
- break;
-
- case Common::EVENT_LBUTTONDOWN:
- eventNum = 1;
- break;
-
- /*
- case Common::EVENT_LBUTTONUP:
- eventNum = 2; // TODO: Is this correct?
- break;
- */
-
- case Common::EVENT_RBUTTONDOWN:
- eventNum = 3;
- break;
-
- /*
- case Common::EVENT_RBUTTONUP:
- eventNum = 4; // TODO: Is this correct?
- break;
- */
-
- case Common::EVENT_KEYDOWN:
- _vm->_eventKey = event.kbd.ascii;
- // For unknown reasons, the game accepts ASCII code
- // 9 as backspace
- if (_vm->_eventKey == Common::KEYCODE_BACKSPACE)
- _vm->_eventKey = 9;
- eventNum = 5;
- break;
-
- case Common::EVENT_QUIT:
- _vm->_quit = true;
- break;
-
- default:
- break;
-
- }
- }
-
_vm->_system->updateScreen();
+ int16 eventNum = _vm->_eventNum;
+ _vm->_eventNum = 0;
return eventNum;
}
@@ -318,6 +269,7 @@ int16 ScriptFunctions::sfIsMusicPlaying(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfSetTextPos(int16 argc, int16 *argv) {
+ // TODO: Used in Manhole:NE
warning("Unimplemented opcode: sfSetTextPos");
// This seems to be some kind of low-level opcode.
// The original engine calls int 10h to set the VGA cursor position.
@@ -330,21 +282,25 @@ int16 ScriptFunctions::sfFlashScreen(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfPlayNote(int16 argc, int16 *argv) {
+ // TODO: Used in Manhole:NE
warning("Unimplemented opcode: sfPlayNote");
return 0;
}
int16 ScriptFunctions::sfStopNote(int16 argc, int16 *argv) {
+ // TODO: Used in Manhole:NE
warning("Unimplemented opcode: sfStopNote");
return 0;
}
int16 ScriptFunctions::sfPlayTele(int16 argc, int16 *argv) {
+ // TODO: Used in Manhole:NE
warning("Unimplemented opcode: sfPlayTele");
return 0;
}
int16 ScriptFunctions::sfStopTele(int16 argc, int16 *argv) {
+ // TODO: Used in Manhole:NE
warning("Unimplemented opcode: sfStopTele");
return 0;
}
@@ -373,10 +329,10 @@ int16 ScriptFunctions::sfSetScreenLock(int16 argc, int16 *argv) {
int16 ScriptFunctions::sfAddSprite(int16 argc, int16 *argv) {
if (_vm->getGameID() == GID_RTZ) {
- warning("Unimplemented opcode: sfAddSprite");
+ // Unused in RTZ
return 0;
} if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) {
- return argv[2];
+ return _vm->_screen->addToSpriteList(argv[2], argv[1], argv[0]);
} else {
return 0;
}
@@ -384,6 +340,9 @@ int16 ScriptFunctions::sfAddSprite(int16 argc, int16 *argv) {
int16 ScriptFunctions::sfFreeAnim(int16 argc, int16 *argv) {
_vm->_screen->clearChannels();
+ if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) {
+ _vm->_screen->clearSpriteList();
+ }
return 0;
}
@@ -391,8 +350,9 @@ int16 ScriptFunctions::sfDrawSprite(int16 argc, int16 *argv) {
if (_vm->getGameID() == GID_RTZ) {
return _vm->_screen->drawSprite(argv[2], argv[1], argv[0]);
} if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) {
- int16 channel = _vm->_screen->drawSprite(argv[2], argv[1], argv[0]);
- _vm->_screen->setChannelUseMask(channel);
+ SpriteListItem item = _vm->_screen->getFromSpriteList(argv[2]);
+ int16 channelIndex = _vm->_screen->drawSprite(item.index, argv[1] - item.xofs, argv[0] - item.yofs);
+ _vm->_screen->setChannelUseMask(channelIndex);
return 0;
} else {
return 0;
@@ -482,6 +442,7 @@ int16 ScriptFunctions::sfDrawText(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfHomeText(int16 argc, int16 *argv) {
+ // TODO: Used in LGOP2
warning("Unimplemented opcode: sfHomeText");
return 0;
}
@@ -529,7 +490,6 @@ int16 ScriptFunctions::sfLoadMouseCursor(int16 argc, int16 *argv) {
if (flex) {
Graphics::Surface *surf = flex->getPicture();
CursorMan.replaceCursor((const byte *)surf->pixels, surf->w, surf->h, argv[1], argv[0], 0);
- CursorMan.showMouse(true);
_vm->_res->freeResource(flex);
}
return 0;
@@ -541,6 +501,7 @@ int16 ScriptFunctions::sfSetSpriteGround(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfLoadResText(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfLoadResText");
return 0;
}
@@ -610,6 +571,7 @@ int16 ScriptFunctions::sfGetCdTime(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfPlayCdSegment(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfPlayCdSegment");
return 0;
}
@@ -622,6 +584,7 @@ int16 ScriptFunctions::sfPrintf(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfClearMono(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfClearMono");
return 0;
}
@@ -636,11 +599,13 @@ int16 ScriptFunctions::sfGetSoundEnergy(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfClearText(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfClearText");
return 1;
}
int16 ScriptFunctions::sfAnimText(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfAnimText");
return 0;
}
@@ -691,11 +656,13 @@ int16 ScriptFunctions::sfLoadPicture(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfSetMusicVolume(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfSetMusicVolume");
return 0;
}
int16 ScriptFunctions::sfRestartEvents(int16 argc, int16 *argv) {
+ // TODO: Used in RTZ
warning("Unimplemented opcode: sfRestartEvents");
return 0;
}
@@ -723,11 +690,13 @@ int16 ScriptFunctions::sfSetChannelState(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfSetChannelLocation(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfSetChannelLocation");
return 0;
}
int16 ScriptFunctions::sfSetChannelContent(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfSetChannelContent");
return 0;
}
@@ -795,6 +764,7 @@ int16 ScriptFunctions::sfSetSoundRate(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfDrawAnimPic(int16 argc, int16 *argv) {
+ // TODO: Used in RTZ
warning("Unimplemented opcode: sfDrawAnimPic");
return 0;
}
@@ -809,6 +779,7 @@ int16 ScriptFunctions::sfLoadAnim(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfReadText(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfReadText");
return 0;
}
@@ -912,11 +883,13 @@ int16 ScriptFunctions::sfGetGameDescription(int16 argc, int16 *argv) {
}
int16 ScriptFunctions::sfShakeScreen(int16 argc, int16 *argv) {
+ // TODO: Used in RTZ
warning("Unimplemented opcode: sfShakeScreen");
return 0;
}
int16 ScriptFunctions::sfPlaceMenu(int16 argc, int16 *argv) {
+ // Never used in LGOP2, RTZ, Manhole:NE
warning("Unimplemented opcode: sfPlaceMenu");
return 0;
}
diff --git a/engines/made/scriptfuncs.h b/engines/made/scriptfuncs.h
index 052856065e..9879556c3f 100644
--- a/engines/made/scriptfuncs.h
+++ b/engines/made/scriptfuncs.h
@@ -53,6 +53,8 @@ public:
return (*_externalFuncs[index])(argc, argv);
}
void setupExternalsTable();
+ const char* getFuncName(int index) { return _externalFuncNames[index]; }
+ int getCount() const { return _externalFuncs.size(); }
protected:
MadeEngine *_vm;
Audio::SoundHandle _audioStreamHandle;
diff --git a/engines/metaengine.h b/engines/metaengine.h
index c5fb006faa..aef860e0f9 100644
--- a/engines/metaengine.h
+++ b/engines/metaengine.h
@@ -108,7 +108,7 @@ private:
public:
GameDescriptor findGame(const Common::String &gameName, const EnginePlugin **plugin = NULL) const;
GameList detectGames(const FSList &fslist) const;
- const EnginePlugin::list &getPlugins() const;
+ const EnginePlugin::List &getPlugins() const;
};
/** Convenience shortcut for accessing the engine manager. */
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp
index 402f69c99d..68e6a70ffb 100644
--- a/engines/parallaction/callables_ns.cpp
+++ b/engines/parallaction/callables_ns.cpp
@@ -468,7 +468,6 @@ void Parallaction_ns::_c_endIntro(void *parm) {
debugC(1, kDebugExec, "endIntro()");
- uint32 event;
uint id[2];
for (uint16 _si = 0; _si < 6; _si++) {
id[0] = _gfx->createLabel(_menuFont, _credits[_si]._role, 1);
@@ -479,14 +478,7 @@ void Parallaction_ns::_c_endIntro(void *parm) {
_gfx->updateScreen();
- for (uint16 v2 = 0; v2 < 100; v2++) {
- _input->readInput();
- event = _input->getLastButtonEvent();
- if (event == kMouseLeftUp)
- break;
-
- waitTime( 1 );
- }
+ _input->waitForButtonEvent(kMouseLeftUp, 5500);
_gfx->freeLabels();
}
diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp
index 91cc77e823..1d4d44fa46 100644
--- a/engines/parallaction/gui_ns.cpp
+++ b/engines/parallaction/gui_ns.cpp
@@ -213,11 +213,7 @@ int Parallaction_ns::guiNewGame() {
_input->waitForButtonEvent(kMouseLeftUp | kMouseRightUp);
uint32 event = _input->getLastButtonEvent();
-/*
- do {
- _input->readInput();
- } while (_mouseButtons != kMouseLeftUp && _mouseButtons != kMouseRightUp);
-*/
+
_input->showCursor(true);
_gfx->freeLabels();
diff --git a/engines/parallaction/input.cpp b/engines/parallaction/input.cpp
index dc26debba7..28d0ad888d 100644
--- a/engines/parallaction/input.cpp
+++ b/engines/parallaction/input.cpp
@@ -83,7 +83,7 @@ uint16 Input::readInput() {
// TODO: don't quit() here, just have caller routines to check
// on kEngineQuit and exit gracefully to allow the engine to shut down
_engineFlags |= kEngineQuit;
- g_system->quit();
+ _vm->_system->quit();
break;
default:
@@ -101,17 +101,26 @@ uint16 Input::readInput() {
}
// FIXME: see comment for readInput()
-void Input::waitForButtonEvent(uint32 buttonEventMask) {
+void Input::waitForButtonEvent(uint32 buttonEventMask, int32 timeout) {
if (buttonEventMask == kMouseNone) {
_mouseButtons = kMouseNone; // don't wait on nothing
return;
}
- do {
- readInput();
- g_system->delayMillis(30);
- } while ((_mouseButtons & buttonEventMask) == 0);
+ const int32 LOOP_RESOLUTION = 30;
+ if (timeout <= 0) {
+ do {
+ readInput();
+ _vm->_system->delayMillis(LOOP_RESOLUTION);
+ } while ((_mouseButtons & buttonEventMask) == 0);
+ } else {
+ do {
+ readInput();
+ _vm->_system->delayMillis(LOOP_RESOLUTION);
+ timeout -= LOOP_RESOLUTION;
+ } while ((timeout > 0) && (_mouseButtons & buttonEventMask) == 0);
+ }
}
@@ -121,38 +130,12 @@ void Input::waitUntilLeftClick() {
do {
readInput();
_vm->_gfx->updateScreen();
- g_system->delayMillis(30);
+ _vm->_system->delayMillis(30);
} while (_mouseButtons != kMouseLeftUp);
return;
}
-void Parallaction::runGame() {
-
- InputData *data = _input->updateInput();
- if (data->_event != kEvNone) {
- processInput(data);
- }
-
- runPendingZones();
-
- if (_engineFlags & kEngineChangeLocation) {
- changeLocation(_location._name);
- }
-
-
- _gfx->beginFrame();
-
- if (_input->_inputMode == Input::kInputModeGame) {
- runScripts();
- walk();
- drawAnimations();
- }
-
- // change this to endFrame?
- updateView();
-
-}
void Input::updateGameInput() {
diff --git a/engines/parallaction/input.h b/engines/parallaction/input.h
index 3d072384a2..46dbb08c4e 100644
--- a/engines/parallaction/input.h
+++ b/engines/parallaction/input.h
@@ -68,6 +68,7 @@ class Input {
uint16 _mouseButtons;
bool _mouseHidden;
+ ZonePtr _hoverZone;
public:
enum {
@@ -94,13 +95,12 @@ public:
}
int _inputMode;
- ZonePtr _hoverZone;
InventoryItem _activeItem;
uint16 readInput();
InputData* updateInput();
void waitUntilLeftClick();
- void waitForButtonEvent(uint32 buttonEventMask);
+ void waitForButtonEvent(uint32 buttonEventMask, int32 timeout = -1);
uint32 getLastButtonEvent() { return _mouseButtons; }
void stopHovering() {
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index eb766661c3..d66b1af1f1 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -153,29 +153,6 @@ void Parallaction::updateView() {
}
-uint32 Parallaction::getElapsedTime() {
- return g_system->getMillis() - _baseTime;
-}
-
-void Parallaction::resetTimer() {
- _baseTime = g_system->getMillis();
- return;
-}
-
-
-void Parallaction::waitTime(uint32 t) {
-
- uint32 v4 = 0;
-
- while (v4 < t * (1000 / 18.2)) {
- v4 = getElapsedTime();
- }
-
- resetTimer();
-
- return;
-}
-
void Parallaction::freeCharacter() {
debugC(1, kDebugExec, "freeCharacter()");
@@ -370,6 +347,33 @@ void Parallaction::processInput(InputData *data) {
return;
}
+void Parallaction::runGame() {
+
+ InputData *data = _input->updateInput();
+ if (data->_event != kEvNone) {
+ processInput(data);
+ }
+
+ runPendingZones();
+
+ if (_engineFlags & kEngineChangeLocation) {
+ changeLocation(_location._name);
+ }
+
+
+ _gfx->beginFrame();
+
+ if (_input->_inputMode == Input::kInputModeGame) {
+ runScripts();
+ walk();
+ drawAnimations();
+ }
+
+ // change this to endFrame?
+ updateView();
+
+}
+
@@ -409,8 +413,8 @@ void Parallaction::doLocationEnterTransition() {
for (uint16 _si = 0; _si<6; _si++) {
pal.fadeTo(_gfx->_palette, 4);
_gfx->setPalette(pal);
- waitTime( 1 );
_gfx->updateScreen();
+ g_system->delayMillis(20);
}
_gfx->setPalette(_gfx->_palette);
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index 4a14201164..f639185580 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -259,8 +259,6 @@ public:
Input *_input;
- void waitTime(uint32 t);
-
OpcodeSet _commandOpcodes;
struct ParallactionStruct1 {
@@ -368,8 +366,6 @@ protected: // members
void initGlobals();
void runGame();
void updateView();
- uint32 getElapsedTime();
- void resetTimer();
void scheduleLocationSwitch(const char *location);
void doLocationEnterTransition();
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index 81141454b6..8e0f83d46d 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -299,7 +299,7 @@ void Parallaction_ns::changeLocation(char *location) {
_gfx->setFloatingLabel(0);
_gfx->freeLabels();
- _input->_hoverZone = nullZonePtr;
+ _input->stopHovering();
if (_engineFlags & kEngineBlockInput) {
setArrowCursor();
}
diff --git a/engines/saga/actor.cpp b/engines/saga/actor.cpp
index 52b921d000..96d901fbba 100644
--- a/engines/saga/actor.cpp
+++ b/engines/saga/actor.cpp
@@ -31,7 +31,6 @@
#include "saga/events.h"
#include "saga/isomap.h"
#include "saga/objectmap.h"
-#include "saga/sagaresnames.h"
#include "saga/rscfile.h"
#include "saga/script.h"
#include "saga/sndres.h"
@@ -997,7 +996,7 @@ void Actor::createDrawOrderList() {
}
bool Actor::getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber, SpriteList *&spriteList) {
- if (_vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
+ if (_vm->_scene->currentSceneResourceId() == ITE_SCENE_OVERMAP) {
if (!(commonObjectData->_flags & kProtagonist)){
// warning("not protagonist");
return false;
diff --git a/engines/saga/actor_walk.cpp b/engines/saga/actor_walk.cpp
index 0c573c0c40..d62c1c61d7 100644
--- a/engines/saga/actor_walk.cpp
+++ b/engines/saga/actor_walk.cpp
@@ -30,7 +30,6 @@
#include "saga/events.h"
#include "saga/isomap.h"
#include "saga/objectmap.h"
-#include "saga/sagaresnames.h"
#include "saga/script.h"
#include "saga/sound.h"
#include "saga/scene.h"
@@ -209,7 +208,7 @@ void Actor::updateActorsScene(int actorsEntrance) {
actor->_finalTarget = actor->_location;
_centerActor = _protagonist = actor;
} else if (_vm->getGameType() == GType_ITE &&
- _vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
+ _vm->_scene->currentSceneResourceId() == ITE_SCENE_OVERMAP) {
continue;
}
@@ -416,7 +415,7 @@ void Actor::handleActions(int msec, bool setup) {
speed = 4;
}
- if (_vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
+ if (_vm->_scene->currentSceneResourceId() == ITE_SCENE_OVERMAP) {
speed = 2;
}
diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp
index b7d2a3aa39..7fd1024405 100644
--- a/engines/saga/detection.cpp
+++ b/engines/saga/detection.cpp
@@ -36,7 +36,6 @@
#include "saga/rscfile.h"
#include "saga/interface.h"
#include "saga/scene.h"
-#include "saga/sagaresnames.h"
namespace Saga {
struct SAGAGameDescription {
@@ -63,10 +62,7 @@ const GameSoundInfo *SagaEngine::getSfxInfo() const { return _gameDescription->s
const GameSoundInfo *SagaEngine::getMusicInfo() const {
static GameSoundInfo musicInfo;
musicInfo.resourceType = kSoundPCM;
- musicInfo.frequency = 11025;
musicInfo.sampleBits = 16;
- // The digital music in the ITE Mac demo version is not stereo
- musicInfo.stereo = _gameDescription->gameType == GID_ITE_MACDEMO2 ? false : true;
musicInfo.isBigEndian = false;
musicInfo.isSigned = true;
diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h
index 0017f34957..cbc3152f70 100644
--- a/engines/saga/detection_tables.h
+++ b/engines/saga/detection_tables.h
@@ -28,71 +28,81 @@
namespace Saga {
static const GameResourceDescription ITE_Resources = {
- RID_ITE_SCENE_LUT, // Scene lookup table RN
- RID_ITE_SCRIPT_LUT, // Script lookup table RN
- RID_ITE_MAIN_PANEL,
- RID_ITE_CONVERSE_PANEL,
- RID_ITE_OPTION_PANEL,
- 0, // Warning panel (IHNM only)
- 0, // Warning panel sprites (IHNM only)
- RID_ITE_MAIN_SPRITES,
- RID_ITE_MAIN_PANEL_SPRITES,
- 0, // Option panel sprites (IHNM only)
- RID_ITE_DEFAULT_PORTRAITS,
- 0, // Psychic profile background (IHNM only)
- RID_ITE_MAIN_STRINGS,
- RID_ITE_ACTOR_NAMES
+ 1806, // Scene lookup table RN
+ 216, // Script lookup table RN
+ 3, // Main panel
+ 4, // Converse panel
+ 5, // Option panel
+ 6, // Main sprites
+ 7, // Main panel sprites
+ 35, // Main strings
+ // ITE specific resources
+ 36, // Actor names
+ 125, // Default portraits
+ // IHNM specific resources
+ 0, // Option panel sprites
+ 0, // Warning panel
+ 0, // Warning panel sprites
+ 0 // Psychic profile background
};
+// FIXME: Option panel should be 4 but it is an empty resource.
+// Proper fix would be to not load the options panel when the demo is running
static const GameResourceDescription ITEDemo_Resources = {
- RID_ITEDEMO_SCENE_LUT, // Scene lookup table RN
- RID_ITEDEMO_SCRIPT_LUT, // Script lookup table RN
- RID_ITEDEMO_MAIN_PANEL,
- RID_ITEDEMO_CONVERSE_PANEL,
- RID_ITEDEMO_OPTION_PANEL,
- 0, // Warning panel (IHNM only)
- 0, // Warning panel sprites (IHNM only)
- RID_ITEDEMO_MAIN_SPRITES,
- RID_ITEDEMO_MAIN_PANEL_SPRITES,
- 0, // Option panel sprites (IHNM only)
- RID_ITEDEMO_DEFAULT_PORTRAITS,
- 0, // Psychic profile background (IHNM only)
- RID_ITEDEMO_MAIN_STRINGS,
- RID_ITEDEMO_ACTOR_NAMES
+ 318, // Scene lookup table RN
+ 146, // Script lookup table RN
+ 2, // Main panel
+ 3, // Converse panel
+ 3, // Option panel
+ 5, // Main sprites
+ 6, // Main panel sprites
+ 8, // Main strings
+ // ITE specific resources
+ 9, // Actor names
+ 80, // Default portraits
+ // IHNM specific resources
+ 0, // Option panel sprites
+ 0, // Warning panel
+ 0, // Warning panel sprites
+ 0 // Psychic profile background
};
static const GameResourceDescription IHNM_Resources = {
- RID_IHNM_SCENE_LUT, // Scene lookup table RN
- RID_IHNM_SCRIPT_LUT, // Script lookup table RN
- RID_IHNM_MAIN_PANEL,
- RID_IHNM_CONVERSE_PANEL,
- RID_IHNM_OPTION_PANEL,
- RID_IHNM_WARNING_PANEL,
- RID_IHNM_WARNING_PANEL_SPRITES,
- RID_IHNM_MAIN_SPRITES,
- RID_IHNM_MAIN_PANEL_SPRITES,
- RID_IHNM_OPTION_PANEL_SPRITES,
- 0, // Default portraits (ITE only)
- RID_IHNM_PROFILE_BG,
- RID_IHNM_MAIN_STRINGS,
- 0 // Actors strings (ITE only)
+ 1272, // Scene lookup table RN
+ 29, // Script lookup table RN
+ 9, // Main panel
+ 10, // Converse panel
+ 15, // Option panel
+ 12, // Main sprites
+ 12, // Main panel sprites
+ 21, // Main strings
+ // ITE specific resources
+ 0, // Actor names
+ 0, // Default portraits
+ // IHNM specific resources
+ 16, // Option panel sprites
+ 17, // Warning panel
+ 18, // Warning panel sprites
+ 20 // Psychic profile background
};
static const GameResourceDescription IHNMDEMO_Resources = {
- RID_IHNMDEMO_SCENE_LUT, // Scene lookup table RN
- RID_IHNMDEMO_SCRIPT_LUT, // Script lookup table RN
- RID_IHNMDEMO_MAIN_PANEL,
- RID_IHNMDEMO_CONVERSE_PANEL,
- RID_IHNMDEMO_OPTION_PANEL,
- RID_IHNMDEMO_WARNING_PANEL,
- RID_IHNMDEMO_WARNING_PANEL_SPRITES,
- RID_IHNMDEMO_MAIN_SPRITES,
- RID_IHNMDEMO_MAIN_PANEL_SPRITES,
- RID_IHNMDEMO_OPTION_PANEL_SPRITES,
- 0, // Default portraits (ITE only)
- RID_IHNMDEMO_PROFILE_BG,
- RID_IHNMDEMO_MAIN_STRINGS,
- 0 // Actors strings (ITE only)
+ 286, // Scene lookup table RN
+ 18, // Script lookup table RN
+ 5, // Main panel
+ 6, // Converse panel
+ 10, // Option panel
+ 7, // Main sprites
+ 7, // Main panel sprites
+ 16, // Main strings
+ // ITE specific resources
+ 0, // Actor names
+ 0, // Default portraits
+ // IHNM specific resources
+ 11, // Option panel sprites
+ 12, // Warning panel
+ 13, // Warning panel sprites
+ 15 // Psychic profile background
};
static const GameFontDescription ITEDEMO_GameFonts[] = { {0}, {1} };
@@ -102,14 +112,14 @@ static const GameFontDescription IHNMDEMO_GameFonts[] = { {2}, {3}, {4} };
// Font 6 is kIHNMFont8, font 8 is kIHNMMainFont
static const GameFontDescription IHNMCD_GameFonts[] = { {2}, {3}, {4}, {5}, {6}, {7}, {8} };
-// frequency, sampleBits, stereo, isBigEndian, isSigned
-static const GameSoundInfo ITEPC_GameSound = { kSoundPCM, 22050, 16, false, false, true };
-static const GameSoundInfo ITEWINDEMO1_GameSound = { kSoundPCM, 22050, 8, false, false, false };
-static const GameSoundInfo ITEMACCD_G_GameSound = { kSoundMacPCM, 22050, 8, false, false, false };
-static const GameSoundInfo ITEDISK_GameSound = { kSoundVOC, -1, -1, false, false, true };
-static const GameSoundInfo ITEDEMO_GameVoice = { kSoundVOX, 22050, 16, false, false, true };
-static const GameSoundInfo IHNM_GameSound = { kSoundWAV, -1, -1, false, false, true };
-static const GameSoundInfo MAC_GameSound = { kSoundPCM, 22050, 16, false, true, true };
+// sampleBits, isBigEndian, isSigned
+static const GameSoundInfo ITEPC_GameSound = { kSoundPCM, 16, false, true };
+static const GameSoundInfo ITEWINDEMO1_GameSound = { kSoundPCM, 8, false, false };
+static const GameSoundInfo ITEMACCD_G_GameSound = { kSoundMacPCM, 8, false, false };
+static const GameSoundInfo ITEDISK_GameSound = { kSoundVOC, -1, false, true };
+static const GameSoundInfo ITEDEMO_GameVoice = { kSoundVOX, 16, false, true };
+static const GameSoundInfo IHNM_GameSound = { kSoundWAV, -1, false, true };
+static const GameSoundInfo MAC_GameSound = { kSoundPCM, 16, true, true };
// Patch files. Files not found will be ignored
static const GamePatchDescription ITEPatch_Files[] = {
diff --git a/engines/saga/gfx.cpp b/engines/saga/gfx.cpp
index d1f592e38b..85416991db 100644
--- a/engines/saga/gfx.cpp
+++ b/engines/saga/gfx.cpp
@@ -28,7 +28,6 @@
#include "saga/saga.h"
#include "saga/gfx.h"
#include "saga/interface.h"
-#include "saga/sagaresnames.h"
#include "saga/rscfile.h"
#include "saga/scene.h"
@@ -37,6 +36,9 @@
namespace Saga {
+#define RID_IHNM_DEFAULT_PALETTE 1
+#define RID_IHNM_HOURGLASS_CURSOR 11 // not in demo
+
Gfx::Gfx(SagaEngine *vm, OSystem *system, int width, int height) : _vm(vm), _system(system) {
_system->beginGFXTransaction();
_vm->initCommonGFX(width > 320);
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp
index ef31b85156..fe1ee0eefc 100644
--- a/engines/saga/interface.cpp
+++ b/engines/saga/interface.cpp
@@ -43,7 +43,6 @@
#include "saga/sound.h"
#include "saga/sprite.h"
#include "saga/rscfile.h"
-#include "saga/sagaresnames.h"
#include "saga/interface.h"
@@ -477,9 +476,9 @@ void Interface::setMode(int mode) {
bool Interface::processAscii(Common::KeyState keystate) {
// TODO: Checking for Esc and Enter below is a bit hackish, and
- // and probably only works with the English version. Maybe we should
- // add a flag to the button so it can indicate if it's the default or
- // cancel button?
+ // probably only works with the English version. Maybe we should
+ // add a flag to the button so it can indicate if it's the default
+ // or cancel button?
uint16 ascii = keystate.ascii;
int i;
PanelButton *panelButton;
@@ -2755,7 +2754,7 @@ void Interface::mapPanelDrawCrossHair() {
if (screen.contains(mapPosition)) {
_vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _vm->_sprite->_mainSprites,
- _mapPanelCrossHairState? RID_ITE_SPR_XHAIR1 : RID_ITE_SPR_XHAIR2,
+ _mapPanelCrossHairState? RID_ITE_SPR_CROSSHAIR : RID_ITE_SPR_CROSSHAIR + 1,
mapPosition, 256);
}
}
diff --git a/engines/saga/interface.h b/engines/saga/interface.h
index af59fe64d2..74cf5ace44 100644
--- a/engines/saga/interface.h
+++ b/engines/saga/interface.h
@@ -56,6 +56,10 @@ enum InterfaceUpdateFlags {
#define STATUS_TEXT_LEN 128
#define STATUS_TEXT_INPUT_MAX 256
+#define RID_IHNM_BOSS_SCREEN 19 // not in demo
+#define RID_ITE_TYCHO_MAP 1686
+#define RID_ITE_SPR_CROSSHAIR (73 + 9)
+
// Converse-specific stuff
enum PanelModes {
diff --git a/engines/saga/ihnm_introproc.cpp b/engines/saga/introproc_ihnm.cpp
index 5f1d0157d5..5f1d0157d5 100644
--- a/engines/saga/ihnm_introproc.cpp
+++ b/engines/saga/introproc_ihnm.cpp
diff --git a/engines/saga/ite_introproc.cpp b/engines/saga/introproc_ite.cpp
index 2aa263b097..a33a55c375 100644
--- a/engines/saga/ite_introproc.cpp
+++ b/engines/saga/introproc_ite.cpp
@@ -36,7 +36,6 @@
#include "saga/music.h"
#include "saga/scene.h"
-#include "saga/sagaresnames.h"
#include "saga/rscfile.h"
namespace Saga {
@@ -46,6 +45,21 @@ using Common::EN_ANY;
using Common::DE_DEU;
using Common::IT_ITA;
+// Intro scenes
+#define RID_ITE_INTRO_ANIM_SCENE 1538
+#define RID_ITE_CAVE_SCENE_1 1542
+#define RID_ITE_CAVE_SCENE_2 1545
+#define RID_ITE_CAVE_SCENE_3 1548
+#define RID_ITE_CAVE_SCENE_4 1551
+#define RID_ITE_VALLEY_SCENE 1556
+#define RID_ITE_TREEHOUSE_SCENE 1560
+#define RID_ITE_FAIREPATH_SCENE 1564
+#define RID_ITE_FAIRETENT_SCENE 1567
+
+// ITE intro music
+#define MUSIC_1 9
+#define MUSIC_2 10
+
LoadSceneParams ITE_IntroList[] = {
{RID_ITE_INTRO_ANIM_SCENE, kLoadByResourceId, NULL, Scene::SC_ITEIntroAnimProc, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
{RID_ITE_CAVE_SCENE_1, kLoadByResourceId, NULL, Scene::SC_ITEIntroCave1Proc, false, kTransitionFade, 0, NO_CHAPTER_CHANGE},
@@ -380,63 +394,65 @@ int Scene::ITEIntroCave1Proc(int param) {
static const IntroDialogue dialogue[][4] = {
{ { // English
- RID_CAVE_VOICE_0,
+ 0, // cave voice 0
"We see the sky, we see the land, we see the water, "
"and we wonder: Are we the only ones?"
},
{
- RID_CAVE_VOICE_1,
+ 1, // cave voice 1
"Long before we came to exist, the humans ruled the "
"Earth."
},
{
- RID_CAVE_VOICE_2,
+ 2, // cave voice 2
"They made marvelous things, and moved whole "
"mountains."
},
{
- RID_CAVE_VOICE_3,
+ 3, // cave voice 3
"They knew the Secret of Flight, the Secret of "
"Happiness, and other secrets beyond our imagining."
} },
+ // -----------------------------------------------------
{ { // German
- RID_CAVE_VOICE_0,
+ 0, // cave voice 0
"Um uns sind der Himmel, das Land und die Seen; und "
"wir fragen uns - sind wir die einzigen?"
},
{
- RID_CAVE_VOICE_1,
+ 1, // cave voice 1
"Lange vor unserer Zeit herrschten die Menschen "
"\201ber die Erde."
},
{
- RID_CAVE_VOICE_2,
+ 2, // cave voice 2
"Sie taten wundersame Dinge und versetzten ganze "
"Berge."
},
{
- RID_CAVE_VOICE_3,
+ 3, // cave voice 3
"Sie kannten das Geheimnis des Fluges, das Geheimnis "
"der Fr\224hlichkeit und andere Geheimnisse, die "
"unsere Vorstellungskraft \201bersteigen."
} },
+ // -----------------------------------------------------
{ { // Italian fan translation
- RID_CAVE_VOICE_0,
+ 0, // cave voice 0
"Guardiamo il cielo, guardiamo la terra, guardiamo "
"l'acqua, e ci chiediamo: Siamo forse soli?"
},
{
- RID_CAVE_VOICE_1,
+ 1, // cave voice 1
"Molto tempo prima che noi esistessimo, gli Umani "
"dominavano la terra."
},
{
- RID_CAVE_VOICE_2,
+ 2, // cave voice 2
"Fecero cose meravigliose, e mossero intere "
"montagne."
},
{
- RID_CAVE_VOICE_3,
+ 3, // cave voice 3
"Conoscevano il Segreto del Volo, il Segreto della "
"Felicit\224, ed altri segreti oltre ogni nostra "
"immaginazione."
@@ -493,47 +509,49 @@ int Scene::ITEIntroCave2Proc(int param) {
static const IntroDialogue dialogue[][3] = {
{ { // English
- RID_CAVE_VOICE_4,
+ 4, // cave voice 4
"The humans also knew the Secret of Life, and they "
"used it to give us the Four Great Gifts:"
},
{
- RID_CAVE_VOICE_5,
+ 5, // cave voice 5
"Thinking minds, feeling hearts, speaking mouths, and "
"reaching hands."
},
{
- RID_CAVE_VOICE_6,
+ 6, // cave voice 6
"We are their children."
} },
+ // -----------------------------------------------------
{ { // German
- RID_CAVE_VOICE_4,
+ 4, // cave voice 4
"Au$erdem kannten die Menschen das Geheimnis des "
"Lebens. Und sie nutzten es, um uns die vier gro$en "
"Geschenke zu geben -"
},
{
- RID_CAVE_VOICE_5,
+ 5, // cave voice 5
"den denkenden Geist, das f\201hlende Herz, den "
"sprechenden Mund und die greifende Hand."
},
{
- RID_CAVE_VOICE_6,
+ 6, // cave voice 6
"Wir sind ihre Kinder."
} },
+ // -----------------------------------------------------
{ { // Italian fan translation
- RID_CAVE_VOICE_4,
+ 4, // cave voice 4
"Gli Umani conoscevano anche il Segreto della Vita, "
"e lo usarono per darci i Quattro Grandi Doni:"
},
{
- RID_CAVE_VOICE_5,
+ 5, // cave voice 5
"Il pensiero, le emozioni, la parola e la manualit\224."
},
{
- RID_CAVE_VOICE_6,
+ 6, // cave voice 6
"Siamo i loro figli."
} }
};
@@ -595,46 +613,48 @@ int Scene::ITEIntroCave3Proc(int param) {
static const IntroDialogue dialogue[][3] = {
{ { // English
- RID_CAVE_VOICE_7,
+ 7, // cave voice 7
"They taught us how to use our hands, and how to "
"speak."
},
{
- RID_CAVE_VOICE_8,
+ 8, // cave voice 8
"They showed us the joy of using our minds."
},
{
- RID_CAVE_VOICE_9,
+ 9, // cave voice 9
"They loved us, and when we were ready, they surely "
"would have given us the Secret of Happiness."
} },
+ // -----------------------------------------------------
{ { // German
- RID_CAVE_VOICE_7,
+ 7, // cave voice 7
"Sie lehrten uns zu sprechen und unsere H\204nde zu "
"benutzen."
},
{
- RID_CAVE_VOICE_8,
+ 8, // cave voice 8
"Sie zeigten uns die Freude am Denken."
},
{
- RID_CAVE_VOICE_9,
+ 9, // cave voice 9
"Sie liebten uns, und w\204ren wir bereit gewesen, "
"h\204tten sie uns sicherlich das Geheimnis der "
"Fr\224hlichkeit offenbart."
} },
+ // -----------------------------------------------------
{ { // Italian fan translation
- RID_CAVE_VOICE_7,
+ 7, // cave voice 7
"Ci insegnarono come usare le mani e come parlare. "
},
{
- RID_CAVE_VOICE_8,
+ 8, // cave voice 8
"Ci mostrarono le gioie che l'uso della mente "
"pu\242 dare. "
},
{
- RID_CAVE_VOICE_9,
+ 9, // cave voice 9
"Ci amarono, ed una volta pronti, ci avrebbero "
"sicuramente svelato il Segreto della Felicit\224."
@@ -698,60 +718,62 @@ int Scene::ITEIntroCave4Proc(int param) {
static const IntroDialogue dialogue[][4] = {
{ { // English
- RID_CAVE_VOICE_10,
+ 10, // cave voice 10
"And now we see the sky, the land, and the water that "
"we are heirs to, and we wonder: why did they leave?"
},
{
- RID_CAVE_VOICE_11,
+ 11, // cave voice 11
"Do they live still, in the stars? In the oceans "
"depths? In the wind?"
},
{
- RID_CAVE_VOICE_12,
+ 12, // cave voice 12
"We wonder, was their fate good or evil?"
},
{
- RID_CAVE_VOICE_13,
+ 13, // cave voice 13
"And will we also share the same fate one day?"
} },
+ // -----------------------------------------------------
{ { // German
- RID_CAVE_VOICE_10,
+ 10, // cave voice 10
"Und nun sehen wir den Himmel, das Land und die "
"Seen - unser Erbe. Und wir fragen uns - warum "
"verschwanden sie?"
},
{
- RID_CAVE_VOICE_11,
+ 11, // cave voice 11
"Leben sie noch in den Sternen? In den Tiefen des "
"Ozeans? Im Wind?"
},
{
- RID_CAVE_VOICE_12,
+ 12, // cave voice 12
"Wir fragen uns - war ihr Schicksal gut oder b\224se?"
},
{
- RID_CAVE_VOICE_13,
+ 13, // cave voice 13
"Und wird uns eines Tages das gleiche Schicksal "
"ereilen?"
} },
+ // -----------------------------------------------------
{ { // Italian fan translation
- RID_CAVE_VOICE_10,
+ 10, // cave voice 10
"Ed ora che guardiamo il cielo, la terra e l'acqua "
"che abbiamo ereditato, pensiamo: Perch\233 partirono?"
},
{
- RID_CAVE_VOICE_11,
+ 11, // cave voice 11
"Vivono ancora, nelle stelle? Nelle profondit\224 "
"dell'oceano? Nel vento?"
},
{
- RID_CAVE_VOICE_12,
+ 12, // cave voice 12
"Ci domandiamo, il loro destino fu felice o nefasto?"
},
{
- RID_CAVE_VOICE_13,
+ 13, // cave voice 13
"E un giorno, condivideremo anche noi lo stesso "
"destino?"
} }
diff --git a/engines/saga/isomap.cpp b/engines/saga/isomap.cpp
index 7a6d6a4398..e607adb4cb 100644
--- a/engines/saga/isomap.cpp
+++ b/engines/saga/isomap.cpp
@@ -27,7 +27,6 @@
#include "saga/saga.h"
#include "saga/gfx.h"
-#include "saga/sagaresnames.h"
#include "saga/scene.h"
#include "saga/isomap.h"
@@ -285,7 +284,7 @@ void IsoMap::adjustScroll(bool jump) {
tileCoordsToScreenPoint(_vm->_actor->_centerActor->_location, playerPoint);
- if (_vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
+ if (_vm->_scene->currentSceneResourceId() == ITE_SCENE_OVERMAP) {
_mapPosition.x = (playerPoint.x + _viewScroll.x) * 30 / 100 - (381);
_mapPosition.y = (playerPoint.y + _viewScroll.y) * 30 / 100 - (342);
}
@@ -322,7 +321,7 @@ void IsoMap::adjustScroll(bool jump) {
_viewScroll.x = smoothSlide( _viewScroll.x, minScrollPos.x, maxScrollPos.x );
}
- if (_vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
+ if (_vm->_scene->currentSceneResourceId() == ITE_SCENE_OVERMAP) {
ObjectData *obj;
uint16 objectId;
objectId = _vm->_actor->objIndexToId(ITE_OBJ_MAP);
@@ -1510,7 +1509,7 @@ void IsoMap::findTilePath(ActorData* actor, const Location &start, const Locatio
memset( &_searchArray, 0, sizeof(_searchArray));
if (!(actor->_actorFlags & kActorNoCollide) &&
- (_vm->_scene->currentSceneResourceId() != RID_ITE_OVERMAP_SCENE)) {
+ (_vm->_scene->currentSceneResourceId() != ITE_SCENE_OVERMAP)) {
for (i = 0; i < _vm->_actor->_actorsCount; i++) {
other = _vm->_actor->_actors[i];
if (!other->_inScene) continue;
@@ -1664,7 +1663,7 @@ void IsoMap::screenPointToTileCoords(const Point &position, Location &location)
Point mPos(position);
int x,y;
- if (_vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE){
+ if (_vm->_scene->currentSceneResourceId() == ITE_SCENE_OVERMAP){
if (mPos.y < 16) {
mPos.y = 16;
}
diff --git a/engines/saga/isomap.h b/engines/saga/isomap.h
index c79ae7cd0a..eb548ce5dc 100644
--- a/engines/saga/isomap.h
+++ b/engines/saga/isomap.h
@@ -32,6 +32,8 @@
namespace Saga {
+#define ITE_OBJ_MAP 14
+
#define SAGA_ISOTILEDATA_LEN 8
#define SAGA_ISOTILE_WIDTH 32
#define SAGA_ISOTILE_BASEHEIGHT 15
diff --git a/engines/saga/itedata.cpp b/engines/saga/itedata.cpp
index 1274f72b45..43c3d21012 100644
--- a/engines/saga/itedata.cpp
+++ b/engines/saga/itedata.cpp
@@ -26,7 +26,6 @@
// Actor and Object data tables
#include "saga/saga.h"
#include "saga/itedata.h"
-#include "saga/sagaresnames.h"
#include "saga/sndres.h"
namespace Saga {
@@ -245,7 +244,7 @@ ObjectTableData ITE_ObjectTable[ITE_OBJECTCOUNT] = {
{ 23, 0, 480, 480, 0, 24, 23, 0 }, // Silver Medallion
{ 24, 0, 480, 480, 0, 25, 24, 0 }, // Mud in Fur
{ 25, 0, 480, 480, 0, 26, 25, 0 }, // Gold Ring
- { 27, 13, 1036, 572, 40, 47, 14, kObjUseWith }, // Screwdriver
+ { 27, 13, 1036, 572, 40, 47, 14, kObjUseWith }, // Screwdriver
{ 28, 0, 480, 480, 0, 29, 26, 0 }, // Apple Token
{ 29, 0, 480, 480, 0, 30, 22, kObjUseWith }, // Letter from Elara
{ 30, 0, 164, 440, 0, 31, 16, kObjUseWith }, // Spoon
@@ -258,82 +257,86 @@ ObjectTableData ITE_ObjectTable[ITE_OBJECTCOUNT] = {
{ 40, 269, 644, 416, 0, 41, 39, kObjNotFlat }, // Electrical Cable
{ 41, 12, 280, 516, 0, 43, 17, kObjUseWith }, // Piece of flint
{ 42, 5, 876, 332, 32, 65, 18, 0 }, // Rat Cloak
- { 43, 52, 556, 1612, 0, 49, 28, kObjUseWith | kObjNotFlat }, // Bucket
+ { 43, 52, 556, 1612, 0, 49, 28, kObjUseWith |
+ kObjNotFlat }, // Bucket
{ 48, 52, 732, 948, 0, 50, 27, kObjUseWith }, // Cup
{ 49, 52, 520, 1872, 0, 53, 29, 0 }, // Fertilizer
{ 50, 52, 1012, 1268, 0, 52, 30, 0 }, // Feeder
- { 51, 252, -20, -20, 0, 71, 32, kObjUseWith | kObjNotFlat }, // Bowl in jail cell
+ { 51, 252, -20, -20, 0, 71, 32, kObjUseWith |
+ kObjNotFlat }, // Bowl in jail cell
{ 53, 252, 1148, 388, 0, 70, 33, 0 }, // Loose stone block in jail cell
{ 26, 12, 496, 368, 0, 76, 31, 0 }, // Coil of Rope from Quarry
{ 54, 281, 620, 352, 0, 80, 46, 0 } // Orb of Storms in Dam Lab
};
FxTable ITE_SfxTable[ITE_SFXCOUNT] = {
- { FX_DOOR_OPEN, 127 },
- { FX_DOOR_CLOSE, 127 },
- { FX_RUSH_WATER, 63 }, // Floppy volume: 127
- { FX_RUSH_WATER, 26 }, // Floppy volume: 40
- { FX_CRICKET, 64 },
- { FX_PORTICULLIS, 84 }, // Floppy volume: 127
- { FX_CLOCK_1, 64 },
- { FX_CLOCK_2, 64 },
- { FX_DAM_MACHINE, 64 },
- { FX_DAM_MACHINE, 40 },
- { FX_HUM1, 64 },
- { FX_HUM2, 64 },
- { FX_HUM3, 64 },
- { FX_HUM4, 64 },
- { FX_WATER_LOOP_S, 32 }, // Floppy volume: 64
- { FX_SURF, 42 }, // Floppy volume: 127
- { FX_SURF, 32 }, // Floppy volume: 64
- { FX_FIRELOOP, 64 }, // Floppy volume: 96
- { FX_SCRAPING, 84 }, // Floppy volume: 127
- { FX_BEE_SWARM, 64 }, // Floppy volume: 96
- { FX_BEE_SWARM, 26 }, // Floppy volume: 40
- { FX_SQUEAKBOARD, 64 },
- { FX_KNOCK, 127 },
- { FX_COINS, 32 }, // Floppy volume: 48
- { FX_STORM, 84 }, // Floppy volume: 127
- { FX_DOOR_CLOSE_2, 84 }, // Floppy volume: 127
- { FX_ARCWELD, 84 }, // Floppy volume: 127
- { FX_RETRACT_ORB, 127 },
- { FX_DRAGON, 127 },
- { FX_SNORES, 127 },
- { FX_SPLASH, 127 },
- { FX_LOBBY_DOOR, 127 },
- { FX_CHIRP_LOOP, 26 }, // Floppy volume: 40
- { FX_DOOR_CREAK, 96 },
- { FX_SPOON_DIG, 64 },
- { FX_CROW, 96 },
- { FX_COLDWIND, 42 }, // Floppy volume: 64
- { FX_TOOL_SND_1, 96 },
- { FX_TOOL_SND_2, 127 },
- { FX_TOOL_SND_3, 64 },
- { FX_DOOR_METAL, 96 },
- { FX_WATER_LOOP_S, 32 },
- { FX_WATER_LOOP_L, 32 }, // Floppy volume: 64
- { FX_DOOR_OPEN_2, 127 },
- { FX_JAIL_DOOR, 64 },
- { FX_KILN_FIRE, 53 }, // Floppy volume: 80
-
- // Only in the CD version
- { FX_CROWD_01, 64 },
- { FX_CROWD_02, 64 },
- { FX_CROWD_03, 64 },
- { FX_CROWD_04, 64 },
- { FX_CROWD_05, 64 },
- { FX_CROWD_06, 64 },
- { FX_CROWD_07, 64 },
- { FX_CROWD_08, 64 },
- { FX_CROWD_09, 64 },
- { FX_CROWD_10, 64 },
- { FX_CROWD_11, 64 },
- { FX_CROWD_12, 64 },
- { FX_CROWD_13, 64 },
- { FX_CROWD_14, 64 },
- { FX_CROWD_15, 64 },
- { FX_CROWD_16, 64 },
- { FX_CROWD_17, 64 }
+ { 14, 127 }, // Door open
+ { 15, 127 }, // Door close
+ { 16, 63 }, // Rush water (floppy volume: 127)
+ { 16, 26 }, // Rush water (floppy volume: 40)
+ { 17, 64 }, // Cricket
+ { 18, 84 }, // Porticullis (floppy volume: 127)
+ { 19, 64 }, // Clock 1
+ { 20, 64 }, // Clock 2
+ { 21, 64 }, // Dam machine
+ { 21, 40 }, // Dam machine
+ { 22, 64 }, // Hum 1
+ { 23, 64 }, // Hum 2
+ { 24, 64 }, // Hum 3
+ { 25, 64 }, // Hum 4
+ // Note: the following effect was set to 51 for
+ // some unknown reason
+ { 26, 32 }, // Stream
+ { 27, 42 }, // Surf (floppy volume: 127)
+ { 27, 32 }, // Surf (floppy volume: 64)
+ { 28, 64 }, // Fire loop (floppy volume: 96)
+ { 29, 84 }, // Scraping (floppy volume: 127)
+ { 30, 64 }, // Bee swarm (floppy volume: 96)
+ { 30, 26 }, // Bee swarm (floppy volume: 40)
+ { 31, 64 }, // Squeaky board
+ { 32, 127 }, // Knock
+ { 33, 32 }, // Coins (floppy volume: 48)
+ { 34, 84 }, // Storm (floppy volume: 127)
+ { 35, 84 }, // Door close 2 (floppy volume: 127)
+ { 36, 84 }, // Arcweld (floppy volume: 127)
+ { 37, 127 }, // Retract orb
+ { 38, 127 }, // Dragon
+ { 39, 127 }, // Snores
+ { 40, 127 }, // Splash
+ { 41, 127 }, // Lobby door
+ { 42, 26 }, // Chirp loop (floppy volume: 40)
+ { 43, 96 }, // Door creak
+ { 44, 64 }, // Spoon dig
+ { 45, 96 }, // Crow
+ { 46, 42 }, // Cold wind (floppy volume: 64)
+ { 47, 96 }, // Tool sound 1
+ { 48, 127 }, // Tool sound 2
+ { 49, 64 }, // Tool sound 3
+ { 50, 96 }, // Metal door
+ { 51, 32 }, // Water loop S
+ { 52, 32 }, // Water loop L (floppy volume: 64)
+ { 53, 127 }, // Door open 2
+ { 54, 64 }, // Jail door
+ { 55, 53 }, // Killing fire (floppy volume: 80)
+ //{ 56, 0 }, // Dummy FX
+ // Crowd effects, which exist only in the CD version
+ { 57, 64 },
+ { 58, 64 },
+ { 59, 64 },
+ { 60, 64 },
+ { 61, 64 },
+ { 62, 64 },
+ { 63, 64 },
+ { 64, 64 },
+ { 65, 64 },
+ { 66, 64 },
+ { 67, 64 },
+ { 68, 64 },
+ { 69, 64 },
+ { 70, 64 },
+ { 71, 64 },
+ { 72, 64 },
+ { 73, 64 }
};
const char *ITEinterfaceTextStrings[][52] = {
@@ -493,14 +496,6 @@ const char *solicitStr[][NUM_SOLICIT_REPLIES] = {
}
};
-const char portraitList[] = {
- RID_ITE_JFERRET_SERIOUS,
- RID_ITE_JFERRET_GOOFY,
- RID_ITE_JFERRET_SERIOUS,
- RID_ITE_JFERRET_GOOFY,
- RID_ITE_JFERRET_ALOOF
-};
-
const char *sakkaStr[][NUM_SAKKA] = {
{ "Hey, you're not supposed to help the applicants!",
"Guys! This is supposed to be a test!",
diff --git a/engines/saga/module.mk b/engines/saga/module.mk
index 76783a17ae..b1929361a2 100644
--- a/engines/saga/module.mk
+++ b/engines/saga/module.mk
@@ -11,11 +11,11 @@ MODULE_OBJS := \
font.o \
font_map.o \
gfx.o \
- ihnm_introproc.o \
image.o \
interface.o \
+ introproc_ihnm.o \
+ introproc_ite.o \
isomap.o \
- ite_introproc.o \
itedata.o \
objectmap.o \
puzzle.o \
diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp
index 1cbc38dfb5..732bd0b50c 100644
--- a/engines/saga/music.cpp
+++ b/engines/saga/music.cpp
@@ -28,7 +28,6 @@
#include "saga/saga.h"
#include "saga/rscfile.h"
-#include "saga/sagaresnames.h"
#include "saga/music.h"
#include "sound/audiostream.h"
@@ -40,6 +39,7 @@
namespace Saga {
#define BUFFER_SIZE 4096
+#define MUSIC_SUNSPOT 26
class DigitalMusicInputStream : public Audio::AudioStream {
private:
@@ -58,6 +58,7 @@ private:
const int16 *_pos;
const GameSoundInfo *_musicInfo;
MemoryReadStream *_memoryStream;
+ SagaEngine *_vm;
void refill();
bool eosIntern() const {
@@ -73,18 +74,21 @@ public:
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const { return eosIntern(); }
- bool isStereo() const { return _musicInfo->stereo; }
- int getRate() const { return _musicInfo->frequency; }
+ bool isStereo() const {
+ // The digital music in the ITE Mac demo version is not stereo
+ return _vm->getGameId() == GID_ITE_MACDEMO2 ? false : true;
+ }
+ int getRate() const { return 11025; }
};
DigitalMusicInputStream::DigitalMusicInputStream(SagaEngine *vm, ResourceContext *context, uint32 resourceId, bool looping, uint32 loopStart)
- : _context(context), _finished(false), _looping(looping), _bufferEnd(_buf + BUFFER_SIZE) {
+ : _vm(vm), _context(context), _finished(false), _looping(looping), _bufferEnd(_buf + BUFFER_SIZE) {
byte compressedHeader[10];
- resourceData = vm->_resource->getResourceData(context, resourceId);
+ resourceData = _vm->_resource->getResourceData(context, resourceId);
_file = context->getFile(resourceData);
- _musicInfo = vm->getMusicInfo();
+ _musicInfo = _vm->getMusicInfo();
if (_musicInfo == NULL) {
error("DigitalMusicInputStream() wrong musicInfo");
@@ -480,7 +484,7 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
if (_digitalMusicContext != NULL) {
//TODO: check resource size
loopStart = 0;
- // fix ITE sunstatm score
+ // fix ITE sunstatm/sunspot score
if ((_vm->getGameType() == GType_ITE) && (resourceId == MUSIC_SUNSPOT)) {
loopStart = 4 * 18727;
}
@@ -557,7 +561,7 @@ void Music::play(uint32 resourceId, MusicFlags flags) {
musicFile.read(resourceData, resourceSize);
musicFile.close();
- // TODO: The Mac music format is unknown (probably TFMX?)
+ // TODO: The Mac music format is unsupported (QuickTime MIDI)
// so stop here
return;
} else {
diff --git a/engines/saga/palanim.cpp b/engines/saga/palanim.cpp
index c5129fcf06..319946f2d5 100644
--- a/engines/saga/palanim.cpp
+++ b/engines/saga/palanim.cpp
@@ -66,12 +66,7 @@ int PalAnim::loadPalAnim(const byte *resdata, size_t resdata_len) {
debug(3, "PalAnim::loadPalAnim(): Loading %d PALANIM entries.", _entryCount);
- test_p = calloc(_entryCount, sizeof(PalanimEntry));
- if (test_p == NULL) {
- warning("PalAnim::loadPalAnim(): Allocation failure");
- return MEM;
- }
-
+ test_p = malloc(_entryCount * sizeof(PalanimEntry));
_entries = (PalanimEntry *)test_p;
for (i = 0; i < _entryCount; i++) {
@@ -87,22 +82,12 @@ int PalAnim::loadPalAnim(const byte *resdata, size_t resdata_len) {
debug(2, "PalAnim::loadPalAnim(): Entry %d: Loading %d palette indices.\n", i, pal_count);
- test_p = calloc(1, sizeof(char) * pal_count);
- if (test_p == NULL) {
- warning("PalAnim::loadPalAnim(): Allocation failure");
- return MEM;
- }
-
+ test_p = malloc(sizeof(char) * pal_count);
_entries[i].pal_index = (byte *)test_p;
debug(2, "PalAnim::loadPalAnim(): Entry %d: Loading %d SAGA_COLOR structures.", i, color_count);
- test_p = calloc(1, sizeof(Color) * color_count);
- if (test_p == NULL) {
- warning("PalAnim::loadPalAnim(): Allocation failure");
- return MEM;
- }
-
+ test_p = malloc(sizeof(Color) * color_count);
_entries[i].colors = (Color *)test_p;
for (p = 0; p < pal_count; p++) {
diff --git a/engines/saga/puzzle.cpp b/engines/saga/puzzle.cpp
index 23eaa42531..2835775320 100644
--- a/engines/saga/puzzle.cpp
+++ b/engines/saga/puzzle.cpp
@@ -31,13 +31,14 @@
#include "saga/sprite.h"
#include "saga/puzzle.h"
#include "saga/render.h"
-#include "saga/sagaresnames.h"
#include "common/system.h"
#include "common/timer.h"
namespace Saga {
+#define ITE_ACTOR_PUZZLE 176
+
#define PUZZLE_X_OFFSET 72
#define PUZZLE_Y_OFFSET 46
@@ -45,6 +46,21 @@ namespace Saga {
#define PUZZLE_MOVED 0x04 // 1 when somewhere in the box
#define PUZZLE_ALL_SET PUZZLE_FIT | PUZZLE_MOVED
+// Puzzle portraits
+#define RID_ITE_SAKKA_APPRAISING 6
+#define RID_ITE_SAKKA_DENIAL 7
+#define RID_ITE_SAKKA_EXCITED 8
+#define RID_ITE_JFERRET_SERIOUS 9
+#define RID_ITE_JFERRET_GOOFY 10
+#define RID_ITE_JFERRET_ALOOF 11
+
+const char portraitList[] = {
+ RID_ITE_JFERRET_SERIOUS,
+ RID_ITE_JFERRET_GOOFY,
+ RID_ITE_JFERRET_SERIOUS,
+ RID_ITE_JFERRET_GOOFY,
+ RID_ITE_JFERRET_ALOOF
+};
enum rifOptions {
kROLater = 0,
@@ -54,7 +70,12 @@ enum rifOptions {
};
Puzzle::Puzzle(SagaEngine *vm) : _vm(vm), _solved(false), _active(false) {
- _lang = (_vm->getLanguage() == Common::DE_DEU) ? 1 : 0;
+ _lang = 0;
+
+ if (_vm->getLanguage() == Common::DE_DEU)
+ _lang = 1;
+ else if (_vm->getLanguage() == Common::IT_ITA)
+ _lang = 2;
_hintRqState = kRQNoHint;
_hintOffer = 0;
diff --git a/engines/saga/rscfile.cpp b/engines/saga/rscfile.cpp
index bd5bfdfa1d..b7d4f4f1bd 100644
--- a/engines/saga/rscfile.cpp
+++ b/engines/saga/rscfile.cpp
@@ -658,12 +658,8 @@ static int metaResourceTable[] = { 0, 326, 517, 677, 805, 968, 1165, 0, 1271 };
static int metaResourceTableDemo[] = { 0, 0, 0, 0, 0, 0, 0, 285, 0 };
void Resource::loadGlobalResources(int chapter, int actorsEntrance) {
- if (chapter < 0) {
- if (_vm->getGameId() != GID_IHNM_DEMO)
- chapter = 8;
- else
- chapter = 7;
- }
+ if (chapter < 0)
+ chapter = (_vm->getGameId() != GID_IHNM_DEMO) ? 8 : 7;
// TODO
//if (module.voiceLUT)
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index 8200526ecf..40eb32b276 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -53,7 +53,6 @@
#include "saga/music.h"
#include "saga/palanim.h"
#include "saga/objectmap.h"
-#include "saga/sagaresnames.h"
namespace Saga {
@@ -251,7 +250,7 @@ int SagaEngine::go() {
_scene->changeScene(ConfMan.getInt("start_scene"), 0, kTransitionNoFade);
} else if (ConfMan.hasKey("boot_param")) {
if (getGameType() == GType_ITE)
- _interface->addToInventory(_actor->objIndexToId(ITE_OBJ_MAGIC_HAT));
+ _interface->addToInventory(_actor->objIndexToId(0)); // Magic hat
_scene->changeScene(ConfMan.getInt("boot_param"), 0, kTransitionNoFade);
} else if (ConfMan.hasKey("save_slot")) {
// First scene sets up palette
@@ -421,25 +420,25 @@ const char *SagaEngine::getTextString(int textStringId) {
void SagaEngine::getExcuseInfo(int verb, const char *&textString, int &soundResourceId) {
textString = NULL;
- if (verb == _script->getVerbType(kVerbPickUp)) {
- textString = getTextString(kTextICantPickup);
- soundResourceId = RID_BOAR_VOICE_007;
- } else
- if (verb == _script->getVerbType(kVerbLookAt)) {
- textString = getTextString(kTextNothingSpecial);
- soundResourceId = RID_BOAR_VOICE_006;
- }
- if (verb == _script->getVerbType(kVerbOpen)) {
+ if (verb == _script->getVerbType(kVerbOpen)) {
textString = getTextString(kTextNoPlaceToOpen);
- soundResourceId = RID_BOAR_VOICE_000;
- }
- if (verb == _script->getVerbType(kVerbClose)) {
+ soundResourceId = 239; // Boar voice 0
+ }
+ if (verb == _script->getVerbType(kVerbClose)) {
textString = getTextString(kTextNoOpening);
- soundResourceId = RID_BOAR_VOICE_002;
- }
- if (verb == _script->getVerbType(kVerbUse)) {
+ soundResourceId = 241; // Boar voice 2
+ }
+ if (verb == _script->getVerbType(kVerbUse)) {
textString = getTextString(kTextDontKnow);
- soundResourceId = RID_BOAR_VOICE_005;
+ soundResourceId = 244; // Boar voice 5
+ }
+ if (verb == _script->getVerbType(kVerbLookAt)) {
+ textString = getTextString(kTextNothingSpecial);
+ soundResourceId = 245; // Boar voice 6
+ }
+ if (verb == _script->getVerbType(kVerbPickUp)) {
+ textString = getTextString(kTextICantPickup);
+ soundResourceId = 246; // Boar voice 7
}
}
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 35c3736b31..4fd789cb4e 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -82,11 +82,11 @@ using Common::MemoryReadStreamEndian;
#define OBJECT_TYPE_MASK ((1 << OBJECT_TYPE_SHIFT) - 1)
#define OBJ_SPRITE_BASE 9
+#define IHNM_OBJ_PROFILE 0x4000
#define memoryError(Place) error("%s Memory allocation error.", Place)
enum ERRORCODE {
- MEM = -2,//todo: remove
FAILURE = -1,
SUCCESS = 0
};
@@ -303,15 +303,17 @@ struct GameResourceDescription {
uint32 mainPanelResourceId;
uint32 conversePanelResourceId;
uint32 optionPanelResourceId;
- uint32 warningPanelResourceId;
- uint32 warningPanelSpritesResourceId;
uint32 mainSpritesResourceId;
uint32 mainPanelSpritesResourceId;
- uint32 optionPanelSpritesResourceId;
- uint32 defaultPortraitsResourceId;
- uint32 psychicProfileResourceId;
uint32 mainStringsResourceId;
+ // ITE specific resources
uint32 actorsStringsResourceId;
+ uint32 defaultPortraitsResourceId;
+ // IHNM specific resources
+ uint32 optionPanelSpritesResourceId;
+ uint32 warningPanelResourceId;
+ uint32 warningPanelSpritesResourceId;
+ uint32 psychicProfileResourceId;
};
struct GameFontDescription {
@@ -322,9 +324,7 @@ struct GameDisplayInfo;
struct GameSoundInfo {
GameSoundTypes resourceType;
- long frequency;
int sampleBits;
- bool stereo;
bool isBigEndian;
bool isSigned;
};
diff --git a/engines/saga/sagaresnames.h b/engines/saga/sagaresnames.h
deleted file mode 100644
index 5bce483c3e..0000000000
--- a/engines/saga/sagaresnames.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-// Descriptive names for game resource numbers
-
-#ifndef SAGA_RESOURCENAMES_H
-#define SAGA_RESOURCENAMES_H
-
-namespace Saga {
-
-// Prefix RID_ means Resource Id
-
-// Lookup tables
-#define RID_ITE_SCENE_LUT 1806
-#define RID_ITE_SCRIPT_LUT 216
-
-#define RID_ITEDEMO_SCENE_LUT 318
-#define RID_ITEDEMO_SCRIPT_LUT 146
-
-#define RID_IHNM_SCENE_LUT 1272
-#define RID_IHNM_SCRIPT_LUT 29
-#define RID_IHNM_SFX_LUT 265
-
-#define RID_IHNMDEMO_SCENE_LUT 286
-#define RID_IHNMDEMO_SCRIPT_LUT 18
-#define RID_IHNMDEMO_SFX_LUT 222
-
-// Object names
-#define ITE_OBJ_MAP 14
-#define ITE_OBJ_MAGIC_HAT 0
-
-#define IHNM_OBJ_PROFILE 0x4000
-
-#define RID_IHNM_DEFAULT_PALETTE 1
-
-// Actor names
-#define ITE_ACTOR_PUZZLE 176
-
-// Scenes
-#define ITE_SCENE_INV -1
-#define ITE_SCENE_PUZZLE 26
-#define ITE_SCENE_LODGE 21
-#define ITE_SCENE_ENDCREDIT1 295
-
-#define ITE_DEFAULT_SCENE 32
-#define IHNM_DEFAULT_SCENE 151
-
-#define ITEDEMO_DEFAULT_SCENE 68
-#define IHNMDEMO_DEFAULT_SCENE 144
-
-// Fonts
-#define RID_MEDIUM_FONT 0
-#define RID_BIG_FONT 1
-#define RID_SMALL_FONT 2
-
-// Interface images
-#define RID_ITE_MAIN_PANEL 3
-#define RID_ITE_CONVERSE_PANEL 4
-#define RID_ITE_OPTION_PANEL 5
-#define RID_ITE_MAIN_SPRITES 6
-#define RID_ITE_MAIN_PANEL_SPRITES 7
-#define RID_ITE_MAIN_STRINGS 35 //main strings
-#define RID_ITE_ACTOR_NAMES 36 //actors names
-#define RID_ITE_DEFAULT_PORTRAITS 125
-
-#define RID_ITEDEMO_MAIN_PANEL 2
-#define RID_ITEDEMO_CONVERSE_PANEL 3
-#define RID_ITEDEMO_OPTION_PANEL 3 // FIXME: should be 4 but it is an empty resource.
-#define RID_ITEDEMO_MAIN_SPRITES 5 // Proper fix would be not load options panel when demo is running
-#define RID_ITEDEMO_MAIN_PANEL_SPRITES 6
-#define RID_ITEDEMO_MAIN_STRINGS 8 //main strings
-#define RID_ITEDEMO_ACTOR_NAMES 9 //actors names
-#define RID_ITEDEMO_DEFAULT_PORTRAITS 80
-
-#define RID_ITE_TYCHO_MAP 1686
-#define RID_ITE_SPR_XHAIR1 (73 + 9)
-#define RID_ITE_SPR_XHAIR2 (74 + 9)
-
-#define RID_IHNM_MAIN_PANEL 9
-#define RID_IHNM_CONVERSE_PANEL 10
-#define RID_IHNM_HOURGLASS_CURSOR 11
-#define RID_IHNM_MAIN_SPRITES 12
-#define RID_IHNM_MAIN_PANEL_SPRITES 12
-#define RID_IHNM_ARROW_SPRITES 13
-#define RID_IHNM_SAVEREMINDER_SPRITES 14
-#define RID_IHNM_OPTION_PANEL 15
-#define RID_IHNM_OPTION_PANEL_SPRITES 16
-#define RID_IHNM_WARNING_PANEL 17
-#define RID_IHNM_WARNING_PANEL_SPRITES 18
-#define RID_IHNM_BOSS_SCREEN 19
-#define RID_IHNM_PROFILE_BG 20
-#define RID_IHNM_MAIN_STRINGS 21
-
-#define RID_IHNMDEMO_MAIN_PANEL 5
-#define RID_IHNMDEMO_CONVERSE_PANEL 6
-#define RID_IHNMDEMO_HOURGLASS_CURSOR 6 // Does not exist in the demo
-#define RID_IHNMDEMO_MAIN_SPRITES 7
-#define RID_IHNMDEMO_MAIN_PANEL_SPRITES 7
-#define RID_IHNMDEMO_ARROW_SPRITES 8
-#define RID_IHNMDEMO_SAVEREMINDER_SPRITES 9
-#define RID_IHNMDEMO_OPTION_PANEL 10
-#define RID_IHNMDEMO_OPTION_PANEL_SPRITES 11
-#define RID_IHNMDEMO_WARNING_PANEL 12
-#define RID_IHNMDEMO_WARNING_PANEL_SPRITES 13
-#define RID_IHNMDEMO_BOSS_SCREEN 14 // Does not exist in the demo
-#define RID_IHNMDEMO_PROFILE_BG 15
-#define RID_IHNMDEMO_MAIN_STRINGS 16
-
-// Puzzle portraits
-#define RID_ITE_SAKKA_APPRAISING 6
-#define RID_ITE_SAKKA_DENIAL 7
-#define RID_ITE_SAKKA_EXCITED 8
-#define RID_ITE_JFERRET_SERIOUS 9
-#define RID_ITE_JFERRET_GOOFY 10
-#define RID_ITE_JFERRET_ALOOF 11
-
-// ITE Scene resource numbers
-#define RID_ITE_OVERMAP_SCENE 226
-#define RID_ITE_INTRO_ANIM_SCENE 1538
-#define RID_ITE_CAVE_SCENE_1 1542
-#define RID_ITE_CAVE_SCENE_2 1545
-#define RID_ITE_CAVE_SCENE_3 1548
-#define RID_ITE_CAVE_SCENE_4 1551
-
-#define RID_ITE_VALLEY_SCENE 1556
-#define RID_ITE_TREEHOUSE_SCENE 1560
-#define RID_ITE_FAIREPATH_SCENE 1564
-#define RID_ITE_FAIRETENT_SCENE 1567
-
-#define RID_ITE_INTRO_ANIM_STARTFRAME 1529
-
-#define RID_ITE_INTRO_ANIM_1 1530
-#define RID_ITE_INTRO_ANIM_2 1531
-#define RID_ITE_INTRO_ANIM_3 1532
-#define RID_ITE_INTRO_ANIM_4 1533
-#define RID_ITE_INTRO_ANIM_5 1534
-#define RID_ITE_INTRO_ANIM_6 1535
-#define RID_ITE_INTRO_ANIM_7 1536
-
-#define RID_ITE_CAVE_IMG_1 1540
-#define RID_ITE_CAVE_IMG_2 1543
-#define RID_ITE_CAVE_IMG_3 1546
-#define RID_ITE_CAVE_IMG_4 1549
-
-#define RID_ITE_INTRO_IMG_1 1552
-#define RID_ITE_INTRO_IMG_2 1557
-#define RID_ITE_INTRO_IMG_3 1561
-#define RID_ITE_INTRO_IMG_4 1565
-
-// ITE voices
-#define RID_CAVE_VOICE_0 0
-#define RID_CAVE_VOICE_1 1
-#define RID_CAVE_VOICE_2 2
-#define RID_CAVE_VOICE_3 3
-#define RID_CAVE_VOICE_4 4
-#define RID_CAVE_VOICE_5 5
-#define RID_CAVE_VOICE_6 6
-#define RID_CAVE_VOICE_7 7
-#define RID_CAVE_VOICE_8 8
-#define RID_CAVE_VOICE_9 9
-#define RID_CAVE_VOICE_10 10
-#define RID_CAVE_VOICE_11 11
-#define RID_CAVE_VOICE_12 12
-#define RID_CAVE_VOICE_13 13
-
-#define RID_SCENE1_VOICE_009 57
-//TODO: fill it
-#define RID_SCENE1_VOICE_138 186
-
-#define RID_BOAR_VOICE_000 239
-#define RID_BOAR_VOICE_002 241
-#define RID_BOAR_VOICE_005 244
-#define RID_BOAR_VOICE_006 245
-#define RID_BOAR_VOICE_007 246
-
-// Music
-#define MUSIC_1 9
-#define MUSIC_2 10
-#define MUSIC_SUNSPOT 26
-
-// TODO: If the sound effects are numbered sequentially, we don't really need
-// these constants. But for now they might be useful for debugging.
-
-// Sound effects
-
-#define FX_DOOR_OPEN 14
-#define FX_DOOR_CLOSE 15
-#define FX_RUSH_WATER 16
-#define FX_CRICKET 17
-#define FX_PORTICULLIS 18
-#define FX_CLOCK_1 19
-#define FX_CLOCK_2 20
-#define FX_DAM_MACHINE 21
-#define FX_HUM1 22
-#define FX_HUM2 23
-#define FX_HUM3 24
-#define FX_HUM4 25
-#define FX_STREAM 26
-#define FX_SURF 27
-#define FX_FIRELOOP 28
-#define FX_SCRAPING 29
-#define FX_BEE_SWARM 30
-#define FX_SQUEAKBOARD 31
-#define FX_KNOCK 32
-#define FX_COINS 33
-#define FX_STORM 34
-#define FX_DOOR_CLOSE_2 35
-#define FX_ARCWELD 36
-#define FX_RETRACT_ORB 37
-#define FX_DRAGON 38
-#define FX_SNORES 39
-#define FX_SPLASH 40
-#define FX_LOBBY_DOOR 41
-#define FX_CHIRP_LOOP 42
-#define FX_DOOR_CREAK 43
-#define FX_SPOON_DIG 44
-#define FX_CROW 45
-#define FX_COLDWIND 46
-#define FX_TOOL_SND_1 47
-#define FX_TOOL_SND_2 48
-#define FX_TOOL_SND_3 49
-#define FX_DOOR_METAL 50
-#define FX_WATER_LOOP_S 51
-#define FX_WATER_LOOP_L 52
-#define FX_DOOR_OPEN_2 53
-#define FX_JAIL_DOOR 54
-#define FX_KILN_FIRE 55
-#define FX_DUMMY 56
-
-// These are only in the CD version
-
-#define FX_CROWD_01 57
-#define FX_CROWD_02 58
-#define FX_CROWD_03 59
-#define FX_CROWD_04 60
-#define FX_CROWD_05 61
-#define FX_CROWD_06 62
-#define FX_CROWD_07 63
-#define FX_CROWD_08 64
-#define FX_CROWD_09 65
-#define FX_CROWD_10 66
-#define FX_CROWD_11 67
-#define FX_CROWD_12 68
-#define FX_CROWD_13 69
-#define FX_CROWD_14 70
-#define FX_CROWD_15 71
-#define FX_CROWD_16 72
-#define FX_CROWD_17 73
-
-} // End of namespace Saga
-
-#endif
diff --git a/engines/saga/saveload.cpp b/engines/saga/saveload.cpp
index 53290cbc5d..8d00f9d2d0 100644
--- a/engines/saga/saveload.cpp
+++ b/engines/saga/saveload.cpp
@@ -37,7 +37,6 @@
#include "saga/isomap.h"
#include "saga/music.h"
#include "saga/render.h"
-#include "saga/sagaresnames.h"
#include "saga/scene.h"
#include "saga/script.h"
diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp
index 4520c3f406..c3c1587822 100644
--- a/engines/saga/scene.cpp
+++ b/engines/saga/scene.cpp
@@ -43,7 +43,6 @@
#include "saga/scene.h"
#include "saga/actor.h"
#include "saga/rscfile.h"
-#include "saga/sagaresnames.h"
#include "graphics/iff.h"
#include "common/util.h"
diff --git a/engines/saga/scene.h b/engines/saga/scene.h
index 0e4c0ed66a..723792f050 100644
--- a/engines/saga/scene.h
+++ b/engines/saga/scene.h
@@ -38,9 +38,21 @@ namespace Saga {
//#define SCENE_DEBUG // for scene debugging
#define SCENE_DOORS_MAX 16
-
#define NO_CHAPTER_CHANGE -2
+// Scenes
+#define ITE_SCENE_INV -1
+#define ITE_SCENE_PUZZLE 26
+#define ITE_SCENE_LODGE 21
+#define ITE_SCENE_ENDCREDIT1 295
+#define ITE_SCENE_OVERMAP 226
+
+// Default scenes
+#define ITE_DEFAULT_SCENE 32
+#define IHNM_DEFAULT_SCENE 151
+#define ITEDEMO_DEFAULT_SCENE 68
+#define IHNMDEMO_DEFAULT_SCENE 144
+
class ObjectMap;
struct Event;
diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp
index 4862ce3be0..ea61f5ce04 100644
--- a/engines/saga/sfuncs.cpp
+++ b/engines/saga/sfuncs.cpp
@@ -47,7 +47,6 @@
#include "saga/scene.h"
#include "saga/isomap.h"
-#include "saga/sagaresnames.h"
#include "common/config-manager.h"
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index 9d3d4a9afa..8d269fb3e8 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -28,7 +28,6 @@
#include "saga/saga.h"
#include "saga/itedata.h"
-#include "saga/sagaresnames.h"
#include "saga/rscfile.h"
#include "saga/sndres.h"
#include "saga/sound.h"
@@ -43,6 +42,9 @@
namespace Saga {
+#define RID_IHNM_SFX_LUT 265
+#define RID_IHNMDEMO_SFX_LUT 222
+
SndRes::SndRes(SagaEngine *vm) : _vm(vm) {
// Load sound module resource file contexts
_sfxContext = _vm->_resource->getContext(GAME_SOUNDFILE);
@@ -259,11 +261,11 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
switch (resourceType) {
case kSoundPCM:
- buffer.frequency = soundInfo->frequency;
+ buffer.frequency = 22050;
buffer.isSigned = soundInfo->isSigned;
buffer.sampleBits = soundInfo->sampleBits;
buffer.size = soundResourceLength;
- buffer.stereo = soundInfo->stereo;
+ buffer.stereo = false;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
@@ -273,11 +275,11 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
result = true;
break;
case kSoundMacPCM:
- buffer.frequency = soundInfo->frequency;
+ buffer.frequency = 22050;
buffer.isSigned = soundInfo->isSigned;
buffer.sampleBits = soundInfo->sampleBits;
buffer.size = soundResourceLength - 36;
- buffer.stereo = soundInfo->stereo;
+ buffer.stereo = false;
if (onlyHeader) {
buffer.buffer = NULL;
} else {
@@ -288,10 +290,10 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
result = true;
break;
case kSoundVOX:
- buffer.frequency = soundInfo->frequency;
+ buffer.frequency = 22050;
buffer.isSigned = soundInfo->isSigned;
buffer.sampleBits = soundInfo->sampleBits;
- buffer.stereo = soundInfo->stereo;
+ buffer.stereo = false;
buffer.size = soundResourceLength * 4;
if (onlyHeader) {
buffer.buffer = NULL;
diff --git a/engines/saga/sprite.cpp b/engines/saga/sprite.cpp
index b5c675a403..e9d002819c 100644
--- a/engines/saga/sprite.cpp
+++ b/engines/saga/sprite.cpp
@@ -29,7 +29,6 @@
#include "saga/gfx.h"
#include "saga/scene.h"
-#include "saga/sagaresnames.h"
#include "saga/rscfile.h"
#include "saga/font.h"
@@ -37,6 +36,11 @@
namespace Saga {
+#define RID_IHNM_ARROW_SPRITES 13
+#define RID_IHNM_SAVEREMINDER_SPRITES 14
+#define RID_IHNMDEMO_ARROW_SPRITES 8
+#define RID_IHNMDEMO_SAVEREMINDER_SPRITES 9
+
Sprite::Sprite(SagaEngine *vm) : _vm(vm) {
debug(8, "Initializing sprite subsystem...");
diff --git a/engines/saga/sthread.cpp b/engines/saga/sthread.cpp
index bc18632659..c1b289a060 100644
--- a/engines/saga/sthread.cpp
+++ b/engines/saga/sthread.cpp
@@ -34,10 +34,12 @@
#include "saga/script.h"
#include "saga/scene.h"
-#include "saga/sagaresnames.h"
namespace Saga {
+#define RID_SCENE1_VOICE_START 57
+#define RID_SCENE1_VOICE_END 186
+
ScriptThread *Script::createThread(uint16 scriptModuleNumber, uint16 scriptEntryPointNumber) {
ScriptThread *newThread;
@@ -653,8 +655,8 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
if (_vm->getGameId() == GID_ITE_DISK_G) { // special ITE dos
if ((_vm->_scene->currentSceneNumber() == ITE_DEFAULT_SCENE) &&
- (iparam1 >= 288) && (iparam1 <= (RID_SCENE1_VOICE_138 - RID_SCENE1_VOICE_009 + 288))) {
- sampleResourceId = RID_SCENE1_VOICE_009 + iparam1 - 288;
+ (iparam1 >= 288) && (iparam1 <= (RID_SCENE1_VOICE_END - RID_SCENE1_VOICE_START + 288))) {
+ sampleResourceId = RID_SCENE1_VOICE_START + iparam1 - 288;
}
} else {
if (thread->_voiceLUT->voicesCount > first) {
diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp
index 46d034d880..8f3175f098 100644
--- a/engines/scumm/charset.cpp
+++ b/engines/scumm/charset.cpp
@@ -371,7 +371,7 @@ int CharsetRenderer::getStringWidth(int arg, const byte *text) {
break;
}
} else {
- if (chr == '@' && _vm->_language != Common::ZH_TWN)
+ if (chr == '@' && !(_vm->_game.id == GID_CMI && _vm->_language == Common::ZH_TWN))
continue;
if (chr == 255 || (_vm->_game.version <= 6 && chr == 254)) {
chr = text[pos++];
@@ -400,7 +400,8 @@ int CharsetRenderer::getStringWidth(int arg, const byte *text) {
// Some localizations may override colors
// See credits in Chinese COMI
- if (chr == '^' && pos == 1) {
+ if (_vm->_game.id == GID_CMI && _vm->_language == Common::ZH_TWN &&
+ chr == '^' && pos == 1) {
if (text[pos] == 'c') {
pos += 4;
chr = text[pos++];
diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp
index 954e400c2c..9f9115e207 100644
--- a/engines/scumm/debugger.cpp
+++ b/engines/scumm/debugger.cpp
@@ -498,25 +498,24 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
}
bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
- Common::Array<Common::EngineDebugLevel> lvls = Common::listSpecialDebugLevels();
+ const Common::DebugLevelContainer &lvls = Common::listSpecialDebugLevels();
bool setFlag = false; // Remove or add debug channel?
if ((argc == 1) && (Common::getEnabledSpecialDebugLevels() == 0)) {
DebugPrintf("No debug flags are enabled\n");
DebugPrintf("Available Channels: ");
- for (uint i = 0; i < lvls.size(); i++) {
- DebugPrintf("%s, ", lvls[i].option.c_str());
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ DebugPrintf("%s, ", i->option.c_str());
}
DebugPrintf("\n");
return true;
}
if ((argc == 1) && (Common::getEnabledSpecialDebugLevels() > 0)) {
- for (uint i = 0; i < lvls.size(); i++) {
- if (lvls[i].enabled)
- DebugPrintf("%s - %s\n", lvls[i].option.c_str(),
- lvls[i].description.c_str());
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ if (i->enabled)
+ DebugPrintf("%s - %s\n", i->option.c_str(), i->description.c_str());
}
return true;
}
@@ -529,25 +528,24 @@ bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
} else {
DebugPrintf("Syntax: Debug +CHANNEL, or Debug -CHANNEL\n");
DebugPrintf("Available Channels: ");
- for (uint i = 0; i < lvls.size(); i++) {
- DebugPrintf("%s, ", lvls[i].option.c_str());
- DebugPrintf("\n");
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ DebugPrintf("%s\n", i->option.c_str());
}
}
// Identify flag
const char *realFlag = argv[1] + 1;
- for (uint i = 0; i < lvls.size(); i++) {
- if ((scumm_stricmp(lvls[i].option.c_str(), realFlag)) == 0) {
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ if (i->option.equalsIgnoreCase(realFlag)) {
if (setFlag) {
- enableSpecialDebugLevel(lvls[i].option);
+ enableSpecialDebugLevel(i->option);
DebugPrintf("Enable ");
} else {
- disableSpecialDebugLevel(lvls[i].option);
+ disableSpecialDebugLevel(i->option);
DebugPrintf("Disable ");
}
- DebugPrintf("%s\n", lvls[i].description.c_str());
+ DebugPrintf("%s\n", i->description.c_str());
return true;
}
}
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 49ac5a18eb..474707ec55 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -642,6 +642,7 @@ static const GameFilenamePattern gameFilenamesTable[] = {
{ "pajama", "Pajama Sam", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 },
{ "pajama", "PajamaNHD", kGenHEPC, UNK_LANG, UNK, 0 },
{ "pajama", "PJS-DEMO", kGenHEPC, UNK_LANG, UNK, 0 },
+ { "pajama", "pjsam", kGenHEPC, UNK_LANG, UNK, 0 },
{ "pajama", "PjSamDemo", kGenHEPC, UNK_LANG, UNK, 0 },
{ "pajama", "PYJAMA", kGenHEPC, Common::DE_DEU, UNK, 0 },
{ "pajama", "SAMDEMO", kGenHEPC, Common::FR_FRA, UNK, 0 },
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index a8ef26c484..36b82519e9 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -23,6 +23,8 @@
*
*/
+#include <time.h> // for ScummEngine::saveInfos / ScummEngine::loadInfos
+
#include "common/config-manager.h"
#include "common/savefile.h"
#include "common/system.h"
@@ -44,8 +46,6 @@
#include "sound/audiocd.h"
#include "sound/mixer.h"
-#include <time.h> // for ScummEngine::saveInfos / ScummEngine::loadInfos
-
namespace Scumm {
struct SaveGameHeader {
diff --git a/engines/scumm/script_v6.cpp b/engines/scumm/script_v6.cpp
index faae72b6dd..04ea53137b 100644
--- a/engines/scumm/script_v6.cpp
+++ b/engines/scumm/script_v6.cpp
@@ -23,6 +23,8 @@
*
*/
+#include <time.h> // for ScummEngine_v6::o6_getDateTime()
+
#include "common/config-manager.h"
#include "common/system.h"
@@ -44,8 +46,6 @@
#include "sound/mididrv.h"
#include "sound/mixer.h"
-#include <time.h> // for ScummEngine_v6::o6_getDateTime()
-
namespace Scumm {
#define OPCODE(x) _OPCODE(ScummEngine_v6, x)
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index f0bc179c61..a95fe790b2 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
/*
- This file was generated by the md5table tool on Mon May 12 04:29:20 2008
+ This file was generated by the md5table tool on Sat May 24 00:59:21 2008
DO NOT EDIT MANUALLY!
*/
@@ -107,6 +107,7 @@ static const MD5Table md5table[] = {
{ "22c9eb04455440131ffc157aeb8d40a8", "fbear", "HE 70", "Demo", -1, Common::EN_ANY, Common::kPlatformWindows },
{ "22d07d6c386c9c25aca5dac2a0c0d94b", "maniac", "NES", "", 262144, Common::SE_SWE, Common::kPlatformNES },
{ "22f4ea88a09da12df9308ba30bcb7d0f", "loom", "EGA", "EGA", -1, Common::EN_ANY, Common::kPlatformPC },
+ { "23394c8d29cc63c61313959431a12476", "spyfox", "HE 100", "Updated", -1, Common::EN_ANY, Common::kPlatformWindows },
{ "257f8c14d8c584f7ddd601bcb00920c7", "maniac", "NES", "", 262144, Common::DE_DEU, Common::kPlatformNES },
{ "2723fea3dae0cb47768c424b145ae0e7", "tentacle", "", "Floppy", 7932, Common::EN_ANY, Common::kPlatformPC },
{ "27b3a4224ad63d5b04627595c1c1a025", "zak", "V2", "V2", -1, Common::IT_ITA, Common::kPlatformAmiga },
@@ -156,6 +157,7 @@ static const MD5Table md5table[] = {
{ "39fd6db10d0222d817025c4d3346e3b4", "farm", "", "Demo", -1, Common::EN_ANY, Common::kPlatformMacintosh },
{ "3a03dab514e4038df192d8a8de469788", "atlantis", "", "Floppy", -1, Common::EN_ANY, Common::kPlatformAmiga },
{ "3a0c35f3c147b98a2bdf8d400cfc4ab5", "indy3", "FM-TOWNS", "", -1, Common::JA_JPN, Common::kPlatformFMTowns },
+ { "3a3e592b074f595489f7f11e150c398d", "puttzoo", "HE 99", "Updated", -1, Common::EN_USA, Common::kPlatformWindows },
{ "3a5d13675e9a23aedac0bac7730f0ac1", "samnmax", "", "CD", -1, Common::FR_FRA, Common::kPlatformMacintosh },
{ "3a5ec90d556d4920976c5578bfbfaf79", "maniac", "NES", "extracted", -1, Common::DE_DEU, Common::kPlatformNES },
{ "3af61c5edf8e15b43dbafd285b2e9777", "puttcircus", "", "Demo", -1, Common::HB_ISR, Common::kPlatformWindows },
@@ -300,6 +302,7 @@ static const MD5Table md5table[] = {
{ "771bc18ec6f93837b839c992b211904b", "monkey", "Demo", "EGA Demo", -1, Common::DE_DEU, Common::kPlatformPC },
{ "77f5c9cc0986eb729c1a6b4c8823bbae", "zak", "FM-TOWNS", "Demo", 7520, Common::EN_ANY, Common::kPlatformFMTowns },
{ "780e4a0ae2ff17dc296f4a79543b44f8", "puttmoon", "", "", -1, Common::UNK_LANG, Common::kPlatformPC },
+ { "782393c5934ecd0b536eaf5fd541bd26", "pajama", "HE 100", "Updated", -1, Common::EN_ANY, Common::kPlatformWindows },
{ "78bd5f036ea35a878b74e4f47941f784", "freddi4", "HE 99", "", -1, Common::RU_RUS, Common::kPlatformWindows },
{ "78c07ca088526d8d4446a4c2cb501203", "freddi3", "HE 99", "", -1, Common::FR_FRA, Common::kPlatformUnknown },
{ "7974365d3dc0f43a2748c975f91ff042", "monkey2", "", "", -1, Common::ES_ESP, Common::kPlatformPC },
@@ -428,6 +431,7 @@ static const MD5Table md5table[] = {
{ "bbadf7309c4a2c2763e4bbba3c3be634", "freddi3", "", "Demo", -1, Common::FR_FRA, Common::kPlatformUnknown },
{ "bc4700bc0e12879f6d25d14d6be6cfdd", "spyfox2", "", "", -1, Common::DE_DEU, Common::kPlatformUnknown },
{ "bd126753de619a495f9f22adc951c8d5", "monkey2", "", "", -1, Common::IT_ITA, Common::kPlatformPC },
+ { "be2abe172f58db170de3a037daa1dd27", "puttputt", "HE 61", "", -1, Common::JA_JPN, Common::kPlatform3DO },
{ "be39a5d4db60e8aa736b9086778cb45c", "spyozon", "", "", -1, Common::EN_GRB, Common::kPlatformWindows },
{ "be83e882b44f2767bc08d4f766ebc347", "maniac", "V2", "V2", -1, Common::DE_DEU, Common::kPlatformAtariST },
{ "bf8b52fdd9a69c67f34e8e9fec72661c", "farm", "HE 71", "Demo", -1, Common::EN_ANY, Common::kPlatformWindows },
diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp
index f42a803a3d..81ffaa89ba 100644
--- a/engines/scumm/string.cpp
+++ b/engines/scumm/string.cpp
@@ -174,11 +174,10 @@ void ScummEngine_v6::drawBlastTexts() {
// Some localizations may override colors
// See credits in Chinese COMI
- if (c == '^' && (buf == _blastTextQueue[i].text + 1)) {
- int color;
- switch (*buf) {
- case 'c':
- color = buf[3] - '0' + 10 *(buf[2] - '0');
+ if (_game.id == GID_CMI && _language == Common::ZH_TWN &&
+ c == '^' && (buf == _blastTextQueue[i].text + 1)) {
+ if (*buf == 'c') {
+ int color = buf[3] - '0' + 10 *(buf[2] - '0');
_charset->setColor(color);
buf += 4;
@@ -1114,7 +1113,8 @@ int ScummEngine::convertMessageToString(const byte *msg, byte *dst, int dstSize)
num += (_game.version == 8) ? 4 : 2;
}
} else {
- if (!(chr == '@' && _game.heversion <= 71) || _language == Common::ZH_TWN) {
+ if (!(chr == '@' && _game.heversion <= 71) ||
+ (_game.id == GID_CMI && _language == Common::ZH_TWN)) {
*dst++ = chr;
}
}
@@ -1462,8 +1462,17 @@ void ScummEngine_v7::translateText(const byte *text, byte *trans_buff) {
trans_buff[0] = 0;
_lastStringTag[0] = 0;
+ if (_game.version >= 7 && text[0] == '/') {
+ // Extract the string tag from the text: /..../
+ for (i = 0; (i < 12) && (text[i + 1] != '/'); i++)
+ _lastStringTag[i] = toupper(text[i + 1]);
+ _lastStringTag[i] = 0;
+ }
+
// WORKAROUND for bug #1172655.
if (_game.id == GID_DIG) {
+ // Based on the second release of The Dig
+ // Only applies to the subtitles and not speech
if (!strcmp((const char *)text, "faint light"))
text = (const byte *)"/NEW.007/faint light";
else if (!strcmp((const char *)text, "glowing crystal"))
@@ -1472,9 +1481,9 @@ void ScummEngine_v7::translateText(const byte *text, byte *trans_buff) {
text = (const byte *)"/NEW.009/glowing crystals";
else if (!strcmp((const char *)text, "pit"))
text = (const byte *)"/NEW.010/pit";
- else if (!strcmp((const char *)text, "You wish."))
+ else if (!strcmp((const char *)text, "/NEWTON.032/"))
text = (const byte *)"/NEW.011/You wish.";
- else if (!strcmp((const char *)text, "In your dreams."))
+ else if (!strcmp((const char *)text, "/NEWTON.034/"))
text = (const byte *)"/NEW.012/In your dreams";
else if (!strcmp((const char *)text, "left"))
text = (const byte *)"/CATHPLAT.068/left";
@@ -1488,12 +1497,6 @@ void ScummEngine_v7::translateText(const byte *text, byte *trans_buff) {
text = (const byte *)"/NEW.013/unattached lens";
else if (!strcmp((const char *)text, "lens slot"))
text = (const byte *)"/NEW.014/lens slot";
-
- // Added in second release of The Dig
- else if (!strcmp((const char *)text, "/NEWTON.032/"))
- text = (const byte *)"/NEW.11/You wish.";
- else if (!strcmp((const char *)text, "/NEWTON.034/"))
- text = (const byte *)"/NEW.12/In your dreams";
else if (!strcmp((const char *)text, "Jonathon Jackson"))
text = (const byte *)"Aram Gutowski";
else if (!strcmp((const char *)text, "Brink"))
@@ -1506,8 +1509,8 @@ void ScummEngine_v7::translateText(const byte *text, byte *trans_buff) {
if (_game.version >= 7 && text[0] == '/') {
// Extract the string tag from the text: /..../
for (i = 0; (i < 12) && (text[i + 1] != '/'); i++)
- _lastStringTag[i] = target.tag[i] = toupper(text[i + 1]);
- _lastStringTag[i] = target.tag[i] = 0;
+ target.tag[i] = toupper(text[i + 1]);
+ target.tag[i] = 0;
text += i + 2;
// If a language file was loaded, try to find a translated version
diff --git a/engines/sword2/mouse.cpp b/engines/sword2/mouse.cpp
index 44d2383f78..af4f121e96 100644
--- a/engines/sword2/mouse.cpp
+++ b/engines/sword2/mouse.cpp
@@ -1462,19 +1462,19 @@ void Mouse::checkPlayerActivity(uint32 seconds) {
_vm->_logic->writeVar(RESULT, 0);
}
-void Mouse::pauseGame() {
- // Make the mouse cursor normal. This is the only place where we are
- // allowed to clear the luggage this way.
+void Mouse::pauseEngine(bool pause) {
+ if (pause) {
+ // Make the mouse cursor normal. This is the only place where
+ // we are allowed to clear the luggage this way.
- clearPointerText();
- setLuggageAnim(NULL, 0);
- setMouse(0);
- setMouseTouching(1);
-}
-
-void Mouse::unpauseGame() {
- if (_vm->_logic->readVar(OBJECT_HELD) && _realLuggageItem)
- setLuggage(_realLuggageItem);
+ clearPointerText();
+ setLuggageAnim(NULL, 0);
+ setMouse(0);
+ setMouseTouching(1);
+ } else {
+ if (_vm->_logic->readVar(OBJECT_HELD) && _realLuggageItem)
+ setLuggage(_realLuggageItem);
+ }
}
#define MOUSEFLASHFRAME 6
diff --git a/engines/sword2/mouse.h b/engines/sword2/mouse.h
index 09ac9ced20..b87129ac7f 100644
--- a/engines/sword2/mouse.h
+++ b/engines/sword2/mouse.h
@@ -211,8 +211,7 @@ public:
uint32 getMouseTouching() { return _mouseTouching; }
void setMouseTouching(uint32 touching) { _mouseTouching = touching; }
- void pauseGame();
- void unpauseGame();
+ void pauseEngine(bool pause);
void setMouse(uint32 res);
void setLuggage(uint32 res);
diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp
index 0601d11791..26fd598d9d 100644
--- a/engines/sword2/sword2.cpp
+++ b/engines/sword2/sword2.cpp
@@ -392,7 +392,7 @@ int Sword2Engine::go() {
#ifdef SWORD2_DEBUG
if (_stepOneCycle) {
- pauseGame();
+ pauseEngineIntern(true);
_stepOneCycle = false;
}
#endif
@@ -406,9 +406,9 @@ int Sword2Engine::go() {
switch (ke->kbd.keycode) {
case Common::KEYCODE_p:
if (_gamePaused)
- unpauseGame();
+ pauseEngineIntern(false);
else
- pauseGame();
+ pauseEngineIntern(true);
break;
case Common::KEYCODE_c:
if (!_logic->readVar(DEMO) && !_mouse->isChoosing()) {
@@ -421,7 +421,7 @@ int Sword2Engine::go() {
case Common::KEYCODE_SPACE:
if (_gamePaused) {
_stepOneCycle = true;
- unpauseGame();
+ pauseEngineIntern(false);
}
break;
case Common::KEYCODE_s:
@@ -689,53 +689,56 @@ void Sword2Engine::sleepUntil(uint32 time) {
}
}
-void Sword2Engine::pauseGame() {
- // Don't allow Pause while screen fading or while black
- if (_screen->getFadeStatus() != RDFADE_NONE)
- return;
+void Sword2Engine::pauseEngineIntern(bool pause) {
+ if (pause) {
+ // FIXME: We should never disallow pausing, and we need to do
+ // something about pausing during cutscene moves, credits, etc.
- _sound->pauseAllSound();
- _mouse->pauseGame();
+ // Don't allow Pause while screen fading or while black
+ if (_screen->getFadeStatus() != RDFADE_NONE)
+ return;
- // If render level is at max, turn it down because palette-matching
- // won't work when the palette is dimmed.
+ _sound->pauseAllSound();
+ _mouse->pauseEngine(true);
- if (_screen->getRenderLevel() == 3) {
- _screen->setRenderLevel(2);
- _graphicsLevelFudged = true;
- }
+ // If render level is at max, turn it down because palette-
+ // matching won't work when the palette is dimmed.
+
+ if (_screen->getRenderLevel() == 3) {
+ _screen->setRenderLevel(2);
+ _graphicsLevelFudged = true;
+ }
#ifdef SWORD2_DEBUG
- // Don't dim it if we're single-stepping through frames
- // dim the palette during the pause
+ // Don't dim it if we're single-stepping through frames
+ // dim the palette during the pause
- if (!_stepOneCycle)
- _screen->dimPalette();
+ if (!_stepOneCycle)
+ _screen->dimPalette();
#else
- _screen->dimPalette();
+ _screen->dimPalette();
#endif
- _gamePaused = true;
-}
-
-void Sword2Engine::unpauseGame() {
- _mouse->unpauseGame();
- _sound->unpauseAllSound();
+ _gamePaused = true;
+ } else {
+ _mouse->pauseEngine(false);
+ _sound->unpauseAllSound();
- // Put back game screen palette; see screen.cpp
- _screen->setFullPalette(-1);
+ // Put back game screen palette; see screen.cpp
+ _screen->setFullPalette(-1);
- // If graphics level at max, turn up again
- if (_graphicsLevelFudged) {
- _screen->setRenderLevel(3);
- _graphicsLevelFudged = false;
- }
+ // If graphics level at max, turn up again
+ if (_graphicsLevelFudged) {
+ _screen->setRenderLevel(3);
+ _graphicsLevelFudged = false;
+ }
- _gamePaused = false;
+ _gamePaused = false;
- // If mouse is about or we're in a chooser menu
- if (!_mouse->getMouseStatus() || _mouse->isChoosing())
- _mouse->setMouse(NORMAL_MOUSE_ID);
+ // If mouse is about or we're in a chooser menu
+ if (!_mouse->getMouseStatus() || _mouse->isChoosing())
+ _mouse->setMouse(NORMAL_MOUSE_ID);
+ }
}
uint32 Sword2Engine::getMillis() {
diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h
index a9a1e21875..ba59772a71 100644
--- a/engines/sword2/sword2.h
+++ b/engines/sword2/sword2.h
@@ -113,8 +113,7 @@ private:
uint32 calcChecksum(byte *buffer, uint32 size);
- void pauseGame();
- void unpauseGame();
+ virtual void pauseEngineIntern(bool pause);
uint32 _totalStartups;
uint32 _totalScreenManagers;
diff --git a/gui/about.cpp b/gui/about.cpp
index 2afaae9a97..758f3ee6a7 100644
--- a/gui/about.cpp
+++ b/gui/about.cpp
@@ -128,8 +128,8 @@ AboutDialog::AboutDialog()
_lines.push_back("");
addLine("\\C\\c1""Available engines:");
- const EnginePlugin::list &plugins = EngineMan.getPlugins();
- EnginePlugin::list::const_iterator iter = plugins.begin();
+ const EnginePlugin::List &plugins = EngineMan.getPlugins();
+ EnginePlugin::List::const_iterator iter = plugins.begin();
for (; iter != plugins.end(); ++iter) {
Common::String str;
str = "\\C";
diff --git a/gui/debugger.cpp b/gui/debugger.cpp
index 99aebe9b62..87abe854be 100644
--- a/gui/debugger.cpp
+++ b/gui/debugger.cpp
@@ -406,7 +406,7 @@ bool Debugger::Cmd_Help(int argc, const char **argv) {
}
bool Debugger::Cmd_DebugFlagsList(int argc, const char **argv) {
- const Common::Array<Common::EngineDebugLevel> &debugLevels = Common::listSpecialDebugLevels();
+ const Common::DebugLevelContainer &debugLevels = Common::listSpecialDebugLevels();
DebugPrintf("Engine debug levels:\n");
DebugPrintf("--------------------\n");
@@ -414,8 +414,8 @@ bool Debugger::Cmd_DebugFlagsList(int argc, const char **argv) {
DebugPrintf("No engine debug levels\n");
return true;
}
- for (uint i = 0; i < debugLevels.size(); ++i) {
- DebugPrintf("'%s' - Description: %s\n", debugLevels[i].option.c_str(), debugLevels[i].description.c_str());
+ for (Common::DebugLevelContainer::const_iterator i = debugLevels.begin(); i != debugLevels.end(); ++i) {
+ DebugPrintf("'%s' - Description: %s\n", i->option.c_str(), i->description.c_str());
}
DebugPrintf("\n");
return true;
diff --git a/gui/launcher.h b/gui/launcher.h
index 164a7e0707..a9d09bf109 100644
--- a/gui/launcher.h
+++ b/gui/launcher.h
@@ -26,6 +26,7 @@
#define LAUNCHER_DIALOG_H
#include "gui/dialog.h"
+#include "base/game.h"
#include "common/str.h"
namespace GUI {
diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp
index 0fba6affdb..4454a09fe6 100644
--- a/sound/audiostream.cpp
+++ b/sound/audiostream.cpp
@@ -102,6 +102,11 @@ AudioStream* AudioStream::openStreamFile(const Common::String &basename, uint32
#pragma mark --- LinearMemoryStream ---
#pragma mark -
+inline int32 calculatePlayTime(int rate, int samples) {
+ int32 seconds = samples / rate;
+ int32 milliseconds = (1000 * (samples % rate)) / rate;
+ return seconds * 1000 + milliseconds;
+}
/**
* A simple raw audio stream, purely memory based. It operates on a single
@@ -122,10 +127,11 @@ protected:
const byte *_loopEnd;
const int _rate;
const byte *_origPtr;
+ const int32 _playtime;
public:
LinearMemoryStream(int rate, const byte *ptr, uint len, uint loopOffset, uint loopLen, bool autoFreeMemory)
- : _ptr(ptr), _end(ptr+len), _loopPtr(0), _loopEnd(0), _rate(rate) {
+ : _ptr(ptr), _end(ptr+len), _loopPtr(0), _loopEnd(0), _rate(rate), _playtime(calculatePlayTime(rate, len / (is16Bit ? 2 : 1) / (stereo ? 2 : 1))) {
// Verify the buffer sizes are sane
if (is16Bit && stereo)
@@ -147,10 +153,11 @@ public:
}
int readBuffer(int16 *buffer, const int numSamples);
- bool isStereo() const { return stereo; }
- bool endOfData() const { return _ptr >= _end; }
+ bool isStereo() const { return stereo; }
+ bool endOfData() const { return _ptr >= _end; }
- int getRate() const { return _rate; }
+ int getRate() const { return _rate; }
+ int32 getTotalPlayTime() const { return _playtime; }
};
template<bool stereo, bool is16Bit, bool isUnsigned, bool isLE>
diff --git a/sound/audiostream.h b/sound/audiostream.h
index ed6b37e51c..04133936ee 100644
--- a/sound/audiostream.h
+++ b/sound/audiostream.h
@@ -93,6 +93,20 @@ public:
* NULL in case of an error (e.g. invalid/nonexisting file)
*/
static AudioStream* openStreamFile(const Common::String &basename, uint32 startTime = 0, uint32 duration = 0, uint numLoops = 1);
+
+ enum {
+ kUnknownPlayTime = -1
+ };
+
+ /**
+ * Returns total playtime of the AudioStream object.
+ * Note that this does not require to return an playtime, if the
+ * playtime of the AudioStream is unknown it returns 'kUnknownPlayTime'.
+ * @see kUnknownPlayTime
+ *
+ * @return playtime in milliseconds
+ */
+ virtual int32 getTotalPlayTime() const { return kUnknownPlayTime; }
};
/**
diff --git a/sound/flac.cpp b/sound/flac.cpp
index 8dc3586142..f058d2dc6f 100644
--- a/sound/flac.cpp
+++ b/sound/flac.cpp
@@ -102,6 +102,9 @@ protected:
/** index + 1(!) of the last sample to be played - 0 is end of stream */
FLAC__uint64 _lastSample;
+ /** total play time */
+ int32 _totalPlayTime;
+
/** true if the last sample was decoded from the FLAC-API - there might still be data in the buffer */
bool _lastSampleWritten;
@@ -141,6 +144,8 @@ public:
return _streaminfo.channels == 0 || (_lastSampleWritten && _sampleCache.bufFill == 0);
}
+ int32 getTotalPlayTime() const { return _totalPlayTime; }
+
bool isStreamDecoderReady() const { return getStreamDecoderState() == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC ; }
protected:
@@ -235,7 +240,28 @@ FlacInputStream::FlacInputStream(Common::SeekableReadStream *inStream, bool disp
// avoid overflows).
_firstSample = (FLAC__uint64)(startTime * (_streaminfo.sample_rate / 1000.0));
_lastSample = (FLAC__uint64)(endTime * (_streaminfo.sample_rate / 1000.0));
+
if (_firstSample == 0 || seekAbsolute(_firstSample)) {
+ int32 samples = kUnknownPlayTime;
+
+ if (!_lastSample) {
+ if (_streaminfo.total_samples)
+ samples = _streaminfo.total_samples - _firstSample;
+ } else {
+ samples = _lastSample - _firstSample - 1;
+ }
+
+ if (samples != kUnknownPlayTime && samples >= 0 && numLoops) {
+ const int32 rate = _streaminfo.sample_rate;
+
+ int32 seconds = samples / rate;
+ int32 milliseconds = (1000 * (samples % rate)) / rate;
+
+ _totalPlayTime = (seconds * 1000 + milliseconds) * numLoops;
+ } else {
+ _totalPlayTime = kUnknownPlayTime;
+ }
+
return; // no error occured
}
}
diff --git a/sound/fmopl.h b/sound/fmopl.h
index cc2f967f25..890a2d1a56 100644
--- a/sound/fmopl.h
+++ b/sound/fmopl.h
@@ -167,7 +167,7 @@ int OPLTimerOver(FM_OPL *OPL, int c);
void OPLWriteReg(FM_OPL *OPL, int r, int v);
void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length);
-#endif
-
// Factory method
FM_OPL *makeAdlibOPL(int rate);
+
+#endif
diff --git a/sound/midiplugin.h b/sound/midiplugin.h
index c3b407a142..0247e160e1 100644
--- a/sound/midiplugin.h
+++ b/sound/midiplugin.h
@@ -84,7 +84,7 @@ private:
friend class Common::Singleton<SingletonBaseType>;
public:
- const MidiPlugin::list &getPlugins() const;
+ const MidiPlugin::List &getPlugins() const;
};
/** Convenience shortcut for accessing the MIDI manager. */
diff --git a/sound/mp3.cpp b/sound/mp3.cpp
index 72ed361926..eea725ce3a 100644
--- a/sound/mp3.cpp
+++ b/sound/mp3.cpp
@@ -63,6 +63,8 @@ protected:
const mad_timer_t _endTime;
mad_timer_t _totalTime;
+ int32 _totalPlayTime;
+
mad_stream _stream;
mad_frame _frame;
mad_synth _synth;
@@ -87,6 +89,7 @@ public:
bool endOfData() const { return _state == MP3_STATE_EOS; }
bool isStereo() const { return MAD_NCHANNELS(&_frame.header) == 2; }
int getRate() const { return _frame.header.samplerate; }
+ int32 getTotalPlayTime() const { return _totalPlayTime; }
protected:
void decodeMP3Data();
@@ -111,6 +114,73 @@ MP3InputStream::MP3InputStream(Common::SeekableReadStream *inStream, bool dispos
// may read a few bytes beyond the end of the input buffer).
memset(_buf + BUFFER_SIZE, 0, MAD_BUFFER_GUARD);
+ // Calculate play time
+ mad_timer_t length;
+
+ mad_timer_set(&length, 0, 0, 1000);
+ mad_timer_add(&length, start);
+ mad_timer_negate(&length);
+
+ if (mad_timer_sign(end) == 0) {
+ mad_timer_add(&length, end);
+ } else {
+ mad_stream_init(&_stream);
+ mad_frame_init(&_frame);
+
+ // Reset the stream data
+ _inStream->seek(0, SEEK_SET);
+
+ // Update state
+ _state = MP3_STATE_READY;
+
+ // Read the first few sample bytes
+ readMP3Data();
+
+ do {
+ // If necessary, load more data into the stream decoder
+ if (_stream.error == MAD_ERROR_BUFLEN)
+ readMP3Data();
+
+ while (_state == MP3_STATE_READY) {
+ _stream.error = MAD_ERROR_NONE;
+
+ // Decode the next header. Note: mad_frame_decode would do this for us, too.
+ // However, for seeking we don't want to decode the full frame (else it would
+ // be far too slow).
+ if (mad_header_decode(&_frame.header, &_stream) == -1) {
+ if (_stream.error == MAD_ERROR_BUFLEN) {
+ break; // Read more data
+ } else if (MAD_RECOVERABLE(_stream.error)) {
+ debug(6, "MP3InputStream: Recoverable error in mad_header_decode (%s)", mad_stream_errorstr(&_stream));
+ continue;
+ } else {
+ warning("MP3InputStream: Unrecoverable error in mad_header_decode (%s)", mad_stream_errorstr(&_stream));
+ break;
+ }
+ }
+
+ // Sum up the total playback time so far
+ mad_timer_add(&length, _frame.header.duration);
+ }
+ } while (_state != MP3_STATE_EOS);
+
+ mad_synth_finish(&_synth);
+ mad_frame_finish(&_frame);
+
+ // Reinit stream
+ _state = MP3_STATE_INIT;
+
+ // Reset the stream data
+ _inStream->seek(0, SEEK_SET);
+ }
+
+ _totalPlayTime = mad_timer_count(length, MAD_UNITS_MILLISECONDS);
+
+ if (numLoops && mad_timer_sign(length) >= 0)
+ _totalPlayTime *= numLoops;
+ else
+ _totalPlayTime = kUnknownPlayTime;
+
// Decode the first chunk of data. This is necessary so that _frame
// is setup and isStereo() and getRate() return correct results.
decodeMP3Data();
diff --git a/sound/softsynth/mt32/mt32emu.h b/sound/softsynth/mt32/mt32emu.h
index 0aa4df7488..6eedf04bc0 100644
--- a/sound/softsynth/mt32/mt32emu.h
+++ b/sound/softsynth/mt32/mt32emu.h
@@ -29,7 +29,7 @@
#define MT32EMU_MONITOR_PARTIALS 0
// Determines how the waveform cache file is handled (must be regenerated after sampling rate change)
#define MT32EMU_WAVECACHEMODE 0 // Load existing cache if possible, otherwise generate and save cache
-//#define MT32EMU_WAVECACHEMODE 1 // Load existing cache if possible, otherwise generage but don't save cache
+//#define MT32EMU_WAVECACHEMODE 1 // Load existing cache if possible, otherwise generate but don't save cache
//#define MT32EMU_WAVECACHEMODE 2 // Ignore existing cache, generate and save cache
//#define MT32EMU_WAVECACHEMODE 3 // Ignore existing cache, generate but don't save cache
diff --git a/sound/vorbis.cpp b/sound/vorbis.cpp
index a4b0f854e9..64f67d2a13 100644
--- a/sound/vorbis.cpp
+++ b/sound/vorbis.cpp
@@ -92,6 +92,7 @@ protected:
bool _isStereo;
int _rate;
uint _numLoops;
+ const uint _totalNumLoops;
#ifdef USE_TREMOR
ogg_int64_t _startTime;
@@ -118,6 +119,17 @@ public:
bool isStereo() const { return _isStereo; }
int getRate() const { return _rate; }
+ int32 getTotalPlayTime() const {
+ if (!_totalNumLoops)
+ return AudioStream::kUnknownPlayTime;
+
+#ifdef USE_TREMOR
+ return (_endTime - _startTime) * _totalNumLoops;
+#else
+ return (int32)((_endTime - _startTime) * 1000.0) * _totalNumLoops;
+#endif
+ }
+
protected:
void refill();
};
@@ -126,6 +138,7 @@ VorbisInputStream::VorbisInputStream(Common::SeekableReadStream *inStream, bool
_inStream(inStream),
_disposeAfterUse(dispose),
_numLoops(numLoops),
+ _totalNumLoops(numLoops),
_bufferEnd(_buffer + ARRAYSIZE(_buffer)) {
bool err = (ov_open_callbacks(inStream, &_ovFile, NULL, 0, g_stream_wrap) < 0);
diff --git a/test/common/hashmap.h b/test/common/hashmap.h
index 883e965065..5aa609bc00 100644
--- a/test/common/hashmap.h
+++ b/test/common/hashmap.h
@@ -37,6 +37,9 @@ class HashMapTestSuite : public CxxTest::TestSuite
TS_ASSERT( !container.contains(1) );
container[1] = 42;
TS_ASSERT( container.contains(1) );
+ container.erase(0);
+ container.erase(1);
+ TS_ASSERT( container.empty() );
}
void test_lookup( void )
diff --git a/tools/create_kyradat/create_kyradat.cpp b/tools/create_kyradat/create_kyradat.cpp
index abd1d54570..173ba0f993 100644
--- a/tools/create_kyradat/create_kyradat.cpp
+++ b/tools/create_kyradat/create_kyradat.cpp
@@ -31,7 +31,7 @@
#include "md5.h"
enum {
- kKyraDatVersion = 27,
+ kKyraDatVersion = 28,
kIndexSize = 12
};
@@ -42,6 +42,7 @@ enum {
#include "esp.h"
#include "fre.h"
#include "ger.h"
+#include "ita.h"
#include "towns.h"
#include "amiga.h"
@@ -425,12 +426,9 @@ bool extractStrings(PAKFile &out, const Game *g, const byte *data, const uint32
continue;
uint32 len = strlen((const char*) data + i);
i += len;
-#if 1
- // FIXME: Not sure whether this correct; the original code was ambiguious, see below
+
targetsize = targetsize - 1 - len;
-#else
- targetsize = --targetsize - len; // FIXME: This operation is undefined
-#endif
+
while (!data[++i]) {
if (i == len)
break;
@@ -1334,6 +1332,7 @@ const Game *gameDescs[] = {
kyra1EspGames,
kyra1FreGames,
kyra1GerGames,
+ kyra1ItaGames,
kyra1TownsGames,
kyra1AmigaGames,
kyra1FanTranslations,
diff --git a/tools/create_kyradat/ita.h b/tools/create_kyradat/ita.h
new file mode 100644
index 0000000000..6099f8f07d
--- /dev/null
+++ b/tools/create_kyradat/ita.h
@@ -0,0 +1,39 @@
+const ExtractEntry kyra1ItaFloppy[] = {
+ { kKallakWritingSeq, 0x000304fa, 0x00030cef },
+ { kMalcolmTreeSeq, 0x00030cef, 0x00030F05 },
+ { kWestwoodLogoSeq, 0x00030F05, 0x00030F50 },
+ { kKyrandiaLogoSeq, 0x00030F50, 0x00030FAC },
+ { kKallakMalcolmSeq, 0x00030FAC, 0x00031217 },
+ { kForestSeq, 0x00031217, 0x000313ac },
+ { kIntroCPSStrings, 0x000313AC, 0x000313C0 },
+ { kIntroWSAStrings, 0x000313C0, 0x00031440 },
+ { kIntroCOLStrings, 0x00031440, 0x0003146B },
+ { kIntroStrings, 0x0003146B, 0x000319E7 },
+ { kItemNames, 0x000346DC, 0x00034C6D },
+ { kTakenStrings, 0x00033F60, 0x00033F74 },
+ { kPlacedStrings, 0x00033F74, 0x00033F81 },
+ { kDroppedStrings, 0x00033FAA, 0x00033FB5 },
+ { kNoDropStrings, 0x00033F1A, 0x00033F5F },
+ { kPutDownString, 0x0002f120, 0x0002f154 },
+ { kWaitAmuletString, 0x0002f154, 0x0002f19e },
+ { kBlackJewelString, 0x0002f19e, 0x0002f1c0 },
+ { kHealingTipString, 0x0002f1c0, 0x0002f1ff },
+ { kPoisonGoneString, 0x0002f290, 0x0002f2c4 },
+ { kThePoisonStrings, 0x0002ff20, 0x0002ff83 },
+ { kFluteStrings, 0x000323ab, 0x000323f7 },
+ { kWispJewelStrings, 0x0002f1ff, 0x0002f273 },
+ { kMagicJewelStrings, 0x0002f273, 0x0002f290 },
+ { kFlaskFullString, 0x00030059, 0x0003007a },
+ { kFullFlaskString, 0x0002ffa4, 0x00030059 },
+ { kOutroHomeString, 0x000320f2, 0x000320f7 },
+ { kVeryCleverString, 0x0003204c, 0x00032084 },
+ { kGUIStrings, 0x0002f434, 0x0002f659 },
+ { kNewGameString, 0x00032ba6, 0x00032bc2 },
+ { kConfigStrings, 0x0002fe9f, 0x0002fef3 },
+ { -1, 0, 0 }
+};
+
+const Game kyra1ItaGames[] = {
+ { kKyra1, IT_ITA, -1, "5d7550306b369a3492f9f3402702477c", kyra1ItaFloppy },
+ GAME_DUMMY_ENTRY
+};
diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt
index b4d7b8b680..6e1a42a99d 100644
--- a/tools/scumm-md5.txt
+++ b/tools/scumm-md5.txt
@@ -577,6 +577,7 @@ pajama Pajama Sam 1: No Need to Hide When It's Dark Outside
a095e33061606d231ff37dca4c64c8ac -1 de All HE 99 - - Joachim Eberhard
898eaa21f79cf8d4f08db856244689ff 66505 en Windows HE 99 Updated - Joachim Eberhard
37aed3f91c1ef959e0bd265f9b13781f -1 us All HE 100 Updated - Kirben
+ 782393c5934ecd0b536eaf5fd541bd26 -1 en Windows HE 100 Updated - Jonathan
4aa93cb30e485b728504ba3a693f12bf -1 ru Windows HE 100 - - sev
f237bf8a5ef9af78b2a6a4f3901da341 18354 en All - Demo - khalek, sev
@@ -679,6 +680,7 @@ puttcircus Putt-Putt Joins the Circus
puttputt Putt-Putt Joins the Parade
0b3222aaa7efcf283eb621e0cefd26cc -1 ru DOS HE 60 - - sev
7e151c17adf624f1966c8fc5827c95e9 -1 en 3DO HE 61 - - khalek
+ be2abe172f58db170de3a037daa1dd27 -1 jp 3DO HE 61 - - clone2727
9708cf716ed8bcc9ff3fcfc69413b746 -1 en DOS HE 61 - - khalek
e361a7058ed8e8ebb462663c0a3ae8d6 -1 hb DOS HE 61 - - sev
684732efb5799c0f78804c99d8de9aba -1 en Mac HE 61 - - khalek
@@ -695,6 +697,7 @@ puttzoo Putt-Putt Saves the Zoo
c3b22fa4654bb580b20325ebf4174841 -1 nl Windows - - - joostp
9781422e4288dbc090720e4563168ba7 -1 fr Windows - - - gist974
92e7727e67f5cd979d8a1070e4eb8cb3 -1 en All HE 98.5 Updated - cyx
+ 3a3e592b074f595489f7f11e150c398d -1 us Windows HE 99 Updated - Adrian
3486ede0f904789267d4bcc5537a46d4 -1 en Mac - Demo - khalek
d220d154aafbfa12bd6f3ab1b2dae420 -1 de Mac - Demo - Joachim Eberhard
@@ -758,6 +761,7 @@ spyfox SPY Fox 1: Dry Cereal
76b66b43e593ad4d2f1dfb5cc8f19700 -1 nl Windows HE 99 - - sugarcube
72ac6bc980d5101c2142189d746bd62f -1 ru Windows HE 99 - - sev
3de99ef0523f8ca7958faa3afccd035a -1 us All HE 100 Updated - Kirben
+ 23394c8d29cc63c61313959431a12476 -1 en Windows HE 100 Updated - Jonathan
53e94115b55dd51d4b8ff0871aa1df1e 20103 en All - Demo - khalek, sev
fbdd947d21e8f5bac6d6f7a316af1c5a 15693 en All - Demo - sev