Codebase list frotz / f54b6da
Update upstream source from tag 'upstream/2.54+dfsg' Update to upstream version '2.54+dfsg' with Debian dir 68acdd7e0641290319ade39820d7f1ca9c4b96d6 Stephen Kitt 2 years ago
118 changed file(s) with 9336 addition(s) and 15649 deletion(s). Raw diff Collapse all Expand all
0 Summary of changes between Frotz 2.53 and Frotz 2.54:
1 =====================================================
2
3 Frotz 2.54 was released on Wednesday April 13, 2022.
4
5 This release's main attractions are official support for TOPS20 and
6 cross-compilation to DOS.
7
8 NEW FEATURES
9
10 - Added changes to allow for compilation on a DEC PDP-10 mainframe
11 running TOPS20. See INSTALL_PDP10.
12
13 - Added a means to cross-compile to DOS by way of Open Watcom C version
14 2 and later. See INSTALL_DOS.
15
16 - Added a quiet mode to dumb interface to quell startup messages.
17
18 BUG FIXES
19
20 - Fixed several problems with compilation under macOS.
21
22 - Fixed wrong glyphs in DOS Frotz's Amiga font mode. 1/2 and 1/4 were
23 there instead of the oe and OE ligatures.
24
25 - Fixed a failure of the -q flag to actually silence sound effects.
26
27 - Fixed an oversight in SDL Frotz that prevented some sounds from
28 playing in Lurking Horror.
29
30 - Made the dumb and curses interfaces read the resolution chunk from
31 Blorb files. Previously they would assume a resolution of 320x200.
32
33
034 Summary of changes between Frotz 2.52 and Frotz 2.53:
135 =====================================================
236
2761
2862 - Double-clicks are now recognized in sfrotz and xfrotz.
2963
30 - Fixed problem with spurious newline when a space triggers a word wrap.
64 - Fixed problem with spurious newlines when a space triggers a word wrap.
3165
3266 - Fixed a problem with UTF-8 characters getting corrupted during line
3367 editing.
3569 - Fixed some problems with V3 games scribbling on the status line in
3670 certain circumstances.
3771
38 - Removed pre-C99 idioms and C++ comments in curses and core to benefit
72 - Removed C99 idioms and C++ comments in curses and core to benefit
3973 older compilers. X11 is still pre-C99 clean. SDL interface is not
4074 pre-C99-clean due to libSDL2 not being pre-C99-clean.
4175
3838 curses. Of the current BSDs, only NetBSD still uses the old BSD curses
3939 library. All the others, including macOS, now use ncurses.
4040
41 For macOS users, Frotz with all three of its user interfaces should
42 compile without any changes to the source code or Makefiles. If you
43 install Xcode from the Mac App Store, you should be able to run
44 "make nosound" to build Frotz. To enable sound support, you can use
45 Homebrew https://brew.sh/ to install the sound support libraries:
46 "brew install libao libmodplug libsamplerate libsndfile libvorbis"
47 Once the sound libraries are installed, a simple "make" should build
48 Frotz.
41 A constant problem with macOS is the built-in ncurses. Even on the
42 latest releases of macOS; ncurses is very old and seems to identify
43 itself incorrectly. For this reason, it is highly recommended that
44 ncurses from Homebrew be installed before compiling Frotz. See
45 "Apple-specific installation issues" below.
4946
5047 For older systems, especially ones not Linux or [Net|Free|Open]BSD...
5148 You can download ncurses from https://www.gnu.org/software/ncurses/ or
211208
212209 To build dfrotz, frotz, and sfrotz; you can type "make all" and then
213210 "make install_all" to install them all.
211
212
213 =====================================
214 Apple-specific installation issues ||
215 =====================================
216
217 To start with, you need to make sure development tools are installed.
218 Apple provides the "Xcode" package from the Mac App Store.
219
220 As of 2022, the version of ncurses that Apple puts in macOS predates
221 6.0, which was released in 2015. Among other things, this version lacks
222 support for italic text. If you want Frotz to be able to produce italic
223 text, you should install the latest version of ncurses, preferably
224 through Homebrew (https://brew.sh/).
225
226 Start with installing its support scripts by typing this command in a
227 terminal window:
228
229 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
230
231 This will download and install Homebrew's support software.
232
233 Then install ncurses like this:
234
235 brew install ncurses
236
237 Now Frotz should compile just fine with this command:
238
239 make nosound
240
241 This tells the build process to not bother with sound support.
242
243 For sound support, some additional libraries are needed: libao,
244 libmodplug, libsamplerate, libsndfile, and libvorbis. Install these
245 like this:
246
247 brew install libao libmodplug libsamplerate libsndfile libvorbis
248
249 Now Frotz should compile just fine with this command:
250
251 make
252
253 If you want graphics support through SDL, you'll need some more
254 libraries, which may or may not already be present on your Mac. To
255 install them from Homebrew, do this:
256
257 brew install sdl2 sdl2-mixer freetype libpng jpeg zlib
258
259 Now Frotz you should get SDL Frotz using the command:
260
261 make sdl
262
263 If you insist on using Apple's own install of ncurses, you can
264 pass CURSES_CONFIG and ITALIC arguments like this.
265
266 make CURSES_CONFIG=ncurses5.4-config ITALIC= nosound
267
268 This is because the built-in ncurses doesn't support italic
269 text, even though its reported version suggests it does.
214270
215271
216272 ========================================
314370 archive. You MUST compile and install at least ncurses 5.0 from source.
315371 Versions of ncurses older than 5.0 are also broken on Irix.
316372
317 macOS X: You must use "cc" instead of "gcc" even though it's really GCC.
318 This is a quirk of the Mac OS X Developer Tools. MAN_PREFIX in the
319 Makefile should be set to "/usr/local/share".
320
321 Installing ncurses on macOS X used to be troublesome because of some
322 nonstandard places for things, but it seems that thse problems have been
323 solved with ncurses 5.2. A precompiled version of ncurses for macOS X is
324 available at http://gnu-darwin.sourceforge.net/.
373 macOS 10 and later: Install the "Xcode" package from the Mac App Store.
374 The supplied version of ncurses predates 6.0, so italics will not be
375 supported. See "Apple-specific installation issues" above.
325376
326377 Solaris: Some versions of curses on Solaris have trouble with color
327378 support. At least the one in Solaris 2.6 works okay. If compiled with
1212 for these are supported.
1313
1414 Sound is supported through Soundblaster compatible sound cards. Graphic
15 levels from Hercules to MCGA are supported.
15 levels from Hercules to MCGA and VGA are supported.
1616
17 To compile DOS Frotz, you need the following:
18 * Borland Turbo C++ 3.00. This is the latest version I'm aware
19 of capable of building 16-bit DOS applications.
20 Alternatively, use Open Watcom C 2.0 beta, May 17 2020, or higher.
21 * PC-DOS, MS-DOS, or DR-DOS version 5.0 or higher.
22 FreeDOS 1.2 works well too.
17 To compile DOS Frotz, you need one of following:
18
19 * Borland Turbo C++ 3.00. This is the latest version I'm aware
20 of that are capable of building 16-bit DOS applications. Turbo
21 C 2.01 may also work, but is untested. Both of these may be
22 obtained from archive.org.
23
24 * Open Watcom C 2.0 or later. This application suite can be
25 installed to a DOS machine to directly compile Frotz there or
26 to a Linux machine to cross-compile Frotz for DOS. It may be
27 obtained from https://github.com/open-watcom/open-watcom-v2.
28
29 To compile in a DOS environment PC-DOS, MS-DOS or DR-DOS version 5.0 or
30 higher is required. FreeDOS 1.2 and later will also work. The earliest
31 version of PC-DOS or MS-DOS under which DOS Frotz will run is currently
32 unknown. Real or virtualized hardware will work, including Virtualbox
33 and DOSBox.
34
35 DOS Frotz is currently built only as a 16-bit application.
2336
2437
25 =============================
26 Compilation with Turbo C++ ||
27 =============================
38 ===================================
39 Installing Borland Turbo C / C++ ||
40 ===================================
2841
29 Turbo C++ is typically installed to C:\tc. Make sure your path contains
30 C:\tc\bin. When this is done, type "make". Did Borland's make program
31 run? Now type "tcc". If those two commands work, then you should be
32 ready to compile.
42 If you already have a copy of Turbo C++ or Turbo C, follow the
43 instructions to install it on your DOS machine. Fortunately Borland's
44 successor, Embarcadero Technologies, has released these compiler suites
45 as freeware. They can be obtained from archive.org at
46 https://archive.org/details/TURBOC3_20180515 and
47 https://archive.org/details/msdos_borland_turbo_c_2.01. Instruction
48 manuals can also be found there.
3349
34 To compile, you need to first get the source code into a DOS machine,
35 whether it's real or emulated. Do "make dos" to produce a zip file,
36 frotzsrc.zip, which can then be copied to your real or virtual DOS
37 machine.
50 You'll want the Turbo C and TASM binary directories in your path. This
51 is what I use under DOSBox:
3852
39 To compile, open up this zip file and go into the frotzsrc directory and
40 type "build". That will invoke "build.bat", a batch file that simply
41 executes "make -f makefile.tc". The reason for this is a bit of
42 syntactic sugar to deal with the fact that it is impractical to have one
43 Makefile build both Unix and DOS versions. After about a minute, you
44 should have FROTZ.EXE. This file is all you need to run Frotz. Put it
45 somewhere in your path and go to wherever you keep your Infocom games.
46 Type "frotz zork1.dat" or whatever and there you go.
47
48 Compile-time options are set in src/dos/defs.h. There should be no need
49 to edit Makefile.tc. Having compile-time options like this allows for
50 the Turbo C IDE to be used. At the moment, the settings in frotz.prj do
51 not result in an optimized executable. I'm not sure how to get that
52 file in agreement with what's in Makefile.tc.
53
54 To clean up after a build, type "build clean".
53 path=z:\;c:\bin;%PATH%;c:\tc;c:\tc\bin;c:\tasm\bin
5554
5655
57 ===============================================
58 Compilation with Open Watcom C hosted on DOS ||
59 ===============================================
56 ===========================
57 Installing Open Watcom C ||
58 ===========================
6059
61 You should be able to find an installer program for the DOS version of Open
62 Watcom at https://github.com/open-watcom/open-watcom-v2/releases ; it will
63 likely be under the name open-watcom-2_0-c-dos.exe.
60 Visit https://github.com/open-watcom/open-watcom-v2/releases and go into
61 one of the recent builds. Download ow-snapshot.tar.gz and open it into
62 $HOME/watcom/. You can also download the source and build it yourself.
6463
65 Open Watcom is typically installed to C:\watcom. Make sure the environment
66 variable WATCOM points to the installation path, e.g.
64 Once you have $HOME/watcom/ populated correctly, add this to your
65 .bashrc or .profile files or wherever you set this stuff:
6766
68 set WATCOM=C:\watcom
67 export WATCOM=$HOME/watcom
6968
70 When this is done, type "%WATCOM%\binw\dos4gw". Did the DOS/4GW program
71 run? If this command works, then you should be ready to compile.
69 You will then need to add to your path which bin directory is
70 appropriate for your OS.
7271
73 To compile, you need to first get the source code into a DOS machine,
74 whether it's real or emulated. Do "make dos" to produce a zip file,
75 frotzsrc.zip, which can then be copied to your real or virtual DOS
76 machine.
72 If you are running Linux on amd64, add this:
73 export PATH=$PATH:$WATCOM/binl64
7774
78 To compile, open up this zip file and go into the frotzsrc directory and
79 type "owbuild". That will invoke "owbuild.bat", a batch file that sets some
80 environment variables and then executes "wmake -f makefile.ow". After about
81 a minute, you should have FROTZ.EXE. This file is all you need to run
82 Frotz. Put it somewhere in your path and go to wherever you keep your
83 Infocom games. Type "frotz zork1.dat" or whatever and there you go.
75 If you are running Linux on i386, add this:
76 export PATH=$PATH:$WATCOM/binl
8477
85 Compile-time options are set in src/owdos/defs.h. There should be no need
86 to edit Makefile.ow.
78 You will also want the Watcom tools binary directory in your path. This
79 is what I use under DOSBox:
8780
88 To clean up after a build, type "owbuild clean".
81 path=z:\;c:\bin;%PATH%;C:\WATCOM
82
83 It doesn't look like cross-compiling is supported from any combination
84 of OS and architecture other than Linux on i386 or amd64.
8985
9086
9187 ========================
92 Hardware Requirements ||
88 Compilation under DOS ||
9389 ========================
9490
95 The exact hardware requirements of DOS Frotz are yet to be determined.
96 Please send me reports of what Zcode works and what doesn't.
91 1. On a Unix machine, prepare the source code for compilation on a DOS
92 machine.
93
94 2. Copy the source code into your DOS machine and configure the build.
95
96 3. Compile Frotz.
97
98 Here we go!
99 -----------
100
101 1. On your Unix machine, do "make dos" in the Frotz distribution
102 directory, either in the Git repository or a downloaded tar.gz
103 archive. This will create a directory named "snavig/" containing
104 source code all set up for compilation. Zip up this directory and
105 get it into your DOS machine. The zip file will easily fit onto a
106 single 360K floppy. Snavig requires the use of GNU sed, so if
107 you're on macOS, BSD, or some other non-Linux platform; install GNU
108 sed before proceeding.
109
110 2. Back on the DOS machine, unzip the snavig archive into a directory
111 on the hard drive. Go into it and edit the file "defs.h". This is
112 where you can enable or disable features and adjust compile-time
113 options. Disabling features will result in a smaller executable and
114 run faster, which can be very important if you want to use Frotz on
115 an original IBM PC.
116
117 3. If you're using Turbo C, type "tcbuild". If you're using Open
118 Watcom C, type "owbuild". These batch files simply call "make -f
119 makefile.tc" or "wmake -f makefile.ow". After a couple minutes,
120 Frotz will be compiled and ready for use. To clean up after a
121 build, type "tcbuild clean" or "owbuild clean".
122
123
124 =======================
125 Minimum Requirements ||
126 =======================
127
128 The minimum hardware and operating system requirements of DOS Frotz are
129 unknown. It's fairly clear that the original IBM PC can run all Infocom
130 games at least up to V5. Graphics or sound might be possible.
131
132 Please send me reports of what hardware and games work and what don't.
0 ===========================================================================
1 ---------------------------------------------------------------------------
2 | READ THIS FILE ALL THE WAY THROUGH BEFORE ATTEMPTING TO INSTALL FROTZ |
3 ---------------------------------------------------------------------------
4 ===========================================================================
5
6
7 Because Frotz was originally written specifically for MS/PC DOS and then
8 ported to Unix machines. As such, nothing about it was written with
9 36-bit systems in mind. The initial job of porting to the PDP-10 mostly
10 involves taking the differences between 32-bitness and 36-bitness. This
11 was sufficient for porting the dumb interface. The ongoing job of
12 adding full screen handling will involve coming up with an old version
13 of curses or writing a cut-down version that supports only VT100/ANSI
14 and maybe VT52.
15
16 Currently the porting effort is focusing on TOPS20.
17
18 The porting effort used Mark Crispin's Panda TOPS20 distribution from
19 http://panda.trailing-edge.com/ and the KCC C compiler which is included.
20
21 To compile, do "make tops20". This will copy the needed source files to
22 the "snavig/" directory and process them to fit TOPS20's limit of six
23 alphanumeric caps-insensitive characters on extern symbols and
24 filenames. This requires the GNU version of sed. So if you're on
25 macOS, *BSD, or something else non-GNU; install GNU sed before
26 proceeding.
27
28 The contents of this "snavig/" directory then needs to be uploaded to a
29 subdirectory on a PDP10. Then while in the directory with the source,
30 the following command will then compile and link the code to produce an
31 executable:
32
33 cc -o dfrotz.exe *.c
34
35 There will be some complaints of unused parameters for some functions.
36 This is to be expected because the usual means of making the compiler to
37 keep quiet about these things don't work for KCC. A considerable amount
38 of disk quota is required to complete the linking, but how much is not
39 entirely known.
40
41 If you get a complaint that you're out of disk space, look at the TOPS20
42 manuals for how to add yourself to the WHEEL and OPERATOR groups. Then
43 you can set disk quotas yourself. You'll want to do something like this:
44
45 enable
46 build <username>
47 permanent infinity
48 working infinity
49 disable
50
51 Then for any subdirectories
52
53 enable
54 build <username.frotz>
55 permanent infinity
56 working infinity
57 disable
58 connect <username.frotz>
59
60 Now you're in the directory <username.frotz>. To get source code into
61 the machine, FTP is probably your best bet.
62
63 ftp ftp.foobar.com
64 login ftp
65 set no confirmation all
66 cd <wherever the source is>
67 get *
68 quit
69 reset ftp
70
71 Now compile.
72
73 cc -o dfrotz.exe *.c
74
75
76 There are some irritating characteristics of TOPS20 that need to be
77 addressed. So far, the only serious one deals with the terminal width.
78 TOPS20 will automatically insert a newline every N characters where N is
79 the terminal width setting. You can see these by typing INFO TERM. To
80 make TOPS20 not do this, you need to set the width to zero -- like this
81 "TERM WIDTH 0". It's best to do these terminal setup things in your
82 LOGIN.CMD file, which is akin to a .profile or .bashrc file on a Unix
83 machine. Add the following lines in the following order to LOGIN.CMD:
84
85 TERM VT100
86 TERM WIDTH 0
87
88 When setting TERM VT100, this implies a width of 80. Therefore the
89 width needs to be set AFTER the terminal type in order for the width
90 setting to stick.
2626 # OPTIONS: ao, none
2727 SOUND_TYPE ?= ao
2828
29 # Choose DOS options
30 #DOS_NO_SOUND ?= yes
31 DOS_NO_BLORB ?= yes
32 DOS_NO_GRAPHICS ?= yes
33 DOS_NO_TRUECOLOUR ?= yes
34
2935
3036 ##########################################################################
3137 # The configuration options below are intended mainly for older flavors
7076
7177 # Uncomment this to disable Blorb support for dumb and curses interfaces.
7278 # SDL interface always has Blorb support.
79 # Doing this for the X11 interface will make it use old-style graphics.
7380 #NO_BLORB = yes
7481
7582 # These are for enabling local version of certain functions which may be
9299 # Uncomment to disable format codes for dumb interface
93100 #DISABLE_FORMATS = yes
94101
102 # For missing basename()
103 #NO_BASENAME = yes
104
105 # If your target complains excessively about unused parameters, uncomment this
106 #SILENCE_UNUSED = yes
107
95108 # Assorted constants
96109 MAX_UNDO_SLOTS = 500
97110 MAX_FILE_NAME = 80
116129 # For now, assume !windows == unix.
117130 OS_TYPE ?= unix
118131 UNAME_S := $(shell uname -s)
132
133 ifeq ($(MAKECMDGOALS),tops20)
134 EXPORT_TYPE = tops20
135 endif
136 ifeq ($(MAKECMDGOALS),dos)
137 EXPORT_TYPE = dos
138 endif
139 ifeq ($(MAKECMDGOALS),owdos)
140 EXPORT_TYPE = dos
141 endif
142 ifeq ($(MAKECMDGOALS),dosdefs)
143 EXPORT_TYPE = dos
144 endif
145
146 RANLIB ?= ranlib
119147 PKG_CONFIG ?= pkg-config
120148
121149 # If we have pkg-config...
176204 # macOS
177205 ifeq ($(UNAME_S),Darwin)
178206 MACOS = yes
179 # On macOS, curses is actually ncurses, but to get wide
180 # char support you need to define _XOPEN_SOURCE_EXTENDED
181 # Often ncursesw is not present, but has wide support anyhow.
182 # Reset CURSES, use CURSES_MACOS on command line to override.
207 # On macOS, we'll try to use Homebrew's ncurses
208 HOMEBREW_PREFIX ?= $(shell brew --prefix)
209 LDFLAGS += -L$(HOMEBREW_PREFIX)/lib
210
183211 CURSES_MACOS ?= ncurses
184212 CURSES = $(CURSES_MACOS)
185 # get flags from pkg-config curses if available
186 ifndef PKG_CONFIG_CURSES
187 # macOS provided ncurses, but doesn't have pkg-config .pc files installed.
188 # Since ncursesx.x-config (should be) available if curses is installed,
189 # use that instead of pkg-config to get --libs and --cflags.
190 # Search $PATH for ncursesx.x-config, use the first one.
191 CURSES_CONFIG ?= $(shell echo $$PATH | while read -d ':' p; do \
192 stat -f'%N' $$p/$(CURSES)[0-9]*-config 2>/dev/null; done | head -n1)
213
214 CURSES_CONFIG ?= $(shell stat -f'%N' $(HOMEBREW_PREFIX)/opt/ncurses/bin/ncurses6-config)
193215 # Reset CURSES_LDFLAGS, CURSES_CFLAGS.
194216 CURSES_LDFLAGS = $(shell $(CURSES_CONFIG) --libs)
195217 CURSES_CFLAGS = $(shell $(CURSES_CONFIG) --cflags)
196218 ifeq ($(CURSES_CONFIG),)
197 $(error no $(CURSES)x.x-config found)
198 endif
219 $(error no ncurses6-config found. Install Homebrew and brew install ncurses, or set CURSES_CONFIG yourself)
199220 endif
200221 SDL_CFLAGS += -D_XOPEN_SOURCE
201222 endif
226247 export NO_SOUND
227248
228249 NAME = frotz
229 VERSION = 2.53
250 VERSION = 2.54
230251 RELEASE_NOTES = "Official release."
231252
232253 # If we're working from git, we have access to proper variables. If
238259 GIT_HASH_SHORT = $(shell git rev-parse --short HEAD)
239260 GIT_DATE = $(shell git show -s --format=%ci)
240261 else
241 GIT_HASH = 85a3a98dcbae0ee5aa036686a13b1088f7d6de17
242 GIT_HASH_SHORT = 85a3a98
243 GIT_DATE = 2021-02-27 16:50:16 -0800
262 GIT_HASH = 5a86de2f0799bde12699a0189ea12be8c96194a5
263 GIT_HASH_SHORT = 5a86de2
264 GIT_DATE = 2022-04-13 23:47:41 -0700
244265 endif
245266 export CFLAGS
246267
251272 COMMON_DIR = $(SRCDIR)/common
252273 COMMON_LIB = $(COMMON_DIR)/frotz_common.a
253274 COMMON_DEFINES = $(COMMON_DIR)/defs.h
254 HASH = $(COMMON_DIR)/git_hash.h
275 HASH = $(COMMON_DIR)/hash.h
276
277 MISC_DIR = $(SRCDIR)/misc
255278
256279 BLORB_DIR = $(SRCDIR)/blorb
257280 BLORB_LIB = $(BLORB_DIR)/blorblib.a
264287 DUMB_LIB = $(DUMB_DIR)/frotz_dumb.a
265288
266289 DOS_DIR = $(SRCDIR)/dos
267 DOS_DEFINES = $(DOS_DIR)/defs.h
268
269 OW_DOS_DIR = $(SRCDIR)/owdos
270 OW_DOS_DEFINES = $(OW_DOS_DIR)/defs.h
271290
272291 X11_DIR = $(SRCDIR)/x11
273292 X11_LIB = $(X11_DIR)/frotz_x11.a
274 export X11_PKGS = x11 xt
293 export X11_PKGS = x11 xt libpng libjpeg zlib
275294 X11_FONTDIR = $(DESTDIR)$(PREFIX)/share/fonts/X11/zork
276295 X11_LDFLAGS = `pkg-config $(X11_PKGS) --libs` -lm
277296
280299 export SDL_PKGS = libpng libjpeg sdl2 SDL2_mixer freetype2 zlib
281300 SDL_LDFLAGS += $(shell $(PKG_CONFIG) $(SDL_PKGS) --libs) -lm
282301
283 SUBDIRS = $(COMMON_DIR) $(CURSES_DIR) $(X11_DIR) $(SDL_DIR) $(DUMB_DIR) $(BLORB_DIR) $(DOS_DIR) $(OW_DOS_DIR)
302 SUBDIRS = $(COMMON_DIR) $(CURSES_DIR) $(X11_DIR) $(SDL_DIR) $(DUMB_DIR) $(BLORB_DIR) $(DOS_DIR)
284303 SUB_CLEAN = $(SUBDIRS:%=%-clean)
285304
286305 FROTZ_BIN = frotz$(EXTENSION)
294313 XFROTZ_LIBS = $(COMMON_LIB) $(X11_LIB) $(BLORB_LIB) $(COMMON_LIB)
295314 SFROTZ_LIBS = $(COMMON_LIB) $(SDL_LIB) $(BLORB_LIB) $(COMMON_LIB)
296315
316 # Tools
317 SNAVIG = $(MISC_DIR)/snavig.pl
318 SNAVIG_DIR = snavig
297319
298320 ifdef NO_BLORB
299321 SOUND_TYPE = none
356378 $(CC) $+ -o $@$(EXTENSION) $(LDFLAGS) $(SDL_LDFLAGS)
357379 @echo "** Done building Frotz with SDL interface."
358380
359 dos: $(DOS_BIN)
360 $(DOS_BIN): $(DOS_DEFINES) $(OW_DOS_DEFINES) $(HASH)
361 ifneq ($(and $(wildcard $(GIT_DIR)),$(shell which git)),)
362 @echo
363 @echo " ** Cannot cross-compile for DOS yet."
364 @echo " ** Copy this zip file, $(NAME)src.zip, into a DOS machine and use Turbo C."
365 @echo " ** or Open Watcom C. A virtualized DOS machine will do. This zip file"
366 @echo " ** will fit on a single double-sided double-density 5.25-inch floppy disk."
367 @echo " ** Read the file INSTALL_DOS for more information."
368 @echo
369 @git archive --format=zip --prefix $(NAME)src/ HEAD -o $(NAME)src.zip
370 @zip -d $(NAME)src.zip $(NAME)src/src/curses/* \
371 $(NAME)src/src/dumb/* $(NAME)src/src/blorb/* \
372 $(NAME)src/src/sdl/* $(NAME)src/src/misc/* \
373 $(NAME)src/src/x11/* \
374 $(NAME)src/doc/*.6 $(NAME)src/doc/frotz.conf* \
375 $(NAME)src/doc/Xresources > /dev/null
376 @mkdir -p $(NAME)src/$(DOS_DIR) $(NAME)src/$(OW_DOS_DIR)
377 @cp $(DOS_DEFINES) $(NAME)src/$(DOS_DIR)
378 @cp $(OW_DOS_DEFINES) $(NAME)src/$(OW_DOS_DIR)
379 @zip $(NAME)src.zip $(NAME)src/$(DOS_DEFINES) $(NAME)src/$(OW_DOS_DEFINES) > /dev/null
380 @rm -rf $(NAME)src
381
382 else
383 @echo "Not in a git repository or git command not found. Cannot make a tarball."
381 owdos: $(DOS_BIN)
382 $(DOS_BIN): $(COMMON_DEFINES) $(HASH)
383 ifneq ($(shell which wmake),)
384 wmake -f Makefile.ow
385 else
386 $(error wmake command not found. Cannot make the DOS version)
384387 endif
385388
386389 all: $(FROTZ_BIN) $(DFROTZ_BIN) $(SFROTZ_BIN) $(XFROTZ_BIN)
390 snavig:
391 @echo "Snavig: Change an object's shape..."
392 @echo "Possible snavig-processed targets:"
393 @echo " dos (done)"
394 @echo " tops20 (done)"
395 @echo " its (not even started)"
396 @echo " tops10 (not even started)"
397 @echo " tenex (not even started)"
398 @echo " waits (not even started)"
399 @echo "That's all for now."
400
401 dos: $(COMMON_DEFINES) $(HASH)
402 @rm -rf $(SNAVIG_DIR)
403 @mkdir $(SNAVIG_DIR)
404 @echo "** Copying support text files to $(SNAVIG_DIR)"
405 @cp Makefile.tc Makefile.ow $(SNAVIG_DIR)
406 @cp owbuild.bat tcbuild.bat $(SNAVIG_DIR)
407 @cp INSTALL_DOS $(SNAVIG_DIR)/INSTALL.txt
408 @cp doc/frotz.txt $(SNAVIG_DIR)
409 @sed -i "/^OW_DOS_DIR.*/d" $(SNAVIG_DIR)/Makefile.ow
410 @sed -i "/^CORE_DIR.*/d" $(SNAVIG_DIR)/Makefile.ow
411 @sed -i "/^BLORB_DIR.*/d" $(SNAVIG_DIR)/Makefile.ow
412 @echo "** Invoking snavig"
413 @$(SNAVIG) -t dos $(COMMON_DIR) $(BLORB_DIR) $(DOS_DIR) $(SNAVIG_DIR)
414 @echo "** Adding frotz.prj for building with Turbo C IDE"
415 @cp frotz.prj $(SNAVIG_DIR)
416 @echo "$(SNAVIG_DIR)/ now contains Frotz source code for 16-bit DOS."
417 @echo "Supported compilers are:"
418 @echo " Borland Turbo C 3.00 and Borland MAKE 3.6"
419 @echo " Open Watcom C 2.0 and Open Watcom MAKE (wmake)"
420
421 tops20: $(COMMON_DEFINES) $(HASH)
422 @rm -rf $(SNAVIG_DIR)
423 @mkdir $(SNAVIG_DIR)
424 @echo "** Invoking snavig"
425 @cp Makefile.kcc $(SNAVIG_DIR)/Makefile
426 @$(SNAVIG) -t tops20 $(COMMON_DIR) $(DUMB_DIR) $(SNAVIG_DIR)
427 @echo "$(SNAVIG_DIR)/ now contains Frotz source code for $(EXPORT_TYPE)."
428 @echo "Supported compilers are:"
429 @echo " KCC-6.620(c2l3)"
430
387431
388432 common_lib: $(COMMON_LIB)
389433 curses_lib: $(CURSES_LIB)
393437 blorb_lib: $(BLORB_LIB)
394438 dos_lib: $(DOS_LIB)
395439
440 common-lib: $(COMMON_LIB)
441 curses-lib: $(CURSES_LIB)
442 x11-lib: $(X11_LIB)
443 sdl-lib: $(SDL_LIB)
444 dumb-lib: $(DUMB_LIB)
445 blorb-lib: $(BLORB_LIB)
446 dos-lib: $(DOS_LIB)
447
396448 $(COMMON_LIB): $(COMMON_DEFINES) $(HASH)
397449 $(MAKE) -C $(COMMON_DIR)
398450
417469
418470 # Compile-time generated defines and strings
419471 #
472 dosdefs: hash defs
420473 defs: common_defines
474 common-defines: common_defines
421475 common_defines: $(COMMON_DEFINES)
422476 $(COMMON_DEFINES):
423477 ifeq ($(wildcard $(COMMON_DEFINES)),)
424478 @echo "** Generating $@"
425479 @echo "#ifndef COMMON_DEFINES_H" > $@
426480 @echo "#define COMMON_DEFINES_H" >> $@
481 @echo "#define RELEASE_NOTES \"$(RELEASE_NOTES)\"" >> $@
482
483 ifeq ($(EXPORT_TYPE), dos)
484 @echo "#define MSDOS_16BIT" >> $@
485
486
487 @echo "/* Uncomment this to disable Blorb support. */" >> $@
488 ifeq ($(DOS_NO_BLORB), yes)
489 @echo "#define NO_BLORB" >> $@
490 else
491 @echo "/* #define NO_BLORB */" >> $@
492 endif
493
494 @echo "/* Uncomment this to disable sound support. */" >> $@
495 ifeq ($(DOS_NO_SOUND), yes)
496 @echo "#define NO_SOUND" >> $@
497 else
498 @echo "/* #define NO_SOUND */" >> $@
499 endif
500
501
502 @echo "/* Uncomment this to disable graphics support. */" >> $@
503 ifeq ($(DOS_NO_GRAPHICS), yes)
504 @echo "#define NO_GRAPHICS" >> $@
505 else
506 @echo "/* #define NO_GRAPHICS */" >> $@
507 endif
508
509 @echo "/* Uncomment this to disable true-colour support. */" >> $@
510 ifeq ($(DOS_NO_TRUECOLOUR), yes)
511 @echo "#define NO_TRUECOLOUR" >> $@
512 else
513 @echo "/* #define NO_TRUECOLOUR */" >> $@
514 endif
515
516
517 else
518 ifeq ($(EXPORT_TYPE), tops20)
519 @echo "#ifndef TOPS20" >> $@
520 @echo "#define TOPS20" >> $@
521 @echo "#endif" >> $@
522 @echo "#define NO_STRDUP" >> $@
523 @echo "#define NO_BASENAME" >> $@
524 @echo "#define MAXPATHLEN 39" >> $@
525 @echo "#define NO_BLORB" >> $@
526 else
527
528 ifdef MACOS
529 @echo "#define MACOS" >> $@
530 endif
531
427532 ifeq ($(OS_TYPE), unix)
428533 @echo "#define UNIX" >> $@
429534 endif
535 endif
536 endif
537
430538 @echo "#define MAX_UNDO_SLOTS $(MAX_UNDO_SLOTS)" >> $@
431539 @echo "#define MAX_FILE_NAME $(MAX_FILE_NAME)" >> $@
432540 @echo "#define TEXT_BUFFER_SIZE $(TEXT_BUFFER_SIZE)" >> $@
450558 ifdef NO_EXECINFO_H
451559 @echo "#define NO_EXECINFO_H" >> $@
452560 endif
453 ifeq ($(USE_UTF8), yes)
454 @echo "#define USE_UTF8" >> $@
561
562 # When exporting source code rather than compiling it here, the target machine
563 # typically can't do UTF8.
564 ifeq ($(EXPORT_TYPE),)
565 $(if $(findstring yes,$(USE_UTF8)), @echo "#define USE_UTF8" >> $@)
566 endif
567
568 ifdef FREEBSD
569 @echo "#define __BSD_VISIBLE 1" >> $@
455570 endif
456571 ifdef DISABLE_FORMATS
457572 @echo "#define DISABLE_FORMATS" >> $@
459574 @echo "#endif /* COMMON_DEFINES_H */" >> $@
460575 endif
461576
462
463 dosdefs: $(DOS_DEFINES) $(OW_DOS_DEFINES)
464 $(DOS_DEFINES) $(OW_DOS_DEFINES):
465 @echo "** Generating $@"
466 @echo "#ifndef DOS_DEFINES_H" > $@
467 @echo "#define DOS_DEFINES_H" >> $@
468 @echo "#ifndef MSDOS_16BIT" >> $@
469 @echo "#define MSDOS_16BIT" >> $@
470 @echo "#endif /* MSDOS_16BIT */" >> $@
471 @echo "#define RELEASE_NOTES \"$(RELEASE_NOTES)\"" >> $@
472 @echo "#define MAX_UNDO_SLOTS $(MAX_UNDO_SLOTS)" >> $@
473 @echo "#define MAX_FILE_NAME $(MAX_FILE_NAME)" >> $@
474 @echo "#define TEXT_BUFFER_SIZE $(TEXT_BUFFER_SIZE)" >> $@
475 @echo "#define INPUT_BUFFER_SIZE $(INPUT_BUFFER_SIZE)" >> $@
476 @echo "#define STACK_SIZE $(STACK_SIZE)" >> $@
477 @echo "#define NO_BLORB" >> $@
478 @echo "#endif /* DOS_DEFINES_H */" >> $@
479
480
577 curses-defines: curses_defines
481578 curses_defines: $(CURSES_DEFINES)
482579 $(CURSES_DEFINES):
483580 ifeq ($(wildcard $(CURSES_DEFINES)),)
536633 # Administrative stuff
537634 #
538635 install: install_frotz
636 install-frotz: install_frotz
539637 install_frotz: $(FROTZ_BIN)
540 install -d $(DESTDIR)$(BINDIR)
638 mkdir -p $(DESTDIR)$(BINDIR) && test -w $(DESTDIR)$(BINDIR)
541639 install -c -m 755 $(FROTZ_BIN) $(DESTDIR)$(BINDIR)
542 install -d $(DESTDIR)$(MANDIR)/man6
640 mkdir -p $(DESTDIR)$(MANDIR)/man6 && test -w $(DESTDIR)$(MANDIR)/man6
543641 install -m 644 doc/frotz.6 $(DESTDIR)$(MANDIR)/man6/
544642
545643 uninstall: uninstall_frotz
644 uninstall-frotz: uninstall-frotz
546645 uninstall_frotz:
547646 rm -f $(DESTDIR)$(BINDIR)/frotz
548647 rm -f $(DESTDIR)$(MANDIR)/man6/frotz.6
549648
550649 install_dumb: install_dfrotz
650 install-dumb: install_dfrotz
651 install-dfrotz: install_dfrotz
551652 install_dfrotz: $(DFROTZ_BIN)
552 install -d $(DESTDIR)$(BINDIR)
653 mkdir -p $(DESTDIR)$(BINDIR) && test -w $(DESTDIR)$(BINDIR)
553654 install -c -m 755 $(DFROTZ_BIN) $(DESTDIR)$(BINDIR)
554 install -d $(DESTDIR)$(MANDIR)/man6
655 mkdir -p $(DESTDIR)$(MANDIR)/man6 && test -w $(DESTDIR)$(MANDIR)/man6
555656 install -m 644 doc/dfrotz.6 $(DESTDIR)$(MANDIR)/man6/
556657
557658 uninstall_dumb: uninstall_dfrotz
659 uninstall-dumb: uninstall_dfrotz
660 uninstall-dfrotz: uninstall_dfrotz
558661 uninstall_dfrotz:
559662 rm -f $(DESTDIR)$(BINDIR)/dfrotz
560663 rm -f $(DESTDIR)$(MANDIR)/man6/dfrotz.6
561664
562665 install_x11: install_xfrotz
666 install-x11: install_xfrotz
667 install-xfrotz: install_xfrotz
563668 install_xfrotz: $(XFROTZ_BIN)
564 install -d "$(DESTDIR)$(PREFIX)/bin" "$(DESTDIR)$(MANDIR)/man6"
669 mkdir -p "$(DESTDIR)$(PREFIX)/bin" && test -w $(DESTDIR)$(BINDIR)
670 mkdir -p "$(DESTDIR)$(MANDIR)/man6" && test -w $(DESTDIR)$(MANDIR)/man6
565671 install "$(XFROTZ_BIN)" "$(DESTDIR)$(PREFIX)/bin/"
566672 install -m 644 doc/xfrotz.6 "$(DESTDIR)$(MANDIR)/man6/"
567 install -d "$(X11_FONTDIR)"
673 mkdir -p "$(X11_FONTDIR)"
568674 install -m 644 "$(X11_DIR)/Zork_r400-10.pcf" "$(X11_FONTDIR)"
569675 install -m 644 "$(X11_DIR)/Zork_r400-11.pcf" "$(X11_FONTDIR)"
570676 install -m 644 "$(X11_DIR)/Zork_r400-13.pcf" "$(X11_FONTDIR)"
573679 $(MKFONTDIR) $(X11_FONTDIR)
574680
575681 uninstall_x11: uninstall_xfrotz
682 uninstall-x11: uninstall_xfrotz
683 uninstall-xfrotz: uninstall_xfrotz
576684 uninstall_xfrotz:
577685 rm -f "$(DESTDIR)$(PREFIX)/bin/xfrotz"
578686 rm -f "$(DESTDIR)$(MANDIR)/man6/xfrotz.6"
584692 rm -f "$(X11_FONTDIR)/fonts.dir"
585693 find $(X11_FONTDIR) -type d -depth -empty -exec rmdir "{}" \;
586694
695 install-sdl: install_sfrotz
587696 install_sdl: install_sfrotz
697 install-sfrotz: install_sfrotz
588698 install_sfrotz: $(SFROTZ_BIN)
589 install -d $(DESTDIR)$(BINDIR)
699 mkdir -p $(DESTDIR)$(BINDIR) && test -w $(DESTDIR)$(BINDIR)
590700 install -c -m 755 $(SFROTZ_BIN) $(DESTDIR)$(BINDIR)
591 install -d $(DESTDIR)$(MANDIR)/man6
701 mkdir -p $(DESTDIR)$(MANDIR)/man6 && test -w $(DESTDIR)$(MANDIR)/man6
592702 install -m 644 doc/sfrotz.6 $(DESTDIR)$(MANDIR)/man6/
593703
704 uninstall-sdl: uninstall_sfrotz
594705 uninstall_sdl: uninstall_sfrotz
706 uninstall-sfrotz: uninstall_sfrotz
595707 uninstall_sfrotz:
596708 rm -f $(DESTDIR)$(BINDIR)/sfrotz
597709 rm -f $(DESTDIR)$(MANDIR)/man6/sfrotz.6
598710
711 install-all: install_all
599712 install_all: install_frotz install_dfrotz install_sfrotz install_xfrotz
600713
714 uninstall-all: uninstall_all
601715 uninstall_all: uninstall_frotz uninstall_dfrotz uninstall_sfrotz uninstall_xfrotz
602716
603717
605719 frotz-$(VERSION).tar.gz:
606720 ifneq ($(and $(wildcard $(GIT_DIR)),$(shell which git)),)
607721 git archive --format=tgz --prefix $(NAME)-$(VERSION)/ HEAD -o $(NAME)-$(VERSION).tar.gz
608 else
609 @echo "Not in a git repository or git command not found. Cannot make a zip file."
722 @echo $(NAME)-$(VERSION).tar.gz created.
723 else
724 @echo "Not in a git repository or git command not found. Cannot make an archive file."
610725 endif
611726
612727 dosdist:
615730 @echo " ** Just add frotz.exe compiled wherever."
616731 @echo " ** Then do \"zip -r $(NAME)$(DOSVER).zip $(NAME)$(DOSVER)\""
617732 @echo
618 @mkdir $(NAME)$(DOSVER)
733 @mkdir -p $(NAME)$(DOSVER)
619734 @cp ChangeLog $(NAME)$(DOSVER)/changes.txt
620735 @cp frotz.lsm $(NAME)$(DOSVER)
621736 @cp doc/frotz.txt $(NAME)$(DOSVER)
627742 @unix2dos -q $(NAME)$(DOSVER)/*
628743 @touch $(NAME)$(DOSVER)/*
629744
745 owdosdist: $(NAME)$(DOSVER).zip
746 $(NAME)$(DOSVER).zip: dosdist $(DOS_BIN)
747 @cp $(DOS_BIN) $(NAME)$(DOSVER)/$(DOS_BIN)
748 @zip -r $(NAME)$(DOSVER).zip $(NAME)$(DOSVER)
749
630750 clean: $(SUB_CLEAN)
631751 rm -rf $(NAME)-$(VERSION)
632 rm -rf $(COMMON_DEFINES) \
633 $(CURSES_DEFINES) \
634 $(DOS_DEFINES) \
635 $(OW_DOS_DEFINES) \
636 $(HASH)
752 rm -rf $(COMMON_DEFINES) $(CURSES_DEFINES) $(HASH)
637753 rm -f FROTZ.BAK FROTZ.EXE FROTZ.LIB FROTZ.DSK *.OBJ
754 rm -f FROTZ.MAP *.ERR
755 rm -f frotz.map *.err
638756
639757 distclean: clean
640 rm -f frotz$(EXTENSION) dfrotz$(EXTENSION) sfrotz$(EXTENSION) xfrotz$(EXTENTION)
758 rm -f $(FROTZ_BIN) $(DFROTZ_BIN) $(SFROTZ_BIN) $(XFROTZ_BIN) $(DOS_BIN)
641759 rm -f a.out
642 rm -rf $(NAME)src $(NAME)$(DOSVER)
643 rm -f $(NAME)*.tar.gz $(NAME)src.zip $(NAME)$(DOSVER).zip
760 rm -rf $(NAME)src $(NAME)$(DOSVER) $(SNAVIG_DIR)
761 rm -f $(NAME)*.tar.gz $(NAME)src.zip $(NAME)$(DOSVER).zip snavig.zip
644762
645763 help:
646764 @echo "Targets:"
651769 @echo " x11: for X11 graphics"
652770 @echo " all: build curses, dumb, SDL, and x11 versions"
653771 @echo " dos: Make a zip file containing DOS Frotz source code"
772 @echo " owdos: for cross-compiling to DOS with Open Watcom"
773 @echo " snavig: Process source files for building on TOPS20"
654774 @echo " install"
655775 @echo " uninstall"
656776 @echo " install_dumb"
669789 .SUFFIXES:
670790 .SUFFIXES: .c .o .h
671791
672 .PHONY: all clean dist dosdist curses ncurses dumb sdl hash help \
673 common_defines dosdefs curses_defines nosound nosound_helper\
674 $(COMMON_DEFINES) $(DOS_DEFINES) $(OW_DOS_DEFINES) $(CURSES_DEFINES) \
675 $(HASH) \
792 .PHONY: all clean dist dosdist curses ncurses dumb sdl hash help snavig \
793 common_defines dosdefs curses_defines nosound nosound_helper \
794 $(COMMON_DEFINES) $(CURSES_DEFINES) $(HASH) \
676795 blorb_lib common_lib curses_lib dumb_lib \
677796 install install_dfrotz install_sfrotz install_xfrotz $(SUB_CLEAN)
678797 uninstall uninstall_dfrotz uninstall_sfrotz uninstall_xfrotz
0 # This file is used to build Frotz for TOPS20 using the KCC compiler.
1 # KCC-6.620(c2l3) is required. Other versions are untested.
2
3 CC = cc
4
5 NAME = frotz
6
7 C = .c
8 O = .rel
9 E = .exe
10
11 CFLAGS =
12
13 DFROTZ = d$(NAME)$(E)
14 CFROTZ = $(NAME)$(E)
15
16 CORE_OBJ = buffer$(O) err$(O) fastme$(O) files$(O) getopt$(O) hotkey$(O) \
17 input$(O) main$(O) math$(O) missin$(O) object$(O) \
18 proces$(O) quetza$(O) random$(O) redire$(O) screen$(O) \
19 sound$(O) stream$(O) table$(O) text$(O) variab$(O)
20
21 DUMB_OBJ = dblorb$(O) dinit$(O) dinput$(O) doutpu$(O) dpic$(O)
22
23 dumb: $(DFROTZ)
24 dfrotz: $(DFROTZ)
25 $(DFROTZ): $(DUMB_OBJ) $(CORE_OBJ)
26 $(CC) $(CFLAGS) -o $(DFROTZ) $(DUMB_OBJ) $(CORE_OBJ)
27
28 .c.rel:
29 $(CC) $(CFLAGS) -c $< -o $@
30
31 clean:
32 delete *.rel
33 delete *.exe
34
35 .SUFFIXES: .exe .rel .c *.h
66 # compilation, but the DOS/4GW version of owcc (27 Aug 2020) likes to crash
77 # when trying to invoke wcc. (The Linux version has no problem.)
88 CC = wcc
9 CFLAGS = -bt=dos -ml -onatxl+ -0 -zq
9
10 INCLUDE_PATH = -I$(%WATCOM)/h
11
12 # If we're running under DOS, use a backslash in INCLUDE_PATH
13 !ifdef %COMSPEC
14 !ifndef %SHELL
15 INCLUDE_PATH = -I$(%WATCOM)\h
16 !endif
17 !endif
18
19 CFLAGS = -bt=dos -ml -onatxl+ -0 -zq $(INCLUDE_PATH)
1020 AS = wasm
1121 ASFLAGS = -bt=dos -ml -zq
1222 LD = wlink
1828
1929 BINNAME = frotz.exe
2030
21 VERSION = "2.53"
31 VERSION = "2.54"
2232
2333 # MS-DOS command.com and Unix sh have different shell quoting rules. Try to
2434 # detect which one we are running under.
3343 !endif
3444 !endif
3545
36 OW_DOS_DIR = src/owdos
37 DOS_OBJECTS = $(OW_DOS_DIR)/owinit.o
38 DOS_OBJECTS += $(OW_DOS_DIR)/owinput.o
39 DOS_OBJECTS += $(OW_DOS_DIR)/owmouse.o
40 DOS_OBJECTS += $(OW_DOS_DIR)/owpic.o
41 DOS_OBJECTS += $(OW_DOS_DIR)/owsample.o
42 DOS_OBJECTS += $(OW_DOS_DIR)/owscreen.o
43 DOS_OBJECTS += $(OW_DOS_DIR)/owtext.o
44 DOS_OBJECTS += $(OW_DOS_DIR)/owblorb.o
45 DOS_OBJECTS += $(OW_DOS_DIR)/owfix.o
46 OW_DOS_DIR = src/dos/
47 DOS_OBJECTS = $(OW_DOS_DIR)dosinit.o
48 DOS_OBJECTS += $(OW_DOS_DIR)dosinput.o
49 DOS_OBJECTS += $(OW_DOS_DIR)dosmouse.o
50 DOS_OBJECTS += $(OW_DOS_DIR)dospic.o
51 DOS_OBJECTS += $(OW_DOS_DIR)dossampl.o
52 DOS_OBJECTS += $(OW_DOS_DIR)dosscrn.o
53 DOS_OBJECTS += $(OW_DOS_DIR)dostext.o
54 DOS_OBJECTS += $(OW_DOS_DIR)dosblorb.o
55 DOS_OBJECTS += $(OW_DOS_DIR)owfix.o
4656
47 CORE_DIR = src/common
48 CORE_OBJECTS = $(CORE_DIR)/buffer.o
49 CORE_OBJECTS += $(CORE_DIR)/fastmem.o
50 CORE_OBJECTS += $(CORE_DIR)/files.o
51 CORE_OBJECTS += $(CORE_DIR)/getopt.o
52 CORE_OBJECTS += $(CORE_DIR)/hotkey.o
53 CORE_OBJECTS += $(CORE_DIR)/input.o
54 CORE_OBJECTS += $(CORE_DIR)/main.o
55 CORE_OBJECTS += $(CORE_DIR)/math.o
56 CORE_OBJECTS += $(CORE_DIR)/object.o
57 CORE_OBJECTS += $(CORE_DIR)/process.o
58 CORE_OBJECTS += $(CORE_DIR)/random.o
59 CORE_OBJECTS += $(CORE_DIR)/redirect.o
60 CORE_OBJECTS += $(CORE_DIR)/screen.o
61 CORE_OBJECTS += $(CORE_DIR)/sound.o
62 CORE_OBJECTS += $(CORE_DIR)/stream.o
63 CORE_OBJECTS += $(CORE_DIR)/table.o
64 CORE_OBJECTS += $(CORE_DIR)/text.o
65 CORE_OBJECTS += $(CORE_DIR)/variable.o
66 CORE_OBJECTS += $(CORE_DIR)/quetzal.o
67 CORE_OBJECTS += $(CORE_DIR)/err.o
57 CORE_DIR = src/common/
58 CORE_OBJECTS = $(CORE_DIR)buffer.o
59 CORE_OBJECTS += $(CORE_DIR)fastmem.o
60 CORE_OBJECTS += $(CORE_DIR)files.o
61 CORE_OBJECTS += $(CORE_DIR)getopt.o
62 CORE_OBJECTS += $(CORE_DIR)hotkey.o
63 CORE_OBJECTS += $(CORE_DIR)input.o
64 CORE_OBJECTS += $(CORE_DIR)main.o
65 CORE_OBJECTS += $(CORE_DIR)math.o
66 CORE_OBJECTS += $(CORE_DIR)object.o
67 CORE_OBJECTS += $(CORE_DIR)process.o
68 CORE_OBJECTS += $(CORE_DIR)random.o
69 CORE_OBJECTS += $(CORE_DIR)redirect.o
70 CORE_OBJECTS += $(CORE_DIR)screen.o
71 CORE_OBJECTS += $(CORE_DIR)sound.o
72 CORE_OBJECTS += $(CORE_DIR)stream.o
73 CORE_OBJECTS += $(CORE_DIR)table.o
74 CORE_OBJECTS += $(CORE_DIR)text.o
75 CORE_OBJECTS += $(CORE_DIR)variable.o
76 CORE_OBJECTS += $(CORE_DIR)quetzal.o
77 CORE_OBJECTS += $(CORE_DIR)err.o
78
79 BLORB_DIR = src/blorb/
80 BLORB_OBJECTS += $(BLORB_DIR)blorblib.o
6881
6982 all: frotz
7083
7184 .ERASE
7285
73 .c: $(OW_DOS_DIR);$(CORE_DIR)
86 .c: $(OW_DOS_DIR);$(CORE_DIR);$(BLORB_DIR)
7487 .asm: $(OW_DOS_DIR)
7588
7689 .c.o:
7790 echo $(CFLAGS) -fo=$@ $< >$*.rsp
78 $(CC) $(VER) -i="$(OW_DOS_DIR)" -i="$(CORE_DIR)" @$*.rsp
91 $(CC) $(VER) -i="$(OW_DOS_DIR)" -i="$(CORE_DIR)" -i="$(BLORB_DIR)" @$*.rsp
7992 $(RM) $*.rsp
8093
8194 .asm.o:
8295 echo $(ASFLAGS) -fo=$@ $< >$*.rsp
83 $(AS) $(VER) -i="$(OW_DOS_DIR)" -i="$(CORE_DIR)" @$*.rsp
96 $(AS) $(VER) -i="$(OW_DOS_DIR)" -i="$(CORE_DIR)" -i="$(BLORB_DIR)" @$*.rsp
8497 $(RM) $*.rsp
8598
8699 # Note: the `for' command is specially intercepted by wmake, and works like
87100 # its namesake in MS-DOS command.com --- even when cross-building in Unix (!).
88101 clean: .SYMBOLIC
89 for %i in ($(CORE_DIR)/*.o $(OW_DOS_DIR)/*.o) do -$(RM) %i
90 for %i in ($(CORE_DIR)/*.rsp $(OW_DOS_DIR)/*.rsp) do -$(RM) %i
102 for %i in ($(CORE_DIR)/*.o $(BLORB_DIR)/*.o $(OW_DOS_DIR)/*.o) do -$(RM) %i
103 for %i in ($(CORE_DIR)/*.rsp $(BLORB_DIR)/*.rsp $(OW_DOS_DIR)/*.rsp) do -$(RM) %i
91104 for %i in (*.obj *.lib *.rsp *.exe *.bak *.map *.lnk) do -$(RM) %i
92105
93106 frotz: $(BINNAME) .SYMBOLIC
94107
95 $(BINNAME): $(DOS_OBJECTS) $(CORE_OBJECTS)
108 $(BINNAME): $(DOS_OBJECTS) $(CORE_OBJECTS) $(BLORB_OBJECTS)
96109 echo $(LDFLAGS) name $(BINNAME) >$*.rsp
97 for %i in ($(DOS_OBJECTS) $(CORE_OBJECTS)) do echo file %i >>$*.rsp
110 for %i in ($(DOS_OBJECTS) $(CORE_OBJECTS) $(BLORB_OBJECTS)) do echo file %i >>$*.rsp
98111 $(LD) @$*.rsp
99112 $(RM) $*.rsp
1313 BINNAME = frotz.exe
1414 LIBRARY = frotz.lib
1515
16 VERSION = "2.53"
16 VERSION = "2.54"
1717 RELEASE_NOTES = "Official release."
1818
1919 VER = -DVERSION=$(VERSION)
2020
21 DOS_DIR = src\dos
22 DOS_OBJECTS = $(DOS_DIR)\bcinit.o \
23 $(DOS_DIR)\bcinput.o \
24 $(DOS_DIR)\bcmouse.o \
25 $(DOS_DIR)\bcpic.o \
26 $(DOS_DIR)\bcsample.o \
27 $(DOS_DIR)\bcscreen.o \
28 $(DOS_DIR)\bctext.o \
29 $(DOS_DIR)\bcblorb.o
21 DOS_OBJECTS = dosinit.o dosinput.o dosmouse.o dospic.o dossample.o dosscrn.o \
22 dostext.o dosblorb.o
3023
31 CORE_DIR = src\common
32 CORE_OBJECTS = $(CORE_DIR)\buffer.o \
33 $(CORE_DIR)\fastmem.o \
34 $(CORE_DIR)\files.o \
35 $(CORE_DIR)\getopt.o \
36 $(CORE_DIR)\hotkey.o \
37 $(CORE_DIR)\input.o \
38 $(CORE_DIR)\main.o \
39 $(CORE_DIR)\math.o \
40 $(CORE_DIR)\object.o \
41 $(CORE_DIR)\process.o \
42 $(CORE_DIR)\random.o \
43 $(CORE_DIR)\redirect.o \
44 $(CORE_DIR)\screen.o \
45 $(CORE_DIR)\sound.o \
46 $(CORE_DIR)\stream.o \
47 $(CORE_DIR)\table.o \
48 $(CORE_DIR)\text.o \
49 $(CORE_DIR)\variable.o \
50 $(CORE_DIR)\quetzal.o \
51 $(CORE_DIR)\err.o
24 CORE_OBJECTS = buffer.o fastmem.o files.o getopt.o hotkey.o input.o \
25 main.o math.o object.o process.o random.o redirect.o \
26 screen.o sound.o stream.o table.o text.o variable.o \
27 quetzal.o err.o
28
29 BLORB_OBJECTS = blorblib.o
5230
5331 .SUFFIXES: .c .o .h
5432
5533 all: frotz
5634
5735 .c.o:
58 $(CC) $(CFLAGS) $(VER) -I$(DOS_DIR) -I$(CORE_DIR) -c -o$@ $<
36 $(CC) $(CFLAGS) $(VER) -c -o$@ $<
5937 $(TLIB) $(LIBRARY) +-$@
6038
6139 clean:
62 $(RM) $(CORE_DIR)\*.o
63 $(RM) $(DOS_DIR)\*.o
40 $(RM) *.o
6441 $(RM) *.obj
6542 $(RM) *.lib
6643 $(RM) *.exe
6744 $(RM) *.bak
6845
69 frotz: $(DOS_OBJECTS) $(CORE_OBJECTS)
46 frotz: $(DOS_OBJECTS) $(CORE_OBJECTS) $(BLORB_OBJECTS)
7047 $(CC) $(CFLAGS) -e$(BINNAME) $(LIBRARY)
0 FROTZ V2.53 - An interpreter for all Infocom and other Z-machine games.
0 FROTZ V2.54 - An interpreter for all Infocom and other Z-machine games.
11 Complies with standard 1.0 of Graham Nelson's specification.
22
33 Originally written by Stefan Jokisch in 1995-1997.
66
77 - Compiles and runs on most common flavors of Unix, both open source and not.
88 This includes macOS.
9 - Compiles and runs on MSDOS/PCDOS/FreeDOS.
10 - Compiles and runs on PDP-10 mainframes running the TOPS20 operating system.
911 - Portable to many other operating systems and hardware.
1012 - Curses, Dumb, and SDL user interfaces.
1113 - Plays all Z-code games including V6.
2123
2224 For installation information, see the file "INSTALL".
2325
24 For information on building for DOS, see the file "DOSBUILD.txt".
26 For information on building for DOS, see the file "INSTALL_DOS".
27
28 For information on building for TOPS20, see the file "INSTALL_PDP10".
2529
2630 For update history, see the file "Changelog".
2731
4650
4751 USA: http://ifarchive.jmac.org
4852 USA: http://ifmirror.russotto.net
49 USA: http://ifarchive.smallwhitehouse.org
5053 USA: http://ifarchive.info
5154 USA: http://ifarchive.ifreviews.org
52 USA: ftp://ifarchive.ifreviews.org
5355 USA: http://mirrors.ibiblio.org/interactive-fiction/
5456 USA: gopher://gopher.661.org/1/if-archive
00 What are all these files for?
11
22 AUTHORS People who've had a hand in making Frotz what it is.
3 build.bat A batch file for building Frotz for PC/MS DOS.
43 ChangeLog Summary of changes from one version to another.
54 CONTRIBUTORS People who've helped fund Frotz development.
65 COPYING Full text of the GNU General Public License.
76 DUMB Description of the dumb-interface version of Frotz.
87 HOW_TO_PLAY How to play Interactive Fiction.
9 INSTALL How to build and install Frotz.
8 INSTALL How to build and install Frotz for Unix machines.
109 INSTALL_DOS How to build and install Frotz for PC/MS DOS.
10 INSTALL_PDP10 How to build and install Frotz for PDP-10 mainframes.
1111 Makefile The Makefile (the INSTALL file tells you about this).
1212 Makefile.tc Makefile for building Frotz for DOS using Turbo C 3.00.
13 Makefile.ow Makefile for building Frotz for DOS using Open Watcom C.
14 owbuild.bat A batch file for building Frotz for PC/MS DOS using Watcom C.
1315 README An overview of Frotz.
1416 README.md An overview of Frotz formatted in Markdown.
1517 README.1st This file.
18 tcbuild.bat A batch file for building Frotz for PC/MS DOS using Turbo C.
1619 TODO Stuff to do in no particular order.
1720
1821 doc/ Manpages, DOS documentation, and sample config files.
2427 src/dos MSDOS user interface code.
2528 src/dumb Dumb user interface code.
2629 src/misc Scripts and fonts.
27 src/owdos MSDOS (Open Watcom C) interface code (experimental).
2830 src/sdl SDL user interface code.
2931 src/test Zcode test programs.
3032 src/x11 X11 user interface code.
0 # FROTZ V2.52
0 # FROTZ V2.54
11 An interpreter for all Infocom and other Z-machine games.
22 Complies with standard 1.0 of Graham Nelson's specification.
3
4 [![Liberapay](https://img.shields.io/liberapay/receives/DavidG.svg?logo=liberapay)](https://liberapay.com/DavidG)
35
46 Originally written by Stefan Jokisch in 1995-1997.
57 Ported to Unix by Galen Hazelwood.
810 ## Features
911 - Compiles and runs on most common flavors of Unix, both open source and not.
1012 This includes macOS.
13 - Compiles and runs on MSDOS/PCDOS/FreeDOS.
14 - Compiles and runs on PDP-10 mainframes running the TOPS20 operating system.
1115 - Portable to many other operating systems and hardware.
1216 - Curses, Dumb, and SDL user interfaces.
1317 - Plays all Z-code games including V6.
2327
2428 For installation information, see the file "INSTALL".
2529
26 For information on building for DOS, see the file "DOSBUILD.txt".
30 For information on building for DOS, see the file "INSTALL_DOS".
31
32 For information on building for TOPS20, see the file "INSTALL_PDP10".
2733
2834 For update history, see the file "Changelog".
2935
0 Port Frotz to the PDP-10 line of mainframe computers.
0 Finish porting Frotz to the PDP-10 line of mainframe computers. Dumb
1 works. Full-screen support needed.
12
23 Rework the screen buffer to allow the rows and columns to be changed on
34 the fly.
+0
-6
build.bat less more
0 @ECHO OFF
1 REM This batch file is for compiling Frotz using Turbo C 3.00 for DOS.
2 REM It's just a bit of syntactic sugar so I don't have to always
3 REM remember that I need to specify the other Makefile for DOS
4 REM compilation. DG
5 make -f makefile.tc %1
00 .\" -*- nroff -*-
1 .TH DFROTZ 6 2.53
1 .TH DFROTZ "6" "2021-06-21" "Dumb Frotz v2.54"
22 .SH NAME
33 dfrotz \- interpreter for Infocom and other Z-Machine games (dumb interface)
4
54
65 .SH SYNOPSIS
76 .B dfrotz
130129 Alter the piracy opcode. The piracy opcode was never used by Infocom.
131130 This switch is really only useful for those who like to toy around with
132131 Z-code.
132
133 .TP
134 .B \-q
135 Quiet mode. Suppress startup messages such as "Loading zork1.z3".
133136
134137 .TP
135138 .B \-r xxx
532535 .br
533536 http://www.ifarchive.org/
534537 .PP
535 Most distributions of Linux and BSD include Frotz in their package
536 repositories.
537 .br
538 Most distributions of Linux and BSD include
539 .B Frotz
540 in their package repositories.
541 .PP
538542 It is distributed under the GNU General Public License version 2 or (at
539543 your option) any later version.
540544 .br
541545 .BR https://www.gnu.org/licenses/gpl-2.0.en.html
542 .br
546 .PP
543547 This software is offered as-is with no warranty or liability. If you
544548 find a bug or would like
545549 .B Frotz
0 FROTZ v2.53 - Infocom-style interactive
0 FROTZ v2.54 - Infocom-style interactive
11 fiction player. Plays all Z-machine games.
22 Compiled with Turbo C++ 3.0 in 16-bit mode
33 for maximum compatibility.
00 .\" -*- nroff -*-
1 .TH FROTZ 6 2.53
1 .TH FROTZ "6" "2021-06-21" "Frotz v2.54"
22 .SH NAME
33 frotz \- interpreter for Infocom and other Z-Machine games
4
54
65 .SH SYNOPSIS
76 .B frotz
436435 .BR foreground
437436 \ \ <colorname>
438437 .br
439 Set foreground color. Default is terminal's default forground color.
438 Set foreground color. Default is terminal's default foreground color.
440439
441440 .PP
442441 .BR ignore_fatal
710709 Most distributions of Linux and BSD include
711710 .B Frotz
712711 in their package repositories.
713 .br
712 .PP
714713 It is distributed under the GNU General Public License version 2 or (at
715714 your option) any later version.
716715 .br
717716 .BR https://www.gnu.org/licenses/gpl-2.0.en.html
718 .br
717 .PP
719718 This software is offered as-is with no warranty or liability. If you
720719 find a bug or would like
721720 .B Frotz
0 FROTZ V2.53
0 FROTZ V2.54
11 An interpreter for all Infocom and other Z-Machine games.
22 Complies with standard 1.0 of Graham Nelson's specification.
33
1717
1818 Frotz is distributed under the GNU General Public License version 2 or (at
1919 your option) and later version.
20
2120 https://www.gnu.org/licenses/gpl-2.0.en.html
2221
2322 This software is offered as-is with no warranty or liability. If you
00 .\" -*- nroff -*-
1 .TH SFROTZ 6 2.53
1 .TH SFROTZ "6" "2021-06-21" "SDL Frotz v2.54"
22 .SH NAME
33 sfrotz \- interpreter for Infocom and other Z-Machine games (SDL interface)
4
54
65 .SH SYNOPSIS
76 .B sfrotz
8079 before prompting again. This switch specifies how many lines of text
8180 .B Frotz
8281 will hold over and display at the top of the next screen.
82
83 .TP
84 .B \-C <filename>
85 Load this configuration file instead of $HOME/.sfrotzrc.
8386
8487 .TP
8588 .B \-d
233236
234237 .TP
235238 .B \-T
236 Use traditional in-game requests for file names, intead of on-screen dialogs.
237
239 Use traditional in-game requests for file names, instead of on-screen
240 dialogs.
241
242 .TP
238243 .B \-v
239244 Show version information and exit. This will display the version of
240245 Frotz, some information about what's enabled and what's not, the commit
296301 .B Sfrotz
297302 has a hardwired default screen size of 640x400. The screen size can be
298303 changed by the values in this section, by the values found in the Reso
299 chunck of a Blorb file, and finally by the -w and -h command line
304 chunk of a Blorb file, and finally by the -w and -h command line
300305 options (in that order). Note however that
301306 .B Sfrotz
302307 shall refuse to set a screen width less than 640 and/or a height less
464469 .B Sfrotz
465470 has a hardwired default screen size of 640x400. The screen size can be
466471 changed by the values in this section, by the values found in the Reso
467 chunck of a Blorb file, and finally by the -w and -h command line
472 chunk of a Blorb file, and finally by the -w and -h command line
468473 options (in that order). Note however that
469474 .B sfrotz
470475 shall refuse to set a screen width less than 640 and/or a height less
798803 Most distributions of Linux and BSD include
799804 .B Frotz
800805 in their package repositories.
801 .br
806 .PP
802807 It is distributed under the GNU General Public License version 2 or (at
803808 your option) any later version.
804809 .br
805810 .BR https://www.gnu.org/licenses/gpl-2.0.en.html
806 .br
811 .PP
807812 This software is offered as-is with no warranty or liability. If you
808813 find a bug or would like
809814 .B Frotz
0 .TH XFROTZ 6 2.53
0 .TH XFROTZ "6" "2021-06-21" "X11 Frotz v2.54"
11 .SH NAME
22 xfrotz \- interpreter for Infocom and other Z-Machine games (X11 interface)
3
43
54 .SH SYNOPSIS
65 .B xfrotz
76 .I "[options] file"
8
97
108 .SH DESCRIPTION
119 The \fIxfrotz\fP program is an Xlib-based interpreter for Z-machine
211209 Most distributions of Linux and BSD include
212210 .B Frotz
213211 in their package repositories.
214 .br
212 .PP
215213 It is distributed under the GNU General Public License version 2 or (at
216214 your option) any later version.
217215 .br
218216 .BR https://www.gnu.org/licenses/gpl-2.0.en.html
219 .br
217 .PP
220218 This software is offered as-is with no warranty or liability. If you
221219 find a bug or would like
222220 .B Frotz
00 Begin3
11 Title: Frotz
2 Version: 2.53
2 Version: 2.54
33 Entered-date: 2020-05-10
44 Description: An interpreter for all Infocom games and other Z-machine games.
55 Keywords: infocom, frotz, text-adventure, zork, z-machine
66 Author: dave@661.org (David Griffith)
77 Primary-site: https://gitlab.com/DavidGriffith/frotz
88 Alternate-site: http://ifarchive.org/indexes/if-archive/infocom/interpreters/frotz/
9 Platforms: Unix (GCC, Clang), DOS (Turbo C 3.00)
9 Platforms: Unix (GCC, Clang), DOS (Turbo C 3.00), TOPS20 (KCC)
1010 Copying-policy: GNU General Public License, Version 2
1111 End
Binary diff not shown
2222 rm -f $(TARGET) $(OBJECTS)
2323
2424 %.o: %.c
25 $(CC) $(CFLAGS) -fPIC -fpic -o $@ -c $<
25 $(CC) $(CFLAGS) -I../common -fPIC -fpic -o $@ -c $<
1414 and uint16 a 16-bit unsigned numeric type. */
1515
1616 #include <limits.h>
17
18 #ifdef TOPS20
19 typedef unsigned int uint32;
20 #else
1721 #if UINT_MAX == (1UL<<32)-1UL
1822 typedef unsigned int uint32;
1923 #else
2024 typedef unsigned long uint32;
25 #endif
2126 #endif
2227
2328 typedef unsigned short uint16;
5055
5156 /* Making a four-byte constant to describe a chunk type. */
5257 #define bb_make_id(c1, c2, c3, c4) \
53 (((c1) << 24) | ((c2) << 16) | ((c3) << 8) | (c4))
58 (((uint32)(c1) << 24) | ((uint32)(c2) << 16) | ((uint32)(c3) << 8) | (uint32)(c4))
5459
5560 /* Four-byte constants */
5661 #define bb_ID_Snd (bb_make_id('S','n','d',' '))
77
88 #include <stdio.h>
99 #include <stdlib.h>
10 #include "frotz.h"
11
12 #ifndef NO_BLORB
13
1014 #include "blorb.h"
1115 #include "blorblow.h"
1216
819823 return bb_err_None;
820824 }
821825
826 #endif
827
2222
2323 clean:
2424 rm -f $(TARGET) $(OBJECTS)
25 rm -f *.O DEFS.H
25 rm -f *.o defs.h *.O DEFS.H
2626
2727 %.o: %.c
2828 $(CC) $(CFLAGS) -fPIC -fpic -o $@ -c $<
233233 SET_BYTE(H_DEFAULT_FOREGROUND, z_header.default_foreground);
234234 }
235235
236 if (z_header.version == V6)
236 if (z_header.version >= V3 && (z_header.user_name[0] != 0)) {
237237 for (i = 0; i < 8; i++)
238 storeb((zword) (H_USER_NAME + i), z_header.user_name[i]);
238 storeb((zword) (H_USER_NAME + i), z_header.user_name[i]);
239 }
239240
240241 SET_BYTE(H_STANDARD_HIGH, z_header.standard_high);
241242 SET_BYTE(H_STANDARD_LOW, z_header.standard_low);
287288 zword addr;
288289 unsigned n;
289290 int i, j;
291
292 #ifdef TOPS20
293 zword checksum = 0;
294 long li;
295 #endif
290296
291297 /* INDENT-OFF */
292298 static struct {
460466 os_fatal("Out of memory");
461467
462468 /* Load header into memory */
469 #ifdef TOPS20
470 /* One byte at a time for 36-bit sanitization */
471 for (i = 0; i < 64 ; i++) {
472 if (fread(zmp + i, 1, 1, story_fp) != 1) {
473 os_fatal ("Story file read error");
474 }
475 zmp[i] &= 0xff; /* No nine-bit craziness here! */
476 }
477 #else
463478 if (fread(zmp, 1, 64, story_fp) != 64)
464479 os_fatal("Story file read error");
480 #endif
465481
466482 /* Copy header fields to global variables */
467483 LOW_BYTE(H_VERSION, z_header.version);
537553 if ((zmp = (zbyte huge *) zrealloc(zmp, story_size, 64)) == NULL)
538554 os_fatal("Out of memory");
539555
556 #ifdef TOPS20
557 /* Load and sanitize story file one byte at a time. */
558 for (size = 64; size < story_size; size++) {
559 if (fread(zmp + size, 1, 1, story_fp) != 1) {
560 os_fatal("Story file read error");
561 }
562 zmp[size] &= 0xff; /* No nine-bit craziness here! */
563 }
564 #else
540565 /* Load story file in chunks of 32KB */
541566 n = 0x8000;
542567 for (size = 64; size < story_size; size += n) {
546571 if (fread(pcp, 1, n, story_fp) != n)
547572 os_fatal("Story file read error");
548573 }
574 #endif
549575
550576 /* Read header extension table */
551577 z_header.x_table_size = get_header_extension(HX_TABLE_SIZE);
552578 z_header.x_unicode_table = get_header_extension(HX_UNICODE_TABLE);
579
580 #ifdef TOPS20
581 /* Internal verification; is this where the PDP-10 is blowing up? */
582 /* Sum all bytes in story file except header bytes */
583 fseek(story_fp, 64, SEEK_SET);
584 for (li = 64; li < story_size; li++)
585 checksum = (checksum + (fgetc(story_fp) & 0xff)) & 0xffff;
586 if (checksum != z_header.checksum)
587 os_fatal("Checksum failed!");
588 #endif
553589 } /* init_memory */
554590
555591
575611 /* Allocate z_header.dynamic_size bytes for previous dynamic
576612 * zmp state + 1.5 z_header.dynamic_size for Quetzal diff + 2.
577613 */
578 prev_zmp = zmalloc(z_header.dynamic_size);
579 undo_diff = zmalloc(((unsigned long)z_header.dynamic_size * 3) / 2 + 2);
614 /* FIXME UNDO changed a lot since 2.32. May not be correct. */
615 #ifdef TOPS20
616 prev_zmp = malloc(z_header.dynamic_size & 0xffff);
617 undo_diff = malloc(((unsigned long)(z_header.dynamic_size & 0xffff) * 3) / 2 + 2);
618 #else
619 prev_zmp = malloc(z_header.dynamic_size);
620 undo_diff = malloc(((unsigned long)z_header.dynamic_size * 3) / 2 + 2);
621 #endif
622
580623 if ((undo_diff != NULL) && (prev_zmp != NULL)) {
581624 memmove (prev_zmp, zmp, z_header.dynamic_size);
582625 } else {
653696 */
654697 void storeb(zword addr, zbyte value)
655698 {
699 #ifdef TOPS20
700 addr &= 0xffff;
701 value &= 0xff;
702 #endif
656703 if (addr >= z_header.dynamic_size)
657704 runtime_error(ERR_STORE_RANGE);
658705
681728 */
682729 void storew(zword addr, zword value)
683730 {
731 #ifdef TOPS20
732 addr &= 0xffff;
733 value &= 0xffff;
734 #endif
684735 storeb((zword) (addr + 0), hi (value));
685736 storeb((zword) (addr + 1), lo (value));
686737 } /* storew */
11601211 checksum += fgetc(story_fp);
11611212
11621213 /* Branch if the checksums are equal */
1214 #ifdef TOPS20
1215 checksum &= 0xffff;
1216 #endif
11631217 branch(checksum == z_header.checksum);
11641218 } /* z_verify */
1717 #endif
1818
1919 #ifdef MSDOS_16BIT
20 #ifdef __TURBOC__
21 #include "../dos/defs.h"
22 #else
23 #include "../owdos/defs.h"
24 #endif
2520
2621 #ifdef USE_UTF8
2722 #error UTF-8 is not supported in DOS Frotz
6055 /******************************************************************************/
6156 #ifndef MSDOS_16BIT
6257
63 #include "defs.h"
64 #include "git_hash.h"
65
6658 #define huge
6759 #define zmalloc(size) malloc(size)
6860 #define zfree(p) free(p)
7668 /* For everything */
7769 /******************************************************************************/
7870 #include <stdio.h>
71
72 #include "defs.h"
73 #include "hash.h"
7974
8075 #ifndef TRUE
8176 #define TRUE 1
420415 #define FILE_SAVE_AUX 6
421416
422417 /*** Data access macros ***/
418 #ifdef TOPS20
419 #define SET_BYTE(addr,v) { zmp[addr] = v & 0xff; }
420 #define LOW_BYTE(addr,v) { v = zmp[addr] & 0xff; }
421 #else
423422 #define SET_BYTE(addr,v) { zmp[addr] = v; }
424423 #define LOW_BYTE(addr,v) { v = zmp[addr]; }
424 #endif
425425 #define CODE_BYTE(v) { v = *pcp++; }
426426
427427
571571 extern zbyte *zmp;
572572
573573 #define lo(v) (v & 0xff)
574
575 #ifdef TOPS20
576 #define hi(v) ((v & 0xff00) >> 8)
577 #define LOW_WORD(addr,v) { v = ((zword) ( zmp[addr] & 0xff) << 8) | \
578 (zmp[addr+1] & 0xff); }
579 #define HIGH_WORD(addr,v) { v = ((zword) ( zmp[addr] & 0xff) << 8) | \
580 (zmp[addr+1] & 0xff); }
581 #else
574582 #define hi(v) (v >> 8)
575
576 #define SET_WORD(addr,v) { zmp[addr] = hi(v); zmp[addr+1] = lo(v); }
577583 #define LOW_WORD(addr,v) { v = ((zword) zmp[addr] << 8) | zmp[addr+1]; }
578584 #define HIGH_WORD(addr,v) { v = ((zword) zmp[addr] << 8) | zmp[addr+1]; }
585 #endif
586
587 #define SET_WORD(addr,v) { zmp[addr] = hi(v); zmp[addr+1] = lo(v); }
579588 #define CODE_WORD(v) { v = ((zword) pcp[0] << 8) | pcp[1]; pcp += 2; }
580589 #define GET_PC(v) { v = pcp - zmp; }
581590 #define SET_PC(v) { pcp = zmp + v; }
582591
583 #endif
584 /******************************************************************************/
585 /******************************************************************************/
586
592 #endif /* !defined (AMIGA) && !defined (MSDOS_16BIT) */
593
594 /******************************************************************************/
595 /******************************************************************************/
596
597 #ifdef TOPS20
598 /*** Convenience zword-to-correctly-signed-sixteen-bit-short ***/
599 extern short s16(zword);
600 #endif
587601
588602 /*** Various data ***/
589603
627641 extern int zoptind;
628642 extern int zoptopt;
629643 extern char *zoptarg;
644
645 #ifdef TOPS20
646 /* A weird little TOPS-20 accomodation */
647 extern bool spurious_getchar;
648 #endif
630649
631650 /*** Z-machine opcodes ***/
632651 void z_add(void);
162162 int i;
163163
164164 /* Supply default arguments */
165 if (zargc < 3)
166 zargs[2] = 0;
165 if (zargc < 4)
166 zargs[3] = 0;
167167
168168 /* Get maximum input size */
169169 addr = zargs[0];
249249 /* Supply default arguments */
250250 if (zargc < 2)
251251 zargs[1] = 0;
252 if (zargc < 3)
253 zargs[2] = 0;
252254
253255 /* Read input from the current input stream */
254256 key = stream_read_key(
7878 int option_sound = 1;
7979 char *option_zcode_path;
8080
81
8281 /* Size of memory to reserve (in bytes) */
8382 long reserve_mem = 0;
8483
84 #ifdef TOPS20
85 /* Strange little TOPS-20 accomodation */
86 bool spurious_getchar = FALSE;
87 #endif
8588
8689 /*
8790 * z_piracy, branch if the story file is a legal copy.
101104 * Prepare and run the game.
102105 *
103106 */
107 #ifdef TOPS20
108 int main (int argc, char *argv[])
109 #else
104110 int cdecl main(int argc, char *argv[])
111 #endif
105112 {
106113 init_header();
107114 init_setup();
2828 */
2929 void z_add(void)
3030 {
31 store((zword) ((short) zargs[0] + (short) zargs[1]));
31 #ifdef TOPS20
32 store((zword) zargs[0] + zargs[1]);
33 #else
34 store((zword) ((short) zargs[0] + (short) zargs[1]));
35 #endif
3236 } /* z_add */
3337
3438
4145 */
4246 void z_and(void)
4347 {
48 #ifdef TOPS20
49 store ((zword) ((zargs[0] & zargs[1]) & 0xffff));
50 #else
4451 store ((zword) (zargs[0] & zargs[1]));
52 #endif
4553 } /* z_and */
4654
4755
5462 */
5563 void z_art_shift(void)
5664 {
65 #ifdef TOPS20
66 short sz0, sz1;
67 sz0 = s16(zargs[0]);
68 sz1 = s16(zargs[1]);
69
70 if (sz1 > 0)
71 store (((zword) ( sz0 << sz1 )) & 0xffff );
72 else
73 store (((zword) ( sz0 >> -sz1 )) & 0xffff );
74 #else
5775 if ((short) zargs[1] > 0)
5876 store((zword) ((short) zargs[0] << (short) zargs[1]));
5977 else
6078 store((zword) ((short) zargs[0] >> - (short) zargs[1]));
61
79 #endif
6280 } /* z_art_shift */
6381
6482
7189 */
7290 void z_div(void)
7391 {
92 #ifdef TOPS20
93 short sz0, sz1;
94 zword z;
95
96 sz0 = s16(zargs[0]);
97 sz1 = s16(zargs[1]);
98
99 if (sz1 == 0)
100 runtime_error (ERR_DIV_ZERO);
101
102 z = (zword) (sz0 / sz1);
103 z &= 0xffff;
104 store (z);
105 #else
74106 if (zargs[1] == 0)
75107 runtime_error(ERR_DIV_ZERO);
76108 store((zword) ((short) zargs[0] / (short) zargs[1]));
77
109 #endif
78110 } /* z_div */
79111
80112
105137 */
106138 void z_jg(void)
107139 {
140 #ifdef TOPS20
141 short sz0, sz1;
142
143 sz0 = s16(zargs[0]);
144 sz1 = s16(zargs[1]);
145 branch (sz0 > sz1);
146 #else
108147 branch((short) zargs[0] > (short) zargs[1]);
148 #endif
109149 }/* z_jg */
110150
111151
118158 */
119159 void z_jl(void)
120160 {
161 #ifdef TOPS20
162 short sz0, sz1;
163
164 sz0 = s16(zargs[0]);
165 sz1 = s16(zargs[1]);
166
167 branch (sz0 < sz1);
168 #else
121169 branch((short) zargs[0] < (short) zargs[1]);
170 #endif
122171 } /* z_jl */
123172
124173
130179 */
131180 void z_jz(void)
132181 {
182 #ifdef TOPS20
183 short sz;
184
185 sz = s16(zargs[0]);
186 branch (sz == 0);
187 #else
133188 branch((short) zargs[0] == 0);
134
189 #endif
135190 } /* z_jz */
136191
137192
144199 */
145200 void z_log_shift(void)
146201 {
202 #ifdef TOPS20
203 short sz1;
204
205 sz1 = s16(zargs[1]);
206 if (sz1 > 0)
207 store ((zword) (zargs[0] << sz1));
208 else
209 store ((zword) (zargs[0] >> -sz1));
210 #else
147211 if ((short) zargs[1] > 0)
148212 store((zword) (zargs[0] << (short) zargs[1]));
149213 else
150214 store((zword) (zargs[0] >> - (short) zargs[1]));
215 #endif
151216 } /* z_log_shift */
152217
153218
160225 */
161226 void z_mod (void)
162227 {
228 #ifdef TOPS20
229 short sz0, sz1;
230
231 sz0 = s16(zargs[0]);
232 sz1 = s16(zargs[1]);
233 if (sz1 == 0)
234 runtime_error(ERR_DIV_ZERO);
235
236 store ((zword) (sz0 % sz1));
237 #else
163238 if (zargs[1] == 0)
164239 runtime_error(ERR_DIV_ZERO);
165240
166241 store((zword) ((short) zargs[0] % (short) zargs[1]));
242 #endif
167243 } /* z_mod */
168244
169245
176252 */
177253 void z_mul(void)
178254 {
255 #ifdef TOPS20
256 short sz0, sz1;
257 sz0 = s16(zargs[0]);
258 sz1 = s16(zargs[1]);
259
260 store ((zword) (sz0 * sz1 ));
261 #else
179262 store((zword) ((short) zargs[0] * (short) zargs[1]));
263 #endif
180264 } /* z_mul */
181265
182266
188272 */
189273 void z_not (void)
190274 {
275 #ifdef TOPS20
276 store (((zword) ~zargs[0]) & 0xffff);
277 #else
191278 store((zword) ~zargs[0]);
279 #endif
192280 } /* z_not */
193281
194282
201289 */
202290 void z_or(void)
203291 {
292 #ifdef TOPS20
293 store (((zword) (zargs[0] | zargs[1])) & 0xffff);
294 #else
204295 store((zword) (zargs[0] | zargs[1]));
296 #endif
205297 } /* z_or */
206298
207299
214306 */
215307 void z_sub(void)
216308 {
309 #ifdef TOPS20
310 short sz0, sz1;
311
312 sz0 = s16(zargs[0]);
313 sz1 = s16(zargs[1]);
314 store ((zword) (sz0 - sz1));
315 #else
217316 store((zword) ((short) zargs[0] - (short) zargs[1]));
317 #endif
218318 } /* z_sub */
219319
220320
227327 */
228328 void z_test(void)
229329 {
330 #ifdef TOPS20
331 branch (((zargs[0] & zargs[1]) & 0xffff) == (zargs[1] & 0xffff));
332 #else
230333 branch((zargs[0] & zargs[1]) == zargs[1]);
334 #endif
231335 } /* z_test */
336
337
338 short s16(zword z) {
339 short sz;
340 sz = (short) (z & 0xffff);
341 if ((sz > 0 ) && (sz > 32767))
342 sz = - (65536 - sz );
343 return sz;
344 }
3434
3535 if(s == d) return dest;
3636
37 if(s < d) { // copy from back
37 if(s < d) { /* copy from back */
3838 s=s+n-1;
3939 d=d+n-1;
4040 while(n--) *d-- = *s--;
41 } else // copy from front
41 } else /* copy from front */
4242 while(n--) *d++=*s++;
4343
4444 return dest;
1616 #ifdef NO_STRDUP
1717 char *my_strdup(const char *);
1818 char *my_strndup(const char *, size_t);
19 #ifndef my_strdup
1920 #define strdup my_strdup
21 #endif
22 #ifndef my_strndup
2023 #define strndup my_strndup
24 #endif
25 #endif
26
27 #ifdef NO_BASENAME
28 #ifdef basename
29 #undef basename
30 #endif
31 #define basename(c) c
2132 #endif
2233
2334 #endif /* MISSING_H */
252252 do {
253253 zbyte opcode;
254254
255 /* FIXME may be able to do this without demacroing */
256 #ifdef TOPS20
257 long pc;
258 pc = (long) ( ( (long) pcp - (long) zmp) & 0x7ffff );
255259 CODE_BYTE(opcode)
260 #else
261 CODE_BYTE(opcode)
262 #endif
256263 zargc = 0;
257264
258265 if (opcode < 0x80) { /* 2OP opcodes */
279286 var_opcodes[opcode - 0xc0] ();
280287 }
281288
282 #if defined(DJGPP) && defined(SOUND_SUPPORT)
289 #if defined(DJGPP) && !defined(NO_SOUND)
283290 if (end_of_sound_flag)
284291 end_of_sound();
285292 #endif
415422 zbyte off1;
416423 zbyte off2;
417424
425 #ifdef TOPS20
426 short soffset;
427 #endif
428
418429 CODE_BYTE(specifier)
419430 off1 = specifier & 0x3f;
420431
432443
433444 if (specifier & 0x80) {
434445 if (offset > 1) { /* normal branch */
446 /* FIXME Does this need to be demacroed? */
447 #ifdef TOPS20
448 GET_PC(pc)
449 soffset = s16(offset);
450 pc += soffset - 2;
451 SET_PC(pc)
452 #else
435453 GET_PC(pc)
436454 pc += (short)offset - 2;
437455 SET_PC(pc)
456 #endif
457
458
438459 } else
439460 ret(offset); /* special case, return 0 or 1 */
440461 }
451472 {
452473 zbyte variable;
453474
475 #ifdef TOPS20
476 value &= 0xffff;
477 #endif
454478 CODE_BYTE(variable)
479
455480 if (variable == 0)
456481 *--sp = value;
457482 else if (variable < 16)
480505 zword saved_zargs[8];
481506 int saved_zargc;
482507 int i;
508 #ifdef TOPS20
509 short sv;
510 #endif
483511
484512 /* Calls to address 0 return false */
485513 if (addr == 0)
499527 zargc = saved_zargc;
500528
501529 /* Resulting value lies on top of the stack */
530 #ifdef TOPS20
531 sv = s16(*sp);
532 sp += 1;
533 return (((zword) sv) & 0xffff);
534 #else
502535 return (short)*sp++;
536 #endif
503537 } /* direct_call */
504538
505539
544578 */
545579 void z_catch(void)
546580 {
581 #ifdef TOPS20
582 store(frame_count & 0xffff);
583 #else
547584 store(frame_count);
585 #endif
548586 } /* z_catch */
549587
550588
557595 */
558596 void z_throw(void)
559597 {
598 #ifdef TOPS20
599 if (((zargs[1]) & 0xffff) > STACK_SIZE)
600 #else
560601 if (zargs[1] > frame_count)
602 #endif
561603 runtime_error(ERR_BAD_FRAME);
562604
563605 /* Unwind the stack a frame at a time. */
564606 for (; frame_count > zargs[1]; --frame_count)
565607 fp = stack + 1 + fp[1];
566608
609 #ifdef TOPS20
610 ret ((zargs[0]) & 0xffff);
611 #else
567612 ret(zargs[0]);
613 #endif
568614 } /* z_throw */
569615
570616
579625 */
580626 void z_call_n(void)
581627 {
628 #ifdef TOPS20
629 if (((zargs[0]) & 0xffff) != 0)
630 call (((zargs[0]) & 0xffff), zargc - 1, zargs + 1, 1);
631 #else
582632 if (zargs[0] != 0)
583633 call(zargs[0], zargc - 1, zargs + 1, 1);
634 #endif
584635 } /* z_call_n */
585636
586637
595646 */
596647 void z_call_s(void)
597648 {
649 #ifdef TOPS20
650 if (((zargs[0]) & 0xffff) != 0)
651 call (((zargs[0]) & 0xffff), zargc - 1, zargs + 1, 0);
652 #else
598653 if (zargs[0] != 0)
599654 call(zargs[0], zargc - 1, zargs + 1, 0);
655 #endif
600656 else
601657 store(0);
602658 } /* z_call_s */
610666 */
611667 void z_check_arg_count(void)
612668 {
669 #ifdef TOPS20
670 if (fp == stack + STACK_SIZE)
671 branch (((zargs[0]) & 0xffff) == 0);
672 else
673 branch (((zargs[0]) & 0xffff) <= (*fp & 0xff));
674 #else
613675 if (fp == stack + STACK_SIZE)
614676 branch(zargs[0] == 0);
615677 else
616678 branch(zargs[0] <= (*fp & 0xff));
617
679 #endif
618680 } /* z_check_arg_count */
619681
620682
627689 void z_jump(void)
628690 {
629691 long pc;
692 #ifdef TOPS20
693 short soffset;
694 #endif
630695
631696 GET_PC(pc)
697 #ifdef TOPS20
698 soffset = s16(zargs[0]);
699 pc = pc + soffset - 2;
700 #else
632701 pc += (short)zargs[0] - 2;
633
702 #endif
634703 if (pc >= story_size)
635704 runtime_error(ERR_ILL_JUMP_ADDR);
636705
670739 */
671740 void z_ret(void)
672741 {
742 #ifdef TOPS20
743 ret ((zargs[0]) & 0xffff);
744 #else
673745 ret(zargs[0]);
746 #endif
674747 } /* z_ret */
675748
676749
5454 */
5555 void z_random()
5656 {
57 #ifdef TOPS20
58 short sz;
59 sz = s16(zargs[0]);
60 if (sz <= 0) { /* set random seed */
61 seed_random(-sz);
62 store(0);
63 #else
5764 if ((short)zargs[0] <= 0) { /* set random seed */
5865 seed_random(-(short)zargs[0]);
5966 store(0);
60
67 #endif
6168 } else { /* generate random number */
6269 zword result;
6370
6976 A = 0x015a4e35L * A + 1;
7077 result = (A >> 16) & 0x7fff;
7178 }
79
80 #ifdef TOPS20
81 store((zword) ((result % zargs[0] + 1) & 0xffff));
82 #else
7283 store((zword) (result % zargs[0] + 1));
84 #endif
7385 }
7486 } /* z_random */
4141 */
4242 void memory_open(zword table, zword xsize, bool buffering)
4343 {
44 #ifdef TOPS20
45 short sxs;
46
47 if (++depth < MAX_NESTING) {
48 if (!buffering)
49 xsize = 0xffff;
50 sxs = s16(xsize);
51 if (buffering && sxs <= 0)
52 xsize = get_max_width (((zword) (-sxs)) & 0xffff);
53
54 storew(table, 0);
55 redirect[depth].table = table;
56 redirect[depth].width = 0;
57 redirect[depth].total = 0;
58 redirect[depth].xsize = xsize;
59 ostream_memory = TRUE;
60 #else
4461 if (++depth < MAX_NESTING) {
4562 if (!buffering)
4663 xsize = 0xffff;
5673 redirect[depth].total = 0;
5774 redirect[depth].xsize = xsize;
5875 ostream_memory = TRUE;
76 #endif
5977 } else
6078 runtime_error(ERR_STR3_NESTING);
6179 } /* memory_open */
6666 */
6767 static zword winarg0(void)
6868 {
69 #ifdef TOPS20
70 short sz0;
71
72 sz0 = s16(zargs[0]);
73 if (z_header.version == V6 && sz0 == -3)
74 return cwin;
75 if (sz0 >= ((z_header.version == V6) ? 8 : 2))
76 runtime_error(ERR_ILL_WIN);
77 return (zargs[0] & 0xffff);
78 #else
6979 if (z_header.version == V6 && (short)zargs[0] == -3)
7080 return cwin;
7181
7383 runtime_error(ERR_ILL_WIN);
7484
7585 return zargs[0];
86 #endif
7687 } /* winarg0 */
7788
7889
8697 */
8798 static zword winarg2(void)
8899 {
100 #ifdef TOPS20
101 short sz2;
102
103 sz2=s16(zargs[2]);
104 if (zargc < 3 || sz2 == -3)
105 return cwin;
106
107 if (sz2 >= 8)
108 runtime_error(ERR_ILL_WIN);
109
110 return (zargs[2] & 0xffff);
111 #else
89112 if (zargc < 3 || (short)zargs[2] == -3)
90113 return cwin;
91114
93116 runtime_error(ERR_ILL_WIN);
94117
95118 return zargs[2];
119 #endif
96120 } /* winarg2 */
97121
98122
236260 */
237261 void screen_new_line(void)
238262 {
263 #ifdef TOPS20
264 short slc, llc;
265 #endif
239266 if (discarding)
240267 return;
241268
271298
272299 /* See if we need to print a more prompt (unless the game has set
273300 the line counter to -999 in order to suppress more prompts). */
301 #ifdef TOPS20
302 slc = s16(cwp->line_count);
303 if (enable_scrolling && slc != -999) {
304 #else
274305 if (enable_scrolling && (short)cwp->line_count != -999) {
306 #endif
275307 zword above = (cwp->y_cursor - 1) / font_height;
276308 zword below = (cwp->y_size - cwp->y_cursor + 1) / font_height;
277 cwp->line_count++;
309
310 cwp->line_count++; /* Assume it won't overflow on PDP10 */
311 #ifdef TOPS20
312 slc = s16(cwp->line_count);
313 llc = s16(above + below -1);
314 if (slc >= llc) {
315 #else
278316 if ((short)cwp->line_count >= (short)above + below - 1) {
317 #endif
279318 if (more_prompts)
280319 os_more_prompt();
281320 cwp->line_count = f_setup.context_lines;
482521
483522 key = os_read_key(timeout, cursor);
484523
485 if (key != ZC_TIME_OUT)
524 if (key != ZC_TIME_OUT) {
486525 for (i = 0; i < 8; i++)
487526 wp[i].line_count = 0;
488
527 }
489528 return key;
490
491529 } /* console_read_key */
492530
493531
509547
510548 /* Some story files forget to select wrapping for printing hints */
511549
512 if (story_id == ZORK_ZERO && z_header.release == 366)
550 if (story_id == ZORK_ZERO && z_header.release == 366) {
513551 if (cwin == 0)
514552 enable_wrapping = TRUE;
515 if (story_id == SHOGUN && z_header.release <= 295)
553 }
554
555 if (story_id == SHOGUN && z_header.release <= 295) {
516556 if (cwin == 0)
517557 enable_wrapping = TRUE;
558 }
518559 } /* update_attributes */
519560
520561
532573
533574 if (z_header.version != V6) {
534575 style = wp[0].style;
535
536576 if (cwin != 0 || z_header.flags & FIXED_FONT_FLAG)
537577 style |= FIXED_WIDTH_STYLE;
538578 } else
541581 if (!ostream_memory && ostream_screen && enable_buffering) {
542582 print_char(ZC_NEW_STYLE);
543583 print_char(style);
544
545584 } else
546585 os_set_text_style(style);
547586 } /* refresh_text_style */
617656 */
618657 void split_window(zword height)
619658 {
659 #ifdef TOPS20
660 short syc, sys;
661 #endif
620662 zword stat_height = 0;
621663
622664 flush_buffer();
634676 wp[1].y_pos = 1 + stat_height;
635677 wp[1].y_size = height;
636678
679 #ifdef TOPS20
680 syc=s16(wp[1].y_cursor);
681 sys=s16(wp[1].y_size);
682 if (syc > sys)
683 reset_cursor(1);
684 #else
637685 if ((short)wp[1].y_cursor > (short)wp[1].y_size)
638686 reset_cursor(1);
687 #endif
639688
640689 /* Cursor of lower window mustn't be swallowed by the upper window */
641690 wp[0].y_cursor += wp[0].y_pos - 1 - stat_height - height;
643692 wp[0].y_pos = 1 + stat_height + height;
644693 wp[0].y_size = z_header.screen_height - stat_height - height;
645694
695 #ifdef TOPS20
696 syc=s16(wp[0].y_cursor);
697 if (syc < 1)
698 reset_cursor(0);
699 #else
646700 if ((short)wp[0].y_cursor < 1)
647701 reset_cursor(0);
702 #endif
648703
649704 /* Erase the upper window in V3 only */
650705 if (z_header.version == V3 && height != 0)
662717 static void erase_screen(zword win)
663718 {
664719 int i;
720 #ifdef TOPS20
721 short sw;
722 #endif
665723
666724 os_erase_area(1, 1, z_header.screen_height, z_header.screen_width, -2);
667725
726 #ifdef TOPS20
727 sw=s16(win);
728 if (sw == -1) {
729 #else
668730 if ((short)win == -1) {
731 #endif
669732 split_window(0);
670733 set_window(0);
671734 reset_cursor(0);
10211084 */
10221085 void z_erase_window(void)
10231086 {
1087 #ifdef TOPS20
1088 short sz0, sz1;
10241089 flush_buffer();
1025
1090 sz0=s16(zargs[0]);
1091 sz1=s16(zargs[1]);
1092
1093 if (sz0 == -1 || sz0 == -2)
1094 erase_screen((zargs[0] & 0xffff));
1095 else
1096 erase_window(winarg0());
1097 #else
10261098 if ((short)zargs[0] == -1 || (short)zargs[0] == -2)
10271099 erase_screen(zargs[0]);
10281100 else
10291101 erase_window(winarg0());
1102 #endif
10301103 } /* z_erase_window */
10311104
10321105
10901163 */
10911164 void z_mouse_window(void)
10921165 {
1166 #ifdef TOPS20
1167 short sz0;
1168 sz0 = s16(zargs[0]);
1169 mwin = ((short) zargs[0] == -1) ? -1 : winarg0 ();
1170 #else
10931171 mwin = ((short)zargs[0] == -1) ? -1 : winarg0();
1172 #endif
10941173 } /* z_mouse_window */
10951174
10961175
12541333 */
12551334 void z_scroll_window(void)
12561335 {
1336 #ifdef TOPS20
1337 short sz1;
1338 #endif
1339
12571340 zword win = winarg0();
12581341 zword y, x;
12591342
12661349 y = wp[win].y_pos;
12671350 x = wp[win].x_pos;
12681351
1352 #ifdef TOPS20
1353 sz1 = s16(zargs[1]);
1354 os_scroll_area (y,
1355 x,
1356 y + wp[win].y_size - 1,
1357 x + wp[win].x_size - 1, sz1);
1358 #else
12691359 os_scroll_area(y,
12701360 x,
12711361 y + wp[win].y_size - 1,
12721362 x + wp[win].x_size - 1, (short)zargs[1]);
1273
1363 #endif
12741364 if (win != cwin && !amiga_screen_model ())
12751365 os_set_colour(lo(cwp->colour), hi(cwp->colour));
12761366 } /* z_scroll_window */
12861376 */
12871377 void z_set_colour(void)
12881378 {
1379 #ifdef TOPS20
1380 short sfg, sbg;
1381 #endif
1382
12891383 zword win = (z_header.version == V6) ? winarg2() : 0;
12901384
12911385 zword fg = zargs[0];
12921386 zword bg = zargs[1];
12931387
12941388 flush_buffer();
1295
1389 #ifdef TOPS20
1390 flush_buffer();
1391 sfg=s16(fg);
1392 sbg=s16(bg);
1393
1394 if (sfg == -1) /* colour -1 is the colour at the cursor */
1395 fg = os_peek_colour();
1396 if (bg == -1)
1397 bg = os_peek_colour();
1398 #else
12961399 if ((short)fg == -1) /* colour -1 is the colour at the cursor */
12971400 fg = os_peek_colour();
12981401 if ((short)bg == -1)
12991402 bg = os_peek_colour();
1300
1403 #endif
13011404 if (fg == 0) /* colour 0 means keep current colour */
13021405 fg = lo(wp[win].colour);
13031406 if (bg == 0)
13301433 (fg2 == lo(wp[0].colour)) ? fg : bg;
13311434
13321435 wp[i].colour = (bg2 << 8) | fg2;
1333
13341436 }
1335
13361437 }
13371438
13381439 wp[win].colour = (bg << 8) | fg;
14501551 */
14511552 void z_set_cursor(void)
14521553 {
1554 #ifdef TOPS20
1555 short sy;
1556 #endif
14531557 zword win = (z_header.version == V6) ? winarg2() : 1;
14541558
14551559 zword y = zargs[0];
14561560 zword x = zargs[1];
14571561
1562 #ifdef TOPS20
1563 sy=s16(y);
1564 #endif
1565
14581566 flush_buffer();
14591567
14601568 /* Supply default arguments */
1461 if (zargc < 3)
1569 if (zargc < 3) {
14621570 zargs[2] = -3;
1571 #ifdef TOPS20
1572 zargs[2] &= 0xffff;
1573 #else
1574 zargs[2] = -3;
1575 #endif
1576 }
14631577
14641578 /* Handle cursor on/off */
1579 #ifdef TOPS20
1580 if (sy < 0) {
1581 if (sy == -2)
1582 cursor = TRUE;
1583 if (sy == -1)
1584 cursor = FALSE;
1585 return;
1586 }
1587 #else
14651588 if ((short)y < 0) {
14661589 if ((short)y == -2)
14671590 cursor = TRUE;
14691592 cursor = FALSE;
14701593 return;
14711594 }
1595 #endif
14721596
14731597 /* Convert grid positions to screen units if this is not V6 */
14741598 if (z_header.version != V6) {
3030 int expand_abbreviations;
3131 int script_cols;
3232 int sound;
33 int quiet;
3334 int bleep;
3435 int err_report_mode;
3536
3637 char *story_file;
3738 char *blorb_file;
39 char *config_file;
3840 char *story_name;
3941 char *story_base;
4042 char *script_name;
2929 #define EFFECT_FINISH_WITH 4
3030
3131 extern int direct_call(zword);
32
33 #ifndef NO_SOUND
3234
3335 static zword routine = 0;
3436
6769 }
6870
6971 if ((z_header.flags & SOUND_FLAG)
70 || (z_header.version == V3 && (z_header.flags & OLD_SOUND_FLAG))) {
71 f_setup.sound = TRUE;
72 locked = FALSE;
73 playing = FALSE;
74 os_init_sound();
72 || (z_header.version == V3 && (z_header.flags & OLD_SOUND_FLAG))
73 || (f_setup.bleep)
74 ) {
75 if (!f_setup.quiet) {
76 f_setup.sound = TRUE;
77 locked = FALSE;
78 playing = FALSE;
79 os_init_sound();
80 }
7581 } else
7682 f_setup.sound = FALSE;
7783 } /* init_sound */
129135 */
130136 void end_of_sound(void)
131137 {
132 #if defined(DJGPP) && defined(SOUND_SUPPORT)
138 #if defined(DJGPP) && defined(NO_SOUND)
133139 end_of_sound_flag = 0;
134140 #endif
135141
214220 locked = FALSE;
215221 }
216222 } /* z_sound_effect */
223
224 #else /* NO_SOUND */
225
226 void init_sound(void) { /* nothing here */ }
227 void end_of_sound(void) { /* nothing here */ }
228
229 /* Processes bleeps and nothing more. */
230 void z_sound_effect(void)
231 {
232 zword number = zargs[0];
233
234 if (number == 1 || number == 2)
235 os_beep(number);
236 return;
237 }
238 #endif
109109 {
110110 flush_buffer();
111111
112 #ifdef TOPS20
113 switch (s16(zargs[0])) {
114 #else
112115 switch ((short)zargs[0]) {
116 #endif
113117 case 1:
114118 ostream_screen = TRUE;
115119 break;
242246 record_write_key(key);
243247
244248 /* Handle timeouts */
245 /*
246 * Make sure that this is a real timeout, by checking
247 * that the requested timeout is not zero. For the case
248 * of a recorded stream, it is possible that a timeout
249 * keystroke might be replayed.
250 */
251 if (key == ZC_TIME_OUT) {
252 if (timeout != 0) {
253 if (direct_call(routine) == 0)
254 goto continue_input;
255 } else {
256 goto continue_input;
257 }
258 }
249
250 if (key == ZC_TIME_OUT)
251 if (direct_call (routine) == 0)
252 goto continue_input;
259253
260254 /* Handle hot keys */
255
261256 if (hot_keys && key >= ZC_HKEY_MIN && key <= ZC_HKEY_MAX) {
262257 if (z_header.version == V4 && key == ZC_HKEY_UNDO)
263258 goto continue_input;
312307 record_write_input(buf, key);
313308
314309 /* Handle timeouts */
315 /*
316 * Make sure that this is a real timeout, by checking
317 * that the requested timeout is not zero. For the case
318 * of a recorded stream, it is possible that a timeout
319 * keystroke might be replayed.
320 */
321 if (key == ZC_TIME_OUT) {
322 if (timeout != 0) {
323 if (direct_call(routine) == 0)
324 goto continue_input;
325 else
326 buf[0] = 0;
327 } else {
328 goto continue_input;
329 }
330 }
310
311 if (key == ZC_TIME_OUT)
312 if (direct_call (routine) == 0)
313 goto continue_input;
331314
332315 /* Handle hot keys */
333316 if (hot_keys && key >= ZC_HKEY_MIN && key <= ZC_HKEY_MAX) {
3333 */
3434 void z_copy_table(void)
3535 {
36 #ifdef TOPS20
37 short ssz;
38 #endif
3639 zword addr;
3740 zword size = zargs[2];
3841 zbyte value;
3942 int i;
4043
44 #ifdef TOPS20
45 /* TODO : this looks like it could use some masking. AT */
46 ssz=s16(size);
47 if (zargs[1] == 0) /* zero table */
48 for (i = 0; i < (size & 0xffff); i++)
49 storeb ((zword) ((zargs[0] + i) & 0xffff), 0);
50 else if (ssz < 0 || (zargs[0] & 0xffff) > (zargs[1] & 0xffff)) {
51 /*copy forwards */
52 for (i = 0; i < ((ssz < 0) ? - ssz : ssz); i++) {
53 addr = ((zargs[0] + i) & 0xffff);
54 LOW_BYTE (addr, value)
55 storeb((zword) ((zargs[1] + i) & 0xfff), value);
56 }
57 }
58 #else
4159 if (zargs[1] == 0) /* zero table */
4260 for (i = 0; i < size; i++)
4361 storeb((zword) (zargs[0] + i), 0);
4866 LOW_BYTE(addr, value)
4967 storeb((zword) (zargs[1] + i), value);
5068 }
51 } else { /* copy backwards */
69 }
70 #endif
71 else { /* copy backwards */
5272 for (i = size - 1; i >= 0; i--) {
5373 addr = zargs[0] + i;
5474 LOW_BYTE(addr, value)
6787 */
6888 void z_loadb(void)
6989 {
90 #ifdef TOPS20
91 zword addr = zargs[0] + zargs[1] & 0xffff;
92 #else
7093 zword addr = zargs[0] + zargs[1];
94 #endif
7195 zbyte value;
7296
7397 LOW_BYTE(addr, value)
85109 */
86110 void z_loadw(void)
87111 {
112 #ifdef TOPS20
113 zword addr = (zargs[0] + 2 * zargs[1]) & 0xffff;
114 #else
88115 zword addr = zargs[0] + 2 * zargs[1];
116 #endif
89117 zword value;
90118
91119 LOW_WORD(addr, value)
311311 */
312312 void z_check_unicode(void)
313313 {
314 #ifdef TOPS20
315 zword c = zargs[0] & 0xffff;
316 #else
314317 zword c = zargs[0];
315
318 #endif
316319 if (c >= 0x20 && c <= 0x7e)
317320 store(3);
318321 else if (c == 0xa0)
350353 {
351354 int i;
352355
356 #ifdef TOPS20
357 load_string((zword) ( (zargs[0] + zargs[2]) & 0xffff), \
358 zargs[1] & 0xffff);
359 #else
353360 load_string((zword) (zargs[0] + zargs[2]), zargs[1]);
361 #endif
354362 encode_text(0x05);
355363 for (i = 0; i < 3; i++)
356364 storew((zword) (zargs[3] + 2 * i), encoded[i]);
586594 */
587595 void print_num(zword value)
588596 {
597 #ifdef TOPS20
598 short sv;
599 #endif
589600 int i;
590601
591602 /* Print sign */
603 #ifdef TOPS20
604 sv = s16(value);
605 if (sv < 0) {
606 print_char ('-');
607 value = -sv & 0xffff;
608 }
609 #else
592610 if ((short)value < 0) {
593611 print_char('-');
594612 value = -(short)value;
595613 }
614 #endif
596615
597616 /* Print absolute value */ {
598617 for (i = 10000; i != 0; i /= 10)
611630 */
612631 void z_print_num(void)
613632 {
633 #ifdef TOPS20
634 print_num(zargs[0] & 0xffff);
635 #else
614636 print_num(zargs[0]);
615
637 #endif
616638 } /* z_print_num */
617639
618640
650672 */
651673 void z_print_obj(void)
652674 {
675 #ifdef TOPS20
676 print_object (zargs[0] & 0xffff);
677 #else
653678 print_object(zargs[0]);
679 #endif
654680 } /* z_print_obj */
655681
656682
662688 */
663689 void z_print_paddr(void)
664690 {
691 #ifdef TOPS20
692 decode_text (HIGH_STRING, zargs[0] & 0xffff);
693 #else
665694 decode_text(HIGH_STRING, zargs[0]);
695 #endif
666696 } /* z_print_paddr */
667697
668698
740770 int lower, upper;
741771 int i;
742772 bool sorted;
773 #ifdef TOPS20
774 short sec;
775 #endif
743776
744777 encode_text(padding);
745778
750783 LOW_WORD(dct, entry_count) /* get number of entries */
751784 dct += 2;
752785
786 #ifdef TOPS20
787 sec = s16(entry_count);
788 if (sec < 0) { /* bad luck, entries aren't sorted */
789 entry_count = (zword) ((-sec) & 0xffff);
790 #else
753791 if ((short)entry_count < 0) { /* bad luck, entries aren't sorted */
754792 entry_count = -(short)entry_count;
793 #endif
755794 sorted = FALSE;
756795 } else
757796 sorted = TRUE; /* entries are sorted */
1010 #elif defined (__LCLINT__)
1111 # define UNUSED(x) /*@unused@*/ x
1212 #else
13 # define UNUSED(x) x
13 # define UNUSED(x) x
1414 #endif
1515
1616 #ifdef __GNUC__
2929 void z_dec(void)
3030 {
3131 zword value;
32
32 #ifdef TOPS20
33 zword z0;
34 short sv;
35
36 z0 = zargs[0];
37 z0 &= 0xffff;
38
39 if (z0 == 0) {
40 sv = s16(*sp);
41 sv -= 1;
42 *sp = ((zword) (sv & 0xffff));
43 }
44 else if (z0 < 16) {
45 sv = s16(*(fp - z0));
46 sv -= 1;
47 *(fp - z0) = ((zword) (sv & 0xffff));
48 } else {
49 zword addr = z_header.globals + 2 * (z0 - 16);
50 LOW_WORD(addr, value)
51 sv=s16(value);
52 sv--;
53 value = (zword) sv;
54 value &= 0xffff;
55 SET_WORD(addr, value)
56 }
57 #else
3358 if (zargs[0] == 0)
3459 (*sp)--;
3560 else if (zargs[0] < 16)
4065 value--;
4166 SET_WORD(addr, value)
4267 }
68 #endif
4369 } /* z_dec */
4470
4571
5379 void z_dec_chk(void)
5480 {
5581 zword value;
56
82 #ifdef TOPS20
83 zword z0, z1;
84 short sv, sz1;
85
86 z0 = zargs[0];
87 z1 = zargs[1];
88
89 z0 &= 0xffff;
90 z1 &= 0xffff;
91
92 if (z0 == 0) {
93 sv = s16(*sp);
94 sv -= 1;
95 value = (((zword ) sv ) & 0xffff);
96 *sp = value;
97 }
98 else if (z0 < 16) {
99 sv = s16(*(fp - z0));
100 sv -= 1;
101 value = (((zword) sv ) & 0xffff);
102 *(fp - z0) = value;
103 }
104 else {
105 zword addr = z_header.globals + 2 * (z0 - 16);
106 LOW_WORD(addr, value)
107 value--;
108 value &= 0xffff;
109 SET_WORD(addr, value)
110 }
111 sv = s16(value);
112 sz1 = s16(z1);
113 branch (sv < sz1);
114 #else
57115 if (zargs[0] == 0)
58116 value = --(*sp);
59117 else if (zargs[0] < 16)
65123 SET_WORD(addr, value)
66124 }
67125 branch((short)value < (short)zargs[1]);
126 #endif
68127 } /* z_dec_chk */
69128
70129
77136 void z_inc(void)
78137 {
79138 zword value;
139 #ifdef TOPS20
140 zword z0;
141 short sv;
142
143 z0 = zargs[0];
144 z0 &= 0xffff;
145
146 if (z0 == 0) {
147 sv = s16(*sp);
148 sv += 1;
149 value = (((zword) sv) & 0xffff);
150 *sp = value;
151 } else if (z0 < 16) {
152 sv = s16(*(fp -z0));
153 sv +=1;
154 value = (((zword) sv) & 0xffff);
155 *(fp - z0) = value;
156 } else {
157 zword addr = z_header.globals + 2 * (z0 - 16);
158 LOW_WORD(addr, value)
159 value++;
160 value &= 0xffff;
161 SET_WORD(addr, value)
162 }
163 #else
80164
81165 if (zargs[0] == 0)
82166 (*sp)++;
88172 value++;
89173 SET_WORD(addr, value)
90174 }
91
175 #endif
92176 } /* z_inc */
93177
94178
102186 void z_inc_chk(void)
103187 {
104188 zword value;
105
189 #ifdef TOPS20
190 zword z0, z1;
191 short sv, sz1;
192
193 z0 = zargs[0];
194 z1 = zargs[1];
195 sz1 = s16(z1);
196
197 if (z0 == 0) {
198 sv = s16(*sp);
199 sv += 1;
200 value = (((zword) sv ) & 0xffff);
201 *sp = value;
202 } else if (z0 < 16) {
203 sv = s16(*(fp - z0));
204 sv +=1;
205 value = (((zword) sv) & 0xffff);
206 *(fp - z0) = value;
207 } else {
208 zword addr = z_header.globals + 2 * (z0 - 16);
209 LOW_WORD(addr, value)
210 value++;
211 value &= 0xffff;
212 SET_WORD (addr, value)
213 }
214 sv=s16(value);
215 branch (sv > sz1);
216 #else
106217 if (zargs[0] == 0)
107218 value = ++(*sp);
108219 else if (zargs[0] < 16)
114225 SET_WORD(addr, value)
115226 }
116227 branch((short)value > (short)zargs[1]);
228 #endif
117229 } /* z_inc_chk */
118230
119231
126238 void z_load(void)
127239 {
128240 zword value;
129
130 if (zargs[0] == 0)
241 #ifdef TOPS20
242 zword z0;
243 z0 = zargs[0];
244 z0 &= 0xffff;
245 #endif
246
247
248 #ifdef TOPS20
249 if (z0 == 0)
131250 value = *sp;
251 else if (z0 < 16)
252 value = *(fp - z0);
253 else {
254 zword addr = z_header.globals + 2 * (z0 - 16);
255 LOW_WORD (addr, value)
256 }
257 store(value & 0xffff);
258 #else
259 if (zargs[0] == 0)
260 value = *sp;
132261 else if (zargs[0] < 16)
133262 value = *(fp - zargs[0]);
134263 else {
136265 LOW_WORD(addr, value)
137266 }
138267 store(value);
268 #endif
139269 } /* z_load */
140270
141271
1313
1414 SOUND_TYPE ?= ao
1515
16 UNAME_S := $(shell uname -s)
17
1618 ifeq ($(SOUND_TYPE), ao)
1719 ifneq ($(UNAME_S),Haiku)
1820 CFLAGS += -pthread
21 ifeq ($(UNAME_S),Darwin)
22 HOMEBREW_PREFIX ?= $(shell brew --prefix)
23 CFLAGS += -I$(HOMEBREW_PREFIX)/include
24 endif
1925 endif
2026 else ifeq ($(SOUND_TYPE), none)
2127
5858 volatile sig_atomic_t terminal_resized = 0;
5959
6060 static void sigwinch_handler(int);
61 static void parse_options(int argc, char **argv);
62
6163 #define INFORMATION "\
6264 An interpreter for all Infocom and other Z-Machine games.\n\
6365 \n\
195197 */
196198 void os_process_arguments (int argc, char *argv[])
197199 {
198 int c;
199200 char *p = NULL;
200201 char *home;
201202 char configfile[FILENAME_MAX + 1];
259260 getconfig(configfile); /* we're not concerned if this fails */
260261 }
261262
262 /* Parse the options */
263 parse_options(argc, argv);
264
265 /* This section is exceedingly messy and really can't be fixed
266 * without major changes all over the place.
267 */
268
269 /* Save the story file name */
270
271 f_setup.story_file = strdup(argv[zoptind]);
272 f_setup.story_name = strdup(basename(argv[zoptind]));
273
274 #ifndef NO_BLORB
275 if (argv[zoptind+1] != NULL)
276 f_setup.blorb_file = strdup(argv[zoptind+1]);
277 #endif
278
279 /* Now strip off the extension */
280 p = strrchr(f_setup.story_name, '.');
281 if ( p != NULL )
282 *p = '\0'; /* extension removed */
283
284 /* Create nice default file names */
285 f_setup.script_name = malloc((strlen(f_setup.story_name) + strlen(EXT_SCRIPT) + 1) * sizeof(char));
286 memcpy(f_setup.script_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_SCRIPT)) * sizeof(char));
287 strncat(f_setup.script_name, EXT_SCRIPT, strlen(EXT_SCRIPT)+1);
288
289 f_setup.command_name = malloc((strlen(f_setup.story_name) + strlen(EXT_COMMAND) + 1) * sizeof(char));
290 memcpy(f_setup.command_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_COMMAND)) * sizeof(char));
291 strncat(f_setup.command_name, EXT_COMMAND, strlen(EXT_COMMAND)+1);
292
293 if (!f_setup.restore_mode) {
294 f_setup.save_name = malloc((strlen(f_setup.story_name) + strlen(EXT_SAVE) + 1) * sizeof(char));
295 memcpy(f_setup.save_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_SAVE)) * sizeof(char));
296 strncat(f_setup.save_name, EXT_SAVE, strlen(EXT_SAVE) + 1);
297 } else { /*Set our auto load save as the name_save*/
298 f_setup.save_name = malloc((strlen(f_setup.tmp_save_name) + strlen(EXT_SAVE) + 1) * sizeof(char));
299 memcpy(f_setup.save_name, f_setup.tmp_save_name, (strlen(f_setup.story_name) + strlen(EXT_SAVE)) * sizeof(char));
300 free(f_setup.tmp_save_name);
301 }
302
303 f_setup.aux_name = malloc((strlen(f_setup.story_name) + strlen(EXT_AUX) + 1) * sizeof(char));
304 memcpy(f_setup.aux_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_AUX)) * sizeof(char));
305 strncat(f_setup.aux_name, EXT_AUX, strlen(EXT_AUX) + 1);
306
307 /*
308 for (int i = 0; i < NON_STD_COLS; i++)
309 u_setup.nonstdcolours[i] = 0xffffffff;
310 u_setup.nonstdindex = 0;
311 */
312
313 } /* os_process_arguments */
314
315
316 /*
317 * parse_options
318 *
319 * Parse command line options and that's it.
320 *
321 */
322 static void parse_options(int argc, char **argv)
323 {
324 int c;
263325 do {
264326 c = zgetopt(argc, argv, "aAb:c:deE:f:Fh:iI:l:L:moOpPqr:R:s:S:tu:vw:W:xZ:");
265327 switch(c) {
303365 case 'O': f_setup.object_locating = 1; break;
304366 case 'p': u_setup.plain_ascii = 1; break;
305367 case 'P': f_setup.piracy = 1; break;
306 case 'q': f_setup.sound = 0; break;
368 case 'q': f_setup.quiet = 1; break;
307369 case 'r': f_setup.right_margin = atoi(zoptarg); break;
308370 case 'R': f_setup.restricted_path = strndup(zoptarg, PATH_MAX); break;
309371 case 's': u_setup.random_seed = atoi(zoptarg); break;
330392 usage();
331393 os_quit(EXIT_SUCCESS);
332394 }
333
334 /* This section is exceedingly messy and really can't be fixed
335 * without major changes all over the place.
336 */
337
338 /* Save the story file name */
339
340 f_setup.story_file = strdup(argv[zoptind]);
341 f_setup.story_name = strdup(basename(argv[zoptind]));
342
343 #ifndef NO_BLORB
344 if (argv[zoptind+1] != NULL)
345 f_setup.blorb_file = strdup(argv[zoptind+1]);
346 #endif
347
348 /* Now strip off the extension */
349 p = strrchr(f_setup.story_name, '.');
350 if ( p != NULL )
351 *p = '\0'; /* extension removed */
352
353 /* Create nice default file names */
354 f_setup.script_name = malloc((strlen(f_setup.story_name) + strlen(EXT_SCRIPT) + 1) * sizeof(char));
355 memcpy(f_setup.script_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_SCRIPT)) * sizeof(char));
356 strncat(f_setup.script_name, EXT_SCRIPT, strlen(EXT_SCRIPT)+1);
357
358 f_setup.command_name = malloc((strlen(f_setup.story_name) + strlen(EXT_COMMAND) + 1) * sizeof(char));
359 memcpy(f_setup.command_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_COMMAND)) * sizeof(char));
360 strncat(f_setup.command_name, EXT_COMMAND, strlen(EXT_COMMAND)+1);
361
362 if (!f_setup.restore_mode) {
363 f_setup.save_name = malloc((strlen(f_setup.story_name) + strlen(EXT_SAVE) + 1) * sizeof(char));
364 memcpy(f_setup.save_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_SAVE)) * sizeof(char));
365 strncat(f_setup.save_name, EXT_SAVE, strlen(EXT_SAVE) + 1);
366 } else { /*Set our auto load save as the name_save*/
367 f_setup.save_name = malloc((strlen(f_setup.tmp_save_name) + strlen(EXT_SAVE) + 1) * sizeof(char));
368 memcpy(f_setup.save_name, f_setup.tmp_save_name, (strlen(f_setup.story_name) + strlen(EXT_SAVE)) * sizeof(char));
369 free(f_setup.tmp_save_name);
370 }
371
372 f_setup.aux_name = malloc((strlen(f_setup.story_name) + strlen(EXT_AUX) + 1) * sizeof(char));
373 memcpy(f_setup.aux_name, f_setup.story_name, (strlen(f_setup.story_name) + strlen(EXT_AUX)) * sizeof(char));
374 strncat(f_setup.aux_name, EXT_AUX, strlen(EXT_AUX) + 1);
375
376 /*
377 for (int i = 0; i < NON_STD_COLS; i++)
378 u_setup.nonstdcolours[i] = 0xffffffff;
379 u_setup.nonstdindex = 0;
380 */
381
382 } /* os_process_arguments */
395 } /* parse_options */
383396
384397
385398 void unix_get_terminal_size()
9090 unsigned char jfif_name[5] = {'J', 'F', 'I', 'F', 0x00};
9191
9292 bb_result_t res;
93 bb_resolution_t *reso;
9394 uint32 pos;
9495
9596 if (blorb_map == NULL) return FALSE;
100101 pict_info[0].height = num_pictures;
101102 pict_info[0].width = bb_get_release_num(blorb_map);
102103
103 y_scale = 200;
104 x_scale = 320;
104 reso = bb_get_resolution(blorb_map);
105 if (reso) {
106 x_scale = reso->px;
107 y_scale = reso->py;
108 } else {
109 y_scale = 200;
110 x_scale = 320;
111 }
105112
106113 for (i = 1; i <= num_pictures; i++) {
107114 if (bb_load_resource(blorb_map, bb_method_Memory, &res, bb_ID_Pict, i) == bb_err_None) {
1919 *
2020 * This file and only this file is dual licensed under the MIT license.
2121 *
22 * Copyright (c) 2019 Mark McCurry
2223 */
2324
2425 /*
2930
3031 #ifndef CURSES_UX_SEMA_H
3132 #define CURSES_UX_SEMA_H
33
34 #include "../common/defs.h"
3235
3336 #ifndef NO_SOUND
3437
179179 switch(u_setup.emphasis_mode) {
180180 case EMPHASIS_ITALIC:
181181 #ifdef ITALIC_SUPPORT
182 #if (NCURSES_VERSION_MAJOR >= 6)
183
182184 if (termattrs() & A_ITALIC) temp |= A_ITALIC;
183185 else temp |= A_UNDERLINE;
186 #endif
184187 #else
185188 temp |= A_UNDERLINE;
186189 #endif /* ITALICS_SUPPORT */
0 # For GNU Make.
0 # For GNU Make. Just for cleaning purposes.
11
2 SOURCES = bcblorb.c bcinit.c bcinput.c bcmouse.c bcpic.c bcsample.c bcscreen bctext.c
3
4 HEADERS = bcfrotz.h blorb.h blorblow.h fontdata.h
5
6 OBJECTS = $(SOURCES:.c=.o)
7
8 .PHONY: clean
9
10 $(TARGET): $(OBJECTS)
11 @echo "** Done with DOS interface."
2 .PHONY: clean
123
134 clean:
14 rm -f $(TARGET) $(OBJECTS)
15 rm -f *.O
16
17 %.o: %.c
18 $(WCC) $(CFLAGS) $(DOS_CFLAGS) -o $@ -c $<
5 rm -f frotz.exe FROTZ.EXE
6 rm -f *.O *.o
+0
-880
src/dos/bcblorb.c less more
0 /* blorblib.c: Blorb file reader library, version 1.0.2.
1 Designed by Andrew Plotkin <erkyrath@eblong.com>
2 http://www.eblong.com/zarf/blorb/index.html
3
4 This is portable code to read a Blorb file. Add it to your
5 interpreter, #include "blorb.h", and you're ready to go.
6 */
7
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include "frotz.h"
12
13 #ifndef NO_BLORB
14
15 #include "blorb.h"
16 #include "blorblow.h"
17
18 #define bb_native2(v) \
19 ( (((uint16)(v) >> 8) & 0x00ff) \
20 | (((uint16)(v) << 8) & 0xff00))
21 #define bb_native4(v) \
22 ( (((uint32)(v) >> 24) & 0x000000ff) \
23 | (((uint32)(v) >> 8) & 0x0000ff00) \
24 | (((uint32)(v) << 8) & 0x00ff0000) \
25 | (((uint32)(v) << 24) & 0xff000000))
26
27 static int lib_inited = FALSE;
28
29 static bb_err_t bb_initialize_map(bb_map_t * map);
30 static bb_err_t bb_initialize(void);
31 static int sortsplot(const void *p1, const void *p2);
32
33 /* Do some one-time startup tests. */
34 static bb_err_t bb_initialize()
35 {
36 union {
37 uint32 val;
38 unsigned char ch[4];
39 } test;
40 uint32 val;
41
42 // if (sizeof(uint32) != 4 || sizeof(uint16) != 2)
43 // return bb_err_CompileTime; /* Basic types are the wrong size. */
44
45 test.ch[0] = 0x13;
46 test.ch[1] = 0x57;
47 test.ch[2] = 0x9a;
48 test.ch[3] = 0xce;
49 val = test.val;
50 if (bb_native4(val) != 0x13579ace)
51 return bb_err_CompileTime; /* Wrong endianness. */
52
53 return bb_err_None;
54 } /* bb_initialize */
55
56
57 bb_err_t bb_create_map(FILE * file, bb_map_t ** newmap)
58 {
59 bb_err_t err;
60 bb_map_t *map;
61 size_t readlen;
62 uint32 nextpos, totallength;
63 bb_chunkdesc_t *chunks;
64 int chunks_size, numchunks;
65 uint32 buffer[4];
66
67 *newmap = NULL;
68
69 if (!lib_inited) {
70 err = bb_initialize();
71 if (err)
72 return err;
73 lib_inited = TRUE;
74 }
75
76 /* First, chew through the file and index the chunks. */
77
78 err = fseek(file, 0, 0);
79 if (err)
80 return bb_err_Read;
81
82 /* FIXME. Under 16-bit DOS, this fails.
83 * From the following url: "'unsigned long' variables don't work in
84 * 16-bit mode." How do I get around this?
85 * http://www.digitalmars.com/d/archives/c++/dos/16-bits/45.html
86 */
87 readlen = fread(buffer, sizeof(uint32), 3, file);
88 if (readlen != 3)
89 return bb_err_Read;
90
91 if (bb_native4(buffer[0]) != bb_ID_FORM)
92 return bb_err_Format;
93 if (bb_native4(buffer[2]) != bb_ID_IFRS)
94 return bb_err_Format;
95
96 totallength = bb_native4(buffer[1]) + 8;
97 nextpos = 12;
98
99 chunks_size = 8;
100 numchunks = 0;
101 chunks =
102 (bb_chunkdesc_t *) malloc(sizeof(bb_chunkdesc_t) * chunks_size);
103
104 while (nextpos < totallength) {
105 uint32 type, len;
106 int chunum;
107 bb_chunkdesc_t *chu;
108
109 err = fseek(file, nextpos, 0);
110 if (err)
111 return bb_err_Read;
112
113 readlen = fread(buffer, sizeof(uint32), 2, file);
114 if (readlen != 2)
115 return bb_err_Read;
116
117 type = bb_native4(buffer[0]);
118 len = bb_native4(buffer[1]);
119
120 if (numchunks >= chunks_size) {
121 chunks_size *= 2;
122 chunks = (bb_chunkdesc_t *) realloc(chunks,
123 sizeof
124 (bb_chunkdesc_t) *
125 chunks_size);
126 }
127
128 chunum = numchunks;
129 chu = &(chunks[chunum]);
130 numchunks++;
131
132 chu->type = type;
133 chu->startpos = nextpos;
134 if (type == bb_ID_FORM) {
135 chu->datpos = nextpos;
136 chu->len = len + 8;
137 } else {
138 chu->datpos = nextpos + 8;
139 chu->len = len;
140 }
141 chu->ptr = NULL;
142 chu->auxdatnum = -1;
143
144 nextpos = nextpos + len + 8;
145 if (nextpos & 1)
146 nextpos++;
147
148 if (nextpos > totallength)
149 return bb_err_Format;
150 }
151
152 /* The basic IFF structure seems to be ok, and we have a list of
153 chunks. Now we allocate the map structure itself. */
154
155 map = (bb_map_t *) malloc(sizeof(bb_map_t));
156 if (!map) {
157 free(chunks);
158 return bb_err_Alloc;
159 }
160
161 map->inited = bb_Inited_Magic;
162 map->file = file;
163 map->chunks = chunks;
164 map->numchunks = numchunks;
165 map->resources = NULL;
166 map->ressorted = NULL;
167 map->numresources = 0;
168 map->releasenum = 0;
169 map->zheader = NULL;
170 map->resolution = NULL;
171 map->palettechunk = -1;
172 map->palette = NULL;
173 map->auxsound = NULL;
174 map->auxpict = NULL;
175
176 /* Now we do everything else involved in loading the Blorb file,
177 such as building resource lists. */
178
179 err = bb_initialize_map(map);
180 if (err) {
181 bb_destroy_map(map);
182 return err;
183 }
184
185 *newmap = map;
186 return bb_err_None;
187 } /* bb_create_map */
188
189
190 static bb_err_t bb_initialize_map(bb_map_t * map)
191 {
192 /* It is important that the map structure be kept valid during this
193 function. If this returns an error, bb_destroy_map() will be called. */
194
195 int ix, jx;
196 bb_result_t chunkres;
197 bb_err_t err;
198 uint32 *ptr;
199 uint32 len;
200 uint32 val;
201 int numres;
202 int gotindex = FALSE;
203
204 for (ix = 0; ix < map->numchunks; ix++) {
205 bb_chunkdesc_t *chu = &map->chunks[ix];
206
207 switch (chu->type) {
208
209 case bb_ID_RIdx:
210 /* Resource index chunk: build the resource list and sort it. */
211
212 if (gotindex)
213 return bb_err_Format; /* duplicate index chunk */
214 err = bb_load_chunk_by_number(map, bb_method_Memory,
215 &chunkres, ix);
216 if (err)
217 return err;
218
219 ptr = chunkres.data.ptr;
220 len = chunkres.length;
221 val = ptr[0];
222 numres = bb_native4(val);
223
224 if (numres) {
225 int ix2;
226 bb_resdesc_t *resources;
227 bb_resdesc_t **ressorted;
228
229 if (len != numres * 12 + 4)
230 return bb_err_Format; /* bad length field */
231
232 resources =
233 (bb_resdesc_t *) malloc(numres *
234 sizeof
235 (bb_resdesc_t));
236 ressorted =
237 (bb_resdesc_t **) malloc(numres *
238 sizeof(bb_resdesc_t
239 *));
240 if (!ressorted || !resources)
241 return bb_err_Alloc;
242
243 ix2 = 0;
244 for (jx = 0; jx < numres; jx++) {
245 bb_resdesc_t *res = &(resources[jx]);
246 uint32 respos;
247
248 val = ptr[1 + jx * 3];
249 res->usage = bb_native4(val);
250 val = ptr[2 + jx * 3];
251 res->resnum = bb_native4(val);
252 val = ptr[3 + jx * 3];
253 respos = bb_native4(val);
254
255 while (ix2 < map->numchunks
256 && map->chunks[ix2].startpos <
257 respos)
258 ix2++;
259
260 if (ix2 >= map->numchunks
261 || map->chunks[ix2].startpos !=
262 respos)
263 return bb_err_Format; /* start pos does not match a real chunk */
264
265 res->chunknum = ix2;
266
267 ressorted[jx] = res;
268 }
269
270 /* Sort a resource list (actually a list of pointers to structures
271 in map->resources.) This makes it easy to find resources by
272 usage and resource number. */
273 qsort(ressorted, numres, sizeof(bb_resdesc_t *),
274 &sortsplot);
275
276 map->numresources = numres;
277 map->resources = resources;
278 map->ressorted = ressorted;
279 }
280
281 bb_unload_chunk(map, ix);
282 gotindex = TRUE;
283 break;
284
285 case bb_ID_RelN:
286 /* Release number chunk: Get the release number. */
287
288 err = bb_load_chunk_by_number(map, bb_method_Memory,
289 &chunkres, ix);
290 if (err)
291 return err;
292
293 if (chunkres.length != 2)
294 return bb_err_Format;
295
296 {
297 uint16 val = *((uint16 *) chunkres.data.ptr);
298 map->releasenum = bb_native2(val);
299 }
300
301 bb_unload_chunk(map, ix);
302 break;
303
304 case bb_ID_IFhd:
305 /* Z-header chunk: Get the header info. */
306
307 err = bb_load_chunk_by_number(map, bb_method_Memory,
308 &chunkres, ix);
309 if (err)
310 return err;
311
312 if (chunkres.length < 13)
313 return bb_err_Format;
314
315 {
316 uint16 val;
317 bb_zheader_t *head =
318 (bb_zheader_t *)
319 malloc(sizeof(bb_zheader_t));
320 if (!head)
321 return bb_err_Alloc;
322
323 val = ((uint16 *) (chunkres.data.ptr))[0];
324 head->releasenum = bb_native2(val);
325
326 val = ((uint16 *) (chunkres.data.ptr))[4];
327 head->checksum = bb_native2(val);
328
329 for (jx = 0; jx < 6; jx++) {
330 head->serialnum[jx] =
331 ((char *)(chunkres.data.ptr))[2 +
332 jx];
333 }
334
335 map->zheader = head;
336 }
337
338 bb_unload_chunk(map, ix);
339 break;
340
341 case bb_ID_Reso:
342 /* Resolution chunk: Get the window size data, and resolution
343 ratios for images. */
344
345 err = bb_load_chunk_by_number(map, bb_method_Memory,
346 &chunkres, ix);
347 if (err)
348 return err;
349
350 if (chunkres.length < 24)
351 return bb_err_Format;
352
353 ptr = chunkres.data.ptr;
354 len = chunkres.length;
355
356 {
357 bb_resolution_t *reso =
358 (bb_resolution_t *)
359 malloc(sizeof(bb_resolution_t));
360 if (!reso)
361 return bb_err_Alloc;
362
363 reso->px = bb_native4(ptr[0]);
364 reso->py = bb_native4(ptr[1]);
365 reso->minx = bb_native4(ptr[2]);
366 reso->miny = bb_native4(ptr[3]);
367 reso->maxx = bb_native4(ptr[4]);
368 reso->maxy = bb_native4(ptr[5]);
369
370 map->resolution = reso;
371 }
372
373 ptr += 6;
374 len -= 6 * 4;
375
376 len = len / 28;
377
378 if (len) {
379 bb_aux_pict_t *aux =
380 (bb_aux_pict_t *) malloc(len *
381 sizeof
382 (bb_aux_pict_t));
383
384 for (jx = 0; jx < len; jx++, ptr += 7) {
385 bb_result_t res;
386
387 err =
388 bb_load_resource(map,
389 bb_method_DontLoad,
390 &res, bb_ID_Pict,
391 bb_native4(ptr
392 [0]));
393 if (!err) {
394 bb_chunkdesc_t *chu =
395 &(map->
396 chunks[res.chunknum]);
397 if (chu->auxdatnum != -1)
398 return bb_err_Format; /* two image entries for this resource */
399 chu->auxdatnum = jx;
400 aux[jx].ratnum =
401 bb_native4(ptr[1]);
402 aux[jx].ratden =
403 bb_native4(ptr[2]);
404 aux[jx].minnum =
405 bb_native4(ptr[3]);
406 aux[jx].minden =
407 bb_native4(ptr[4]);
408 aux[jx].maxnum =
409 bb_native4(ptr[5]);
410 aux[jx].maxden =
411 bb_native4(ptr[6]);
412 }
413 }
414
415 map->auxpict = aux;
416 }
417
418 bb_unload_chunk(map, ix);
419 break;
420
421 case bb_ID_Loop:
422 /* Looping chunk: Get looping data for sounds. */
423
424 err = bb_load_chunk_by_number(map, bb_method_Memory,
425 &chunkres, ix);
426 if (err)
427 return err;
428
429 ptr = chunkres.data.ptr;
430 len = chunkres.length;
431
432 len = len / 8;
433
434 if (len) {
435 bb_aux_sound_t *aux =
436 (bb_aux_sound_t *) malloc(len *
437 sizeof
438 (bb_aux_sound_t));
439
440 for (jx = 0; jx < len; jx++, ptr += 2) {
441 bb_result_t res;
442
443 err =
444 bb_load_resource(map,
445 bb_method_DontLoad,
446 &res, bb_ID_Snd,
447 bb_native4(ptr
448 [0]));
449 if (!err) {
450 bb_chunkdesc_t *chu =
451 &(map->
452 chunks[res.chunknum]);
453 if (chu->auxdatnum != -1)
454 return bb_err_Format; /* two looping entries for this resource */
455 chu->auxdatnum = jx;
456 aux[jx].repeats =
457 bb_native4(ptr[1]);
458 }
459 }
460
461 map->auxsound = aux;
462 }
463
464 bb_unload_chunk(map, ix);
465 break;
466
467 case bb_ID_Plte:
468 /* Palette chunk: Don't get the palette info now, since it may
469 be large and the interpreter may not care. But remember
470 the chunk number in case the interpreter asks later. */
471
472 map->palettechunk = ix;
473 break;
474 }
475 }
476
477 return bb_err_None;
478 } /* bb_initialize_map */
479
480
481 bb_err_t bb_destroy_map(bb_map_t * map)
482 {
483 int ix;
484
485 if (!map || !map->chunks || map->inited != bb_Inited_Magic)
486 return bb_err_NotAMap;
487
488 for (ix = 0; ix < map->numchunks; ix++) {
489 bb_chunkdesc_t *chu = &(map->chunks[ix]);
490 if (chu->ptr) {
491 free(chu->ptr);
492 chu->ptr = NULL;
493 }
494 }
495
496 if (map->chunks) {
497 free(map->chunks);
498 map->chunks = NULL;
499 }
500
501 map->numchunks = 0;
502
503 if (map->resources) {
504 free(map->resources);
505 map->resources = NULL;
506 }
507
508 if (map->ressorted) {
509 free(map->ressorted);
510 map->ressorted = NULL;
511 }
512
513 map->numresources = 0;
514
515 if (map->zheader) {
516 free(map->zheader);
517 map->zheader = NULL;
518 }
519
520 if (map->resolution) {
521 free(map->resolution);
522 map->resolution = NULL;
523 }
524
525 if (map->palette) {
526 if (!map->palette->isdirect && map->palette->data.table.colors) {
527 free(map->palette->data.table.colors);
528 map->palette->data.table.colors = NULL;
529 }
530 free(map->palette);
531 map->palette = NULL;
532 }
533
534 if (map->auxsound) {
535 free(map->auxsound);
536 map->auxsound = NULL;
537 }
538
539 if (map->auxpict) {
540 free(map->auxpict);
541 map->auxpict = NULL;
542 }
543
544 map->file = NULL;
545 map->inited = 0;
546
547 free(map);
548
549 return bb_err_None;
550 } /* bb_destroy_map */
551
552
553 /* Turn a four-byte constant into a string. This returns a static buffer,
554 so if you call it twice, the old value gets overwritten. */
555 char *bb_id_to_string(uint32 id)
556 {
557 static char buf[5];
558 buf[0] = (id >> 24) & 0xff;
559 buf[1] = (id >> 16) & 0xff;
560 buf[2] = (id >> 8) & 0xff;
561 buf[3] = (id) & 0xff;
562 buf[4] = '\0';
563 return buf;
564 }
565
566
567 /* Turn an error code into a string describing the error. */
568 char *bb_err_to_string(bb_err_t err)
569 {
570 switch (err) {
571 case bb_err_None:
572 return "ok";
573 case bb_err_CompileTime:
574 return "library compiled wrong";
575 case bb_err_Alloc:
576 return "cannot allocate memory";
577 case bb_err_Read:
578 return "cannot read from file";
579 case bb_err_NotAMap:
580 return "map structure is bad";
581 case bb_err_Format:
582 return "bad format in Blorb file";
583 case bb_err_NotFound:
584 return "data not found";
585 default:
586 return "unknown error";
587 }
588 }
589
590
591 /* This is used for binary searching and quicksorting the resource pointer list. */
592 static int sortsplot(const void *p1, const void *p2)
593 {
594 bb_resdesc_t *v1 = *(bb_resdesc_t **) p1;
595 bb_resdesc_t *v2 = *(bb_resdesc_t **) p2;
596 if (v1->usage < v2->usage)
597 return -1;
598 if (v1->usage > v2->usage)
599 return 1;
600 return v1->resnum - v2->resnum;
601 }
602
603
604 bb_err_t bb_load_chunk_by_type(bb_map_t * map, int method, bb_result_t * res,
605 uint32 type, int count)
606 {
607 int ix;
608
609 for (ix = 0; ix < map->numchunks; ix++) {
610 if (map->chunks[ix].type == type) {
611 if (count == 0)
612 break;
613 count--;
614 }
615 }
616
617 if (ix >= map->numchunks) {
618 return bb_err_NotFound;
619 }
620
621 return bb_load_chunk_by_number(map, method, res, ix);
622 }
623
624
625 bb_err_t bb_load_chunk_by_number(bb_map_t * map, int method, bb_result_t * res,
626 int chunknum)
627 {
628 bb_chunkdesc_t *chu;
629
630 if (chunknum < 0 || chunknum >= map->numchunks)
631 return bb_err_NotFound;
632
633 chu = &(map->chunks[chunknum]);
634
635 switch (method) {
636
637 case bb_method_DontLoad:
638 /* do nothing */
639 break;
640
641 case bb_method_FilePos:
642 res->data.startpos = chu->datpos;
643 break;
644
645 case bb_method_Memory:
646 if (!chu->ptr) {
647 bb_err_t err;
648 size_t readlen;
649 void *dat = malloc(chu->len);
650
651 if (!dat)
652 return bb_err_Alloc;
653
654 err = fseek(map->file, chu->datpos, 0);
655 if (err)
656 return bb_err_Read;
657
658 readlen = fread(dat, 1, chu->len, map->file);
659 if (readlen != chu->len)
660 return bb_err_Read;
661
662 chu->ptr = dat;
663 }
664 res->data.ptr = chu->ptr;
665 break;
666 }
667
668 res->chunknum = chunknum;
669 res->length = chu->len;
670
671 return bb_err_None;
672 } /* bb_load_chunk_by_number */
673
674
675 bb_err_t bb_load_resource(bb_map_t * map, int method, bb_result_t * res,
676 uint32 usage, int resnum)
677 {
678 bb_resdesc_t sample;
679 bb_resdesc_t *ptr;
680 bb_resdesc_t **found;
681
682 sample.usage = usage;
683 sample.resnum = resnum;
684 ptr = &sample;
685
686 found =
687 bsearch(&ptr, map->ressorted, map->numresources,
688 sizeof(bb_resdesc_t *), &sortsplot);
689
690 if (!found)
691 return bb_err_NotFound;
692
693 return bb_load_chunk_by_number(map, method, res, (*found)->chunknum);
694 } /* bb_load_resource */
695
696
697 bb_err_t bb_unload_chunk(bb_map_t * map, int chunknum)
698 {
699 bb_chunkdesc_t *chu;
700
701 if (chunknum < 0 || chunknum >= map->numchunks)
702 return bb_err_NotFound;
703
704 chu = &(map->chunks[chunknum]);
705
706 if (chu->ptr) {
707 free(chu->ptr);
708 chu->ptr = NULL;
709 }
710
711 return bb_err_None;
712 } /* bb_unload_chunk */
713
714
715 bb_err_t bb_count_resources(bb_map_t * map, uint32 usage,
716 int *num, int *min, int *max)
717 {
718 int ix;
719 int count, minval, maxval, val;
720
721 count = 0;
722 minval = 0;
723 maxval = 0;
724
725 for (ix = 0; ix < map->numresources; ix++) {
726 if (map->resources[ix].usage == usage) {
727 val = map->resources[ix].resnum;
728 if (count == 0) {
729 count++;
730 minval = val;
731 maxval = val;
732 } else {
733 count++;
734 if (val < minval)
735 minval = val;
736 if (val > maxval)
737 maxval = val;
738 }
739 }
740 }
741
742 if (num)
743 *num = count;
744 if (min)
745 *min = minval;
746 if (max)
747 *max = maxval;
748
749 return bb_err_None;
750 } /* bb_cont_resources */
751
752
753 uint16 bb_get_release_num(bb_map_t * map)
754 {
755 return map->releasenum;
756 }
757
758
759 bb_zheader_t *bb_get_zheader(bb_map_t * map)
760 {
761 return map->zheader;
762 }
763
764
765 bb_resolution_t *bb_get_resolution(bb_map_t * map)
766 {
767 return map->resolution;
768 }
769
770
771 bb_err_t bb_get_palette(bb_map_t * map, bb_palette_t ** res)
772 {
773 int ix;
774 bb_err_t err;
775
776 if (res)
777 *res = NULL;
778
779 if (map->palettechunk < 0) {
780 return bb_err_None;
781 }
782
783 if (!map->palette) {
784 bb_result_t chunkres;
785 bb_palette_t *pal;
786 unsigned char *ptr;
787
788 pal = (bb_palette_t *) malloc(sizeof(bb_palette_t));
789 if (!pal)
790 return bb_err_Alloc;
791
792 err = bb_load_chunk_by_number(map, bb_method_Memory, &chunkres,
793 map->palettechunk);
794 if (err)
795 return err;
796
797 ptr = chunkres.data.ptr;
798
799 if (chunkres.length == 1) {
800 int val = ptr[0];
801 if (val != 16 && val != 32)
802 return bb_err_Format;
803 pal->isdirect = TRUE;
804 pal->data.depth = val;
805 } else {
806 int size = chunkres.length / 3;
807 bb_color_t *colors =
808 (bb_color_t *) malloc(size * sizeof(bb_color_t));
809 if (!colors)
810 return bb_err_Alloc;
811 if (size < 1 || size > 256)
812 return bb_err_Format;
813 for (ix = 0; ix < size; ix++) {
814 colors[ix].red = ptr[ix * 3 + 0];
815 colors[ix].green = ptr[ix * 3 + 1];
816 colors[ix].blue = ptr[ix * 3 + 2];
817 }
818 pal->isdirect = FALSE;
819 pal->data.table.numcolors = size;
820 pal->data.table.colors = colors;
821 }
822
823 bb_unload_chunk(map, map->palettechunk);
824 map->palette = pal;
825 }
826
827 if (res)
828 *res = map->palette;
829 return bb_err_None;
830 } /* bb_get_palette */
831
832
833 bb_err_t bb_load_resource_pict(bb_map_t * map, int method, bb_result_t * res,
834 int resnum, bb_aux_pict_t ** auxdata)
835 {
836 bb_err_t err;
837
838 if (auxdata)
839 *auxdata = NULL;
840
841 err = bb_load_resource(map, method, res, bb_ID_Pict, resnum);
842 if (err)
843 return err;
844
845 if (auxdata) {
846 bb_chunkdesc_t *chu = &(map->chunks[res->chunknum]);
847 if (chu->auxdatnum >= 0 && map->auxpict) {
848 *auxdata = &(map->auxpict[chu->auxdatnum]);
849 }
850 }
851
852 return bb_err_None;
853 } /* bb_load_resource_pict */
854
855
856 bb_err_t bb_load_resource_snd(bb_map_t * map, int method, bb_result_t * res,
857 int resnum, bb_aux_sound_t ** auxdata)
858 {
859 bb_err_t err;
860
861 if (auxdata)
862 *auxdata = NULL;
863
864 /* err = bb_load_resource(map, method, res, bb_ID_Pict, resnum); */
865 err = bb_load_resource(map, method, res, bb_ID_Snd, resnum);
866 if (err)
867 return err;
868
869 if (auxdata) {
870 bb_chunkdesc_t *chu = &(map->chunks[res->chunknum]);
871 if (chu->auxdatnum >= 0 && map->auxsound) {
872 *auxdata = &(map->auxsound[chu->auxdatnum]);
873 }
874 }
875
876 return bb_err_None;
877 } /* bb_load_resource_snd */
878
879 #endif /* NO_BLORB */
+0
-29
src/dos/bcblorb.h less more
0 #ifndef DOS_BCBLORB_H
1 #define DOS_BCBLORB_H
2
3 #include "blorb.h"
4 #include "blorblow.h"
5
6
7 typedef struct sampledata_struct {
8 unsigned short channels;
9 unsigned long samples;
10 unsigned short bits;
11 double rate;
12 } sampledata_t;
13
14
15 bb_err_t blorb_err;
16 bb_map_t *blorb_map;
17 bb_result_t blorb_res;
18
19
20 /* uint32 *findchunk(uint32 *data, char *chunkID, int length); */
21 char *findchunk(char *pstart, char *fourcc, int n);
22 unsigned short ReadShort(const unsigned char *bytes);
23 unsigned long ReadLong(const unsigned char *bytes);
24 double ReadExtended(const unsigned char *bytes);
25
26 #define UnsignedToFloat(u) (((double)((long)(u - 2147483647L - 1))) + 2147483648.0)
27
28 #endif
+0
-105
src/dos/bcfrotz.h less more
0 /*
1 * bcfrotz.h
2 *
3 * DOS interface, declarations, definitions, and defaults.
4 *
5 */
6
7 #ifndef DOS_BCFROTZ_H
8 #define DOS_BCFROTZ_H
9
10 #define MASK_LINEAR(addr) (addr & 0x000FFFFF)
11 #define RM_TO_LINEAR(addr) (((addr & 0xFFFF0000) >> 12) + (addr & 0xFFFF))
12 #define RM_OFFSET(addr) (addr & 0xF)
13 #define RM_SEGMENT(addr) ((addr >> 4) & 0xFFFF)
14
15 #define OS_PATHSEP ';'
16
17 #define byte0(v) ((byte *)&v)[0]
18 #define byte1(v) ((byte *)&v)[1]
19 #define byte2(v) ((byte *)&v)[2]
20 #define byte3(v) ((byte *)&v)[3]
21 #define word0(v) ((word *)&v)[0]
22 #define word1(v) ((word *)&v)[1]
23
24 #ifndef HISTORY_MIN_ENTRY
25 #define HISTORY_MIN_ENTRY 1
26 #endif
27
28 #define SPECIAL_KEY_MIN 256
29 #define SPECIAL_KEY_HOME 256
30 #define SPECIAL_KEY_END 257
31 #define SPECIAL_KEY_WORD_LEFT 258
32 #define SPECIAL_KEY_WORD_RIGHT 259
33 #define SPECIAL_KEY_DELETE 260
34 #define SPECIAL_KEY_INSERT 261
35 #define SPECIAL_KEY_PAGE_UP 262
36 #define SPECIAL_KEY_PAGE_DOWN 263
37 #define SPECIAL_KEY_TAB 264
38 #define SPECIAL_KEY_MAX 264
39
40 #define _MONO_ 0
41 #define _TEXT_ 1
42 #define _CGA_ 2
43 #define _MCGA_ 3
44 #define _EGA_ 4
45 #define _AMIGA_ 5
46
47 typedef unsigned char byte;
48 typedef unsigned short word;
49
50 extern display;
51
52 extern cursor_x;
53 extern cursor_y;
54
55 extern char latin1_to_ibm[];
56 extern char latin1_to_ascii[];
57
58 extern byte text_bg;
59 extern byte text_fg;
60
61 extern byte scrn_attr;
62
63 extern user_background;
64 extern user_foreground;
65 extern user_emphasis;
66 extern user_reverse_bg;
67 extern user_reverse_fg;
68 extern user_screen_height;
69 extern user_screen_width;
70 extern user_tandy_bit;
71 extern user_bold_typing;
72 extern user_random_seed;
73 extern user_font;
74
75 extern char stripped_story_name[];
76 extern char *prog_name;
77
78 extern current_bg;
79 extern current_fg;
80 extern current_style;
81 extern current_font;
82
83 extern scaler;
84
85 #ifdef SOUND_SUPPORT
86 extern volatile int end_of_sound_flag;
87 #endif
88
89 /* BCinit */ int dectoi (const char *);
90 /* BCinit */ int hextoi (const char *);
91 /* BCmouse */ bool detect_mouse (void);
92 /* BCmouse */ int read_mouse (void);
93 /* BCpic */ bool init_pictures (void);
94 /* BCpic */ void reset_pictures (void);
95
96 #ifdef SOUND_SUPPORT
97 /* BCsmpl */ bool dos_init_sound (void);
98 /* BCsmpl */ void dos_reset_sound (void);
99 /* BCinput */ void end_of_sound(void);
100 #endif
101 /* BCtext */ void switch_scrn_attr (bool);
102 /* BCtext */ void load_fonts (void);
103
104 #endif
+0
-6
src/dos/bchash.h less more
0 #ifndef BCHASH_H
1 #define BCHASH_H
2 #define GIT_HASH "85a3a98dcbae0ee5aa036686a13b1088f7d6de17"
3 #define GIT_HASH_SHORT "85a3a98"
4 #define GIT_DATE "2021-02-27 16:50:16 -0800"
5 #endif
+0
-1019
src/dos/bcinit.c less more
0 /*
1 * bcinit.c - DOS interface, initialization
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <conio.h>
22 #include <dos.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include "frotz.h"
27 #include "bcfrotz.h"
28
29 #ifndef NO_BLORB
30 #include "bcblorb.h"
31 #endif
32
33 #include "bchash.h"
34
35 extern f_setup_t f_setup;
36 extern z_header_t z_header;
37
38 static char information[] =
39 "An interpreter for all Infocom and other Z-Machine games.\n"
40 "Complies with standard 1.0 of Graham Nelson's specification.\n"
41 "\n"
42 "Syntax: frotz [options] story-file\n"
43 " -a watch attribute setting \t -O watch object locating\n"
44 " -A watch attribute testing \t -p alter piracy opcode\n"
45 " -b # background colour \t -r # right margin\n"
46 " -B # reverse background colour \t -R <path> restricted read/write\n"
47 " -c # context lines \t -s # random number seed value\n"
48 " -d # display mode (see below) \t -S # transcript width\n"
49 " -e # emphasis colour [mode 1] \t -t set Tandy bit\n"
50 " -f # foreground colour \t -T bold typing [modes 2+4+5]\n"
51 " -F # reverse foreground colour \t -u # slots for multiple undo\n"
52 " -g # font [mode 5] (see below) \t -v show version information\n"
53 " -h # screen height \t -w # screen width\n"
54 " -i ignore runtime errors \t -x expand abbreviations g/x/z\n"
55 " -l # left margin \t -Z # error checking (see below)\n"
56 " -o watch object movement\n"
57 "\n"
58 "Fonts: 0 fixed, 1 sans serif, 2 comic, 3 times, 4 serif.\n"
59 "Display modes: 0 mono, 1 text, 2 CGA, 3 MCGA, 4 EGA, 5 Amiga.\n"
60 "Error reporting: 0 none, 1 first only (default), 2 all, 3 exit after any error.";
61
62 /* in bcinit.c only. What is its significance? */
63 extern unsigned cdecl _heaplen = 0x800 + 4 * BUFSIZ;
64 extern unsigned cdecl _stklen = 0x800;
65
66 extern int zoptind;
67
68 static const char *progname = NULL;
69
70 extern char script_name[];
71 extern char command_name[];
72 extern char save_name[];
73 extern char auxilary_name[];
74
75 int display = -1;
76
77 int user_background = -1;
78 int user_foreground = -1;
79 int user_emphasis = -1;
80 int user_bold_typing = -1;
81 int user_reverse_bg = -1;
82 int user_reverse_fg = -1;
83 int user_screen_height = -1;
84 int user_screen_width = -1;
85 int user_tandy_bit = -1;
86 int user_random_seed = -1;
87 int user_font = 1;
88
89 /* Blorb-related things */
90 #ifndef NO_BLORB
91 char *blorb_name;
92 char *blorb_file;
93 bool use_blorb;
94 bool exec_in_blorb;
95 #endif
96
97 static byte old_video_mode = 0;
98
99 static void interrupt(*oldvect) () = NULL;
100
101 bool at_keybrd;
102
103 /* Test for the existance of Enhanced AT keyboard support in BIOS */
104 static bool test_enhanced_keyboard(unsigned char b)
105 {
106 union REGS regs;
107 unsigned char far *shift_status;
108 shift_status = MK_FP(0, 0x417);
109 shift_status[0] = b;
110 regs.h.ah = 0x12;
111 int86(0x16, &regs, &regs);
112 return b == regs.h.al;
113 }
114
115 /*
116 * os_init_setup
117 *
118 * Set or reset various configuration variables.
119 *
120 */
121 void os_init_setup(void)
122 {
123 f_setup.attribute_assignment = 0;
124 f_setup.attribute_testing = 0;
125 f_setup.context_lines = 0;
126 f_setup.object_locating = 0;
127 f_setup.object_movement = 0;
128 f_setup.left_margin = 0;
129 f_setup.right_margin = 0;
130 f_setup.ignore_errors = 0;
131 f_setup.piracy = 0;
132 f_setup.undo_slots = MAX_UNDO_SLOTS;
133 f_setup.expand_abbreviations = 0;
134 f_setup.script_cols = 80;
135 f_setup.sound = 1;
136 f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE;
137 f_setup.restore_mode = 0;
138
139 at_keybrd = (test_enhanced_keyboard(0x40) && test_enhanced_keyboard(0x80));
140 test_enhanced_keyboard(0x00);
141 } /* os_init_setup */
142
143
144 /*
145 * dectoi
146 *
147 * Convert a string containing a decimal number to integer. The string may
148 * be NULL, but it must not be empty.
149 *
150 */
151 int dectoi(const char *s)
152 {
153 int n = 0;
154
155 if (s != NULL) {
156 do {
157 n = 10 * n + (*s & 15);
158 } while (*++s > ' ');
159 }
160 return n;
161 } /* dectoi */
162
163
164 /*
165 * hextoi
166 *
167 * Convert a string containing a hex number to integer. The string may be
168 * NULL, but it must not be empty.
169 *
170 */
171 int hextoi(const char *s)
172 {
173 int n = 0;
174
175 if (s != NULL) {
176 do {
177
178 n = 16 * n + (*s & 15);
179
180 if (*s > '9')
181 n += 9;
182
183 } while (*++s > ' ');
184 }
185 return n;
186 } /* hextoi */
187
188
189 /*
190 * basename
191 *
192 * A generic and spartan bit of code to extract the filename from a path.
193 * This one is so trivial that it's okay to steal.
194 */
195 char *basename(const char *path)
196 {
197 const char *s;
198 const char *p;
199 p = s = path;
200
201 while (*s) {
202 if (*s++ == '\\') {
203 p = s;
204 }
205 }
206 return (char *)p;
207 } /* basename */
208
209
210 /*
211 * cleanup
212 *
213 * Shut down the IO interface: free memory, close files, restore
214 * interrupt pointers and return to the previous video mode.
215 *
216 */
217 static void cleanup(void)
218 {
219 #ifdef SOUND_SUPPORT
220 dos_reset_sound();
221 #endif
222 reset_pictures();
223
224 asm mov ah, 0
225 asm mov al, old_video_mode
226 asm int 0x10
227
228 setvect(0x1b, oldvect);
229 } /* cleanup */
230
231
232 /*
233 * fast_exit
234 *
235 * Handler routine to be called when the crtl-break key is pressed.
236 *
237 */
238 static void interrupt fast_exit()
239 {
240 cleanup();
241 exit(EXIT_FAILURE);
242 } /* fast_exit */
243
244
245 /*
246 * os_quit
247 *
248 * Immediately and cleanly exit, passing along exit status.
249 *
250 */
251
252 void os_quit(int status)
253 {
254 cleanup();
255 exit(status);
256 }
257
258 /*
259 * os_fatal
260 *
261 * Display error message and exit program.
262 *
263 */
264 void os_fatal(const char *s, ...)
265 {
266 if (z_header.interpreter_number)
267 os_reset_screen();
268
269 /* Display error message */
270 fputs("\nFatal error: ", stderr);
271 fputs(s, stderr);
272 fputs("\n", stderr);
273
274 /* Abort program */
275 exit(EXIT_FAILURE);
276 } /* os_fatal */
277
278
279 /*
280 * parse_options
281 *
282 * Parse program options and set global flags accordingly.
283 *
284 */
285 static void parse_options(int argc, char **argv)
286 {
287 int c;
288
289 do {
290 int num = 0;
291
292 c = zgetopt(argc, argv,
293 "aAb:B:c:d:e:f:F:g:h:il:oOpr:R:s:S:tTu:vw:xZ:");
294
295 if (zoptarg != NULL)
296 num = dectoi(zoptarg);
297
298 if (c == 'a')
299 f_setup.attribute_assignment = 1;
300 if (c == 'A')
301 f_setup.attribute_testing = 1;
302 if (c == 'b')
303 user_background = num;
304 if (c == 'B')
305 user_reverse_bg = num;
306 if (c == 'c')
307 f_setup.context_lines = num;
308 if (c == 'd') {
309 display = zoptarg[0] | 32;
310 if ((display < '0' || display > '5')
311 && (display < 'a' || display > 'e')) {
312 display = -1;
313 }
314 }
315 if (c == 'e')
316 user_emphasis = num;
317 if (c == 'T')
318 user_bold_typing = 1;
319 if (c == 'f')
320 user_foreground = num;
321 if (c == 'F')
322 user_reverse_fg = num;
323 if (c == 'g') {
324 if (num >= 0 && num <= 4)
325 user_font = num;
326 }
327 if (c == 'h')
328 user_screen_height = num;
329 if (c == 'i')
330 f_setup.ignore_errors = 1;
331 if (c == 'l')
332 f_setup.left_margin = num;
333 if (c == 'o')
334 f_setup.object_movement = 1;
335 if (c == 'O')
336 f_setup.object_locating = 1;
337 if (c == 'p')
338 f_setup.piracy = 1;
339 if (c == 'r')
340 f_setup.right_margin = num;
341 if (c == 'R')
342 f_setup.restricted_path = strdup(zoptarg);
343 if (c == 's')
344 user_random_seed = num;
345 if (c == 'S')
346 f_setup.script_cols = num;
347 if (c == 't')
348 user_tandy_bit = 1;
349 if (c == 'u')
350 f_setup.undo_slots = num;
351 if (c == 'v') {
352 printf("FROTZ V%s - MSDOS / PCDOS Edition\n", VERSION);
353 printf("Commit date: %s\n", GIT_DATE);
354 printf("Git commit: %s\n", GIT_HASH);
355 printf("Notes: %s\n", RELEASE_NOTES);
356 printf(" Frotz was originally written by Stefan Jokisch.\n");
357 printf(" It complies with standard 1.0 of Graham Nelson's specification.\n");
358 printf(" It was ported to Unix by Galen Hazelwood.\n");
359 printf(" The core and DOS port are maintained by David Griffith.\n");
360 printf(" Frotz's homepage is https://661.org/proj/if/frotz/\n");
361 exit(0);
362 }
363 if (c == 'w')
364 user_screen_width = num;
365 if (c == 'x')
366 f_setup.expand_abbreviations = 1;
367 if (c == 'Z') {
368 if (num >= ERR_REPORT_NEVER && num <= ERR_REPORT_FATAL)
369 f_setup.err_report_mode = num;
370 }
371 if (c == '?')
372 zoptind = argc;
373 } while (c != EOF && c != '?');
374
375 } /* parse_options */
376
377 static char *malloc_filename(char *story_name, char *extension)
378 {
379 int length = strlen(story_name) + strlen(extension) + 2;
380 char *filename = malloc(length);
381 if (filename) {
382 strcpy(filename, story_name);
383 strcat(filename, ".");
384 strcat(filename, extension);
385 }
386 return filename;
387 }
388
389 /*
390 * os_process_arguments
391 *
392 * Handle command line switches. Some variables may be set to activate
393 * special features of Frotz:
394 *
395 * option_attribute_assignment
396 * option_attribute_testing
397 * option_context_lines
398 * option_object_locating
399 * option_object_movement
400 * option_left_margin
401 * option_right_margin
402 * option_ignore_errors
403 * option_piracy
404 * option_undo_slots
405 * option_expand_abbreviations
406 * option_script_cols
407 *
408 * The global pointer "story_name" is set to the story file name.
409 *
410 */
411 void os_process_arguments(int argc, char *argv[])
412 {
413 const char *p;
414 int i;
415 char stripped_story_name[10];
416
417 /* Parse command line options */
418 parse_options(argc, argv);
419
420 if (zoptind != argc - 1) {
421 printf("FROTZ V%s - MSDOS / PCDOS Edition. ", VERSION);
422 #ifndef NO_SOUND
423 printf("Audio output enabled.\n");
424 #else
425 printf("Audio output disabled.\n");
426 #endif
427 puts(information);
428 exit(EXIT_SUCCESS);
429 }
430
431 /* Set the story file name */
432 f_setup.story_file = strdup(argv[zoptind]);
433
434 /* Strip path and extension off the story file name */
435 p = strdup(f_setup.story_file);
436
437 for (i = 0; f_setup.story_file[i] != 0; i++)
438 if (f_setup.story_file[i] == '\\'
439 || f_setup.story_file[i] == '/'
440 || f_setup.story_file[i] == ':')
441 p = f_setup.story_file + i + 1;
442
443 for (i = 0; p[i] != 0 && p[i] != '.'; i++)
444 stripped_story_name[i] = p[i];
445 stripped_story_name[i] = 0;
446 f_setup.story_name = strdup(stripped_story_name);
447
448 /* Create nice default file names */
449 f_setup.script_name = malloc_filename(f_setup.story_name, "scr");
450 f_setup.command_name = malloc_filename(f_setup.story_name, "rec");
451 f_setup.save_name = malloc_filename(f_setup.story_name, "sav");
452 f_setup.aux_name = malloc_filename(f_setup.story_name, "aux");
453
454 /* Save the executable file name */
455 progname = argv[0];
456
457 #ifndef NO_BLORB
458 blorb_file = malloc_filename(f_setup.story_name, "blb");
459
460 switch (dos_init_blorb()) {
461 case bb_err_Format:
462 printf("Blorb file loaded, but unable to build map.\n\n");
463 break;
464 default:
465 break;
466 /* No problem. Don't say anything. */
467 /* printf("Blorb error code %i\n\n"); */
468 }
469 #endif
470 } /* os_process_arguments */
471
472
473 /*
474 * standard_palette
475 *
476 * Set palette registers to EGA default values and call VGA BIOS to
477 * use DAC registers #0 to #63.
478 *
479 */
480 static void standard_palette(void)
481 {
482
483 static byte palette[] = {
484 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
485 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
486 0x00 /* last one is the overscan register */
487 };
488
489 if (display == _AMIGA_) {
490 asm mov ax, 0x1002
491 asm lea dx, palette
492 asm push ds
493 asm pop es
494 asm int 0x10
495 asm mov ax, 0x1013
496 asm mov bx, 0x0001
497 asm int 0x10
498 }
499 } /* standard_palette */
500
501
502 /*
503 * special_palette
504 *
505 * Set palette register #i to value i and call VGA BIOS to use DAC
506 * registers #64 to #127.
507 *
508 */ static void special_palette(void)
509 {
510
511 static byte palette[] = {
512 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
513 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
514 0x00 /* last one is the overscan register */
515 };
516
517 if (display == _AMIGA_) {
518 asm mov ax, 0x1002
519 asm mov dx, offset palette
520 asm push ds
521 asm pop es
522 asm int 0x10
523 asm mov ax, 0x1013
524 asm mov bx, 0x0101
525 asm int 0x10
526 }
527 } /* special_palette */
528
529
530 /*
531 * os_init_screen
532 *
533 * Initialise the IO interface. Prepare the screen and other devices
534 * (mouse, sound board). Set various OS depending story file header
535 * entries:
536 *
537 * z_header.config (aka flags 1)
538 * z_header.flags (aka flags 2)
539 * z_header.screen_cols (aka screen width in characters)
540 * z_header.screen_rows (aka screen height in lines)
541 * z_header.screen_width
542 * z_header.screen_height
543 * z_header.font_height (defaults to 1)
544 * z_header.font_width (defaults to 1)
545 * z_header.default_foreground
546 * z_header.default_background
547 * z_header.interpreter_number
548 * z_header.interpreter_version
549 * z_header.user_name (optional; not used by any game)
550 *
551 * Finally, set reserve_mem to the amount of memory (in bytes) that
552 * should not be used for multiple undo and reserved for later use.
553 *
554 */ void os_init_screen(void)
555 {
556 static byte zcolour[] = {
557 BLACK_COLOUR,
558 BLUE_COLOUR,
559 GREEN_COLOUR,
560 CYAN_COLOUR,
561 RED_COLOUR,
562 MAGENTA_COLOUR,
563 BROWN + 16,
564 LIGHTGRAY + 16,
565 GREY_COLOUR,
566 LIGHTBLUE + 16,
567 LIGHTGREEN + 16,
568 LIGHTCYAN + 16,
569 LIGHTRED + 16,
570 LIGHTMAGENTA + 16,
571 YELLOW_COLOUR,
572 WHITE_COLOUR
573 };
574
575 static struct { /* information on modes 0 to 5 */
576 byte vmode;
577 word width;
578 word height;
579 byte font_width;
580 byte font_height;
581 byte fg;
582 byte bg;
583 } info[] = {
584 {0x07, 80, 25, 1, 1, LIGHTGRAY + 16, BLACK_COLOUR}, /* MONO */
585 {0x03, 80, 25, 1, 1, LIGHTGRAY + 16, BLUE_COLOUR}, /* TEXT */
586 {0x06, 640, 200, 8, 8, WHITE_COLOUR, BLACK_COLOUR}, /* CGA */
587 {0x13, 320, 200, 5, 8, WHITE_COLOUR, GREY_COLOUR}, /* MCGA */
588 {0x0e, 640, 200, 8, 8, WHITE_COLOUR, BLUE_COLOUR}, /* EGA */
589 {0x12, 640, 400, 8, 16, WHITE_COLOUR, BLACK_COLOUR} /* AMIGA */
590 };
591
592 static struct { /* information on modes A to E */
593 word vesamode;
594 word width;
595 word height;
596 } subinfo[] = {
597 {0x001, 40, 25},
598 {0x109, 132, 25},
599 {0x10b, 132, 50},
600 {0x108, 80, 60},
601 {0x10c, 132, 60}
602 };
603
604 int subdisplay;
605
606 /* Get the current video mode. This video mode will be selected
607 when the program terminates. It's also useful to auto-detect
608 monochrome boards. */
609 asm mov ah, 15
610 asm int 0x10
611 asm mov old_video_mode, al
612
613 /* If the display mode has not already been set by the user then see
614 if this is a monochrome board. If so, set the display mode to 0.
615 Otherwise check the graphics flag of the story. Select a graphic
616 mode if it is set or if this is a V6 game. Select text mode if it
617 is not. */
618 if (display == -1) {
619 if (old_video_mode == 7)
620 display = '0';
621 else if (z_header.version == V6 || (z_header.flags & GRAPHICS_FLAG))
622 display = '5';
623 else
624 display = '1';
625 }
626
627 /* Activate the desired display mode. All VESA text modes are very
628 similar to the standard text mode; in fact, only here we need to
629 know which VESA mode is used. */
630 if (display >= '0' && display <= '5') {
631 subdisplay = -1;
632 display -= '0';
633 _AL = info[display].vmode;
634 _AH = 0;
635 } else if (display == 'a') {
636 subdisplay = 0;
637 display = 1;
638 _AL = 0x01;
639 _AH = 0;
640 } else if (display >= 'b' && display <= 'e') {
641 subdisplay = display - 'a';
642 display = 1;
643 _BX = subinfo[subdisplay].vesamode;
644 _AX = 0x4f02;
645 }
646
647 geninterrupt(0x10);
648
649 /* Make various preparations */
650 if (display <= _TEXT_) {
651
652 /* Enable bright background colours */
653 asm mov ax, 0x1003
654 asm mov bl, 0
655 asm int 0x10
656 /* Turn off hardware cursor */
657 asm mov ah, 1
658 asm mov cx, 0xffff
659 asm int 0x10
660 } else {
661 load_fonts();
662
663 if (display == _AMIGA_) {
664 scaler = 2;
665
666 /* Use resolution 640 x 400 instead of 640 x 480. BIOS doesn't
667 help us here since this is not a standard resolution. */
668 outportb(0x03c2, 0x63);
669
670 outport(0x03d4, 0x0e11);
671 outport(0x03d4, 0xbf06);
672 outport(0x03d4, 0x1f07);
673 outport(0x03d4, 0x9c10);
674 outport(0x03d4, 0x8f12);
675 outport(0x03d4, 0x9615);
676 outport(0x03d4, 0xb916);
677
678 }
679
680 }
681 #if !defined(__SMALL__) && !defined (__TINY__) && !defined (__MEDIUM__)
682 /* Set the amount of memory to reserve for later use. It takes
683 some memory to open command, script and game files. If Frotz
684 is compiled in a small memory model then memory for opening
685 files is allocated on the "near heap" while other allocations
686 are made on the "far heap", i.e. we need not reserve memory
687 in this case. */ reserve_mem = 4 * BUFSIZ;
688
689 #endif
690
691 /* Amiga emulation under V6 needs special preparation. */
692 if (display == _AMIGA_ && z_header.version == V6) {
693 user_reverse_fg = -1;
694 user_reverse_bg = -1;
695 zcolour[LIGHTGRAY] = LIGHTGREY_COLOUR;
696 zcolour[DARKGRAY] = DARKGREY_COLOUR;
697
698 special_palette();
699 }
700
701 /* Set various bits in the configuration byte. These bits tell
702 the game which features are supported by the interpreter. */
703 if (z_header.version == V3 && user_tandy_bit != -1)
704 z_header.config |= CONFIG_TANDY;
705 if (z_header.version == V3)
706 z_header.config |= CONFIG_SPLITSCREEN;
707 if (z_header.version == V3
708 && (display == _MCGA_ || (display == _AMIGA_ && user_font != 0)))
709 z_header.config |= CONFIG_PROPORTIONAL;
710 if (z_header.version >= V4 && display != _MCGA_
711 && (user_bold_typing != -1 || display <= _TEXT_))
712 z_header.config |= CONFIG_BOLDFACE;
713 if (z_header.version >= V4)
714 z_header.config |= CONFIG_EMPHASIS | CONFIG_FIXED | CONFIG_TIMEDINPUT;
715 if (z_header.version >= V5 && display != _MONO_ && display != _CGA_)
716 z_header.config |= CONFIG_COLOUR;
717 if (z_header.version >= V5 && display >= _CGA_ && init_pictures())
718 z_header.config |= CONFIG_PICTURES;
719
720 /* Handle various game flags. These flags are set if the game wants
721 to use certain features. The flags must be cleared if the feature
722 is not available. */
723 if (z_header.flags & GRAPHICS_FLAG)
724 if (display <= _TEXT_)
725 z_header.flags &= ~GRAPHICS_FLAG;
726 if (z_header.version == V3 && (z_header.flags & OLD_SOUND_FLAG))
727 #ifdef SOUND_SUPPORT
728 if (!dos_init_sound())
729 #endif
730 z_header.flags &= ~OLD_SOUND_FLAG;
731 if (z_header.flags & SOUND_FLAG)
732 #ifdef SOUND_SUPPORT
733 if (!dos_init_sound())
734 #endif
735 z_header.flags &= ~SOUND_FLAG;
736 if (z_header.version >= V5 && (z_header.flags & UNDO_FLAG))
737 if (!f_setup.undo_slots)
738 z_header.flags &= ~UNDO_FLAG;
739 if (z_header.flags & MOUSE_FLAG)
740 if (subdisplay != -1 || !detect_mouse())
741 z_header.flags &= ~MOUSE_FLAG;
742 if (z_header.flags & COLOUR_FLAG)
743 if (display == _MONO_ || display == _CGA_)
744 z_header.flags &= ~COLOUR_FLAG;
745 z_header.flags &= ~MENU_FLAG;
746
747 /* Set the screen dimensions, font size and default colour */
748 z_header.screen_width = info[display].width;
749 z_header.screen_height = info[display].height;
750 z_header.font_height = info[display].font_height;
751 z_header.font_width = info[display].font_width;
752 z_header.default_foreground = info[display].fg;
753 z_header.default_background = info[display].bg;
754
755 if (subdisplay != -1) {
756 z_header.screen_width = subinfo[subdisplay].width;
757 z_header.screen_height = subinfo[subdisplay].height;
758 }
759
760 if (user_screen_width != -1)
761 z_header.screen_width = user_screen_width;
762 if (user_screen_height != -1)
763 z_header.screen_height = user_screen_height;
764
765 z_header.screen_cols = z_header.screen_width / z_header.font_width;
766 z_header.screen_rows = z_header.screen_height / z_header.font_height;
767
768 if (user_foreground != -1)
769 z_header.default_foreground = zcolour[user_foreground];
770 if (user_background != -1)
771 z_header.default_background = zcolour[user_background];
772
773 /* Set the interpreter number (a constant telling the game which
774 operating system it runs on) and the interpreter version. The
775 interpreter number has effect on V6 games and "Beyond Zork". */
776 z_header.interpreter_number = INTERP_MSDOS;
777 z_header.interpreter_version = 'F';
778
779 if (display == _AMIGA_)
780 z_header.interpreter_number = INTERP_AMIGA;
781
782 /* Install the fast_exit routine to handle the ctrl-break key */
783 oldvect = getvect(0x1b);
784 setvect(0x1b, fast_exit);
785 } /* os_init_screen */
786
787
788 /*
789 * os_reset_screen
790 *
791 * Reset the screen before the program stops.
792 *
793 */
794 void os_reset_screen(void)
795 {
796 os_set_font(TEXT_FONT);
797 os_set_text_style(0);
798 os_display_string((zchar *) "[Hit any key to exit.]");
799 os_read_key(0, TRUE);
800
801 cleanup();
802 } /* os_reset_screen */
803
804
805 /*
806 * os_restart_game
807 *
808 * This routine allows the interface to interfere with the process of
809 * restarting a game at various stages:
810 *
811 * RESTART_BEGIN - restart has just begun
812 * RESTART_WPROP_SET - window properties have been initialised
813 * RESTART_END - restart is complete
814 *
815 */
816 void os_restart_game(int stage)
817 {
818 int x, y;
819
820 if (story_id == BEYOND_ZORK) {
821 if (stage == RESTART_BEGIN) {
822 if ((display == _MCGA_ || display == _AMIGA_)
823 && os_picture_data(1, &x, &y)) {
824
825 special_palette();
826
827 asm mov ax, 0x1010
828 asm mov bx, 64
829 asm mov dh, 0
830 asm mov ch, 0
831 asm mov cl, 0
832 asm int 0x10
833 asm mov ax, 0x1010
834 asm mov bx, 79
835 asm mov dh, 0xff
836 asm mov ch, 0xff
837 asm mov cl, 0xff
838 asm int 0x10
839 os_draw_picture(1, 1, 1);
840 os_read_key(0, FALSE);
841
842 standard_palette();
843 }
844 }
845 }
846 } /* os_restart_game */
847
848
849 /*
850 * os_random_seed
851 *
852 * Return an appropriate random seed value in the range from 0 to
853 * 32767, possibly by using the current system time.
854 *
855 */
856 int os_random_seed(void)
857 {
858 if (user_random_seed == -1) {
859 /* Use the time of day as seed value */
860 asm mov ah, 0
861 asm int 0x1a
862
863 return _DX & 0x7fff;
864 } else
865 return user_random_seed;
866 } /* os_random_seed */
867
868
869 /*
870 * os_path_open
871 *
872 * Open a file in the current directory. If this fails then
873 * search the directories in the ZCODE_PATH environment variable,
874 * if it is defined, otherwise search INFOCOM_PATH.
875 *
876 */
877 FILE *os_path_open(const char *name, const char *mode)
878 {
879 FILE *fp;
880 char buf[MAX_FILE_NAME + 1];
881 char *p, *bp, lastch;
882
883 if ((fp = fopen(name, mode)) != NULL)
884 return fp;
885 if ((p = getenv("ZCODE_PATH")) == NULL)
886 p = getenv("INFOCOM_PATH");
887 if (p != NULL) {
888 while (*p) {
889 bp = buf;
890 while (*p && *p != OS_PATHSEP)
891 lastch = *bp++ = *p++;
892 if (lastch != '\\' && lastch != '/')
893 *bp++ = '\\';
894 strcpy(bp, name);
895 if ((fp = fopen(buf, mode)) != NULL)
896 return fp;
897 if (*p)
898 p++;
899 }
900 }
901 return NULL;
902 } /* os_path_open */
903
904
905 /*
906 * os_load_story
907 *
908 * This is different from os_path_open() because we need to see if the
909 * story file is actually a chunk inside a blorb file. Right now we're
910 * looking only at the exact path we're given on the command line.
911 *
912 * Open a file in the current directory. If this fails, then search the
913 * directories in the ZCODE_PATH environmental variable. If that's not
914 * defined, search INFOCOM_PATH.
915 *
916 */
917 FILE *os_load_story(void)
918 {
919 #ifndef NO_BLORB
920 FILE *fp;
921
922 /* Did we build a valid blorb map? */
923 if (exec_in_blorb) {
924 fp = fopen(blorb_file, "rb");
925 fseek(fp, blorb_res.data.startpos, SEEK_SET);
926 } else {
927 fp = fopen(f_setup.story_file, "rb");
928 }
929 return fp;
930 #else
931 return fopen(f_setup.story_file, "rb");
932 #endif
933 }
934
935
936 #ifndef NO_BLORB
937 int dos_init_blorb(void)
938 {
939 FILE *blorbfile;
940
941 /* If the filename given on the command line is the same as our
942 * computed blorb filename, then we will assume the executable
943 * is contained in the blorb file.
944 */
945 if (strncmp((char *)basename(f_setup.story_file),
946 (char *)basename(blorb_file), 55) == 0) {
947 if ((blorbfile = fopen(blorb_file, "rb")) == NULL)
948 return bb_err_Read;
949 /* Under DOS, bb_create_map() returns bb_err_Format */
950 blorb_err = bb_create_map(blorbfile, &blorb_map);
951
952 if (blorb_err != bb_err_None) {
953 return blorb_err;
954 }
955
956 /* Now we need to locate the EXEC chunk within the blorb file
957 * and present it to the rest of the program as a file stream.
958 */
959 blorb_err = bb_load_chunk_by_type(blorb_map, bb_method_FilePos,
960 &blorb_res, bb_ID_ZCOD, 0);
961
962 if (blorb_err == bb_err_None) {
963 exec_in_blorb = 1;
964 use_blorb = 1;
965 }
966 }
967 return 0;
968 }
969 #endif /* NO_BLORB */
970
971
972 /*
973 * Seek into a storyfile, either a standalone file or the
974 * ZCODE chunk of a blorb file
975 */
976 int os_storyfile_seek(FILE * fp, long offset, int whence)
977 {
978 #ifndef NO_BLORB
979 int retval;
980 /* Is this a Blorb file containing Zcode? */
981 if (exec_in_blorb) {
982 switch (whence) {
983 case SEEK_END:
984 retval =
985 fseek(fp,
986 blorb_res.data.startpos + blorb_res.length +
987 offset, SEEK_SET);
988 break;
989 case SEEK_CUR:
990 retval = fseek(fp, offset, SEEK_CUR);
991 break;
992 case SEEK_SET:
993 default:
994 retval =
995 fseek(fp, blorb_res.data.startpos + offset,
996 SEEK_SET);
997 break;
998 }
999 return retval;
1000 }
1001 #endif
1002 return fseek(fp, offset, whence);
1003 }
1004
1005
1006 /*
1007 * Tell the position in a storyfile, either a standalone file
1008 * or the ZCODE chunk of a blorb file
1009 */
1010 int os_storyfile_tell(FILE * fp)
1011 {
1012 #ifndef NO_BLORB
1013 /* Is this a Blorb file containing Zcode? */
1014 if (exec_in_blorb)
1015 return ftell(fp) - blorb_res.data.startpos;
1016 #endif
1017 return ftell(fp);
1018 }
+0
-948
src/dos/bcinput.c less more
0 /*
1 * bcinput.c - DOS interface, input functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <bios.h>
22 #include <string.h>
23 #include <stdio.h>
24 #include "frotz.h"
25 #include "bcfrotz.h"
26
27 #ifndef HISTORY_BUFSIZE
28 #define HISTORY_BUFSIZE 500
29 #endif
30
31 extern bool is_terminator (zchar);
32
33 extern bool read_yes_or_no (const char *);
34 extern void read_string (int, zchar *);
35
36 extern int completion (const zchar *, zchar *);
37
38 extern bool at_keybrd;
39
40 static long limit = 0;
41
42 static struct {
43 zchar buffer[HISTORY_BUFSIZE];
44 int latest;
45 int current;
46 int prefix_len;
47 } history;
48
49 static struct {
50 zchar *buffer;
51 int pos;
52 int length;
53 int max_length;
54 int width;
55 int max_width;
56 } input;
57
58 static bool overwrite = FALSE;
59
60 int end_of_sound_flag;
61
62 /*
63 * swap_colours
64 *
65 * This is a small helper function for switch_cursor. It swaps the
66 * current background and foreground colours.
67 *
68 */
69 static void swap_colours(void)
70 {
71 byte temp;
72
73 temp = text_fg;
74 text_fg = text_bg;
75 text_bg = temp;
76
77 } /* swap_colours */
78
79
80 /*
81 * switch_cursor
82 *
83 * Turn cursor on/off. If there is mouse support then turn the mouse
84 * pointer on/off as well. The cursor should not be moved and the
85 * contents of the screen should not be changed while the cursor is
86 * visible (because of the primitive cursor emulation we use here).
87 *
88 */
89 static void switch_cursor(bool cursor)
90 {
91 if (display <= _TEXT_) {
92 /* Use hardware cursor in text mode */
93 if (display == _MONO_)
94 _CX = overwrite ? 0x080f : 0x0a0b;
95 else
96 _CX = overwrite ? 0x0408 : 0x0506;
97
98 if (!cursor)
99 _CX = 0xffff;
100
101 asm mov ah,2
102 asm mov bh,0
103 asm mov dh,byte ptr cursor_y
104 asm mov dl,byte ptr cursor_x
105 asm int 0x10
106 asm mov ah,1
107 asm int 0x10
108 } else {
109 int saved_x = cursor_x;
110
111 if (cursor)
112 swap_colours();
113
114 if (input.pos < input.length)
115 os_display_char(input.buffer[input.pos]);
116 else
117 os_display_char(' ');
118
119 if (cursor)
120 swap_colours();
121
122 cursor_x = saved_x;
123 }
124 } /* switch_cursor */
125
126
127 /*
128 * get_current_time
129 *
130 * Return the current system time in 1/10 seconds.
131 *
132 */
133 static long get_current_time(void)
134 {
135 long time;
136
137 /* Get the current time of day measured in
138 * 65536 / 1,193,180 = 0.054925493
139 * seconds. Multiply this value with
140 * 959 / 1746 = 0.54925544
141 * to get the current time in 0.1 seconds.
142 */
143 asm mov ah,0
144 asm int 0x1a
145 asm mov word ptr time,dx
146 asm mov word ptr time + 2,cx
147
148 return time * 959 / 1746;
149 } /* get_current_time */
150
151
152 /*
153 * set_timer
154 *
155 * Set a time limit of timeout/10 seconds if timeout is not zero;
156 * otherwise clear the time limit.
157 *
158 */
159 static void set_timer(int timeout)
160 {
161 limit = (timeout != 0) ? get_current_time () + timeout : 0;
162 } /* set_timer */
163
164
165 /*
166 * time_limit_hit
167 *
168 * Return true if a previously set time limit has been exceeded.
169 *
170 */
171 static bool out_of_time(void)
172 {
173 if (limit != 0) {
174 long now = get_current_time ();
175
176 if (now < 1L * 3600 * 10 && limit > 23L * 3600 * 10)
177 now += 24L * 3600 * 10;
178
179 return now >= limit;
180 } else
181 return FALSE;
182
183 } /* out_of_time */
184
185
186 /*
187 * get_key
188 *
189 * Read a keypress or a mouse click. Returns...
190 *
191 * ZC_TIME_OUT = time limit exceeded,
192 * ZC_BACKSPACE = the backspace key,
193 * ZC_RETURN = the return key,
194 * ZC_HKEY_MIN...ZC_HKEY_MAX = a hot key,
195 * ZC_ESCAPE = the escape key,
196 * ZC_ASCII_MIN...ZC_ASCII_MAX = ASCII character,
197 * ZC_ARROW_MIN...ZC_ARROW_MAX = an arrow key,
198 * ZC_FKEY_MIN...ZC_FKEY_MAX = a function key,
199 * ZC_NUMPAD_MIN...ZC_NUMPAD_MAX = a number pad key,
200 * ZC_SINGLE_CLICK = single mouse click,
201 * ZC_DOUBLE_CLICK = double mouse click,
202 * ZC_LATIN1_MIN+1...ZC_LATIN1_MAX = ISO Latin-1 character,
203 * SPECIAL_KEY_MIN...SPECIAL_KEY_MAX = a special editing key.
204 *
205 */
206 static int get_key(bool cursor)
207 {
208 static byte arrow_key_map[] = {0x48, 0x50, 0x4b, 0x4d};
209 static byte special_key_map[] = {0x47, 0x4f, 0x73, 0x74, 0x53,
210 0x52, 0x49, 0x51, 0x0f};
211 static byte hot_key_map[] = {0x13, 0x19, 0x1f, 0x16,
212 0x31, 0x2d, 0x20, 0x23};
213 static byte function_key_map[] = {0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
214 0x41, 0x42, 0x43, 0x44, 0x85, 0x86};
215
216 int key;
217
218 /* Loop until a key was pressed */
219 if (cursor)
220 switch_cursor(TRUE);
221
222 if (z_header.flags & MOUSE_FLAG) {
223 asm mov ax,1
224 asm int 0x33
225 }
226
227 do {
228
229 #ifdef SOUND_SUPPORT
230 if (end_of_sound_flag)
231 end_of_sound();
232 #endif
233
234 if (_bios_keybrd(at_keybrd ? _NKEYBRD_READY : _KEYBRD_READY)) {
235 word code = _bios_keybrd(at_keybrd ? _NKEYBRD_READ : _KEYBRD_READ);
236 byte code0 = code;
237 byte code1 = code >> 8;
238
239 if (code0 != 0 && code0 != 9 && code0 != 0xe0) {
240 key = code0 - '0' + ZC_NUMPAD_MIN;
241 if (key >= ZC_NUMPAD_MIN && key <= ZC_NUMPAD_MAX && code1 >= 0x10)
242 goto exit_loop;
243
244 for (key = ZC_LATIN1_MIN + 1; key <= ZC_LATIN1_MAX; key++) {
245 if (code0 == latin1_to_ibm[key - ZC_LATIN1_MIN])
246 goto exit_loop;
247 }
248 key = code0;
249
250 if (key == ZC_BACKSPACE)
251 goto exit_loop;
252 if (key == ZC_RETURN)
253 goto exit_loop;
254 if (key == ZC_ESCAPE)
255 goto exit_loop;
256 if (key >= ZC_ASCII_MIN && key <= ZC_ASCII_MAX)
257 goto exit_loop;
258 } else {
259 for (key = ZC_ARROW_MIN; key <= ZC_ARROW_MAX; key++) {
260 if (code1 == arrow_key_map[key - ZC_ARROW_MIN])
261 goto exit_loop;
262 }
263
264 for (key = ZC_FKEY_MIN; key <= ZC_FKEY_MAX; key++) {
265 if (code1 == function_key_map[key - ZC_FKEY_MIN])
266 goto exit_loop;
267 }
268
269 for (key = ZC_HKEY_MIN; key <= ZC_HKEY_MAX; key++) {
270 if (code1 == hot_key_map[key - ZC_HKEY_MIN])
271 goto exit_loop;
272 }
273
274 for (key = SPECIAL_KEY_MIN; key <= SPECIAL_KEY_MAX; key++) {
275 if (code1 == special_key_map[key - SPECIAL_KEY_MIN])
276 goto exit_loop;
277 }
278 }
279 } else {
280 int clicks = read_mouse ();
281
282 if (clicks == 1) {
283 key = ZC_SINGLE_CLICK;
284 goto exit_loop;
285 }
286 if (clicks == 2) {
287 key = ZC_DOUBLE_CLICK;
288 goto exit_loop;
289 }
290 }
291
292 key = ZC_TIME_OUT;
293 } while (!out_of_time());
294
295 exit_loop:
296
297 if (z_header.flags & MOUSE_FLAG) {
298 asm mov ax,2
299 asm int 0x33
300 }
301
302 if (cursor)
303 switch_cursor(FALSE);
304
305 return key;
306 } /* get_key */
307
308
309 /*
310 * cursor_left
311 *
312 * Move the cursor one character to the left.
313 *
314 */
315 static void cursor_left(void)
316 {
317 if (input.pos > 0)
318 cursor_x -= os_char_width(input.buffer[--input.pos]);
319 } /* cursor_left */
320
321
322 /*
323 * cursor_right
324 *
325 * Move the cursor one character to the right.
326 *
327 */
328 static void cursor_right(void)
329 {
330 if (input.pos < input.length)
331 cursor_x += os_char_width(input.buffer[input.pos++]);
332 } /* cursor_right */
333
334
335 /*
336 * first_char
337 *
338 * Move the cursor to the beginning of the input line.
339 *
340 */
341 static void first_char(void)
342 {
343 while (input.pos > 0)
344 cursor_left();
345 } /* first_char */
346
347
348 /*
349 * last_char
350 *
351 * Move the cursor to the end of the input line.
352 *
353 */
354 static void last_char(void)
355 {
356 while (input.pos < input.length)
357 cursor_right();
358
359 } /* last_char */
360
361
362 /*
363 * prev_word
364 *
365 * Move the cursor to the start of the previous word.
366 *
367 */
368 static void prev_word(void)
369 {
370 do {
371 cursor_left();
372 if (input.pos == 0)
373 return;
374 } while (input.buffer[input.pos] == ' ' || input.buffer[input.pos - 1] != ' ');
375 } /* prev_word */
376
377
378 /*
379 * next_word
380 *
381 * Move the cursor to the start of the next word.
382 *
383 */
384 static void next_word(void)
385 {
386 do {
387 cursor_right();
388 if (input.pos == input.length)
389 return;
390 } while (input.buffer[input.pos] == ' ' || input.buffer[input.pos - 1] != ' ');
391 } /* next_word */
392
393
394 /*
395 * input_move
396 *
397 * Helper function to move parts of the input buffer:
398 *
399 * newc != 0, oldc == 0: INSERT
400 * newc != 0, oldc != 0: OVERWRITE
401 * newc == 0, oldc != 0: DELETE
402 * newc == 0, oldc == 0: NO OPERATION
403 *
404 */
405 #define H(x) (x ? 1 : 0)
406 static void input_move(zchar newc, zchar oldc)
407 {
408 int newwidth = (newc != 0) ? os_char_width(newc) : 0;
409 int oldwidth = (oldc != 0) ? os_char_width(oldc) : 0;
410
411 zchar *p = input.buffer + input.pos;
412
413 int saved_x = cursor_x;
414
415 int updated_width = input.width + newwidth - oldwidth;
416 int updated_length = input.length + H (newc) - H (oldc);
417
418 if (updated_width > input.max_width)
419 return;
420 if (updated_length > input.max_length)
421 return;
422
423 input.width = updated_width;
424 input.length = updated_length;
425
426 if (oldc != 0 && newc == 0)
427 memmove(p, p + 1, updated_length - input.pos + 1);
428 if (newc != 0 && oldc == 0)
429 memmove(p + 1, p, updated_length - input.pos);
430
431 if (newc != 0)
432 *p = newc;
433
434 os_display_string(p);
435
436 switch_scrn_attr(TRUE);
437
438 if (oldwidth > newwidth) {
439 os_erase_area (
440 cursor_y + 1,
441 cursor_x + 1,
442 cursor_y + z_header.font_height,
443 cursor_x + oldwidth - newwidth,
444 -1);
445 }
446
447 switch_scrn_attr(FALSE);
448
449 cursor_x = saved_x;
450
451 if (newc != 0)
452 cursor_right();
453 } /* input_move */
454
455
456 #undef H(x)
457
458
459 /*
460 * delete_char
461 *
462 * Delete the character below the cursor.
463 *
464 */
465 static void delete_char(void)
466 {
467 input_move (0, input.buffer[input.pos]);
468 } /* delete_char */
469
470
471 /*
472 * delete_left
473 *
474 * Delete the character to the left of the cursor.
475 *
476 */
477 static void delete_left(void)
478 {
479 if (input.pos > 0) {
480 cursor_left();
481 delete_char();
482 }
483 } /* delete_left */
484
485
486 /*
487 * truncate_line
488 *
489 * Truncate the input line to n characters.
490 *
491 */
492 static void truncate_line(int n)
493 {
494 last_char();
495 while (input.length > n)
496 delete_left();
497 } /* truncate_line */
498
499
500 /*
501 * insert_char
502 *
503 * Insert a character into the input buffer.
504 *
505 */
506 static void insert_char(zchar newc)
507 {
508 zchar oldc = 0;
509
510 if (overwrite)
511 oldc = input.buffer[input.pos];
512
513 input_move(newc, oldc);
514 } /* insert_char */
515
516
517 /*
518 * insert_string
519 *
520 * Add a string of characters to the input line.
521 *
522 */
523 static void insert_string(const zchar *s)
524 {
525 while (*s != 0) {
526 if (input.length + 1 > input.max_length)
527 break;
528 if (input.width + os_char_width (*s) > input.max_width)
529 break;
530 insert_char (*s++);
531 }
532 } /* insert_string */
533
534
535 /*
536 * tabulator_key
537 *
538 * Complete the word at the end of the input line, if possible.
539 *
540 */
541 static void tabulator_key(void)
542 {
543 int status;
544
545 if (input.pos == input.length) {
546 zchar extension[10];
547
548 status = completion(input.buffer, extension);
549 insert_string(extension);
550 } else
551 status = 2;
552
553 /* Beep if the completion was impossible or ambiguous */
554 if (status != 0)
555 os_beep(status);
556 } /* tabulator_key */
557
558
559 /*
560 * store_input
561 *
562 * Copy the current input line to the history buffer.
563 *
564 */
565 static void store_input(void)
566 {
567 if (input.length >= HISTORY_MIN_ENTRY) {
568
569 const zchar *ptr = input.buffer;
570
571 do {
572 if (history.latest++ == HISTORY_BUFSIZE - 1)
573 history.latest = 0;
574
575 history.buffer[history.latest] = *ptr;
576
577 } while (*ptr++ != 0);
578 }
579 } /* store_input */
580
581
582 /*
583 * fetch_entry
584 *
585 * Copy the current history entry to the input buffer and check if it
586 * matches the prefix in the input buffer.
587 *
588 */
589 static bool fetch_entry(zchar *buf, int entry)
590 {
591 int i = 0;
592 zchar c;
593
594 do {
595 if (entry++ == HISTORY_BUFSIZE - 1)
596 entry = 0;
597
598 c = history.buffer[entry];
599
600 if (i < history.prefix_len && input.buffer[i] != c)
601 return FALSE;
602
603 buf[i++] = c;
604 } while (c != 0);
605
606 return (i > history.prefix_len) && (i > 1);
607 } /* fetch_entry */
608
609
610 /*
611 * get_prev_entry
612 *
613 * Copy the previous history entry to the input buffer.
614 *
615 */
616 static void get_prev_entry(void)
617 {
618 zchar buf[INPUT_BUFFER_SIZE];
619
620 int i = history.current;
621
622 do {
623 do {
624 if (i-- == 0)
625 i = HISTORY_BUFSIZE - 1;
626
627 if (i == history.latest)
628 return;
629
630 } while (history.buffer[i] != 0);
631
632 } while (!fetch_entry(buf, i));
633
634 truncate_line(history.prefix_len);
635 insert_string(buf + history.prefix_len);
636 history.current = i;
637 } /* get_prev_entry */
638
639
640 /*
641 * get_next_entry
642 *
643 * Copy the next history entry to the input buffer.
644 *
645 */
646 static void get_next_entry(void)
647 {
648 zchar buf[INPUT_BUFFER_SIZE];
649
650 int i = history.current;
651
652 truncate_line(history.prefix_len);
653
654 do {
655 do {
656 if (i == history.latest)
657 return;
658
659 if (i++ == HISTORY_BUFSIZE - 1)
660 i = 0;
661 } while (history.buffer[i] != 0);
662 if (i == history.latest)
663 goto no_further;
664 } while (!fetch_entry (buf, i));
665
666 insert_string(buf + history.prefix_len);
667
668 no_further:
669 history.current = i;
670
671 } /* get_next_entry */
672
673
674 /*
675 * os_read_line
676 *
677 * Read a line of input from the keyboard into a buffer. The buffer
678 * may already be primed with some text. In this case, the "initial"
679 * text is already displayed on the screen. After the input action
680 * is complete, the function returns with the terminating key value.
681 * The length of the input should not exceed "max" characters plus
682 * an extra 0 terminator.
683 *
684 * Terminating keys are the return key (13) and all function keys
685 * (see the Specification of the Z-machine) which are accepted by
686 * the is_terminator function. Mouse clicks behave like function
687 * keys except that the mouse position is stored in global variables
688 * "mouse_x" and "mouse_y" (top left coordinates are (1,1)).
689 *
690 * Furthermore, Frotz introduces some special terminating keys:
691 *
692 * ZC_HKEY_PLAYBACK (Alt-P)
693 * ZC_HKEY_RECORD (Alt-R)
694 * ZC_HKEY_SEED (Alt-S)
695 * ZC_HKEY_UNDO (Alt-U)
696 * ZC_HKEY_RESTART (Alt-N, "new game")
697 * ZC_HKEY_QUIT (Alt-X, "exit game")
698 * ZC_HKEY_DEBUGGING (Alt-D)
699 * ZC_HKEY_HELP (Alt-H)
700 *
701 * If the timeout argument is not zero, the input gets interrupted
702 * after timeout/10 seconds (and the return value is 0).
703 *
704 * The complete input line including the cursor must fit in "width"
705 * screen units.
706 *
707 * The function may be called once again to continue after timeouts,
708 * misplaced mouse clicks or hot keys. In this case the "continued"
709 * flag will be set. This information can be useful if the interface
710 * implements input line history.
711 *
712 * The screen is not scrolled after the return key was pressed. The
713 * cursor is at the end of the input line when the function returns.
714 *
715 * Since Inform 2.2 the helper function "completion" can be called
716 * to implement word completion (similar to tcsh under Unix).
717 *
718 */
719
720 #define new_history_search() \
721 { history.prefix_len = input.pos; history.current = history.latest; }
722
723 zchar os_read_line(int max, zchar *buf, int timeout, int width, int continued)
724 {
725 int key = continued ? 9999 : 0;
726
727 /* Initialise input variables */
728 input.buffer = buf;
729 input.pos = strlen((char *) buf);
730 input.length = strlen((char *) buf);
731 input.max_length = max;
732 input.width = os_string_width(buf);
733 input.max_width = width - os_char_width(' ');
734
735 /* Calculate time limit */
736 set_timer (timeout);
737
738 /* Loop until a terminator is found */
739 do {
740 if (key != 9999)
741 new_history_search();
742
743 /* Get next key from mouse or keyboard */
744 key = get_key (TRUE);
745
746 if (key < ZC_ASCII_MIN || key > ZC_ASCII_MAX && key < ZC_LATIN1_MIN || key > ZC_LATIN1_MAX) {
747 /* Ignore time-outs if the cursor is not at end of the line */
748 if (key == ZC_TIME_OUT && input.pos < input.length)
749 key = 9999;
750
751 /* Backspace, return and escape keys */
752 if (key == ZC_BACKSPACE)
753 delete_left();
754 if (key == ZC_RETURN)
755 store_input();
756 if (key == ZC_ESCAPE)
757 truncate_line(0);
758
759 /* Editing keys */
760 if (cwin == 0) {
761 if (key == ZC_ARROW_UP)
762 get_prev_entry();
763 if (key == ZC_ARROW_DOWN)
764 get_next_entry();
765 if (key == ZC_ARROW_LEFT)
766 cursor_left();
767 if (key == ZC_ARROW_RIGHT)
768 cursor_right();
769 if (key >= ZC_ARROW_MIN && key <= ZC_ARROW_MAX)
770 key = 9999;
771 if (key == SPECIAL_KEY_HOME)
772 first_char();
773 if (key == SPECIAL_KEY_END)
774 last_char();
775 if (key == SPECIAL_KEY_WORD_LEFT)
776 prev_word();
777 if (key == SPECIAL_KEY_WORD_RIGHT)
778 next_word();
779 if (key == SPECIAL_KEY_DELETE)
780 delete_char();
781 if (key == SPECIAL_KEY_INSERT)
782 overwrite = !overwrite;
783 if (key == SPECIAL_KEY_TAB)
784 tabulator_key();
785 }
786 if (key == SPECIAL_KEY_PAGE_UP)
787 key = ZC_ARROW_UP;
788 if (key == SPECIAL_KEY_PAGE_DOWN)
789 key = ZC_ARROW_DOWN;
790 } else
791 insert_char(key);
792 } while (key > 0xff || !is_terminator(key));
793
794 last_char();
795
796 overwrite = FALSE;
797
798 /* Return terminating key */
799 return key;
800 } /* os_read_line */
801
802
803 #undef new_history_search()
804
805 /*
806 * os_read_key
807 *
808 * Read a single character from the keyboard (or a mouse click) and
809 * return it. Input aborts after timeout/10 seconds.
810 *
811 */
812 zchar os_read_key(int timeout, bool cursor)
813 {
814 int key;
815
816 set_timer(timeout);
817
818 do {
819 key = get_key(cursor);
820 } while (key > 0xff);
821
822 return key;
823 } /* os_read_key */
824
825
826 /*
827 * os_read_file_name
828 *
829 * Return the name of a file. Flag can be one of:
830 *
831 * FILE_SAVE - Save game file
832 * FILE_RESTORE - Restore game file
833 * FILE_SCRIPT - Transscript file
834 * FILE_RECORD - Command file for recording
835 * FILE_PLAYBACK - Command file for playback
836 * FILE_SAVE_AUX - Save auxilary ("preferred settings") file
837 * FILE_LOAD_AUX - Load auxilary ("preferred settings") file
838 *
839 * The length of the file name is limited by MAX_FILE_NAME. Ideally
840 * an interpreter should open a file requester to ask for the file
841 * name. If it is unable to do that then this function should call
842 * print_string and read_string to ask for a file name.
843 *
844 */
845
846 char *os_read_file_name (const char *default_name, int flag)
847 {
848 char *extension;
849 FILE *fp;
850 bool terminal;
851 bool result;
852
853 bool saved_replay = istream_replay;
854 bool saved_record = ostream_record;
855
856 int i;
857 char *tempname;
858 char file_name[FILENAME_MAX + 1];
859
860 /* Turn off playback and recording temporarily */
861 istream_replay = FALSE;
862 ostream_record = FALSE;
863
864 /* Select appropriate extension */
865 extension = ".aux";
866
867 if (flag == FILE_SAVE || flag == FILE_RESTORE)
868 extension = ".sav";
869 if (flag == FILE_SCRIPT)
870 extension = ".scr";
871 if (flag == FILE_RECORD || flag == FILE_PLAYBACK)
872 extension = ".rec";
873
874 /* Input file name (reserve four bytes for a file name extension) */
875 print_string("Enter file name (\"");
876 print_string(extension);
877 print_string("\" will be added).\nDefault is \"");
878 print_string(default_name);
879 print_string("\": ");
880
881 read_string(MAX_FILE_NAME - 4, (zchar *) file_name);
882
883 /* Use the default name if nothing was typed */
884 if (file_name[0] == 0)
885 strcpy(file_name, default_name);
886 if (strchr(file_name, '.') == NULL)
887 strcat(file_name, extension);
888
889 /* FIXME: UNTESTED Check if we're restricted to one directory. */
890 if (f_setup.restricted_path != NULL) {
891 for (i = strlen(file_name); i > 0; i--) {
892 if (file_name[i] == PATH_SEPARATOR) {
893 i++;
894 break;
895 }
896 }
897 tempname = strdup(file_name + i);
898 strcpy(file_name, f_setup.restricted_path);
899 if (file_name[strlen(file_name)-1] != PATH_SEPARATOR) {
900 strcat(file_name, "\\");
901 }
902 strcat(file_name, tempname);
903 }
904
905 /* Make sure it is safe to use this file name */
906 result = TRUE;
907
908 /* OK if the file is opened for reading */
909 if (flag != FILE_SAVE && flag != FILE_SAVE_AUX && flag != FILE_RECORD)
910 goto finished;
911
912 /* OK if the file does not exist */
913 if ((fp = fopen(file_name, "rb")) == NULL)
914 goto finished;
915
916 /* OK if this is a pseudo-file (like PRN, CON, NUL) */
917 terminal = fp->flags & _F_TERM;
918
919 fclose(fp);
920
921 if (terminal)
922 goto finished;
923
924 /* OK if user wants to overwrite */
925 result = read_yes_or_no ("Overwrite existing file");
926
927 finished:
928
929 /* Restore state of playback and recording */
930 istream_replay = saved_replay;
931 ostream_record = saved_record;
932
933 if (!result)
934 return NULL;
935
936 return strdup(file_name);
937 } /* os_read_file_name */
938
939
940 /*
941 * Called regularly by the interpreter, at least every few instructions
942 * (only when interpreting: e.g., not when waiting for input).
943 */
944 void os_tick(void)
945 {
946 /* do nothing */
947 }
+0
-79
src/dos/bcmouse.c less more
0 /*
1 * bcmouse.h - DOS interface, mouse support
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <dos.h>
22 #include "frotz.h"
23 #include "bcfrotz.h"
24
25 /*
26 * detect_mouse
27 *
28 * Return true if a mouse driver is present.
29 *
30 */
31 bool detect_mouse(void)
32 {
33 asm xor ax, ax
34 asm int 0x33
35 return _AX;
36 } /* detect_mouse */
37
38
39 /*
40 * read_mouse
41 *
42 * Report any mouse clicks. Return 2 for a double click, 1 for a single
43 * click or 0 if there was no mouse activity at all.
44 *
45 */
46 int read_mouse(void)
47 {
48 int click;
49
50 /* Read the current mouse status */
51 for (click = 0; click < 2; click++) {
52 if (click == 1)
53 delay(222);
54
55 asm mov ax, 6
56 asm xor bx, bx
57 asm int 0x33
58 if (_BX == 0)
59 break;
60
61 mouse_x = _CX;
62 mouse_y = _DX;
63
64 if (display <= _TEXT_) {
65 mouse_x /= 8;
66 mouse_y /= 8;
67 }
68
69 if (display == _MCGA_)
70 mouse_x /= 2;
71
72 mouse_x++;
73 mouse_y++;
74 }
75
76 /* Return single or double click */
77 return click;
78 } /* read_mouse */
+0
-27
src/dos/bcparams.txt less more
0 -a watch attribute setting
1 -A watch attribute testing
2 -b # background colour
3 -B # reverse background colour
4 -c # context lines
5 -d # display mode (see below)
6 -e # emphasis colour [mode 1]
7 -f # foreground colour
8 -F # reverse foreground colour
9 -g # font [mode 5] (see below)
10 -h # screen height
11 -i ignore runtime errors
12 -l # left margin
13 -o watch object movement
14 -O watch object locating
15 -p alter piracy opcode
16 -r # right margin
17 -R <path> restricted read/write
18 -s # random number seed value
19 -S # transcript width
20 -t set Tandy bit
21 -T bold typing [modes 2+4+5]
22 -u # slots for multiple undo
23 -v show version information
24 -w # screen width
25 -x expand abbreviations g/x/z
26 -Z # error checking (see below)
+0
-653
src/dos/bcpic.c less more
0 /*
1 * bcpic.c - DOS interface, picture functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <alloc.h>
22 #include <dos.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include "frotz.h"
26 #include "BCfrotz.h"
27
28 #define PIC_NUMBER 0
29 #define PIC_WIDTH 2
30 #define PIC_HEIGHT 4
31 #define PIC_FLAGS 6
32 #define PIC_DATA 8
33 #define PIC_COLOUR 11
34
35 #define READ_BYTE(v,p,o) v = *(byte far *)(p+o)
36 #define READ_WORD(v,p,o) v = *(word far *)(p+o)
37
38 /* This may be troublesome later */
39 /* extern byte far *get_scrnptr (int); */
40 extern unsigned long get_scrnptr(int);
41
42 extern FILE *os_path_open(const char *, const char *);
43
44 static struct {
45 byte fileno;
46 byte flags;
47 word unused1;
48 word images;
49 word link;
50 byte entry_size;
51 byte padding;
52 word checksum;
53 word unused2;
54 word version;
55 } gheader;
56
57 int scaler = 1;
58
59 static word pic_width = 0;
60 static word pic_height = 0;
61 static word pic_flags = 0;
62 static long pic_data = 0;
63 static long pic_colour = 0;
64
65 static byte far *table_val = NULL;
66 static word far *table_ref = NULL;
67
68 static FILE *file = NULL;
69 static byte far *info = NULL;
70
71
72 /*
73 * open_graphics_file
74 *
75 * Open a graphics file. EGA pictures may be stored in two separate
76 * graphics files.
77 *
78 */
79 static bool open_graphics_file(int number)
80 {
81 char fname[MAX_FILE_NAME + 1];
82 char extension[4 + 1];
83
84 /* Build graphics file name */
85 extension[0] = '.';
86 extension[1] = "cmem"[display - 2];
87 extension[2] = 'g';
88 extension[3] = '0' + number;
89 extension[4] = 0;
90
91 /* Why does DOS not like "graphics\\" anymore? */
92 strcpy(fname, "graphics/");
93 strcat(fname, f_setup.story_name);
94 strcat(fname, extension);
95
96 /* Open file, load header, allocate memory, load picture directory */
97 if ((file = fopen(fname, "rb")) == NULL)
98 goto failure1;
99 if (fread(&gheader, sizeof(gheader), 1, file) != 1)
100 goto failure2;
101 if ((info = farmalloc(gheader.images * gheader.entry_size)) == NULL)
102 goto failure2;
103 if (fread(info, gheader.entry_size, gheader.images, file) !=
104 gheader.images)
105 goto failure3;
106 return TRUE;
107
108 failure3:
109 farfree(info);
110 info = NULL;
111
112 failure2:
113 fclose(file);
114 file = NULL;
115
116 failure1:
117 return FALSE;
118
119 } /* open_graphics_file */
120
121
122 /*
123 * close_graphics_file
124 *
125 * Free resources allocated for pictures.
126 *
127 */
128 static void close_graphics_file(void)
129 {
130 if (file != NULL) {
131 fclose(file);
132 file = NULL;
133 }
134 if (info != NULL) {
135 farfree(info);
136 info = NULL;
137 }
138
139 } /* close_graphics_file */
140
141
142 /*
143 * init_pictures
144 *
145 * Prepare to draw pictures. Return true if pictures are available.
146 *
147 */
148 bool init_pictures(void)
149 {
150
151 /* Allocate memory for decompression */
152 table_val = (byte far *) farmalloc(3 * 3840);
153 table_ref = (word far *) (table_val + 3840);
154
155 if (table_val == NULL)
156 return FALSE;
157
158 /* Open the [first of two] graphics file[s] */
159 return open_graphics_file(1);
160
161 } /* init_pictures */
162
163
164 /*
165 * reset_pictures
166 *
167 * Free resources allocated for decompression of pictures.
168 *
169 */
170 void reset_pictures(void)
171 {
172 if (table_val != NULL) {
173 farfree(table_val);
174 table_val = NULL;
175 }
176 if (file != NULL) {
177 fclose(file);
178 file = NULL;
179 }
180 if (info != NULL) {
181 farfree(info);
182 info = NULL;
183 }
184
185 } /* reset_pictures */
186
187
188 /*
189 * load_picture_info
190 *
191 * Helper function for os_picture_data. Load all information about
192 * the given picture from the graphics file and store it in global
193 * variables.
194 *
195 */
196 static bool load_picture_info(int picture)
197 {
198 byte far *ptr;
199 byte fileno;
200
201 fileno = gheader.fileno;
202
203 do {
204 int i;
205
206 /* Abort if there is a problem with the graphics file */
207 if (file == NULL)
208 return FALSE;
209
210 /* Scan the directory of the current graphics file */
211 ptr = info;
212 for (i = 0; i < gheader.images; i++) {
213 if (picture == *(int far *)ptr) {
214 READ_WORD(pic_width, ptr, PIC_WIDTH);
215 READ_WORD(pic_height, ptr, PIC_HEIGHT);
216 READ_WORD(pic_flags, ptr, PIC_FLAGS);
217
218 pic_height *= scaler;
219 pic_width *= scaler;
220
221 READ_BYTE(byte0(pic_data), ptr, PIC_DATA + 2);
222 READ_BYTE(byte1(pic_data), ptr, PIC_DATA + 1);
223 READ_BYTE(byte2(pic_data), ptr, PIC_DATA);
224
225 if (gheader.entry_size > PIC_COLOUR + 2) {
226 READ_BYTE(byte0(pic_colour), ptr,
227 PIC_COLOUR + 2);
228 READ_BYTE(byte1(pic_colour), ptr,
229 PIC_COLOUR + 1);
230 READ_BYTE(byte2(pic_colour), ptr,
231 PIC_COLOUR);
232 } else
233 pic_colour = 0;
234
235 return TRUE;
236 }
237 ptr += gheader.entry_size;
238 }
239
240 /* Close current graphics file */
241 close_graphics_file();
242
243 /* Open next graphics file */
244 open_graphics_file((gheader.link !=
245 0) ? gheader.fileno + 1 : 1);
246
247 } while (fileno != gheader.fileno);
248
249 return FALSE;
250 } /* load_picture_info */
251
252
253 /*
254 * load_colour_map
255 *
256 * Helper function for os_draw_picture. Load a colour map from the
257 * graphics file then copy it to the palette registers.
258 *
259 */
260 static void load_colour_map(int first_colour)
261 {
262 byte rgb[42];
263 int n, i;
264
265 fseek(file, pic_colour, SEEK_SET);
266
267 /* Some pictures from Arthur mistakenly claim to have 16 colours */
268 if ((n = fgetc(file)) == 16)
269 n = 14;
270
271 /* Each colour is stored in three bytes R-G-B */
272 fread(rgb, 3, n, file);
273
274 /* MCGA boards can only handle R-G-B values from 0 to 63 */
275 for (i = 0; i < 42; i++)
276 rgb[i] = (rgb[i] * 63 + 128) / 255;
277
278 /* Synchronise with vertical retrace */
279 while ((inportb(0x03da) & 8) == 0) ;
280 while ((inportb(0x03da) & 8) == 8) ;
281
282 /* Copy colours to palette registers */
283 asm mov ax, 0x1012
284 asm mov bx, first_colour
285 asm mov cx, n
286 asm lea dx, rgb
287 asm push ss
288 asm pop es
289 asm int 0x10
290 } /* load_colour_map */
291
292
293 /*
294 * draw_picture
295 *
296 * Helper function for os_draw_picture. The real work of drawing a
297 * picture happens here.
298 *
299 */
300 #pragma warn -def
301 static void pascal draw_picture(int y, int x)
302 {
303 static int raise_bits[4] = {
304 0x0100, 0x0300, 0x0700, 0x0000
305 };
306
307 byte buf[512];
308 unsigned long screen;
309 byte transparent;
310 byte colour_shift;
311 int first_colour;
312 int code, prev_code;
313 int next_entry;
314 int bits_per_code;
315 int bits_shift;
316 int bits;
317 int current_y;
318 int current_x;
319 int bufpos;
320 int pixels;
321 int i;
322
323 bufpos = 0;
324
325 /* When the given picture provides a colour map then activate it.
326 This is only used for MCGA pictures; the colour map affects
327 every picture on the screen. The first colour to be defined is
328 colour 2. Every map defines up to 14 colours (colour 2 to 15).
329 These colours are not related to the standard Z-machine colour
330 scheme which remains unchanged. (This is based on the Amiga
331 interpreter which had to work with 16 colours. Colours 0 and 1
332 were used for text; changing the text colours actually changed
333 palette entries 0 and 1. This interface uses the same trick in
334 Amiga mode.) */
335 if (display == _CGA_)
336 colour_shift = -2;
337 if (display == _EGA_)
338 colour_shift = 0;
339 if (display == _MCGA_) {
340 colour_shift = 32;
341 first_colour = 34;
342 }
343 if (display == _AMIGA_) {
344 colour_shift = -1;
345 first_colour = 65;
346 }
347
348 if (pic_colour != 0)
349 load_colour_map(first_colour);
350
351 fseek(file, pic_data, SEEK_SET);
352
353 /* Bit 0 of "flags" indicates that the picture uses a transparent
354 colour, the top four bits tell us which colour it is. For CGA
355 and MCGA pictures this is always 0; for EGA pictures it can be
356 any colour between 0 and 15. */
357 transparent = 0xff;
358
359 if (pic_flags & 1)
360 transparent = pic_flags >> 12;
361
362 /* Prepare EGA hardware for setting pixels */
363 if (display >= _EGA_) {
364 outport(0x03ce, 0x0205);
365 outport(0x03ce, 0xff08);
366 }
367
368 /* The uncompressed picture is a long sequence of bytes. Every
369 byte holds the colour of a pixel, starting at the top left,
370 stopping at the bottom right. We keep track of our position
371 in the current line. (There is a special case: CGA pictures
372 with no transparent colour are stored as bit patterns, i.e.
373 every byte holds the pattern for eight pixels. A pixel must
374 be white if the corresponding bit is set, otherwise it must
375 be black.) */
376 current_x = x + pic_width;
377 current_y = y - 1;
378
379 /* The compressed picture is a stream of bits. We read the file
380 byte-wise, storing the current byte in the variable "bits".
381 Several bits make one code; the variable "bits_shift" helps
382 us to build the next code. */
383 bits_shift = 0;
384 bits = 0;
385
386 reset_table:
387
388 /* Clear the table. We use a table of 3840 entries. Each entry
389 consists of both a value and a reference to another table
390 entry. Following these references we get a sequence of
391 values. At the start of decompression all table entries are
392 undefined. Later we see how entries are set and used. */
393 next_entry = 1;
394
395 /* At the start of decompression 9 bits make one code; during
396 the process this can rise to 12 bits per code. 9 bits are
397 sufficient to address both 256 literal values and 256 table
398 entries; 12 bits are sufficient to address both 256 literal
399 values and all 3840 table entries. The number of bits per
400 code rises with the number of table entries. When the table
401 is cleared, the number of bits per code drops back to 9. */
402 bits_per_code = 9;
403
404 next_code:
405
406 /* Read the next code from the graphics file. This requires
407 some confusing bit operations. Note that low bits always
408 come first. Usually there are a few bits left over from
409 the previous code; these bits must be used before further
410 bits are read from the graphics file. */
411 code = bits >> (8 - bits_shift);
412
413 do {
414 bits = fgetc(file);
415 code |= bits << bits_shift;
416 bits_shift += 8;
417 } while (bits_shift < bits_per_code);
418
419 bits_shift -= bits_per_code;
420 code &= 0xfff >> (12 - bits_per_code);
421
422 /* There are two codes with a special meaning. The first one
423 is 256 which clears the table and sets the number of bits
424 per code to 9. (This is necessary when the table is full.)
425 The second one is 257 which marks the end of the picture.
426 For the sake of efficiency, we decrement the code by 256. */
427 code -= 256;
428
429 if (code == 0)
430 goto reset_table;
431 if (code == 1)
432 return;
433
434 /* Codes from 0 to 255 are literals, i.e. they represent a
435 plain byte value. Codes from 258 onwards are references
436 to table entries, i.e. they represent a sequence of byte
437 values (see the remarks on the table above). This means
438 that for each code one or several byte values are added
439 to the decompressed picture. But there is yet more work
440 to do: Every time we read a code one table entry is set.
441 As we said above, a table entry consist of both a value
442 and a reference to another table entry. If the current
443 code is a literal, then the value has to be set to this
444 literal; but if the code refers to a sequence of byte
445 values, then the value has to be set to the last byte of
446 this sequence. In any case, the reference is set to the
447 previous code. Finally, one should be aware that a code
448 may legally refer to the table entry which is currently
449 being set. This requires some extra care. */
450 table_ref[next_entry] = prev_code;
451
452 prev_code = code;
453
454 while (code >= 0) {
455 buf[bufpos++] = table_val[code];
456 code = (short)table_ref[code];
457 }
458
459 if (next_entry == prev_code)
460 buf[0] = code;
461
462 table_val[next_entry] = code;
463
464 /* The number of bits per code is incremented when the current
465 number of bits no longer suffices to address all defined
466 table entries; but in any case the number of bits may never
467 be greater than 12. */
468 next_entry++;
469
470 if (next_entry == raise_bits[bits_per_code - 9])
471 bits_per_code++;
472
473 reverse_buffer:
474
475 /* Append the sequence of byte values (pixels) to the picture.
476 The order of the sequence must be reversed. (This is why we
477 have stored the sequence in a buffer; experiments show that
478 a buffer of 512 bytes suffices.) The sequence of values may
479 spread over several lines of the picture, so we must take
480 care to start a new line when we reach the right border of
481 the picture. */
482 if (current_x == x + pic_width) {
483 screen = get_scrnptr(current_y);
484 current_x -= pic_width;
485 current_y += scaler;
486 }
487
488 /* Either add a single pixel or a pattern of eight bits (b/w
489 CGA pictures without a transparent colour) to the current
490 line. Increment our position by 1 or 8 respectively. The
491 pixel may have to be painted several times if the scaling
492 factor is greater than one. */
493 if (display == _CGA_ && transparent == 0xff) {
494 pixels = x + pic_width - current_x;
495 if (pixels > 8)
496 pixels = 8;
497
498 asm les bx, screen
499 asm mov dx, current_x
500 asm dec dx
501 asm push dx
502 asm mov cl, 3
503 asm shr dx, cl
504 asm add bx, dx
505 asm mov ax, es:[bx]
506 asm mov dx, 0xffff
507 asm mov cl, byte ptr pixels
508 asm shr dl, cl
509 asm pop cx
510 asm and cl, 7
511 asm ror dx, cl
512 asm and ax, dx
513 asm mov dx, code
514 asm inc dh
515 asm ror dx, cl
516 asm or ax, dx
517 asm mov es:[bx], ax
518
519 current_x += pixels;
520 } else for (i = 0; i < scaler; i++) {
521 _AH = code;
522 if (_AH != transparent) {
523 asm add ah, colour_shift
524 asm les bx, screen
525 asm mov dx, current_x
526 asm dec dx
527 if (display != _MCGA_) {
528 asm push dx
529 asm mov cl, 3
530 asm shr dx, cl
531 asm pop cx
532 asm and cl, 7
533 asm add bx, dx
534 asm mov al, es:[bx]
535 if (display == _CGA_) {
536 asm mov dl, 0x7f
537 asm ror dl, cl
538 asm and al, dl
539 asm xor ah, 1
540 asm ror ah, 1
541 asm shr ah, cl
542 asm or ah, al
543 } else {
544 asm mov al, 0x80
545 asm shr al, cl
546 asm mov dx, 0x03cf
547 asm out dx, al
548 }
549 } else
550 asm add bx, dx
551
552 asm mov es:[bx], ah
553
554 if (display == _AMIGA_) {
555 asm add bx, 80
556 asm mov al, es:[bx]
557 asm mov es:[bx], ah
558 }
559 }
560 current_x++;
561 }
562
563 /* If there are no more values in the buffer then read the
564 next code from the file. Otherwise fetch the next byte
565 value from the buffer and continue painting the picture. */
566 if (bufpos == 0)
567 goto next_code;
568
569 byte0(code) = buf[--bufpos];
570
571 goto reverse_buffer;
572 } /* draw_picture */
573
574 #pragma warn +def
575
576 /*
577 * os_draw_picture
578 *
579 * Display a picture at the given coordinates. Top left is (1,1).
580 *
581 */
582 void os_draw_picture(int picture, int y, int x)
583 {
584 if (load_picture_info(picture))
585 draw_picture(y, x);
586
587 } /* os_draw_picture */
588
589
590 /*
591 * os_peek_colour
592 *
593 * Return the colour of the pixel below the cursor. This is used
594 * by V6 games to print text on top of pictures. The coulor need
595 * not be in the standard set of Z-machine colours. To handle
596 * this situation, Frotz extends the colour scheme: Values above
597 * 15 (and below 256) may be used by the interface to refer to
598 * non-standard colours. Of course, os_set_colour must be able to
599 * deal with these colours. Interfaces which refer to characters
600 * instead of pixels might return the current background colour
601 * instead.
602 *
603 */
604 int os_peek_colour(void)
605 {
606 if (display >= _CGA_) {
607 asm mov ah, 13
608 asm mov bh, 0
609 asm mov cx, cursor_x
610 asm mov dx, cursor_y
611 asm int 0x10
612 asm mov ah, 0
613 return _AX + 16;
614 } else
615 return current_bg;
616 } /* os_peek_colour */
617
618
619 /*
620 * os_picture_data
621 *
622 * Return true if the given picture is available. If so, write the
623 * width and height of the picture into the appropriate variables.
624 * Only when picture 0 is asked for, write the number of available
625 * pictures and the release number instead.
626 *
627 */
628
629 bool os_picture_data(int picture, int *height, int *width)
630 {
631 bool avail;
632
633 if (picture == 0) {
634 avail = FALSE;
635
636 /* This is the special case mentioned above. In practice, only
637 the release number is used; and even this is only used by
638 the DOS version of "Zork Zero". Infocom's Amiga interpreter
639 could not handle this feature, and the Amiga version of the
640 story file does not use it. */
641
642 pic_height = gheader.images;
643 pic_width = gheader.version;
644
645 } else
646 avail = load_picture_info(picture);
647
648 *height = pic_height;
649 *width = pic_width;
650
651 return avail;
652 } /* os_picture_data */
+0
-405
src/dos/bcsample.c less more
0 /*
1 * file "BCsample.c"
2 *
3 * Borland C front end, sound support
4 *
5 */
6
7 #include <alloc.h>
8 #include <dos.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include "frotz.h"
13 #include "BCfrotz.h"
14
15 #ifdef SOUND_SUPPORT
16
17 #define SWAP_BYTES(v) {_AX=v;asm xchg al,ah;v=_AX;}
18
19 #define READ_DSP(v) {while(!inportb(sound_adr+14)&0x80);v=inportb(sound_adr+10);}
20 #define WRITE_DSP(v) {while(inportb(sound_adr+12)&0x80);outportb(sound_adr+12,v);}
21
22 extern void end_of_sound(void);
23
24 static struct {
25 word prefix;
26 byte repeats;
27 byte base_note;
28 word frequency;
29 word unused;
30 word length;
31 } sheader;
32
33 static current_sample = 0;
34
35 static void interrupt(*vect) (void) = NULL;
36
37 static play_part = 0;
38 static play_count = 0;
39
40 static word sound_adr = 0;
41 static word sound_irq = 0;
42 static word sound_dma = 0;
43 static word sound_int = 0;
44 static word sound_ver = 0;
45
46 static byte far *sample_data = NULL;
47
48 static long sample_adr1 = 0;
49 static long sample_adr2 = 0;
50 static word sample_len1 = 0;
51 static word sample_len2 = 0;
52
53 /*
54 * start_of_dma
55 *
56 * Start the DMA transfer to the sound board.
57 *
58 */
59 static void start_of_dma(long address, unsigned length)
60 {
61 static unsigned dma_page_port[] = {
62 0x87, 0x83, 0x81, 0x82
63 };
64
65 length--;
66
67 /* Set up DMA chip */
68 outportb(0x0a, 0x04 | sound_dma);
69 outportb(0x0c, 0x00);
70 outportb(0x0b, 0x48 | sound_dma);
71 outportb(2 * sound_dma, byte0(address));
72 outportb(2 * sound_dma, byte1(address));
73 outportb(dma_page_port[sound_dma], byte2(address));
74 outportb(2 * sound_dma + 1, byte0(length));
75 outportb(2 * sound_dma + 1, byte1(length));
76 outportb(0x0a, sound_dma);
77
78 /* Play 8-bit mono sample */
79 WRITE_DSP(0x14)
80 WRITE_DSP(byte0(length))
81 WRITE_DSP(byte1(length))
82 } /* start_of_dma */
83
84
85 /*
86 * end_of_dma
87 *
88 * This function is called when a hardware interrupt signals the
89 * end of the current sound. We may have to play the second half
90 * of the sound effect, or we may have to repeat it, or call the
91 * end_of_sound function when we are finished.
92 *
93 */
94 static void interrupt end_of_dma(void)
95 {
96 /* Play the second half, play another cycle or finish */
97 if (play_part == 1 && sample_len2 != 0) {
98 play_part = 2;
99 start_of_dma(sample_adr2, sample_len2);
100 } else if (play_count == 255 || --play_count != 0) {
101 play_part = 1;
102 start_of_dma(sample_adr1, sample_len1);
103 } else {
104 play_part = 0;
105 end_of_sound();
106 }
107
108 /* Tell interrupt controller(s) + sound board we are done */
109 outportb(0x20, 0x20);
110
111 if (sound_irq >= 8)
112 outportb(0xa0, 0x20);
113
114 inportb(sound_adr + 14);
115 } /* end_of_dma */
116
117
118 /*
119 * dos_init_sound
120 *
121 * Initialise the sound board and various sound related variables.
122 *
123 */
124 bool dos_init_sound(void)
125 {
126 const char *settings;
127 word irc_mask_port;
128
129 /* Read the IRQ, port address, DMA channel and SB version */
130 if ((settings = getenv("BLASTER")) == NULL)
131 return FALSE;
132
133 sound_irq = dectoi(strchr(settings, 'I') + 1);
134 sound_adr = hextoi(strchr(settings, 'A') + 1);
135 sound_dma = dectoi(strchr(settings, 'D') + 1);
136 sound_ver = dectoi(strchr(settings, 'T') + 1);
137
138 /* Reset mixer chip and DSP */
139 outportb(sound_adr + 4, 0);
140 outportb(sound_adr + 5, 0);
141
142 outportb(sound_adr + 6, 1);
143 inportb(sound_adr + 6);
144 inportb(sound_adr + 6);
145 inportb(sound_adr + 6);
146 outportb(sound_adr + 6, 0);
147
148 /* Turn on speakers */
149 WRITE_DSP(0xd1)
150 /* Install the end_of_dma interrupt */
151 if (sound_irq < 8) {
152 irc_mask_port = 0x21;
153 sound_int = 0x08 + sound_irq;
154 } else {
155 irc_mask_port = 0xa1;
156 sound_int = 0x68 + sound_irq;
157 }
158
159 vect = getvect(sound_int);
160 setvect(sound_int, end_of_dma);
161
162 /* Allocate 64KB RAM for sample data */
163 if ((sample_data = (byte far *) farmalloc(0x10000L)) == NULL)
164 return FALSE;
165
166 word0(sample_adr1) = FP_OFF(sample_data) | (FP_SEG(sample_data) << 4);
167 word1(sample_adr1) = FP_SEG(sample_data) >> 12;
168 word0(sample_adr2) = 0;
169 word1(sample_adr2) = word1(sample_adr1) + 1;
170
171 /* Enable the end_of_dma interrupt */
172 outportb(0x20, 0x20);
173
174 if (sound_irq >= 8)
175 outportb(0xa0, 0x20);
176
177 outportb(irc_mask_port,
178 inportb(irc_mask_port) & ~(1 << (sound_irq & 7)));
179
180 /* Indicate success */
181 return TRUE;
182
183 } /* init_sound */
184
185
186 /*
187 * dos_reset_sound
188 *
189 * Free resources allocated for playing samples.
190 *
191 */
192 void dos_reset_sound(void)
193 {
194 os_stop_sample(0);
195
196 if (sample_data != NULL) {
197 farfree(sample_data);
198 sample_data = NULL;
199 }
200 if (sound_adr != 0) {
201 setvect(sound_int, vect);
202 sound_adr = 0;
203 }
204
205 } /* dos_reset_sound */
206
207 #endif /* SOUND_SUPPORT */
208
209
210 /*
211 * os_beep
212 *
213 * Play a beep sound. Ideally, the sound should be high- (number == 1)
214 * or low-pitched (number == 2).
215 *
216 */
217 void os_beep(int number)
218 {
219 word T = 888 * number;
220
221 outportb(0x43, 0xb6);
222 outportb(0x42, lo(T));
223 outportb(0x42, hi(T));
224 outportb(0x61, inportb(0x61) | 3);
225
226 delay(75);
227
228 outportb(0x61, inportb(0x61) & ~3);
229 } /* os_beep */
230
231 /*
232 * os_init_sound
233 *
234 * Dummy function to satisfy the core code. DOS Frotz does its sound
235 * initialization in bcinit.c in os_init_screen().
236 *
237 * FIXME: Move the sound initlization from os_init_screen() to here and
238 * somehow work around the ifs.
239 *
240 */
241 void os_init_sound(void)
242 {
243 /* do nothing */
244 }
245
246 /*
247 * os_prepare_sample
248 *
249 * Load the sample from the disk.
250 *
251 */
252 void os_prepare_sample(int number)
253 {
254 #ifdef SOUND_SUPPORT
255
256 os_stop_sample(0);
257
258 /* Exit if the sound board isn't set up properly */
259 if (sample_data == NULL)
260 return;
261 if (sound_adr == 0)
262 return;
263
264 /* Continue only if the desired sample is not already present */
265 if (current_sample != number) {
266
267 char sample_name[MAX_FILE_NAME + 1];
268 char numstr[2];
269 FILE *fp;
270
271 /* Build sample file name */
272 strcpy(sample_name, "sound/");
273
274 numstr[0] = '0' + number / 10;
275 numstr[1] = '0' + number % 10;
276
277 strncat(sample_name, f_setup.story_name, 6);
278 strncat(sample_name, numstr, 2);
279 strncat(sample_name, ".snd", 4);
280
281 /* Open sample file */
282 if ((fp = fopen(sample_name, "rb")) == NULL)
283 return;
284
285 /* Load header and sample data */
286 fread(&sheader, sizeof(sheader), 1, fp);
287
288 SWAP_BYTES(sheader.frequency)
289 SWAP_BYTES(sheader.length)
290 fread(sample_data, 1, sheader.length, fp);
291
292 sample_len1 = -word0(sample_adr1);
293
294 if (sample_len1 > sheader.length || sample_len1 == 0)
295 sample_len1 = sheader.length;
296
297 sample_len2 = sheader.length - sample_len1;
298
299 WRITE_DSP(0x40)
300 WRITE_DSP(256 - 1000000L / sheader.frequency)
301 current_sample = number;
302
303 /* Close sample file */
304 fclose(fp);
305
306 }
307 #endif /* SOUND_SUPPORT */
308 } /* os_prepare_sample */
309
310
311 /*
312 * os_start_sample
313 *
314 * Play the given sample at the given volume (ranging from 1 to 8 and
315 * 255 meaning a default volume). The sound is played once or several
316 * times in the background (255 meaning forever). The end_of_sound
317 * function is called as soon as the sound finishes.
318 *
319 */
320 void os_start_sample(int number, int volume, int repeats, zword eos)
321 {
322 #ifdef SOUND_SUPPORT
323 eos = eos; /* not used in DOS Frotz */
324
325 os_stop_sample(0);
326
327 /* Exit if the sound board isn't set up properly */
328 if (sample_data == NULL)
329 return;
330 if (sound_adr == 0)
331 return;
332
333 /* Load new sample */
334 os_prepare_sample(number);
335
336 /* Continue only if the sample's in memory now */
337 if (current_sample == number) {
338 play_count = repeats;
339
340 if (sound_ver < 6) { /* Set up SB pro mixer chip */
341 volume = (volume != 255) ? 7 + volume : 15;
342 outportb(sound_adr + 4, 0x04);
343 outportb(sound_adr + 5, (volume << 4) | volume);
344 outportb(sound_adr + 4, 0x22);
345 outportb(sound_adr + 5, 0xff);
346 } else { /* Set up SB16 mixer chip */
347 /* Many thanks to Linards Ticmanis for writing this part! */
348 volume = (volume != 255) ? 127 + 16 * volume : 255;
349 outportb(sound_adr + 4, 0x32);
350 outportb(sound_adr + 5, volume);
351 outportb(sound_adr + 4, 0x33);
352 outportb(sound_adr + 5, volume);
353 outportb(sound_adr + 4, 0x30);
354 outportb(sound_adr + 5, 0xff);
355 outportb(sound_adr + 4, 0x31);
356 outportb(sound_adr + 5, 0xff);
357 }
358
359 play_part = 1;
360 start_of_dma(sample_adr1, sample_len1);
361
362 }
363
364 #endif /* SOUND_SUPPORT */
365 } /* os_start_sample */
366
367
368 /*
369 * os_stop_sample
370 *
371 * Turn off the current sample.
372 *
373 */
374 void os_stop_sample(int UNUSED(id))
375 {
376 #ifdef SOUND_SUPPORT
377 play_part = 0;
378
379 /* Exit if the sound board isn't set up properly */
380 if (sample_data == NULL)
381 return;
382 if (sound_adr == 0)
383 return;
384
385 /* Tell DSP to stop the current sample */
386 WRITE_DSP(0xd0)
387 #endif /* SOUND_SUPPORT */
388 } /* os_stop_sample */
389
390
391 /*
392 * os_finish_with_sample
393 *
394 * Remove the current sample from memory (if any).
395 *
396 */
397 void os_finish_with_sample(int UNUSED(id))
398 {
399 #ifdef SOUND_SUPPORT
400
401 os_stop_sample(0); /* we keep 64KB allocated all the time */
402
403 #endif /* SOUND_SUPPORT */
404 } /* os_finish_with_sample */
+0
-276
src/dos/bcscreen.c less more
0 /*
1 * bcscreen.c - DOS interface, screen manipulation
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <dos.h>
22 #include <mem.h>
23 #include "frotz.h"
24 #include "BCfrotz.h"
25
26
27 /*
28 * get_scrnptr
29 *
30 * Return a pointer to the given line in video RAM.
31 *
32 */
33 byte far *get_scrnptr(int y)
34 {
35 if (display == _CGA_)
36 return MK_FP((y & 1) ? 0xba00 : 0xb800, 40 * (y & ~1));
37 else if (display == _MCGA_)
38 return MK_FP(0xa000, 320 * y);
39 else
40 return MK_FP(0xa000, 80 * y);
41 } /* get_scrnptr */
42
43
44 /*
45 * clear_byte
46 *
47 * Helper function for clear_line.
48 *
49 */
50 static void clear_byte(byte far * scrn, word mask)
51 {
52 if (display == _CGA_)
53 if (scrn_attr == 0)
54 *scrn &= ~mask;
55 else
56 *scrn |= mask;
57 else {
58 outport(0x03ce, 0x0205);
59 outportb(0x03ce, 0x08);
60 outportb(0x03cf, mask);
61 asm les bx, scrn
62 asm mov al, es:[bx]
63 asm mov al, scrn_attr
64 asm mov es:[bx], al
65 }
66 } /* clear_byte */
67
68
69 /*
70 * clear_line
71 *
72 * Helper function for os_erase_area.
73 *
74 */ static void clear_line(int y, int left, int right)
75 {
76 byte far *scrn = get_scrnptr(y);
77
78 if (display == _MCGA_)
79 _fmemset(scrn + left, scrn_attr, right - left + 1);
80 else {
81 word mask1 = 0x00ff >> (left & 7);
82 word mask2 = 0xff80 >> (right & 7);
83
84 int x = right / 8 - left / 8;
85
86 scrn += left / 8;
87
88 if (x == 0) {
89 mask1 &= mask2;
90 mask2 = 0;
91 }
92
93 /* Clear first byte */
94 clear_byte(scrn++, mask1);
95
96 /* Clear middle bytes */
97 if (display >= _EGA_)
98 outport(0x03ce, 0xff08);
99
100 while (--x > 0)
101 *scrn++ = scrn_attr;
102
103 /* Clear last byte */
104 clear_byte(scrn, mask2);
105 }
106 } /* clear_line */
107
108
109 /*
110 * os_erase_area
111 *
112 * Fill a rectangular area of the screen with the current background
113 * colour. Top left coordinates are (1,1). The cursor does not move.
114 *
115 * The final argument gives the window being changed, -1 if only a
116 * portion of a window is being erased, or -2 if the whole screen is
117 * being erased. This is not relevant for the DOS interface, and so
118 * this function ignores that argument.
119 *
120 */
121 void os_erase_area(int top, int left, int bottom, int right, int win)
122 {
123 int y;
124
125 top--;
126 left--;
127 bottom--;
128 right--;
129
130 if (display <= _TEXT_) {
131 asm mov ax, 0x0600
132 asm mov ch, byte ptr top
133 asm mov cl, byte ptr left
134 asm mov dh, byte ptr bottom
135 asm mov dl, byte ptr right
136 asm mov bh, scrn_attr
137 asm int 0x10
138 } else
139 for (y = top; y <= bottom; y++)
140 clear_line(y, left, right);
141 } /* os_erase_area */
142
143
144 /*
145 * copy_byte
146 *
147 * Helper function for copy_line.
148 *
149 */
150 static void copy_byte(byte far * scrn1, byte far * scrn2, byte mask)
151 {
152 int i;
153
154 if (display == _CGA_)
155 *scrn1 = (*scrn1 & ~mask) | (*scrn2 & mask);
156 else {
157 outport(0x03ce, 0x0005);
158 outportb(0x03ce, 0x08);
159 outportb(0x03cf, mask);
160 outportb(0x03ce, 0x04);
161 outportb(0x03c4, 0x02);
162
163 for (i = 0; i < 4; i++) {
164 outportb(0x03cf, i);
165 outportb(0x03c5, 1 << i);
166
167 asm les bx, scrn2
168 asm mov ah, es:[bx]
169 asm les bx, scrn1
170 asm mov al, es:[bx]
171 asm mov es:[bx], ah
172 }
173 outportb(0x03c5, 0x0f);
174 }
175 } /* copy_byte */
176
177
178 /*
179 * copy_line
180 *
181 * Helper function for os_scroll_area.
182 *
183 */
184 static void copy_line(int y1, int y2, int left, int right)
185 {
186 byte far *scrn1 = get_scrnptr(y1);
187 byte far *scrn2 = get_scrnptr(y2);
188
189 if (display == _MCGA_)
190 _fmemcpy(scrn1 + left, scrn2 + left, right - left + 1);
191 else {
192 word mask1 = 0x00ff >> (left & 7);
193 word mask2 = 0xff80 >> (right & 7);
194
195 int x = right / 8 - left / 8;
196
197 scrn1 += left / 8;
198 scrn2 += left / 8;
199
200 if (x == 0) {
201 mask1 &= mask2;
202 mask2 = 0;
203 }
204
205 /* Copy first byte */
206 copy_byte(scrn1++, scrn2++, mask1);
207
208 /* Copy middle bytes */
209 if (display >= _EGA_)
210 outport(0x03ce, 0x0105);
211
212 while (--x > 0)
213 *scrn1++ = *scrn2++;
214
215 /* Copy last byte */
216 copy_byte(scrn1, scrn2, mask2);
217 }
218 } /* copy_line */
219
220
221 /*
222 * os_scroll_area
223 *
224 * Scroll a rectangular area of the screen up (units > 0) or down
225 * (units < 0) and fill the empty space with the current background
226 * colour. Top left coordinates are (1,1). The cursor stays put.
227 *
228 */
229 void os_scroll_area(int top, int left, int bottom, int right, int units)
230 {
231 int y;
232
233 top--;
234 left--;
235 bottom--;
236 right--;
237
238 if (display <= _TEXT_) {
239 asm mov ah, 6
240 asm mov bx, units
241 asm cmp bx, 0
242 asm jg scroll
243 asm mov ah, 7
244 asm neg bx
245 scroll:
246 asm mov al, bl
247 asm mov ch, byte ptr top
248 asm mov cl, byte ptr left
249 asm mov dh, byte ptr bottom
250 asm mov dl, byte ptr right
251 asm mov bh, scrn_attr
252 asm int 0x10
253 } else if (units > 0) {
254 for (y = top; y <= bottom; y++) {
255 if (y <= bottom - units)
256 copy_line(y, y + units, left, right);
257 else
258 clear_line(y, left, right);
259 }
260 } else {
261 for (y = bottom; y >= top; y--) {
262 if (y >= top - units)
263 copy_line(y, y + units, left, right);
264 else
265 clear_line(y, left, right);
266 }
267 }
268 } /* os_scroll_area */
269
270
271 bool os_repaint_window(int win, int ypos_old, int ypos_new, int xpos,
272 int ysize, int xsize)
273 {
274 return FALSE;
275 }
+0
-801
src/dos/bctext.c less more
0 /*
1 * bctext.c - DOS interface, text functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <alloc.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <conio.h>
25 #include <dos.h>
26 #include "frotz.h"
27 #include "BCfrotz.h"
28 #include "fontdata.h"
29
30 extern byte far *get_scrnptr(int);
31
32 int current_bg = 0;
33 int current_fg = 0;
34 int current_style = 0;
35 int current_font = 0;
36
37 byte text_bg = 0;
38 byte text_fg = 0;
39 byte bg = 0;
40 byte fg = 0;
41 byte scrn_attr = 0;
42
43 int cursor_x = 0;
44 int cursor_y = 0;
45
46 char latin1_to_ascii[] =
47 " ! c L >o<Y | S '' C a << not- R _ "
48 "^0 +/-^2 ^3 ' my P . , ^1 o >> 1/41/23/4? "
49 "A A A A Ae A AE C E E E E I I I I "
50 "Th N O O O O Oe * O U U U Ue Y Th ss "
51 "a a a a ae a ae c e e e e i i i i "
52 "th n o o o o oe : o u u u ue y th y ";
53
54 char latin1_to_ibm[] = {
55 0x20, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5,
56 0xf9, 0xb8, 0xa6, 0xae, 0xaa, 0xf0, 0xa9, 0xee,
57 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa,
58 0xf7, 0xfb, 0xa7, 0xaf, 0xac, 0xab, 0xf3, 0xa8,
59 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80,
60 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8,
61 0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0x9e,
62 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0xe1,
63 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87,
64 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b,
65 0xd0, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6,
66 0x9b, 0x97, 0xa3, 0x96, 0x81, 0xec, 0xe7, 0x98
67 };
68
69 static byte far *graphics_font = NULL;
70 static byte far *mcga_font = NULL;
71 static byte far *mcga_width = NULL;
72 static word far *serif_font = NULL;
73 static byte far *serif_width = NULL;
74
75
76 /*
77 * load_fonts
78 *
79 * Load the proportional and graphics fonts. In the release version all
80 * font data is appended to the end of the executable.
81 *
82 */
83 void load_fonts(void)
84 {
85 static chunk_offset[] = {
86 0x6660,
87 0x6300,
88 0x4A40,
89 0x3180,
90 0x18C0,
91 0x00
92 };
93
94 if (display == _MCGA_) {
95 mcga_font = font_data + chunk_offset[1];
96 mcga_width = (byte *) mcga_font + 0x300;
97 } else
98 graphics_font = font_data + chunk_offset[0];
99
100 if (display == _AMIGA_ && user_font != 0) {
101 serif_font = (word *) (font_data + chunk_offset[1 + user_font]);
102 serif_width = (byte *) serif_font + 0x1800;
103 }
104 } /* load_fonts */
105
106
107 /*
108 * os_font_data
109 *
110 * Return true if the given font is available. The font can be
111 *
112 * TEXT_FONT
113 * PICTURE_FONT
114 * GRAPHICS_FONT
115 * FIXED_WIDTH_FONT
116 *
117 * The font size should be stored in "height" and "width". If the given
118 * font is unavailable then these values must _not_ be changed.
119 *
120 */
121 int os_font_data(int font, int *height, int *width)
122 {
123 /* All fonts of this interface have the same size */
124 *height = z_header.font_height;
125 *width = z_header.font_width;
126
127 /* Not every font is available in every mode */
128 if (font == TEXT_FONT)
129 return TRUE;
130 if (font == GRAPHICS_FONT && (display == _CGA_ || display >= _EGA_))
131 return TRUE;
132 if (font == FIXED_WIDTH_FONT)
133 return TRUE;
134
135 /* Unavailable font */
136 return FALSE;
137 } /* os_font_data */
138
139
140 /*
141 * switch_scrn_attr
142 *
143 * Parts of the screen are usually erased to background colour. However,
144 * for deleting text in the input routine it can be useful to erase to
145 * the current text background colour. The two colours can be different,
146 * for example when the reverse text style is used. This helper function
147 * toggles between the two possible behaviours.
148 *
149 */
150 void switch_scrn_attr(bool flag)
151 {
152 byte scrn_bg;
153 byte scrn_fg;
154
155 if (flag) {
156 scrn_bg = text_bg;
157 scrn_fg = text_fg;
158 } else {
159 scrn_bg = bg;
160 scrn_fg = fg;
161 }
162
163 if (display <= _TEXT_)
164 scrn_attr = (scrn_bg << 4) | scrn_fg;
165 else if (display == _CGA_)
166 scrn_attr = (scrn_bg != BLACK) ? 0xff : 0x00;
167 else
168 scrn_attr = scrn_bg;
169 } /* switch_scrn_attr */
170
171
172 /*
173 * adjust_style
174 *
175 * Set the current colours. This combines the current colour selection
176 * and the current text style.
177 *
178 */
179 static void adjust_style(void)
180 {
181 static byte amiga_palette[][3] = {
182 {0x00, 0x00, 0x00},
183 {0x2a, 0x00, 0x00},
184 {0x00, 0x2a, 0x00},
185 {0x3f, 0x3f, 0x15},
186 {0x00, 0x00, 0x2a},
187 {0x2a, 0x00, 0x2a},
188 {0x00, 0x2a, 0x2a},
189 {0x3f, 0x3f, 0x3f},
190 {0x30, 0x30, 0x30},
191 {0x20, 0x20, 0x20},
192 {0x10, 0x10, 0x10},
193 };
194
195 static byte pc_colour[] = {
196 BLACK,
197 RED,
198 GREEN,
199 YELLOW,
200 BLUE,
201 MAGENTA,
202 CYAN,
203 WHITE,
204 DARKGRAY
205 };
206
207 static byte palette_bg = 0xff;
208 static byte palette_fg = 0xff;
209
210 fg = current_fg;
211 bg = current_bg;
212
213 /* V6 game, Amiga mode: Alter the palette registers if the colours
214 of window 0 have changed. DAC register #79 holds the foreground,
215 DAC register #64 the background colour. */
216
217 if (display == _AMIGA_ && z_header.version == V6 && cwin == 0) {
218 if (fg < 16 && fg != palette_fg) {
219 byte R = amiga_palette[fg - 2][0];
220 byte G = amiga_palette[fg - 2][1];
221 byte B = amiga_palette[fg - 2][2];
222
223 asm mov ax, 0x1010
224 asm mov bx, 79
225 asm mov dh, R
226 asm mov ch, G
227 asm mov cl, B
228 asm int 0x10
229
230 palette_fg = fg;
231 }
232
233 if (bg < 16 && bg != palette_bg) {
234 byte R = amiga_palette[bg - 2][0];
235 byte G = amiga_palette[bg - 2][1];
236 byte B = amiga_palette[bg - 2][2];
237
238 asm mov ax, 0x1010
239 asm mov bx, 64
240 asm mov dh, R
241 asm mov ch, G
242 asm mov cl, B
243 asm int 0x10
244
245 palette_bg = bg;
246
247 }
248
249 }
250
251 /* Handle colours */
252 if (fg < 16) {
253 if (display == _MONO_)
254 fg = (fg == WHITE_COLOUR) ? LIGHTGRAY : BLACK;
255 else if (z_header.version == V6 && display == _AMIGA_)
256 fg = (palette_fg == fg) ? 15 : 0;
257 else
258 fg = pc_colour[fg - 2];
259 } else
260 fg -= 16;
261
262 if (bg < 16) {
263 if (display == _MONO_)
264 bg = (bg == WHITE_COLOUR) ? LIGHTGRAY : BLACK;
265 else if (z_header.version == V6 && display == _AMIGA_)
266 bg = (palette_bg == bg) ? 0 : 15;
267 else
268 bg = pc_colour[bg - 2];
269
270 } else
271 bg -= 16;
272
273 /* Handle reverse text style */
274 if (current_style & REVERSE_STYLE) {
275 text_fg = (user_reverse_fg != -1) ? user_reverse_fg : bg;
276 text_bg = (user_reverse_bg != -1) ? user_reverse_bg : fg;
277 } else {
278 text_fg = fg;
279 text_bg = bg;
280 }
281
282 /* Handle emphasis style */
283 if (current_style & EMPHASIS_STYLE) {
284 if (display == _MONO_ && text_bg == BLACK)
285 text_fg = BLUE; /* blue in monochrome mode is underlined */
286 if (display == _TEXT_)
287 text_fg =
288 (user_emphasis != -1) ? user_emphasis : YELLOW;
289 }
290
291 /* Handle boldface style */
292 if (current_style & BOLDFACE_STYLE) {
293 if (display == _MONO_)
294 text_fg = WHITE;
295 if (display == _TEXT_)
296 text_fg ^= 8;
297
298 }
299
300 /* Set the screen attribute for scrolling and erasing */
301 switch_scrn_attr(FALSE);
302 } /* adjust_style */
303
304
305 /*
306 * os_set_colour
307 *
308 * Set the foreground and background colours which can be:
309 *
310 * DEFAULT_COLOUR
311 * BLACK_COLOUR
312 * RED_COLOUR
313 * GREEN_COLOUR
314 * YELLOW_COLOUR
315 * BLUE_COLOUR
316 * MAGENTA_COLOUR
317 * CYAN_COLOUR
318 * WHITE_COLOUR
319 *
320 * MS-DOS 320 columns MCGA mode only:
321 *
322 * GREY_COLOUR
323 *
324 * Amiga only:
325 *
326 * LIGHTGREY_COLOUR
327 * MEDIUMGREY_COLOUR
328 * DARKGREY_COLOUR
329 *
330 * There may be more colours in the range from 16 to 255; see the remarks
331 * on os_peek_colour.
332 *
333 */
334 void os_set_colour(int new_foreground, int new_background)
335 {
336 current_fg = new_foreground;
337 current_bg = new_background;
338
339 /* Apply changes */
340 adjust_style();
341
342 } /* os_set_colour */
343
344
345 /*
346 * os_set_text_style
347 *
348 * Set the current text style. Following flags can be set:
349 *
350 * REVERSE_STYLE
351 * BOLDFACE_STYLE
352 * EMPHASIS_STYLE (aka underline aka italics)
353 * FIXED_WIDTH_STYLE
354 *
355 */
356 void os_set_text_style(int new_style)
357 {
358 current_style = new_style;
359
360 /* Apply changes */
361 adjust_style();
362
363 } /* os_set_text_style */
364
365
366 /*
367 * os_set_font
368 *
369 * Set the font for text output. The interpreter takes care not to
370 * choose fonts which aren't supported by the interface.
371 *
372 */
373 void os_set_font(int new_font)
374 {
375 current_font = new_font;
376 } /* os_set_font */
377
378
379 /*
380 * write_pattern
381 *
382 * Helper function for drawing characters in EGA and Amiga mode.
383 *
384 */
385 void write_pattern(byte far * screen, byte val, byte mask)
386 {
387 if (mask != 0) {
388 if (display == _CGA_) {
389 if (text_bg == BLACK)
390 *screen &= ~mask;
391 if (text_bg == WHITE)
392 *screen |= mask;
393 if (text_fg != text_bg)
394 *screen ^= val;
395 } else if (display == _MCGA_) {
396 byte i;
397
398 for (i = 0x80; (mask & i) != 0; i >>= 1)
399 *screen++ = (val & i) ? text_fg : text_bg;
400 } else {
401 asm mov dx, 0x03cf
402 asm mov al, mask
403 asm out dx, al
404 asm les bx, screen
405 asm mov ch, text_bg
406 asm mov al, es:[bx]
407 asm mov es:[bx], ch
408 asm mov al, val
409 asm out dx, al
410 asm mov ch, text_fg
411 asm mov al, es:[bx]
412 asm mov es:[bx], ch
413 }
414 }
415 } /* write_pattern */
416
417
418 /*
419 * os_display_char
420 *
421 * Display a character of the current font using the current colours and
422 * text style. The cursor moves to the next position. Printable codes are
423 * all ASCII values from 32 to 126, ISO Latin-1 characters from 160 to
424 * 255, ZC_GAP (gap between two sentences) and ZC_INDENT (paragraph
425 * indentation). The screen should not be scrolled after printing to the
426 * bottom right corner.
427 *
428 */ void os_display_char(zchar c)
429 {
430 int width = os_char_width(c);
431
432 /* Handle accented characters */
433 if (c >= ZC_LATIN1_MIN
434 && (story_id != BEYOND_ZORK || (z_header.flags & GRAPHICS_FLAG)))
435 if (display == _CGA_ || display == _MCGA_) {
436 char *ptr = latin1_to_ascii + 3 * (c - ZC_LATIN1_MIN);
437
438 char c1 = *ptr++;
439 char c2 = *ptr++;
440 char c3 = *ptr++;
441
442 os_display_char(c1);
443
444 if (c2 != ' ')
445 os_display_char(c2);
446 if (c3 != ' ')
447 os_display_char(c3);
448
449 return;
450
451 } else if (display == _AMIGA_ && current_font == TEXT_FONT
452 && !(current_style & FIXED_WIDTH_STYLE)
453 && user_font != 0) {
454
455 if (c >= ZC_LATIN1_MIN)
456 c -= 32;
457 } else
458 c = latin1_to_ibm[c - ZC_LATIN1_MIN];
459
460 /* Handle special indentations */
461 if (c == ZC_INDENT) {
462 os_display_char(' ');
463 os_display_char(' ');
464 os_display_char(' ');
465 return;
466 }
467 if (c == ZC_GAP) {
468 os_display_char(' ');
469 os_display_char(' ');
470 return;
471 }
472
473 /* Display character */
474 if (display <= _TEXT_) {
475 asm mov ah, 2
476 asm mov bh, 0
477 asm mov dh, byte ptr cursor_y
478 asm mov dl, byte ptr cursor_x
479 asm int 0x10
480 asm mov ah, 9
481 asm mov bh, 0
482 asm mov bl, byte ptr text_bg
483 asm mov cl, 4
484 asm shl bl, cl
485 asm or bl, byte ptr text_fg
486 asm mov cx, 1
487 asm mov al, byte ptr c
488 asm int 0x10
489 } else {
490
491 void far *table;
492 word mask;
493 word val;
494 byte mask0;
495 byte mask1;
496 int align;
497 int underline;
498 int boldface;
499 int type;
500
501 int shift = (display != _MCGA_) ? cursor_x % 8 : 0;
502 int offset = (display != _MCGA_) ? cursor_x / 8 : cursor_x;
503
504 int i;
505
506 if (current_font == GRAPHICS_FONT) {
507 table = graphics_font + 8 * (c - 32);
508 mask = 0xff;
509 underline = -1;
510 boldface = -1;
511 align = 0;
512 type = 1;
513 } else if (display == _AMIGA_ && current_font == TEXT_FONT
514 && !(current_style & FIXED_WIDTH_STYLE)
515 && user_font != 0) {
516 table = serif_font + 16 * (c - 32);
517 mask = 0xffff << (16 - width);
518 underline = 14;
519 boldface = 1;
520 align = 0;
521 type = 2;
522 } else if (display == _CGA_) {
523 table = (byte far *) MK_FP(0xf000, 0xfa6e) + 8 * c;
524 mask = 0xff;
525 underline = 7;
526 boldface = (user_bold_typing != -1) ? 1 : -1;
527 align = 0;
528 type = 3;
529 } else if (display >= _EGA_) {
530 table = (byte far *) getvect(0x43) + z_header.font_height * c;
531 mask = 0xff;
532 underline = z_header.font_height - 1;
533 boldface = (user_bold_typing != -1) ? 1 : -1;
534 align = 0;
535 type = 3;
536 } else {
537 table = mcga_font + 8 * (c - 32);
538 mask = 0xff & (0xff << (8 - width));
539 underline = 7;
540 boldface = -1;
541 align = (width + 1 - mcga_width[c - 32]) / 2;
542 type = 3;
543 }
544
545 mask0 = mask >> shift;
546 mask1 = mask << (8 - shift);
547
548 if (!(current_style & BOLDFACE_STYLE))
549 boldface = -1;
550 if (!(current_style & EMPHASIS_STYLE))
551 underline = -1;
552
553 if (display >= _EGA_) {
554 outport(0x03ce, 0x0205);
555 outport(0x03ce, 0xff08);
556 }
557
558 for (i = 0; i < z_header.font_height; i++) {
559 byte far *screen = get_scrnptr(cursor_y + i) + offset;
560
561 if (type == 1) {
562 val =
563 *((byte far *) table +
564 8 * i / z_header.font_height);
565 }
566 if (type == 2)
567 val = *((word far *) table + i);
568 if (type == 3)
569 val = *((byte far *) table + i);
570
571 if (align != 0)
572 val >>= align;
573
574 if (boldface == 1)
575 val |= val >> 1;
576 if (underline == i)
577 val ^= mask;
578
579 if (type == 2)
580 write_pattern(screen++, val >> (8 + shift),
581 mask >> (8 + shift));
582
583 write_pattern(screen + 0, val >> shift, mask0);
584 write_pattern(screen + 1, val << (8 - shift), mask1);
585 }
586 }
587
588 /* Move cursor to next position */
589 cursor_x += width;
590 } /* os_display_char */
591
592
593 /*
594 * os_display_string
595 *
596 * Pass a string of characters to os_display_char.
597 *
598 */
599 void os_display_string(const zchar * s)
600 {
601 zchar c;
602
603 while ((c = *s++) != 0) {
604 if (c == ZC_NEW_FONT || c == ZC_NEW_STYLE) {
605
606 int arg = *s++;
607
608 if (c == ZC_NEW_FONT)
609 os_set_font(arg);
610 if (c == ZC_NEW_STYLE)
611 os_set_text_style(arg);
612
613 } else
614 os_display_char(c);
615 }
616 } /* os_display_string */
617
618
619 /*
620 * os_char_width
621 *
622 * Return the width of the character in screen units.
623 *
624 */
625
626 int os_char_width(zchar c)
627 {
628 /* Handle accented characters */
629 if (c >= ZC_LATIN1_MIN
630 && (story_id != BEYOND_ZORK || (z_header.flags & GRAPHICS_FLAG)))
631 if (display == _CGA_ || display == _MCGA_) {
632
633 const char *ptr =
634 latin1_to_ascii + 3 * (c - ZC_LATIN1_MIN);
635
636 int width = 0;
637
638 char c1 = *ptr++;
639 char c2 = *ptr++;
640 char c3 = *ptr++;
641
642 width = os_char_width(c1);
643
644 if (c2 != ' ')
645 width += os_char_width(c2);
646 if (c3 != ' ')
647 width += os_char_width(c3);
648
649 return width;
650
651 } else if (display == _AMIGA_ && current_font == TEXT_FONT
652 && !(current_style & FIXED_WIDTH_STYLE)
653 && user_font != 0)
654 if (c >= ZC_LATIN1_MIN)
655 c -= 32;
656
657 /* Handle special indentations */
658 if (c == ZC_INDENT)
659 return 3 * os_char_width(' ');
660 if (c == ZC_GAP)
661 return 2 * os_char_width(' ');
662
663 /* Calculate width */
664 if (display <= _TEXT_)
665 return 1;
666 if (display == _CGA_)
667 return 8;
668 if (display == _EGA_)
669 return 8;
670
671 if (current_font == GRAPHICS_FONT)
672 return 8;
673 if (current_font == FIXED_WIDTH_FONT
674 || (current_style & FIXED_WIDTH_STYLE) || (display == _AMIGA_
675 && user_font == 0))
676 return (display == _AMIGA_) ? 8 : 5;
677
678 if (display == _MCGA_)
679 return mcga_width[c - 32];
680 if (display == _AMIGA_)
681 return serif_width[c - 32] +
682 ((current_style & BOLDFACE_STYLE) ? 1 : 0);
683
684 return 0;
685 } /* os_char_width */
686
687
688 /*
689 * os_string_width
690 *
691 * Calculate the length of a word in screen units. Apart from letters,
692 * the word may contain special codes:
693 *
694 * ZC_NEW_STYLE - next character is a new text style
695 * ZC_NEW_FONT - next character is a new font
696 *
697 */
698 int os_string_width(const zchar * s)
699 {
700 int width = 0;
701
702 int saved_font = current_font;
703 int saved_style = current_style;
704
705 zchar c;
706
707 while ((c = *s++) != 0) {
708 if (c == ZC_NEW_STYLE || c == ZC_NEW_FONT) {
709
710 int arg = *s++;
711
712 if (c == ZC_NEW_FONT)
713 current_font = arg;
714 if (c == ZC_NEW_STYLE)
715 current_style = arg;
716
717 } else
718 width += os_char_width(c);
719 }
720 current_font = saved_font;
721 current_style = saved_style;
722
723 return width;
724 } /* os_string_width */
725
726
727 /*
728 * os_set_cursor
729 *
730 * Place the text cursor at the given coordinates. Top left is (1,1).
731 *
732 */
733 void os_set_cursor(int y, int x)
734 {
735 cursor_y = y - 1;
736 cursor_x = x - 1;
737 } /* os_set_cursor */
738
739
740 /*
741 * os_more_prompt
742 *
743 * Display a MORE prompt, wait for a keypress and remove the MORE
744 * prompt from the screen.
745 *
746 */
747 void os_more_prompt(void)
748 {
749 int saved_x;
750
751 /* Save text font and style */
752 int saved_font = current_font;
753 int saved_style = current_style;
754
755 /* Choose plain text style */
756 current_font = TEXT_FONT;
757 current_style = 0;
758
759 adjust_style();
760
761 /* Wait until the user presses a key */
762 saved_x = cursor_x;
763 os_display_string((zchar *) "[MORE]");
764 os_read_key(0, TRUE);
765
766 os_erase_area(cursor_y + 1,
767 saved_x + 1, cursor_y + z_header.font_height, cursor_x + 1, -1);
768
769 cursor_x = saved_x;
770
771 /* Restore text font and style */
772 current_font = saved_font;
773 current_style = saved_style;
774
775 adjust_style();
776 } /* os_more_prompt */
777
778 /*
779 * os_from_true_colour
780 *
781 * Given a true colour, return an appropriate colour index.
782 *
783 */
784 int os_from_true_colour(zword colour)
785 {
786 /* Nothing here yet */
787 return 0;
788 }
789
790 /*
791 * os_to_true_colour
792 *
793 * Given a colour index, return the appropriate true colour.
794 *
795 */
796 zword os_to_true_colour(int index)
797 {
798 /* Nothing here yet */
799 return 0;
800 }
+0
-152
src/dos/blorb.h less more
0 #ifndef BLORB_H
1 #define BLORB_H
2
3 /* blorb.h: Header file for Blorb library, version 1.0.2.
4 Designed by Andrew Plotkin <erkyrath@eblong.com>
5 http://www.eblong.com/zarf/blorb/index.html
6
7 This is the header that a Z-machine interpreter should include.
8 It defines everything that the interpreter has to know.
9 */
10
11 /* Things you (the porter) have to edit: */
12
13 /* As you might expect, uint32 must be a 32-bit unsigned numeric type,
14 and uint16 a 16-bit unsigned numeric type. You should also uncomment
15 exactly one of the two ENDIAN definitions. */
16
17 typedef unsigned long uint32;
18 typedef unsigned short uint16;
19
20 /* End of things you have to edit. */
21
22 #ifndef TRUE
23 #define TRUE 1
24 #endif
25 #ifndef FALSE
26 #define FALSE 0
27 #endif
28
29 /* Error type and error codes */
30 typedef int bb_err_t;
31
32 #define bb_err_None (0)
33 #define bb_err_CompileTime (1)
34 #define bb_err_Alloc (2)
35 #define bb_err_Read (3)
36 #define bb_err_NotAMap (4)
37 #define bb_err_Format (5)
38 #define bb_err_NotFound (6)
39
40 /* Methods for loading a chunk */
41 #define bb_method_DontLoad (0)
42 #define bb_method_Memory (1)
43 #define bb_method_FilePos (2)
44
45 /* Four-byte constants */
46
47 /*#define bb_make_id(c1, c2, c3, c4) \
48 (((c1) << 24) | ((c2) << 16) | ((c3) << 8) | (c4))
49 */
50 #define bb_ID_Snd 1399743520
51 #define bb_ID_Exec 1165518179
52 #define bb_ID_Pict 1349084020
53 #define bb_ID_Copyright 677587232
54 #define bb_ID_AUTH 1096111176
55 #define bb_ID_ANNO 1095650895
56
57 #define bb_ID_ZCOD 1514360644
58
59 /* bb_result_t: Result when you try to load a chunk. */
60 typedef struct bb_result_struct {
61 int chunknum; /* The chunk number (for use in bb_unload_chunk(), etc.) */
62 union {
63 void *ptr; /* A pointer to the data (if you used bb_method_Memory) */
64 uint32 startpos; /* The position in the file (if you used bb_method_FilePos) */
65 } data;
66 uint32 length; /* The length of the data */
67 } bb_result_t;
68
69 /* bb_aux_sound_t: Extra data which may be associated with a sound. */
70 typedef struct bb_aux_sound_struct {
71 char repeats;
72 } bb_aux_sound_t;
73
74 /* bb_aux_pict_t: Extra data which may be associated with an image. */
75 typedef struct bb_aux_pict_struct {
76 uint32 ratnum, ratden;
77 uint32 minnum, minden;
78 uint32 maxnum, maxden;
79 } bb_aux_pict_t;
80
81 /* bb_resolution_t: The global resolution data. */
82 typedef struct bb_resolution_struct {
83 uint32 px, py;
84 uint32 minx, miny;
85 uint32 maxx, maxy;
86 } bb_resolution_t;
87
88 /* bb_color_t: Guess what. */
89 typedef struct bb_color_struct {
90 unsigned char red, green, blue;
91 } bb_color_t;
92
93 /* bb_palette_t: The palette data. */
94 typedef struct bb_palette_struct {
95 int isdirect;
96 union {
97 int depth; /* The depth (if isdirect is TRUE). Either 16 or 32. */
98 struct {
99 int numcolors;
100 bb_color_t *colors;
101 } table; /* The list of colors (if isdirect is FALSE). */
102 } data;
103 } bb_palette_t;
104
105 /* bb_zheader_t: Information to identify a Z-code file. */
106 typedef struct bb_zheader_struct {
107 uint16 releasenum; /* Bytes $2-3 of header. */
108 char serialnum[6]; /* Bytes $12-17 of header. */
109 uint16 checksum; /* Bytes $1C-1D of header. */
110 /* The initpc field is not used by Blorb. */
111 } bb_zheader_t;
112
113 /* bb_map_t: Holds the complete description of an open Blorb file.
114 This type is opaque for normal interpreter use. */
115 typedef struct bb_map_struct bb_map_t;
116
117 /* Function declarations. These functions are of fairly general use;
118 they would apply to any Blorb file. */
119
120 extern bb_err_t bb_create_map(FILE * file, bb_map_t ** newmap);
121 extern bb_err_t bb_destroy_map(bb_map_t * map);
122
123 extern char *bb_err_to_string(bb_err_t err);
124
125 extern bb_err_t bb_load_chunk_by_type(bb_map_t * map, int method,
126 bb_result_t * res, uint32 chunktype,
127 int count);
128 extern bb_err_t bb_load_chunk_by_number(bb_map_t * map, int method,
129 bb_result_t * res, int chunknum);
130 extern bb_err_t bb_unload_chunk(bb_map_t * map, int chunknum);
131
132 extern bb_err_t bb_load_resource(bb_map_t * map, int method,
133 bb_result_t * res, uint32 usage, int resnum);
134 extern bb_err_t bb_count_resources(bb_map_t * map, uint32 usage,
135 int *num, int *min, int *max);
136
137 /* More function declarations. These functions are more or less
138 specific to the Z-machine's use of Blorb. */
139
140 extern uint16 bb_get_release_num(bb_map_t * map);
141 extern bb_zheader_t *bb_get_zheader(bb_map_t * map);
142 extern bb_resolution_t *bb_get_resolution(bb_map_t * map);
143 extern bb_err_t bb_get_palette(bb_map_t * map, bb_palette_t ** res);
144 extern bb_err_t bb_load_resource_pict(bb_map_t * map, int method,
145 bb_result_t * res, int resnum,
146 bb_aux_pict_t ** auxdata);
147 extern bb_err_t bb_load_resource_snd(bb_map_t * map, int method,
148 bb_result_t * res, int resnum,
149 bb_aux_sound_t ** auxdata);
150
151 #endif /* BLORB_H */
+0
-72
src/dos/blorblow.h less more
0 #ifndef BLORBLOW_H
1 #define BLORBLOW_H
2
3 /* blorblow.h: Low-level header file for Blorb library, version 1.0.2.
4 Designed by Andrew Plotkin <erkyrath@eblong.com>
5 http://www.eblong.com/zarf/blorb/index.html
6
7 This header is generally of interest only to the Blorb library code
8 itself (blorblib.c); it defines things internal to the library.
9 An interpreter shouldn't have to include this file. The only time you
10 might need to include this is if you're writing a Blorb file analysis
11 tool (such as blorbscan), or a transformation tool, or some such thing.
12 */
13
14 /* More four-byte constants. */
15
16 #define bb_ID_FORM 1179603533
17 #define bb_ID_IFRS 1229345363
18 #define bb_ID_RIdx 1380541560
19 #define bb_ID_IFhd 1229351012
20 #define bb_ID_Reso 1382380399
21 #define bb_ID_Loop 1282371440
22 #define bb_ID_RelN 1382378574
23 #define bb_ID_Plte 1349284965
24
25 /* bb_chunkdesc_t: Describes one chunk of the Blorb file. */
26 typedef struct bb_chunkdesc_struct {
27 uint32 type;
28 uint32 len;
29 uint32 startpos; /* start of chunk header */
30 uint32 datpos; /* start of data (either startpos or startpos+8) */
31
32 void *ptr; /* pointer to malloc'd data, if loaded */
33 int auxdatnum; /* entry in the auxsound/auxpict array; -1 if none.
34 This only applies to chunks that represent resources; */
35
36 } bb_chunkdesc_t;
37
38 /* bb_resdesc_t: Describes one resource in the Blorb file. */
39 typedef struct bb_resdesc_struct {
40 uint32 usage;
41 int resnum;
42 int chunknum;
43 } bb_resdesc_t;
44
45 /* bb_map_t: Holds the complete description of an open Blorb file. */
46 struct bb_map_struct {
47 uint32 inited; /* holds bb_Inited_Magic if the map structure is valid */
48 FILE *file;
49
50 int numchunks;
51 bb_chunkdesc_t *chunks; /* list of chunk descriptors */
52
53 int numresources;
54 bb_resdesc_t *resources; /* list of resource descriptors */
55 bb_resdesc_t **ressorted; /* list of pointers to descriptors
56 in map->resources -- sorted by usage and resource number. */
57
58 bb_zheader_t *zheader;
59 int releasenum;
60 bb_resolution_t *resolution;
61 int palettechunk; /* chunk number of palette, or -1 if there is none. */
62 bb_palette_t *palette;
63 bb_aux_sound_t *auxsound; /* extra information about sounds */
64 bb_aux_pict_t *auxpict; /* extra information about pictures */
65 };
66
67 #define bb_Inited_Magic (0xB7012BED)
68
69 extern char *bb_id_to_string(uint32 id);
70
71 #endif /* BLORBLOW_H */
0 /*
1 * dosblorb.c - Blorb routines
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <conio.h>
22 #include <dos.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include "frotz.h"
27
28 #include "dosfrotz.h"
29 #include "dosblorb.h"
30
31 #ifndef NO_BLORB
32
33 extern f_setup_t f_setup;
34
35 FILE *blorb_fp;
36 bb_result_t blorb_res;
37 bb_map_t *blorb_map;
38
39 static int isblorb(FILE *);
40
41
42 /*
43 * dos_blorb_init
44 *
45 * Check if we're opening a Blorb file directly. If not, check
46 * to see if there's a separate Blorb file that looks like it goes
47 * along with this Zcode file. If we have a Blorb file one way or the
48 * other, make a Blorb map. If we opened a Blorb file directly, that
49 * means that our executable is in that file and therefore we will look
50 * for a ZCOD chunk and record its location so os_load_story() can find it.
51 * Make sure the Blorb file is opened and with the file pointer blorb_fp.
52 */
53 bb_err_t dos_blorb_init(char *filename)
54 {
55 FILE *fp;
56 char *p;
57 char *mystring;
58 int len1;
59 int len2;
60
61 bb_err_t blorb_err;
62
63 if ((fp = fopen(filename, "rb")) == NULL)
64 return bb_err_Read;
65
66 /* Is this really a Blorb file?
67 * If not, maybe we're loading a naked zcode file
68 * and our resources are in a separate blorb file.
69 */
70 if (isblorb(fp)) { /* Now we know to look */
71 f_setup.exec_in_blorb = 1; /* for zcode in the blorb */
72 blorb_fp = fp;
73 } else {
74 fclose(fp);
75 len1 = strlen(filename) + strlen(EXT_BLORB);
76 len2 = strlen(filename) + strlen(EXT_BLORB3);
77 if (f_setup.blorb_file != NULL)
78 mystring = strdup(f_setup.blorb_file);
79 else {
80 mystring = malloc(MAX(len1, len2) * sizeof(char) + 1);
81 memcpy(mystring, filename, MAX(len1, len2) * sizeof(char));
82 p = strrchr(mystring, '.');
83 if (p != NULL) *p = '\0';
84 strncat(mystring, EXT_BLORB, len1);
85 }
86
87 /* Check if foo.blb is there. */
88 if ((fp = fopen(mystring, "rb")) == NULL) {
89 p = strrchr(mystring, '.');
90 if (p != NULL) *p = '\0';
91 strncat(mystring, EXT_BLORB3, len2);
92 if (!(fp = fopen(mystring, "rb")))
93 return bb_err_NoBlorb;
94 }
95 if (!isblorb(fp)) {
96 fclose(fp);
97 return bb_err_NoBlorb;
98 }
99 /* At this point we know that we're using a naked zcode file */
100 /* with resources in a separate Blorb file. */
101 blorb_fp = fp;
102 f_setup.use_blorb = 1;
103 }
104
105 /* Create a Blorb map from this file.
106 * This will fail if the file is not a valid Blorb file.
107 * From this map, we can now pick out any resource we need.
108 */
109 blorb_err = bb_create_map(blorb_fp, &blorb_map);
110 if (blorb_err != bb_err_None)
111 return bb_err_Format;
112
113 /* Locate the EXEC chunk within the blorb file and record its
114 * location so os_load_story() can find it.
115 */
116 if (f_setup.exec_in_blorb) {
117 blorb_err = bb_load_chunk_by_type(blorb_map, bb_method_FilePos,
118 &blorb_res, bb_ID_ZCOD, 0);
119 f_setup.exec_in_blorb = 1;
120 }
121
122 return blorb_err;
123 }
124
125
126 /*
127 * isblorb
128 *
129 * Returns 1 if this file is a Blorb file, 0 if not.
130 *
131 */
132 static int isblorb(FILE *fp)
133 {
134 char mybuf[4];
135
136 if (fp == NULL)
137 return 0;
138
139 fread(mybuf, 1, 4, fp);
140 if (strncmp(mybuf, "FORM", 4))
141 return 0;
142
143 fseek(fp, 4, SEEK_CUR);
144 fread(mybuf, 1, 4, fp);
145
146 if (strncmp(mybuf, "IFRS", 4))
147 return 0;
148
149 return 1;
150 }
151
152 #endif /* NO_BLORB */
0 /*
1 * dosblorb.h
2 *
3 * Blorb related functions specific to the DOS interface.
4 *
5 */
6
7 #ifndef DOSBLORB_H
8 #define DOSBLORB_H
9
10 #ifndef NO_BLORB
11
12 #include "blorb.h"
13 #include "blorblow.h"
14
15
16 /*
17 * The bb_result_t struct lacks a few members that would make things a
18 * bit easier. The myresource struct takes encapsulates the bb_result_t
19 * struct and adds a type member and a filepointer. I would like to
20 * convince Andrew Plotkin to make a change in the reference Blorb code
21 * to add these members.
22 *
23 */
24 typedef struct {
25 bb_result_t bbres;
26 unsigned long type;
27 FILE *fp;
28 } myresource;
29
30 /* These are used only locally */
31 /*
32 extern bb_err_t blorb_err;
33 extern bb_map_t *blorb_map;
34 extern FILE *blorb_fp;
35 */
36 extern bb_result_t blorb_res;
37
38 bb_err_t dos_blorb_init(char *);
39 void dos_blorb_stop(void);
40
41 #endif
42 #endif
0 /*
1 * dosfrotz.h
2 *
3 * DOS interface, declarations, definitions, and defaults.
4 *
5 */
6
7 #ifndef DOSFROTZ_H
8 #define DOSFROTZ_H
9
10 #ifndef MAX
11 #define MAX(x,y) ((x)>(y)) ? (x) : (y)
12 #endif
13 #ifndef MIN
14 #define MIN(x,y) ((x)<(y)) ? (x) : (y)
15 #endif
16
17 #define MASK_LINEAR(addr) (addr & 0x000FFFFF)
18 #define RM_TO_LINEAR(addr) (((addr & 0xFFFF0000) >> 12) + (addr & 0xFFFF))
19 #define RM_OFFSET(addr) (addr & 0xF)
20 #define RM_SEGMENT(addr) ((addr >> 4) & 0xFFFF)
21
22 #define OS_PATHSEP ';'
23
24 #define byte0(v) ((byte *)&v)[0]
25 #define byte1(v) ((byte *)&v)[1]
26 #define byte2(v) ((byte *)&v)[2]
27 #define byte3(v) ((byte *)&v)[3]
28 #define word0(v) ((word *)&v)[0]
29 #define word1(v) ((word *)&v)[1]
30
31 #ifndef HISTORY_MIN_ENTRY
32 #define HISTORY_MIN_ENTRY 1
33 #endif
34
35 #define SPECIAL_KEY_MIN 256
36 #define SPECIAL_KEY_HOME 256
37 #define SPECIAL_KEY_END 257
38 #define SPECIAL_KEY_WORD_LEFT 258
39 #define SPECIAL_KEY_WORD_RIGHT 259
40 #define SPECIAL_KEY_DELETE 260
41 #define SPECIAL_KEY_INSERT 261
42 #define SPECIAL_KEY_PAGE_UP 262
43 #define SPECIAL_KEY_PAGE_DOWN 263
44 #define SPECIAL_KEY_TAB 264
45 #define SPECIAL_KEY_MAX 264
46
47 #define _MONO_ 0
48 #define _TEXT_ 1
49 #define _CGA_ 2
50 #define _MCGA_ 3
51 #define _EGA_ 4
52 #define _AMIGA_ 5
53
54 /*
55 * For ease of porting from Borland Turbo C to Open Watcom C, define these
56 * names for text mode colours. Borland C has these in <conio.h> and
57 * <graphics.h> --- as `enum COLORS' --- but Watcom does not.
58 */
59 #ifdef __WATCOMC__
60 enum bc_compatible_colours {
61 BLACK,
62 BLUE,
63 GREEN,
64 CYAN,
65 RED,
66 MAGENTA,
67 BROWN,
68 LIGHTGRAY,
69 DARKGRAY,
70 LIGHTBLUE,
71 LIGHTGREEN,
72 LIGHTCYAN,
73 LIGHTRED,
74 LIGHTMAGENTA,
75 YELLOW,
76 WHITE
77 };
78 #endif
79
80 typedef unsigned char byte;
81 typedef unsigned short word;
82
83 extern int display;
84
85 extern int cursor_x;
86 extern int cursor_y;
87
88 extern char latin1_to_ibm[];
89 extern char latin1_to_ascii[];
90
91 extern byte text_bg;
92 extern byte text_fg;
93
94 extern byte scrn_attr;
95
96 extern int user_background;
97 extern int user_foreground;
98 extern int user_emphasis;
99 extern int user_reverse_bg;
100 extern int user_reverse_fg;
101 extern int user_screen_height;
102 extern int user_screen_width;
103 extern int user_tandy_bit;
104 extern int user_bold_typing;
105 extern int user_random_seed;
106 extern int user_font;
107
108 extern char stripped_story_name[];
109 extern char *prog_name;
110
111 extern int current_bg;
112 extern int current_fg;
113 extern int current_style;
114 extern int current_font;
115
116 extern int scaler;
117
118 #ifndef NO_SOUND
119 extern volatile int end_of_sound_flag;
120 #endif
121
122 /* owinit */ int dectoi (const char *);
123 /* owinit */ int hextoi (const char *);
124 /* owmouse */ bool detect_mouse (void);
125 /* owmouse */ int read_mouse (void);
126 /* owpic */ bool init_pictures (void);
127 /* owpic */ void reset_pictures (void);
128
129 #ifndef NO_SOUND
130 /* owsmpl */ bool dos_init_sound (void);
131 /* owsmpl */ void dos_reset_sound (void);
132 /* owinput */ void end_of_sound(void);
133 #endif
134 /* owtext */ void switch_scrn_attr (bool);
135 /* owtext */ void load_fonts (void);
136
137 #ifdef __WATCOMC__
138 #include "inline.h"
139 #define outportb(x,y) outp(x,y)
140 #define outport(x,y) outpw(x,y)
141 #define inportb(x) inp(x)
142
143 #define getvect(x) _dos_getvect(x)
144 #define setvect(x,y) _dos_setvect(x,y)
145 #endif
146
147 #endif
0 /*
1 * dosinit.c - DOS interface, initialization
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <conio.h>
22 #include <dos.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include "frotz.h"
27
28 #include "dosfrotz.h"
29 #ifndef NO_BLORB
30 #include "dosblorb.h"
31 #endif
32
33 extern f_setup_t f_setup;
34 extern z_header_t z_header;
35
36 #define INFORMATION "\
37 An interpreter for all Infocom and other Z-Machine games.\n\
38 Complies with standard 1.0 of Graham Nelson's specification.\n\
39 \n\
40 Syntax: frotz [options] story-file\n\
41 -a watch attribute setting \t -O watch object locating\n\
42 -A watch attribute testing \t -p alter piracy opcode\n\
43 -b # background colour \t -q quiet (disable sound effects)\n\
44 -B # reverse background colour \t -r # right margin\n\
45 -c # context lines \t -R <path> restricted read/write\n\
46 -d # display mode (see below) \t -s # random number seed value\n\
47 -e # emphasis colour [mode 1] \t -S # transcript width\n\
48 -f # foreground colour \t -t set Tandy bit\n\
49 -F # reverse foreground colour \t -T bold typing [modes 2+4+5]\n\
50 -g # font [mode 5] (see below) \t -u # slots for multiple undo\n\
51 -h # screen height \t -v show version information\n\
52 -i ignore runtime errors \t -w # screen width\n\
53 -l # left margin \t -x expand abbreviations g/x/z\n\
54 -o watch object movement \t -Z # error checking (see below)\n"
55
56 #define INFO2 "\
57 Fonts: 0 fixed, 1 sans serif, 2 comic, 3 times, 4 serif.\n\
58 Display modes: 0 mono, 1 text, 2 CGA, 3 MCGA, 4 EGA, 5 Amiga.\n\
59 Error reporting: 0 none, 1 first only (default), 2 all, 3 exit after any error."
60
61
62 /* in bcinit.c only. What is its significance? */
63 extern unsigned cdecl _heaplen = 0x800 + 4 * BUFSIZ;
64 extern unsigned cdecl _stklen = 0x800;
65
66 extern int zoptind;
67
68 static const char *progname = NULL;
69
70 extern char script_name[];
71 extern char command_name[];
72 extern char save_name[];
73 extern char auxilary_name[];
74
75 int display = -1;
76
77 int user_background = -1;
78 int user_foreground = -1;
79 int user_emphasis = -1;
80 int user_bold_typing = -1;
81 int user_reverse_bg = -1;
82 int user_reverse_fg = -1;
83 int user_screen_height = -1;
84 int user_screen_width = -1;
85 int user_tandy_bit = -1;
86 int user_random_seed = -1;
87 int user_font = 1;
88
89 static byte old_video_mode = 0;
90
91 static void interrupt(*oldvect) () = NULL;
92
93 bool at_keybrd;
94
95 /* Test for the existance of Enhanced AT keyboard support in BIOS */
96 static bool test_enhanced_keyboard(unsigned char b)
97 {
98 union REGS regs;
99 unsigned char far *shift_status;
100 shift_status = MK_FP(0, 0x417);
101 shift_status[0] = b;
102 regs.h.ah = 0x12;
103 int86(0x16, &regs, &regs);
104 return b == regs.h.al;
105 }
106
107 /*
108 * os_init_setup
109 *
110 * Set or reset various configuration variables.
111 *
112 */
113 void os_init_setup(void)
114 {
115 f_setup.sound = 1;
116
117 at_keybrd = (test_enhanced_keyboard(0x40) && test_enhanced_keyboard(0x80));
118 test_enhanced_keyboard(0x00);
119 } /* os_init_setup */
120
121
122 /*
123 * dectoi
124 *
125 * Convert a string containing a decimal number to integer. The string may
126 * be NULL, but it must not be empty.
127 *
128 */
129 int dectoi(const char *s)
130 {
131 int n = 0;
132
133 if (s != NULL) {
134 do {
135 n = 10 * n + (*s & 15);
136 } while (*++s > ' ');
137 }
138 return n;
139 } /* dectoi */
140
141
142 /*
143 * hextoi
144 *
145 * Convert a string containing a hex number to integer. The string may be
146 * NULL, but it must not be empty.
147 *
148 */
149 int hextoi(const char *s)
150 {
151 int n = 0;
152
153 if (s != NULL) {
154 do {
155
156 n = 16 * n + (*s & 15);
157
158 if (*s > '9')
159 n += 9;
160
161 } while (*++s > ' ');
162 }
163 return n;
164 } /* hextoi */
165
166
167 /*
168 * basename
169 *
170 * A generic and spartan bit of code to extract the filename from a path.
171 * This one is so trivial that it's okay to steal.
172 */
173 char *basename(const char *path)
174 {
175 const char *s;
176 const char *p;
177 p = s = path;
178
179 while (*s) {
180 if (*s++ == '\\') {
181 p = s;
182 }
183 }
184 return (char *)p;
185 } /* basename */
186
187
188 /*
189 * cleanup
190 *
191 * Shut down the IO interface: free memory, close files, restore
192 * interrupt pointers and return to the previous video mode.
193 *
194 */
195 static void cleanup(void)
196 {
197 #ifndef NO_SOUND
198 dos_reset_sound();
199 #endif
200 reset_pictures();
201
202 #ifdef __WATCOMC__
203 bios_video_ax((word)old_video_mode);
204 _dos_setvect(0x1b, oldvect);
205 #else
206 asm mov ah, 0
207 asm mov al, old_video_mode
208 asm int 0x10
209 setvect(0x1b, oldvect);
210 #endif
211 } /* cleanup */
212
213
214 /*
215 * fast_exit
216 *
217 * Handler routine to be called when the crtl-break key is pressed.
218 *
219 */
220 static void interrupt fast_exit()
221 {
222 cleanup();
223 exit(EXIT_FAILURE);
224 } /* fast_exit */
225
226
227 /*
228 * os_quit
229 *
230 * Immediately and cleanly exit, passing along exit status.
231 *
232 */
233
234 void os_quit(int status)
235 {
236 cleanup();
237 exit(status);
238 }
239
240 /*
241 * os_fatal
242 *
243 * Display error message and exit program.
244 *
245 */
246 void os_fatal(const char *s, ...)
247 {
248 if (z_header.interpreter_number)
249 os_reset_screen();
250
251 /* Display error message */
252 fputs("\nFatal error: ", stderr);
253 fputs(s, stderr);
254 fputs("\n", stderr);
255
256 /* Abort program */
257 exit(EXIT_FAILURE);
258 } /* os_fatal */
259
260
261 /*
262 * parse_options
263 *
264 * Parse program options and set global flags accordingly.
265 *
266 */
267 static void parse_options(int argc, char **argv)
268 {
269 int c;
270
271 do {
272 int num = 0;
273
274 c = zgetopt(argc, argv,
275 "aAb:B:c:d:e:f:F:g:h:il:oOpqr:R:s:S:tTu:vw:xZ:");
276
277 if (zoptarg != NULL)
278 num = dectoi(zoptarg);
279
280 if (c == 'a')
281 f_setup.attribute_assignment = 1;
282 if (c == 'A')
283 f_setup.attribute_testing = 1;
284 if (c == 'b')
285 user_background = num;
286 if (c == 'B')
287 user_reverse_bg = num;
288 if (c == 'c')
289 f_setup.context_lines = num;
290 if (c == 'd') {
291 display = zoptarg[0] | 32;
292 if ((display < '0' || display > '5')
293 && (display < 'a' || display > 'e')) {
294 display = -1;
295 }
296 }
297 if (c == 'e')
298 user_emphasis = num;
299 if (c == 'T')
300 user_bold_typing = 1;
301 if (c == 'f')
302 user_foreground = num;
303 if (c == 'F')
304 user_reverse_fg = num;
305 if (c == 'g') {
306 if (num >= 0 && num <= 4)
307 user_font = num;
308 }
309 if (c == 'h')
310 user_screen_height = num;
311 if (c == 'i')
312 f_setup.ignore_errors = 1;
313 if (c == 'l')
314 f_setup.left_margin = num;
315 if (c == 'o')
316 f_setup.object_movement = 1;
317 if (c == 'O')
318 f_setup.object_locating = 1;
319 if (c == 'p')
320 f_setup.piracy = 1;
321 if (c == 'q')
322 f_setup.quiet = 1;
323 if (c == 'r')
324 f_setup.right_margin = num;
325 if (c == 'R')
326 f_setup.restricted_path = strdup(zoptarg);
327 if (c == 's')
328 user_random_seed = num;
329 if (c == 'S')
330 f_setup.script_cols = num;
331 if (c == 't')
332 user_tandy_bit = 1;
333 if (c == 'u')
334 f_setup.undo_slots = num;
335 if (c == 'v') {
336 printf("FROTZ V%s - MSDOS / PCDOS Edition\n", VERSION);
337 printf("Commit date: %s\n", GIT_DATE);
338 printf("Git commit: %s\n", GIT_HASH);
339 printf("Notes: %s\n", RELEASE_NOTES);
340 printf(" Frotz was originally written by Stefan Jokisch.\n");
341 printf(" It complies with standard 1.0 of Graham Nelson's specification.\n");
342 printf(" It was ported to Unix by Galen Hazelwood.\n");
343 printf(" The core and DOS port are maintained by David Griffith.\n");
344 printf(" Frotz's homepage is https://661.org/proj/if/frotz/\n");
345 exit(0);
346 }
347 if (c == 'w')
348 user_screen_width = num;
349 if (c == 'x')
350 f_setup.expand_abbreviations = 1;
351 if (c == 'Z') {
352 if (num >= ERR_REPORT_NEVER && num <= ERR_REPORT_FATAL)
353 f_setup.err_report_mode = num;
354 }
355 if (c == '?')
356 zoptind = argc;
357 } while (c != EOF && c != '?');
358
359 } /* parse_options */
360
361 static char *malloc_filename(char *story_name, char *extension)
362 {
363 int length = strlen(story_name) + strlen(extension) + 2;
364 char *filename = malloc(length);
365 if (filename) {
366 strcpy(filename, story_name);
367 strcat(filename, ".");
368 strcat(filename, extension);
369 }
370 return filename;
371 }
372
373 /*
374 * os_process_arguments
375 *
376 * Handle command line switches. Some variables may be set to activate
377 * special features of Frotz:
378 *
379 * option_attribute_assignment
380 * option_attribute_testing
381 * option_context_lines
382 * option_object_locating
383 * option_object_movement
384 * option_left_margin
385 * option_right_margin
386 * option_ignore_errors
387 * option_piracy
388 * option_undo_slots
389 * option_expand_abbreviations
390 * option_script_cols
391 *
392 * The global pointer "story_name" is set to the story file name.
393 *
394 */
395 void os_process_arguments(int argc, char *argv[])
396 {
397 const char *p;
398 int i;
399 char stripped_story_name[10];
400
401 /* Parse command line options */
402 parse_options(argc, argv);
403
404 if (zoptind != argc - 1) {
405 printf("FROTZ V%s - MSDOS / PCDOS Edition. ", VERSION);
406 #ifndef NO_SOUND
407 printf("Audio output enabled.\n");
408 #else
409 printf("Audio output disabled.\n");
410 #endif
411 puts(INFORMATION);
412 puts(INFO2);
413 exit(EXIT_SUCCESS);
414 }
415
416 /* Set the story file name */
417 f_setup.story_file = strdup(argv[zoptind]);
418
419 /* Strip path and extension off the story file name */
420 p = strdup(f_setup.story_file);
421
422 for (i = 0; f_setup.story_file[i] != 0; i++)
423 if (f_setup.story_file[i] == '\\'
424 || f_setup.story_file[i] == '/'
425 || f_setup.story_file[i] == ':')
426 p = f_setup.story_file + i + 1;
427
428 for (i = 0; p[i] != 0 && p[i] != '.'; i++)
429 stripped_story_name[i] = p[i];
430 stripped_story_name[i] = 0;
431 f_setup.story_name = strdup(stripped_story_name);
432
433 /* Create nice default file names */
434 f_setup.script_name = malloc_filename(f_setup.story_name, "scr");
435 f_setup.command_name = malloc_filename(f_setup.story_name, "rec");
436 f_setup.save_name = malloc_filename(f_setup.story_name, "sav");
437 f_setup.aux_name = malloc_filename(f_setup.story_name, "aux");
438
439 /* Save the executable file name */
440 progname = argv[0];
441 } /* os_process_arguments */
442
443
444 /*
445 * standard_palette
446 *
447 * Set palette registers to EGA default values and call VGA BIOS to
448 * use DAC registers #0 to #63.
449 *
450 */
451 static void standard_palette(void)
452 {
453
454 static byte palette[] = {
455 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
456 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
457 0x00 /* last one is the overscan register */
458 };
459
460 #ifdef __WATCOMC__
461 if (display == _AMIGA_) {
462 bios_video_ax_esdx_bh(0x1002, palette, 0);
463 bios_video_ax_bx(0x1013, 0x0001);
464 }
465 #else
466 if (display == _AMIGA_) {
467 asm mov ax, 0x1002
468 asm lea dx, palette
469 asm push ds
470 asm pop es
471 asm int 0x10
472 asm mov ax, 0x1013
473 asm mov bx, 0x0001
474 asm int 0x10
475 }
476 #endif
477 } /* standard_palette */
478
479
480 /*
481 * special_palette
482 *
483 * Set palette register #i to value i and call VGA BIOS to use DAC
484 * registers #64 to #127.
485 *
486 */ static void special_palette(void)
487 {
488
489 static byte palette[] = {
490 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
491 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
492 0x00 /* last one is the overscan register */
493 };
494
495 #ifdef __WATCOMC__
496 if (display == _AMIGA_) {
497 bios_video_ax_esdx_bh(0x1002, palette, 0);
498 bios_video_ax_bx(0x1013, 0x0101);
499 }
500 #else
501 if (display == _AMIGA_) {
502 asm mov ax, 0x1002
503 asm mov dx, offset palette
504 asm push ds
505 asm pop es
506 asm int 0x10
507 asm mov ax, 0x1013
508 asm mov bx, 0x0101
509 asm int 0x10
510 }
511 #endif
512 } /* special_palette */
513
514
515 /*
516 * os_init_screen
517 *
518 * Initialise the IO interface. Prepare the screen and other devices
519 * (mouse, sound board). Set various OS depending story file header
520 * entries:
521 *
522 * z_header.config (aka flags 1)
523 * z_header.flags (aka flags 2)
524 * z_header.screen_cols (aka screen width in characters)
525 * z_header.screen_rows (aka screen height in lines)
526 * z_header.screen_width
527 * z_header.screen_height
528 * z_header.font_height (defaults to 1)
529 * z_header.font_width (defaults to 1)
530 * z_header.default_foreground
531 * z_header.default_background
532 * z_header.interpreter_number
533 * z_header.interpreter_version
534 * z_header.user_name (optional; not used by any game)
535 *
536 * Finally, set reserve_mem to the amount of memory (in bytes) that
537 * should not be used for multiple undo and reserved for later use.
538 *
539 */ void os_init_screen(void)
540 {
541 static byte zcolour[] = {
542 BLACK_COLOUR,
543 BLUE_COLOUR,
544 GREEN_COLOUR,
545 CYAN_COLOUR,
546 RED_COLOUR,
547 MAGENTA_COLOUR,
548 BROWN + 16,
549 LIGHTGRAY + 16,
550 GREY_COLOUR,
551 LIGHTBLUE + 16,
552 LIGHTGREEN + 16,
553 LIGHTCYAN + 16,
554 LIGHTRED + 16,
555 LIGHTMAGENTA + 16,
556 YELLOW_COLOUR,
557 WHITE_COLOUR
558 };
559
560 static struct { /* information on modes 0 to 5 */
561 byte vmode;
562 word width;
563 word height;
564 byte font_width;
565 byte font_height;
566 byte fg;
567 byte bg;
568 } info[] = {
569 {0x07, 80, 25, 1, 1, LIGHTGRAY + 16, BLACK_COLOUR}, /* MONO */
570 {0x03, 80, 25, 1, 1, LIGHTGRAY + 16, BLUE_COLOUR}, /* TEXT */
571 {0x06, 640, 200, 8, 8, WHITE_COLOUR, BLACK_COLOUR}, /* CGA */
572 {0x13, 320, 200, 5, 8, WHITE_COLOUR, GREY_COLOUR}, /* MCGA */
573 {0x0e, 640, 200, 8, 8, WHITE_COLOUR, BLUE_COLOUR}, /* EGA */
574 {0x12, 640, 400, 8, 16, WHITE_COLOUR, BLACK_COLOUR} /* AMIGA */
575 };
576
577 static struct { /* information on modes A to E */
578 word vesamode;
579 word width;
580 word height;
581 } subinfo[] = {
582 {0x001, 40, 25},
583 {0x109, 132, 25},
584 {0x10b, 132, 50},
585 {0x108, 80, 60},
586 {0x10c, 132, 60}
587 };
588
589 int subdisplay;
590
591 /* Get the current video mode. This video mode will be selected
592 when the program terminates. It's also useful to auto-detect
593 monochrome boards. */
594
595 #ifdef __WATCOMC__
596 old_video_mode = (byte)bios_video_ah(0x0f);
597 #else
598 asm mov ah, 15
599 asm int 0x10
600 asm mov old_video_mode, al
601 #endif
602
603 /* If the display mode has not already been set by the user then see
604 if this is a monochrome board. If so, set the display mode to 0.
605 Otherwise check the graphics flag of the story. Select a graphic
606 mode if it is set or if this is a V6 game. Select text mode if it
607 is not. */
608 if (display == -1) {
609 if (old_video_mode == 7)
610 display = '0';
611 else if (z_header.version == V6 || (z_header.flags & GRAPHICS_FLAG))
612 display = '5';
613 else
614 display = '1';
615 }
616
617 /* Activate the desired display mode. All VESA text modes are very
618 similar to the standard text mode; in fact, only here we need to
619 know which VESA mode is used. */
620 if (display >= '0' && display <= '5') {
621 subdisplay = -1;
622 display -= '0';
623 #ifdef __WATCOMC__
624 bios_video_ax((word)info[display].vmode);
625 #else
626 _AL = info[display].vmode;
627 _AH = 0;
628 #endif
629 } else if (display == 'a') {
630 subdisplay = 0;
631 display = 1;
632 #ifdef __WATCOMC__
633 bios_video_ax(0x0001);
634 #else
635 _AL = 0x01;
636 _AH = 0;
637 #endif
638 } else if (display >= 'b' && display <= 'e') {
639 subdisplay = display - 'a';
640 display = 1;
641 #ifdef __WATCOMC__
642 bios_video_ax_bx(0x4f02, subinfo[subdisplay].vesamode);
643 #else
644 _BX = subinfo[subdisplay].vesamode;
645 _AX = 0x4f02;
646 #endif
647 }
648
649 #ifndef __WATCOMC__
650 geninterrupt(0x10);
651 #endif
652 load_fonts();
653
654 /* Make various preparations */
655 if (display <= _TEXT_) {
656
657 #ifdef __WATCOMC__
658 /* Enable bright background colours */
659 bios_video_ax_bl(0x1003, 0);
660 /* Turn off hardware cursor */
661 bios_video_ah_cx(1, 0xffff);
662 #else
663 /* Enable bright background colours */
664 asm mov ax, 0x1003
665 asm mov bl, 0
666 asm int 0x10
667 /* Turn off hardware cursor */
668 asm mov ah, 1
669 asm mov cx, 0xffff
670 asm int 0x10
671 #endif
672 } else {
673 if (display == _AMIGA_) {
674 scaler = 2;
675
676 /* Use resolution 640 x 400 instead of 640 x 480.
677 BIOS doesn't help us here since this is not a
678 standard resolution. */
679
680 outportb(0x03c2, 0x63);
681 outport(0x03d4, 0x0e11);
682 outport(0x03d4, 0xbf06);
683 outport(0x03d4, 0x1f07);
684 outport(0x03d4, 0x9c10);
685 outport(0x03d4, 0x8f12);
686 outport(0x03d4, 0x9615);
687 outport(0x03d4, 0xb916);
688 }
689
690 }
691 #if !defined(__SMALL__) && !defined (__TINY__) && !defined (__MEDIUM__)
692 /* Set the amount of memory to reserve for later use. It takes
693 some memory to open command, script and game files. If Frotz
694 is compiled in a small memory model then memory for opening
695 files is allocated on the "near heap" while other allocations
696 are made on the "far heap", i.e. we need not reserve memory
697 in this case. */ reserve_mem = 4 * BUFSIZ;
698
699 #endif
700
701 /* Amiga emulation under V6 needs special preparation. */
702 if (display == _AMIGA_ && z_header.version == V6) {
703 user_reverse_fg = -1;
704 user_reverse_bg = -1;
705 zcolour[LIGHTGRAY] = LIGHTGREY_COLOUR;
706 zcolour[DARKGRAY] = DARKGREY_COLOUR;
707
708 special_palette();
709 }
710
711 /* Set various bits in the configuration byte. These bits tell
712 the game which features are supported by the interpreter. */
713 if (z_header.version == V3 && user_tandy_bit != -1)
714 z_header.config |= CONFIG_TANDY;
715 if (z_header.version == V3)
716 z_header.config |= CONFIG_SPLITSCREEN;
717 if (z_header.version == V3
718 && (display == _MCGA_ || (display == _AMIGA_ && user_font != 0)))
719 z_header.config |= CONFIG_PROPORTIONAL;
720 if (z_header.version >= V4 && display != _MCGA_
721 && (user_bold_typing != -1 || display <= _TEXT_))
722 z_header.config |= CONFIG_BOLDFACE;
723 if (z_header.version >= V4)
724 z_header.config |= CONFIG_EMPHASIS | CONFIG_FIXED | CONFIG_TIMEDINPUT;
725 if (z_header.version >= V5 && display != _MONO_ && display != _CGA_)
726 z_header.config |= CONFIG_COLOUR;
727 if (z_header.version >= V5 && display >= _CGA_ && init_pictures())
728 z_header.config |= CONFIG_PICTURES;
729
730 /* Handle various game flags. These flags are set if the game wants
731 to use certain features. The flags must be cleared if the feature
732 is not available. */
733 if (z_header.flags & GRAPHICS_FLAG)
734 if (display <= _TEXT_)
735 z_header.flags &= ~GRAPHICS_FLAG;
736 if (z_header.version == V3 && (z_header.flags & OLD_SOUND_FLAG))
737 #ifdef NO_SOUND
738 if (!dos_init_sound())
739 #endif
740 z_header.flags &= ~OLD_SOUND_FLAG;
741 if (z_header.flags & SOUND_FLAG)
742 #ifdef NO_SOUND
743 if (!dos_init_sound())
744 #endif
745 z_header.flags &= ~SOUND_FLAG;
746 if (z_header.version >= V5 && (z_header.flags & UNDO_FLAG))
747 if (!f_setup.undo_slots)
748 z_header.flags &= ~UNDO_FLAG;
749 if (z_header.flags & MOUSE_FLAG)
750 if (subdisplay != -1 || !detect_mouse())
751 z_header.flags &= ~MOUSE_FLAG;
752 if (z_header.flags & COLOUR_FLAG)
753 if (display == _MONO_ || display == _CGA_)
754 z_header.flags &= ~COLOUR_FLAG;
755 z_header.flags &= ~MENU_FLAG;
756
757 /* Set the screen dimensions, font size and default colour */
758 z_header.screen_width = info[display].width;
759 z_header.screen_height = info[display].height;
760 z_header.font_height = info[display].font_height;
761 z_header.font_width = info[display].font_width;
762 z_header.default_foreground = info[display].fg;
763 z_header.default_background = info[display].bg;
764
765 if (subdisplay != -1) {
766 z_header.screen_width = subinfo[subdisplay].width;
767 z_header.screen_height = subinfo[subdisplay].height;
768 }
769
770 if (user_screen_width != -1)
771 z_header.screen_width = user_screen_width;
772 if (user_screen_height != -1)
773 z_header.screen_height = user_screen_height;
774
775 z_header.screen_cols = z_header.screen_width / z_header.font_width;
776 z_header.screen_rows = z_header.screen_height / z_header.font_height;
777
778 if (user_foreground != -1)
779 z_header.default_foreground = zcolour[user_foreground];
780 if (user_background != -1)
781 z_header.default_background = zcolour[user_background];
782
783 /* Set the interpreter number (a constant telling the game which
784 operating system it runs on) and the interpreter version. The
785 interpreter number has effect on V6 games and "Beyond Zork". */
786 z_header.interpreter_number = INTERP_MSDOS;
787 z_header.interpreter_version = 'F';
788
789 if (display == _AMIGA_)
790 z_header.interpreter_number = INTERP_AMIGA;
791
792 /* Install the fast_exit routine to handle the ctrl-break key */
793 oldvect = getvect(0x1b);
794 setvect(0x1b, fast_exit);
795 } /* os_init_screen */
796
797
798 /*
799 * os_reset_screen
800 *
801 * Reset the screen before the program stops.
802 *
803 */
804 void os_reset_screen(void)
805 {
806 os_set_font(TEXT_FONT);
807 os_set_text_style(0);
808 os_display_string((zchar *) "[Hit any key to exit.]");
809 os_read_key(0, TRUE);
810
811 cleanup();
812 } /* os_reset_screen */
813
814
815 /*
816 * os_restart_game
817 *
818 * This routine allows the interface to interfere with the process of
819 * restarting a game at various stages:
820 *
821 * RESTART_BEGIN - restart has just begun
822 * RESTART_WPROP_SET - window properties have been initialised
823 * RESTART_END - restart is complete
824 *
825 */
826 void os_restart_game(int stage)
827 {
828 int x, y;
829
830 if (story_id == BEYOND_ZORK) {
831 if (stage == RESTART_BEGIN) {
832 if ((display == _MCGA_ || display == _AMIGA_)
833 && os_picture_data(1, &x, &y)) {
834
835 special_palette();
836 #ifdef __WATCOMC__
837 bios_video_ax_bx_dh_ch_cl(0x1010, 64, 0, 0, 0);
838 bios_video_ax_bx_dh_ch_cl(0x1010, 79,
839 0xff, 0xff, 0xff);
840 #else asm mov ax, 0x1010
841 asm mov bx, 64
842 asm mov dh, 0
843 asm mov ch, 0
844 asm mov cl, 0
845 asm int 0x10
846 asm mov ax, 0x1010
847 asm mov bx, 79
848 asm mov dh, 0xff
849 asm mov ch, 0xff
850 asm mov cl, 0xff
851 asm int 0x10
852 #endif
853
854 os_draw_picture(1, 1, 1);
855 os_read_key(0, FALSE);
856
857 standard_palette();
858 }
859 }
860 }
861 } /* os_restart_game */
862
863
864 /*
865 * os_random_seed
866 *
867 * Return an appropriate random seed value in the range from 0 to
868 * 32767, possibly by using the current system time.
869 *
870 */
871 int os_random_seed(void)
872 {
873 if (user_random_seed == -1) {
874 /* Use the time of day as seed value */
875 #ifdef __WATCOMC__
876 return (int)bios_time_ah(0) & 0x7fff;
877 #else
878 asm mov ah, 0
879 asm int 0x1a
880 return _DX & 0x7fff;
881 #endif
882 } else
883 return user_random_seed;
884 } /* os_random_seed */
885
886
887 /*
888 * os_path_open
889 *
890 * Open a file in the current directory. If this fails then
891 * search the directories in the ZCODE_PATH environment variable,
892 * if it is defined, otherwise search INFOCOM_PATH.
893 *
894 */
895 FILE *os_path_open(const char *name, const char *mode)
896 {
897 FILE *fp;
898 char buf[MAX_FILE_NAME + 1];
899 char *p, *bp, lastch;
900
901 if ((fp = fopen(name, mode)) != NULL)
902 return fp;
903 if ((p = getenv("ZCODE_PATH")) == NULL)
904 p = getenv("INFOCOM_PATH");
905 if (p != NULL) {
906 while (*p) {
907 bp = buf;
908 while (*p && *p != OS_PATHSEP)
909 lastch = *bp++ = *p++;
910 if (lastch != '\\' && lastch != '/')
911 *bp++ = '\\';
912 strcpy(bp, name);
913 if ((fp = fopen(buf, mode)) != NULL)
914 return fp;
915 if (*p)
916 p++;
917 }
918 }
919 return NULL;
920 } /* os_path_open */
921
922
923 /*
924 * os_load_story
925 *
926 * This is different from os_path_open() because we need to see if the
927 * story file is actually a chunk inside a blorb file. Right now we're
928 * looking only at the exact path we're given on the command line.
929 *
930 * Open a file in the current directory. If this fails, then search the
931 * directories in the ZCODE_PATH environmental variable. If that's not
932 * defined, search INFOCOM_PATH.
933 *
934 */
935 FILE *os_load_story(void)
936 {
937 #ifndef NO_BLORB
938 FILE *fp;
939
940 switch (dos_blorb_init(f_setup.story_file)) {
941 case bb_err_NoBlorb:
942 /* printf("No blorb file found.\n\n"); */
943 break;
944 case bb_err_Format:
945 printf("Blorb file loaded, but unable to build map.\n\n");
946 break;
947 case bb_err_NotFound:
948 printf("Blorb file loaded, but lacks executable chunk.\n\n");
949 break;
950 case bb_err_None:
951 /* printf("No blorb errors.\n\n"); */
952 break;
953 }
954
955 fp = fopen(f_setup.story_file, "rb");
956
957 /* Is this a Blorb file containing Zcode? */
958 if (f_setup.exec_in_blorb)
959 fseek(fp, blorb_res.data.startpos, SEEK_SET);
960
961 return fp;
962 #else
963 return fopen(f_setup.story_file, "rb");
964 #endif
965 }
966
967
968 /*
969 * Seek into a storyfile, either a standalone file or the
970 * ZCODE chunk of a blorb file
971 */
972 int os_storyfile_seek(FILE * fp, long offset, int whence)
973 {
974 #ifndef NO_BLORB
975 /* Is this a Blorb file containing Zcode? */
976 if (f_setup.exec_in_blorb) {
977 switch (whence) {
978 case SEEK_END:
979 return fseek(fp, blorb_res.data.startpos + blorb_res.length + offset, SEEK_SET);
980 break;
981 case SEEK_CUR:
982 return fseek(fp, offset, SEEK_CUR);
983 break;
984 case SEEK_SET:
985 /* SEEK_SET falls through to default */
986 default:
987 return fseek(fp, blorb_res.data.startpos + offset, SEEK_SET);
988 break;
989 }
990 }
991 #endif
992 return fseek(fp, offset, whence);
993 }
994
995
996 /*
997 * Tell the position in a storyfile, either a standalone file
998 * or the ZCODE chunk of a blorb file
999 */
1000 int os_storyfile_tell(FILE * fp)
1001 {
1002 #ifndef NO_BLORB
1003 /* Is this a Blorb file containing Zcode? */
1004 if (f_setup.exec_in_blorb)
1005 return ftell(fp) - blorb_res.data.startpos;
1006 #endif
1007 return ftell(fp);
1008 }
0 /*
1 * dosinput.c - DOS interface, input functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <bios.h>
22
23 #ifdef __WATCOMC__
24 #include <io.h>
25 #endif
26
27 #include <string.h>
28 #include <stdio.h>
29 #include "frotz.h"
30 #include "dosfrotz.h"
31
32 #ifndef HISTORY_BUFSIZE
33 #define HISTORY_BUFSIZE 500
34 #endif
35
36 extern bool is_terminator (zchar);
37
38 extern bool read_yes_or_no (const char *);
39 extern void read_string (int, zchar *);
40
41 extern int completion (const zchar *, zchar *);
42
43 extern bool at_keybrd;
44
45 static long limit = 0;
46
47 static struct {
48 zchar buffer[HISTORY_BUFSIZE];
49 int latest;
50 int current;
51 int prefix_len;
52 } history;
53
54 static struct {
55 zchar *buffer;
56 int pos;
57 int length;
58 int max_length;
59 int width;
60 int max_width;
61 } input;
62
63 static bool overwrite = FALSE;
64
65 volatile int end_of_sound_flag;
66
67 /*
68 * swap_colours
69 *
70 * This is a small helper function for switch_cursor. It swaps the
71 * current background and foreground colours.
72 *
73 */
74 static void swap_colours(void)
75 {
76 byte temp;
77
78 temp = text_fg;
79 text_fg = text_bg;
80 text_bg = temp;
81
82 } /* swap_colours */
83
84
85 /*
86 * switch_cursor
87 *
88 * Turn cursor on/off. If there is mouse support then turn the mouse
89 * pointer on/off as well. The cursor should not be moved and the
90 * contents of the screen should not be changed while the cursor is
91 * visible (because of the primitive cursor emulation we use here).
92 *
93 */
94 static void switch_cursor(bool cursor)
95 {
96 if (display <= _TEXT_) {
97 /* Use hardware cursor in text mode */
98 #ifdef __WATCOMC__
99 word shape;
100 if (display == _MONO_)
101 shape = overwrite ? 0x080f : 0x0a0b;
102 else
103 shape = overwrite ? 0x0408 : 0x0506;
104
105 if (!cursor)
106 shape = 0xffff;
107
108 bios_video_ah_bh_dh_dl(2, 0, cursor_y, cursor_x);
109 bios_video_ah_cx(1, shape);
110 #else
111 if (display == _MONO_)
112 _CX = overwrite ? 0x080f : 0x0a0b;
113 else
114 _CX = overwrite ? 0x0408 : 0x0506;
115
116 if (!cursor)
117 _CX = 0xffff;
118
119 asm mov ah,2
120 asm mov bh,0
121 asm mov dh,byte ptr cursor_y
122 asm mov dl,byte ptr cursor_x
123 asm int 0x10
124 asm mov ah,1
125 asm int 0x10
126 #endif
127 } else {
128 int saved_x = cursor_x;
129
130 if (cursor)
131 swap_colours();
132
133 if (input.pos < input.length)
134 os_display_char(input.buffer[input.pos]);
135 else
136 os_display_char(' ');
137
138 if (cursor)
139 swap_colours();
140
141 cursor_x = saved_x;
142 }
143 } /* switch_cursor */
144
145
146 /*
147 * get_current_time
148 *
149 * Return the current system time in 1/10 seconds.
150 *
151 */
152 static long get_current_time(void)
153 {
154 long time;
155
156 /* Get the current time of day measured in
157 * 65536 / 1,193,180 = 0.054925493
158 * seconds. Multiply this value with
159 * 959 / 1746 = 0.54925544
160 * to get the current time in 0.1 seconds.
161 */
162 #ifdef __WATCOMC__
163 time = bios_time_ah(0);
164 #else
165 asm mov ah,0
166 asm int 0x1a
167 asm mov word ptr time,dx
168 asm mov word ptr time + 2,cx
169 #endif
170 return time * 959 / 1746;
171 } /* get_current_time */
172
173
174 /*
175 * set_timer
176 *
177 * Set a time limit of timeout/10 seconds if timeout is not zero;
178 * otherwise clear the time limit.
179 *
180 */
181 static void set_timer(int timeout)
182 {
183 limit = (timeout != 0) ? get_current_time () + timeout : 0;
184 } /* set_timer */
185
186
187 /*
188 * time_limit_hit
189 *
190 * Return true if a previously set time limit has been exceeded.
191 *
192 */
193 static bool out_of_time(void)
194 {
195 if (limit != 0) {
196 long now = get_current_time ();
197
198 if (now < 1L * 3600 * 10 && limit > 23L * 3600 * 10)
199 now += 24L * 3600 * 10;
200
201 return now >= limit;
202 } else
203 return FALSE;
204
205 } /* out_of_time */
206
207
208 /*
209 * get_key
210 *
211 * Read a keypress or a mouse click. Returns...
212 *
213 * ZC_TIME_OUT = time limit exceeded,
214 * ZC_BACKSPACE = the backspace key,
215 * ZC_RETURN = the return key,
216 * ZC_HKEY_MIN...ZC_HKEY_MAX = a hot key,
217 * ZC_ESCAPE = the escape key,
218 * ZC_ASCII_MIN...ZC_ASCII_MAX = ASCII character,
219 * ZC_ARROW_MIN...ZC_ARROW_MAX = an arrow key,
220 * ZC_FKEY_MIN...ZC_FKEY_MAX = a function key,
221 * ZC_NUMPAD_MIN...ZC_NUMPAD_MAX = a number pad key,
222 * ZC_SINGLE_CLICK = single mouse click,
223 * ZC_DOUBLE_CLICK = double mouse click,
224 * ZC_LATIN1_MIN+1...ZC_LATIN1_MAX = ISO Latin-1 character,
225 * SPECIAL_KEY_MIN...SPECIAL_KEY_MAX = a special editing key.
226 *
227 */
228 static int get_key(bool cursor)
229 {
230 static byte arrow_key_map[] = {0x48, 0x50, 0x4b, 0x4d};
231 static byte special_key_map[] = {0x47, 0x4f, 0x73, 0x74, 0x53,
232 0x52, 0x49, 0x51, 0x0f};
233 static byte hot_key_map[] = {0x13, 0x19, 0x1f, 0x16,
234 0x31, 0x2d, 0x20, 0x23};
235 static byte function_key_map[] = {0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
236 0x41, 0x42, 0x43, 0x44, 0x85, 0x86};
237
238 int key;
239
240 /* Loop until a key was pressed */
241 if (cursor)
242 switch_cursor(TRUE);
243
244 #ifdef __WATCOMC__
245 if (z_header.flags & MOUSE_FLAG)
246 dos_mouse_ax(1);
247 #else
248 if (z_header.flags & MOUSE_FLAG) {
249 asm mov ax,1
250 asm int 0x33
251 }
252 #endif
253 do {
254
255 #ifndef NO_SOUND
256 if (end_of_sound_flag)
257 end_of_sound();
258 #endif
259
260 if (_bios_keybrd(at_keybrd ? _NKEYBRD_READY : _KEYBRD_READY)) {
261 word code = _bios_keybrd(at_keybrd ? _NKEYBRD_READ : _KEYBRD_READ);
262 byte code0 = code;
263 byte code1 = code >> 8;
264
265 if (code0 != 0 && code0 != 9 && code0 != 0xe0) {
266 key = code0 - '0' + ZC_NUMPAD_MIN;
267 if (key >= ZC_NUMPAD_MIN && key <= ZC_NUMPAD_MAX && code1 >= 0x10)
268 goto exit_loop;
269
270 for (key = ZC_LATIN1_MIN + 1; key <= ZC_LATIN1_MAX; key++) {
271 if (code0 == latin1_to_ibm[key - ZC_LATIN1_MIN])
272 goto exit_loop;
273 }
274 key = code0;
275
276 if (key == ZC_BACKSPACE)
277 goto exit_loop;
278 if (key == ZC_RETURN)
279 goto exit_loop;
280 if (key == ZC_ESCAPE)
281 goto exit_loop;
282 if (key >= ZC_ASCII_MIN && key <= ZC_ASCII_MAX)
283 goto exit_loop;
284 } else {
285 for (key = ZC_ARROW_MIN; key <= ZC_ARROW_MAX; key++) {
286 if (code1 == arrow_key_map[key - ZC_ARROW_MIN])
287 goto exit_loop;
288 }
289
290 for (key = ZC_FKEY_MIN; key <= ZC_FKEY_MAX; key++) {
291 if (code1 == function_key_map[key - ZC_FKEY_MIN])
292 goto exit_loop;
293 }
294
295 for (key = ZC_HKEY_MIN; key <= ZC_HKEY_MAX; key++) {
296 if (code1 == hot_key_map[key - ZC_HKEY_MIN])
297 goto exit_loop;
298 }
299
300 for (key = SPECIAL_KEY_MIN; key <= SPECIAL_KEY_MAX; key++) {
301 if (code1 == special_key_map[key - SPECIAL_KEY_MIN])
302 goto exit_loop;
303 }
304 }
305 } else {
306 int clicks = read_mouse ();
307
308 if (clicks == 1) {
309 key = ZC_SINGLE_CLICK;
310 goto exit_loop;
311 }
312 if (clicks == 2) {
313 key = ZC_DOUBLE_CLICK;
314 goto exit_loop;
315 }
316 }
317
318 key = ZC_TIME_OUT;
319 } while (!out_of_time());
320
321 exit_loop:
322
323 #ifdef __WATCOMC__
324 if (z_header.flags & MOUSE_FLAG)
325 dos_mouse_ax(2);
326 #else
327 if (z_header.flags & MOUSE_FLAG) {
328 asm mov ax,2
329 asm int 0x33
330 }
331 #endif
332 if (cursor)
333 switch_cursor(FALSE);
334
335 return key;
336 } /* get_key */
337
338
339 /*
340 * cursor_left
341 *
342 * Move the cursor one character to the left.
343 *
344 */
345 static void cursor_left(void)
346 {
347 if (input.pos > 0)
348 cursor_x -= os_char_width(input.buffer[--input.pos]);
349 } /* cursor_left */
350
351
352 /*
353 * cursor_right
354 *
355 * Move the cursor one character to the right.
356 *
357 */
358 static void cursor_right(void)
359 {
360 if (input.pos < input.length)
361 cursor_x += os_char_width(input.buffer[input.pos++]);
362 } /* cursor_right */
363
364
365 /*
366 * first_char
367 *
368 * Move the cursor to the beginning of the input line.
369 *
370 */
371 static void first_char(void)
372 {
373 while (input.pos > 0)
374 cursor_left();
375 } /* first_char */
376
377
378 /*
379 * last_char
380 *
381 * Move the cursor to the end of the input line.
382 *
383 */
384 static void last_char(void)
385 {
386 while (input.pos < input.length)
387 cursor_right();
388
389 } /* last_char */
390
391
392 /*
393 * prev_word
394 *
395 * Move the cursor to the start of the previous word.
396 *
397 */
398 static void prev_word(void)
399 {
400 do {
401 cursor_left();
402 if (input.pos == 0)
403 return;
404 } while (input.buffer[input.pos] == ' ' || input.buffer[input.pos - 1] != ' ');
405 } /* prev_word */
406
407
408 /*
409 * next_word
410 *
411 * Move the cursor to the start of the next word.
412 *
413 */
414 static void next_word(void)
415 {
416 do {
417 cursor_right();
418 if (input.pos == input.length)
419 return;
420 } while (input.buffer[input.pos] == ' ' || input.buffer[input.pos - 1] != ' ');
421 } /* next_word */
422
423
424 /*
425 * input_move
426 *
427 * Helper function to move parts of the input buffer:
428 *
429 * newc != 0, oldc == 0: INSERT
430 * newc != 0, oldc != 0: OVERWRITE
431 * newc == 0, oldc != 0: DELETE
432 * newc == 0, oldc == 0: NO OPERATION
433 *
434 */
435 #define H(x) (x ? 1 : 0)
436 static void input_move(zchar newc, zchar oldc)
437 {
438 int newwidth = (newc != 0) ? os_char_width(newc) : 0;
439 int oldwidth = (oldc != 0) ? os_char_width(oldc) : 0;
440
441 zchar *p = input.buffer + input.pos;
442
443 int saved_x = cursor_x;
444
445 int updated_width = input.width + newwidth - oldwidth;
446 int updated_length = input.length + H (newc) - H (oldc);
447
448 if (updated_width > input.max_width)
449 return;
450 if (updated_length > input.max_length)
451 return;
452
453 input.width = updated_width;
454 input.length = updated_length;
455
456 if (oldc != 0 && newc == 0)
457 memmove(p, p + 1, updated_length - input.pos + 1);
458 if (newc != 0 && oldc == 0)
459 memmove(p + 1, p, updated_length - input.pos);
460
461 if (newc != 0)
462 *p = newc;
463
464 os_display_string(p);
465
466 switch_scrn_attr(TRUE);
467
468 if (oldwidth > newwidth) {
469 os_erase_area (
470 cursor_y + 1,
471 cursor_x + 1,
472 cursor_y + z_header.font_height,
473 cursor_x + oldwidth - newwidth,
474 -1);
475 }
476
477 switch_scrn_attr(FALSE);
478
479 cursor_x = saved_x;
480
481 if (newc != 0)
482 cursor_right();
483 } /* input_move */
484
485 #undef H
486
487 /*
488 * delete_char
489 *
490 * Delete the character below the cursor.
491 *
492 */
493 static void delete_char(void)
494 {
495 input_move (0, input.buffer[input.pos]);
496 } /* delete_char */
497
498
499 /*
500 * delete_left
501 *
502 * Delete the character to the left of the cursor.
503 *
504 */
505 static void delete_left(void)
506 {
507 if (input.pos > 0) {
508 cursor_left();
509 delete_char();
510 }
511 } /* delete_left */
512
513
514 /*
515 * truncate_line
516 *
517 * Truncate the input line to n characters.
518 *
519 */
520 static void truncate_line(int n)
521 {
522 last_char();
523 while (input.length > n)
524 delete_left();
525 } /* truncate_line */
526
527
528 /*
529 * insert_char
530 *
531 * Insert a character into the input buffer.
532 *
533 */
534 static void insert_char(zchar newc)
535 {
536 zchar oldc = 0;
537
538 if (overwrite)
539 oldc = input.buffer[input.pos];
540
541 input_move(newc, oldc);
542 } /* insert_char */
543
544
545 /*
546 * insert_string
547 *
548 * Add a string of characters to the input line.
549 *
550 */
551 static void insert_string(const zchar *s)
552 {
553 while (*s != 0) {
554 if (input.length + 1 > input.max_length)
555 break;
556 if (input.width + os_char_width (*s) > input.max_width)
557 break;
558 insert_char (*s++);
559 }
560 } /* insert_string */
561
562
563 /*
564 * tabulator_key
565 *
566 * Complete the word at the end of the input line, if possible.
567 *
568 */
569 static void tabulator_key(void)
570 {
571 int status;
572
573 if (input.pos == input.length) {
574 zchar extension[10];
575
576 status = completion(input.buffer, extension);
577 insert_string(extension);
578 } else
579 status = 2;
580
581 /* Beep if the completion was impossible or ambiguous */
582 if (status != 0)
583 os_beep(status);
584 } /* tabulator_key */
585
586
587 /*
588 * store_input
589 *
590 * Copy the current input line to the history buffer.
591 *
592 */
593 static void store_input(void)
594 {
595 if (input.length >= HISTORY_MIN_ENTRY) {
596
597 const zchar *ptr = input.buffer;
598
599 do {
600 if (history.latest++ == HISTORY_BUFSIZE - 1)
601 history.latest = 0;
602
603 history.buffer[history.latest] = *ptr;
604
605 } while (*ptr++ != 0);
606 }
607 } /* store_input */
608
609
610 /*
611 * fetch_entry
612 *
613 * Copy the current history entry to the input buffer and check if it
614 * matches the prefix in the input buffer.
615 *
616 */
617 static bool fetch_entry(zchar *buf, int entry)
618 {
619 int i = 0;
620 zchar c;
621
622 do {
623 if (entry++ == HISTORY_BUFSIZE - 1)
624 entry = 0;
625
626 c = history.buffer[entry];
627
628 if (i < history.prefix_len && input.buffer[i] != c)
629 return FALSE;
630
631 buf[i++] = c;
632 } while (c != 0);
633
634 return (i > history.prefix_len) && (i > 1);
635 } /* fetch_entry */
636
637
638 /*
639 * get_prev_entry
640 *
641 * Copy the previous history entry to the input buffer.
642 *
643 */
644 static void get_prev_entry(void)
645 {
646 zchar buf[INPUT_BUFFER_SIZE];
647
648 int i = history.current;
649
650 do {
651 do {
652 if (i-- == 0)
653 i = HISTORY_BUFSIZE - 1;
654
655 if (i == history.latest)
656 return;
657
658 } while (history.buffer[i] != 0);
659
660 } while (!fetch_entry(buf, i));
661
662 truncate_line(history.prefix_len);
663 insert_string(buf + history.prefix_len);
664 history.current = i;
665 } /* get_prev_entry */
666
667
668 /*
669 * get_next_entry
670 *
671 * Copy the next history entry to the input buffer.
672 *
673 */
674 static void get_next_entry(void)
675 {
676 zchar buf[INPUT_BUFFER_SIZE];
677
678 int i = history.current;
679
680 truncate_line(history.prefix_len);
681
682 do {
683 do {
684 if (i == history.latest)
685 return;
686
687 if (i++ == HISTORY_BUFSIZE - 1)
688 i = 0;
689 } while (history.buffer[i] != 0);
690 if (i == history.latest)
691 goto no_further;
692 } while (!fetch_entry (buf, i));
693
694 insert_string(buf + history.prefix_len);
695
696 no_further:
697 history.current = i;
698
699 } /* get_next_entry */
700
701
702 /*
703 * os_read_line
704 *
705 * Read a line of input from the keyboard into a buffer. The buffer
706 * may already be primed with some text. In this case, the "initial"
707 * text is already displayed on the screen. After the input action
708 * is complete, the function returns with the terminating key value.
709 * The length of the input should not exceed "max" characters plus
710 * an extra 0 terminator.
711 *
712 * Terminating keys are the return key (13) and all function keys
713 * (see the Specification of the Z-machine) which are accepted by
714 * the is_terminator function. Mouse clicks behave like function
715 * keys except that the mouse position is stored in global variables
716 * "mouse_x" and "mouse_y" (top left coordinates are (1,1)).
717 *
718 * Furthermore, Frotz introduces some special terminating keys:
719 *
720 * ZC_HKEY_PLAYBACK (Alt-P)
721 * ZC_HKEY_RECORD (Alt-R)
722 * ZC_HKEY_SEED (Alt-S)
723 * ZC_HKEY_UNDO (Alt-U)
724 * ZC_HKEY_RESTART (Alt-N, "new game")
725 * ZC_HKEY_QUIT (Alt-X, "exit game")
726 * ZC_HKEY_DEBUGGING (Alt-D)
727 * ZC_HKEY_HELP (Alt-H)
728 *
729 * If the timeout argument is not zero, the input gets interrupted
730 * after timeout/10 seconds (and the return value is 0).
731 *
732 * The complete input line including the cursor must fit in "width"
733 * screen units.
734 *
735 * The function may be called once again to continue after timeouts,
736 * misplaced mouse clicks or hot keys. In this case the "continued"
737 * flag will be set. This information can be useful if the interface
738 * implements input line history.
739 *
740 * The screen is not scrolled after the return key was pressed. The
741 * cursor is at the end of the input line when the function returns.
742 *
743 * Since Inform 2.2 the helper function "completion" can be called
744 * to implement word completion (similar to tcsh under Unix).
745 *
746 */
747
748 #define new_history_search() \
749 { history.prefix_len = input.pos; history.current = history.latest; }
750
751 zchar os_read_line(int max, zchar *buf, int timeout, int width, int continued)
752 {
753 int key = continued ? 9999 : 0;
754
755 /* Initialise input variables */
756 input.buffer = buf;
757 input.pos = strlen((char *) buf);
758 input.length = strlen((char *) buf);
759 input.max_length = max;
760 input.width = os_string_width(buf);
761 input.max_width = width - os_char_width(' ');
762
763 /* Calculate time limit */
764 set_timer (timeout);
765
766 /* Loop until a terminator is found */
767 do {
768 if (key != 9999)
769 new_history_search();
770
771 /* Get next key from mouse or keyboard */
772 key = get_key (TRUE);
773
774 if (key < ZC_ASCII_MIN || key > ZC_ASCII_MAX && key < ZC_LATIN1_MIN || key > ZC_LATIN1_MAX) {
775 /* Ignore time-outs if the cursor is not at end of the line */
776 if (key == ZC_TIME_OUT && input.pos < input.length)
777 key = 9999;
778
779 /* Backspace, return and escape keys */
780 if (key == ZC_BACKSPACE)
781 delete_left();
782 if (key == ZC_RETURN)
783 store_input();
784 if (key == ZC_ESCAPE)
785 truncate_line(0);
786
787 /* Editing keys */
788 if (cwin == 0) {
789 if (key == ZC_ARROW_UP)
790 get_prev_entry();
791 if (key == ZC_ARROW_DOWN)
792 get_next_entry();
793 if (key == ZC_ARROW_LEFT)
794 cursor_left();
795 if (key == ZC_ARROW_RIGHT)
796 cursor_right();
797 if (key >= ZC_ARROW_MIN && key <= ZC_ARROW_MAX)
798 key = 9999;
799 if (key == SPECIAL_KEY_HOME)
800 first_char();
801 if (key == SPECIAL_KEY_END)
802 last_char();
803 if (key == SPECIAL_KEY_WORD_LEFT)
804 prev_word();
805 if (key == SPECIAL_KEY_WORD_RIGHT)
806 next_word();
807 if (key == SPECIAL_KEY_DELETE)
808 delete_char();
809 if (key == SPECIAL_KEY_INSERT)
810 overwrite = !overwrite;
811 if (key == SPECIAL_KEY_TAB)
812 tabulator_key();
813 }
814 if (key == SPECIAL_KEY_PAGE_UP)
815 key = ZC_ARROW_UP;
816 if (key == SPECIAL_KEY_PAGE_DOWN)
817 key = ZC_ARROW_DOWN;
818 } else
819 insert_char(key);
820 } while (key > 0xff || !is_terminator(key));
821
822 last_char();
823
824 overwrite = FALSE;
825
826 /* Return terminating key */
827 return key;
828 } /* os_read_line */
829
830 #ifdef __WATCOMC__
831 #undef new_history_search
832 #else
833 #undef new_history_search()
834 #endif
835
836 /*
837 * os_read_key
838 *
839 * Read a single character from the keyboard (or a mouse click) and
840 * return it. Input aborts after timeout/10 seconds.
841 *
842 */
843 zchar os_read_key(int timeout, bool cursor)
844 {
845 int key;
846
847 set_timer(timeout);
848
849 do {
850 key = get_key(cursor);
851 } while (key > 0xff);
852
853 return key;
854 } /* os_read_key */
855
856
857 /*
858 * os_read_file_name
859 *
860 * Return the name of a file. Flag can be one of:
861 *
862 * FILE_SAVE - Save game file
863 * FILE_RESTORE - Restore game file
864 * FILE_SCRIPT - Transscript file
865 * FILE_RECORD - Command file for recording
866 * FILE_PLAYBACK - Command file for playback
867 * FILE_SAVE_AUX - Save auxilary ("preferred settings") file
868 * FILE_LOAD_AUX - Load auxilary ("preferred settings") file
869 *
870 * The length of the file name is limited by MAX_FILE_NAME. Ideally
871 * an interpreter should open a file requester to ask for the file
872 * name. If it is unable to do that then this function should call
873 * print_string and read_string to ask for a file name.
874 *
875 */
876
877 char *os_read_file_name (const char *default_name, int flag)
878 {
879 char *extension;
880 FILE *fp;
881 bool terminal;
882 bool result;
883
884 bool saved_replay = istream_replay;
885 bool saved_record = ostream_record;
886
887 int i;
888 char *tempname;
889 char file_name[FILENAME_MAX + 1];
890
891 /* Turn off playback and recording temporarily */
892 istream_replay = FALSE;
893 ostream_record = FALSE;
894
895 /* Select appropriate extension */
896 extension = ".aux";
897
898 if (flag == FILE_SAVE || flag == FILE_RESTORE)
899 extension = ".sav";
900 if (flag == FILE_SCRIPT)
901 extension = ".scr";
902 if (flag == FILE_RECORD || flag == FILE_PLAYBACK)
903 extension = ".rec";
904
905 /* Input file name (reserve four bytes for a file name extension) */
906 print_string("Enter file name (\"");
907 print_string(extension);
908 print_string("\" will be added).\nDefault is \"");
909 print_string(default_name);
910 print_string("\": ");
911
912 read_string(MAX_FILE_NAME - 4, (zchar *) file_name);
913
914 /* Use the default name if nothing was typed */
915 if (file_name[0] == 0)
916 strcpy(file_name, default_name);
917 if (strchr(file_name, '.') == NULL)
918 strcat(file_name, extension);
919
920 /* FIXME: UNTESTED Check if we're restricted to one directory. */
921 if (f_setup.restricted_path != NULL) {
922 for (i = strlen(file_name); i > 0; i--) {
923 if (file_name[i] == PATH_SEPARATOR) {
924 i++;
925 break;
926 }
927 }
928 tempname = strdup(file_name + i);
929 strcpy(file_name, f_setup.restricted_path);
930 if (file_name[strlen(file_name)-1] != PATH_SEPARATOR) {
931 strcat(file_name, "\\");
932 }
933 strcat(file_name, tempname);
934 }
935
936 /* Make sure it is safe to use this file name */
937 result = TRUE;
938
939 /* OK if the file is opened for reading */
940 if (flag != FILE_SAVE && flag != FILE_SAVE_AUX && flag != FILE_RECORD)
941 goto finished;
942
943 /* OK if the file does not exist */
944 if ((fp = fopen(file_name, "rb")) == NULL)
945 goto finished;
946
947 /* OK if this is a pseudo-file (like PRN, CON, NUL) */
948
949 #ifdef __WATCOMC__
950 terminal = isatty(fileno(fp));
951 #else
952 terminal = fp->flags & _F_TERM;
953 #endif
954 fclose(fp);
955
956 if (terminal)
957 goto finished;
958
959 /* OK if user wants to overwrite */
960 result = read_yes_or_no ("Overwrite existing file");
961
962 finished:
963
964 /* Restore state of playback and recording */
965 istream_replay = saved_replay;
966 ostream_record = saved_record;
967
968 if (!result)
969 return NULL;
970
971 return strdup(file_name);
972 } /* os_read_file_name */
973
974
975 /*
976 * Called regularly by the interpreter, at least every few instructions
977 * (only when interpreting: e.g., not when waiting for input).
978 */
979 void os_tick(void)
980 {
981 /* do nothing */
982 }
0 /*
1 * dosmouse.h - DOS interface, mouse support
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <dos.h>
22 #include "frotz.h"
23 #include "dosfrotz.h"
24
25 /*
26 * detect_mouse
27 *
28 * Return true if a mouse driver is present.
29 *
30 */
31 bool detect_mouse(void)
32 {
33 #ifdef __WATCOMC__
34 return dos_mouse_ax(0);
35 #else
36 asm xor ax, ax
37 asm int 0x33
38 return _AX;
39 #endif
40
41 } /* detect_mouse */
42
43
44 /*
45 * read_mouse
46 *
47 * Report any mouse clicks. Return 2 for a double click, 1 for a single
48 * click or 0 if there was no mouse activity at all.
49 *
50 */
51 int read_mouse(void)
52 {
53 int click;
54
55 /* Read the current mouse status */
56 for (click = 0; click < 2; click++) {
57 #ifdef __WATCOMC__
58 union {
59 __int64 i;
60 struct {
61 int y, x, released;
62 } s;
63 } u;
64 int released, x, y;
65 #endif
66 if (click == 1)
67 delay(222);
68 #ifdef __WATCOMC__
69 /* Capture the returned bx, cx, and dx values all in a
70 single scalar value... */
71 u.i = dos_mouse_ax_bx(6, 0);
72 released = u.s.released;
73 x = u.s.x;
74 y = u.s.y;
75 if (released == 0)
76 break;
77 mouse_x = x;
78 mouse_y = y;
79 #else
80 asm mov ax, 6
81 asm xor bx, bx
82 asm int 0x33
83 if (_BX == 0)
84 break;
85 mouse_x = _CX;
86 mouse_y = _DX;
87 #endif
88
89 if (display <= _TEXT_) {
90 mouse_x /= 8;
91 mouse_y /= 8;
92 }
93
94 if (display == _MCGA_)
95 mouse_x /= 2;
96
97 mouse_x++;
98 mouse_y++;
99 }
100
101 /* Return single or double click */
102 return click;
103 } /* read_mouse */
0 /*
1 * dospic.c - DOS interface, picture functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #ifdef __WATCOMC__
22 #include <malloc.h>
23 #include <conio.h>
24 #else
25 #include <alloc.h>
26 #endif
27
28 #include <dos.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include "frotz.h"
32 #include "dosfrotz.h"
33
34 int scaler = 1;
35
36 #ifndef NO_GRAPHICS
37
38 #define PIC_NUMBER 0
39 #define PIC_WIDTH 2
40 #define PIC_HEIGHT 4
41 #define PIC_FLAGS 6
42 #define PIC_DATA 8
43 #define PIC_COLOUR 11
44
45 #ifdef __WATCOMC__
46 #define READ_BYTE(v,p,o) ((v) = *(byte _huge *)((p) + (o)))
47 #define READ_WORD(v,p,o) ((v) = *(word _huge *)((p) + (o)))
48 #else
49 #define READ_BYTE(v,p,o) v = *(byte far *)(p+o)
50 #define READ_WORD(v,p,o) v = *(word far *)(p+o)
51 #endif
52
53 extern volatile byte _far *get_scrnptr (int);
54
55 extern FILE *os_path_open(const char *, const char *);
56
57 static struct {
58 byte fileno;
59 byte flags;
60 word unused1;
61 word images;
62 word link;
63 byte entry_size;
64 byte padding;
65 word checksum;
66 word unused2;
67 word version;
68 } gheader;
69
70 static word pic_width = 0;
71 static word pic_height = 0;
72 static word pic_flags = 0;
73 static long pic_data = 0;
74 static long pic_colour = 0;
75
76 static byte _far *table_val = NULL;
77 static word _far *table_ref = NULL;
78
79 static FILE *file = NULL;
80
81 #ifdef __WATCOMC__
82 static byte _huge *info = NULL;
83 #else
84 static byte far *info = NULL;
85 #endif
86
87 /*
88 * open_graphics_file
89 *
90 * Open a graphics file. EGA pictures may be stored in two separate
91 * graphics files.
92 *
93 */
94 static bool open_graphics_file(int number)
95 {
96 char fname[MAX_FILE_NAME + 1];
97 char extension[4 + 1];
98
99 #ifdef __WATCOMC__
100 word images;
101 byte entry_size;
102 byte _huge *p;
103 #endif
104 /* Build graphics file name */
105 extension[0] = '.';
106 extension[1] = "cmem"[display - 2];
107 extension[2] = 'g';
108 extension[3] = '0' + number;
109 extension[4] = 0;
110
111 /* Why does DOS not like "graphics\\" anymore? */
112 strcpy(fname, "graphics/");
113 strcat(fname, f_setup.story_name);
114 strcat(fname, extension);
115
116 /* Open file, load header, allocate memory, load picture directory */
117 if ((file = fopen(fname, "rb")) == NULL)
118 goto failure1;
119 if (fread(&gheader, sizeof(gheader), 1, file) != 1)
120 goto failure2;
121 #ifdef __WATCOMC__
122 images = gheader.images;
123 entry_size = gheader.entry_size;
124 if ((info = halloc((long)images * entry_size, 1)) == NULL)
125 goto failure2;
126 p = info;
127 while (images != 0) {
128 if (fread((void _far *)p, gheader.entry_size, 1, file) != 1)
129 goto failure3;
130 p += entry_size;
131 --images;
132 }
133 #else
134 if ((info = farmalloc(gheader.images * gheader.entry_size)) == NULL)
135 goto failure2;
136 if (fread(info, gheader.entry_size, gheader.images, file) !=
137 gheader.images)
138 goto failure3;
139 #endif
140 return TRUE;
141
142 failure3:
143 #ifdef __WATCOMC__
144 hfree(info);
145 #else
146 farfree(info);
147 #endif
148 info = NULL;
149
150 failure2:
151 fclose(file);
152 file = NULL;
153
154 failure1:
155 return FALSE;
156
157 } /* open_graphics_file */
158
159
160 /*
161 * close_graphics_file
162 *
163 * Free resources allocated for pictures.
164 *
165 */
166 static void close_graphics_file(void)
167 {
168 if (file != NULL) {
169 fclose(file);
170 file = NULL;
171 }
172 if (info != NULL) {
173 #ifdef __WATCOMC__
174 hfree(info);
175 #else
176 farfree(info);
177 #endif
178 info = NULL;
179 }
180
181 } /* close_graphics_file */
182
183
184 /*
185 * init_pictures
186 *
187 * Prepare to draw pictures. Return true if pictures are available.
188 *
189 */
190 bool init_pictures(void)
191 {
192
193 /* Allocate memory for decompression */
194 table_val = (byte _far *) _fmalloc(3 * 3840);
195 table_ref = (word _far *) (table_val + 3840);
196 if (table_val == NULL)
197 return FALSE;
198
199 /* Open the [first of two] graphics file[s] */
200 return open_graphics_file(1);
201
202 } /* init_pictures */
203
204
205 /*
206 * reset_pictures
207 *
208 * Free resources allocated for decompression of pictures.
209 *
210 */
211 void reset_pictures(void)
212 {
213 if (table_val != NULL) {
214 #ifdef __WATCOMC__
215 _ffree(table_val);
216 #else
217 farfree(table_val);
218 #endif
219 table_val = NULL;
220 }
221 if (file != NULL) {
222 fclose(file);
223 file = NULL;
224 }
225 if (info != NULL) {
226 #ifdef __WATCOMC__
227 hfree(info);
228 #else
229 farfree(info);
230 #endif
231 info = NULL;
232 }
233
234 } /* reset_pictures */
235
236
237 /*
238 * load_picture_info
239 *
240 * Helper function for os_picture_data. Load all information about
241 * the given picture from the graphics file and store it in global
242 * variables.
243 *
244 */
245 static bool load_picture_info(int picture)
246 {
247 #ifdef __WATCOMC__
248 byte _huge *ptr;
249 #else
250 byte far *ptr;
251 #endif
252 byte fileno;
253
254 fileno = gheader.fileno;
255
256 do {
257 int i;
258
259 /* Abort if there is a problem with the graphics file */
260 if (file == NULL)
261 return FALSE;
262
263 /* Scan the directory of the current graphics file */
264 ptr = info;
265 for (i = 0; i < gheader.images; i++) {
266 if (picture == *(int far *)ptr) {
267 READ_WORD(pic_width, ptr, PIC_WIDTH);
268 READ_WORD(pic_height, ptr, PIC_HEIGHT);
269 READ_WORD(pic_flags, ptr, PIC_FLAGS);
270
271 pic_height *= scaler;
272 pic_width *= scaler;
273
274 READ_BYTE(byte0(pic_data), ptr, PIC_DATA + 2);
275 READ_BYTE(byte1(pic_data), ptr, PIC_DATA + 1);
276 READ_BYTE(byte2(pic_data), ptr, PIC_DATA);
277
278 if (gheader.entry_size > PIC_COLOUR + 2) {
279 READ_BYTE(byte0(pic_colour), ptr,
280 PIC_COLOUR + 2);
281 READ_BYTE(byte1(pic_colour), ptr,
282 PIC_COLOUR + 1);
283 READ_BYTE(byte2(pic_colour), ptr,
284 PIC_COLOUR);
285 } else
286 pic_colour = 0;
287
288 return TRUE;
289 }
290 ptr += gheader.entry_size;
291 }
292
293 /* Close current graphics file */
294 close_graphics_file();
295
296 /* Open next graphics file */
297 open_graphics_file((gheader.link !=
298 0) ? gheader.fileno + 1 : 1);
299
300 } while (fileno != gheader.fileno);
301
302 return FALSE;
303 } /* load_picture_info */
304
305
306 /*
307 * load_colour_map
308 *
309 * Helper function for os_draw_picture. Load a colour map from the
310 * graphics file then copy it to the palette registers.
311 *
312 */
313 static void load_colour_map(int first_colour)
314 {
315 byte rgb[42];
316 int n, i;
317
318 fseek(file, pic_colour, SEEK_SET);
319
320 /* Some pictures from Arthur mistakenly claim to have 16 colours */
321 if ((n = fgetc(file)) == 16)
322 n = 14;
323
324 /* Each colour is stored in three bytes R-G-B */
325 fread(rgb, 3, n, file);
326
327 /* MCGA boards can only handle R-G-B values from 0 to 63 */
328 for (i = 0; i < 42; i++)
329 rgb[i] = (rgb[i] * 63 + 128) / 255;
330
331 /* Synchronise with vertical retrace */
332 #ifdef __WATCOMC__
333 while ((inp(0x03da) & 8) == 0) ;
334 while ((inp(0x03da) & 8) == 8) ;
335 #else
336 while ((inportb(0x03da) & 8) == 0) ;
337 while ((inportb(0x03da) & 8) == 8) ;
338 #endif
339 /* Copy colours to palette registers */
340 #ifdef __WATCOMC__
341 bios_video_ax_bx_cx_esdx(0x1012, first_colour, n, rgb);
342 #else
343 asm mov ax, 0x1012
344 asm mov bx, first_colour
345 asm mov cx, n
346 asm lea dx, rgb
347 asm push ss
348 asm pop es
349 asm int 0x10
350 #endif
351 } /* load_colour_map */
352
353
354 /*
355 * draw_picture
356 *
357 * Helper function for os_draw_picture. The real work of drawing a
358 * picture happens here.
359 *
360 */
361 #pragma warn -def
362
363 #ifdef __WATCOMC__
364 static void draw_picture(int y, int x)
365 #else
366 static void pascal draw_picture(int y, int x)
367 #endif
368 {
369 static int raise_bits[4] = {
370 0x0100, 0x0300, 0x0700, 0x0000
371 };
372
373 byte buf[512];
374 #ifdef __WATCOMC__
375 volatile byte _far *screen;
376 #else
377 unsigned long screen;
378 #endif
379 byte transparent;
380 byte colour_shift;
381 int first_colour;
382 int code, prev_code;
383 int next_entry;
384 int bits_per_code;
385 int bits_shift;
386 int bits;
387 int current_y;
388 int current_x;
389 int bufpos;
390 int pixels;
391 int i;
392
393 bufpos = 0;
394
395 /* When the given picture provides a colour map then activate it.
396 This is only used for MCGA pictures; the colour map affects
397 every picture on the screen. The first colour to be defined is
398 colour 2. Every map defines up to 14 colours (colour 2 to 15).
399 These colours are not related to the standard Z-machine colour
400 scheme which remains unchanged. (This is based on the Amiga
401 interpreter which had to work with 16 colours. Colours 0 and 1
402 were used for text; changing the text colours actually changed
403 palette entries 0 and 1. This interface uses the same trick in
404 Amiga mode.) */
405 if (display == _CGA_)
406 colour_shift = -2;
407 if (display == _EGA_)
408 colour_shift = 0;
409 if (display == _MCGA_) {
410 colour_shift = 32;
411 first_colour = 34;
412 }
413 if (display == _AMIGA_) {
414 colour_shift = -1;
415 first_colour = 65;
416 }
417
418 if (pic_colour != 0)
419 load_colour_map(first_colour);
420
421 fseek(file, pic_data, SEEK_SET);
422
423 /* Bit 0 of "flags" indicates that the picture uses a transparent
424 colour, the top four bits tell us which colour it is. For CGA
425 and MCGA pictures this is always 0; for EGA pictures it can be
426 any colour between 0 and 15. */
427 transparent = 0xff;
428
429 if (pic_flags & 1)
430 transparent = pic_flags >> 12;
431
432 /* Prepare EGA hardware for setting pixels */
433 if (display >= _EGA_) {
434 outport(0x03ce, 0x0205);
435 outport(0x03ce, 0xff08);
436 }
437
438 /* The uncompressed picture is a long sequence of bytes. Every
439 byte holds the colour of a pixel, starting at the top left,
440 stopping at the bottom right. We keep track of our position
441 in the current line. (There is a special case: CGA pictures
442 with no transparent colour are stored as bit patterns, i.e.
443 every byte holds the pattern for eight pixels. A pixel must
444 be white if the corresponding bit is set, otherwise it must
445 be black.) */
446 current_x = x + pic_width;
447 current_y = y - 1;
448 #ifdef __WATCOMC__
449 screen = get_scrnptr(current_y);
450 #endif
451
452 /* The compressed picture is a stream of bits. We read the file
453 byte-wise, storing the current byte in the variable "bits".
454 Several bits make one code; the variable "bits_shift" helps
455 us to build the next code. */
456 bits_shift = 0;
457 bits = 0;
458
459 reset_table:
460
461 /* Clear the table. We use a table of 3840 entries. Each entry
462 consists of both a value and a reference to another table
463 entry. Following these references we get a sequence of
464 values. At the start of decompression all table entries are
465 undefined. Later we see how entries are set and used. */
466 next_entry = 1;
467
468 /* At the start of decompression 9 bits make one code; during
469 the process this can rise to 12 bits per code. 9 bits are
470 sufficient to address both 256 literal values and 256 table
471 entries; 12 bits are sufficient to address both 256 literal
472 values and all 3840 table entries. The number of bits per
473 code rises with the number of table entries. When the table
474 is cleared, the number of bits per code drops back to 9. */
475 bits_per_code = 9;
476
477 next_code:
478
479 /* Read the next code from the graphics file. This requires
480 some confusing bit operations. Note that low bits always
481 come first. Usually there are a few bits left over from
482 the previous code; these bits must be used before further
483 bits are read from the graphics file. */
484 code = bits >> (8 - bits_shift);
485
486 do {
487 bits = fgetc(file);
488 code |= bits << bits_shift;
489 bits_shift += 8;
490 } while (bits_shift < bits_per_code);
491
492 bits_shift -= bits_per_code;
493 code &= 0xfff >> (12 - bits_per_code);
494
495 /* There are two codes with a special meaning. The first one
496 is 256 which clears the table and sets the number of bits
497 per code to 9. (This is necessary when the table is full.)
498 The second one is 257 which marks the end of the picture.
499 For the sake of efficiency, we decrement the code by 256. */
500 code -= 256;
501
502 if (code == 0)
503 goto reset_table;
504 if (code == 1)
505 return;
506
507 /* Codes from 0 to 255 are literals, i.e. they represent a
508 plain byte value. Codes from 258 onwards are references
509 to table entries, i.e. they represent a sequence of byte
510 values (see the remarks on the table above). This means
511 that for each code one or several byte values are added
512 to the decompressed picture. But there is yet more work
513 to do: Every time we read a code one table entry is set.
514 As we said above, a table entry consist of both a value
515 and a reference to another table entry. If the current
516 code is a literal, then the value has to be set to this
517 literal; but if the code refers to a sequence of byte
518 values, then the value has to be set to the last byte of
519 this sequence. In any case, the reference is set to the
520 previous code. Finally, one should be aware that a code
521 may legally refer to the table entry which is currently
522 being set. This requires some extra care. */
523 table_ref[next_entry] = prev_code;
524
525 prev_code = code;
526
527 while (code >= 0) {
528 buf[bufpos++] = table_val[code];
529 code = (short)table_ref[code];
530 }
531
532 if (next_entry == prev_code)
533 buf[0] = code;
534
535 table_val[next_entry] = code;
536
537 /* The number of bits per code is incremented when the current
538 number of bits no longer suffices to address all defined
539 table entries; but in any case the number of bits may never
540 be greater than 12. */
541 next_entry++;
542
543 if (next_entry == raise_bits[bits_per_code - 9])
544 bits_per_code++;
545
546 reverse_buffer:
547
548 /* Append the sequence of byte values (pixels) to the picture.
549 The order of the sequence must be reversed. (This is why we
550 have stored the sequence in a buffer; experiments show that
551 a buffer of 512 bytes suffices.) The sequence of values may
552 spread over several lines of the picture, so we must take
553 care to start a new line when we reach the right border of
554 the picture. */
555 if (current_x == x + pic_width) {
556 screen = get_scrnptr(current_y);
557 current_x -= pic_width;
558 current_y += scaler;
559 }
560
561 /* Either add a single pixel or a pattern of eight bits (b/w
562 CGA pictures without a transparent colour) to the current
563 line. Increment our position by 1 or 8 respectively. The
564 pixel may have to be painted several times if the scaling
565 factor is greater than one. */
566 if (display == _CGA_ && transparent == 0xff) {
567 pixels = x + pic_width - current_x;
568 if (pixels > 8)
569 pixels = 8;
570
571 #ifdef __WATCOMC__
572 _asm {
573 les bx, screen
574 mov dx, current_x
575 dec dx
576 push dx
577 mov cl, 3
578 shr dx, cl
579 add bx, dx
580 mov ax, es:[bx]
581 mov dx, 0xffff
582 mov cl, byte ptr pixels
583 shr dl, cl
584 pop cx
585 and cl, 7
586 ror dx, cl
587 and ax, dx
588 mov dx, code
589 inc dh
590 ror dx, cl
591 or ax, dx
592 mov es:[bx], ax
593 }
594 #else
595 asm les bx, screen
596 asm mov dx, current_x
597 asm dec dx
598 asm push dx
599 asm mov cl, 3
600 asm shr dx, cl
601 asm add bx, dx
602 asm mov ax, es:[bx]
603 asm mov dx, 0xffff
604 asm mov cl, byte ptr pixels
605 asm shr dl, cl
606 asm pop cx
607 asm and cl, 7
608 asm ror dx, cl
609 asm and ax, dx
610 asm mov dx, code
611 asm inc dh
612 asm ror dx, cl
613 asm or ax, dx
614 asm mov es:[bx], ax
615 #endif
616 current_x += pixels;
617 } else for (i = 0; i < scaler; i++) {
618 #ifdef __WATCOMC__
619 int displ = display;
620 _asm {
621 mov ah, byte ptr code
622 cmp ah, transparent
623 jz L4
624 add ah, colour_shift
625 les bx, screen
626 mov dx, current_x
627 dec dx
628 mov si, displ
629 cmp si, _MCGA_
630 jz L2
631 push dx
632 mov cl, 3
633 shr dx, cl
634 pop cx
635 and cl, 7
636 add bx, dx
637 mov al, es:[bx]
638 cmp si, _CGA_
639 jnz L1
640 mov dl, 0x7f
641 ror dl, cl
642 and al, dl
643 xor ah, 1
644 ror ah, 1
645 shr ah, cl
646 or ah, al
647 jmp L3
648 L1: mov al, 0x80
649 shr al, cl
650 mov dx, 0x03cf
651 out dx, al
652 jmp L3
653 L2: add bx, dx
654 L3: mov es:[bx], ah
655 cmp si, _AMIGA_
656 jnz L4
657 add bx, 80
658 mov al, es:[bx]
659 mov es:[bx], ah
660 L4:
661 #else
662 _AH = code;
663 if (_AH != transparent) {
664 asm add ah, colour_shift
665 asm les bx, screen
666 asm mov dx, current_x
667 asm dec dx
668 if (display != _MCGA_) {
669 asm push dx
670 asm mov cl, 3
671 asm shr dx, cl
672 asm pop cx
673 asm and cl, 7
674 asm add bx, dx
675 asm mov al, es:[bx]
676 if (display == _CGA_) {
677 asm mov dl, 0x7f
678 asm ror dl, cl
679 asm and al, dl
680 asm xor ah, 1
681 asm ror ah, 1
682 asm shr ah, cl
683 asm or ah, al
684 } else {
685 asm mov al, 0x80
686 asm shr al, cl
687 asm mov dx, 0x03cf
688 asm out dx, al
689 }
690 } else
691 asm add bx, dx
692
693 asm mov es:[bx], ah
694
695 if (display == _AMIGA_) {
696 asm add bx, 80
697 asm mov al, es:[bx]
698 asm mov es:[bx], ah
699 }
700 #endif
701 }
702 current_x++;
703 }
704
705 /* If there are no more values in the buffer then read the
706 next code from the file. Otherwise fetch the next byte
707 value from the buffer and continue painting the picture. */
708 if (bufpos == 0)
709 goto next_code;
710
711 byte0(code) = buf[--bufpos];
712 goto reverse_buffer;
713 } /* draw_picture */
714
715 #pragma warn +def
716
717 /*
718 * os_draw_picture
719 *
720 * Display a picture at the given coordinates. Top left is (1,1).
721 *
722 */
723 void os_draw_picture(int picture, int y, int x)
724 {
725 if (load_picture_info(picture))
726 draw_picture(y, x);
727
728 } /* os_draw_picture */
729
730
731 /*
732 * os_peek_colour
733 *
734 * Return the colour of the pixel below the cursor. This is used
735 * by V6 games to print text on top of pictures. The coulor need
736 * not be in the standard set of Z-machine colours. To handle
737 * this situation, Frotz extends the colour scheme: Values above
738 * 15 (and below 256) may be used by the interface to refer to
739 * non-standard colours. Of course, os_set_colour must be able to
740 * deal with these colours. Interfaces which refer to characters
741 * instead of pixels might return the current background colour
742 * instead.
743 *
744 */
745 int os_peek_colour(void)
746 {
747 if (display >= _CGA_) {
748 #ifdef __WATCOMC__
749 return (int)(byte)bios_video_ah_bh_cx_dx(13, 0,
750 cursor_x, cursor_y) + 16;
751 #else
752 asm mov ah, 13
753 asm mov bh, 0
754 asm mov cx, cursor_x
755 asm mov dx, cursor_y
756 asm int 0x10
757 asm mov ah, 0
758 return _AX + 16;
759 #endif
760 }
761 return current_bg;
762 } /* os_peek_colour */
763
764
765 /*
766 * os_picture_data
767 *
768 * Return true if the given picture is available. If so, write the
769 * width and height of the picture into the appropriate variables.
770 * Only when picture 0 is asked for, write the number of available
771 * pictures and the release number instead.
772 *
773 */
774
775 bool os_picture_data(int picture, int *height, int *width)
776 {
777 bool avail;
778
779 if (picture == 0) {
780 avail = FALSE;
781
782 /* This is the special case mentioned above. In practice, only
783 the release number is used; and even this is only used by
784 the DOS version of "Zork Zero". Infocom's Amiga interpreter
785 could not handle this feature, and the Amiga version of the
786 story file does not use it. */
787
788 pic_height = gheader.images;
789 pic_width = gheader.version;
790
791 } else
792 avail = load_picture_info(picture);
793
794 *height = pic_height;
795 *width = pic_width;
796
797 return avail;
798 } /* os_picture_data */
799
800 #else /* NO_GRAPHICS */
801
802 bool init_pictures(void) {}
803 void reset_pictures(void) {}
804 int os_peek_colour(void) {}
805 void os_draw_picture(int picture, int y, int x) {}
806 bool os_picture_data(int picture, int *height, int *width) {}
807
808 #endif
0 /*
1 * file "dossampl.c"
2 *
3 * DOS front end, sound support
4 *
5 */
6
7 #ifdef __WATCOMC__
8 #include <malloc.h>
9 #include <conio.h>
10 #else
11 #include <alloc.h>
12 #endif
13
14 #include <dos.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include "frotz.h"
19 #include "dosfrotz.h"
20
21 #ifndef NO_SOUND
22
23 #ifdef __WATCOMC__
24 #define SWAP_BYTES(v) { (v) = bswap16(v); }
25 #else
26 #define SWAP_BYTES(v) {_AX=v;asm xchg al,ah;v=_AX;}
27 #endif
28 #define READ_DSP(v) {while(!inp(sound_adr+14)&0x80);(v)=inportb(sound_adr+10);}
29 #define WRITE_DSP(v) {while(inp(sound_adr+12)&0x80);outportb(sound_adr+12,(v));}
30
31 extern void end_of_sound(void);
32
33 static struct {
34 word prefix;
35 byte repeats;
36 byte base_note;
37 word frequency;
38 word unused;
39 word length;
40 } sheader;
41
42 static int current_sample = 0;
43
44 static void interrupt(*vect) (void) = NULL;
45
46 static int play_part = 0;
47 static int play_count = 0;
48
49 static word sound_adr = 0;
50 static word sound_irq = 0;
51 static word sound_dma = 0;
52 static word sound_int = 0;
53 static word sound_ver = 0;
54
55 #ifdef __WATCOMC__
56 static byte _huge *sample_data = NULL;
57 #else
58 static byte far *sample_data = NULL;
59 #endif
60
61 static long sample_adr1 = 0;
62 static long sample_adr2 = 0;
63 static word sample_len1 = 0;
64 static word sample_len2 = 0;
65
66 /*
67 * start_of_dma
68 *
69 * Start the DMA transfer to the sound board.
70 *
71 */
72 static void start_of_dma(long address, unsigned length)
73 {
74 static unsigned dma_page_port[] = {
75 0x87, 0x83, 0x81, 0x82
76 };
77
78 length--;
79
80 /* Set up DMA chip */
81 outportb(0x0a, 0x04 | sound_dma);
82 outportb(0x0c, 0x00);
83 outportb(0x0b, 0x48 | sound_dma);
84 outportb(2 * sound_dma, byte0(address));
85 outportb(2 * sound_dma, byte1(address));
86 outportb(dma_page_port[sound_dma], byte2(address));
87 outportb(2 * sound_dma + 1, byte0(length));
88 outportb(2 * sound_dma + 1, byte1(length));
89 outportb(0x0a, sound_dma);
90
91 /* Play 8-bit mono sample */
92 WRITE_DSP(0x14)
93 WRITE_DSP(byte0(length))
94 WRITE_DSP(byte1(length))
95 } /* start_of_dma */
96
97
98 /*
99 * end_of_dma
100 *
101 * This function is called when a hardware interrupt signals the
102 * end of the current sound. We may have to play the second half
103 * of the sound effect, or we may have to repeat it, or call the
104 * end_of_sound function when we are finished.
105 *
106 */
107 static void interrupt end_of_dma(void)
108 {
109 /* Play the second half, play another cycle or finish */
110 if (play_part == 1 && sample_len2 != 0) {
111 play_part = 2;
112 start_of_dma(sample_adr2, sample_len2);
113 } else if (play_count == 255 || --play_count != 0) {
114 play_part = 1;
115 start_of_dma(sample_adr1, sample_len1);
116 } else {
117 play_part = 0;
118 end_of_sound();
119 }
120
121 /* Tell interrupt controller(s) + sound board we are done */
122 outportb(0x20, 0x20);
123 if (sound_irq >= 8)
124 outportb(0xa0, 0x20);
125 inportb(sound_adr + 14);
126
127 } /* end_of_dma */
128
129
130 /*
131 * dos_init_sound
132 *
133 * Initialise the sound board and various sound related variables.
134 *
135 */
136 bool dos_init_sound(void)
137 {
138 const char *settings;
139 word irc_mask_port;
140
141 /* Read the IRQ, port address, DMA channel and SB version */
142 if ((settings = getenv("BLASTER")) == NULL)
143 return FALSE;
144
145 sound_irq = dectoi(strchr(settings, 'I') + 1);
146 sound_adr = hextoi(strchr(settings, 'A') + 1);
147 sound_dma = dectoi(strchr(settings, 'D') + 1);
148 sound_ver = dectoi(strchr(settings, 'T') + 1);
149
150 /* Reset mixer chip and DSP */
151 outportb(sound_adr + 4, 0);
152 outportb(sound_adr + 5, 0);
153
154 outportb(sound_adr + 6, 1);
155 inportb(sound_adr + 6);
156 inportb(sound_adr + 6);
157 inportb(sound_adr + 6);
158 outportb(sound_adr + 6, 0);
159
160 /* Turn on speakers */
161 WRITE_DSP(0xd1)
162 /* Install the end_of_dma interrupt */
163 if (sound_irq < 8) {
164 irc_mask_port = 0x21;
165 sound_int = 0x08 + sound_irq;
166 } else {
167 irc_mask_port = 0xa1;
168 sound_int = 0x68 + sound_irq;
169 }
170
171 vect = getvect(sound_int);
172 setvect(sound_int, end_of_dma);
173
174 /* Allocate 64KB RAM for sample data */
175 #ifdef __WATCOMC__
176 if ((sample_data = (byte _huge *) halloc(0x10000L, 1)) == NULL)
177 #else
178 if ((sample_data = (byte far *) farmalloc(0x10000L)) == NULL)
179 #endif
180 return FALSE;
181
182 word0(sample_adr1) = FP_OFF(sample_data) | (FP_SEG(sample_data) << 4);
183 word1(sample_adr1) = FP_SEG(sample_data) >> 12;
184 word0(sample_adr2) = 0;
185 word1(sample_adr2) = word1(sample_adr1) + 1;
186
187 /* Enable the end_of_dma interrupt */
188 outportb(0x20, 0x20);
189
190 if (sound_irq >= 8)
191 outportb(0xa0, 0x20);
192
193 outportb(irc_mask_port, inportb(irc_mask_port) & ~(1 << (sound_irq & 7)));
194
195 /* Indicate success */
196 return TRUE;
197
198 } /* init_sound */
199
200
201 /*
202 * dos_reset_sound
203 *
204 * Free resources allocated for playing samples.
205 *
206 */
207 void dos_reset_sound(void)
208 {
209 os_stop_sample(0);
210
211 if (sample_data != NULL) {
212 #ifdef __WATCOMC__
213 hfree(sample_data);
214 #else
215 farfree(sample_data);
216 #endif
217 sample_data = NULL;
218 }
219 if (sound_adr != 0) {
220 #ifdef __WATCOMC__
221 _dos_setvect(sound_int, vect);
222 #else
223 setvect(sound_int, vect);
224 #endif
225 sound_adr = 0;
226 }
227
228 } /* dos_reset_sound */
229
230 /*
231 * os_init_sound
232 *
233 * Dummy function to satisfy the core code. DOS Frotz does its sound
234 * initialization in dosinit.c in os_init_screen().
235 *
236 * FIXME: Move the sound initlization from os_init_screen() to here and
237 * somehow work around the ifs.
238 *
239 */
240 void os_init_sound(void)
241 {
242 /* do nothing */
243 }
244
245 /*
246 * os_prepare_sample
247 *
248 * Load the sample from the disk.
249 *
250 */
251 void os_prepare_sample(int number)
252 {
253 os_stop_sample(0);
254
255 /* Exit if the sound board isn't set up properly */
256 if (sample_data == NULL)
257 return;
258 if (sound_adr == 0)
259 return;
260
261 /* Continue only if the desired sample is not already present */
262 if (current_sample != number) {
263
264 char sample_name[MAX_FILE_NAME + 1];
265 char numstr[2];
266 FILE *fp;
267
268 /* Build sample file name */
269 strcpy(sample_name, "sound/");
270
271 numstr[0] = '0' + number / 10;
272 numstr[1] = '0' + number % 10;
273
274 strncat(sample_name, f_setup.story_name, 6);
275 strncat(sample_name, numstr, 2);
276 strncat(sample_name, ".snd", 4);
277
278 /* Open sample file */
279 if ((fp = fopen(sample_name, "rb")) == NULL)
280 return;
281
282 /* Load header and sample data */
283 fread(&sheader, sizeof(sheader), 1, fp);
284
285 SWAP_BYTES(sheader.frequency)
286 SWAP_BYTES(sheader.length)
287 fread(sample_data, 1, sheader.length, fp);
288
289 sample_len1 = -word0(sample_adr1);
290
291 if (sample_len1 > sheader.length || sample_len1 == 0)
292 sample_len1 = sheader.length;
293
294 sample_len2 = sheader.length - sample_len1;
295
296 WRITE_DSP(0x40)
297 WRITE_DSP(256 - 1000000L / sheader.frequency)
298 current_sample = number;
299
300 /* Close sample file */
301 fclose(fp);
302
303 }
304 } /* os_prepare_sample */
305
306
307 /*
308 * os_start_sample
309 *
310 * Play the given sample at the given volume (ranging from 1 to 8 and
311 * 255 meaning a default volume). The sound is played once or several
312 * times in the background (255 meaning forever). The end_of_sound
313 * function is called as soon as the sound finishes.
314 *
315 */
316 void os_start_sample(int number, int volume, int repeats, zword eos)
317 {
318 eos = eos; /* not used in DOS Frotz */
319
320 os_stop_sample(0);
321
322 /* Exit if the sound board isn't set up properly */
323 if (sample_data == NULL)
324 return;
325 if (sound_adr == 0)
326 return;
327
328 /* Load new sample */
329 os_prepare_sample(number);
330
331 /* Continue only if the sample's in memory now */
332 if (current_sample == number) {
333 play_count = repeats;
334
335 if (sound_ver < 6) { /* Set up SB pro mixer chip */
336 volume = (volume != 255) ? 7 + volume : 15;
337 outportb(sound_adr + 4, 0x04);
338 outportb(sound_adr + 5, (volume << 4) | volume);
339 outportb(sound_adr + 4, 0x22);
340 outportb(sound_adr + 5, 0xff);
341 } else { /* Set up SB16 mixer chip */
342 /* Many thanks to Linards Ticmanis for writing this part! */
343 volume = (volume != 255) ? 127 + 16 * volume : 255;
344 outportb(sound_adr + 4, 0x32);
345 outportb(sound_adr + 5, volume);
346 outportb(sound_adr + 4, 0x33);
347 outportb(sound_adr + 5, volume);
348 outportb(sound_adr + 4, 0x30);
349 outportb(sound_adr + 5, 0xff);
350 outportb(sound_adr + 4, 0x31);
351 outportb(sound_adr + 5, 0xff);
352 }
353
354 play_part = 1;
355 start_of_dma(sample_adr1, sample_len1);
356
357 }
358 } /* os_start_sample */
359
360
361 /*
362 * os_stop_sample
363 *
364 * Turn off the current sample.
365 *
366 */
367 void os_stop_sample(int UNUSED(id))
368 {
369 play_part = 0;
370
371 /* Exit if the sound board isn't set up properly */
372 if (sample_data == NULL)
373 return;
374 if (sound_adr == 0)
375 return;
376
377 /* Tell DSP to stop the current sample */
378 WRITE_DSP(0xd0)
379 } /* os_stop_sample */
380
381
382 /*
383 * os_finish_with_sample
384 *
385 * Remove the current sample from memory (if any).
386 *
387 */
388 void os_finish_with_sample(int UNUSED(id))
389 {
390 os_stop_sample(0); /* we keep 64KB allocated all the time */
391 } /* os_finish_with_sample */
392
393 #else /* NO_SOUND */
394
395 /* Do-nothing stubs for when sound support is disabled. */
396
397 void os_finish_with_sample(int UNUSED(id)) {}
398 void os_stop_sample(int UNUSED(id)) {}
399 void os_start_sample(int number, int volume, int repeats, zword eos) {}
400 void os_prepare_sample(int number) {}
401 void os_init_sound(void) {}
402 void dos_reset_sound(void) {}
403 bool dos_init_sound(void) { return TRUE; }
404
405 #endif /* NO_SOUND */
406
407 /*
408 * os_beep
409 *
410 * Play a beep sound. Ideally, the sound should be high- (number == 1)
411 * or low-pitched (number == 2).
412 *
413 */
414 void os_beep(int number)
415 {
416 word T = 888 * number;
417
418 if (!f_setup.sound) return;
419
420 outportb(0x43, 0xb6);
421 outportb(0x42, lo(T));
422 outportb(0x42, hi(T));
423 outportb(0x61, inportb(0x61) | 3);
424 delay(75);
425 outportb(0x61, inportb(0x61) & ~3);
426 } /* os_beep */
0 /*
1 * owscreen.c - DOS interface, screen manipulation
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #ifdef __WATCOMC__
22 #include <conio.h>
23 #endif
24
25 #include <dos.h>
26 #include <mem.h>
27 #include "frotz.h"
28 #include "dosfrotz.h"
29
30
31 /*
32 * get_scrnptr
33 *
34 * Return a pointer to the given line in video RAM.
35 *
36 */
37 volatile byte _far *get_scrnptr(int y)
38 {
39 if (display == _CGA_)
40 return MK_FP((y & 1) ? 0xba00 : 0xb800, 40 * (y & ~1));
41 else if (display == _MCGA_)
42 return MK_FP(0xa000, 320 * y);
43 else
44 return MK_FP(0xa000, 80 * y);
45 } /* get_scrnptr */
46
47
48 /*
49 * clear_byte
50 *
51 * Helper function for clear_line.
52 *
53 */
54 static void clear_byte(volatile byte _far * scrn, word mask)
55 {
56 if (display == _CGA_)
57 if (scrn_attr == 0)
58 *scrn &= ~mask;
59 else
60 *scrn |= mask;
61 else {
62 #ifdef __WATCOMC__
63 outpw(0x03ce, 0x0205);
64 outp(0x03ce, 0x08);
65 outp(0x03cf, mask);
66 video_latch(*scrn);
67 *scrn = scrn_attr;
68 #else
69 outport(0x03ce, 0x0205);
70 outportb(0x03ce, 0x08);
71 outportb(0x03cf, mask);
72 asm les bx, scrn
73 asm mov al, es:[bx]
74 asm mov al, scrn_attr
75 asm mov es:[bx], al
76 #endif
77 }
78 } /* clear_byte */
79
80
81 /*
82 * clear_line
83 *
84 * Helper function for os_erase_area.
85 *
86 */ static void clear_line(int y, int left, int right)
87 {
88 volatile byte _far *scrn = get_scrnptr(y);
89 if (display == _MCGA_)
90
91 #ifdef __WATCOMC__
92 _fmemset((byte _far *)scrn + left, scrn_attr,
93 right - left + 1);
94 #else
95 _fmemset(scrn + left, scrn_attr, right - left + 1);
96 #endif
97 else {
98 word mask1 = 0x00ff >> (left & 7);
99 word mask2 = 0xff80 >> (right & 7);
100
101 int x = right / 8 - left / 8;
102
103 scrn += left / 8;
104
105 if (x == 0) {
106 mask1 &= mask2;
107 mask2 = 0;
108 }
109
110 /* Clear first byte */
111 clear_byte(scrn++, mask1);
112
113 /* Clear middle bytes */
114 if (display >= _EGA_)
115 outport(0x03ce, 0xff08);
116 while (--x > 0)
117 *scrn++ = scrn_attr;
118
119 /* Clear last byte */
120 clear_byte(scrn, mask2);
121 }
122 } /* clear_line */
123
124
125 /*
126 * os_erase_area
127 *
128 * Fill a rectangular area of the screen with the current background
129 * colour. Top left coordinates are (1,1). The cursor does not move.
130 *
131 * The final argument gives the window being changed, -1 if only a
132 * portion of a window is being erased, or -2 if the whole screen is
133 * being erased. This is not relevant for the DOS interface, and so
134 * this function ignores that argument.
135 *
136 */
137 void os_erase_area(int top, int left, int bottom, int right, int win)
138 {
139 int y;
140
141 top--;
142 left--;
143 bottom--;
144 right--;
145
146 if (display <= _TEXT_) {
147 #ifdef __WATCOMC__
148 bios_video_ax_bh_ch_cl_dh_dl(0x0600, scrn_attr,
149 top, left, bottom, right);
150 #else
151 asm mov ax, 0x0600
152 asm mov ch, byte ptr top
153 asm mov cl, byte ptr left
154 asm mov dh, byte ptr bottom
155 asm mov dl, byte ptr right
156 asm mov bh, scrn_attr
157 asm int 0x10
158 #endif
159 } else
160 for (y = top; y <= bottom; y++)
161 clear_line(y, left, right);
162 } /* os_erase_area */
163
164
165 /*
166 * copy_byte
167 *
168 * Helper function for copy_line.
169 *
170 */
171 static void copy_byte(volatile byte _far * scrn1, volatile byte _far * scrn2,
172 byte mask)
173 {
174 int i;
175 #ifdef __WATCOMC__
176 byte t;
177 #endif
178
179 if (display == _CGA_)
180 *scrn1 = (*scrn1 & ~mask) | (*scrn2 & mask);
181 else {
182 outport(0x03ce, 0x0005);
183 outportb(0x03ce, 0x08);
184 outportb(0x03cf, mask);
185 outportb(0x03ce, 0x04);
186 outportb(0x03c4, 0x02);
187 for (i = 0; i < 4; i++) {
188 outportb(0x03cf, i);
189 outportb(0x03c5, 1 << i);
190 #ifdef __WATCOMC__
191 t = *scrn2;
192 video_latch(*scrn1);
193 *scrn1 = t;
194 }
195 #else
196 asm les bx, scrn2
197 asm mov ah, es:[bx]
198 asm les bx, scrn1
199 asm mov al, es:[bx]
200 asm mov es:[bx], ah
201 }
202 #endif
203 outportb(0x03c5, 0x0f);
204 }
205 } /* copy_byte */
206
207
208 /*
209 * copy_line
210 *
211 * Helper function for os_scroll_area.
212 *
213 */
214 static void copy_line(int y1, int y2, int left, int right)
215 {
216 volatile byte _far *scrn1 = get_scrnptr(y1);
217 volatile byte _far *scrn2 = get_scrnptr(y2);
218 if (display == _MCGA_)
219 #ifdef __WATCOMC__
220 _fmemcpy((byte _far *)(scrn1 + left),
221 (byte _far *)(scrn2 + left), right - left + 1);
222 #else
223 _fmemcpy(scrn1 + left, scrn2 + left, right - left + 1);
224 #endif
225 else {
226 word mask1 = 0x00ff >> (left & 7);
227 word mask2 = 0xff80 >> (right & 7);
228
229 int x = right / 8 - left / 8;
230
231 scrn1 += left / 8;
232 scrn2 += left / 8;
233
234 if (x == 0) {
235 mask1 &= mask2;
236 mask2 = 0;
237 }
238
239 /* Copy first byte */
240 copy_byte(scrn1++, scrn2++, mask1);
241
242 /* Copy middle bytes */
243 if (display >= _EGA_)
244 outport(0x03ce, 0x0105);
245 while (--x > 0)
246 *scrn1++ = *scrn2++;
247
248 /* Copy last byte */
249 copy_byte(scrn1, scrn2, mask2);
250 }
251 } /* copy_line */
252
253
254 /*
255 * os_scroll_area
256 *
257 * Scroll a rectangular area of the screen up (units > 0) or down
258 * (units < 0) and fill the empty space with the current background
259 * colour. Top left coordinates are (1,1). The cursor stays put.
260 *
261 */
262 void os_scroll_area(int top, int left, int bottom, int right, int units)
263 {
264 int y;
265
266 top--;
267 left--;
268 bottom--;
269 right--;
270
271 if (display <= _TEXT_) {
272 #ifdef __WATCOMC__
273 word ax;
274 if (units > 0)
275 ax = 0x0600 | (byte)units;
276 else
277 ax = 0x0700 | (byte)-units;
278 bios_video_ax_bh_ch_cl_dh_dl(ax, scrn_attr, top, left,
279 bottom, right);
280 #else
281 asm mov ah, 6
282 asm mov bx, units
283 asm cmp bx, 0
284 asm jg scroll
285 asm mov ah, 7
286 asm neg bx
287 scroll:
288 asm mov al, bl
289 asm mov ch, byte ptr top
290 asm mov cl, byte ptr left
291 asm mov dh, byte ptr bottom
292 asm mov dl, byte ptr right
293 asm mov bh, scrn_attr
294 asm int 0x10
295 #endif
296 } else if (units > 0) {
297 for (y = top; y <= bottom; y++) {
298 if (y <= bottom - units)
299 copy_line(y, y + units, left, right);
300 else
301 clear_line(y, left, right);
302 }
303 } else {
304 for (y = bottom; y >= top; y--) {
305 if (y >= top - units)
306 copy_line(y, y + units, left, right);
307 else
308 clear_line(y, left, right);
309 }
310 }
311 } /* os_scroll_area */
312
313
314 bool os_repaint_window(int win, int ypos_old, int ypos_new, int xpos,
315 int ysize, int xsize)
316 {
317 return FALSE;
318 }
0 /*
1 * owtext.c - DOS interface, text functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #ifndef __WATCOMC__
22 #include <alloc.h>
23 #endif
24
25 #include <stdio.h>
26 #include <string.h>
27 #include <conio.h>
28 #include <dos.h>
29 #include "frotz.h"
30 #include "dosfrotz.h"
31 #include "fontdata.h"
32
33 #define sans_offset 0x0000
34 #define vga_offset 0x18C0
35 #define ega_offset 0x28c0
36 #define ega_graphic_offset 0x36c0
37 #define mcga_offset 0x3ec0
38 #define graphics_offset 0x4220
39
40 #ifdef __WATCOMC__
41 extern volatile byte _far *get_scrnptr(int);
42 #else
43 extern byte _far *get_scrnptr(int);
44 #endif
45
46 int current_bg = 0;
47 int current_fg = 0;
48 int current_style = 0;
49 int current_font = 0;
50
51 byte text_bg = 0;
52 byte text_fg = 0;
53 byte bg = 0;
54 byte fg = 0;
55 byte scrn_attr = 0;
56
57 int cursor_x = 0;
58 int cursor_y = 0;
59
60 char latin1_to_ascii[] =
61 " ! c L >o<Y | S '' C a << not- R _ "
62 "^0 +/-^2 ^3 ' my P . , ^1 o >> 1/41/23/4? "
63 "A A A A Ae A AE C E E E E I I I I "
64 "Th N O O O O Oe * O U U U Ue Y Th ss "
65 "a a a a ae a ae c e e e e i i i i "
66 "th n o o o o oe : o u u u ue y th y ";
67
68 char latin1_to_ibm[] = {
69 0x20, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5,
70 0xf9, 0xb8, 0xa6, 0xae, 0xaa, 0xf0, 0xa9, 0xee,
71 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa,
72 0xf7, 0xfb, 0xa7, 0xaf, 0xac, 0xab, 0xf3, 0xa8,
73 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80,
74 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8,
75 0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0x9e,
76 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0xe1,
77 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87,
78 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b,
79 0xd0, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6,
80 0x9b, 0x97, 0xa3, 0x96, 0x81, 0xec, 0xe7, 0x98
81 };
82
83 static word _far *sans_font = NULL;
84 static byte _far *sans_width = NULL;
85 static byte _far *mcga_font = NULL;
86 static byte _far *mcga_width = NULL;
87 static byte _far *graphics_font = NULL;
88
89 static char name[] = "FONTS/FONT0.FNT";
90
91 /*
92 * available_bios
93 *
94 * INT 10H 1aH: Set or Query Display Combination Code
95 * INT 10H 12H BL=10H: Get EGA Information
96 * return: 2 ega, 1 vga, 0 other
97 *
98 */
99 static int available_bios(void)
100 {
101 #ifdef __WATCOMC__
102 int result;
103 _asm {
104 #else
105 asm {
106 #endif
107 /* VGA BIOS available? */
108 mov ax,1a00h
109 int 10h
110 mov bl,al
111 mov ax,0001h
112 cmp bl,1ah
113 je label_ret
114
115 /* EGA BIOS available? */
116 mov ah,12h
117 mov bl,10h
118 int 10h
119 mov ax,0002h
120 cmp bl,10h
121 jne label_ret
122 xor ax,ax
123 #ifdef __WATCOMC__
124 label_ret:
125 mov result,ax
126 }
127 return (result);
128 #else
129 }
130 label_ret:
131 return (_AX);
132 #endif
133
134 }
135
136 /*
137 * set_user_tfont
138 *
139 * INT 10H 1110H: Load and Activate User-Defined Font
140 *
141 */
142 static void set_user_tfont(word offset, byte height)
143 {
144 byte _far *ptr_font = font_data+offset;
145 #ifdef __WATCOMC__
146 _asm {
147 #else
148 asm {
149 #endif
150 mov bh,height
151 push bp
152 les ax,ptr_font
153 mov bp,ax
154 mov ax,1110h
155 xor bl,bl
156 mov cx,100h
157 xor dx,dx
158 int 10h
159 pop bp
160 }
161 }
162
163 /*
164 * set_user_gfont
165 *
166 * INT 10H 1121H: Setup User-Defined Font for Graphics Mode
167 *
168 */
169 static void set_user_gfont(word offset, word height)
170 {
171 byte _far *ptr_font = font_data+offset;
172 #ifdef __WATCOMC__
173 _asm {
174 #else
175 asm {
176 #endif
177 mov cx,height
178 push bp
179 les bx,ptr_font
180 mov bp,bx
181 mov ax,1121h
182 mov bl,02h
183 int 10h
184 pop bp
185 }
186 }
187
188 /*
189 * read_font
190 *
191 * The requested font file "FONT0-4.FNT" must be located in the
192 * subdirectory "FONTS".
193 *
194 */
195 static void read_font(word offset, size_t nmemb)
196 {
197 FILE *fp;
198
199 fp = fopen(name, "rb");
200 if (fp != NULL) {
201 fread(font_data+offset, 1, nmemb, fp);
202 fclose(fp);
203 }
204 }
205
206 /*
207 * load_fonts
208 *
209 * Load the proportional and graphics fonts. In the release version all
210 * font data is appended to the end of the executable.
211 *
212 */
213 void load_fonts(void)
214 {
215 int bios_video;
216
217 bios_video = available_bios();
218
219 if (bios_video) {
220 if (display <= _TEXT_ ) {
221 if (bios_video == 1) {
222 read_font(vga_offset, 0x1000);
223 set_user_tfont(vga_offset, 16);
224 }
225 else
226 set_user_tfont(ega_offset, 14);
227 return;
228 }
229 if (display == _EGA_)
230 set_user_gfont(ega_graphic_offset, 8);
231 else if (display == _AMIGA_ && bios_video == 1) {
232 read_font(vga_offset, 0x1000);
233 set_user_gfont(vga_offset, 16);
234 }
235 }
236
237 if (display == _MCGA_) {
238 mcga_font = font_data + mcga_offset;
239 mcga_width = (byte *) mcga_font + 0x300;
240 } else
241 graphics_font = font_data + graphics_offset;
242
243 if (display == _AMIGA_ && user_font != 0) {
244 name[10] = '0' + user_font;
245 read_font(sans_offset, 0x18C0);
246 name[10] = '0';
247 sans_font = (word *) (font_data + sans_offset);
248 sans_width = (byte *) sans_font + 0x1800;
249 }
250 } /* load_fonts */
251
252
253 /*
254 * os_font_data
255 *
256 * Return true if the given font is available. The font can be
257 *
258 * TEXT_FONT
259 * PICTURE_FONT
260 * GRAPHICS_FONT
261 * FIXED_WIDTH_FONT
262 *
263 * The font size should be stored in "height" and "width". If the given
264 * font is unavailable then these values must _not_ be changed.
265 *
266 */
267 int os_font_data(int font, int *height, int *width)
268 {
269 /* All fonts of this interface have the same size */
270 *height = z_header.font_height;
271 *width = z_header.font_width;
272
273 /* Not every font is available in every mode */
274 if (font == TEXT_FONT)
275 return TRUE;
276 if (font == GRAPHICS_FONT && (display == _CGA_ || display >= _EGA_))
277 return TRUE;
278 if (font == FIXED_WIDTH_FONT)
279 return TRUE;
280
281 /* Unavailable font */
282 return FALSE;
283 } /* os_font_data */
284
285
286 /*
287 * switch_scrn_attr
288 *
289 * Parts of the screen are usually erased to background colour. However,
290 * for deleting text in the input routine it can be useful to erase to
291 * the current text background colour. The two colours can be different,
292 * for example when the reverse text style is used. This helper function
293 * toggles between the two possible behaviours.
294 *
295 */
296 void switch_scrn_attr(bool flag)
297 {
298 byte scrn_bg;
299 byte scrn_fg;
300
301 if (flag) {
302 scrn_bg = text_bg;
303 scrn_fg = text_fg;
304 } else {
305 scrn_bg = bg;
306 scrn_fg = fg;
307 }
308
309 if (display <= _TEXT_)
310 scrn_attr = (scrn_bg << 4) | scrn_fg;
311 else if (display == _CGA_)
312 scrn_attr = (scrn_bg != BLACK) ? 0xff : 0x00;
313 else
314 scrn_attr = scrn_bg;
315 } /* switch_scrn_attr */
316
317
318 /*
319 * adjust_style
320 *
321 * Set the current colours. This combines the current colour selection
322 * and the current text style.
323 *
324 */
325 static void adjust_style(void)
326 {
327 static byte amiga_palette[][3] = {
328 {0x00, 0x00, 0x00},
329 {0x2a, 0x00, 0x00},
330 {0x00, 0x2a, 0x00},
331 {0x3f, 0x3f, 0x15},
332 {0x00, 0x00, 0x2a},
333 {0x2a, 0x00, 0x2a},
334 {0x00, 0x2a, 0x2a},
335 {0x3f, 0x3f, 0x3f},
336 {0x30, 0x30, 0x30},
337 {0x20, 0x20, 0x20},
338 {0x10, 0x10, 0x10},
339 };
340
341 static byte pc_colour[] = {
342 BLACK,
343 RED,
344 GREEN,
345 YELLOW,
346 BLUE,
347 MAGENTA,
348 CYAN,
349 WHITE,
350 DARKGRAY
351 };
352
353 static byte palette_bg = 0xff;
354 static byte palette_fg = 0xff;
355
356 fg = current_fg;
357 bg = current_bg;
358
359 /* V6 game, Amiga mode: Alter the palette registers if the colours
360 of window 0 have changed. DAC register #79 holds the foreground,
361 DAC register #64 the background colour. */
362
363 if (display == _AMIGA_ && z_header.version == V6 && cwin == 0) {
364 if (fg < 16 && fg != palette_fg) {
365 byte R = amiga_palette[fg - 2][0];
366 byte G = amiga_palette[fg - 2][1];
367 byte B = amiga_palette[fg - 2][2];
368
369 #ifdef __WATCOMC__
370 bios_video_ax_bx_dh_ch_cl(0x1010, 79, R, G, B);
371 #else
372 asm mov ax, 0x1010
373 asm mov bx, 79
374 asm mov dh, R
375 asm mov ch, G
376 asm mov cl, B
377 asm int 0x10
378 #endif
379 palette_fg = fg;
380 }
381
382 if (bg < 16 && bg != palette_bg) {
383 byte R = amiga_palette[bg - 2][0];
384 byte G = amiga_palette[bg - 2][1];
385 byte B = amiga_palette[bg - 2][2];
386
387 #ifdef __WATCOMC__
388 bios_video_ax_bx_dh_ch_cl(0x1010, 64, R, G, B);
389 #else
390 asm mov ax, 0x1010
391 asm mov bx, 64
392 asm mov dh, R
393 asm mov ch, G
394 asm mov cl, B
395 asm int 0x10
396 #endif
397 palette_bg = bg;
398
399 }
400
401 }
402
403 /* Handle colours */
404 if (fg < 16) {
405 if (display == _MONO_)
406 fg = (fg == WHITE_COLOUR) ? LIGHTGRAY : BLACK;
407 else if (z_header.version == V6 && display == _AMIGA_)
408 fg = (palette_fg == fg) ? 15 : 0;
409 else
410 fg = pc_colour[fg - 2];
411 } else
412 fg -= 16;
413
414 if (bg < 16) {
415 if (display == _MONO_)
416 bg = (bg == WHITE_COLOUR) ? LIGHTGRAY : BLACK;
417 else if (z_header.version == V6 && display == _AMIGA_)
418 bg = (palette_bg == bg) ? 0 : 15;
419 else
420 bg = pc_colour[bg - 2];
421
422 } else
423 bg -= 16;
424
425 /* Handle reverse text style */
426 if (current_style & REVERSE_STYLE) {
427 text_fg = (user_reverse_fg != -1) ? user_reverse_fg : bg;
428 text_bg = (user_reverse_bg != -1) ? user_reverse_bg : fg;
429 } else {
430 text_fg = fg;
431 text_bg = bg;
432 }
433
434 /* Handle emphasis style */
435 if (current_style & EMPHASIS_STYLE) {
436 if (display == _MONO_ && text_bg == BLACK)
437 text_fg = BLUE; /* blue in monochrome mode is underlined */
438 if (display == _TEXT_)
439 text_fg =
440 (user_emphasis != -1) ? user_emphasis : YELLOW;
441 }
442
443 /* Handle boldface style */
444 if (current_style & BOLDFACE_STYLE) {
445 if (display == _MONO_)
446 text_fg = WHITE;
447 if (display == _TEXT_)
448 text_fg ^= 8;
449
450 }
451
452 /* Set the screen attribute for scrolling and erasing */
453 switch_scrn_attr(FALSE);
454 } /* adjust_style */
455
456
457 /*
458 * os_set_colour
459 *
460 * Set the foreground and background colours which can be:
461 *
462 * DEFAULT_COLOUR
463 * BLACK_COLOUR
464 * RED_COLOUR
465 * GREEN_COLOUR
466 * YELLOW_COLOUR
467 * BLUE_COLOUR
468 * MAGENTA_COLOUR
469 * CYAN_COLOUR
470 * WHITE_COLOUR
471 *
472 * MS-DOS 320 columns MCGA mode only:
473 *
474 * GREY_COLOUR
475 *
476 * Amiga only:
477 *
478 * LIGHTGREY_COLOUR
479 * MEDIUMGREY_COLOUR
480 * DARKGREY_COLOUR
481 *
482 * There may be more colours in the range from 16 to 255; see the remarks
483 * on os_peek_colour.
484 *
485 */
486 void os_set_colour(int new_foreground, int new_background)
487 {
488 current_fg = new_foreground;
489 current_bg = new_background;
490
491 /* Apply changes */
492 adjust_style();
493
494 } /* os_set_colour */
495
496
497 /*
498 * os_set_text_style
499 *
500 * Set the current text style. Following flags can be set:
501 *
502 * REVERSE_STYLE
503 * BOLDFACE_STYLE
504 * EMPHASIS_STYLE (aka underline aka italics)
505 * FIXED_WIDTH_STYLE
506 *
507 */
508 void os_set_text_style(int new_style)
509 {
510 current_style = new_style;
511
512 /* Apply changes */
513 adjust_style();
514
515 } /* os_set_text_style */
516
517
518 /*
519 * os_set_font
520 *
521 * Set the font for text output. The interpreter takes care not to
522 * choose fonts which aren't supported by the interface.
523 *
524 */
525 void os_set_font(int new_font)
526 {
527 current_font = new_font;
528 } /* os_set_font */
529
530
531 /*
532 * write_pattern
533 *
534 * Helper function for drawing characters in EGA and Amiga mode.
535 *
536 */
537 void write_pattern(volatile byte _far * screen, byte val, byte mask)
538 {
539 byte bg = text_bg, fg = text_fg;
540 if (mask != 0) {
541 if (display == _CGA_) {
542 if (bg == BLACK)
543 *screen &= ~mask;
544 if (bg == WHITE)
545 *screen |= mask;
546 if (fg != bg)
547 *screen ^= val;
548 } else if (display == _MCGA_) {
549 byte i;
550
551 for (i = 0x80; (mask & i) != 0; i >>= 1)
552 *screen++ = (val & i) ? fg : bg;
553 } else {
554 #ifdef __WATCOMC__
555 outp(0x3cf, mask);
556 video_latch(*screen);
557 *screen = bg;
558
559 outp(0x3cf, val);
560 video_latch(*screen);
561 *screen = fg;
562 #else
563 asm mov dx, 0x03cf
564 asm mov al, mask
565 asm out dx, al
566 asm les bx, screen
567 asm mov ch, text_bg
568 asm mov al, es:[bx]
569 asm mov es:[bx], ch
570 asm mov al, val
571 asm out dx, al
572 asm mov ch, text_fg
573 asm mov al, es:[bx]
574 asm mov es:[bx], ch
575 #endif
576 }
577 }
578 } /* write_pattern */
579
580
581 /*
582 * os_display_char
583 *
584 * Display a character of the current font using the current colours and
585 * text style. The cursor moves to the next position. Printable codes are
586 * all ASCII values from 32 to 126, ISO Latin-1 characters from 160 to
587 * 255, ZC_GAP (gap between two sentences) and ZC_INDENT (paragraph
588 * indentation). The screen should not be scrolled after printing to the
589 * bottom right corner.
590 *
591 */ void os_display_char(zchar c)
592 {
593 int width = os_char_width(c);
594
595 /* Handle accented characters */
596 if (c >= ZC_LATIN1_MIN
597 && (story_id != BEYOND_ZORK || (z_header.flags & GRAPHICS_FLAG)))
598 if (display == _CGA_ || display == _MCGA_) {
599 char *ptr = latin1_to_ascii + 3 * (c - ZC_LATIN1_MIN);
600
601 char c1 = *ptr++;
602 char c2 = *ptr++;
603 char c3 = *ptr++;
604
605 os_display_char(c1);
606
607 if (c2 != ' ')
608 os_display_char(c2);
609 if (c3 != ' ')
610 os_display_char(c3);
611
612 return;
613
614 } else if (display == _AMIGA_ && current_font == TEXT_FONT
615 && !(current_style & FIXED_WIDTH_STYLE)
616 && user_font != 0) {
617
618 if (c >= ZC_LATIN1_MIN)
619 c -= 32;
620 } else
621 c = latin1_to_ibm[c - ZC_LATIN1_MIN];
622
623 /* Handle special indentations */
624 if (c == ZC_INDENT) {
625 os_display_char(' ');
626 os_display_char(' ');
627 os_display_char(' ');
628 return;
629 }
630 if (c == ZC_GAP) {
631 os_display_char(' ');
632 os_display_char(' ');
633 return;
634 }
635
636 /* Display character */
637 if (display <= _TEXT_) {
638 #ifdef __WATCOMC__
639 bios_video_ah_bh_dh_dl(2, 0, cursor_y, cursor_x);
640 bios_video_ah_al_bh_bl_cx(9, c, 0, text_bg << 4 | text_fg, 1);
641 #else
642 asm mov ah, 2
643 asm mov bh, 0
644 asm mov dh, byte ptr cursor_y
645 asm mov dl, byte ptr cursor_x
646 asm int 0x10
647 asm mov ah, 9
648 asm mov bh, 0
649 asm mov bl, byte ptr text_bg
650 asm mov cl, 4
651 asm shl bl, cl
652 asm or bl, byte ptr text_fg
653 asm mov cx, 1
654 asm mov al, byte ptr c
655 asm int 0x10
656 #endif
657 } else {
658 void _far *table;
659 word mask;
660 word val;
661 byte mask0;
662 byte mask1;
663 int align;
664 int underline;
665 int boldface;
666 int type;
667
668 int shift = (display != _MCGA_) ? cursor_x % 8 : 0;
669 int offset = (display != _MCGA_) ? cursor_x / 8 : cursor_x;
670
671 int i;
672
673 if (current_font == GRAPHICS_FONT) {
674 table = graphics_font + 8 * (c - 32);
675 mask = 0xff;
676 underline = -1;
677 boldface = -1;
678 align = 0;
679 type = 1;
680 } else if (display == _AMIGA_ && current_font == TEXT_FONT
681 && !(current_style & FIXED_WIDTH_STYLE)
682 && user_font != 0) {
683 table = sans_font + 16 * (c - 32);
684 mask = 0xffff << (16 - width);
685 underline = 14;
686 boldface = 1;
687 align = 0;
688 type = 2;
689 } else if (display == _CGA_) {
690 table = (byte _far *) MK_FP(0xf000, 0xfa6e) + 8 * c;
691 mask = 0xff;
692 underline = 7;
693 boldface = (user_bold_typing != -1) ? 1 : -1;
694 align = 0;
695 type = 3;
696 } else if (display >= _EGA_) {
697 table = (byte _far *) getvect(0x43) + z_header.font_height * c;
698 mask = 0xff;
699 underline = z_header.font_height - 1;
700 boldface = (user_bold_typing != -1) ? 1 : -1;
701 align = 0;
702 type = 3;
703 } else {
704 table = mcga_font + 8 * (c - 32);
705 mask = 0xff & (0xff << (8 - width));
706 underline = 7;
707 boldface = -1;
708 align = (width + 1 - mcga_width[c - 32]) / 2;
709 type = 3;
710 }
711
712 mask0 = mask >> shift;
713 mask1 = mask << (8 - shift);
714
715 if (!(current_style & BOLDFACE_STYLE))
716 boldface = -1;
717 if (!(current_style & EMPHASIS_STYLE))
718 underline = -1;
719
720 if (display >= _EGA_) {
721 outport(0x03ce, 0x0205);
722 outport(0x03ce, 0xff08);
723 }
724
725 for (i = 0; i < z_header.font_height; i++) {
726 volatile byte _far *screen =
727 get_scrnptr(cursor_y + i) + offset;
728 if (type == 1) {
729 val =
730 *((byte _far *) table +
731 8 * i / z_header.font_height);
732 }
733 if (type == 2)
734 val = *((word _far *) table + i);
735 if (type == 3)
736 val = *((byte _far *) table + i);
737
738 if (align != 0)
739 val >>= align;
740
741 if (boldface == 1)
742 val |= val >> 1;
743 if (underline == i)
744 val ^= mask;
745
746 if (type == 2)
747 write_pattern(screen++, val >> (8 + shift),
748 mask >> (8 + shift));
749
750 write_pattern(screen + 0, val >> shift, mask0);
751 write_pattern(screen + 1, val << (8 - shift), mask1);
752 }
753 }
754
755 /* Move cursor to next position */
756 cursor_x += width;
757 } /* os_display_char */
758
759
760 /*
761 * os_display_string
762 *
763 * Pass a string of characters to os_display_char.
764 *
765 */
766 void os_display_string(const zchar * s)
767 {
768 zchar c;
769
770 while ((c = *s++) != 0) {
771 if (c == ZC_NEW_FONT || c == ZC_NEW_STYLE) {
772
773 int arg = *s++;
774
775 if (c == ZC_NEW_FONT)
776 os_set_font(arg);
777 if (c == ZC_NEW_STYLE)
778 os_set_text_style(arg);
779
780 } else
781 os_display_char(c);
782 }
783 } /* os_display_string */
784
785
786 /*
787 * os_char_width
788 *
789 * Return the width of the character in screen units.
790 *
791 */
792
793 int os_char_width(zchar c)
794 {
795 /* Handle accented characters */
796 if (c >= ZC_LATIN1_MIN
797 && (story_id != BEYOND_ZORK || (z_header.flags & GRAPHICS_FLAG)))
798 if (display == _CGA_ || display == _MCGA_) {
799
800 const char *ptr =
801 latin1_to_ascii + 3 * (c - ZC_LATIN1_MIN);
802
803 int width = 0;
804
805 char c1 = *ptr++;
806 char c2 = *ptr++;
807 char c3 = *ptr++;
808
809 width = os_char_width(c1);
810
811 if (c2 != ' ')
812 width += os_char_width(c2);
813 if (c3 != ' ')
814 width += os_char_width(c3);
815
816 return width;
817
818 } else if (display == _AMIGA_ && current_font == TEXT_FONT
819 && !(current_style & FIXED_WIDTH_STYLE)
820 && user_font != 0)
821 if (c >= ZC_LATIN1_MIN)
822 c -= 32;
823
824 /* Handle special indentations */
825 if (c == ZC_INDENT)
826 return 3 * os_char_width(' ');
827 if (c == ZC_GAP)
828 return 2 * os_char_width(' ');
829
830 /* Calculate width */
831 if (display <= _TEXT_)
832 return 1;
833 if (display == _CGA_)
834 return 8;
835 if (display == _EGA_)
836 return 8;
837
838 if (current_font == GRAPHICS_FONT)
839 return 8;
840 if (current_font == FIXED_WIDTH_FONT
841 || (current_style & FIXED_WIDTH_STYLE) || (display == _AMIGA_
842 && user_font == 0))
843 return (display == _AMIGA_) ? 8 : 5;
844
845 if (display == _MCGA_)
846 return mcga_width[c - 32];
847 if (display == _AMIGA_)
848 return sans_width[c - 32] +
849 ((current_style & BOLDFACE_STYLE) ? 1 : 0);
850
851 return 0;
852 } /* os_char_width */
853
854
855 /*
856 * os_string_width
857 *
858 * Calculate the length of a word in screen units. Apart from letters,
859 * the word may contain special codes:
860 *
861 * ZC_NEW_STYLE - next character is a new text style
862 * ZC_NEW_FONT - next character is a new font
863 *
864 */
865 int os_string_width(const zchar * s)
866 {
867 int width = 0;
868
869 int saved_font = current_font;
870 int saved_style = current_style;
871
872 zchar c;
873
874 while ((c = *s++) != 0) {
875 if (c == ZC_NEW_STYLE || c == ZC_NEW_FONT) {
876
877 int arg = *s++;
878
879 if (c == ZC_NEW_FONT)
880 current_font = arg;
881 if (c == ZC_NEW_STYLE)
882 current_style = arg;
883
884 } else
885 width += os_char_width(c);
886 }
887 current_font = saved_font;
888 current_style = saved_style;
889
890 return width;
891 } /* os_string_width */
892
893
894 /*
895 * os_set_cursor
896 *
897 * Place the text cursor at the given coordinates. Top left is (1,1).
898 *
899 */
900 void os_set_cursor(int y, int x)
901 {
902 cursor_y = y - 1;
903 cursor_x = x - 1;
904 } /* os_set_cursor */
905
906
907 /*
908 * os_more_prompt
909 *
910 * Display a MORE prompt, wait for a keypress and remove the MORE
911 * prompt from the screen.
912 *
913 */
914 void os_more_prompt(void)
915 {
916 int saved_x;
917
918 /* Save text font and style */
919 int saved_font = current_font;
920 int saved_style = current_style;
921
922 /* Choose plain text style */
923 current_font = TEXT_FONT;
924 current_style = 0;
925
926 adjust_style();
927
928 /* Wait until the user presses a key */
929 saved_x = cursor_x;
930 os_display_string((zchar *) "[MORE]");
931 os_read_key(0, TRUE);
932
933 os_erase_area(cursor_y + 1,
934 saved_x + 1, cursor_y + z_header.font_height, cursor_x + 1, -1);
935
936 cursor_x = saved_x;
937
938 /* Restore text font and style */
939 current_font = saved_font;
940 current_style = saved_style;
941
942 adjust_style();
943 } /* os_more_prompt */
944
945 /*
946 * os_from_true_colour
947 *
948 * Given a true colour, return an appropriate colour index.
949 *
950 * This currently follows xfrotz's "pretty brain-dead" (but very much working)
951 * implementation.
952 *
953 */
954 int os_from_true_colour(zword colour)
955 {
956 #ifndef NO_TRUECOLOUR
957 if (colour == 0xfffe)
958 return 0;
959 else if (colour == 0xffff)
960 return 1;
961 else {
962 int r = colour & 0x001F;
963 int g = colour & 0x03E0;
964 int b = colour & 0x7C00;
965 int index = (r ? 4 : 0) | (g ? 2 : 0) | (b ? 1 : 0);
966
967 switch (index) {
968 case 0: return 2;
969 case 1: return 6;
970 case 2: return 4;
971 case 3: return 8;
972 case 4: return 3;
973 case 5: return 7;
974 case 6: return 5;
975 case 7: return 9;
976 default: return 1; /* Can't happen */
977 }
978 }
979 #endif
980 return 0;
981 }
982
983 /*
984 * os_to_true_colour
985 *
986 * Given a colour index, return the appropriate true colour.
987 *
988 * This currently follows xfrotz's implementation.
989 *
990 */
991 zword os_to_true_colour(int index)
992 {
993 #ifndef NO_TRUECOLOUR
994 switch (index) {
995 case 0: return -2;
996 case 1: return -1;
997 case 2: return 0x0000;
998 case 3: return 0x001D;
999 case 4: return 0x0340;
1000 case 5: return 0x03BD;
1001 case 6: return 0x59A0;
1002 case 7: return 0x7C1F;
1003 case 8: return 0x77A0;
1004 case 9: return 0x7FFF;
1005 case 10: return 0x5AD6;
1006 case 11: return 0x4631;
1007 case 12: return 0x2D6B;
1008 default: return 0x0000;
1009 }
1010 #else
1011 return 0;
1012 #endif
1013 }
0 -a watch attribute setting
1 -A watch attribute testing
2 -b # background colour
3 -B # reverse background colour
4 -c # context lines
5 -d # display mode (see below)
6 -e # emphasis colour [mode 1]
7 -f # foreground colour
8 -F # reverse foreground colour
9 -g # font [mode 5] (see below)
10 -h # screen height
11 -i ignore runtime errors
12 -l # left margin
13 -o watch object movement
14 -O watch object locating
15 -p alter piracy opcode
16 -q quiet (disable sound effects)
17 -r # right margin
18 -R <path> restricted read/write
19 -s # random number seed value
20 -S # transcript width
21 -t set Tandy bit
22 -T bold typing [modes 2+4+5]
23 -u # slots for multiple undo
24 -v show version information
25 -w # screen width
26 -x expand abbreviations g/x/z
27 -Z # error checking (see below)
0 /*
1 * font_data[]
2 *
3 * 0x0000: sans-serif 192*(2*16)+192 bytes 16x16 px
4 * 0x18C0: vga 256*(1*16) bytes 8x16 px
5 * 0x28c0: ega 256*(1*14) bytes 8x14 px
6 * 0x36c0: ega graphic 256*(8*8) bytes 8x8 px
7 * 0x3ec0: mcga 96*(1*8) +96 bytes 8x8 px
8 * 0x4220: graphics 96*(1*8) bytes 8x8 px
9 *
10 */
11
012 static unsigned char font_data[] = {
1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
5 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
6 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
7 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
10 0x00, 0x7e, 0x00, 0x28, 0x00, 0x28, 0x00, 0xfc, 0x00, 0x50, 0x00, 0x50,
11 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x40,
13 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x20,
14 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x30,
15 0x40, 0x48, 0x80, 0x48, 0x00, 0x31, 0x00, 0x02, 0x00, 0x04, 0xc0, 0x08,
16 0x20, 0x11, 0x20, 0x21, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28,
18 0x00, 0x28, 0x80, 0x13, 0x00, 0x29, 0x00, 0x45, 0x00, 0x42, 0x00, 0x45,
19 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
23 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
24 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
25 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20,
26 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
27 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x00, 0x00, 0x10, 0x00, 0x54, 0x00, 0x38, 0x00, 0x54, 0x00, 0x10,
29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x10,
32 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
42 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
43 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
45 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
47 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
48 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08,
50 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x48,
51 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x30,
53 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
55 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x78,
56 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40,
58 0x00, 0x40, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48,
59 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
61 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
63 0x00, 0x48, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20,
64 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48,
66 0x00, 0x48, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
67 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
69 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
77 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20,
82 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
83 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10,
85 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
87 0x40, 0x20, 0x20, 0x47, 0x20, 0x49, 0x20, 0x49, 0x20, 0x49, 0x20, 0x49,
88 0x20, 0x47, 0xc0, 0x20, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
90 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
91 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e,
93 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x7e, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e,
95 0x80, 0x21, 0x80, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
96 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x23, 0x00, 0x21,
98 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x23,
99 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
101 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
103 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
104 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
106 0x00, 0x40, 0x00, 0x40, 0xc0, 0x41, 0x80, 0x40, 0x80, 0x40, 0x80, 0x20,
107 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3f,
109 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x80, 0x73, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
111 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
112 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x10, 0x00, 0x10,
114 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90,
115 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x77, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30,
117 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x21, 0x80, 0x73, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
119 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
120 0x00, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x80, 0x31, 0x80, 0x31,
122 0x80, 0x31, 0x80, 0x2a, 0x80, 0x2a, 0x80, 0x2a, 0x80, 0x24, 0x80, 0x24,
123 0xc0, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x80, 0x63, 0x00, 0x31, 0x00, 0x31, 0x00, 0x29, 0x00, 0x29,
125 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x71, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
127 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
128 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x22, 0x00, 0x22,
130 0x00, 0x22, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
131 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
133 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x06,
134 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
135 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x24,
136 0x00, 0x22, 0x00, 0x21, 0x80, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4c, 0x00, 0x44,
138 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x04, 0x00, 0x44, 0x00, 0x64,
139 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x80, 0xff, 0x80, 0x88, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
141 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x73,
143 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
144 0x00, 0x21, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0x00, 0x41, 0x00, 0x41,
146 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08,
147 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0xb8, 0xed, 0x10, 0x45, 0x10, 0x45, 0x20, 0x22, 0x20, 0x22,
149 0x40, 0x15, 0x40, 0x15, 0x40, 0x15, 0x80, 0x08, 0x80, 0x08, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe1,
151 0x80, 0x40, 0x00, 0x21, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x12,
152 0x00, 0x21, 0x80, 0x40, 0xc0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0x00, 0x41, 0x00, 0x22,
154 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
155 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08,
157 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x41, 0x00, 0xff, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
159 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
160 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
162 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
163 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
165 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
166 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28,
167 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
176 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
178 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
179 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
181 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
183 0x00, 0x04, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
184 0x00, 0x44, 0x00, 0x44, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x44,
187 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x40,
189 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
192 0x00, 0x38, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
194 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
195 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40,
197 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
200 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
202 0x00, 0x4c, 0x00, 0x48, 0x00, 0x50, 0x00, 0x70, 0x00, 0x48, 0x00, 0x44,
203 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
205 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x6d, 0x00, 0x49, 0x00, 0x49,
208 0x00, 0x49, 0x00, 0x49, 0x80, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210 0x00, 0xd8, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
211 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
213 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44,
216 0x00, 0x44, 0x00, 0x44, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
219 0x00, 0x3c, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x60,
221 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20,
224 0x00, 0x10, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
226 0x00, 0xe0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
227 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
229 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
232 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x80, 0xdd, 0x80, 0x88, 0x80, 0x88, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22,
235 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44,
237 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0xee, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
240 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xc0,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x7c, 0x00, 0x44, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x44,
243 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
245 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
246 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
247 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
248 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
250 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20,
251 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
261 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x50,
264 0x00, 0x50, 0x00, 0x64, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40,
266 0x00, 0x40, 0x00, 0x20, 0x00, 0x78, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24,
267 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 0x00, 0x00, 0x00, 0xb4, 0x00, 0x48, 0x00, 0x48, 0x00, 0xb4, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc,
271 0x00, 0x88, 0x00, 0xf8, 0x00, 0x50, 0x00, 0xf8, 0x00, 0x20, 0x00, 0x20,
272 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
274 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
275 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40, 0x00, 0x20, 0x00, 0x50,
277 0x00, 0x48, 0x00, 0x48, 0x00, 0x28, 0x00, 0x10, 0x00, 0x08, 0x00, 0x48,
278 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x4e,
282 0x40, 0x51, 0x40, 0x50, 0x40, 0x50, 0x40, 0x51, 0x40, 0x4e, 0x80, 0x20,
283 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
285 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28,
288 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
295 0x80, 0x20, 0x40, 0x5e, 0x40, 0x51, 0x40, 0x51, 0x40, 0x5e, 0x40, 0x52,
296 0x40, 0x51, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x20,
306 0x00, 0x40, 0x00, 0x80, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
309 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20,
311 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
315 0x00, 0x7b, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x38,
317 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
325 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
327 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x28,
331 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x80, 0x40, 0x00, 0xc1, 0x00, 0x42, 0x00, 0x44, 0x80, 0x48,
333 0x80, 0xe9, 0x80, 0x12, 0x80, 0x22, 0x80, 0x43, 0x80, 0x80, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40,
335 0x00, 0xc1, 0x00, 0x42, 0x00, 0x44, 0x00, 0x49, 0x80, 0xea, 0x80, 0x10,
336 0x00, 0x21, 0x00, 0x42, 0x80, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x00, 0x21, 0x00, 0x42,
338 0x00, 0x24, 0x80, 0x28, 0x80, 0xc9, 0x80, 0x12, 0x80, 0x22, 0x80, 0x43,
339 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
341 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08,
343 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e,
344 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
346 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
347 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14,
348 0x00, 0x22, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22,
349 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x08,
351 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e,
352 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
354 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
355 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14,
356 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22,
357 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07,
359 0x20, 0x0a, 0x00, 0x0a, 0x40, 0x12, 0xc0, 0x13, 0x40, 0x22, 0x00, 0x3e,
360 0x00, 0x42, 0x20, 0x42, 0xe0, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
362 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x80, 0x40, 0x00, 0x21,
363 0x00, 0x1e, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08,
364 0x00, 0x04, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
365 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x7e,
367 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
368 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20,
370 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22,
371 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
372 0x00, 0x00, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
373 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x70,
375 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
376 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20,
378 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
379 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50,
380 0x00, 0x88, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
381 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x70,
383 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
384 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x23, 0x00, 0x21,
386 0x80, 0x20, 0x80, 0x70, 0x80, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x23,
387 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26,
388 0x00, 0x00, 0x80, 0x63, 0x00, 0x31, 0x00, 0x31, 0x00, 0x29, 0x00, 0x29,
389 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x71, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1e,
391 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
392 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
394 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
395 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12,
396 0x00, 0x21, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
397 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x1e,
399 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
400 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
402 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
403 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x28,
405 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1e,
407 0x80, 0x21, 0x80, 0x41, 0x80, 0x42, 0x80, 0x44, 0x80, 0x48, 0x80, 0x50,
408 0x80, 0x60, 0x00, 0x61, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21,
410 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
411 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
412 0x00, 0x08, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
413 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x21, 0x80, 0x73,
415 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
416 0x00, 0x21, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21,
418 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
419 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08,
420 0x00, 0x10, 0x80, 0xe3, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14,
421 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
423 0x00, 0x20, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22,
424 0x00, 0x3c, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44,
426 0x00, 0x44, 0x00, 0x48, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
427 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08,
429 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00,
430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
431 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
432 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00,
434 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
435 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08,
437 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00,
438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439 0x00, 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
440 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00,
442 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
443 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09,
445 0x00, 0x3f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00,
446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40,
448 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10,
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00,
450 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
451 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
453 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28,
455 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40,
456 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
458 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
459 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40,
461 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
463 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
464 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x00,
466 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
467 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40,
469 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
471 0x00, 0x20, 0x00, 0x50, 0x00, 0x08, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44,
472 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00,
474 0x00, 0xd8, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
475 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
477 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
479 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
480 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00,
482 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
483 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
485 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
488 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x10, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
491 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c,
493 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x64, 0x00, 0x78, 0x00, 0x00,
494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10,
495 0x00, 0x08, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
496 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
498 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
499 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
501 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00,
502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503 0x00, 0x44, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
504 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
506 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10,
507 0x00, 0x10, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
508 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x58, 0x00, 0x64,
509 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x78, 0x00, 0x40,
510 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
511 0x00, 0x44, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
512 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xc0,
513 0x03, 0x03, 0x05, 0x07, 0x06, 0x0c, 0x0a, 0x03, 0x04, 0x04, 0x07, 0x07,
514 0x03, 0x04, 0x03, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
515 0x06, 0x06, 0x03, 0x03, 0x07, 0x07, 0x07, 0x06, 0x0c, 0x09, 0x09, 0x09,
516 0x0a, 0x08, 0x07, 0x0a, 0x0a, 0x05, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0a,
517 0x08, 0x0a, 0x09, 0x07, 0x09, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x08, 0x04,
518 0x04, 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x04, 0x07,
519 0x07, 0x03, 0x03, 0x07, 0x03, 0x09, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05,
520 0x03, 0x07, 0x07, 0x09, 0x07, 0x07, 0x07, 0x05, 0x03, 0x05, 0x08, 0x00,
521 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x03, 0x06, 0x05, 0x0b, 0x04, 0x07,
522 0x07, 0x04, 0x0b, 0x06, 0x04, 0x07, 0x03, 0x03, 0x04, 0x08, 0x06, 0x03,
523 0x04, 0x03, 0x04, 0x07, 0x09, 0x09, 0x09, 0x06, 0x09, 0x09, 0x09, 0x09,
524 0x09, 0x09, 0x0c, 0x09, 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x05,
525 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x0a, 0x0a, 0x0a, 0x0a,
526 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x06,
527 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07,
528 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
531 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
532 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
533 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
535 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24,
538 0x00, 0xff, 0x00, 0x24, 0x00, 0x24, 0x00, 0xff, 0x00, 0x48, 0x00, 0x48,
539 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540 0x00, 0x10, 0x00, 0x38, 0x00, 0x54, 0x00, 0x54, 0x00, 0x50, 0x00, 0x30,
541 0x00, 0x18, 0x00, 0x14, 0x00, 0x54, 0x00, 0x54, 0x00, 0x38, 0x00, 0x10,
542 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60,
543 0x80, 0x90, 0x00, 0x91, 0x00, 0x91, 0x00, 0x62, 0x60, 0x04, 0x90, 0x08,
544 0x90, 0x10, 0x90, 0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09,
546 0x00, 0x0a, 0xe0, 0x0c, 0x40, 0x34, 0x80, 0x44, 0x00, 0x43, 0x10, 0x62,
547 0xe0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
548 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
549 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
551 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
552 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08,
553 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
554 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
555 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
556 0x00, 0x10, 0x00, 0x54, 0x00, 0x38, 0x00, 0x38, 0x00, 0x54, 0x00, 0x10,
557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xfe, 0x00, 0x10, 0x00, 0x10,
560 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563 0x00, 0xc0, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20,
570 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80,
571 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
573 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
574 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
575 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
576 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04,
578 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x44,
579 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18,
581 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00,
582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
583 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x88, 0x00, 0xfc,
584 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x20,
586 0x00, 0x70, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08,
587 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x20, 0x00, 0x58, 0x00, 0x64,
589 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
590 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
591 0x00, 0x82, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08,
592 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
593 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44,
594 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
595 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
597 0x00, 0x3c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00,
598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
599 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
602 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603 0x00, 0x60, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x40,
605 0x00, 0x30, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
608 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30,
610 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00,
611 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08,
613 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x10, 0x08, 0x08, 0x10,
615 0xa8, 0x23, 0x68, 0x44, 0x48, 0x48, 0x48, 0x48, 0x88, 0x48, 0x88, 0x48,
616 0x90, 0x49, 0x64, 0x46, 0x08, 0x20, 0x10, 0x10, 0x20, 0x08, 0xc0, 0x07,
617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a,
618 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20,
619 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e,
621 0x00, 0x21, 0x80, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7e, 0x00, 0x00,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e,
623 0x80, 0x21, 0x80, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
624 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x80, 0x20,
626 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x80, 0x20, 0x00, 0x21,
627 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
628 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
629 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
631 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
632 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
634 0x00, 0x40, 0x00, 0x40, 0xc0, 0x41, 0x80, 0x40, 0x80, 0x40, 0x80, 0x20,
635 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x3f,
637 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0xc0, 0x71, 0x00, 0x00,
638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
639 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
640 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x10, 0x00, 0x10,
642 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90,
643 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644 0x00, 0x00, 0xc0, 0x73, 0x00, 0x21, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38,
645 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x21, 0xc0, 0x73, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
647 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
648 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x60, 0x30, 0xa0, 0x28,
650 0xa0, 0x28, 0xa0, 0x28, 0x20, 0x25, 0x20, 0x25, 0x20, 0x25, 0x20, 0x22,
651 0x70, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652 0x00, 0x00, 0xc0, 0x61, 0x80, 0x20, 0x80, 0x30, 0x80, 0x28, 0x80, 0x24,
653 0x80, 0x24, 0x80, 0x22, 0x80, 0x21, 0x80, 0x20, 0x80, 0x70, 0x00, 0x00,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
655 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
656 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x00, 0x21,
658 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
659 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
661 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x04,
662 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
663 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x22,
664 0x00, 0x22, 0x00, 0x21, 0xc0, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x42,
666 0x00, 0x40, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x42, 0x00, 0x62,
667 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668 0x00, 0x00, 0x80, 0xff, 0x80, 0x88, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
669 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00,
670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x71,
671 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20,
672 0x80, 0x20, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf1, 0x80, 0x20, 0x80, 0x20,
674 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c,
675 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676 0x00, 0x00, 0xbc, 0xf7, 0x08, 0x21, 0x10, 0x21, 0x10, 0x23, 0x90, 0x12,
677 0xa0, 0x14, 0xa0, 0x14, 0xa0, 0x14, 0x40, 0x08, 0x40, 0x08, 0x00, 0x00,
678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xfb,
679 0x80, 0x20, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0a,
680 0x00, 0x12, 0x00, 0x21, 0xc0, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x79, 0x80, 0x10, 0x00, 0x11,
682 0x00, 0x09, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04,
683 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684 0x00, 0x00, 0x00, 0x7f, 0x00, 0x42, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08,
685 0x00, 0x10, 0x00, 0x20, 0x80, 0x20, 0x00, 0x41, 0x00, 0xff, 0x00, 0x00,
686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x40,
687 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
688 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
689 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40,
690 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10,
691 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692 0x00, 0xe0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
693 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
694 0x00, 0x20, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
695 0x00, 0x48, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00,
696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
700 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c,
704 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
706 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
707 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
709 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c,
711 0x00, 0x04, 0x00, 0x04, 0x00, 0x34, 0x00, 0x4c, 0x00, 0x44, 0x00, 0x44,
712 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
715 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
716 0x00, 0x38, 0x00, 0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40,
717 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x8c, 0x00, 0x88, 0x00, 0x88,
720 0x00, 0x70, 0x00, 0x80, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78,
721 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
722 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
723 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
724 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0,
725 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
727 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20,
728 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xc0,
729 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
730 0x00, 0x4e, 0x00, 0x48, 0x00, 0x50, 0x00, 0x70, 0x00, 0x48, 0x00, 0x44,
731 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
732 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
733 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735 0x00, 0x00, 0x00, 0x00, 0x80, 0x59, 0x40, 0xe6, 0x40, 0x44, 0x40, 0x44,
736 0x40, 0x44, 0x40, 0x44, 0xe0, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
738 0x00, 0x58, 0x00, 0xe4, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
739 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
741 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0xe4, 0x00, 0x44, 0x00, 0x44,
744 0x00, 0x44, 0x00, 0x64, 0x00, 0x58, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0,
745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
746 0x00, 0x34, 0x00, 0x4c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
747 0x00, 0x34, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0xe0,
749 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x40, 0x00, 0x30,
752 0x00, 0x08, 0x00, 0x48, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
754 0x00, 0xf0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50,
755 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
757 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
760 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762 0xe0, 0xee, 0x40, 0x44, 0x40, 0x44, 0x80, 0x2a, 0x80, 0x2a, 0x00, 0x33,
763 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44,
765 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0xee, 0x00, 0x00,
766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
768 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x7c, 0x00, 0x48, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x44,
771 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
773 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
774 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
775 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
776 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10,
778 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
779 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 0x00, 0x71, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
789 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
790 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791 0x00, 0x02, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x46, 0x00, 0x48, 0x00, 0x48,
792 0x00, 0x52, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40,
793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x20,
794 0x00, 0x20, 0x00, 0x78, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x62,
795 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x24, 0x00, 0x42,
797 0x00, 0x42, 0x00, 0x24, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77,
799 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7f, 0x00, 0x08, 0x00, 0x7f,
800 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
802 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
803 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x20, 0x00, 0x10, 0x00, 0x28,
805 0x00, 0x44, 0x00, 0x42, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x04,
806 0x00, 0x24, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x40, 0x40, 0x9f,
810 0x40, 0xa1, 0x40, 0xa0, 0x40, 0xa0, 0x40, 0xa1, 0x40, 0x9e, 0x80, 0x40,
811 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812 0x00, 0x00, 0x00, 0xe0, 0x00, 0xa0, 0x00, 0x60, 0x00, 0xa0, 0x00, 0xf0,
813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48, 0x00, 0x90,
816 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
823 0x80, 0x40, 0x40, 0xbc, 0x40, 0x92, 0x40, 0x9c, 0x40, 0x94, 0x40, 0x92,
824 0x40, 0xb9, 0x80, 0x40, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
828 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xfe, 0x00, 0x10, 0x00, 0x10,
832 0x00, 0x10, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x90, 0x00, 0x20,
834 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0xe0, 0x00, 0x10, 0x00, 0x60, 0x00, 0x10, 0x00, 0xe0,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
839 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
843 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x7e, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4,
845 0x00, 0x74, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
846 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
852 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70,
853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
855 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858 0x00, 0x90, 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48,
859 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
860 0x00, 0x00, 0x80, 0x20, 0x80, 0x60, 0x00, 0x21, 0x00, 0x22, 0x00, 0x72,
861 0x40, 0x04, 0xc0, 0x08, 0x40, 0x09, 0xe0, 0x11, 0x40, 0x20, 0x00, 0x00,
862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20,
863 0x00, 0x61, 0x00, 0x22, 0x00, 0x22, 0x00, 0x74, 0xe0, 0x08, 0x20, 0x09,
864 0x40, 0x10, 0x80, 0x20, 0xe0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0x00, 0x11, 0x00, 0x62,
866 0x00, 0x12, 0x00, 0xe4, 0x40, 0x08, 0xc0, 0x08, 0x40, 0x11, 0xe0, 0x21,
867 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
869 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x44,
870 0x00, 0x44, 0x00, 0x38, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04,
871 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f,
872 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a,
874 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20,
875 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09,
876 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11,
877 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x00, 0x04,
879 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f,
880 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a,
882 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20,
883 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09,
884 0x00, 0x09, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11,
885 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f,
887 0x08, 0x06, 0x00, 0x0a, 0x20, 0x0a, 0xe0, 0x13, 0x20, 0x3e, 0x00, 0x22,
888 0x08, 0x42, 0x18, 0x42, 0xf0, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
890 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x80, 0x40, 0x00, 0x21,
891 0x00, 0x1e, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08,
892 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
893 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00,
894 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7f,
895 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
896 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
897 0x00, 0x0c, 0x00, 0x12, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20,
898 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21,
899 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
900 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
901 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70,
903 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
904 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20,
906 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
907 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48,
908 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
909 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70,
911 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
912 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x20, 0x40, 0x20,
914 0x20, 0x20, 0x20, 0xfe, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x80, 0x20,
915 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x16,
916 0x00, 0x00, 0xc0, 0x61, 0x80, 0x20, 0x80, 0x30, 0x80, 0x28, 0x80, 0x24,
917 0x80, 0x24, 0x80, 0x22, 0x80, 0x21, 0x80, 0x20, 0x80, 0x70, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f,
919 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
920 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
921 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40,
922 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20,
923 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09,
924 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
925 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x00, 0x1f,
927 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
928 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40,
930 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20,
931 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18,
933 0x00, 0x18, 0x00, 0x24, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1f,
935 0x80, 0x21, 0x80, 0x41, 0x40, 0x42, 0x40, 0x44, 0x40, 0x48, 0x40, 0x48,
936 0x40, 0x30, 0x80, 0x30, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20,
938 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11,
939 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
940 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20,
941 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0xc0, 0x71,
943 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20,
944 0x80, 0x20, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20,
946 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11,
947 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
948 0x00, 0x00, 0xe0, 0x79, 0x80, 0x10, 0x00, 0x11, 0x00, 0x09, 0x00, 0x0a,
949 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
951 0x00, 0x20, 0x00, 0x3e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
952 0x00, 0x3e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
954 0x00, 0x4c, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
955 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
957 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00,
958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
959 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c,
960 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
962 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44,
963 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
965 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x28, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c,
968 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00,
970 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44,
971 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x48,
973 0x80, 0x1f, 0x00, 0x28, 0x00, 0x48, 0x80, 0x48, 0x00, 0x77, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40,
976 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00,
978 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
979 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
981 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
983 0x00, 0x24, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40,
984 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
986 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
987 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0,
989 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
991 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
992 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x00,
994 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
995 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0,
997 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
998 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x18,
999 0x00, 0x28, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42,
1000 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1001 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00,
1002 0x00, 0x58, 0x00, 0xe4, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1003 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1005 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1007 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1008 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
1010 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1011 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1013 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015 0x00, 0x28, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1016 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1018 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x46,
1021 0x00, 0x46, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x22, 0x00, 0x5c, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1023 0x00, 0x10, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1024 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
1026 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4e,
1027 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
1029 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031 0x00, 0x28, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1032 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
1034 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10,
1035 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5c, 0x00, 0x62,
1037 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7c, 0x00, 0x40,
1038 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1039 0x00, 0x28, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
1040 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
1041 0x04, 0x03, 0x05, 0x08, 0x07, 0x0d, 0x0c, 0x03, 0x05, 0x05, 0x07, 0x08,
1042 0x03, 0x05, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
1043 0x07, 0x07, 0x03, 0x04, 0x08, 0x08, 0x08, 0x07, 0x0e, 0x0b, 0x0a, 0x0a,
1044 0x0b, 0x09, 0x08, 0x0a, 0x0b, 0x05, 0x06, 0x0b, 0x09, 0x0d, 0x0b, 0x0b,
1045 0x09, 0x0b, 0x0a, 0x08, 0x09, 0x0b, 0x0b, 0x0e, 0x0a, 0x0b, 0x09, 0x05,
1046 0x04, 0x04, 0x06, 0x08, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x07,
1047 0x07, 0x03, 0x04, 0x07, 0x03, 0x0b, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06,
1048 0x04, 0x07, 0x07, 0x0b, 0x07, 0x07, 0x06, 0x07, 0x03, 0x07, 0x08, 0x00,
1049 0x04, 0x03, 0x08, 0x08, 0x08, 0x09, 0x03, 0x08, 0x05, 0x0b, 0x04, 0x07,
1050 0x08, 0x05, 0x0b, 0x08, 0x06, 0x08, 0x05, 0x05, 0x04, 0x07, 0x07, 0x04,
1051 0x04, 0x05, 0x04, 0x07, 0x0b, 0x0b, 0x0b, 0x07, 0x0b, 0x0b, 0x0b, 0x0b,
1052 0x0b, 0x0b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05, 0x05,
1053 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x08, 0x0b, 0x0b, 0x0b, 0x0b,
1054 0x0b, 0x0b, 0x09, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x07,
1055 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x04, 0x03, 0x08, 0x07, 0x07, 0x07,
1056 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07,
1057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1060 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1061 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11,
1066 0x80, 0x7f, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xff, 0x00, 0x44,
1067 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x10, 0x00, 0x3e, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50,
1069 0x00, 0x3c, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x7c, 0x00, 0x10,
1070 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
1071 0x00, 0x32, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x38, 0x00, 0x08, 0x00, 0x13,
1072 0x80, 0x14, 0x80, 0x34, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14,
1074 0x00, 0x1c, 0x00, 0x18, 0x00, 0x2a, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x44,
1075 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1079 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1080 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10,
1081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40,
1082 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1083 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xf8, 0x00, 0x30, 0x00, 0x48,
1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xf8,
1088 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1098 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1099 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1101 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1104 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1106 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1107 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04,
1109 0x00, 0x38, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1111 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x88, 0x00, 0xfc,
1112 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x40,
1114 0x00, 0x40, 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x04, 0x00, 0x44,
1115 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x78,
1117 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1119 0x00, 0xfe, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10,
1120 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1122 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1123 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1124 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1125 0x00, 0x44, 0x00, 0x3c, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
1126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1128 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1130 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1131 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1133 0x00, 0x60, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
1141 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
1143 0x80, 0x61, 0x40, 0x4c, 0x40, 0x98, 0x40, 0xa6, 0x40, 0xa6, 0x80, 0x9d,
1144 0x00, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1146 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
1147 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1148 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22,
1149 0x00, 0x3c, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x1c, 0x00, 0x24, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80,
1152 0x00, 0x80, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x58,
1154 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42,
1155 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1157 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x40,
1160 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1162 0x00, 0x40, 0x00, 0x80, 0x00, 0xbe, 0x00, 0x82, 0x00, 0x82, 0x00, 0x84,
1163 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1165 0x00, 0x7f, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00,
1166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1167 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1168 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x04,
1170 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44,
1171 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x70,
1173 0x00, 0x60, 0x00, 0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x46, 0x00, 0x00,
1174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1175 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1176 0x00, 0x40, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22,
1178 0x00, 0x22, 0x00, 0x56, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x80, 0x88,
1179 0x80, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x80, 0x60, 0x80, 0x50, 0x80, 0x48,
1181 0x80, 0x48, 0x80, 0x44, 0x80, 0x42, 0x80, 0x41, 0x80, 0x40, 0x00, 0x00,
1182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1184 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x48,
1186 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40,
1187 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40,
1189 0x80, 0x40, 0x80, 0x40, 0x80, 0x44, 0x80, 0x23, 0x00, 0x1f, 0x80, 0x01,
1190 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1191 0x00, 0x70, 0x00, 0x48, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x78,
1192 0x00, 0x50, 0x00, 0x48, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x20,
1194 0x00, 0x40, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x02, 0x00, 0x02, 0x00, 0x84,
1195 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
1197 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1199 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1200 0x00, 0x41, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82,
1202 0x00, 0x84, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x30,
1203 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x00, 0x00, 0x00, 0x00, 0x20, 0x84, 0x20, 0x84, 0x40, 0x44, 0x40, 0x4a,
1205 0x40, 0x4a, 0x80, 0x52, 0x80, 0x52, 0x80, 0x22, 0x00, 0x21, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x00, 0x81, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18,
1208 0x00, 0x24, 0x00, 0x42, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44,
1210 0x00, 0x44, 0x00, 0x24, 0x00, 0x28, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10,
1211 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
1213 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0xff, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
1215 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1216 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
1217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0,
1218 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10,
1219 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1220 0x00, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1221 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1222 0x00, 0x10, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1223 0x00, 0x70, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88,
1232 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1234 0x00, 0x80, 0x00, 0xf0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1235 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1237 0x00, 0x48, 0x00, 0x80, 0x00, 0x80, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1239 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x78, 0x00, 0x88, 0x00, 0x88,
1240 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88,
1243 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1244 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xf8,
1245 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
1246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x88,
1248 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0xf0,
1249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1250 0x00, 0x80, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1251 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
1253 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
1254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1255 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1256 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90, 0x00, 0x60,
1257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1258 0x00, 0x80, 0x00, 0x90, 0x00, 0xa0, 0x00, 0xe0, 0x00, 0xd0, 0x00, 0x90,
1259 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1260 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1261 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
1262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xda, 0x00, 0x92,
1264 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1267 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
1269 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x88, 0x00, 0x88,
1272 0x00, 0x88, 0x00, 0x88, 0x00, 0xf0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1274 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1275 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
1276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
1277 0x00, 0xd0, 0x00, 0x90, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
1278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x88, 0x00, 0x60,
1280 0x00, 0x10, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1282 0x00, 0x20, 0x00, 0xf8, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1283 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88,
1285 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00,
1286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x50,
1288 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1290 0x00, 0x00, 0x00, 0x92, 0x00, 0x92, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0x54,
1291 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84,
1293 0x00, 0x48, 0x00, 0x30, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x00,
1294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48,
1296 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x78, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40,
1299 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1301 0x00, 0x40, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1302 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1303 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1304 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x20,
1306 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20,
1307 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64,
1309 0x00, 0xe4, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1317 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1319 0x00, 0x20, 0x00, 0x78, 0x00, 0x68, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa8,
1320 0x00, 0xa8, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x30, 0x00, 0x20,
1322 0x00, 0x20, 0x00, 0xfc, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21,
1323 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x7c,
1325 0x00, 0x48, 0x00, 0x48, 0x00, 0x78, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x7c, 0x00, 0x10,
1328 0x00, 0x38, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1330 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1331 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x22, 0x00, 0x20, 0x00, 0x3c,
1333 0x00, 0x22, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x62, 0x00, 0x9d,
1338 0x00, 0xa1, 0x00, 0xa5, 0x00, 0x9b, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x90, 0x00, 0x98, 0x00, 0x68,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x50, 0x00, 0xa0,
1344 0x00, 0x50, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x08, 0x00, 0x08,
1347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
1351 0x00, 0x42, 0x00, 0x9d, 0x00, 0x95, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa7,
1352 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
1354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xf8,
1360 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x28, 0x00, 0x18,
1362 0x00, 0x20, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1c,
1365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1367 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x46, 0x00, 0x44, 0x00, 0x44,
1371 0x00, 0x7c, 0x00, 0xc0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x3a, 0x00, 0x4a, 0x00, 0x4a,
1373 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3a, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c,
1381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
1383 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
1384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1386 0x00, 0x00, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50,
1387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c,
1389 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28,
1390 0x00, 0x7c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1391 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x7e,
1392 0x00, 0x00, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x1c,
1393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x18,
1394 0x00, 0x08, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x08,
1395 0x00, 0x18, 0x00, 0x28, 0x00, 0x7c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40,
1397 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xc8, 0x00, 0x70, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
1399 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c,
1400 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1402 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
1403 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
1404 0x00, 0x12, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14,
1405 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00,
1406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x2e, 0x00, 0x00,
1407 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c,
1408 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1410 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
1411 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
1412 0x00, 0x12, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14,
1413 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01,
1415 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0x11, 0xf8, 0x1f, 0x00, 0x21,
1416 0x00, 0x41, 0x00, 0x81, 0xf8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x24,
1418 0x00, 0x44, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xcc,
1419 0x00, 0x78, 0x00, 0x08, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10,
1420 0x00, 0x08, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1421 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00,
1422 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
1423 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40,
1424 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40,
1426 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1427 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1428 0x00, 0x24, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1429 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00,
1430 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00,
1431 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1432 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x10,
1434 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1435 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1436 0x00, 0x48, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1437 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00,
1438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
1439 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1440 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x58,
1442 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0xf1, 0x00, 0x41, 0x00, 0x41,
1443 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a,
1444 0x00, 0x2e, 0x00, 0x00, 0x80, 0x40, 0x80, 0x60, 0x80, 0x50, 0x80, 0x48,
1445 0x80, 0x48, 0x80, 0x44, 0x80, 0x42, 0x80, 0x41, 0x80, 0x40, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00,
1447 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1448 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1449 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x11,
1450 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x21,
1451 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
1452 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40,
1453 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
1454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x00,
1455 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1456 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x11,
1458 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x21,
1459 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
1461 0x00, 0xe0, 0x00, 0x60, 0x00, 0xf0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00,
1462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1463 0x80, 0x1e, 0x80, 0x61, 0x80, 0x42, 0x80, 0x84, 0x80, 0x88, 0x80, 0x91,
1464 0x00, 0xe1, 0x00, 0x43, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41,
1466 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22,
1467 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08,
1468 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1469 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00,
1470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
1471 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1472 0x00, 0x41, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1473 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41,
1474 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22,
1475 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
1476 0x00, 0x20, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24,
1477 0x00, 0x28, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
1478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x40, 0x00, 0x78, 0x00, 0x4c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
1480 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x88,
1482 0x00, 0x88, 0x00, 0x90, 0x00, 0xa0, 0x00, 0x90, 0x00, 0x88, 0x00, 0x88,
1483 0x00, 0xf0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38,
1485 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00,
1486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1487 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88,
1488 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48,
1490 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1491 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1492 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x38,
1493 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00,
1494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88,
1496 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30,
1498 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1499 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1500 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
1501 0x80, 0x24, 0x00, 0x45, 0x00, 0x46, 0x40, 0x64, 0x80, 0x3f, 0x00, 0x00,
1502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x80,
1504 0x00, 0x80, 0x00, 0x88, 0x00, 0x78, 0x00, 0x10, 0x00, 0x70, 0x00, 0x00,
1505 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10,
1506 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88,
1507 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70,
1509 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1510 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1511 0x00, 0x30, 0x00, 0x48, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90,
1512 0x00, 0xe0, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1513 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
1514 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88,
1515 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1516 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40,
1517 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1519 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1520 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90,
1522 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1523 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x20,
1525 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
1526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1527 0x00, 0x78, 0x00, 0x30, 0x00, 0xf0, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
1528 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0xb8,
1530 0x00, 0x00, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1531 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1532 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x70,
1533 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1535 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88,
1536 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48,
1538 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1539 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1540 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x70,
1541 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1542 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1543 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88,
1544 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1546 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x20,
1547 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1548 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1549 0x00, 0xc8, 0x00, 0xb8, 0x00, 0xa8, 0x00, 0xc8, 0x00, 0xf0, 0x00, 0x00,
1550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1551 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1552 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
1554 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1555 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1556 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x00, 0x00, 0x88,
1557 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00,
1558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1559 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1560 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40,
1562 0x00, 0x00, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x30,
1563 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
1564 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xf0,
1565 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xf0, 0x00, 0x80,
1566 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48,
1568 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1569 0x04, 0x03, 0x05, 0x0a, 0x08, 0x0a, 0x08, 0x05, 0x04, 0x04, 0x06, 0x06,
1570 0x03, 0x05, 0x03, 0x06, 0x07, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
1571 0x07, 0x07, 0x04, 0x04, 0x05, 0x06, 0x04, 0x06, 0x0b, 0x08, 0x08, 0x07,
1572 0x09, 0x08, 0x07, 0x08, 0x09, 0x07, 0x08, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
1573 0x06, 0x0b, 0x07, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x08, 0x09, 0x05,
1574 0x06, 0x05, 0x06, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
1575 0x06, 0x02, 0x05, 0x06, 0x02, 0x08, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06,
1576 0x06, 0x06, 0x06, 0x08, 0x07, 0x06, 0x06, 0x04, 0x05, 0x04, 0x07, 0x00,
1577 0x04, 0x03, 0x06, 0x09, 0x07, 0x08, 0x05, 0x08, 0x07, 0x09, 0x06, 0x07,
1578 0x06, 0x05, 0x09, 0x07, 0x05, 0x06, 0x08, 0x08, 0x07, 0x07, 0x08, 0x03,
1579 0x07, 0x08, 0x08, 0x07, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08,
1580 0x08, 0x08, 0x0e, 0x07, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07,
1581 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x06, 0x0a, 0x09, 0x09, 0x09,
1582 0x09, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0b, 0x06,
1583 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06,
1584 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
13 /* sans-serif */
158514 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158615 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158716 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1913342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1914343 0x00, 0x00, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50,
1915344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1916 0x00, 0x00, 0x00, 0x42, 0x00, 0xc2, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48,
1917 0x80, 0x08, 0x80, 0x11, 0x80, 0x12, 0x80, 0x27, 0x80, 0x20, 0x00, 0x00,
1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42,
1919 0x00, 0xc2, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48, 0x00, 0x0b, 0x80, 0x14,
1920 0x00, 0x11, 0x00, 0x22, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x24, 0x00, 0x44, 0x00, 0x44, 0xe0, 0x47,
346 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24, 0xf0, 0x1f, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3d, 0x10, 0x42, 0x10, 0x42, 0xf0, 0x43,
349 0x00, 0x42, 0x10, 0x42, 0xe0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1921350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x92, 0x00, 0x24,
1922351 0x00, 0x94, 0x00, 0x68, 0x80, 0x08, 0x80, 0x11, 0x80, 0x12, 0x80, 0x27,
1923352 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2094523 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
2095524 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44,
2096525 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
526 /* sans serif width */
2097527 0x03, 0x03, 0x05, 0x07, 0x07, 0x0c, 0x09, 0x03, 0x04, 0x04, 0x05, 0x07,
2098528 0x03, 0x04, 0x03, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
2099529 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x09, 0x09, 0x09,
2104534 0x03, 0x07, 0x07, 0x09, 0x06, 0x07, 0x06, 0x05, 0x03, 0x05, 0x09, 0x00,
2105535 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x03, 0x07, 0x04, 0x08, 0x05, 0x07,
2106536 0x07, 0x04, 0x08, 0x07, 0x04, 0x07, 0x04, 0x04, 0x04, 0x07, 0x07, 0x03,
2107 0x04, 0x04, 0x05, 0x07, 0x09, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09, 0x09,
537 0x04, 0x04, 0x05, 0x07, 0x0d, 0x0d, 0x09, 0x07, 0x09, 0x09, 0x09, 0x09,
2108538 0x09, 0x09, 0x0d, 0x09, 0x09, 0x09, 0x09, 0x09, 0x03, 0x03, 0x03, 0x03,
2109539 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x0a, 0x0a, 0x0a, 0x0a,
2110540 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0d, 0x07,
2111541 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0x07, 0x08, 0x08,
2112542 0x08, 0x08, 0x08, 0x07, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07,
543
544 /* vga */
545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
546 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
547 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
548 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
549 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
551 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
552 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
553 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
554 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
555 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
556 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
557 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
558 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
559 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
560 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
561 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
563 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
564 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
565 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
566 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
567 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
568 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
569 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
570 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
571 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
572 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
573 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
574 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
575 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
576 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
577 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
579 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
581 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
583 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
584 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
587 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
589 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
590 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
591 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
592 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
593 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
594 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
595 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
596 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
597 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
599 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
600 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
601 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
602 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
603 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
605 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
609 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38,
610 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
611 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
612 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
613 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
615 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
616 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
617 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
619 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
620 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
621 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
623 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
625 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
626 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
627 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
628 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
629 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde,
631 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
632 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
633 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
634 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
635 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
636 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
637 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
639 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
640 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
641 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
642 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
643 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
644 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
645 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
647 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xee,
648 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
649 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
651 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
652 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
653 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
654 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
655 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
656 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
657 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
658 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
659 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
660 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
661 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0xee, 0x6c,
662 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38,
663 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66,
664 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
665 0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe,
666 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
667 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
668 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
669 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
670 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
672 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
673 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
675 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
676 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
677 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
679 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
681 0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x78,
682 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
683 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
684 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
685 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
687 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
688 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
689 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
690 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6,
691 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
693 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
695 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
696 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
697 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
699 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
700 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
703 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
707 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
708 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
709 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
711 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
712 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
713 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
715 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
716 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x18, 0x70, 0x00, 0x00,
717 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
718 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
719 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
720 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
721 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
722 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
723 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
724 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
725 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
726 0x18, 0x70, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
727 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
728 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
729 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
731 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
732 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
733 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
734 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
735 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x10,
736 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
737 0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe,
738 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36,
739 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
740 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
741 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
743 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
744 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
745 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
746 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
747 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
748 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
749 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
750 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
751 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
752 0x00, 0x7c, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
754 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7c, 0xce, 0xce, 0xd6, 0xd6, 0xd6,
755 0xd6, 0xe6, 0xe6, 0x7c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
756 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00,
757 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0xd8, 0x70,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
759 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
760 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
761 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
762 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
763 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
764 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
765 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e,
767 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
768 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x82, 0xb2, 0xaa, 0xb2, 0xaa,
771 0xaa, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
773 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xdb, 0xdb, 0xde, 0xd8, 0xdc, 0x77,
774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xcc, 0xcc, 0xcc, 0xce, 0xcc,
775 0xcc, 0xcc, 0xcc, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
776 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
779 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
780 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
781 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
782 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
783 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
784 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
785 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
786 0x18, 0x18, 0x18, 0x18, 0x60, 0xc0, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe,
787 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x10, 0x38,
788 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
789 0x0c, 0x06, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x82, 0x9a, 0xa2, 0xa2, 0xa2,
791 0x9a, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
792 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
793 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
794 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
795 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
796 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 0x00, 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x18,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e,
799 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
801 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
802 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
805 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
806 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
808 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
809 0x00, 0x00, 0x76, 0xdc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
810 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe,
811 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
812 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
814 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
816 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
817 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
818 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
820 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
821 0x00, 0x00, 0x00, 0x00, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x18, 0x2c, 0x06, 0x3e, 0x66,
823 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
824 0x66, 0x66, 0xf6, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
825 0x38, 0x6c, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe,
826 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78,
827 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0xfe,
828 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
830 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18,
831 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x00, 0x3c,
832 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x66, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
834 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
837 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
838 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
839 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x18, 0x18, 0x18,
840 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
841 0x30, 0x18, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
842 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c,
844 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
846 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
847 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x7c,
848 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
850 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
851 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
852 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00,
853 0x00, 0x00, 0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c,
854 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x7c, 0x66, 0x66, 0x66,
855 0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0xc6,
856 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
857 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
858 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
859 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
860 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00,
861 0x0c, 0x18, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x3c,
862 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
863 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
867 0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
869 0x00, 0xe0, 0x30, 0x62, 0x36, 0xec, 0x18, 0x30, 0x66, 0xce, 0x9a, 0x3f,
870 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b,
871 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
872 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
875 0x00, 0x00, 0x00, 0x18, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
876 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x18,
880 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x7c, 0x06, 0x3c, 0x06, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00,
883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00,
887
888 /* ega */
889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99,
891 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff,
892 0xc3, 0xe7, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe,
893 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
894 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
895 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00,
896 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
897 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18,
898 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3,
899 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
900 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
901 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0x00, 0x00,
902 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00,
903 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
904 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x70,
905 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63,
906 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb,
907 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
908 0xc0, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
909 0x00, 0x02, 0x06, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x06, 0x02, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18,
911 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00,
912 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b,
913 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38,
914 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,
916 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00,
917 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e,
919 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe,
920 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
921 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
922 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38,
926 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c,
928 0x3c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
929 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00,
931 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x86, 0xc6, 0x7c,
932 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30,
933 0x66, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76,
934 0xdc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
936 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18,
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
941 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38,
946 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18,
947 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18,
948 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06,
949 0x06, 0x3c, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
950 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00,
951 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00,
952 0x00, 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0x7c,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x30,
954 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c,
955 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
956 0xc6, 0x7e, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
958 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06,
962 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
963 0x0c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
964 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
965 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0xfc,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2,
968 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66,
969 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62,
970 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
971 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0x66, 0x3a, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
975 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c,
976 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x66, 0x6c,
977 0x6c, 0x78, 0x6c, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
978 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
979 0x00, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
982 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c,
983 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
984 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc,
985 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0xc6, 0x7c, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
988 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
989 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
990 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
991 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6,
992 0xc6, 0xc6, 0x7c, 0x38, 0x7c, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
993 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00,
994 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x8c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
996 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38,
997 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c,
998 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
999 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1000 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1001 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1002 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc,
1003 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c,
1004 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
1006 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x7c, 0x30, 0x30, 0x30, 0x78,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc,
1010 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76,
1011 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
1012 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
1013 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00,
1014 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1016 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6,
1017 0xd6, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66,
1018 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1019 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e,
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0xf0,
1023 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x70, 0x1c,
1024 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30,
1025 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1026 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6,
1030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6,
1031 0x7e, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc,
1032 0x18, 0x30, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x18,
1033 0x18, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1034 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1035 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1036 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
1038 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0,
1039 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x78, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00,
1040 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18,
1041 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1042 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76,
1044 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc,
1045 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c,
1046 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1047 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x0c, 0x78, 0x00, 0x00, 0x10, 0x38,
1048 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1049 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00,
1050 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c,
1051 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1052 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18,
1053 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00,
1054 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10,
1055 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x38, 0x6c,
1056 0x38, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00,
1057 0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe,
1058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x76, 0xdc,
1059 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe,
1060 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00,
1061 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6,
1062 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1063 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00,
1064 0x00, 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1065 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc,
1066 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6,
1067 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6,
1068 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6,
1069 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x7c, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00, 0x00,
1071 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0xe6, 0xfc,
1072 0x00, 0x00, 0x00, 0x00, 0x04, 0x7c, 0xce, 0xce, 0xd6, 0xd6, 0xd6, 0xe6,
1073 0xe6, 0x7c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38,
1074 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18,
1075 0x18, 0x7e, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x0c, 0x18,
1076 0x30, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1077 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00,
1078 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1079 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0xcc, 0xcc, 0xcc, 0xcc,
1080 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66,
1081 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6,
1082 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c,
1083 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc6, 0xc6, 0x7c,
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0xba, 0xaa, 0xb2, 0xaa, 0xaa,
1087 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
1088 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x6c, 0xd6, 0xd6, 0xdc, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
1090 0xcc, 0xcc, 0xcc, 0xce, 0xcc, 0xcc, 0xcc, 0x7e, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8,
1094 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1095 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
1096 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77,
1097 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18,
1098 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1099 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
1100 0x18, 0x18, 0x30, 0x60, 0xc0, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6,
1101 0xc6, 0xc6, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
1102 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x18, 0x0c, 0x06, 0x10, 0x38, 0x6c,
1103 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
1104 0x44, 0x9a, 0xa2, 0xa2, 0xa2, 0x9a, 0x44, 0x38, 0x00, 0x00, 0x36, 0x36,
1105 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1106 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1107 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36,
1108 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7c, 0xc6,
1110 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1111 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1112 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1113 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
1114 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1116 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1117 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1119 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1120 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76,
1121 0x00, 0x00, 0x76, 0xdc, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6,
1122 0xc6, 0xc6, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f,
1123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
1124 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1125 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1126 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1127 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1128 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7,
1130 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6,
1131 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34,
1132 0x18, 0x2c, 0x06, 0x3e, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
1133 0x00, 0xf8, 0x6c, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00,
1134 0x38, 0x6c, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe,
1135 0x00, 0x00, 0x00, 0xc6, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62,
1136 0x66, 0xfe, 0x00, 0x00, 0x30, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78,
1137 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x3c,
1139 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x3c, 0x66,
1140 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00,
1141 0x00, 0x66, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1142 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
1144 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1145 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
1147 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
1148 0x30, 0x18, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1149 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
1151 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc,
1152 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x38, 0x6c, 0x00, 0x7c,
1153 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x30, 0x18,
1154 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00,
1155 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1156 0x00, 0x00, 0x76, 0xdc, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1157 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66,
1158 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60,
1159 0x7c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x00, 0xf0,
1160 0x60, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x18, 0x30,
1161 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00,
1162 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1163 0x00, 0x00, 0x30, 0x18, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1164 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0xc6, 0xc6,
1165 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x0c, 0x18, 0x00, 0x66, 0x66, 0x66,
1166 0x66, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
1167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
1168 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00,
1171 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xe0, 0x30, 0x63, 0x36, 0xec,
1173 0x18, 0x36, 0x6e, 0xda, 0x3f, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x7f,
1174 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
1175 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c,
1176 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1178 0x00, 0x18, 0x0c, 0x78, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00,
1179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1181 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1182 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x00, 0x78, 0x0c, 0x38, 0x0c, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
1184 0x00, 0x00, 0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e,
1186 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188
1189 /* ega graphic */
1190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81,
1191 0xbd, 0x99, 0x81, 0x7e, 0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e,
1192 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x10, 0x38, 0x7c, 0xfe,
1193 0x7c, 0x38, 0x10, 0x00, 0x38, 0x7c, 0x38, 0xfe, 0xfe, 0xd6, 0x10, 0x38,
1194 0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x7c, 0x10, 0x38, 0x00, 0x00, 0x18, 0x3c,
1195 0x3c, 0x18, 0x00, 0x00, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff,
1196 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0xff, 0xc3, 0x99, 0xbd,
1197 0xbd, 0x99, 0xc3, 0xff, 0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78,
1198 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x3f, 0x33, 0x3f, 0x30,
1199 0x30, 0x70, 0xf0, 0xe0, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0,
1200 0x18, 0xdb, 0x3c, 0xe7, 0xe7, 0x3c, 0xdb, 0x18, 0x80, 0xe0, 0xf8, 0xfe,
1201 0xf8, 0xe0, 0x80, 0x00, 0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00,
1202 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x66, 0x66, 0x66, 0x66,
1203 0x66, 0x00, 0x66, 0x00, 0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00,
1204 0x3e, 0x61, 0x3c, 0x66, 0x66, 0x3c, 0x86, 0x7c, 0x00, 0x00, 0x00, 0x00,
1205 0x7e, 0x7e, 0x7e, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff,
1206 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18,
1207 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00,
1208 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
1209 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00,
1210 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e,
1211 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x18, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x00, 0x66, 0x66, 0x24, 0x00,
1213 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00,
1214 0x18, 0x3e, 0x60, 0x3c, 0x06, 0x7c, 0x18, 0x00, 0x00, 0xc6, 0xcc, 0x18,
1215 0x30, 0x66, 0xc6, 0x00, 0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00,
1216 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30,
1217 0x30, 0x18, 0x0c, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00,
1218 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1219 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
1220 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x18, 0x18, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00,
1222 0x38, 0x6c, 0xc6, 0xd6, 0xc6, 0x6c, 0x38, 0x00, 0x18, 0x38, 0x18, 0x18,
1223 0x18, 0x18, 0x7e, 0x00, 0x7c, 0xc6, 0x06, 0x1c, 0x30, 0x66, 0xfe, 0x00,
1224 0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c, 0x00, 0x1c, 0x3c, 0x6c, 0xcc,
1225 0xfe, 0x0c, 0x1e, 0x00, 0xfe, 0xc0, 0xc0, 0xfc, 0x06, 0xc6, 0x7c, 0x00,
1226 0x38, 0x60, 0xc0, 0xfc, 0xc6, 0xc6, 0x7c, 0x00, 0xfe, 0xc6, 0x0c, 0x18,
1227 0x30, 0x30, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0x00,
1228 0x7c, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x18, 0x18, 0x00,
1229 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
1230 0x06, 0x0c, 0x18, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x7e, 0x00,
1231 0x00, 0x7e, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00,
1232 0x7c, 0xc6, 0x0c, 0x18, 0x18, 0x00, 0x18, 0x00, 0x7c, 0xc6, 0xde, 0xde,
1233 0xde, 0xc0, 0x78, 0x00, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00,
1234 0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00, 0x3c, 0x66, 0xc0, 0xc0,
1235 0xc0, 0x66, 0x3c, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00,
1236 0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00, 0xfe, 0x62, 0x68, 0x78,
1237 0x68, 0x60, 0xf0, 0x00, 0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3a, 0x00,
1238 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x3c, 0x18, 0x18, 0x18,
1239 0x18, 0x18, 0x3c, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00,
1240 0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0xf0, 0x60, 0x60, 0x60,
1241 0x62, 0x66, 0xfe, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00,
1242 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6,
1243 0xc6, 0xc6, 0x7c, 0x00, 0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,
1244 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0x7c, 0x0e, 0xfc, 0x66, 0x66, 0x7c,
1245 0x6c, 0x66, 0xe6, 0x00, 0x3c, 0x66, 0x30, 0x18, 0x0c, 0x66, 0x3c, 0x00,
1246 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6,
1247 0xc6, 0xc6, 0x7c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00,
1248 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0xc6, 0xc6, 0x6c, 0x38,
1249 0x6c, 0xc6, 0xc6, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x00,
1250 0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00, 0x3c, 0x30, 0x30, 0x30,
1251 0x30, 0x30, 0x3c, 0x00, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00,
1252 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x10, 0x38, 0x6c, 0xc6,
1253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1254 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c,
1255 0x7c, 0xcc, 0x76, 0x00, 0xe0, 0x60, 0x7c, 0x66, 0x66, 0x66, 0xdc, 0x00,
1256 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc6, 0x7c, 0x00, 0x1c, 0x0c, 0x7c, 0xcc,
1257 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00,
1258 0x3c, 0x66, 0x60, 0xf8, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x76, 0xcc,
1259 0xcc, 0x7c, 0x0c, 0xf8, 0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00,
1260 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x06, 0x00, 0x06, 0x06,
1261 0x06, 0x66, 0x66, 0x3c, 0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00,
1262 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0xec, 0xfe,
1263 0xd6, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x00,
1264 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xdc, 0x66,
1265 0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e,
1266 0x00, 0x00, 0xdc, 0x76, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x7e, 0xc0,
1267 0x7c, 0x06, 0xfc, 0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x36, 0x1c, 0x00,
1268 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0xc6, 0xc6,
1269 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00,
1270 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0xc6, 0xc6,
1271 0xc6, 0x7e, 0x06, 0xfc, 0x00, 0x00, 0x7e, 0x4c, 0x18, 0x32, 0x7e, 0x00,
1272 0x0e, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0e, 0x00, 0x18, 0x18, 0x18, 0x18,
1273 0x18, 0x18, 0x18, 0x00, 0x70, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x70, 0x00,
1274 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
1275 0xc6, 0xc6, 0xfe, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x0c, 0x78,
1276 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x0c, 0x18, 0x7c, 0xc6,
1277 0xfe, 0xc0, 0x7c, 0x00, 0x7c, 0x82, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00,
1278 0xc6, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, 0x30, 0x18, 0x78, 0x0c,
1279 0x7c, 0xcc, 0x76, 0x00, 0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00,
1280 0x00, 0x00, 0x7e, 0xc0, 0xc0, 0x7e, 0x0c, 0x38, 0x7c, 0x82, 0x7c, 0xc6,
1281 0xfe, 0xc0, 0x7c, 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00,
1282 0x30, 0x18, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, 0x66, 0x00, 0x38, 0x18,
1283 0x18, 0x18, 0x3c, 0x00, 0x7c, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00,
1284 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3c, 0x00, 0xc6, 0x38, 0x6c, 0xc6,
1285 0xfe, 0xc6, 0xc6, 0x00, 0x38, 0x6c, 0x7c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00,
1286 0x18, 0x30, 0xfe, 0xc0, 0xf8, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x7e, 0x12,
1287 0xfe, 0x90, 0xfe, 0x00, 0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00,
1288 0x7c, 0x82, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0xc6, 0x00, 0x7c, 0xc6,
1289 0xc6, 0xc6, 0x7c, 0x00, 0x30, 0x18, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00,
1290 0x78, 0x84, 0x00, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x60, 0x30, 0xcc, 0xcc,
1291 0xcc, 0xcc, 0x76, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0xfc,
1292 0xc6, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0xc6, 0x00, 0xc6, 0xc6,
1293 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x02, 0x7c, 0xce, 0xd6, 0xe6, 0x7c, 0x80,
1294 0x38, 0x6c, 0x64, 0xf0, 0x60, 0x66, 0xfc, 0x00, 0x3a, 0x6c, 0xce, 0xd6,
1295 0xe6, 0x6c, 0xb8, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00,
1296 0x0e, 0x1b, 0x18, 0x3c, 0x18, 0xd8, 0x70, 0x00, 0x18, 0x30, 0x78, 0x0c,
1297 0x7c, 0xcc, 0x76, 0x00, 0x0c, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3c, 0x00,
1298 0x0c, 0x18, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x30, 0xcc, 0xcc,
1299 0xcc, 0xcc, 0x76, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x00,
1300 0x76, 0xdc, 0x00, 0xe6, 0xf6, 0xde, 0xce, 0x00, 0x3c, 0x6c, 0x6c, 0x3e,
1301 0x00, 0x7e, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00,
1302 0x18, 0x00, 0x18, 0x18, 0x30, 0x63, 0x3e, 0x00, 0x7e, 0x81, 0xb9, 0xa5,
1303 0xb9, 0xa5, 0x81, 0x7e, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x00, 0x00,
1304 0x00, 0x00, 0x7e, 0xd2, 0xde, 0xd0, 0x7e, 0x00, 0x7e, 0xcc, 0xcc, 0xce,
1305 0xcc, 0xcc, 0x7e, 0x00, 0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x18, 0x00,
1306 0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00, 0x00, 0xcc, 0x66, 0x33,
1307 0x66, 0xcc, 0x00, 0x00, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
1308 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x77, 0xdd, 0x77, 0xdd,
1309 0x77, 0xdd, 0x77, 0xdd, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1310 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x30, 0x60, 0x38, 0x6c,
1311 0xc6, 0xfe, 0xc6, 0x00, 0x7c, 0x82, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00,
1312 0x18, 0x0c, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00, 0x7e, 0x81, 0x9d, 0xa1,
1313 0xa1, 0x9d, 0x81, 0x7e, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36,
1314 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0xfe, 0x06,
1315 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00,
1316 0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18, 0x66, 0x66, 0x3c, 0x7e,
1317 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18,
1318 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1319 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18,
1320 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1321 0xff, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18,
1322 0x76, 0xdc, 0x7c, 0x06, 0x7e, 0xc6, 0x7e, 0x00, 0x76, 0xdc, 0x38, 0x6c,
1323 0xc6, 0xfe, 0xc6, 0x00, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00,
1324 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00,
1325 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36,
1326 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x00, 0x00, 0xff, 0x00,
1327 0xff, 0x00, 0x00, 0x00, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36,
1328 0x00, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0x00, 0x30, 0x7e, 0x0c, 0x7c,
1329 0xcc, 0xcc, 0x78, 0x00, 0xf8, 0x6c, 0x66, 0xf6, 0x66, 0x6c, 0xf8, 0x00,
1330 0x7c, 0x82, 0xfe, 0xc0, 0xfc, 0xc0, 0xfe, 0x00, 0xc6, 0x00, 0xfe, 0xc0,
1331 0xfc, 0xc0, 0xfe, 0x00, 0x30, 0x18, 0xfe, 0xc0, 0xfc, 0xc0, 0xfe, 0x00,
1332 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x0c, 0x18, 0x3c, 0x18,
1333 0x18, 0x18, 0x3c, 0x00, 0x3c, 0x42, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00,
1334 0x66, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x18, 0x18, 0x18, 0x18,
1335 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18,
1336 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
1337 0xff, 0xff, 0xff, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18,
1338 0x30, 0x18, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xff, 0xff, 0xff, 0xff,
1339 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00,
1340 0x78, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xcc, 0x00, 0x7c, 0x82, 0x38, 0x6c,
1341 0xc6, 0x6c, 0x38, 0x00, 0x0c, 0x06, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00,
1342 0x76, 0xdc, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x76, 0xdc, 0x38, 0x6c,
1343 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0xc0,
1344 0xe0, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x60, 0xf0, 0xf0, 0x60, 0x7c, 0x66,
1345 0x7c, 0x60, 0xf0, 0x00, 0x18, 0x30, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00,
1346 0x7c, 0x82, 0x00, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x60, 0x30, 0xc6, 0xc6,
1347 0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x30, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0xfc,
1348 0x0c, 0x18, 0x66, 0x66, 0x3c, 0x18, 0x3c, 0x00, 0xff, 0x00, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
1350 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
1351 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
1352 0xe1, 0x32, 0xe4, 0x3a, 0xf6, 0x2a, 0x5f, 0x86, 0x7f, 0xdb, 0xdb, 0x7b,
1353 0x1b, 0x1b, 0x1b, 0x00, 0x3e, 0x61, 0x3c, 0x66, 0x66, 0x3c, 0x86, 0x7c,
1354 0x00, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x18, 0x0c, 0x38, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
1356 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1357 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00,
1358 0x78, 0x0c, 0x38, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x18, 0x30,
1359 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00,
1360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361
1362 /* mcga */
21131363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
21141364 0x00, 0x80, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21151365 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x00, 0x00, 0x00, 0x20, 0xf8, 0xa0, 0xf8,
21741424 0x40, 0x40, 0x20, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
21751425 0x80, 0x40, 0x40, 0x20, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x40, 0xa8,
21761426 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1427 /* mcga width */
21771428 0x04, 0x02, 0x04, 0x06, 0x06, 0x05, 0x06, 0x03, 0x04, 0x04, 0x05, 0x06,
21781429 0x03, 0x05, 0x02, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
21791430 0x05, 0x05, 0x02, 0x03, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x05, 0x05,
21821433 0x05, 0x03, 0x06, 0x05, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
21831434 0x04, 0x02, 0x03, 0x04, 0x02, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
21841435 0x04, 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x06, 0x00,
1436
1437 /* graphics */
21851438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xff,
21861439 0x70, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0xff, 0x0e, 0x0c, 0x00, 0x00,
21871440 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10,
22471500 0xe7, 0xc3, 0x81, 0xe7, 0xe7, 0x81, 0xc3, 0xe7, 0xff, 0xc3, 0x99, 0xf9,
22481501 0xe7, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
22491502 };
1503
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 The bitmap fonts stored in the FONT1-4.FNT files were extracted from
1 the file frotzsrc/src/dos/fontdata.h
2 The character table is composed of 192 characters of 2x16 bytes each, followed
3 by 192 bytes containing the size of each character:
4 192x(2x16)+192 bytes; 16x16 pixels.
5
6 The Bizcat monospace bitmap font stored in the FONT0.FNT file was created
7 by Robey Pointer.
8 The character table is composed of 256 characters of 16 bytes each:
9 256x(1x16) bytes; 8x16 pixels.
10 https://robey.lag.net/2020/02/09/bizcat-bitmap-font.html
11
12 The EGA and VGA fonts embedded in the fontdata.h file are from the
13 sdlfonts-1.0.tar.gz package of SDL fonts provided with PDCurses:
14 cp850-16.bmp; cp850-14.bmp; cp850-08.bmp.
15 The character table is composed of 256 characters of 8, 14 or 16 bytes each:
16 VGA 256x(1x16) bytes; 8x16 pixels.
17 EGA 256x(1x14) bytes; 8x14 pixels.
18 EGA graphic 256x(1x8) bytes; 8x8 pixels.
19 https://sourceforge.net/projects/pdcurses/files/sdlfonts/1.0/
20
0 /*
1 * inline.h
2 *
3 * Inline definitions for DOS for use with Watcom C.
4 *
5 */
6
7 #ifndef DOS_INLINE_H
8 #define DOS_INLINE_H
9
10 #ifdef __WATCOMC__
11
12 /*
13 * Inline functions for calling BIOS video and date/time services, and DOS
14 * mouse services.
15 */
16 word bios_video_ah(byte ah);
17 #pragma aux bios_video_ah = "int 0x10" parm [ah] value [ax] modify [bx cx dx];
18 word bios_video_ah_al_bh_bl_cx(byte ah, byte al, byte bh, byte bl, word cx);
19 #pragma aux bios_video_ah_al_bh_bl_cx = "int 0x10" \
20 parm [ah] [al] [bh] [bl] [cx] \
21 value [ax] modify [bx cx dx];
22 word bios_video_ah_bh_dh_dl(byte ah, byte bh, byte dh, byte dl);
23 #pragma aux bios_video_ah_bh_dh_dl = "int 0x10" parm [ah] [bh] [dh] [dl] \
24 value [ax] modify [bx cx dx];
25 word bios_video_ah_bh_cx_dx(byte ah, byte bh, word cx, word dx);
26 #pragma aux bios_video_ah_bh_cx_dx = "int 0x10" parm [ah] [bh] [cx] [dx] \
27 value [ax] modify [bx cx dx];
28 word bios_video_ah_cx(byte ah, word cx);
29 #pragma aux bios_video_ah_cx = "int 0x10" parm [ah] [cx] value [ax] \
30 modify [bx cx dx];
31 word bios_video_ax(word ax);
32 #pragma aux bios_video_ax = "int 0x10" parm [ax] value [ax] modify [bx cx dx];
33 word bios_video_ax_bl(word ax, byte bl);
34 #pragma aux bios_video_ax_bl = "int 0x10" parm [ax] [bl] value [ax] \
35 modify [bx cx dx];
36 /*
37 * This is used for int 0x10, ah = 6 or 7, which may destroy bp on some
38 * buggy BIOSes (per Ralf Brown's Interrupt List).
39 */
40 word bios_video_ax_bh_ch_cl_dh_dl(word ax, byte bh, byte ch, byte cl,
41 byte dh, byte dl);
42 #pragma aux bios_video_ax_bh_ch_cl_dh_dl = "push bp", \
43 "int 0x10", \
44 "pop bp" \
45 parm [ax] [bh] [ch] [cl] [dh] [dl] value [ax] modify [bx cx dx];
46 word bios_video_ax_bx(word ax, word bx);
47 #pragma aux bios_video_ax_bx = "int 0x10" parm [ax] [bx] value [ax] \
48 modify [bx cx dx];
49 word bios_video_ax_bx_cx_esdx(word ax, word bx, word cx, void _far *esdx);
50 #pragma aux bios_video_ax_bx_cx_esdx = "int 0x10" parm [ax] [bx] [cx] [es dx] \
51 value [ax] modify [bx cx dx];
52 word bios_video_ax_bx_dh_ch_cl(word ax, word bx, byte dh, byte ch, byte cl);
53 #pragma aux bios_video_ax_bx_dh_ch_cl = "int 0x10" \
54 parm [ax] [bx] [dh] [ch] [cl] \
55 value [ax] modify [bx cx dx];
56 word bios_video_ax_esdx_bh(word ax, void _far *esdx, byte bh);
57 #pragma aux bios_video_ax_esdx_bh = "int 0x10" parm [ax] [es dx] [bh] \
58 value [ax] modify [bx cx dx];
59 long bios_time_ah(byte ah);
60 #pragma aux bios_time_ah = "int 0x1a" parm [ah] value [cx dx] modify [ax bx];
61 word dos_mouse_ax(word ax);
62 #pragma aux dos_mouse_ax = "int 0x33" parm [ax] value [ax] modify [bx cx dx];
63 __int64 dos_mouse_ax_bx(word ax, word bx);
64 #pragma aux dos_mouse_ax_bx = "int 0x33" parm [ax] [bx] value [ax bx cx dx];
65 /*
66 * Used for latching operations in EGA or VGA screen output.
67 */
68 void video_latch(volatile byte);
69 #pragma aux video_latch = "" parm [al] modify [];
70
71 #endif
72 #endif
0 ; owfix.asm - Fix for gremlins in the Open Watcom C runtime library.
1 ;
2 ; This file is part of Frotz.
3 ;
4 ; Frotz is free software; you can redistribute it and/or modify
5 ; it under the terms of the GNU General Public License as published by
6 ; the Free Software Foundation; either version 2 of the License, or
7 ; (at your option) any later version.
8 ;
9 ; Frotz is distributed in the hope that it will be useful,
10 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ; GNU General Public License for more details.
13 ;
14 ; You should have received a copy of the GNU General Public License
15 ; along with this program; if not, write to the Free Software
16 ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 ; Or visit http://www.fsf.org/
18
19 _TEXT segment word public 'CODE'
20
21 assume cs:_TEXT
22
23 ; Open Watcom clibl.lib's internal functions __PIA and __PIS for huge
24 ; pointer arithmetic do not really normalize pointers completely. This is
25 ; an alternate implementation which does.
26 ;
27 ; (The OW source code also has implementations of functions __PCA and __PCS,
28 ; which do a better job at normalizing pointers, but they follow a different
29 ; interface, and in any case are not actually included in the C library.)
30 ;
31 ; Input: dx:ax = pointer; cx:bx = long addend or subtrahend.
32 ; Output: dx:ax = normalized pointer.
33
34 public __PIA,__PIS
35 __PIS:
36 neg cx
37 neg bx
38 sbb cx,0
39 __PIA:
40 add ax,bx ; Quickly add the low part (bx) of
41 ; the addend; this frees up bx
42 sbb bl,bl ; Let the segment component (dx)
43 and bl,0x10 ; absorb any carry over
44 add dh,bl
45 mov ch,cl ; Add the high part of the addend
46 mov cl,4 ; (cl)
47 shl ch,cl
48 add dh,ch
49 mov bx,ax ; Combine the higher 12 bits of the
50 shr bx,cl ; updated offset (ax) into the
51 add dx,bx ; segment component (dx)
52 and ax,0x000f ; Zap these 12 bits from ax
53 retf ; We are done
54
55 _TEXT ends
56
57 end
2727 #include <string.h>
2828
2929 #include <unistd.h>
30 #include <libgen.h>
3130 #include <math.h>
3231
3332 #ifndef NO_BLORB
3736 FILE *blorb_fp;
3837 bb_result_t blorb_res;
3938 bb_map_t *blorb_map;
39
40 extern bool quiet_mode;
4041
4142 static int isblorb(FILE *);
4243
104105 /* with resources in a separate Blorb file. */
105106 blorb_fp = fp;
106107 f_setup.use_blorb = 1;
107 if (f_setup.blorb_file == NULL)
108 if (f_setup.blorb_file == NULL && !quiet_mode)
108109 printf("Found Blorb file named %s.\n", mystring);
109110 }
110111
123124 blorb_err = bb_load_chunk_by_type(blorb_map, bb_method_FilePos,
124125 &blorb_res, bb_ID_ZCOD, 0);
125126 f_setup.exec_in_blorb = 1;
126 printf("Found zcode chunk in Blorb file.\n");
127 if (!quiet_mode)
128 printf("Found zcode chunk in Blorb file.\n");
127129 }
128130
129131 return blorb_err;
1111 #define DUMB_DFROTZ_H
1212
1313 #include "../common/frotz.h"
14
15 #ifndef NO_BASENAME
16 #include <libgen.h>
17 #endif
18
1419 #include <stdio.h>
1520 #include <stdlib.h>
1621 #include <errno.h>
1823 #include <ctype.h>
1924 #include <time.h>
2025
26 #include <sys/param.h>
27
28 #ifndef MAX
2129 #define MAX(x,y) ((x)>(y)) ? (x) : (y)
30 #endif
31 #ifndef MIN
2232 #define MIN(x,y) ((x)<(y)) ? (x) : (y)
33 #endif
2334
2435 /* from ../common/setup.h */
2536 extern f_setup_t f_setup;
2637
2738 extern bool do_more_prompts;
39 extern bool quiet_mode;
2840
2941 /* From input.c. */
3042 bool is_terminator (zchar);
1818 * Or visit http://www.fsf.org/
1919 */
2020
21 #include <libgen.h>
2221 #include "dfrotz.h"
2322 #include "dblorb.h"
2423
3231 An interpreter for all Infocom and other Z-Machine games.\n\
3332 \n\
3433 Syntax: dfrotz [options] story-file [blorb file]\n\
35 -a watch attribute setting \t -P alter piracy opcode\n\
34 -a watch attribute setting \t -q quiet mode (no startup messages)\n\
3635 -A watch attribute testing \t -r <option> Set runtime options\n\
3736 -f <type> type of format codes \t -R <path> restricted read/write\n\
3837 -h # screen height \t -s # random number seed value\n\
4241 -O watch object locating \t -v show version information\n\
4342 -L <file> load this save file \t -w # screen width\n\
4443 -m turn off MORE prompts \t -x expand abbreviations g/x/z\n\
45 -p plain ASCII output only \t -Z # error checking (see below)\n"
46
44 -p plain ASCII output only \t -Z # error checking (see below)\n\
45 -P alter piracy opcode\n"
46
47
4748 #define INFO2 "\
4849 Error checking: 0 none, 1 first only (default), 2 all, 3 exit after any error.\n\
4950 For more options and explanations, please read the manual page.\n\n\
5657 static int user_tandy_bit = 0;
5758 static bool plain_ascii = FALSE;
5859
60 bool quiet_mode;
5961 bool do_more_prompts;
6062
6163 /*
7476 zoptarg = NULL;
7577
7678 do_more_prompts = TRUE;
79 quiet_mode = FALSE;
7780 /* Parse the options */
7881 do {
79 c = zgetopt(argc, argv, "aAf:h:iI:L:moOpPs:r:R:S:tu:vw:xZ:");
82 c = zgetopt(argc, argv, "aAf:h:iI:L:moOpPqr:R:s:S:tu:vw:xZ:");
8083 switch(c) {
8184 case 'a':
8285 f_setup.attribute_assignment = 1;
132135 case 'p':
133136 plain_ascii = 1;
134137 break;
138 case 'q':
139 quiet_mode = 1;
140 break;
135141 case 'r':
136142 dumb_handle_setting(zoptarg, FALSE, TRUE);
137143 break;
179185 os_quit(EXIT_SUCCESS);
180186 }
181187
182 switch (f_setup.format) {
183 case FORMAT_IRC:
184 printf("Using IRC formatting.\n");
185 break;
186 case FORMAT_ANSI:
187 printf("Using ANSI formatting.\n");
188 f_setup.format = FORMAT_ANSI;
189 break;
190 case FORMAT_BBCODE:
191 printf("Using Discourse BBCode formatting.\n");
192 f_setup.format = FORMAT_BBCODE;
193 break;
194 case FORMAT_UNKNOWN:
195 printf("Unknown formatting \"%s\".\n", format_orig);
188 if (!quiet_mode) {
189 switch (f_setup.format) {
190 case FORMAT_NORMAL:
191 printf("Using normal formatting.\n");
192 break;
193 case FORMAT_IRC:
194 printf("Using IRC formatting.\n");
195 break;
196 case FORMAT_ANSI:
197 printf("Using ANSI formatting.\n");
198 break;
199 case FORMAT_BBCODE:
200 printf("Using Discourse BBCode formatting.\n");
201 f_setup.format = FORMAT_BBCODE;
202 break;
203 case FORMAT_UNKNOWN:
204 printf("Unknown formatting \"%s\". Using normal formatting instead.\n", format_orig);
205 break;
206 case FORMAT_DISABLED:
207 printf("Format selection disabled at compile time.\n");
208 break;
209 default:
210 printf("Something else happened with format selection.\n");
211 printf("This should not happen.\n");
212 break;
213 }
214 }
215 if (f_setup.format == FORMAT_UNKNOWN || FORMAT_DISABLED)
196216 f_setup.format = FORMAT_NORMAL;
197 break;
198 case FORMAT_DISABLED:
199 printf("Format selection disabled at compile time.\n");
200 f_setup.format = FORMAT_NORMAL;
201 break;
202 default:
203 break;
204 }
205 if (f_setup.format == FORMAT_NORMAL)
206 printf("Using normal formatting.\n");
207217
208218 /* Save the story file name */
209219 f_setup.story_file = strdup(argv[zoptind]);
220
221 #ifdef NO_BASENAME
222 f_setup.story_name = strdup(f_setup.story_file);
223 #else
210224 f_setup.story_name = strdup(basename(argv[zoptind]));
211
225 #endif
212226 if (argv[zoptind+1] != NULL)
213227 f_setup.blorb_file = strdup(argv[zoptind+1]);
214228
215 printf("Loading %s.\n", f_setup.story_file);
229 if (!quiet_mode) {
230 printf("Loading %s.\n", f_setup.story_file);
216231
217232 #ifndef NO_BLORB
218233 if (f_setup.blorb_file != NULL)
219234 printf("Also loading %s.\n", f_setup.blorb_file);
220235 #endif
236 }
221237
222238 /* Now strip off the extension */
223239 p = strrchr(f_setup.story_name, '.');
1919 */
2020
2121 #include <string.h>
22 #include <libgen.h>
2322
2423 #include "dfrotz.h"
2524
8988 fprintf(stderr, "\nEOT\n");
9089 os_quit(EXIT_SUCCESS);
9190 }
91 #ifdef TOPS20
92 /* On TOPS-20 only, the very first getchar() may return EOF,
93 * even thought feof(stdin) is false. No idea why, but...
94 */
95 if (!spurious_getchar) {
96 spurious_getchar = TRUE;
97 return xgetchar();
98 } else {
99 os_fatal(strerror(errno));
100 }
101 #else
92102 os_fatal(strerror(errno));
103 #endif
93104 }
94105 return c;
95106 }
152163 case '7': *dest++ = ZC_FKEY_F7; break;
153164 case '8': *dest++ = ZC_FKEY_F8; break;
154165 case '9': *dest++ = ZC_FKEY_F9; break;
166 #ifdef TOPS20
167 case '0': *dest++ = (char) (ZC_FKEY_F10 & 0xff); break;
168 #else
155169 case '0': *dest++ = ZC_FKEY_F10; break;
170 #endif
156171 default:
157172 fprintf(stderr, "DUMB-FROTZ: unknown escape char: %c\n", src[-1]);
158173 fprintf(stderr, "Enter \\help to see the list\n");
484499 char *os_read_file_name (const char *default_name, int flag)
485500 {
486501 char file_name[FILENAME_MAX + 1];
487 char fullpath[INPUT_BUFFER_SIZE], prompt[INPUT_BUFFER_SIZE];
502 char prompt[INPUT_BUFFER_SIZE];
503
504 char fullpath[INPUT_BUFFER_SIZE];
488505 char *buf;
506
489507 FILE *fp;
490508 char *tempname;
491509 char path_separator[2];
149149
150150 if (fg != DEFAULT_DUMB_COLOUR) {
151151 if (bg != DEFAULT_DUMB_COLOUR)
152 printf("\003%hhu,%s%hhu", fg, (bg < 10) ? "0" : "", bg);
152 printf("\003%u,%s%u", (unsigned char) fg,
153 ((unsigned char) bg < 10) ? "0" : "", (unsigned char) bg);
153154 else
154 printf("\003%s%hhu", (fg < 10) ? "0" : "", fg);
155 printf("\003%s%u", ((unsigned char) fg < 10) ? "0" : "", (unsigned char) fg);
155156 }
156157 }
157158
99 -m turn off MORE prompts
1010 -p plain ASCII output only
1111 -P alter piracy opcode
12 -q quiet mode (no startup messages)
1213 -r <option> Set runtime options
1314 -R <path> restricted read/write
1415 -s # random number seed value
2424 extern f_setup_t f_setup;
2525 extern z_header_t z_header;
2626
27 #ifndef NO_BLORB
2728
2829 static struct {
2930 int z_num;
3536 } *pict_info;
3637 static int num_pictures = 0;
3738
38 #ifndef NO_BLORB
39
4039 extern bb_map_t *blorb_map;
4140
4241 static int round_div(int x, int y)
4847 quotient++;
4948 return quotient;
5049 }
51 #endif
50 #endif /* NO_BLORB */
5251
5352
5453 bool dumb_init_pictures (void)
6463 unsigned char jfif_name[5] = {'J', 'F', 'I', 'F', 0x00};
6564
6665 bb_result_t res;
66 bb_resolution_t *reso;
6767 uint32 pos;
6868
6969 if (blorb_map == NULL) return FALSE;
7474 pict_info[0].height = num_pictures;
7575 pict_info[0].width = bb_get_release_num(blorb_map);
7676
77 y_scale = 200;
78 x_scale = 320;
77 reso = bb_get_resolution(blorb_map);
78 if (reso) {
79 x_scale = reso->px;
80 y_scale = reso->py;
81 } else {
82 y_scale = 200;
83 x_scale = 320;
84 }
7985
8086 for (i = 1; i <= num_pictures; i++) {
8187 if (bb_load_resource(blorb_map, bb_method_Memory, &res, bb_ID_Pict, i) == bb_err_None) {
154160
155161
156162 /* Convert a Z picture number to an index into pict_info. */
163 #ifndef NO_BLORB
157164 static int z_num_to_index(int n)
158165 {
159166 int i;
163170 }
164171 return -1;
165172 }
173 #endif
166174
167175
168176 bool os_picture_data(int num, int *height, int *width)
169177 {
178 #ifndef NO_BLORB
170179 int index;
171180
172181 *height = 0;
180189
181190 *height = pict_info[index].height;
182191 *width = pict_info[index].width;
183
192 #endif
184193 return TRUE;
185194 }
186195
0 #!/usr/bin/env perl
1
2 # Snavig -- Change an object's shape.
3 #
4 # This script's purpose is to transmogrify Frotz source code such that
5 # very limited linkers can handle the symbols and output the transformed
6 # sources. Then these source files can be uploaded into a machine
7 # wherein compilation is done.
8 #
9 # The original purpose of this script and its ancestor is to prepare
10 # Frotz to be compiled under TOPS20 running on a PDP10 mainframe. This
11 # transmogrification is not as easy as it sounds, because:
12 #
13 # https://github.com/PDP-10/panda/blob/master/files/kcc-6/kcc/user.doc#L519
14 #
15 # "However, the situation is different for symbols with external
16 # linkage, which must be exported to the PDP-10 linker. Such names are
17 # truncated to 6 characters and case is no longer significant."
18 #
19 # So you need to map all the symbols in the header files, everything declared
20 # "extern" in the source files, and also make sure that your input file names
21 # are unambiguous.
22 #
23 # This script is heavily based on one by Adam Thornton for pulling in a
24 # remote git repository of Dumb Frotz, processing it, and then emitting
25 # source code for use on a PDP10. This version is meant to be called
26 # from the Unix Frotz's top level Makefile and work on the files present.
27
28 # TODO: Save the names of header files that need to be shortened. Then
29 # go through the .c files and shorten them there too.
30
31
32 use strict;
33 use warnings;
34
35 use Cwd;
36 use File::Copy;
37 use File::Slurp qw(edit_file_lines);
38 use File::Basename;
39 use File::Temp qw(tempfile);
40 use Getopt::Long qw(:config no_ignore_case);
41
42 my %options;
43
44 GetOptions('usage|?' => \$options{usage},
45 'h|help' => \$options{help},
46 'v|verbose' => \$options{verbose},
47 'q|quiet' => \$options{quiet},
48 't|type=s' => \$options{type},
49 );
50
51 my $shorten_filenames;
52 my $transform_symbols;
53 my $dos_end; # To convert \n line endings to \r\n
54
55 my $type = $options{type};
56
57 my $myname = "snavig";
58 my $topdir = getcwd();
59 my $target;
60 my @sources;
61 my @inputfiles;
62
63 my $sed = "sed";
64 #my $sed = "gsed"; # GNU sed required, so if you're on macOS, BSD, etc...
65 my $sedfile = "urbzig.sed";
66 my $sedfilepath;
67 my $sedinplace = "-i.bak";
68
69 my %symbolmap = ();
70 my $counter = 0;
71
72 my $argc = @ARGV;
73
74 print " Snavig -- Change an object's shape.\n";
75
76 if ($argc < 2 || $options{help} || !$type) { usage(); }
77
78
79 print " Preparing files for $type.\n";
80 if ($type eq "tops20") {
81 $shorten_filenames = 1;
82 $transform_symbols = 1;
83 $dos_end = 1;
84 } elsif ($type eq "dos") {
85 $dos_end = 1;
86 } else {
87 print " Unknown target type $type.\n";
88 usage();
89 }
90
91 # All parameters but the last one is a source directory.
92 # The last parameter is the target directory, so pop the last push.
93 for my $arg (@ARGV) {
94 push @sources, $arg;
95 }
96 $target = pop @sources;
97
98 $sedfilepath = "$topdir/$target/$sedfile";
99
100 print " Copying sources from: ";
101 my $source_dir_count = @sources;
102 foreach my $source_dir (@sources) {
103 print "$source_dir/";
104
105 if ($source_dir_count == 2 && $counter == $source_dir_count - 2) {
106 print " and ";
107 } elsif ($source_dir_count > 2 && $counter < $source_dir_count) {
108 if ($counter != $source_dir_count - 1) {
109 print ", ";
110 }
111 if ($counter == $source_dir_count - 2) {
112 print "and ";
113 }
114 }
115 $counter++;
116 }
117 print " to $target/\n";
118
119 # Get a list of input files.
120 for my $sourcedir (@sources) {
121 push @inputfiles, glob("$sourcedir/*.[ch] $sourcedir/*.asm");
122 }
123
124 # Copy input files to output directory.
125 for my $inputfile (@inputfiles) {
126 copy($inputfile, $target);
127 }
128
129 # Shorten the filenames and note shortened headers for rewriting later.
130
131 if ($shorten_filenames) {
132 print " Shortening filenames...\n";
133 shorten_filenames($target, 6);
134 }
135
136 open my $mapfile, '>', $sedfilepath;
137
138 if ($transform_symbols) {
139 # Scan source code and build a symbol map.
140 print " Adding to " . $sedfile . " list of symbols to convert...\n";
141 %symbolmap = build_symbolmap($target, 6, 6);
142 for my $k (reverse(sort(keys %symbolmap))) {
143 my $symbol = $symbolmap{$k}{'original'};
144 my $newsym = $symbolmap{$k}{'new'};
145 if ($newsym =~ /A\d*/) {
146 print $mapfile "s/\\b$symbol\\b/$newsym/g\n";
147 } else {
148 print $mapfile "s/$symbol/$newsym/g\n";
149 }
150 }
151 }
152
153 if ($dos_end) {
154 print " Adding to " . $sedfile . " line ending conversion of LF to CR LF...\n";
155 print $mapfile 's/$/\r/' . "\n";
156 }
157
158 print " Running conversion...\n";
159 chdir $target;
160 `$sed $sedinplace -f $sedfilepath *`;
161 unlink glob("*.bak");
162 chdir $topdir;
163
164
165 print " Done!\n";
166 exit;
167
168 ############################################################################
169
170 sub usage {
171 print "Usage: $myname -t <type> <source dir> [<source dir>] ... <dest dir>\n";
172 print "Types supported:\n";
173 print " tops20\n";
174 print " dos\n";
175 exit;
176 }
177
178
179 # Identify unique symbol names and rewrite them if they are longer than
180 # $slimit characters to "A[0-9]{$slimit}". This does not rewrite the
181 # symbols for all files. Another pass is needed for that for which a
182 # hash of changed symbols is returned.
183 # Includes are also rewritten to conform to filename length limit of $flimit.
184 sub build_symbolmap {
185 my ($dir, $slimit, $flimit, @junk) = @_;
186 my %symbolmap = ();
187 my $header = 0;
188 my $infile;
189 my $discard = tempfile();
190
191 for my $file (glob("$dir/*.[ch]")) {
192 if (substr($file, -2) eq ".h") {
193 $header = 1;
194 }
195 open $infile, '<', "$file";
196 TRANS: while (<$infile>) {
197 # Rewrite includes for shortened filenames.
198 if (/^#include/) {
199 my $tmpline = $_;
200 chomp $tmpline;
201 $tmpline =~ s/\\/\//g;
202 # Strip leading paths from local includes.
203 if (/\"/) {
204 (my $tmpline_no_ext = $tmpline) =~ s/\.[^.]+$//;
205 %symbolmap = insert_header(\%symbolmap, $tmpline, $flimit);
206 }
207 next TRANS;
208 }
209 # Only fix up externs in C source.
210 if (not $header and not /^extern\s/) {
211 next TRANS;
212 }
213
214 # Don't discard lines with only a closing curly bracket.
215 if (/^[}]\s$/) {
216 next TRANS;
217 }
218
219 # In headers, we need to fix up declarations too.
220 # Our typedefs, enums, and structs happen to have short
221 # names, so don't bother. AT
222 # For the current Frotz codebase, we need to check
223 # typedefs, enums, and structs too. DG
224 unless (/^extern\s/ or /^void\s/ or /^zchar\s/ or
225 /^char\s/ or
226 /^zbyte\s/ or /^int\s/ or /^bool\s/ or
227 /^typedef\s/ or /^enum\s/ or /^struct\s/ or
228 /^static\s/ or /^[}]\s/) {
229 next TRANS;
230 }
231
232 chomp;
233
234 my $symbol;
235 my $symbol2;
236 my $symbol3;
237
238 if (/^extern/) {
239 # Symbol is the last word on the line before
240 # return type.
241 # Drop the semicolon.
242 my $tmpline = substr($_,0,-1);
243 # Strip everything after a paren.
244 $tmpline =~ s/\(.*//;
245 $symbol = (split ' ', $tmpline)[-1];
246 } elsif (/^typedef unsigned/) {
247 # Symbol for this is the fourth.
248 $symbol = (split ' ', $_)[3];
249 } elsif (/^static\s/) {
250 # Catch function type and name in
251 # "static foobar_gate_t functionname(int foo)"
252 $symbol = (split ' ', $_)[1];
253 $symbol2 = (split ' ', $_)[2];
254 $symbol3 = (split ' ', $_)[3];
255 } else {
256 # Otherwise it's the second
257 $symbol = (split ' ', $_)[1];
258 }
259
260 if (!$symbol) {
261 next TRANS;
262 }
263
264 $symbol = clean_symbol($symbol);
265 %symbolmap = insert_symbol(\%symbolmap, $symbol, $_, $slimit);
266 if ($symbol2) {
267 $symbol2 = clean_symbol($symbol2);
268 %symbolmap = insert_symbol(\%symbolmap, $symbol2, $_, $slimit);
269 }
270 if ($symbol3) {
271 $symbol3 = clean_symbol($symbol3);
272 %symbolmap = insert_symbol(\%symbolmap, $symbol3, $_, $slimit);
273 }
274 }
275 close $infile;
276 }
277
278 return %symbolmap;
279 }
280
281
282 # Get rid of dereference, pointer, index, parameter notation, etc.
283 sub clean_symbol {
284 my ($symbol, @junk) = @_;
285
286 $symbol =~ s/^\*//;
287 $symbol =~ s/^\&//;
288 $symbol =~ s/[\[\]].*//;
289 $symbol =~ s/[\(\)].*//;
290 $symbol =~ s/;.*//;
291 $symbol =~ s/\/\*//;
292 $symbol =~ s/,.*//;
293
294 return $symbol;
295 }
296
297
298 # Remove leading path on includes header files and if necessary, shorten
299 # the filename before addding it to the symbol map. It makes the symbol
300 # map not really a symbol map, but, meh.
301 #
302 sub insert_header {
303 my ($map_ref, $file, $length, @junk) = @_;
304 my %symbolmap = %{$map_ref};
305 my $to;
306 my $unstripped;
307 my $lkey;
308 my $from;
309
310 unless (/\"/) {
311 return %symbolmap;
312 }
313
314 $from = $file;
315 $to = $from;
316 $from =~ s/\#/\\#/g;
317 $from =~ s/\"/\\\"/g;
318 $from =~ s/\./\\\./g;
319 $from =~ s/\//\\\//g;
320
321
322 $from =~ s/\s\*/\\s\*/g;
323 $from = "^" . $from;
324
325 $to =~ s/\.[^.]+$//g;
326 $to =~ s/^\#include\s//g;
327 $to =~ s/\"//g;
328 $to = basename($to);
329
330 if (length($to) gt 6) {
331 $to = substr($to, 0, $length);
332 }
333 $to = "\\#include \\\"" . basename($to) . "\.h\\\"";
334
335 $lkey=sprintf("%02d",length($from)) . $from;
336 if (not $symbolmap{$lkey}) {
337 $lkey=sprintf("%02d",length($from)) . $from;
338 $symbolmap{$lkey} = ();
339 $symbolmap{$lkey}{'original'} = $from;
340 $symbolmap{$lkey}{'new'} = $to;
341 }
342
343 return %symbolmap;
344 }
345
346
347 # If necessary, insert symbol into the symbolmap and return the new map.
348 sub insert_symbol {
349 my ($map_ref, $symbol, $line, $length, @junk) = @_;
350 my %symbolmap = %{$map_ref};
351
352 # Only fix up symbols that are long enough to matter.
353 if (length($symbol) <= $length) {
354 return %symbolmap;
355 }
356
357 my $sedstr;
358 # We want to sort substitutions by length in order
359 # to not do incorrect substring replacement.
360 # We assume all identifiers are < 100 characters.
361 # This is not Java.
362 my $lkey=sprintf("%02d",length($symbol)) . $symbol;
363 my $newid;
364 my $spec = "%0" . ($length - 1) . "d";
365 if (not $symbolmap{$lkey}) {
366 $newid = "A" . sprintf($spec, $counter);
367 $symbolmap{$lkey} = ();
368 $symbolmap{$lkey}{'original'} = $symbol;
369 $symbolmap{$lkey}{'new'} = $newid;
370 $counter++;
371 $line =~ s/$symbol/$newid/;
372 } else {
373 $newid = $symbolmap{$lkey}{'new'};
374 }
375 return %symbolmap;
376 }
377
378
379 # Shorten filenames to $length plus 1-character extension.
380 sub shorten_filenames {
381 my ($dir, $length, @junk) = @_;
382 my @files;
383 my %collision = ();
384 my $new;
385 my $orig_dir = getcwd();
386
387 chdir "$dir";
388 @files = glob("*.[ch]");
389 for my $f (@files) {
390 my $asc=48; # Start with "0"
391 if (length($f) > $length+2) { # counting the extension
392 my $tnam = substr($f,0,$length);
393 while ($collision{"$tnam".substr($f, -2)}) {
394 substr($tnam,5) = chr($asc);
395 $asc += 1;
396 if ($asc == 58) {
397 $asc=65; # Skip punctuation
398 }
399 # We really really should not run out of
400 # numbers and capital letters.
401 }
402 $collision{$tnam} = 1;
403 if (substr($f, -2) eq ".h") {
404 $new = fileparse($tnam, qr/\.[^.]*/) . ".h";
405 } else {
406 $new = fileparse($tnam, qr/\.[^.]*/) . ".c";
407 }
408 rename $f, $new;
409 }
410 }
411 chdir $orig_dir;
412 }
+0
-15
src/owdos/Makefile less more
0 # For GNU Make.
1
2 SOURCES = owblorb.c owinit.c owinput.c owmouse.c owpic.c owsample.c owscreen.c owtext.c
3 HEADERS = blorb.h blorblow.h fontdata.h owblorb.h owfrotz.h owhash.h
4 OBJECTS = $(SOURCES:.c=.o)
5
6 %.o: %.c
7 $(WCC) $(CFLAGS) $(DOS_CFLAGS) -o $@ -c $<
8
9 .PHONY: clean
10
11 clean:
12 rm -f $(TARGET) $(OBJECTS)
13 rm -f *.O
14
+0
-152
src/owdos/blorb.h less more
0 #ifndef BLORB_H
1 #define BLORB_H
2
3 /* blorb.h: Header file for Blorb library, version 1.0.2.
4 Designed by Andrew Plotkin <erkyrath@eblong.com>
5 http://www.eblong.com/zarf/blorb/index.html
6
7 This is the header that a Z-machine interpreter should include.
8 It defines everything that the interpreter has to know.
9 */
10
11 /* Things you (the porter) have to edit: */
12
13 /* As you might expect, uint32 must be a 32-bit unsigned numeric type,
14 and uint16 a 16-bit unsigned numeric type. You should also uncomment
15 exactly one of the two ENDIAN definitions. */
16
17 typedef unsigned long uint32;
18 typedef unsigned short uint16;
19
20 /* End of things you have to edit. */
21
22 #ifndef TRUE
23 #define TRUE 1
24 #endif
25 #ifndef FALSE
26 #define FALSE 0
27 #endif
28
29 /* Error type and error codes */
30 typedef int bb_err_t;
31
32 #define bb_err_None (0)
33 #define bb_err_CompileTime (1)
34 #define bb_err_Alloc (2)
35 #define bb_err_Read (3)
36 #define bb_err_NotAMap (4)
37 #define bb_err_Format (5)
38 #define bb_err_NotFound (6)
39
40 /* Methods for loading a chunk */
41 #define bb_method_DontLoad (0)
42 #define bb_method_Memory (1)
43 #define bb_method_FilePos (2)
44
45 /* Four-byte constants */
46
47 /*#define bb_make_id(c1, c2, c3, c4) \
48 (((c1) << 24) | ((c2) << 16) | ((c3) << 8) | (c4))
49 */
50 #define bb_ID_Snd 1399743520
51 #define bb_ID_Exec 1165518179
52 #define bb_ID_Pict 1349084020
53 #define bb_ID_Copyright 677587232
54 #define bb_ID_AUTH 1096111176
55 #define bb_ID_ANNO 1095650895
56
57 #define bb_ID_ZCOD 1514360644
58
59 /* bb_result_t: Result when you try to load a chunk. */
60 typedef struct bb_result_struct {
61 int chunknum; /* The chunk number (for use in bb_unload_chunk(), etc.) */
62 union {
63 void *ptr; /* A pointer to the data (if you used bb_method_Memory) */
64 uint32 startpos; /* The position in the file (if you used bb_method_FilePos) */
65 } data;
66 uint32 length; /* The length of the data */
67 } bb_result_t;
68
69 /* bb_aux_sound_t: Extra data which may be associated with a sound. */
70 typedef struct bb_aux_sound_struct {
71 char repeats;
72 } bb_aux_sound_t;
73
74 /* bb_aux_pict_t: Extra data which may be associated with an image. */
75 typedef struct bb_aux_pict_struct {
76 uint32 ratnum, ratden;
77 uint32 minnum, minden;
78 uint32 maxnum, maxden;
79 } bb_aux_pict_t;
80
81 /* bb_resolution_t: The global resolution data. */
82 typedef struct bb_resolution_struct {
83 uint32 px, py;
84 uint32 minx, miny;
85 uint32 maxx, maxy;
86 } bb_resolution_t;
87
88 /* bb_color_t: Guess what. */
89 typedef struct bb_color_struct {
90 unsigned char red, green, blue;
91 } bb_color_t;
92
93 /* bb_palette_t: The palette data. */
94 typedef struct bb_palette_struct {
95 int isdirect;
96 union {
97 int depth; /* The depth (if isdirect is TRUE). Either 16 or 32. */
98 struct {
99 int numcolors;
100 bb_color_t *colors;
101 } table; /* The list of colors (if isdirect is FALSE). */
102 } data;
103 } bb_palette_t;
104
105 /* bb_zheader_t: Information to identify a Z-code file. */
106 typedef struct bb_zheader_struct {
107 uint16 releasenum; /* Bytes $2-3 of header. */
108 char serialnum[6]; /* Bytes $12-17 of header. */
109 uint16 checksum; /* Bytes $1C-1D of header. */
110 /* The initpc field is not used by Blorb. */
111 } bb_zheader_t;
112
113 /* bb_map_t: Holds the complete description of an open Blorb file.
114 This type is opaque for normal interpreter use. */
115 typedef struct bb_map_struct bb_map_t;
116
117 /* Function declarations. These functions are of fairly general use;
118 they would apply to any Blorb file. */
119
120 extern bb_err_t bb_create_map(FILE * file, bb_map_t ** newmap);
121 extern bb_err_t bb_destroy_map(bb_map_t * map);
122
123 extern char *bb_err_to_string(bb_err_t err);
124
125 extern bb_err_t bb_load_chunk_by_type(bb_map_t * map, int method,
126 bb_result_t * res, uint32 chunktype,
127 int count);
128 extern bb_err_t bb_load_chunk_by_number(bb_map_t * map, int method,
129 bb_result_t * res, int chunknum);
130 extern bb_err_t bb_unload_chunk(bb_map_t * map, int chunknum);
131
132 extern bb_err_t bb_load_resource(bb_map_t * map, int method,
133 bb_result_t * res, uint32 usage, int resnum);
134 extern bb_err_t bb_count_resources(bb_map_t * map, uint32 usage,
135 int *num, int *min, int *max);
136
137 /* More function declarations. These functions are more or less
138 specific to the Z-machine's use of Blorb. */
139
140 extern uint16 bb_get_release_num(bb_map_t * map);
141 extern bb_zheader_t *bb_get_zheader(bb_map_t * map);
142 extern bb_resolution_t *bb_get_resolution(bb_map_t * map);
143 extern bb_err_t bb_get_palette(bb_map_t * map, bb_palette_t ** res);
144 extern bb_err_t bb_load_resource_pict(bb_map_t * map, int method,
145 bb_result_t * res, int resnum,
146 bb_aux_pict_t ** auxdata);
147 extern bb_err_t bb_load_resource_snd(bb_map_t * map, int method,
148 bb_result_t * res, int resnum,
149 bb_aux_sound_t ** auxdata);
150
151 #endif /* BLORB_H */
+0
-72
src/owdos/blorblow.h less more
0 #ifndef BLORBLOW_H
1 #define BLORBLOW_H
2
3 /* blorblow.h: Low-level header file for Blorb library, version 1.0.2.
4 Designed by Andrew Plotkin <erkyrath@eblong.com>
5 http://www.eblong.com/zarf/blorb/index.html
6
7 This header is generally of interest only to the Blorb library code
8 itself (blorblib.c); it defines things internal to the library.
9 An interpreter shouldn't have to include this file. The only time you
10 might need to include this is if you're writing a Blorb file analysis
11 tool (such as blorbscan), or a transformation tool, or some such thing.
12 */
13
14 /* More four-byte constants. */
15
16 #define bb_ID_FORM 1179603533
17 #define bb_ID_IFRS 1229345363
18 #define bb_ID_RIdx 1380541560
19 #define bb_ID_IFhd 1229351012
20 #define bb_ID_Reso 1382380399
21 #define bb_ID_Loop 1282371440
22 #define bb_ID_RelN 1382378574
23 #define bb_ID_Plte 1349284965
24
25 /* bb_chunkdesc_t: Describes one chunk of the Blorb file. */
26 typedef struct bb_chunkdesc_struct {
27 uint32 type;
28 uint32 len;
29 uint32 startpos; /* start of chunk header */
30 uint32 datpos; /* start of data (either startpos or startpos+8) */
31
32 void *ptr; /* pointer to malloc'd data, if loaded */
33 int auxdatnum; /* entry in the auxsound/auxpict array; -1 if none.
34 This only applies to chunks that represent resources; */
35
36 } bb_chunkdesc_t;
37
38 /* bb_resdesc_t: Describes one resource in the Blorb file. */
39 typedef struct bb_resdesc_struct {
40 uint32 usage;
41 int resnum;
42 int chunknum;
43 } bb_resdesc_t;
44
45 /* bb_map_t: Holds the complete description of an open Blorb file. */
46 struct bb_map_struct {
47 uint32 inited; /* holds bb_Inited_Magic if the map structure is valid */
48 FILE *file;
49
50 int numchunks;
51 bb_chunkdesc_t *chunks; /* list of chunk descriptors */
52
53 int numresources;
54 bb_resdesc_t *resources; /* list of resource descriptors */
55 bb_resdesc_t **ressorted; /* list of pointers to descriptors
56 in map->resources -- sorted by usage and resource number. */
57
58 bb_zheader_t *zheader;
59 int releasenum;
60 bb_resolution_t *resolution;
61 int palettechunk; /* chunk number of palette, or -1 if there is none. */
62 bb_palette_t *palette;
63 bb_aux_sound_t *auxsound; /* extra information about sounds */
64 bb_aux_pict_t *auxpict; /* extra information about pictures */
65 };
66
67 #define bb_Inited_Magic (0xB7012BED)
68
69 extern char *bb_id_to_string(uint32 id);
70
71 #endif /* BLORBLOW_H */
+0
-2250
src/owdos/fontdata.h less more
0 static unsigned char font_data[] = {
1 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
5 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
6 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
7 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
10 0x00, 0x7e, 0x00, 0x28, 0x00, 0x28, 0x00, 0xfc, 0x00, 0x50, 0x00, 0x50,
11 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x40,
13 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x20,
14 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x30,
15 0x40, 0x48, 0x80, 0x48, 0x00, 0x31, 0x00, 0x02, 0x00, 0x04, 0xc0, 0x08,
16 0x20, 0x11, 0x20, 0x21, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28,
18 0x00, 0x28, 0x80, 0x13, 0x00, 0x29, 0x00, 0x45, 0x00, 0x42, 0x00, 0x45,
19 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
23 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
24 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
25 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20,
26 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
27 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x00, 0x00, 0x10, 0x00, 0x54, 0x00, 0x38, 0x00, 0x54, 0x00, 0x10,
29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x10,
32 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
42 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
43 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
45 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
47 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
48 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08,
50 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x48,
51 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x30,
53 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
55 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x78,
56 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40,
58 0x00, 0x40, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48,
59 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
61 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
63 0x00, 0x48, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20,
64 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48,
66 0x00, 0x48, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
67 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
69 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
77 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20,
82 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
83 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10,
85 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
87 0x40, 0x20, 0x20, 0x47, 0x20, 0x49, 0x20, 0x49, 0x20, 0x49, 0x20, 0x49,
88 0x20, 0x47, 0xc0, 0x20, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
90 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
91 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e,
93 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x7e, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e,
95 0x80, 0x21, 0x80, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
96 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x23, 0x00, 0x21,
98 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x23,
99 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
101 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
103 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
104 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
106 0x00, 0x40, 0x00, 0x40, 0xc0, 0x41, 0x80, 0x40, 0x80, 0x40, 0x80, 0x20,
107 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3f,
109 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x80, 0x73, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
111 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
112 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x10, 0x00, 0x10,
114 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90,
115 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x77, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30,
117 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x21, 0x80, 0x73, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
119 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
120 0x00, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x80, 0x31, 0x80, 0x31,
122 0x80, 0x31, 0x80, 0x2a, 0x80, 0x2a, 0x80, 0x2a, 0x80, 0x24, 0x80, 0x24,
123 0xc0, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x80, 0x63, 0x00, 0x31, 0x00, 0x31, 0x00, 0x29, 0x00, 0x29,
125 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x71, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
127 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
128 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x22, 0x00, 0x22,
130 0x00, 0x22, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
131 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
133 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x06,
134 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
135 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x24,
136 0x00, 0x22, 0x00, 0x21, 0x80, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4c, 0x00, 0x44,
138 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x04, 0x00, 0x44, 0x00, 0x64,
139 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x80, 0xff, 0x80, 0x88, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
141 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x73,
143 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
144 0x00, 0x21, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0x00, 0x41, 0x00, 0x41,
146 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08,
147 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0xb8, 0xed, 0x10, 0x45, 0x10, 0x45, 0x20, 0x22, 0x20, 0x22,
149 0x40, 0x15, 0x40, 0x15, 0x40, 0x15, 0x80, 0x08, 0x80, 0x08, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe1,
151 0x80, 0x40, 0x00, 0x21, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x12,
152 0x00, 0x21, 0x80, 0x40, 0xc0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0x00, 0x41, 0x00, 0x22,
154 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
155 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08,
157 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x41, 0x00, 0xff, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
159 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
160 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
162 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
163 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
165 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
166 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28,
167 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
176 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
178 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
179 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
181 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
183 0x00, 0x04, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
184 0x00, 0x44, 0x00, 0x44, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x44,
187 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x40,
189 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
192 0x00, 0x38, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
194 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
195 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40,
197 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
200 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
202 0x00, 0x4c, 0x00, 0x48, 0x00, 0x50, 0x00, 0x70, 0x00, 0x48, 0x00, 0x44,
203 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
205 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x6d, 0x00, 0x49, 0x00, 0x49,
208 0x00, 0x49, 0x00, 0x49, 0x80, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210 0x00, 0xd8, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
211 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
213 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44,
216 0x00, 0x44, 0x00, 0x44, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
219 0x00, 0x3c, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x60,
221 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20,
224 0x00, 0x10, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
226 0x00, 0xe0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
227 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
229 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
232 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x80, 0xdd, 0x80, 0x88, 0x80, 0x88, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22,
235 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44,
237 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0xee, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
240 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xc0,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x7c, 0x00, 0x44, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x44,
243 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
245 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
246 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
247 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
248 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
250 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20,
251 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
261 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x50,
264 0x00, 0x50, 0x00, 0x64, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40,
266 0x00, 0x40, 0x00, 0x20, 0x00, 0x78, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24,
267 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 0x00, 0x00, 0x00, 0xb4, 0x00, 0x48, 0x00, 0x48, 0x00, 0xb4, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc,
271 0x00, 0x88, 0x00, 0xf8, 0x00, 0x50, 0x00, 0xf8, 0x00, 0x20, 0x00, 0x20,
272 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
274 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
275 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40, 0x00, 0x20, 0x00, 0x50,
277 0x00, 0x48, 0x00, 0x48, 0x00, 0x28, 0x00, 0x10, 0x00, 0x08, 0x00, 0x48,
278 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x4e,
282 0x40, 0x51, 0x40, 0x50, 0x40, 0x50, 0x40, 0x51, 0x40, 0x4e, 0x80, 0x20,
283 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
285 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28,
288 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
295 0x80, 0x20, 0x40, 0x5e, 0x40, 0x51, 0x40, 0x51, 0x40, 0x5e, 0x40, 0x52,
296 0x40, 0x51, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x20,
306 0x00, 0x40, 0x00, 0x80, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
309 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20,
311 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
315 0x00, 0x7b, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x38,
317 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
325 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
327 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x28,
331 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x80, 0x40, 0x00, 0xc1, 0x00, 0x42, 0x00, 0x44, 0x80, 0x48,
333 0x80, 0xe9, 0x80, 0x12, 0x80, 0x22, 0x80, 0x43, 0x80, 0x80, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40,
335 0x00, 0xc1, 0x00, 0x42, 0x00, 0x44, 0x00, 0x49, 0x80, 0xea, 0x80, 0x10,
336 0x00, 0x21, 0x00, 0x42, 0x80, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x00, 0x21, 0x00, 0x42,
338 0x00, 0x24, 0x80, 0x28, 0x80, 0xc9, 0x80, 0x12, 0x80, 0x22, 0x80, 0x43,
339 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
341 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08,
343 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e,
344 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
346 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
347 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14,
348 0x00, 0x22, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22,
349 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x08,
351 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e,
352 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
354 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
355 0x80, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14,
356 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22,
357 0x00, 0x22, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x80, 0xe3, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07,
359 0x20, 0x0a, 0x00, 0x0a, 0x40, 0x12, 0xc0, 0x13, 0x40, 0x22, 0x00, 0x3e,
360 0x00, 0x42, 0x20, 0x42, 0xe0, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
362 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x80, 0x40, 0x00, 0x21,
363 0x00, 0x1e, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08,
364 0x00, 0x04, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
365 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x7e,
367 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
368 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20,
370 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22,
371 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
372 0x00, 0x00, 0x00, 0x7e, 0x00, 0x22, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
373 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x7e, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x70,
375 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
376 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20,
378 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
379 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50,
380 0x00, 0x88, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
381 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x70,
383 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
384 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x23, 0x00, 0x21,
386 0x80, 0x20, 0x80, 0x70, 0x80, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x23,
387 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26,
388 0x00, 0x00, 0x80, 0x63, 0x00, 0x31, 0x00, 0x31, 0x00, 0x29, 0x00, 0x29,
389 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x71, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1e,
391 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
392 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
394 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
395 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12,
396 0x00, 0x21, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
397 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x1e,
399 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
400 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
402 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
403 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x28,
405 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1e,
407 0x80, 0x21, 0x80, 0x41, 0x80, 0x42, 0x80, 0x44, 0x80, 0x48, 0x80, 0x50,
408 0x80, 0x60, 0x00, 0x61, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21,
410 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
411 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
412 0x00, 0x08, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
413 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x21, 0x80, 0x73,
415 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
416 0x00, 0x21, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x80, 0x73, 0x00, 0x21, 0x00, 0x21,
418 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
419 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08,
420 0x00, 0x10, 0x80, 0xe3, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14,
421 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
423 0x00, 0x20, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22,
424 0x00, 0x3c, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44,
426 0x00, 0x44, 0x00, 0x48, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
427 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08,
429 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00,
430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
431 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
432 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00,
434 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
435 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08,
437 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00,
438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439 0x00, 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
440 0x00, 0x48, 0x00, 0x48, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00,
442 0x00, 0x30, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48,
443 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09,
445 0x00, 0x3f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00,
446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40,
448 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10,
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00,
450 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
451 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
453 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28,
455 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40,
456 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
458 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
459 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40,
461 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
463 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
464 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x00,
466 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
467 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40,
469 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
471 0x00, 0x20, 0x00, 0x50, 0x00, 0x08, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44,
472 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00,
474 0x00, 0xd8, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
475 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
477 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
479 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
480 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00,
482 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
483 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
485 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x44, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
488 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x10, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
491 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4c,
493 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x64, 0x00, 0x78, 0x00, 0x00,
494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10,
495 0x00, 0x08, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
496 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
498 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
499 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
501 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00,
502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503 0x00, 0x44, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
504 0x00, 0x44, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
506 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10,
507 0x00, 0x10, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
508 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x58, 0x00, 0x64,
509 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x78, 0x00, 0x40,
510 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
511 0x00, 0x44, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
512 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xa0, 0x00, 0xc0,
513 0x03, 0x03, 0x05, 0x07, 0x06, 0x0c, 0x0a, 0x03, 0x04, 0x04, 0x07, 0x07,
514 0x03, 0x04, 0x03, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
515 0x06, 0x06, 0x03, 0x03, 0x07, 0x07, 0x07, 0x06, 0x0c, 0x09, 0x09, 0x09,
516 0x0a, 0x08, 0x07, 0x0a, 0x0a, 0x05, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0a,
517 0x08, 0x0a, 0x09, 0x07, 0x09, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x08, 0x04,
518 0x04, 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x04, 0x07,
519 0x07, 0x03, 0x03, 0x07, 0x03, 0x09, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05,
520 0x03, 0x07, 0x07, 0x09, 0x07, 0x07, 0x07, 0x05, 0x03, 0x05, 0x08, 0x00,
521 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x03, 0x06, 0x05, 0x0b, 0x04, 0x07,
522 0x07, 0x04, 0x0b, 0x06, 0x04, 0x07, 0x03, 0x03, 0x04, 0x08, 0x06, 0x03,
523 0x04, 0x03, 0x04, 0x07, 0x09, 0x09, 0x09, 0x06, 0x09, 0x09, 0x09, 0x09,
524 0x09, 0x09, 0x0c, 0x09, 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x05,
525 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x0a, 0x0a, 0x0a, 0x0a,
526 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x06,
527 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07,
528 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
531 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
532 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
533 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
535 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24,
538 0x00, 0xff, 0x00, 0x24, 0x00, 0x24, 0x00, 0xff, 0x00, 0x48, 0x00, 0x48,
539 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540 0x00, 0x10, 0x00, 0x38, 0x00, 0x54, 0x00, 0x54, 0x00, 0x50, 0x00, 0x30,
541 0x00, 0x18, 0x00, 0x14, 0x00, 0x54, 0x00, 0x54, 0x00, 0x38, 0x00, 0x10,
542 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60,
543 0x80, 0x90, 0x00, 0x91, 0x00, 0x91, 0x00, 0x62, 0x60, 0x04, 0x90, 0x08,
544 0x90, 0x10, 0x90, 0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09,
546 0x00, 0x0a, 0xe0, 0x0c, 0x40, 0x34, 0x80, 0x44, 0x00, 0x43, 0x10, 0x62,
547 0xe0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
548 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
549 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
551 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
552 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08,
553 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
554 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
555 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
556 0x00, 0x10, 0x00, 0x54, 0x00, 0x38, 0x00, 0x38, 0x00, 0x54, 0x00, 0x10,
557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xfe, 0x00, 0x10, 0x00, 0x10,
560 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563 0x00, 0xc0, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20,
570 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80,
571 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
573 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
574 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
575 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
576 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04,
578 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x44,
579 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18,
581 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00,
582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
583 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x88, 0x00, 0xfc,
584 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x20,
586 0x00, 0x70, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08,
587 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x20, 0x00, 0x58, 0x00, 0x64,
589 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
590 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
591 0x00, 0x82, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08,
592 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
593 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44,
594 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
595 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
597 0x00, 0x3c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00,
598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
599 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
602 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603 0x00, 0x60, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x40,
605 0x00, 0x30, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
608 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30,
610 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00,
611 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08,
613 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x10, 0x08, 0x08, 0x10,
615 0xa8, 0x23, 0x68, 0x44, 0x48, 0x48, 0x48, 0x48, 0x88, 0x48, 0x88, 0x48,
616 0x90, 0x49, 0x64, 0x46, 0x08, 0x20, 0x10, 0x10, 0x20, 0x08, 0xc0, 0x07,
617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a,
618 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20,
619 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e,
621 0x00, 0x21, 0x80, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7e, 0x00, 0x00,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e,
623 0x80, 0x21, 0x80, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
624 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x80, 0x20,
626 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x80, 0x20, 0x00, 0x21,
627 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
628 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
629 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
631 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
632 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
634 0x00, 0x40, 0x00, 0x40, 0xc0, 0x41, 0x80, 0x40, 0x80, 0x40, 0x80, 0x20,
635 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x3f,
637 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0xc0, 0x71, 0x00, 0x00,
638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
639 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
640 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x10, 0x00, 0x10,
642 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90,
643 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644 0x00, 0x00, 0xc0, 0x73, 0x00, 0x21, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38,
645 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x21, 0xc0, 0x73, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
647 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
648 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x60, 0x30, 0xa0, 0x28,
650 0xa0, 0x28, 0xa0, 0x28, 0x20, 0x25, 0x20, 0x25, 0x20, 0x25, 0x20, 0x22,
651 0x70, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652 0x00, 0x00, 0xc0, 0x61, 0x80, 0x20, 0x80, 0x30, 0x80, 0x28, 0x80, 0x24,
653 0x80, 0x24, 0x80, 0x22, 0x80, 0x21, 0x80, 0x20, 0x80, 0x70, 0x00, 0x00,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
655 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
656 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x21, 0x00, 0x21,
658 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
659 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
661 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x04,
662 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
663 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x22,
664 0x00, 0x22, 0x00, 0x21, 0xc0, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x42,
666 0x00, 0x40, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x42, 0x00, 0x62,
667 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668 0x00, 0x00, 0x80, 0xff, 0x80, 0x88, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
669 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00,
670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x71,
671 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20,
672 0x80, 0x20, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf1, 0x80, 0x20, 0x80, 0x20,
674 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c,
675 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676 0x00, 0x00, 0xbc, 0xf7, 0x08, 0x21, 0x10, 0x21, 0x10, 0x23, 0x90, 0x12,
677 0xa0, 0x14, 0xa0, 0x14, 0xa0, 0x14, 0x40, 0x08, 0x40, 0x08, 0x00, 0x00,
678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xfb,
679 0x80, 0x20, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0a,
680 0x00, 0x12, 0x00, 0x21, 0xc0, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x79, 0x80, 0x10, 0x00, 0x11,
682 0x00, 0x09, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04,
683 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684 0x00, 0x00, 0x00, 0x7f, 0x00, 0x42, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08,
685 0x00, 0x10, 0x00, 0x20, 0x80, 0x20, 0x00, 0x41, 0x00, 0xff, 0x00, 0x00,
686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x40,
687 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
688 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
689 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40,
690 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10,
691 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692 0x00, 0xe0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
693 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
694 0x00, 0x20, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
695 0x00, 0x48, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00,
696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
700 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c,
704 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
706 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
707 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
709 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c,
711 0x00, 0x04, 0x00, 0x04, 0x00, 0x34, 0x00, 0x4c, 0x00, 0x44, 0x00, 0x44,
712 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
715 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
716 0x00, 0x38, 0x00, 0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40,
717 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x8c, 0x00, 0x88, 0x00, 0x88,
720 0x00, 0x70, 0x00, 0x80, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78,
721 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
722 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
723 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
724 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0,
725 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
727 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20,
728 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xc0,
729 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
730 0x00, 0x4e, 0x00, 0x48, 0x00, 0x50, 0x00, 0x70, 0x00, 0x48, 0x00, 0x44,
731 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
732 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
733 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735 0x00, 0x00, 0x00, 0x00, 0x80, 0x59, 0x40, 0xe6, 0x40, 0x44, 0x40, 0x44,
736 0x40, 0x44, 0x40, 0x44, 0xe0, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
738 0x00, 0x58, 0x00, 0xe4, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
739 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
741 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0xe4, 0x00, 0x44, 0x00, 0x44,
744 0x00, 0x44, 0x00, 0x64, 0x00, 0x58, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0,
745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
746 0x00, 0x34, 0x00, 0x4c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
747 0x00, 0x34, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0xe0,
749 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x40, 0x00, 0x30,
752 0x00, 0x08, 0x00, 0x48, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
754 0x00, 0xf0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50,
755 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
757 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
760 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762 0xe0, 0xee, 0x40, 0x44, 0x40, 0x44, 0x80, 0x2a, 0x80, 0x2a, 0x00, 0x33,
763 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44,
765 0x00, 0x28, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0xee, 0x00, 0x00,
766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
768 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x7c, 0x00, 0x48, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x44,
771 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
773 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
774 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
775 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
776 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10,
778 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
779 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 0x00, 0x71, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
789 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
790 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791 0x00, 0x02, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x46, 0x00, 0x48, 0x00, 0x48,
792 0x00, 0x52, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40,
793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x20,
794 0x00, 0x20, 0x00, 0x78, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x62,
795 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x24, 0x00, 0x42,
797 0x00, 0x42, 0x00, 0x24, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77,
799 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7f, 0x00, 0x08, 0x00, 0x7f,
800 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
802 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
803 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x20, 0x00, 0x10, 0x00, 0x28,
805 0x00, 0x44, 0x00, 0x42, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x04,
806 0x00, 0x24, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x40, 0x40, 0x9f,
810 0x40, 0xa1, 0x40, 0xa0, 0x40, 0xa0, 0x40, 0xa1, 0x40, 0x9e, 0x80, 0x40,
811 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812 0x00, 0x00, 0x00, 0xe0, 0x00, 0xa0, 0x00, 0x60, 0x00, 0xa0, 0x00, 0xf0,
813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48, 0x00, 0x90,
816 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
823 0x80, 0x40, 0x40, 0xbc, 0x40, 0x92, 0x40, 0x9c, 0x40, 0x94, 0x40, 0x92,
824 0x40, 0xb9, 0x80, 0x40, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
828 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xfe, 0x00, 0x10, 0x00, 0x10,
832 0x00, 0x10, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x90, 0x00, 0x20,
834 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0xe0, 0x00, 0x10, 0x00, 0x60, 0x00, 0x10, 0x00, 0xe0,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
839 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
843 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x7e, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4,
845 0x00, 0x74, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
846 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
852 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70,
853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
855 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858 0x00, 0x90, 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48,
859 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
860 0x00, 0x00, 0x80, 0x20, 0x80, 0x60, 0x00, 0x21, 0x00, 0x22, 0x00, 0x72,
861 0x40, 0x04, 0xc0, 0x08, 0x40, 0x09, 0xe0, 0x11, 0x40, 0x20, 0x00, 0x00,
862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x20,
863 0x00, 0x61, 0x00, 0x22, 0x00, 0x22, 0x00, 0x74, 0xe0, 0x08, 0x20, 0x09,
864 0x40, 0x10, 0x80, 0x20, 0xe0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0x00, 0x11, 0x00, 0x62,
866 0x00, 0x12, 0x00, 0xe4, 0x40, 0x08, 0xc0, 0x08, 0x40, 0x11, 0xe0, 0x21,
867 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
869 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x44,
870 0x00, 0x44, 0x00, 0x38, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04,
871 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f,
872 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a,
874 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20,
875 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09,
876 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11,
877 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x00, 0x04,
879 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f,
880 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a,
882 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20,
883 0xe0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09,
884 0x00, 0x09, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11,
885 0x00, 0x11, 0x00, 0x1f, 0x80, 0x20, 0x80, 0x20, 0xe0, 0xf1, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f,
887 0x08, 0x06, 0x00, 0x0a, 0x20, 0x0a, 0xe0, 0x13, 0x20, 0x3e, 0x00, 0x22,
888 0x08, 0x42, 0x18, 0x42, 0xf0, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x80, 0x21, 0x80, 0x40,
890 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x80, 0x40, 0x00, 0x21,
891 0x00, 0x1e, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08,
892 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
893 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00,
894 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7f,
895 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20,
896 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
897 0x00, 0x0c, 0x00, 0x12, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20,
898 0x00, 0x24, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21,
899 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
900 0x00, 0x00, 0x00, 0x7f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x24, 0x00, 0x3c,
901 0x00, 0x24, 0x00, 0x20, 0x80, 0x20, 0x00, 0x21, 0x00, 0x7f, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70,
903 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
904 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20,
906 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
907 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48,
908 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
909 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70,
911 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
912 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x20, 0x40, 0x20,
914 0x20, 0x20, 0x20, 0xfe, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x80, 0x20,
915 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x16,
916 0x00, 0x00, 0xc0, 0x61, 0x80, 0x20, 0x80, 0x30, 0x80, 0x28, 0x80, 0x24,
917 0x80, 0x24, 0x80, 0x22, 0x80, 0x21, 0x80, 0x20, 0x80, 0x70, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f,
919 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
920 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
921 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40,
922 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20,
923 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09,
924 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
925 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x00, 0x1f,
927 0x80, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
928 0x40, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x20, 0x40, 0x40,
930 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x20,
931 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18,
933 0x00, 0x18, 0x00, 0x24, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1f,
935 0x80, 0x21, 0x80, 0x41, 0x40, 0x42, 0x40, 0x44, 0x40, 0x48, 0x40, 0x48,
936 0x40, 0x30, 0x80, 0x30, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20,
938 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11,
939 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
940 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20,
941 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0xc0, 0x71,
943 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20,
944 0x80, 0x20, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xc0, 0x71, 0x80, 0x20, 0x80, 0x20,
946 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11,
947 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04,
948 0x00, 0x00, 0xe0, 0x79, 0x80, 0x10, 0x00, 0x11, 0x00, 0x09, 0x00, 0x0a,
949 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
951 0x00, 0x20, 0x00, 0x3e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21,
952 0x00, 0x3e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
954 0x00, 0x4c, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
955 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
957 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00,
958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
959 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c,
960 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
962 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44,
963 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
965 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x28, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c,
968 0x00, 0x44, 0x00, 0x44, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00,
970 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x44,
971 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x48,
973 0x80, 0x1f, 0x00, 0x28, 0x00, 0x48, 0x80, 0x48, 0x00, 0x77, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40,
976 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00,
978 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
979 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
981 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
983 0x00, 0x24, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40,
984 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
986 0x00, 0x38, 0x00, 0x44, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44,
987 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0,
989 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
991 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40,
992 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x00,
994 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
995 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x00, 0xc0,
997 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00,
998 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x18,
999 0x00, 0x28, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42,
1000 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1001 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00,
1002 0x00, 0x58, 0x00, 0xe4, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1003 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1005 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1007 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1008 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
1010 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1011 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1013 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015 0x00, 0x28, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1016 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1018 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x46,
1021 0x00, 0x46, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x22, 0x00, 0x5c, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1023 0x00, 0x10, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1024 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
1026 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4e,
1027 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44,
1029 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031 0x00, 0x28, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1032 0x00, 0x44, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
1034 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10,
1035 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5c, 0x00, 0x62,
1037 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7c, 0x00, 0x40,
1038 0x00, 0x40, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1039 0x00, 0x28, 0x00, 0x00, 0x00, 0xee, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28,
1040 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
1041 0x04, 0x03, 0x05, 0x08, 0x07, 0x0d, 0x0c, 0x03, 0x05, 0x05, 0x07, 0x08,
1042 0x03, 0x05, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
1043 0x07, 0x07, 0x03, 0x04, 0x08, 0x08, 0x08, 0x07, 0x0e, 0x0b, 0x0a, 0x0a,
1044 0x0b, 0x09, 0x08, 0x0a, 0x0b, 0x05, 0x06, 0x0b, 0x09, 0x0d, 0x0b, 0x0b,
1045 0x09, 0x0b, 0x0a, 0x08, 0x09, 0x0b, 0x0b, 0x0e, 0x0a, 0x0b, 0x09, 0x05,
1046 0x04, 0x04, 0x06, 0x08, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x07,
1047 0x07, 0x03, 0x04, 0x07, 0x03, 0x0b, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06,
1048 0x04, 0x07, 0x07, 0x0b, 0x07, 0x07, 0x06, 0x07, 0x03, 0x07, 0x08, 0x00,
1049 0x04, 0x03, 0x08, 0x08, 0x08, 0x09, 0x03, 0x08, 0x05, 0x0b, 0x04, 0x07,
1050 0x08, 0x05, 0x0b, 0x08, 0x06, 0x08, 0x05, 0x05, 0x04, 0x07, 0x07, 0x04,
1051 0x04, 0x05, 0x04, 0x07, 0x0b, 0x0b, 0x0b, 0x07, 0x0b, 0x0b, 0x0b, 0x0b,
1052 0x0b, 0x0b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05, 0x05,
1053 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x08, 0x0b, 0x0b, 0x0b, 0x0b,
1054 0x0b, 0x0b, 0x09, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x07,
1055 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x04, 0x03, 0x08, 0x07, 0x07, 0x07,
1056 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07,
1057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1060 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1061 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11,
1066 0x80, 0x7f, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xff, 0x00, 0x44,
1067 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x10, 0x00, 0x3e, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50,
1069 0x00, 0x3c, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x7c, 0x00, 0x10,
1070 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
1071 0x00, 0x32, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x38, 0x00, 0x08, 0x00, 0x13,
1072 0x80, 0x14, 0x80, 0x34, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14,
1074 0x00, 0x1c, 0x00, 0x18, 0x00, 0x2a, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x44,
1075 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1079 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1080 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10,
1081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40,
1082 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1083 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xf8, 0x00, 0x30, 0x00, 0x48,
1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xf8,
1088 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1098 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1099 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1101 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1104 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1106 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1107 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04,
1109 0x00, 0x38, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1111 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x88, 0x00, 0xfc,
1112 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x40,
1114 0x00, 0x40, 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x04, 0x00, 0x44,
1115 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x78,
1117 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1119 0x00, 0xfe, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10,
1120 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1122 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1123 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1124 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1125 0x00, 0x44, 0x00, 0x3c, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
1126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1128 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1130 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1131 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1133 0x00, 0x60, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
1141 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
1143 0x80, 0x61, 0x40, 0x4c, 0x40, 0x98, 0x40, 0xa6, 0x40, 0xa6, 0x80, 0x9d,
1144 0x00, 0x40, 0x80, 0x20, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1146 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
1147 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1148 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22,
1149 0x00, 0x3c, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x1c, 0x00, 0x24, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80,
1152 0x00, 0x80, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x58,
1154 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42,
1155 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1157 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x40,
1160 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44,
1162 0x00, 0x40, 0x00, 0x80, 0x00, 0xbe, 0x00, 0x82, 0x00, 0x82, 0x00, 0x84,
1163 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1165 0x00, 0x7f, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00,
1166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1167 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1168 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x04,
1170 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44,
1171 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x70,
1173 0x00, 0x60, 0x00, 0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x46, 0x00, 0x00,
1174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1175 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1176 0x00, 0x40, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22,
1178 0x00, 0x22, 0x00, 0x56, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x80, 0x88,
1179 0x80, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x80, 0x60, 0x80, 0x50, 0x80, 0x48,
1181 0x80, 0x48, 0x80, 0x44, 0x80, 0x42, 0x80, 0x41, 0x80, 0x40, 0x00, 0x00,
1182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1184 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x48,
1186 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40,
1187 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40,
1189 0x80, 0x40, 0x80, 0x40, 0x80, 0x44, 0x80, 0x23, 0x00, 0x1f, 0x80, 0x01,
1190 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1191 0x00, 0x70, 0x00, 0x48, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x78,
1192 0x00, 0x50, 0x00, 0x48, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x20,
1194 0x00, 0x40, 0x00, 0x40, 0x00, 0x3c, 0x00, 0x02, 0x00, 0x02, 0x00, 0x84,
1195 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
1197 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1199 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1200 0x00, 0x41, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82,
1202 0x00, 0x84, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x30,
1203 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x00, 0x00, 0x00, 0x00, 0x20, 0x84, 0x20, 0x84, 0x40, 0x44, 0x40, 0x4a,
1205 0x40, 0x4a, 0x80, 0x52, 0x80, 0x52, 0x80, 0x22, 0x00, 0x21, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x00, 0x81, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18,
1208 0x00, 0x24, 0x00, 0x42, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44,
1210 0x00, 0x44, 0x00, 0x24, 0x00, 0x28, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10,
1211 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
1213 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0xff, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
1215 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1216 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
1217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0,
1218 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10,
1219 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1220 0x00, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1221 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1222 0x00, 0x10, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1223 0x00, 0x70, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88,
1232 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1234 0x00, 0x80, 0x00, 0xf0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1235 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1237 0x00, 0x48, 0x00, 0x80, 0x00, 0x80, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1239 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x78, 0x00, 0x88, 0x00, 0x88,
1240 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88,
1243 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1244 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xf8,
1245 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
1246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x88,
1248 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0xf0,
1249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1250 0x00, 0x80, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1251 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
1253 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
1254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1255 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1256 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90, 0x00, 0x60,
1257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1258 0x00, 0x80, 0x00, 0x90, 0x00, 0xa0, 0x00, 0xe0, 0x00, 0xd0, 0x00, 0x90,
1259 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1260 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1261 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
1262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xda, 0x00, 0x92,
1264 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1267 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
1269 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x88, 0x00, 0x88,
1272 0x00, 0x88, 0x00, 0x88, 0x00, 0xf0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1274 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1275 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
1276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
1277 0x00, 0xd0, 0x00, 0x90, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
1278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x88, 0x00, 0x60,
1280 0x00, 0x10, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1282 0x00, 0x20, 0x00, 0xf8, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1283 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88,
1285 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00,
1286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x50,
1288 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1290 0x00, 0x00, 0x00, 0x92, 0x00, 0x92, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0x54,
1291 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84,
1293 0x00, 0x48, 0x00, 0x30, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x00,
1294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48,
1296 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x78, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40,
1299 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1301 0x00, 0x40, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1302 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1303 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1304 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x20,
1306 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20,
1307 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64,
1309 0x00, 0xe4, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1317 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1319 0x00, 0x20, 0x00, 0x78, 0x00, 0x68, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa8,
1320 0x00, 0xa8, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x30, 0x00, 0x20,
1322 0x00, 0x20, 0x00, 0xfc, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21,
1323 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x7c,
1325 0x00, 0x48, 0x00, 0x48, 0x00, 0x78, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x7c, 0x00, 0x10,
1328 0x00, 0x38, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1330 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1331 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x22, 0x00, 0x20, 0x00, 0x3c,
1333 0x00, 0x22, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x62, 0x00, 0x9d,
1338 0x00, 0xa1, 0x00, 0xa5, 0x00, 0x9b, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x90, 0x00, 0x98, 0x00, 0x68,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x50, 0x00, 0xa0,
1344 0x00, 0x50, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x08, 0x00, 0x08,
1347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
1351 0x00, 0x42, 0x00, 0x9d, 0x00, 0x95, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa7,
1352 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
1354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xf8,
1360 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x28, 0x00, 0x18,
1362 0x00, 0x20, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1c,
1365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1367 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x46, 0x00, 0x44, 0x00, 0x44,
1371 0x00, 0x7c, 0x00, 0xc0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x3a, 0x00, 0x4a, 0x00, 0x4a,
1373 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3a, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c,
1381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
1383 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
1384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1386 0x00, 0x00, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50,
1387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c,
1389 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28,
1390 0x00, 0x7c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1391 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x7e,
1392 0x00, 0x00, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x1c,
1393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x18,
1394 0x00, 0x08, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x08,
1395 0x00, 0x18, 0x00, 0x28, 0x00, 0x7c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40,
1397 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xc8, 0x00, 0x70, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
1399 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c,
1400 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1402 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
1403 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
1404 0x00, 0x12, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14,
1405 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00,
1406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x2e, 0x00, 0x00,
1407 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c,
1408 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08,
1410 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
1411 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
1412 0x00, 0x12, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14,
1413 0x00, 0x24, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01,
1415 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0x11, 0xf8, 0x1f, 0x00, 0x21,
1416 0x00, 0x41, 0x00, 0x81, 0xf8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x24,
1418 0x00, 0x44, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xcc,
1419 0x00, 0x78, 0x00, 0x08, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10,
1420 0x00, 0x08, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1421 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00,
1422 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
1423 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40,
1424 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40,
1426 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1427 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1428 0x00, 0x24, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1429 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x00,
1430 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00,
1431 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1432 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x10,
1434 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1435 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1436 0x00, 0x48, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1437 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00,
1438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
1439 0x00, 0x7c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1440 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x58,
1442 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0xf1, 0x00, 0x41, 0x00, 0x41,
1443 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a,
1444 0x00, 0x2e, 0x00, 0x00, 0x80, 0x40, 0x80, 0x60, 0x80, 0x50, 0x80, 0x48,
1445 0x80, 0x48, 0x80, 0x44, 0x80, 0x42, 0x80, 0x41, 0x80, 0x40, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00,
1447 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1448 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1449 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x11,
1450 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x21,
1451 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
1452 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40,
1453 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
1454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x00,
1455 0x00, 0x0e, 0x00, 0x11, 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1456 0x00, 0x41, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x11,
1458 0x80, 0x20, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x21,
1459 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
1461 0x00, 0xe0, 0x00, 0x60, 0x00, 0xf0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00,
1462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1463 0x80, 0x1e, 0x80, 0x61, 0x80, 0x42, 0x80, 0x84, 0x80, 0x88, 0x80, 0x91,
1464 0x00, 0xe1, 0x00, 0x43, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41,
1466 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22,
1467 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08,
1468 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1469 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00,
1470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
1471 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41,
1472 0x00, 0x41, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1473 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41,
1474 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22,
1475 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10,
1476 0x00, 0x20, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24,
1477 0x00, 0x28, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00,
1478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x40, 0x00, 0x78, 0x00, 0x4c, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
1480 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x88,
1482 0x00, 0x88, 0x00, 0x90, 0x00, 0xa0, 0x00, 0x90, 0x00, 0x88, 0x00, 0x88,
1483 0x00, 0xf0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38,
1485 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00,
1486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1487 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88,
1488 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48,
1490 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1491 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1492 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x38,
1493 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00,
1494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88,
1496 0x00, 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30,
1498 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1499 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1500 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
1501 0x80, 0x24, 0x00, 0x45, 0x00, 0x46, 0x40, 0x64, 0x80, 0x3f, 0x00, 0x00,
1502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x80,
1504 0x00, 0x80, 0x00, 0x88, 0x00, 0x78, 0x00, 0x10, 0x00, 0x70, 0x00, 0x00,
1505 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10,
1506 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88,
1507 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70,
1509 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1510 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1511 0x00, 0x30, 0x00, 0x48, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90,
1512 0x00, 0xe0, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1513 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
1514 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x90, 0x00, 0xe0, 0x00, 0x88,
1515 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1516 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40,
1517 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1519 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1520 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90,
1522 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1523 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x20,
1525 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
1526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1527 0x00, 0x78, 0x00, 0x30, 0x00, 0xf0, 0x00, 0x08, 0x00, 0x38, 0x00, 0x48,
1528 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0xb8,
1530 0x00, 0x00, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1531 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1532 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x70,
1533 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1535 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88,
1536 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48,
1538 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1539 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1540 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x70,
1541 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00,
1542 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1543 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88,
1544 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1546 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x20,
1547 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1548 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1549 0x00, 0xc8, 0x00, 0xb8, 0x00, 0xa8, 0x00, 0xc8, 0x00, 0xf0, 0x00, 0x00,
1550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1551 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1552 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
1554 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1555 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1556 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x00, 0x00, 0x88,
1557 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00,
1558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1559 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88,
1560 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40,
1562 0x00, 0x00, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x30,
1563 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
1564 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xf0,
1565 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xf0, 0x00, 0x80,
1566 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48,
1568 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1569 0x04, 0x03, 0x05, 0x0a, 0x08, 0x0a, 0x08, 0x05, 0x04, 0x04, 0x06, 0x06,
1570 0x03, 0x05, 0x03, 0x06, 0x07, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
1571 0x07, 0x07, 0x04, 0x04, 0x05, 0x06, 0x04, 0x06, 0x0b, 0x08, 0x08, 0x07,
1572 0x09, 0x08, 0x07, 0x08, 0x09, 0x07, 0x08, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
1573 0x06, 0x0b, 0x07, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x08, 0x09, 0x05,
1574 0x06, 0x05, 0x06, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
1575 0x06, 0x02, 0x05, 0x06, 0x02, 0x08, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06,
1576 0x06, 0x06, 0x06, 0x08, 0x07, 0x06, 0x06, 0x04, 0x05, 0x04, 0x07, 0x00,
1577 0x04, 0x03, 0x06, 0x09, 0x07, 0x08, 0x05, 0x08, 0x07, 0x09, 0x06, 0x07,
1578 0x06, 0x05, 0x09, 0x07, 0x05, 0x06, 0x08, 0x08, 0x07, 0x07, 0x08, 0x03,
1579 0x07, 0x08, 0x08, 0x07, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08,
1580 0x08, 0x08, 0x0e, 0x07, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07,
1581 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x06, 0x0a, 0x09, 0x09, 0x09,
1582 0x09, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0b, 0x06,
1583 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06,
1584 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
1585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1588 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1589 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
1590 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
1591 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1592 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1593 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14,
1594 0x00, 0x7e, 0x00, 0x28, 0x00, 0x28, 0x00, 0xfc, 0x00, 0x50, 0x00, 0x50,
1595 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1596 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x54, 0x00, 0x54, 0x00, 0x50,
1597 0x00, 0x38, 0x00, 0x14, 0x00, 0x14, 0x00, 0x54, 0x00, 0x38, 0x00, 0x10,
1598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1599 0x40, 0x48, 0x80, 0x48, 0x00, 0x31, 0x00, 0x02, 0x00, 0x04, 0xc0, 0x08,
1600 0x20, 0x11, 0x20, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24,
1602 0x00, 0x24, 0x00, 0x18, 0x00, 0x28, 0x00, 0x44, 0x00, 0x45, 0x00, 0x42,
1603 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1604 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1605 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1607 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1608 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10,
1609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40,
1610 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1611 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
1612 0x00, 0x00, 0x00, 0x20, 0x00, 0xa8, 0x00, 0x70, 0x00, 0xd8, 0x00, 0x00,
1613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1615 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x10,
1616 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1619 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1623 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1624 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1626 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1627 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1628 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1629 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1631 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
1632 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44,
1634 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40,
1635 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1636 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18,
1637 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
1639 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x44, 0x00, 0x7c,
1640 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40,
1642 0x00, 0x40, 0x00, 0x78, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44,
1643 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1644 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40, 0x00, 0x58,
1645 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
1647 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10,
1648 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44,
1650 0x00, 0x44, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1651 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
1653 0x00, 0x34, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1655 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1658 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1659 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1660 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x30,
1661 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
1662 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x7c,
1664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
1666 0x00, 0x30, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60,
1667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1668 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08,
1669 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x60, 0x18,
1671 0x10, 0x20, 0x10, 0x20, 0xc8, 0x43, 0x48, 0x44, 0x48, 0x44, 0x88, 0x44,
1672 0x70, 0x23, 0x00, 0x20, 0x30, 0x18, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00,
1673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
1674 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7f, 0x00, 0x41, 0x80, 0x80,
1675 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1676 0x00, 0x00, 0x00, 0x7e, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7e,
1677 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7e, 0x00, 0x00,
1678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
1679 0x00, 0x21, 0x80, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1680 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x41, 0x80, 0x40,
1682 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x41,
1683 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x00, 0x7f, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e,
1685 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7f, 0x00, 0x00,
1686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
1687 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40,
1688 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
1690 0x00, 0x40, 0x00, 0x40, 0x80, 0x43, 0x80, 0x40, 0x80, 0x40, 0x80, 0x21,
1691 0x80, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1692 0x00, 0x00, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x7f,
1693 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x00,
1694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1695 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1696 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04,
1698 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44,
1699 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1700 0x00, 0x00, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x60,
1701 0x00, 0x50, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00,
1702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1703 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1704 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x60,
1706 0xc0, 0x60, 0x40, 0x51, 0x40, 0x51, 0x40, 0x4a, 0x40, 0x4a, 0x40, 0x44,
1707 0x40, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x00, 0x80, 0x40, 0x80, 0x60, 0x80, 0x50, 0x80, 0x50, 0x80, 0x48,
1709 0x80, 0x44, 0x80, 0x42, 0x80, 0x42, 0x80, 0x41, 0x80, 0x40, 0x00, 0x00,
1710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
1711 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1712 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x41, 0x80, 0x40,
1714 0x80, 0x40, 0x00, 0x41, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1715 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1716 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1717 0x80, 0x40, 0x80, 0x40, 0x80, 0x42, 0x00, 0x21, 0x80, 0x1e, 0x00, 0x00,
1718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
1719 0x00, 0x41, 0x80, 0x40, 0x80, 0x40, 0x00, 0x41, 0x00, 0x7f, 0x80, 0x40,
1720 0x80, 0x40, 0x80, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41,
1722 0x00, 0x40, 0x00, 0x38, 0x00, 0x06, 0x00, 0x01, 0x00, 0x41, 0x00, 0x41,
1723 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x80, 0xff, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
1725 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
1726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40,
1727 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1728 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41,
1730 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08,
1731 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1732 0x00, 0x00, 0x08, 0x82, 0x08, 0x82, 0x08, 0x82, 0x10, 0x45, 0x10, 0x45,
1733 0xa0, 0x28, 0xa0, 0x28, 0xa0, 0x28, 0x40, 0x10, 0x40, 0x10, 0x00, 0x00,
1734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
1735 0x00, 0x81, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x18, 0x00, 0x24,
1736 0x00, 0x42, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41,
1738 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
1739 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x7e, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08,
1741 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x00,
1742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
1743 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1744 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
1746 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1747 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x00, 0xe0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1749 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1750 0x00, 0x20, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28,
1751 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1752 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1759 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x42,
1760 0x00, 0x42, 0x00, 0x42, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1762 0x00, 0x5c, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x62,
1763 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
1765 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
1766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
1767 0x00, 0x02, 0x00, 0x02, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42,
1768 0x00, 0x42, 0x00, 0x46, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1770 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x42,
1771 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1772 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x40,
1773 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42,
1776 0x00, 0x42, 0x00, 0x46, 0x00, 0x3a, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3c,
1777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1778 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1779 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1780 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
1781 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1783 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1784 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1786 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x70, 0x00, 0x48, 0x00, 0x44,
1787 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1788 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1789 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1791 0x00, 0x00, 0x00, 0x00, 0x80, 0x59, 0x40, 0x66, 0x40, 0x44, 0x40, 0x44,
1792 0x40, 0x44, 0x40, 0x44, 0x40, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1794 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1795 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
1797 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
1798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1799 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42,
1800 0x00, 0x42, 0x00, 0x62, 0x00, 0x5c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1802 0x00, 0x3a, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46,
1803 0x00, 0x3a, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
1804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x60,
1805 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1807 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x38,
1808 0x00, 0x04, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
1810 0x00, 0xe0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1811 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44,
1813 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x34, 0x00, 0x00,
1814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1815 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44,
1816 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1818 0x80, 0x88, 0x80, 0x88, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22,
1819 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x48,
1821 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x00,
1822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1823 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44,
1824 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1826 0x00, 0x78, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40,
1827 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1828 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1829 0x00, 0x20, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1830 0x00, 0x20, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1831 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1832 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x20,
1834 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20,
1835 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
1836 0x00, 0x00, 0x00, 0x31, 0x00, 0x49, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
1845 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1846 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1847 0x00, 0x00, 0x00, 0x04, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x48, 0x00, 0x50,
1848 0x00, 0x50, 0x00, 0x64, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
1849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40,
1850 0x00, 0x40, 0x00, 0x20, 0x00, 0x78, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40,
1851 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1852 0x00, 0x00, 0x00, 0x44, 0x00, 0x38, 0x00, 0x28, 0x00, 0x38, 0x00, 0x44,
1853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82,
1855 0x00, 0x82, 0x00, 0x44, 0x00, 0x28, 0x00, 0xfe, 0x00, 0x10, 0x00, 0xfe,
1856 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1858 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
1859 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
1860 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x20, 0x00, 0x30, 0x00, 0x48,
1861 0x00, 0x24, 0x00, 0x18, 0x00, 0x08, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00,
1862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90,
1863 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x9d,
1866 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x9d, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
1867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1868 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x30, 0x00, 0x50, 0x00, 0x30,
1869 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1870 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50,
1872 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1874 0x00, 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1877 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
1879 0x00, 0x42, 0x00, 0xb9, 0x00, 0xa5, 0x00, 0xb9, 0x00, 0xa5, 0x00, 0x42,
1880 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1884 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1887 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7c, 0x00, 0x10,
1888 0x00, 0x10, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x20,
1890 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1892 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x20, 0x00, 0x90, 0x00, 0x60,
1893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1895 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1896 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
1898 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
1899 0x00, 0x7a, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
1900 0x00, 0x00, 0x00, 0x3c, 0x00, 0x74, 0x00, 0x74, 0x00, 0x74, 0x00, 0x74,
1901 0x00, 0x34, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00,
1902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
1904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1907 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
1909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
1911 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x70,
1912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50,
1915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1916 0x00, 0x00, 0x00, 0x42, 0x00, 0xc2, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48,
1917 0x80, 0x08, 0x80, 0x11, 0x80, 0x12, 0x80, 0x27, 0x80, 0x20, 0x00, 0x00,
1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42,
1919 0x00, 0xc2, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48, 0x00, 0x0b, 0x80, 0x14,
1920 0x00, 0x11, 0x00, 0x22, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x92, 0x00, 0x24,
1922 0x00, 0x94, 0x00, 0x68, 0x80, 0x08, 0x80, 0x11, 0x80, 0x12, 0x80, 0x27,
1923 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1924 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1925 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x44,
1926 0x00, 0x44, 0x00, 0x38, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08,
1927 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7f,
1928 0x00, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1929 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
1930 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7f, 0x00, 0x41, 0x80, 0x80,
1931 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14,
1932 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22,
1933 0x00, 0x22, 0x00, 0x7f, 0x00, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
1934 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x08,
1935 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7f,
1936 0x00, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1937 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14,
1938 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7f, 0x00, 0x41, 0x80, 0x80,
1939 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14,
1940 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22,
1941 0x00, 0x22, 0x00, 0x7f, 0x00, 0x41, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
1942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f,
1943 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0xe0, 0x27, 0x00, 0x24, 0x00, 0x7c,
1944 0x00, 0x44, 0x00, 0x84, 0xf0, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
1946 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x80, 0x40, 0x00, 0x21,
1947 0x00, 0x1e, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x08,
1948 0x00, 0x00, 0x00, 0x7f, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e,
1949 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7f, 0x00, 0x00,
1950 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7f,
1951 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40,
1952 0x00, 0x40, 0x00, 0x40, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1953 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x40, 0x00, 0x40,
1954 0x00, 0x40, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1955 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00,
1956 0x00, 0x00, 0x00, 0x7f, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7e,
1957 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7f, 0x00, 0x00,
1958 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40,
1959 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1960 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1961 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1962 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1963 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0,
1964 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1965 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
1966 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
1967 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
1968 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x42, 0x00, 0x41,
1970 0x00, 0x41, 0x00, 0xf1, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42,
1971 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26,
1972 0x00, 0x00, 0x80, 0x40, 0x80, 0x60, 0x80, 0x50, 0x80, 0x50, 0x80, 0x48,
1973 0x80, 0x44, 0x80, 0x42, 0x80, 0x42, 0x80, 0x41, 0x80, 0x40, 0x00, 0x00,
1974 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1e,
1975 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1976 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1977 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
1978 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
1979 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12,
1980 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1981 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
1982 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x1e,
1983 0x00, 0x21, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1984 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1985 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x21, 0x80, 0x40,
1986 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
1987 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1988 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x28,
1989 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e,
1991 0x00, 0x21, 0x80, 0x42, 0x80, 0x42, 0x80, 0x44, 0x80, 0x48, 0x80, 0x50,
1992 0x80, 0x50, 0x00, 0x21, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1993 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1994 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
1995 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08,
1996 0x00, 0x00, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
1997 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00,
1998 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x12, 0x80, 0x40,
1999 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
2000 0x80, 0x40, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2001 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40,
2002 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x00, 0x21,
2003 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08,
2004 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14,
2005 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
2006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
2007 0x00, 0x40, 0x00, 0x7c, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42,
2008 0x00, 0x7c, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42,
2010 0x00, 0x42, 0x00, 0x5c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
2011 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2012 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
2013 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3d, 0x00, 0x00,
2014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
2015 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x42,
2016 0x00, 0x42, 0x00, 0x42, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
2018 0x00, 0x3c, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
2019 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2020 0x00, 0x00, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
2021 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3d, 0x00, 0x00,
2022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24,
2023 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x42,
2024 0x00, 0x42, 0x00, 0x42, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2025 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00,
2026 0x00, 0x3c, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
2027 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2028 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3d, 0x10, 0x42,
2029 0x10, 0x3e, 0xf0, 0x43, 0x00, 0x42, 0x10, 0x42, 0xe0, 0x3d, 0x00, 0x00,
2030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2031 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40,
2032 0x00, 0x40, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x18,
2033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00,
2034 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x42,
2035 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2036 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
2037 0x00, 0x42, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
2038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
2039 0x00, 0x24, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7e,
2040 0x00, 0x40, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00,
2042 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7e, 0x00, 0x40, 0x00, 0x42,
2043 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2044 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
2045 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
2046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
2047 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
2048 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x00,
2050 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40,
2051 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2052 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40,
2053 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00,
2054 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
2055 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42,
2056 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x58, 0x00, 0x00,
2058 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
2059 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2060 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
2061 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
2062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
2063 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
2064 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00,
2066 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
2067 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2068 0x00, 0x00, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42,
2069 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00,
2070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24,
2071 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42,
2072 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2074 0x00, 0x10, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
2075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3c, 0x00, 0x46,
2077 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x62, 0x00, 0x3c, 0x00, 0x40,
2078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
2079 0x00, 0x10, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
2080 0x00, 0x44, 0x00, 0x4c, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
2082 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c,
2083 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2084 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44,
2085 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x34, 0x00, 0x00,
2086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
2087 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44,
2088 0x00, 0x44, 0x00, 0x4c, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00,
2090 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28,
2091 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
2092 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5c, 0x00, 0x62,
2093 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x62, 0x00, 0x5c, 0x00, 0x40,
2094 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
2095 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44,
2096 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xc0,
2097 0x03, 0x03, 0x05, 0x07, 0x07, 0x0c, 0x09, 0x03, 0x04, 0x04, 0x05, 0x07,
2098 0x03, 0x04, 0x03, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
2099 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x09, 0x09, 0x09,
2100 0x0a, 0x09, 0x08, 0x0a, 0x0a, 0x03, 0x07, 0x08, 0x07, 0x0b, 0x0a, 0x0a,
2101 0x09, 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x09, 0x0d, 0x08, 0x09, 0x08, 0x04,
2102 0x04, 0x04, 0x07, 0x07, 0x04, 0x08, 0x08, 0x07, 0x08, 0x08, 0x03, 0x08,
2103 0x07, 0x03, 0x03, 0x07, 0x03, 0x0b, 0x07, 0x08, 0x08, 0x08, 0x04, 0x07,
2104 0x03, 0x07, 0x07, 0x09, 0x06, 0x07, 0x06, 0x05, 0x03, 0x05, 0x09, 0x00,
2105 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x03, 0x07, 0x04, 0x08, 0x05, 0x07,
2106 0x07, 0x04, 0x08, 0x07, 0x04, 0x07, 0x04, 0x04, 0x04, 0x07, 0x07, 0x03,
2107 0x04, 0x04, 0x05, 0x07, 0x09, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09, 0x09,
2108 0x09, 0x09, 0x0d, 0x09, 0x09, 0x09, 0x09, 0x09, 0x03, 0x03, 0x03, 0x03,
2109 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x0a, 0x0a, 0x0a, 0x0a,
2110 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0d, 0x07,
2111 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0x07, 0x08, 0x08,
2112 0x08, 0x08, 0x08, 0x07, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07,
2113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
2114 0x00, 0x80, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2115 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x00, 0x00, 0x00, 0x20, 0xf8, 0xa0, 0xf8,
2116 0x28, 0xf8, 0x20, 0x00, 0x90, 0x10, 0x20, 0x40, 0x80, 0x90, 0x00, 0x00,
2117 0x40, 0xa0, 0x40, 0xa8, 0x90, 0x68, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00,
2118 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80, 0x80, 0x80, 0x40, 0x20, 0x00,
2119 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x90, 0x60, 0xf0,
2120 0x60, 0x90, 0x00, 0x00, 0x00, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x00, 0x00,
2121 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf0,
2122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
2123 0x10, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90,
2124 0x90, 0x60, 0x00, 0x00, 0x40, 0xc0, 0x40, 0x40, 0x40, 0xe0, 0x00, 0x00,
2125 0x60, 0x90, 0x20, 0x40, 0x80, 0xf0, 0x00, 0x00, 0x60, 0x90, 0x20, 0x10,
2126 0x90, 0x60, 0x00, 0x00, 0xa0, 0xa0, 0xf0, 0x20, 0x20, 0x20, 0x00, 0x00,
2127 0xf0, 0x80, 0xe0, 0x10, 0x10, 0xe0, 0x00, 0x00, 0x70, 0x80, 0xe0, 0x90,
2128 0x90, 0x60, 0x00, 0x00, 0xf0, 0x10, 0x20, 0x40, 0x40, 0x40, 0x00, 0x00,
2129 0x60, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00, 0x00, 0x60, 0x90, 0x90, 0x70,
2130 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00,
2131 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x20, 0x40, 0x80,
2132 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00,
2133 0x00, 0x80, 0x40, 0x20, 0x40, 0x80, 0x00, 0x00, 0x70, 0x88, 0x10, 0x20,
2134 0x00, 0x20, 0x00, 0x00, 0x60, 0x90, 0xb0, 0xb0, 0x80, 0x70, 0x00, 0x00,
2135 0x60, 0x90, 0x90, 0xf0, 0x90, 0x90, 0x00, 0x00, 0xe0, 0x90, 0xe0, 0x90,
2136 0x90, 0xe0, 0x00, 0x00, 0x70, 0x80, 0x80, 0x80, 0x80, 0x70, 0x00, 0x00,
2137 0xe0, 0x90, 0x90, 0x90, 0x90, 0xe0, 0x00, 0x00, 0xf0, 0x80, 0xe0, 0x80,
2138 0x80, 0xf0, 0x00, 0x00, 0xf0, 0x80, 0xe0, 0x80, 0x80, 0x80, 0x00, 0x00,
2139 0x70, 0x80, 0x80, 0xb0, 0x90, 0x70, 0x00, 0x00, 0x90, 0x90, 0x90, 0xf0,
2140 0x90, 0x90, 0x00, 0x00, 0xe0, 0x40, 0x40, 0x40, 0x40, 0xe0, 0x00, 0x00,
2141 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 0x00, 0x00, 0x90, 0xa0, 0xc0, 0xa0,
2142 0x90, 0x90, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf0, 0x00, 0x00,
2143 0x88, 0xd8, 0xa8, 0x88, 0x88, 0x88, 0x00, 0x00, 0x90, 0xd0, 0xb0, 0x90,
2144 0x90, 0x90, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, 0x00,
2145 0xe0, 0x90, 0x90, 0xe0, 0x80, 0x80, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90,
2146 0xb0, 0x70, 0x18, 0x00, 0xe0, 0x90, 0x90, 0xe0, 0xc0, 0xb0, 0x00, 0x00,
2147 0x70, 0x80, 0x60, 0x10, 0x90, 0x60, 0x00, 0x00, 0xf8, 0x20, 0x20, 0x20,
2148 0x20, 0x20, 0x00, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, 0x00,
2149 0x88, 0x88, 0x88, 0x50, 0x50, 0x20, 0x00, 0x00, 0x88, 0x88, 0x88, 0xa8,
2150 0xd8, 0x88, 0x00, 0x00, 0x88, 0x50, 0x20, 0x20, 0x50, 0x88, 0x00, 0x00,
2151 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x00, 0x00, 0xf0, 0x10, 0x20, 0x40,
2152 0x80, 0xf0, 0x00, 0x00, 0xc0, 0x80, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x00,
2153 0x80, 0x80, 0x40, 0x20, 0x10, 0x10, 0x00, 0x00, 0xc0, 0x40, 0x40, 0x40,
2154 0x40, 0xc0, 0x00, 0x00, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
2155 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x80, 0x80, 0x40, 0x00,
2156 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x20, 0xe0, 0xa0, 0xe0, 0x00, 0x00,
2157 0x80, 0xe0, 0xa0, 0xa0, 0xa0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x80, 0x80,
2158 0x80, 0xe0, 0x00, 0x00, 0x20, 0xe0, 0xa0, 0xa0, 0xa0, 0xe0, 0x00, 0x00,
2159 0x00, 0xe0, 0xa0, 0xe0, 0x80, 0xe0, 0x00, 0x00, 0x60, 0x40, 0xe0, 0x40,
2160 0x40, 0x40, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0xa0, 0xa0, 0xe0, 0x20, 0xe0,
2161 0x80, 0xe0, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80,
2162 0x80, 0x80, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0,
2163 0x80, 0xa0, 0xa0, 0xc0, 0xa0, 0xa0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
2164 0x80, 0x80, 0x00, 0x00, 0x00, 0xf8, 0xa8, 0xa8, 0xa8, 0xa8, 0x00, 0x00,
2165 0x00, 0xe0, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0xa0,
2166 0xa0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0xa0, 0xa0, 0xe0, 0x80, 0x80,
2167 0x00, 0xe0, 0xa0, 0xa0, 0xa0, 0xe0, 0x20, 0x20, 0x00, 0xe0, 0x80, 0x80,
2168 0x80, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x80, 0xe0, 0x20, 0xe0, 0x00, 0x00,
2169 0x40, 0xe0, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0xa0, 0xa0, 0xa0,
2170 0xa0, 0xe0, 0x00, 0x00, 0x00, 0xa0, 0xa0, 0xa0, 0xa0, 0x40, 0x00, 0x00,
2171 0x00, 0xa8, 0xa8, 0xa8, 0xa8, 0xf8, 0x00, 0x00, 0x00, 0xa0, 0xa0, 0x40,
2172 0xa0, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0xa0, 0xa0, 0xa0, 0xe0, 0x20, 0xe0,
2173 0x00, 0xe0, 0x20, 0x40, 0x80, 0xe0, 0x00, 0x00, 0x20, 0x40, 0x40, 0x80,
2174 0x40, 0x40, 0x20, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
2175 0x80, 0x40, 0x40, 0x20, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x40, 0xa8,
2176 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2177 0x04, 0x02, 0x04, 0x06, 0x06, 0x05, 0x06, 0x03, 0x04, 0x04, 0x05, 0x06,
2178 0x03, 0x05, 0x02, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
2179 0x05, 0x05, 0x02, 0x03, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x05, 0x05,
2180 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05,
2181 0x05, 0x06, 0x05, 0x05, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x05, 0x03,
2182 0x05, 0x03, 0x06, 0x05, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
2183 0x04, 0x02, 0x03, 0x04, 0x02, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
2184 0x04, 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x06, 0x00,
2185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xff,
2186 0x70, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0xff, 0x0e, 0x0c, 0x00, 0x00,
2187 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10,
2188 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2189 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
2190 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
2191 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0xff,
2192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x08, 0x08, 0x08,
2193 0x08, 0x08, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10,
2194 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00,
2195 0x00, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0xf8,
2196 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf8, 0x00, 0x00, 0x00,
2197 0x10, 0x10, 0x10, 0x10, 0x1f, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x1f,
2198 0x10, 0x10, 0x10, 0x10, 0x01, 0x02, 0x04, 0xf8, 0x08, 0x08, 0x08, 0x08,
2199 0x08, 0x08, 0x08, 0x08, 0xf8, 0x04, 0x02, 0x01, 0xff, 0xff, 0xff, 0xff,
2200 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
2201 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8,
2202 0xf8, 0xf8, 0xf8, 0xf8, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
2203 0x08, 0x08, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2204 0xff, 0x08, 0x08, 0x08, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8,
2205 0x1f, 0x1f, 0x1f, 0x1f, 0xff, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
2206 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
2207 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
2208 0xf8, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x40, 0x80,
2209 0x80, 0x40, 0x20, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x01, 0x02, 0x04, 0xf8,
2210 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x04, 0x02, 0x01,
2211 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2212 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2213 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
2214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
2215 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x01, 0x01, 0x01,
2216 0x01, 0x01, 0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
2217 0x00, 0xff, 0x80, 0x80, 0x80, 0x80, 0xff, 0x00, 0x00, 0xff, 0xc0, 0xc0,
2218 0xc0, 0xc0, 0xff, 0x00, 0x00, 0xff, 0xe0, 0xe0, 0xe0, 0xe0, 0xff, 0x00,
2219 0x00, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0x00, 0x00, 0xff, 0xf8, 0xf8,
2220 0xf8, 0xf8, 0xff, 0x00, 0x00, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0x00,
2221 0x00, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff,
2222 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
2223 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x81, 0x42, 0x24, 0x18,
2224 0x18, 0x24, 0x42, 0x81, 0x08, 0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08,
2225 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18,
2226 0x18, 0x7e, 0x3c, 0x18, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18,
2227 0xff, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xff, 0x00, 0x3c, 0x66, 0x06,
2228 0x18, 0x00, 0x18, 0x00, 0x63, 0x76, 0x5c, 0x60, 0x78, 0x66, 0x60, 0x00,
2229 0x78, 0x6e, 0x63, 0x7c, 0x63, 0x6e, 0x78, 0x00, 0x00, 0x1e, 0x1b, 0x18,
2230 0x18, 0xd8, 0x78, 0x00, 0x63, 0x63, 0x77, 0x49, 0x77, 0x63, 0x63, 0x00,
2231 0x63, 0x77, 0x6b, 0x6b, 0x63, 0x63, 0x63, 0x00, 0x49, 0x52, 0x64, 0x68,
2232 0x70, 0x60, 0x60, 0x00, 0x00, 0x63, 0x36, 0x1c, 0x1c, 0x36, 0x63, 0x00,
2233 0x63, 0x53, 0x4f, 0x63, 0x79, 0x65, 0x63, 0x00, 0x30, 0x30, 0x30, 0x30,
2234 0x30, 0x30, 0x30, 0x00, 0x18, 0x18, 0x7e, 0x99, 0x7e, 0x18, 0x18, 0x00,
2235 0x60, 0x60, 0x78, 0x6c, 0x67, 0x63, 0x63, 0x00, 0x38, 0x3c, 0x36, 0x30,
2236 0x30, 0x30, 0x30, 0x00, 0x77, 0x6b, 0x77, 0x63, 0x63, 0x63, 0x63, 0x00,
2237 0x18, 0xd8, 0x78, 0x3c, 0x1e, 0x1b, 0x18, 0x00, 0x71, 0x6a, 0x64, 0x71,
2238 0x6a, 0x64, 0x60, 0x00, 0x60, 0x60, 0x63, 0x67, 0x6f, 0x7b, 0x73, 0x00,
2239 0x18, 0x18, 0x18, 0x18, 0x3c, 0x5a, 0xdb, 0x00, 0x7c, 0x63, 0x63, 0x7c,
2240 0x66, 0x63, 0x63, 0x00, 0x60, 0x63, 0x67, 0x6f, 0x7b, 0x73, 0x03, 0x00,
2241 0x18, 0x3c, 0x5a, 0x99, 0x18, 0x18, 0x18, 0x00, 0x70, 0x78, 0x6c, 0x66,
2242 0x63, 0x63, 0x63, 0x00, 0x7e, 0x03, 0x7e, 0x03, 0x03, 0x03, 0x7c, 0x00,
2243 0x70, 0x6c, 0x63, 0x6c, 0x78, 0x60, 0x60, 0x00, 0xdb, 0x5a, 0x3c, 0x18,
2244 0x18, 0x18, 0x18, 0x00, 0x78, 0x64, 0x52, 0x49, 0x4f, 0x49, 0x49, 0x00,
2245 0x60, 0x63, 0x66, 0x6c, 0x78, 0x60, 0x60, 0x00, 0xe7, 0xc3, 0x81, 0xe7,
2246 0xe7, 0xe7, 0xe7, 0xff, 0xff, 0xe7, 0xe7, 0xe7, 0xe7, 0x81, 0xc3, 0xe7,
2247 0xe7, 0xc3, 0x81, 0xe7, 0xe7, 0x81, 0xc3, 0xe7, 0xff, 0xc3, 0x99, 0xf9,
2248 0xe7, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2249 };
+0
-880
src/owdos/owblorb.c less more
0 /* blorblib.c: Blorb file reader library, version 1.0.2.
1 Designed by Andrew Plotkin <erkyrath@eblong.com>
2 http://www.eblong.com/zarf/blorb/index.html
3
4 This is portable code to read a Blorb file. Add it to your
5 interpreter, #include "blorb.h", and you're ready to go.
6 */
7
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include "frotz.h"
12
13 #ifndef NO_BLORB
14
15 #include "blorb.h"
16 #include "blorblow.h"
17
18 #define bb_native2(v) \
19 ( (((uint16)(v) >> 8) & 0x00ff) \
20 | (((uint16)(v) << 8) & 0xff00))
21 #define bb_native4(v) \
22 ( (((uint32)(v) >> 24) & 0x000000ff) \
23 | (((uint32)(v) >> 8) & 0x0000ff00) \
24 | (((uint32)(v) << 8) & 0x00ff0000) \
25 | (((uint32)(v) << 24) & 0xff000000))
26
27 static int lib_inited = FALSE;
28
29 static bb_err_t bb_initialize_map(bb_map_t * map);
30 static bb_err_t bb_initialize(void);
31 static int sortsplot(const void *p1, const void *p2);
32
33 /* Do some one-time startup tests. */
34 static bb_err_t bb_initialize()
35 {
36 union {
37 uint32 val;
38 unsigned char ch[4];
39 } test;
40 uint32 val;
41
42 // if (sizeof(uint32) != 4 || sizeof(uint16) != 2)
43 // return bb_err_CompileTime; /* Basic types are the wrong size. */
44
45 test.ch[0] = 0x13;
46 test.ch[1] = 0x57;
47 test.ch[2] = 0x9a;
48 test.ch[3] = 0xce;
49 val = test.val;
50 if (bb_native4(val) != 0x13579ace)
51 return bb_err_CompileTime; /* Wrong endianness. */
52
53 return bb_err_None;
54 } /* bb_initialize */
55
56
57 bb_err_t bb_create_map(FILE * file, bb_map_t ** newmap)
58 {
59 bb_err_t err;
60 bb_map_t *map;
61 size_t readlen;
62 uint32 nextpos, totallength;
63 bb_chunkdesc_t *chunks;
64 int chunks_size, numchunks;
65 uint32 buffer[4];
66
67 *newmap = NULL;
68
69 if (!lib_inited) {
70 err = bb_initialize();
71 if (err)
72 return err;
73 lib_inited = TRUE;
74 }
75
76 /* First, chew through the file and index the chunks. */
77
78 err = fseek(file, 0, 0);
79 if (err)
80 return bb_err_Read;
81
82 /* FIXME. Under 16-bit DOS, this fails.
83 * From the following url: "'unsigned long' variables don't work in
84 * 16-bit mode." How do I get around this?
85 * http://www.digitalmars.com/d/archives/c++/dos/16-bits/45.html
86 */
87 readlen = fread(buffer, sizeof(uint32), 3, file);
88 if (readlen != 3)
89 return bb_err_Read;
90
91 if (bb_native4(buffer[0]) != bb_ID_FORM)
92 return bb_err_Format;
93 if (bb_native4(buffer[2]) != bb_ID_IFRS)
94 return bb_err_Format;
95
96 totallength = bb_native4(buffer[1]) + 8;
97 nextpos = 12;
98
99 chunks_size = 8;
100 numchunks = 0;
101 chunks =
102 (bb_chunkdesc_t *) malloc(sizeof(bb_chunkdesc_t) * chunks_size);
103
104 while (nextpos < totallength) {
105 uint32 type, len;
106 int chunum;
107 bb_chunkdesc_t *chu;
108
109 err = fseek(file, nextpos, 0);
110 if (err)
111 return bb_err_Read;
112
113 readlen = fread(buffer, sizeof(uint32), 2, file);
114 if (readlen != 2)
115 return bb_err_Read;
116
117 type = bb_native4(buffer[0]);
118 len = bb_native4(buffer[1]);
119
120 if (numchunks >= chunks_size) {
121 chunks_size *= 2;
122 chunks = (bb_chunkdesc_t *) realloc(chunks,
123 sizeof
124 (bb_chunkdesc_t) *
125 chunks_size);
126 }
127
128 chunum = numchunks;
129 chu = &(chunks[chunum]);
130 numchunks++;
131
132 chu->type = type;
133 chu->startpos = nextpos;
134 if (type == bb_ID_FORM) {
135 chu->datpos = nextpos;
136 chu->len = len + 8;
137 } else {
138 chu->datpos = nextpos + 8;
139 chu->len = len;
140 }
141 chu->ptr = NULL;
142 chu->auxdatnum = -1;
143
144 nextpos = nextpos + len + 8;
145 if (nextpos & 1)
146 nextpos++;
147
148 if (nextpos > totallength)
149 return bb_err_Format;
150 }
151
152 /* The basic IFF structure seems to be ok, and we have a list of
153 chunks. Now we allocate the map structure itself. */
154
155 map = (bb_map_t *) malloc(sizeof(bb_map_t));
156 if (!map) {
157 free(chunks);
158 return bb_err_Alloc;
159 }
160
161 map->inited = bb_Inited_Magic;
162 map->file = file;
163 map->chunks = chunks;
164 map->numchunks = numchunks;
165 map->resources = NULL;
166 map->ressorted = NULL;
167 map->numresources = 0;
168 map->releasenum = 0;
169 map->zheader = NULL;
170 map->resolution = NULL;
171 map->palettechunk = -1;
172 map->palette = NULL;
173 map->auxsound = NULL;
174 map->auxpict = NULL;
175
176 /* Now we do everything else involved in loading the Blorb file,
177 such as building resource lists. */
178
179 err = bb_initialize_map(map);
180 if (err) {
181 bb_destroy_map(map);
182 return err;
183 }
184
185 *newmap = map;
186 return bb_err_None;
187 } /* bb_create_map */
188
189
190 static bb_err_t bb_initialize_map(bb_map_t * map)
191 {
192 /* It is important that the map structure be kept valid during this
193 function. If this returns an error, bb_destroy_map() will be called. */
194
195 int ix, jx;
196 bb_result_t chunkres;
197 bb_err_t err;
198 uint32 *ptr;
199 uint32 len;
200 uint32 val;
201 int numres;
202 int gotindex = FALSE;
203
204 for (ix = 0; ix < map->numchunks; ix++) {
205 bb_chunkdesc_t *chu = &map->chunks[ix];
206
207 switch (chu->type) {
208
209 case bb_ID_RIdx:
210 /* Resource index chunk: build the resource list and sort it. */
211
212 if (gotindex)
213 return bb_err_Format; /* duplicate index chunk */
214 err = bb_load_chunk_by_number(map, bb_method_Memory,
215 &chunkres, ix);
216 if (err)
217 return err;
218
219 ptr = chunkres.data.ptr;
220 len = chunkres.length;
221 val = ptr[0];
222 numres = bb_native4(val);
223
224 if (numres) {
225 int ix2;
226 bb_resdesc_t *resources;
227 bb_resdesc_t **ressorted;
228
229 if (len != numres * 12 + 4)
230 return bb_err_Format; /* bad length field */
231
232 resources =
233 (bb_resdesc_t *) malloc(numres *
234 sizeof
235 (bb_resdesc_t));
236 ressorted =
237 (bb_resdesc_t **) malloc(numres *
238 sizeof(bb_resdesc_t
239 *));
240 if (!ressorted || !resources)
241 return bb_err_Alloc;
242
243 ix2 = 0;
244 for (jx = 0; jx < numres; jx++) {
245 bb_resdesc_t *res = &(resources[jx]);
246 uint32 respos;
247
248 val = ptr[1 + jx * 3];
249 res->usage = bb_native4(val);
250 val = ptr[2 + jx * 3];
251 res->resnum = bb_native4(val);
252 val = ptr[3 + jx * 3];
253 respos = bb_native4(val);
254
255 while (ix2 < map->numchunks
256 && map->chunks[ix2].startpos <
257 respos)
258 ix2++;
259
260 if (ix2 >= map->numchunks
261 || map->chunks[ix2].startpos !=
262 respos)
263 return bb_err_Format; /* start pos does not match a real chunk */
264
265 res->chunknum = ix2;
266
267 ressorted[jx] = res;
268 }
269
270 /* Sort a resource list (actually a list of pointers to structures
271 in map->resources.) This makes it easy to find resources by
272 usage and resource number. */
273 qsort(ressorted, numres, sizeof(bb_resdesc_t *),
274 &sortsplot);
275
276 map->numresources = numres;
277 map->resources = resources;
278 map->ressorted = ressorted;
279 }
280
281 bb_unload_chunk(map, ix);
282 gotindex = TRUE;
283 break;
284
285 case bb_ID_RelN:
286 /* Release number chunk: Get the release number. */
287
288 err = bb_load_chunk_by_number(map, bb_method_Memory,
289 &chunkres, ix);
290 if (err)
291 return err;
292
293 if (chunkres.length != 2)
294 return bb_err_Format;
295
296 {
297 uint16 val = *((uint16 *) chunkres.data.ptr);
298 map->releasenum = bb_native2(val);
299 }
300
301 bb_unload_chunk(map, ix);
302 break;
303
304 case bb_ID_IFhd:
305 /* Z-header chunk: Get the header info. */
306
307 err = bb_load_chunk_by_number(map, bb_method_Memory,
308 &chunkres, ix);
309 if (err)
310 return err;
311
312 if (chunkres.length < 13)
313 return bb_err_Format;
314
315 {
316 uint16 val;
317 bb_zheader_t *head =
318 (bb_zheader_t *)
319 malloc(sizeof(bb_zheader_t));
320 if (!head)
321 return bb_err_Alloc;
322
323 val = ((uint16 *) (chunkres.data.ptr))[0];
324 head->releasenum = bb_native2(val);
325
326 val = ((uint16 *) (chunkres.data.ptr))[4];
327 head->checksum = bb_native2(val);
328
329 for (jx = 0; jx < 6; jx++) {
330 head->serialnum[jx] =
331 ((char *)(chunkres.data.ptr))[2 +
332 jx];
333 }
334
335 map->zheader = head;
336 }
337
338 bb_unload_chunk(map, ix);
339 break;
340
341 case bb_ID_Reso:
342 /* Resolution chunk: Get the window size data, and resolution
343 ratios for images. */
344
345 err = bb_load_chunk_by_number(map, bb_method_Memory,
346 &chunkres, ix);
347 if (err)
348 return err;
349
350 if (chunkres.length < 24)
351 return bb_err_Format;
352
353 ptr = chunkres.data.ptr;
354 len = chunkres.length;
355
356 {
357 bb_resolution_t *reso =
358 (bb_resolution_t *)
359 malloc(sizeof(bb_resolution_t));
360 if (!reso)
361 return bb_err_Alloc;
362
363 reso->px = bb_native4(ptr[0]);
364 reso->py = bb_native4(ptr[1]);
365 reso->minx = bb_native4(ptr[2]);
366 reso->miny = bb_native4(ptr[3]);
367 reso->maxx = bb_native4(ptr[4]);
368 reso->maxy = bb_native4(ptr[5]);
369
370 map->resolution = reso;
371 }
372
373 ptr += 6;
374 len -= 6 * 4;
375
376 len = len / 28;
377
378 if (len) {
379 bb_aux_pict_t *aux =
380 (bb_aux_pict_t *) malloc(len *
381 sizeof
382 (bb_aux_pict_t));
383
384 for (jx = 0; jx < len; jx++, ptr += 7) {
385 bb_result_t res;
386
387 err =
388 bb_load_resource(map,
389 bb_method_DontLoad,
390 &res, bb_ID_Pict,
391 bb_native4(ptr
392 [0]));
393 if (!err) {
394 bb_chunkdesc_t *chu =
395 &(map->
396 chunks[res.chunknum]);
397 if (chu->auxdatnum != -1)
398 return bb_err_Format; /* two image entries for this resource */
399 chu->auxdatnum = jx;
400 aux[jx].ratnum =
401 bb_native4(ptr[1]);
402 aux[jx].ratden =
403 bb_native4(ptr[2]);
404 aux[jx].minnum =
405 bb_native4(ptr[3]);
406 aux[jx].minden =
407 bb_native4(ptr[4]);
408 aux[jx].maxnum =
409 bb_native4(ptr[5]);
410 aux[jx].maxden =
411 bb_native4(ptr[6]);
412 }
413 }
414
415 map->auxpict = aux;
416 }
417
418 bb_unload_chunk(map, ix);
419 break;
420
421 case bb_ID_Loop:
422 /* Looping chunk: Get looping data for sounds. */
423
424 err = bb_load_chunk_by_number(map, bb_method_Memory,
425 &chunkres, ix);
426 if (err)
427 return err;
428
429 ptr = chunkres.data.ptr;
430 len = chunkres.length;
431
432 len = len / 8;
433
434 if (len) {
435 bb_aux_sound_t *aux =
436 (bb_aux_sound_t *) malloc(len *
437 sizeof
438 (bb_aux_sound_t));
439
440 for (jx = 0; jx < len; jx++, ptr += 2) {
441 bb_result_t res;
442
443 err =
444 bb_load_resource(map,
445 bb_method_DontLoad,
446 &res, bb_ID_Snd,
447 bb_native4(ptr
448 [0]));
449 if (!err) {
450 bb_chunkdesc_t *chu =
451 &(map->
452 chunks[res.chunknum]);
453 if (chu->auxdatnum != -1)
454 return bb_err_Format; /* two looping entries for this resource */
455 chu->auxdatnum = jx;
456 aux[jx].repeats =
457 bb_native4(ptr[1]);
458 }
459 }
460
461 map->auxsound = aux;
462 }
463
464 bb_unload_chunk(map, ix);
465 break;
466
467 case bb_ID_Plte:
468 /* Palette chunk: Don't get the palette info now, since it may
469 be large and the interpreter may not care. But remember
470 the chunk number in case the interpreter asks later. */
471
472 map->palettechunk = ix;
473 break;
474 }
475 }
476
477 return bb_err_None;
478 } /* bb_initialize_map */
479
480
481 bb_err_t bb_destroy_map(bb_map_t * map)
482 {
483 int ix;
484
485 if (!map || !map->chunks || map->inited != bb_Inited_Magic)
486 return bb_err_NotAMap;
487
488 for (ix = 0; ix < map->numchunks; ix++) {
489 bb_chunkdesc_t *chu = &(map->chunks[ix]);
490 if (chu->ptr) {
491 free(chu->ptr);
492 chu->ptr = NULL;
493 }
494 }
495
496 if (map->chunks) {
497 free(map->chunks);
498 map->chunks = NULL;
499 }
500
501 map->numchunks = 0;
502
503 if (map->resources) {
504 free(map->resources);
505 map->resources = NULL;
506 }
507
508 if (map->ressorted) {
509 free(map->ressorted);
510 map->ressorted = NULL;
511 }
512
513 map->numresources = 0;
514
515 if (map->zheader) {
516 free(map->zheader);
517 map->zheader = NULL;
518 }
519
520 if (map->resolution) {
521 free(map->resolution);
522 map->resolution = NULL;
523 }
524
525 if (map->palette) {
526 if (!map->palette->isdirect && map->palette->data.table.colors) {
527 free(map->palette->data.table.colors);
528 map->palette->data.table.colors = NULL;
529 }
530 free(map->palette);
531 map->palette = NULL;
532 }
533
534 if (map->auxsound) {
535 free(map->auxsound);
536 map->auxsound = NULL;
537 }
538
539 if (map->auxpict) {
540 free(map->auxpict);
541 map->auxpict = NULL;
542 }
543
544 map->file = NULL;
545 map->inited = 0;
546
547 free(map);
548
549 return bb_err_None;
550 } /* bb_destroy_map */
551
552
553 /* Turn a four-byte constant into a string. This returns a static buffer,
554 so if you call it twice, the old value gets overwritten. */
555 char *bb_id_to_string(uint32 id)
556 {
557 static char buf[5];
558 buf[0] = (id >> 24) & 0xff;
559 buf[1] = (id >> 16) & 0xff;
560 buf[2] = (id >> 8) & 0xff;
561 buf[3] = (id) & 0xff;
562 buf[4] = '\0';
563 return buf;
564 }
565
566
567 /* Turn an error code into a string describing the error. */
568 char *bb_err_to_string(bb_err_t err)
569 {
570 switch (err) {
571 case bb_err_None:
572 return "ok";
573 case bb_err_CompileTime:
574 return "library compiled wrong";
575 case bb_err_Alloc:
576 return "cannot allocate memory";
577 case bb_err_Read:
578 return "cannot read from file";
579 case bb_err_NotAMap:
580 return "map structure is bad";
581 case bb_err_Format:
582 return "bad format in Blorb file";
583 case bb_err_NotFound:
584 return "data not found";
585 default:
586 return "unknown error";
587 }
588 }
589
590
591 /* This is used for binary searching and quicksorting the resource pointer list. */
592 static int sortsplot(const void *p1, const void *p2)
593 {
594 bb_resdesc_t *v1 = *(bb_resdesc_t **) p1;
595 bb_resdesc_t *v2 = *(bb_resdesc_t **) p2;
596 if (v1->usage < v2->usage)
597 return -1;
598 if (v1->usage > v2->usage)
599 return 1;
600 return v1->resnum - v2->resnum;
601 }
602
603
604 bb_err_t bb_load_chunk_by_type(bb_map_t * map, int method, bb_result_t * res,
605 uint32 type, int count)
606 {
607 int ix;
608
609 for (ix = 0; ix < map->numchunks; ix++) {
610 if (map->chunks[ix].type == type) {
611 if (count == 0)
612 break;
613 count--;
614 }
615 }
616
617 if (ix >= map->numchunks) {
618 return bb_err_NotFound;
619 }
620
621 return bb_load_chunk_by_number(map, method, res, ix);
622 }
623
624
625 bb_err_t bb_load_chunk_by_number(bb_map_t * map, int method, bb_result_t * res,
626 int chunknum)
627 {
628 bb_chunkdesc_t *chu;
629
630 if (chunknum < 0 || chunknum >= map->numchunks)
631 return bb_err_NotFound;
632
633 chu = &(map->chunks[chunknum]);
634
635 switch (method) {
636
637 case bb_method_DontLoad:
638 /* do nothing */
639 break;
640
641 case bb_method_FilePos:
642 res->data.startpos = chu->datpos;
643 break;
644
645 case bb_method_Memory:
646 if (!chu->ptr) {
647 bb_err_t err;
648 size_t readlen;
649 void *dat = malloc(chu->len);
650
651 if (!dat)
652 return bb_err_Alloc;
653
654 err = fseek(map->file, chu->datpos, 0);
655 if (err)
656 return bb_err_Read;
657
658 readlen = fread(dat, 1, chu->len, map->file);
659 if (readlen != chu->len)
660 return bb_err_Read;
661
662 chu->ptr = dat;
663 }
664 res->data.ptr = chu->ptr;
665 break;
666 }
667
668 res->chunknum = chunknum;
669 res->length = chu->len;
670
671 return bb_err_None;
672 } /* bb_load_chunk_by_number */
673
674
675 bb_err_t bb_load_resource(bb_map_t * map, int method, bb_result_t * res,
676 uint32 usage, int resnum)
677 {
678 bb_resdesc_t sample;
679 bb_resdesc_t *ptr;
680 bb_resdesc_t **found;
681
682 sample.usage = usage;
683 sample.resnum = resnum;
684 ptr = &sample;
685
686 found =
687 bsearch(&ptr, map->ressorted, map->numresources,
688 sizeof(bb_resdesc_t *), &sortsplot);
689
690 if (!found)
691 return bb_err_NotFound;
692
693 return bb_load_chunk_by_number(map, method, res, (*found)->chunknum);
694 } /* bb_load_resource */
695
696
697 bb_err_t bb_unload_chunk(bb_map_t * map, int chunknum)
698 {
699 bb_chunkdesc_t *chu;
700
701 if (chunknum < 0 || chunknum >= map->numchunks)
702 return bb_err_NotFound;
703
704 chu = &(map->chunks[chunknum]);
705
706 if (chu->ptr) {
707 free(chu->ptr);
708 chu->ptr = NULL;
709 }
710
711 return bb_err_None;
712 } /* bb_unload_chunk */
713
714
715 bb_err_t bb_count_resources(bb_map_t * map, uint32 usage,
716 int *num, int *min, int *max)
717 {
718 int ix;
719 int count, minval, maxval, val;
720
721 count = 0;
722 minval = 0;
723 maxval = 0;
724
725 for (ix = 0; ix < map->numresources; ix++) {
726 if (map->resources[ix].usage == usage) {
727 val = map->resources[ix].resnum;
728 if (count == 0) {
729 count++;
730 minval = val;
731 maxval = val;
732 } else {
733 count++;
734 if (val < minval)
735 minval = val;
736 if (val > maxval)
737 maxval = val;
738 }
739 }
740 }
741
742 if (num)
743 *num = count;
744 if (min)
745 *min = minval;
746 if (max)
747 *max = maxval;
748
749 return bb_err_None;
750 } /* bb_cont_resources */
751
752
753 uint16 bb_get_release_num(bb_map_t * map)
754 {
755 return map->releasenum;
756 }
757
758
759 bb_zheader_t *bb_get_zheader(bb_map_t * map)
760 {
761 return map->zheader;
762 }
763
764
765 bb_resolution_t *bb_get_resolution(bb_map_t * map)
766 {
767 return map->resolution;
768 }
769
770
771 bb_err_t bb_get_palette(bb_map_t * map, bb_palette_t ** res)
772 {
773 int ix;
774 bb_err_t err;
775
776 if (res)
777 *res = NULL;
778
779 if (map->palettechunk < 0) {
780 return bb_err_None;
781 }
782
783 if (!map->palette) {
784 bb_result_t chunkres;
785 bb_palette_t *pal;
786 unsigned char *ptr;
787
788 pal = (bb_palette_t *) malloc(sizeof(bb_palette_t));
789 if (!pal)
790 return bb_err_Alloc;
791
792 err = bb_load_chunk_by_number(map, bb_method_Memory, &chunkres,
793 map->palettechunk);
794 if (err)
795 return err;
796
797 ptr = chunkres.data.ptr;
798
799 if (chunkres.length == 1) {
800 int val = ptr[0];
801 if (val != 16 && val != 32)
802 return bb_err_Format;
803 pal->isdirect = TRUE;
804 pal->data.depth = val;
805 } else {
806 int size = chunkres.length / 3;
807 bb_color_t *colors =
808 (bb_color_t *) malloc(size * sizeof(bb_color_t));
809 if (!colors)
810 return bb_err_Alloc;
811 if (size < 1 || size > 256)
812 return bb_err_Format;
813 for (ix = 0; ix < size; ix++) {
814 colors[ix].red = ptr[ix * 3 + 0];
815 colors[ix].green = ptr[ix * 3 + 1];
816 colors[ix].blue = ptr[ix * 3 + 2];
817 }
818 pal->isdirect = FALSE;
819 pal->data.table.numcolors = size;
820 pal->data.table.colors = colors;
821 }
822
823 bb_unload_chunk(map, map->palettechunk);
824 map->palette = pal;
825 }
826
827 if (res)
828 *res = map->palette;
829 return bb_err_None;
830 } /* bb_get_palette */
831
832
833 bb_err_t bb_load_resource_pict(bb_map_t * map, int method, bb_result_t * res,
834 int resnum, bb_aux_pict_t ** auxdata)
835 {
836 bb_err_t err;
837
838 if (auxdata)
839 *auxdata = NULL;
840
841 err = bb_load_resource(map, method, res, bb_ID_Pict, resnum);
842 if (err)
843 return err;
844
845 if (auxdata) {
846 bb_chunkdesc_t *chu = &(map->chunks[res->chunknum]);
847 if (chu->auxdatnum >= 0 && map->auxpict) {
848 *auxdata = &(map->auxpict[chu->auxdatnum]);
849 }
850 }
851
852 return bb_err_None;
853 } /* bb_load_resource_pict */
854
855
856 bb_err_t bb_load_resource_snd(bb_map_t * map, int method, bb_result_t * res,
857 int resnum, bb_aux_sound_t ** auxdata)
858 {
859 bb_err_t err;
860
861 if (auxdata)
862 *auxdata = NULL;
863
864 /* err = bb_load_resource(map, method, res, bb_ID_Pict, resnum); */
865 err = bb_load_resource(map, method, res, bb_ID_Snd, resnum);
866 if (err)
867 return err;
868
869 if (auxdata) {
870 bb_chunkdesc_t *chu = &(map->chunks[res->chunknum]);
871 if (chu->auxdatnum >= 0 && map->auxsound) {
872 *auxdata = &(map->auxsound[chu->auxdatnum]);
873 }
874 }
875
876 return bb_err_None;
877 } /* bb_load_resource_snd */
878
879 #endif /* NO_BLORB */
+0
-29
src/owdos/owblorb.h less more
0 #ifndef DOS_OWBLORB_H
1 #define DOS_OWBLORB_H
2
3 #include "blorb.h"
4 #include "blorblow.h"
5
6
7 typedef struct sampledata_struct {
8 unsigned short channels;
9 unsigned long samples;
10 unsigned short bits;
11 double rate;
12 } sampledata_t;
13
14
15 bb_err_t blorb_err;
16 bb_map_t *blorb_map;
17 bb_result_t blorb_res;
18
19
20 /* uint32 *findchunk(uint32 *data, char *chunkID, int length); */
21 char *findchunk(char *pstart, char *fourcc, int n);
22 unsigned short ReadShort(const unsigned char *bytes);
23 unsigned long ReadLong(const unsigned char *bytes);
24 double ReadExtended(const unsigned char *bytes);
25
26 #define UnsignedToFloat(u) (((double)((long)(u - 2147483647L - 1))) + 2147483648.0)
27
28 #endif
+0
-58
src/owdos/owfix.asm less more
0 ; owfix.asm - Fix for gremlins in the Open Watcom C runtime library.
1 ;
2 ; This file is part of Frotz.
3 ;
4 ; Frotz is free software; you can redistribute it and/or modify
5 ; it under the terms of the GNU General Public License as published by
6 ; the Free Software Foundation; either version 2 of the License, or
7 ; (at your option) any later version.
8 ;
9 ; Frotz is distributed in the hope that it will be useful,
10 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ; GNU General Public License for more details.
13 ;
14 ; You should have received a copy of the GNU General Public License
15 ; along with this program; if not, write to the Free Software
16 ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 ; Or visit http://www.fsf.org/
18
19 _TEXT segment word public 'CODE'
20
21 assume cs:_TEXT
22
23 ; Open Watcom clibl.lib's internal functions __PIA and __PIS for huge
24 ; pointer arithmetic do not really normalize pointers completely. This is
25 ; an alternate implementation which does.
26 ;
27 ; (The OW source code also has implementations of functions __PCA and __PCS,
28 ; which do a better job at normalizing pointers, but they follow a different
29 ; interface, and in any case are not actually included in the C library.)
30 ;
31 ; Input: dx:ax = pointer; cx:bx = long addend or subtrahend.
32 ; Output: dx:ax = normalized pointer.
33
34 public __PIA,__PIS
35 __PIS:
36 neg cx
37 neg bx
38 sbb cx,0
39 __PIA:
40 add ax,bx ; Quickly add the low part (bx) of
41 ; the addend; this frees up bx
42 sbb bl,bl ; Let the segment component (dx)
43 and bl,0x10 ; absorb any carry over
44 add dh,bl
45 mov ch,cl ; Add the high part of the addend
46 mov cl,4 ; (cl)
47 shl ch,cl
48 add dh,ch
49 mov bx,ax ; Combine the higher 12 bits of the
50 shr bx,cl ; updated offset (ax) into the
51 add dx,bx ; segment component (dx)
52 and ax,0x000f ; Zap these 12 bits from ax
53 retf ; We are done
54
55 _TEXT ends
56
57 end
+0
-189
src/owdos/owfrotz.h less more
0 /*
1 * owfrotz.h
2 *
3 * DOS interface, declarations, definitions, and defaults (Open Watcom).
4 *
5 */
6
7 #ifndef DOS_OWFROTZ_H
8 #define DOS_OWFROTZ_H
9
10 #define MASK_LINEAR(addr) (addr & 0x000FFFFF)
11 #define RM_TO_LINEAR(addr) (((addr & 0xFFFF0000) >> 12) + (addr & 0xFFFF))
12 #define RM_OFFSET(addr) (addr & 0xF)
13 #define RM_SEGMENT(addr) ((addr >> 4) & 0xFFFF)
14
15 #define OS_PATHSEP ';'
16
17 #define byte0(v) ((byte *)&v)[0]
18 #define byte1(v) ((byte *)&v)[1]
19 #define byte2(v) ((byte *)&v)[2]
20 #define byte3(v) ((byte *)&v)[3]
21 #define word0(v) ((word *)&v)[0]
22 #define word1(v) ((word *)&v)[1]
23
24 #ifndef HISTORY_MIN_ENTRY
25 #define HISTORY_MIN_ENTRY 1
26 #endif
27
28 #define SPECIAL_KEY_MIN 256
29 #define SPECIAL_KEY_HOME 256
30 #define SPECIAL_KEY_END 257
31 #define SPECIAL_KEY_WORD_LEFT 258
32 #define SPECIAL_KEY_WORD_RIGHT 259
33 #define SPECIAL_KEY_DELETE 260
34 #define SPECIAL_KEY_INSERT 261
35 #define SPECIAL_KEY_PAGE_UP 262
36 #define SPECIAL_KEY_PAGE_DOWN 263
37 #define SPECIAL_KEY_TAB 264
38 #define SPECIAL_KEY_MAX 264
39
40 #define _MONO_ 0
41 #define _TEXT_ 1
42 #define _CGA_ 2
43 #define _MCGA_ 3
44 #define _EGA_ 4
45 #define _AMIGA_ 5
46
47 /*
48 * For ease of porting from Borland Turbo C to Open Watcom C, define these
49 * names for text mode colours. Borland C has these in <conio.h> and
50 * <graphics.h> --- as `enum COLORS' --- but Watcom does not.
51 */
52 enum bc_compatible_colours {
53 BLACK,
54 BLUE,
55 GREEN,
56 CYAN,
57 RED,
58 MAGENTA,
59 BROWN,
60 LIGHTGRAY,
61 DARKGRAY,
62 LIGHTBLUE,
63 LIGHTGREEN,
64 LIGHTCYAN,
65 LIGHTRED,
66 LIGHTMAGENTA,
67 YELLOW,
68 WHITE
69 };
70
71
72 typedef unsigned char byte;
73 typedef unsigned short word;
74
75 extern int display;
76
77 extern int cursor_x;
78 extern int cursor_y;
79
80 extern char latin1_to_ibm[];
81 extern char latin1_to_ascii[];
82
83 extern byte text_bg;
84 extern byte text_fg;
85
86 extern byte scrn_attr;
87
88 extern int user_background;
89 extern int user_foreground;
90 extern int user_emphasis;
91 extern int user_reverse_bg;
92 extern int user_reverse_fg;
93 extern int user_screen_height;
94 extern int user_screen_width;
95 extern int user_tandy_bit;
96 extern int user_bold_typing;
97 extern int user_random_seed;
98 extern int user_font;
99
100 extern char stripped_story_name[];
101 extern char *prog_name;
102
103 extern int current_bg;
104 extern int current_fg;
105 extern int current_style;
106 extern int current_font;
107
108 extern int scaler;
109
110 #ifdef SOUND_SUPPORT
111 extern volatile int end_of_sound_flag;
112 #endif
113
114 /* owinit */ int dectoi (const char *);
115 /* owinit */ int hextoi (const char *);
116 /* owmouse */ bool detect_mouse (void);
117 /* owmouse */ int read_mouse (void);
118 /* owpic */ bool init_pictures (void);
119 /* owpic */ void reset_pictures (void);
120
121 #ifdef SOUND_SUPPORT
122 /* owsmpl */ bool dos_init_sound (void);
123 /* owsmpl */ void dos_reset_sound (void);
124 /* owinput */ void end_of_sound(void);
125 #endif
126 /* owtext */ void switch_scrn_attr (bool);
127 /* owtext */ void load_fonts (void);
128
129 /*
130 * Inline functions for calling BIOS video and date/time services, and DOS
131 * mouse services.
132 */
133 word bios_video_ah(byte ah);
134 #pragma aux bios_video_ah = "int 0x10" parm [ah] value [ax] modify [bx cx dx];
135 word bios_video_ah_al_bh_bl_cx(byte ah, byte al, byte bh, byte bl, word cx);
136 #pragma aux bios_video_ah_al_bh_bl_cx = "int 0x10" \
137 parm [ah] [al] [bh] [bl] [cx] \
138 value [ax] modify [bx cx dx];
139 word bios_video_ah_bh_dh_dl(byte ah, byte bh, byte dh, byte dl);
140 #pragma aux bios_video_ah_bh_dh_dl = "int 0x10" parm [ah] [bh] [dh] [dl] \
141 value [ax] modify [bx cx dx];
142 word bios_video_ah_bh_cx_dx(byte ah, byte bh, word cx, word dx);
143 #pragma aux bios_video_ah_bh_cx_dx = "int 0x10" parm [ah] [bh] [cx] [dx] \
144 value [ax] modify [bx cx dx];
145 word bios_video_ah_cx(byte ah, word cx);
146 #pragma aux bios_video_ah_cx = "int 0x10" parm [ah] [cx] value [ax] \
147 modify [bx cx dx];
148 word bios_video_ax(word ax);
149 #pragma aux bios_video_ax = "int 0x10" parm [ax] value [ax] modify [bx cx dx];
150 word bios_video_ax_bl(word ax, byte bl);
151 #pragma aux bios_video_ax_bl = "int 0x10" parm [ax] [bl] value [ax] \
152 modify [bx cx dx];
153 /*
154 * This is used for int 0x10, ah = 6 or 7, which may destroy bp on some
155 * buggy BIOSes (per Ralf Brown's Interrupt List).
156 */
157 word bios_video_ax_bh_ch_cl_dh_dl(word ax, byte bh, byte ch, byte cl,
158 byte dh, byte dl);
159 #pragma aux bios_video_ax_bh_ch_cl_dh_dl = "push bp", \
160 "int 0x10", \
161 "pop bp" \
162 parm [ax] [bh] [ch] [cl] [dh] [dl] value [ax] modify [bx cx dx];
163 word bios_video_ax_bx(word ax, word bx);
164 #pragma aux bios_video_ax_bx = "int 0x10" parm [ax] [bx] value [ax] \
165 modify [bx cx dx];
166 word bios_video_ax_bx_cx_esdx(word ax, word bx, word cx, void _far *esdx);
167 #pragma aux bios_video_ax_bx_cx_esdx = "int 0x10" parm [ax] [bx] [cx] [es dx] \
168 value [ax] modify [bx cx dx];
169 word bios_video_ax_bx_dh_ch_cl(word ax, word bx, byte dh, byte ch, byte cl);
170 #pragma aux bios_video_ax_bx_dh_ch_cl = "int 0x10" \
171 parm [ax] [bx] [dh] [ch] [cl] \
172 value [ax] modify [bx cx dx];
173 word bios_video_ax_esdx_bh(word ax, void _far *esdx, byte bh);
174 #pragma aux bios_video_ax_esdx_bh = "int 0x10" parm [ax] [es dx] [bh] \
175 value [ax] modify [bx cx dx];
176 long bios_time_ah(byte ah);
177 #pragma aux bios_time_ah = "int 0x1a" parm [ah] value [cx dx] modify [ax bx];
178 word dos_mouse_ax(word ax);
179 #pragma aux dos_mouse_ax = "int 0x33" parm [ax] value [ax] modify [bx cx dx];
180 __int64 dos_mouse_ax_bx(word ax, word bx);
181 #pragma aux dos_mouse_ax_bx = "int 0x33" parm [ax] [bx] value [ax bx cx dx];
182 /*
183 * Used for latching operations in EGA or VGA screen output.
184 */
185 void video_latch(volatile byte);
186 #pragma aux video_latch = "" parm [al] modify [];
187
188 #endif
+0
-6
src/owdos/owhash.h less more
0 #ifndef OWHASH_H
1 #define OWHASH_H
2 #define GIT_HASH "$Format:%H$"
3 #define GIT_HASH_SHORT "$Format:%h$"
4 #define GIT_DATE "$Format:%ci$"
5 #endif
+0
-977
src/owdos/owinit.c less more
0 /*
1 * owinit.c - DOS interface (Open Watcom version), initialization
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <conio.h>
22 #include <dos.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include "frotz.h"
27 #include "owfrotz.h"
28
29 #ifndef NO_BLORB
30 #include "owblorb.h"
31 #endif
32
33 #include "owhash.h"
34
35 extern f_setup_t f_setup;
36 extern z_header_t z_header;
37
38 static char information[] =
39 "An interpreter for all Infocom and other Z-Machine games.\n"
40 "Complies with standard 1.0 of Graham Nelson's specification.\n"
41 "\n"
42 "Syntax: frotz [options] story-file\n"
43 " -a watch attribute setting \t -O watch object locating\n"
44 " -A watch attribute testing \t -p alter piracy opcode\n"
45 " -b # background colour \t -r # right margin\n"
46 " -B # reverse background colour \t -R <path> restricted read/write\n"
47 " -c # context lines \t -s # random number seed value\n"
48 " -d # display mode (see below) \t -S # transcript width\n"
49 " -e # emphasis colour [mode 1] \t -t set Tandy bit\n"
50 " -f # foreground colour \t -T bold typing [modes 2+4+5]\n"
51 " -F # reverse foreground colour \t -u # slots for multiple undo\n"
52 " -g # font [mode 5] (see below) \t -v show version information\n"
53 " -h # screen height \t -w # screen width\n"
54 " -i ignore runtime errors \t -x expand abbreviations g/x/z\n"
55 " -l # left margin \t -Z # error checking (see below)\n"
56 " -o watch object movement\n"
57 "\n"
58 "Fonts: 0 fixed, 1 sans serif, 2 comic, 3 times, 4 serif.\n"
59 "Display modes: 0 mono, 1 text, 2 CGA, 3 MCGA, 4 EGA, 5 Amiga.\n"
60 "Error reporting: 0 none, 1 first only (default), 2 all, 3 exit after any error.";
61
62 extern int zoptind;
63
64 static const char *progname = NULL;
65
66 extern char script_name[];
67 extern char command_name[];
68 extern char save_name[];
69 extern char auxilary_name[];
70
71 int display = -1;
72
73 int user_background = -1;
74 int user_foreground = -1;
75 int user_emphasis = -1;
76 int user_bold_typing = -1;
77 int user_reverse_bg = -1;
78 int user_reverse_fg = -1;
79 int user_screen_height = -1;
80 int user_screen_width = -1;
81 int user_tandy_bit = -1;
82 int user_random_seed = -1;
83 int user_font = 1;
84
85 /* Blorb-related things */
86 #ifndef NO_BLORB
87 char *blorb_name;
88 char *blorb_file;
89 bool use_blorb;
90 bool exec_in_blorb;
91 #endif
92
93 static byte old_video_mode = 0;
94
95 static void interrupt(*oldvect) () = NULL;
96
97 bool at_keybrd;
98
99 /* Test for the existance of Enhanced AT keyboard support in BIOS */
100 static bool test_enhanced_keyboard(unsigned char b)
101 {
102 union REGS regs;
103 unsigned char far *shift_status;
104 shift_status = MK_FP(0, 0x417);
105 shift_status[0] = b;
106 regs.h.ah = 0x12;
107 int86(0x16, &regs, &regs);
108 return b == regs.h.al;
109 }
110
111 /*
112 * os_init_setup
113 *
114 * Set or reset various configuration variables.
115 *
116 */
117 void os_init_setup(void)
118 {
119 f_setup.attribute_assignment = 0;
120 f_setup.attribute_testing = 0;
121 f_setup.context_lines = 0;
122 f_setup.object_locating = 0;
123 f_setup.object_movement = 0;
124 f_setup.left_margin = 0;
125 f_setup.right_margin = 0;
126 f_setup.ignore_errors = 0;
127 f_setup.piracy = 0;
128 f_setup.undo_slots = MAX_UNDO_SLOTS;
129 f_setup.expand_abbreviations = 0;
130 f_setup.script_cols = 80;
131 f_setup.sound = 1;
132 f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE;
133 f_setup.restore_mode = 0;
134
135 at_keybrd = (test_enhanced_keyboard(0x40) && test_enhanced_keyboard(0x80));
136 test_enhanced_keyboard(0x00);
137 } /* os_init_setup */
138
139
140 /*
141 * dectoi
142 *
143 * Convert a string containing a decimal number to integer. The string may
144 * be NULL, but it must not be empty.
145 *
146 */
147 int dectoi(const char *s)
148 {
149 int n = 0;
150
151 if (s != NULL) {
152 do {
153 n = 10 * n + (*s & 15);
154 } while (*++s > ' ');
155 }
156 return n;
157 } /* dectoi */
158
159
160 /*
161 * hextoi
162 *
163 * Convert a string containing a hex number to integer. The string may be
164 * NULL, but it must not be empty.
165 *
166 */
167 int hextoi(const char *s)
168 {
169 int n = 0;
170
171 if (s != NULL) {
172 do {
173
174 n = 16 * n + (*s & 15);
175
176 if (*s > '9')
177 n += 9;
178
179 } while (*++s > ' ');
180 }
181 return n;
182 } /* hextoi */
183
184
185 /*
186 * basename
187 *
188 * A generic and spartan bit of code to extract the filename from a path.
189 * This one is so trivial that it's okay to steal.
190 */
191 char *basename(const char *path)
192 {
193 const char *s;
194 const char *p;
195 p = s = path;
196
197 while (*s) {
198 if (*s++ == '\\') {
199 p = s;
200 }
201 }
202 return (char *)p;
203 } /* basename */
204
205
206 /*
207 * cleanup
208 *
209 * Shut down the IO interface: free memory, close files, restore
210 * interrupt pointers and return to the previous video mode.
211 *
212 */
213 static void cleanup(void)
214 {
215 #ifdef SOUND_SUPPORT
216 dos_reset_sound();
217 #endif
218 reset_pictures();
219
220 bios_video_ax((word)old_video_mode);
221
222 _dos_setvect(0x1b, oldvect);
223 } /* cleanup */
224
225
226 /*
227 * fast_exit
228 *
229 * Handler routine to be called when the crtl-break key is pressed.
230 *
231 */
232 static void interrupt fast_exit()
233 {
234 cleanup();
235 exit(EXIT_FAILURE);
236 } /* fast_exit */
237
238
239 /*
240 * os_quit
241 *
242 * Immediately and cleanly exit, passing along exit status.
243 *
244 */
245
246 void os_quit(int status)
247 {
248 cleanup();
249 exit(status);
250 }
251
252 /*
253 * os_fatal
254 *
255 * Display error message and exit program.
256 *
257 */
258 void os_fatal(const char *s, ...)
259 {
260 if (z_header.interpreter_number)
261 os_reset_screen();
262
263 /* Display error message */
264 fputs("\nFatal error: ", stderr);
265 fputs(s, stderr);
266 fputs("\n", stderr);
267
268 /* Abort program */
269 exit(EXIT_FAILURE);
270 } /* os_fatal */
271
272
273 /*
274 * parse_options
275 *
276 * Parse program options and set global flags accordingly.
277 *
278 */
279 static void parse_options(int argc, char **argv)
280 {
281 int c;
282
283 do {
284 int num = 0;
285
286 c = zgetopt(argc, argv,
287 "aAb:B:c:d:e:f:F:g:h:il:oOpr:R:s:S:tTu:vw:xZ:");
288
289 if (zoptarg != NULL)
290 num = dectoi(zoptarg);
291
292 if (c == 'a')
293 f_setup.attribute_assignment = 1;
294 if (c == 'A')
295 f_setup.attribute_testing = 1;
296 if (c == 'b')
297 user_background = num;
298 if (c == 'B')
299 user_reverse_bg = num;
300 if (c == 'c')
301 f_setup.context_lines = num;
302 if (c == 'd') {
303 display = zoptarg[0] | 32;
304 if ((display < '0' || display > '5')
305 && (display < 'a' || display > 'e')) {
306 display = -1;
307 }
308 }
309 if (c == 'e')
310 user_emphasis = num;
311 if (c == 'T')
312 user_bold_typing = 1;
313 if (c == 'f')
314 user_foreground = num;
315 if (c == 'F')
316 user_reverse_fg = num;
317 if (c == 'g') {
318 if (num >= 0 && num <= 4)
319 user_font = num;
320 }
321 if (c == 'h')
322 user_screen_height = num;
323 if (c == 'i')
324 f_setup.ignore_errors = 1;
325 if (c == 'l')
326 f_setup.left_margin = num;
327 if (c == 'o')
328 f_setup.object_movement = 1;
329 if (c == 'O')
330 f_setup.object_locating = 1;
331 if (c == 'p')
332 f_setup.piracy = 1;
333 if (c == 'r')
334 f_setup.right_margin = num;
335 if (c == 'R')
336 f_setup.restricted_path = strdup(zoptarg);
337 if (c == 's')
338 user_random_seed = num;
339 if (c == 'S')
340 f_setup.script_cols = num;
341 if (c == 't')
342 user_tandy_bit = 1;
343 if (c == 'u')
344 f_setup.undo_slots = num;
345 if (c == 'v') {
346 printf("FROTZ V%s - MSDOS / PCDOS Edition\n", VERSION);
347 printf("Commit date: %s\n", GIT_DATE);
348 printf("Git commit: %s\n", GIT_HASH);
349 printf("Notes: %s\n", RELEASE_NOTES);
350 printf(" Frotz was originally written by Stefan Jokisch.\n");
351 printf(" It complies with standard 1.0 of Graham Nelson's specification.\n");
352 printf(" It was ported to Unix by Galen Hazelwood.\n");
353 printf(" The core and DOS port are maintained by David Griffith.\n");
354 printf(" Frotz's homepage is https://661.org/proj/if/frotz/\n");
355 exit(0);
356 }
357 if (c == 'w')
358 user_screen_width = num;
359 if (c == 'x')
360 f_setup.expand_abbreviations = 1;
361 if (c == 'Z') {
362 if (num >= ERR_REPORT_NEVER && num <= ERR_REPORT_FATAL)
363 f_setup.err_report_mode = num;
364 }
365 if (c == '?')
366 zoptind = argc;
367 } while (c != EOF && c != '?');
368
369 } /* parse_options */
370
371 static char *malloc_filename(char *story_name, char *extension)
372 {
373 int length = strlen(story_name) + strlen(extension) + 2;
374 char *filename = malloc(length);
375 if (filename) {
376 strcpy(filename, story_name);
377 strcat(filename, ".");
378 strcat(filename, extension);
379 }
380 return filename;
381 }
382
383 /*
384 * os_process_arguments
385 *
386 * Handle command line switches. Some variables may be set to activate
387 * special features of Frotz:
388 *
389 * option_attribute_assignment
390 * option_attribute_testing
391 * option_context_lines
392 * option_object_locating
393 * option_object_movement
394 * option_left_margin
395 * option_right_margin
396 * option_ignore_errors
397 * option_piracy
398 * option_undo_slots
399 * option_expand_abbreviations
400 * option_script_cols
401 *
402 * The global pointer "story_name" is set to the story file name.
403 *
404 */
405 void os_process_arguments(int argc, char *argv[])
406 {
407 const char *p;
408 int i;
409 char stripped_story_name[10];
410
411 /* Parse command line options */
412 parse_options(argc, argv);
413
414 if (zoptind != argc - 1) {
415 printf("FROTZ V%s - MSDOS / PCDOS Edition. ", VERSION);
416 #ifndef NO_SOUND
417 printf("Audio output enabled.\n");
418 #else
419 printf("Audio output disabled.\n");
420 #endif
421 puts(information);
422 exit(EXIT_SUCCESS);
423 }
424
425 /* Set the story file name */
426 f_setup.story_file = strdup(argv[zoptind]);
427
428 /* Strip path and extension off the story file name */
429 p = strdup(f_setup.story_file);
430
431 for (i = 0; f_setup.story_file[i] != 0; i++)
432 if (f_setup.story_file[i] == '\\'
433 || f_setup.story_file[i] == '/'
434 || f_setup.story_file[i] == ':')
435 p = f_setup.story_file + i + 1;
436
437 for (i = 0; p[i] != 0 && p[i] != '.'; i++)
438 stripped_story_name[i] = p[i];
439 stripped_story_name[i] = 0;
440 f_setup.story_name = strdup(stripped_story_name);
441
442 /* Create nice default file names */
443 f_setup.script_name = malloc_filename(f_setup.story_name, "scr");
444 f_setup.command_name = malloc_filename(f_setup.story_name, "rec");
445 f_setup.save_name = malloc_filename(f_setup.story_name, "sav");
446 f_setup.aux_name = malloc_filename(f_setup.story_name, "aux");
447
448 /* Save the executable file name */
449 progname = argv[0];
450
451 #ifndef NO_BLORB
452 blorb_file = malloc_filename(f_setup.story_name, "blb");
453
454 switch (dos_init_blorb()) {
455 case bb_err_Format:
456 printf("Blorb file loaded, but unable to build map.\n\n");
457 break;
458 default:
459 break;
460 /* No problem. Don't say anything. */
461 /* printf("Blorb error code %i\n\n"); */
462 }
463 #endif
464 } /* os_process_arguments */
465
466
467 /*
468 * standard_palette
469 *
470 * Set palette registers to EGA default values and call VGA BIOS to
471 * use DAC registers #0 to #63.
472 *
473 */
474 static void standard_palette(void)
475 {
476
477 static byte palette[] = {
478 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
479 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
480 0x00 /* last one is the overscan register */
481 };
482
483 if (display == _AMIGA_) {
484 bios_video_ax_esdx_bh(0x1002, palette, 0);
485 bios_video_ax_bx(0x1013, 0x0001);
486 }
487 } /* standard_palette */
488
489
490 /*
491 * special_palette
492 *
493 * Set palette register #i to value i and call VGA BIOS to use DAC
494 * registers #64 to #127.
495 *
496 */ static void special_palette(void)
497 {
498
499 static byte palette[] = {
500 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
501 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
502 0x00 /* last one is the overscan register */
503 };
504
505 if (display == _AMIGA_) {
506 bios_video_ax_esdx_bh(0x1002, palette, 0);
507 bios_video_ax_bx(0x1013, 0x0101);
508 }
509 } /* special_palette */
510
511
512 /*
513 * os_init_screen
514 *
515 * Initialise the IO interface. Prepare the screen and other devices
516 * (mouse, sound board). Set various OS depending story file header
517 * entries:
518 *
519 * z_header.config (aka flags 1)
520 * z_header.flags (aka flags 2)
521 * z_header.screen_cols (aka screen width in characters)
522 * z_header.screen_rows (aka screen height in lines)
523 * z_header.screen_width
524 * z_header.screen_height
525 * z_header.font_height (defaults to 1)
526 * z_header.font_width (defaults to 1)
527 * z_header.default_foreground
528 * z_header.default_background
529 * z_header.interpreter_number
530 * z_header.interpreter_version
531 * z_header.user_name (optional; not used by any game)
532 *
533 * Finally, set reserve_mem to the amount of memory (in bytes) that
534 * should not be used for multiple undo and reserved for later use.
535 *
536 */ void os_init_screen(void)
537 {
538 static byte zcolour[] = {
539 BLACK_COLOUR,
540 BLUE_COLOUR,
541 GREEN_COLOUR,
542 CYAN_COLOUR,
543 RED_COLOUR,
544 MAGENTA_COLOUR,
545 BROWN + 16,
546 LIGHTGRAY + 16,
547 GREY_COLOUR,
548 LIGHTBLUE + 16,
549 LIGHTGREEN + 16,
550 LIGHTCYAN + 16,
551 LIGHTRED + 16,
552 LIGHTMAGENTA + 16,
553 YELLOW_COLOUR,
554 WHITE_COLOUR
555 };
556
557 static struct { /* information on modes 0 to 5 */
558 byte vmode;
559 word width;
560 word height;
561 byte font_width;
562 byte font_height;
563 byte fg;
564 byte bg;
565 } info[] = {
566 {0x07, 80, 25, 1, 1, LIGHTGRAY + 16, BLACK_COLOUR}, /* MONO */
567 {0x03, 80, 25, 1, 1, LIGHTGRAY + 16, BLUE_COLOUR}, /* TEXT */
568 {0x06, 640, 200, 8, 8, WHITE_COLOUR, BLACK_COLOUR}, /* CGA */
569 {0x13, 320, 200, 5, 8, WHITE_COLOUR, GREY_COLOUR}, /* MCGA */
570 {0x0e, 640, 200, 8, 8, WHITE_COLOUR, BLUE_COLOUR}, /* EGA */
571 {0x12, 640, 400, 8, 16, WHITE_COLOUR, BLACK_COLOUR} /* AMIGA */
572 };
573
574 static struct { /* information on modes A to E */
575 word vesamode;
576 word width;
577 word height;
578 } subinfo[] = {
579 {0x001, 40, 25},
580 {0x109, 132, 25},
581 {0x10b, 132, 50},
582 {0x108, 80, 60},
583 {0x10c, 132, 60}
584 };
585
586 int subdisplay;
587
588 /* Get the current video mode. This video mode will be selected
589 when the program terminates. It's also useful to auto-detect
590 monochrome boards. */
591 old_video_mode = (byte)bios_video_ah(0x0f);
592
593 /* If the display mode has not already been set by the user then see
594 if this is a monochrome board. If so, set the display mode to 0.
595 Otherwise check the graphics flag of the story. Select a graphic
596 mode if it is set or if this is a V6 game. Select text mode if it
597 is not. */
598 if (display == -1) {
599 if (old_video_mode == 7)
600 display = '0';
601 else if (z_header.version == V6 || (z_header.flags & GRAPHICS_FLAG))
602 display = '5';
603 else
604 display = '1';
605 }
606
607 /* Activate the desired display mode. All VESA text modes are very
608 similar to the standard text mode; in fact, only here we need to
609 know which VESA mode is used. */
610 if (display >= '0' && display <= '5') {
611 subdisplay = -1;
612 display -= '0';
613 bios_video_ax((word)info[display].vmode);
614 } else if (display == 'a') {
615 subdisplay = 0;
616 display = 1;
617 bios_video_ax(0x0001);
618 } else if (display >= 'b' && display <= 'e') {
619 subdisplay = display - 'a';
620 display = 1;
621 bios_video_ax_bx(0x4f02, subinfo[subdisplay].vesamode);
622 }
623
624 /* Make various preparations */
625 if (display <= _TEXT_) {
626 /* Enable bright background colours */
627 bios_video_ax_bl(0x1003, 0);
628 /* Turn off hardware cursor */
629 bios_video_ah_cx(1, 0xffff);
630 } else {
631 load_fonts();
632
633 if (display == _AMIGA_) {
634 scaler = 2;
635
636 /* Use resolution 640 x 400 instead of 640 x 480. BIOS doesn't
637 help us here since this is not a standard resolution. */
638 outp(0x03c2, 0x63);
639
640 outpw(0x03d4, 0x0e11);
641 outpw(0x03d4, 0xbf06);
642 outpw(0x03d4, 0x1f07);
643 outpw(0x03d4, 0x9c10);
644 outpw(0x03d4, 0x8f12);
645 outpw(0x03d4, 0x9615);
646 outpw(0x03d4, 0xb916);
647
648 }
649
650 }
651 #if !defined(__SMALL__) && !defined (__TINY__) && !defined (__MEDIUM__)
652 /* Set the amount of memory to reserve for later use. It takes
653 some memory to open command, script and game files. If Frotz
654 is compiled in a small memory model then memory for opening
655 files is allocated on the "near heap" while other allocations
656 are made on the "far heap", i.e. we need not reserve memory
657 in this case. */ reserve_mem = 4 * BUFSIZ;
658
659 #endif
660
661 /* Amiga emulation under V6 needs special preparation. */
662 if (display == _AMIGA_ && z_header.version == V6) {
663 user_reverse_fg = -1;
664 user_reverse_bg = -1;
665 zcolour[LIGHTGRAY] = LIGHTGREY_COLOUR;
666 zcolour[DARKGRAY] = DARKGREY_COLOUR;
667
668 special_palette();
669 }
670
671 /* Set various bits in the configuration byte. These bits tell
672 the game which features are supported by the interpreter. */
673 if (z_header.version == V3 && user_tandy_bit != -1)
674 z_header.config |= CONFIG_TANDY;
675 if (z_header.version == V3)
676 z_header.config |= CONFIG_SPLITSCREEN;
677 if (z_header.version == V3
678 && (display == _MCGA_ || (display == _AMIGA_ && user_font != 0)))
679 z_header.config |= CONFIG_PROPORTIONAL;
680 if (z_header.version >= V4 && display != _MCGA_
681 && (user_bold_typing != -1 || display <= _TEXT_))
682 z_header.config |= CONFIG_BOLDFACE;
683 if (z_header.version >= V4)
684 z_header.config |= CONFIG_EMPHASIS | CONFIG_FIXED | CONFIG_TIMEDINPUT;
685 if (z_header.version >= V5 && display != _MONO_ && display != _CGA_)
686 z_header.config |= CONFIG_COLOUR;
687 if (z_header.version >= V5 && display >= _CGA_ && init_pictures())
688 z_header.config |= CONFIG_PICTURES;
689
690 /* Handle various game flags. These flags are set if the game wants
691 to use certain features. The flags must be cleared if the feature
692 is not available. */
693 if (z_header.flags & GRAPHICS_FLAG)
694 if (display <= _TEXT_)
695 z_header.flags &= ~GRAPHICS_FLAG;
696 if (z_header.version == V3 && (z_header.flags & OLD_SOUND_FLAG))
697 #ifdef SOUND_SUPPORT
698 if (!dos_init_sound())
699 #endif
700 z_header.flags &= ~OLD_SOUND_FLAG;
701 if (z_header.flags & SOUND_FLAG)
702 #ifdef SOUND_SUPPORT
703 if (!dos_init_sound())
704 #endif
705 z_header.flags &= ~SOUND_FLAG;
706 if (z_header.version >= V5 && (z_header.flags & UNDO_FLAG))
707 if (!f_setup.undo_slots)
708 z_header.flags &= ~UNDO_FLAG;
709 if (z_header.flags & MOUSE_FLAG)
710 if (subdisplay != -1 || !detect_mouse())
711 z_header.flags &= ~MOUSE_FLAG;
712 if (z_header.flags & COLOUR_FLAG)
713 if (display == _MONO_ || display == _CGA_)
714 z_header.flags &= ~COLOUR_FLAG;
715 z_header.flags &= ~MENU_FLAG;
716
717 /* Set the screen dimensions, font size and default colour */
718 z_header.screen_width = info[display].width;
719 z_header.screen_height = info[display].height;
720 z_header.font_height = info[display].font_height;
721 z_header.font_width = info[display].font_width;
722 z_header.default_foreground = info[display].fg;
723 z_header.default_background = info[display].bg;
724
725 if (subdisplay != -1) {
726 z_header.screen_width = subinfo[subdisplay].width;
727 z_header.screen_height = subinfo[subdisplay].height;
728 }
729
730 if (user_screen_width != -1)
731 z_header.screen_width = user_screen_width;
732 if (user_screen_height != -1)
733 z_header.screen_height = user_screen_height;
734
735 z_header.screen_cols = z_header.screen_width / z_header.font_width;
736 z_header.screen_rows = z_header.screen_height / z_header.font_height;
737
738 if (user_foreground != -1)
739 z_header.default_foreground = zcolour[user_foreground];
740 if (user_background != -1)
741 z_header.default_background = zcolour[user_background];
742
743 /* Set the interpreter number (a constant telling the game which
744 operating system it runs on) and the interpreter version. The
745 interpreter number has effect on V6 games and "Beyond Zork". */
746 z_header.interpreter_number = INTERP_MSDOS;
747 z_header.interpreter_version = 'F';
748
749 if (display == _AMIGA_)
750 z_header.interpreter_number = INTERP_AMIGA;
751
752 /* Install the fast_exit routine to handle the ctrl-break key */
753 oldvect = _dos_getvect(0x1b);
754 _dos_setvect(0x1b, fast_exit);
755 } /* os_init_screen */
756
757
758 /*
759 * os_reset_screen
760 *
761 * Reset the screen before the program stops.
762 *
763 */
764 void os_reset_screen(void)
765 {
766 os_set_font(TEXT_FONT);
767 os_set_text_style(0);
768 os_display_string((zchar *) "[Hit any key to exit.]");
769 os_read_key(0, TRUE);
770
771 cleanup();
772 } /* os_reset_screen */
773
774
775 /*
776 * os_restart_game
777 *
778 * This routine allows the interface to interfere with the process of
779 * restarting a game at various stages:
780 *
781 * RESTART_BEGIN - restart has just begun
782 * RESTART_WPROP_SET - window properties have been initialised
783 * RESTART_END - restart is complete
784 *
785 */
786 void os_restart_game(int stage)
787 {
788 int x, y;
789
790 if (story_id == BEYOND_ZORK) {
791 if (stage == RESTART_BEGIN) {
792 if ((display == _MCGA_ || display == _AMIGA_)
793 && os_picture_data(1, &x, &y)) {
794
795 special_palette();
796
797 bios_video_ax_bx_dh_ch_cl(0x1010, 64, 0, 0, 0);
798 bios_video_ax_bx_dh_ch_cl(0x1010, 79,
799 0xff, 0xff, 0xff);
800 os_draw_picture(1, 1, 1);
801 os_read_key(0, FALSE);
802
803 standard_palette();
804 }
805 }
806 }
807 } /* os_restart_game */
808
809
810 /*
811 * os_random_seed
812 *
813 * Return an appropriate random seed value in the range from 0 to
814 * 32767, possibly by using the current system time.
815 *
816 */
817 int os_random_seed(void)
818 {
819 if (user_random_seed == -1)
820 /* Use the time of day as seed value */
821 return (int)bios_time_ah(0) & 0x7fff;
822 else
823 return user_random_seed;
824 } /* os_random_seed */
825
826
827 /*
828 * os_path_open
829 *
830 * Open a file in the current directory. If this fails then
831 * search the directories in the ZCODE_PATH environment variable,
832 * if it is defined, otherwise search INFOCOM_PATH.
833 *
834 */
835 FILE *os_path_open(const char *name, const char *mode)
836 {
837 FILE *fp;
838 char buf[MAX_FILE_NAME + 1];
839 char *p, *bp, lastch;
840
841 if ((fp = fopen(name, mode)) != NULL)
842 return fp;
843 if ((p = getenv("ZCODE_PATH")) == NULL)
844 p = getenv("INFOCOM_PATH");
845 if (p != NULL) {
846 while (*p) {
847 bp = buf;
848 while (*p && *p != OS_PATHSEP)
849 lastch = *bp++ = *p++;
850 if (lastch != '\\' && lastch != '/')
851 *bp++ = '\\';
852 strcpy(bp, name);
853 if ((fp = fopen(buf, mode)) != NULL)
854 return fp;
855 if (*p)
856 p++;
857 }
858 }
859 return NULL;
860 } /* os_path_open */
861
862
863 /*
864 * os_load_story
865 *
866 * This is different from os_path_open() because we need to see if the
867 * story file is actually a chunk inside a blorb file. Right now we're
868 * looking only at the exact path we're given on the command line.
869 *
870 * Open a file in the current directory. If this fails, then search the
871 * directories in the ZCODE_PATH environmental variable. If that's not
872 * defined, search INFOCOM_PATH.
873 *
874 */
875 FILE *os_load_story(void)
876 {
877 #ifndef NO_BLORB
878 FILE *fp;
879
880 /* Did we build a valid blorb map? */
881 if (exec_in_blorb) {
882 fp = fopen(blorb_file, "rb");
883 fseek(fp, blorb_res.data.startpos, SEEK_SET);
884 } else {
885 fp = fopen(f_setup.story_file, "rb");
886 }
887 return fp;
888 #else
889 return fopen(f_setup.story_file, "rb");
890 #endif
891 }
892
893
894 #ifndef NO_BLORB
895 int dos_init_blorb(void)
896 {
897 FILE *blorbfile;
898
899 /* If the filename given on the command line is the same as our
900 * computed blorb filename, then we will assume the executable
901 * is contained in the blorb file.
902 */
903 if (strncmp((char *)basename(f_setup.story_file),
904 (char *)basename(blorb_file), 55) == 0) {
905 if ((blorbfile = fopen(blorb_file, "rb")) == NULL)
906 return bb_err_Read;
907 /* Under DOS, bb_create_map() returns bb_err_Format */
908 blorb_err = bb_create_map(blorbfile, &blorb_map);
909
910 if (blorb_err != bb_err_None) {
911 return blorb_err;
912 }
913
914 /* Now we need to locate the EXEC chunk within the blorb file
915 * and present it to the rest of the program as a file stream.
916 */
917 blorb_err = bb_load_chunk_by_type(blorb_map, bb_method_FilePos,
918 &blorb_res, bb_ID_ZCOD, 0);
919
920 if (blorb_err == bb_err_None) {
921 exec_in_blorb = 1;
922 use_blorb = 1;
923 }
924 }
925 return 0;
926 }
927 #endif /* NO_BLORB */
928
929
930 /*
931 * Seek into a storyfile, either a standalone file or the
932 * ZCODE chunk of a blorb file
933 */
934 int os_storyfile_seek(FILE * fp, long offset, int whence)
935 {
936 #ifndef NO_BLORB
937 int retval;
938 /* Is this a Blorb file containing Zcode? */
939 if (exec_in_blorb) {
940 switch (whence) {
941 case SEEK_END:
942 retval =
943 fseek(fp,
944 blorb_res.data.startpos + blorb_res.length +
945 offset, SEEK_SET);
946 break;
947 case SEEK_CUR:
948 retval = fseek(fp, offset, SEEK_CUR);
949 break;
950 case SEEK_SET:
951 default:
952 retval =
953 fseek(fp, blorb_res.data.startpos + offset,
954 SEEK_SET);
955 break;
956 }
957 return retval;
958 }
959 #endif
960 return fseek(fp, offset, whence);
961 }
962
963
964 /*
965 * Tell the position in a storyfile, either a standalone file
966 * or the ZCODE chunk of a blorb file
967 */
968 int os_storyfile_tell(FILE * fp)
969 {
970 #ifndef NO_BLORB
971 /* Is this a Blorb file containing Zcode? */
972 if (exec_in_blorb)
973 return ftell(fp) - blorb_res.data.startpos;
974 #endif
975 return ftell(fp);
976 }
+0
-938
src/owdos/owinput.c less more
0 /*
1 * owinput.c - DOS interface (Open Watcom version), input functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <bios.h>
22 #include <io.h>
23 #include <string.h>
24 #include <stdio.h>
25 #include "frotz.h"
26 #include "owfrotz.h"
27
28 #ifndef HISTORY_BUFSIZE
29 #define HISTORY_BUFSIZE 500
30 #endif
31
32 extern bool is_terminator (zchar);
33
34 extern bool read_yes_or_no (const char *);
35 extern void read_string (int, zchar *);
36
37 extern int completion (const zchar *, zchar *);
38
39 extern bool at_keybrd;
40
41 static long limit = 0;
42
43 static struct {
44 zchar buffer[HISTORY_BUFSIZE];
45 int latest;
46 int current;
47 int prefix_len;
48 } history;
49
50 static struct {
51 zchar *buffer;
52 int pos;
53 int length;
54 int max_length;
55 int width;
56 int max_width;
57 } input;
58
59 static bool overwrite = FALSE;
60
61 volatile int end_of_sound_flag;
62
63 /*
64 * swap_colours
65 *
66 * This is a small helper function for switch_cursor. It swaps the
67 * current background and foreground colours.
68 *
69 */
70 static void swap_colours(void)
71 {
72 byte temp;
73
74 temp = text_fg;
75 text_fg = text_bg;
76 text_bg = temp;
77
78 } /* swap_colours */
79
80
81 /*
82 * switch_cursor
83 *
84 * Turn cursor on/off. If there is mouse support then turn the mouse
85 * pointer on/off as well. The cursor should not be moved and the
86 * contents of the screen should not be changed while the cursor is
87 * visible (because of the primitive cursor emulation we use here).
88 *
89 */
90 static void switch_cursor(bool cursor)
91 {
92 if (display <= _TEXT_) {
93 word shape;
94 /* Use hardware cursor in text mode */
95 if (display == _MONO_)
96 shape = overwrite ? 0x080f : 0x0a0b;
97 else
98 shape = overwrite ? 0x0408 : 0x0506;
99
100 if (!cursor)
101 shape = 0xffff;
102
103 bios_video_ah_bh_dh_dl(2, 0, cursor_y, cursor_x);
104 bios_video_ah_cx(1, shape);
105 } else {
106 int saved_x = cursor_x;
107
108 if (cursor)
109 swap_colours();
110
111 if (input.pos < input.length)
112 os_display_char(input.buffer[input.pos]);
113 else
114 os_display_char(' ');
115
116 if (cursor)
117 swap_colours();
118
119 cursor_x = saved_x;
120 }
121 } /* switch_cursor */
122
123
124 /*
125 * get_current_time
126 *
127 * Return the current system time in 1/10 seconds.
128 *
129 */
130 static long get_current_time(void)
131 {
132 long time;
133
134 /* Get the current time of day measured in
135 * 65536 / 1,193,180 = 0.054925493
136 * seconds. Multiply this value with
137 * 959 / 1746 = 0.54925544
138 * to get the current time in 0.1 seconds.
139 */
140 time = bios_time_ah(0);
141
142 return time * 959 / 1746;
143 } /* get_current_time */
144
145
146 /*
147 * set_timer
148 *
149 * Set a time limit of timeout/10 seconds if timeout is not zero;
150 * otherwise clear the time limit.
151 *
152 */
153 static void set_timer(int timeout)
154 {
155 limit = (timeout != 0) ? get_current_time () + timeout : 0;
156 } /* set_timer */
157
158
159 /*
160 * time_limit_hit
161 *
162 * Return true if a previously set time limit has been exceeded.
163 *
164 */
165 static bool out_of_time(void)
166 {
167 if (limit != 0) {
168 long now = get_current_time ();
169
170 if (now < 1L * 3600 * 10 && limit > 23L * 3600 * 10)
171 now += 24L * 3600 * 10;
172
173 return now >= limit;
174 } else
175 return FALSE;
176
177 } /* out_of_time */
178
179
180 /*
181 * get_key
182 *
183 * Read a keypress or a mouse click. Returns...
184 *
185 * ZC_TIME_OUT = time limit exceeded,
186 * ZC_BACKSPACE = the backspace key,
187 * ZC_RETURN = the return key,
188 * ZC_HKEY_MIN...ZC_HKEY_MAX = a hot key,
189 * ZC_ESCAPE = the escape key,
190 * ZC_ASCII_MIN...ZC_ASCII_MAX = ASCII character,
191 * ZC_ARROW_MIN...ZC_ARROW_MAX = an arrow key,
192 * ZC_FKEY_MIN...ZC_FKEY_MAX = a function key,
193 * ZC_NUMPAD_MIN...ZC_NUMPAD_MAX = a number pad key,
194 * ZC_SINGLE_CLICK = single mouse click,
195 * ZC_DOUBLE_CLICK = double mouse click,
196 * ZC_LATIN1_MIN+1...ZC_LATIN1_MAX = ISO Latin-1 character,
197 * SPECIAL_KEY_MIN...SPECIAL_KEY_MAX = a special editing key.
198 *
199 */
200 static int get_key(bool cursor)
201 {
202 static byte arrow_key_map[] = {0x48, 0x50, 0x4b, 0x4d};
203 static byte special_key_map[] = {0x47, 0x4f, 0x73, 0x74, 0x53,
204 0x52, 0x49, 0x51, 0x0f};
205 static byte hot_key_map[] = {0x13, 0x19, 0x1f, 0x16,
206 0x31, 0x2d, 0x20, 0x23};
207 static byte function_key_map[] = {0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
208 0x41, 0x42, 0x43, 0x44, 0x85, 0x86};
209
210 int key;
211
212 /* Loop until a key was pressed */
213 if (cursor)
214 switch_cursor(TRUE);
215
216 if (z_header.flags & MOUSE_FLAG)
217 dos_mouse_ax(1);
218
219 do {
220
221 #ifdef SOUND_SUPPORT
222 if (end_of_sound_flag)
223 end_of_sound();
224 #endif
225
226 if (_bios_keybrd(at_keybrd ? _NKEYBRD_READY : _KEYBRD_READY)) {
227 word code = _bios_keybrd(at_keybrd ? _NKEYBRD_READ : _KEYBRD_READ);
228 byte code0 = code;
229 byte code1 = code >> 8;
230
231 if (code0 != 0 && code0 != 9 && code0 != 0xe0) {
232 key = code0 - '0' + ZC_NUMPAD_MIN;
233 if (key >= ZC_NUMPAD_MIN && key <= ZC_NUMPAD_MAX && code1 >= 0x10)
234 goto exit_loop;
235
236 for (key = ZC_LATIN1_MIN + 1; key <= ZC_LATIN1_MAX; key++) {
237 if (code0 == latin1_to_ibm[key - ZC_LATIN1_MIN])
238 goto exit_loop;
239 }
240 key = code0;
241
242 if (key == ZC_BACKSPACE)
243 goto exit_loop;
244 if (key == ZC_RETURN)
245 goto exit_loop;
246 if (key == ZC_ESCAPE)
247 goto exit_loop;
248 if (key >= ZC_ASCII_MIN && key <= ZC_ASCII_MAX)
249 goto exit_loop;
250 } else {
251 for (key = ZC_ARROW_MIN; key <= ZC_ARROW_MAX; key++) {
252 if (code1 == arrow_key_map[key - ZC_ARROW_MIN])
253 goto exit_loop;
254 }
255
256 for (key = ZC_FKEY_MIN; key <= ZC_FKEY_MAX; key++) {
257 if (code1 == function_key_map[key - ZC_FKEY_MIN])
258 goto exit_loop;
259 }
260
261 for (key = ZC_HKEY_MIN; key <= ZC_HKEY_MAX; key++) {
262 if (code1 == hot_key_map[key - ZC_HKEY_MIN])
263 goto exit_loop;
264 }
265
266 for (key = SPECIAL_KEY_MIN; key <= SPECIAL_KEY_MAX; key++) {
267 if (code1 == special_key_map[key - SPECIAL_KEY_MIN])
268 goto exit_loop;
269 }
270 }
271 } else {
272 int clicks = read_mouse ();
273
274 if (clicks == 1) {
275 key = ZC_SINGLE_CLICK;
276 goto exit_loop;
277 }
278 if (clicks == 2) {
279 key = ZC_DOUBLE_CLICK;
280 goto exit_loop;
281 }
282 }
283
284 key = ZC_TIME_OUT;
285 } while (!out_of_time());
286
287 exit_loop:
288
289 if (z_header.flags & MOUSE_FLAG)
290 dos_mouse_ax(2);
291
292 if (cursor)
293 switch_cursor(FALSE);
294
295 return key;
296 } /* get_key */
297
298
299 /*
300 * cursor_left
301 *
302 * Move the cursor one character to the left.
303 *
304 */
305 static void cursor_left(void)
306 {
307 if (input.pos > 0)
308 cursor_x -= os_char_width(input.buffer[--input.pos]);
309 } /* cursor_left */
310
311
312 /*
313 * cursor_right
314 *
315 * Move the cursor one character to the right.
316 *
317 */
318 static void cursor_right(void)
319 {
320 if (input.pos < input.length)
321 cursor_x += os_char_width(input.buffer[input.pos++]);
322 } /* cursor_right */
323
324
325 /*
326 * first_char
327 *
328 * Move the cursor to the beginning of the input line.
329 *
330 */
331 static void first_char(void)
332 {
333 while (input.pos > 0)
334 cursor_left();
335 } /* first_char */
336
337
338 /*
339 * last_char
340 *
341 * Move the cursor to the end of the input line.
342 *
343 */
344 static void last_char(void)
345 {
346 while (input.pos < input.length)
347 cursor_right();
348
349 } /* last_char */
350
351
352 /*
353 * prev_word
354 *
355 * Move the cursor to the start of the previous word.
356 *
357 */
358 static void prev_word(void)
359 {
360 do {
361 cursor_left();
362 if (input.pos == 0)
363 return;
364 } while (input.buffer[input.pos] == ' ' || input.buffer[input.pos - 1] != ' ');
365 } /* prev_word */
366
367
368 /*
369 * next_word
370 *
371 * Move the cursor to the start of the next word.
372 *
373 */
374 static void next_word(void)
375 {
376 do {
377 cursor_right();
378 if (input.pos == input.length)
379 return;
380 } while (input.buffer[input.pos] == ' ' || input.buffer[input.pos - 1] != ' ');
381 } /* next_word */
382
383
384 /*
385 * input_move
386 *
387 * Helper function to move parts of the input buffer:
388 *
389 * newc != 0, oldc == 0: INSERT
390 * newc != 0, oldc != 0: OVERWRITE
391 * newc == 0, oldc != 0: DELETE
392 * newc == 0, oldc == 0: NO OPERATION
393 *
394 */
395 #define H(x) (x ? 1 : 0)
396 static void input_move(zchar newc, zchar oldc)
397 {
398 int newwidth = (newc != 0) ? os_char_width(newc) : 0;
399 int oldwidth = (oldc != 0) ? os_char_width(oldc) : 0;
400
401 zchar *p = input.buffer + input.pos;
402
403 int saved_x = cursor_x;
404
405 int updated_width = input.width + newwidth - oldwidth;
406 int updated_length = input.length + H (newc) - H (oldc);
407
408 if (updated_width > input.max_width)
409 return;
410 if (updated_length > input.max_length)
411 return;
412
413 input.width = updated_width;
414 input.length = updated_length;
415
416 if (oldc != 0 && newc == 0)
417 memmove(p, p + 1, updated_length - input.pos + 1);
418 if (newc != 0 && oldc == 0)
419 memmove(p + 1, p, updated_length - input.pos);
420
421 if (newc != 0)
422 *p = newc;
423
424 os_display_string(p);
425
426 switch_scrn_attr(TRUE);
427
428 if (oldwidth > newwidth) {
429 os_erase_area (
430 cursor_y + 1,
431 cursor_x + 1,
432 cursor_y + z_header.font_height,
433 cursor_x + oldwidth - newwidth,
434 -1);
435 }
436
437 switch_scrn_attr(FALSE);
438
439 cursor_x = saved_x;
440
441 if (newc != 0)
442 cursor_right();
443 } /* input_move */
444
445
446 #undef H
447
448
449 /*
450 * delete_char
451 *
452 * Delete the character below the cursor.
453 *
454 */
455 static void delete_char(void)
456 {
457 input_move (0, input.buffer[input.pos]);
458 } /* delete_char */
459
460
461 /*
462 * delete_left
463 *
464 * Delete the character to the left of the cursor.
465 *
466 */
467 static void delete_left(void)
468 {
469 if (input.pos > 0) {
470 cursor_left();
471 delete_char();
472 }
473 } /* delete_left */
474
475
476 /*
477 * truncate_line
478 *
479 * Truncate the input line to n characters.
480 *
481 */
482 static void truncate_line(int n)
483 {
484 last_char();
485 while (input.length > n)
486 delete_left();
487 } /* truncate_line */
488
489
490 /*
491 * insert_char
492 *
493 * Insert a character into the input buffer.
494 *
495 */
496 static void insert_char(zchar newc)
497 {
498 zchar oldc = 0;
499
500 if (overwrite)
501 oldc = input.buffer[input.pos];
502
503 input_move(newc, oldc);
504 } /* insert_char */
505
506
507 /*
508 * insert_string
509 *
510 * Add a string of characters to the input line.
511 *
512 */
513 static void insert_string(const zchar *s)
514 {
515 while (*s != 0) {
516 if (input.length + 1 > input.max_length)
517 break;
518 if (input.width + os_char_width (*s) > input.max_width)
519 break;
520 insert_char (*s++);
521 }
522 } /* insert_string */
523
524
525 /*
526 * tabulator_key
527 *
528 * Complete the word at the end of the input line, if possible.
529 *
530 */
531 static void tabulator_key(void)
532 {
533 int status;
534
535 if (input.pos == input.length) {
536 zchar extension[10];
537
538 status = completion(input.buffer, extension);
539 insert_string(extension);
540 } else
541 status = 2;
542
543 /* Beep if the completion was impossible or ambiguous */
544 if (status != 0)
545 os_beep(status);
546 } /* tabulator_key */
547
548
549 /*
550 * store_input
551 *
552 * Copy the current input line to the history buffer.
553 *
554 */
555 static void store_input(void)
556 {
557 if (input.length >= HISTORY_MIN_ENTRY) {
558
559 const zchar *ptr = input.buffer;
560
561 do {
562 if (history.latest++ == HISTORY_BUFSIZE - 1)
563 history.latest = 0;
564
565 history.buffer[history.latest] = *ptr;
566
567 } while (*ptr++ != 0);
568 }
569 } /* store_input */
570
571
572 /*
573 * fetch_entry
574 *
575 * Copy the current history entry to the input buffer and check if it
576 * matches the prefix in the input buffer.
577 *
578 */
579 static bool fetch_entry(zchar *buf, int entry)
580 {
581 int i = 0;
582 zchar c;
583
584 do {
585 if (entry++ == HISTORY_BUFSIZE - 1)
586 entry = 0;
587
588 c = history.buffer[entry];
589
590 if (i < history.prefix_len && input.buffer[i] != c)
591 return FALSE;
592
593 buf[i++] = c;
594 } while (c != 0);
595
596 return (i > history.prefix_len) && (i > 1);
597 } /* fetch_entry */
598
599
600 /*
601 * get_prev_entry
602 *
603 * Copy the previous history entry to the input buffer.
604 *
605 */
606 static void get_prev_entry(void)
607 {
608 zchar buf[INPUT_BUFFER_SIZE];
609
610 int i = history.current;
611
612 do {
613 do {
614 if (i-- == 0)
615 i = HISTORY_BUFSIZE - 1;
616
617 if (i == history.latest)
618 return;
619
620 } while (history.buffer[i] != 0);
621
622 } while (!fetch_entry(buf, i));
623
624 truncate_line(history.prefix_len);
625 insert_string(buf + history.prefix_len);
626 history.current = i;
627 } /* get_prev_entry */
628
629
630 /*
631 * get_next_entry
632 *
633 * Copy the next history entry to the input buffer.
634 *
635 */
636 static void get_next_entry(void)
637 {
638 zchar buf[INPUT_BUFFER_SIZE];
639
640 int i = history.current;
641
642 truncate_line(history.prefix_len);
643
644 do {
645 do {
646 if (i == history.latest)
647 return;
648
649 if (i++ == HISTORY_BUFSIZE - 1)
650 i = 0;
651 } while (history.buffer[i] != 0);
652 if (i == history.latest)
653 goto no_further;
654 } while (!fetch_entry (buf, i));
655
656 insert_string(buf + history.prefix_len);
657
658 no_further:
659 history.current = i;
660
661 } /* get_next_entry */
662
663
664 /*
665 * os_read_line
666 *
667 * Read a line of input from the keyboard into a buffer. The buffer
668 * may already be primed with some text. In this case, the "initial"
669 * text is already displayed on the screen. After the input action
670 * is complete, the function returns with the terminating key value.
671 * The length of the input should not exceed "max" characters plus
672 * an extra 0 terminator.
673 *
674 * Terminating keys are the return key (13) and all function keys
675 * (see the Specification of the Z-machine) which are accepted by
676 * the is_terminator function. Mouse clicks behave like function
677 * keys except that the mouse position is stored in global variables
678 * "mouse_x" and "mouse_y" (top left coordinates are (1,1)).
679 *
680 * Furthermore, Frotz introduces some special terminating keys:
681 *
682 * ZC_HKEY_PLAYBACK (Alt-P)
683 * ZC_HKEY_RECORD (Alt-R)
684 * ZC_HKEY_SEED (Alt-S)
685 * ZC_HKEY_UNDO (Alt-U)
686 * ZC_HKEY_RESTART (Alt-N, "new game")
687 * ZC_HKEY_QUIT (Alt-X, "exit game")
688 * ZC_HKEY_DEBUGGING (Alt-D)
689 * ZC_HKEY_HELP (Alt-H)
690 *
691 * If the timeout argument is not zero, the input gets interrupted
692 * after timeout/10 seconds (and the return value is 0).
693 *
694 * The complete input line including the cursor must fit in "width"
695 * screen units.
696 *
697 * The function may be called once again to continue after timeouts,
698 * misplaced mouse clicks or hot keys. In this case the "continued"
699 * flag will be set. This information can be useful if the interface
700 * implements input line history.
701 *
702 * The screen is not scrolled after the return key was pressed. The
703 * cursor is at the end of the input line when the function returns.
704 *
705 * Since Inform 2.2 the helper function "completion" can be called
706 * to implement word completion (similar to tcsh under Unix).
707 *
708 */
709
710 #define new_history_search() \
711 { history.prefix_len = input.pos; history.current = history.latest; }
712
713 zchar os_read_line(int max, zchar *buf, int timeout, int width, int continued)
714 {
715 int key = continued ? 9999 : 0;
716
717 /* Initialise input variables */
718 input.buffer = buf;
719 input.pos = strlen((char *) buf);
720 input.length = strlen((char *) buf);
721 input.max_length = max;
722 input.width = os_string_width(buf);
723 input.max_width = width - os_char_width(' ');
724
725 /* Calculate time limit */
726 set_timer (timeout);
727
728 /* Loop until a terminator is found */
729 do {
730 if (key != 9999)
731 new_history_search();
732
733 /* Get next key from mouse or keyboard */
734 key = get_key (TRUE);
735
736 if (key < ZC_ASCII_MIN || key > ZC_ASCII_MAX && key < ZC_LATIN1_MIN || key > ZC_LATIN1_MAX) {
737 /* Ignore time-outs if the cursor is not at end of the line */
738 if (key == ZC_TIME_OUT && input.pos < input.length)
739 key = 9999;
740
741 /* Backspace, return and escape keys */
742 if (key == ZC_BACKSPACE)
743 delete_left();
744 if (key == ZC_RETURN)
745 store_input();
746 if (key == ZC_ESCAPE)
747 truncate_line(0);
748
749 /* Editing keys */
750 if (cwin == 0) {
751 if (key == ZC_ARROW_UP)
752 get_prev_entry();
753 if (key == ZC_ARROW_DOWN)
754 get_next_entry();
755 if (key == ZC_ARROW_LEFT)
756 cursor_left();
757 if (key == ZC_ARROW_RIGHT)
758 cursor_right();
759 if (key >= ZC_ARROW_MIN && key <= ZC_ARROW_MAX)
760 key = 9999;
761 if (key == SPECIAL_KEY_HOME)
762 first_char();
763 if (key == SPECIAL_KEY_END)
764 last_char();
765 if (key == SPECIAL_KEY_WORD_LEFT)
766 prev_word();
767 if (key == SPECIAL_KEY_WORD_RIGHT)
768 next_word();
769 if (key == SPECIAL_KEY_DELETE)
770 delete_char();
771 if (key == SPECIAL_KEY_INSERT)
772 overwrite = !overwrite;
773 if (key == SPECIAL_KEY_TAB)
774 tabulator_key();
775 }
776 if (key == SPECIAL_KEY_PAGE_UP)
777 key = ZC_ARROW_UP;
778 if (key == SPECIAL_KEY_PAGE_DOWN)
779 key = ZC_ARROW_DOWN;
780 } else
781 insert_char(key);
782 } while (key > 0xff || !is_terminator(key));
783
784 last_char();
785
786 overwrite = FALSE;
787
788 /* Return terminating key */
789 return key;
790 } /* os_read_line */
791
792
793 #undef new_history_search
794
795 /*
796 * os_read_key
797 *
798 * Read a single character from the keyboard (or a mouse click) and
799 * return it. Input aborts after timeout/10 seconds.
800 *
801 */
802 zchar os_read_key(int timeout, bool cursor)
803 {
804 int key;
805
806 set_timer(timeout);
807
808 do {
809 key = get_key(cursor);
810 } while (key > 0xff);
811
812 return key;
813 } /* os_read_key */
814
815
816 /*
817 * os_read_file_name
818 *
819 * Return the name of a file. Flag can be one of:
820 *
821 * FILE_SAVE - Save game file
822 * FILE_RESTORE - Restore game file
823 * FILE_SCRIPT - Transscript file
824 * FILE_RECORD - Command file for recording
825 * FILE_PLAYBACK - Command file for playback
826 * FILE_SAVE_AUX - Save auxilary ("preferred settings") file
827 * FILE_LOAD_AUX - Load auxilary ("preferred settings") file
828 *
829 * The length of the file name is limited by MAX_FILE_NAME. Ideally
830 * an interpreter should open a file requester to ask for the file
831 * name. If it is unable to do that then this function should call
832 * print_string and read_string to ask for a file name.
833 *
834 */
835
836 char *os_read_file_name (const char *default_name, int flag)
837 {
838 char *extension;
839 FILE *fp;
840 bool terminal;
841 bool result;
842
843 bool saved_replay = istream_replay;
844 bool saved_record = ostream_record;
845
846 int i;
847 char *tempname;
848 char file_name[FILENAME_MAX + 1];
849
850 /* Turn off playback and recording temporarily */
851 istream_replay = FALSE;
852 ostream_record = FALSE;
853
854 /* Select appropriate extension */
855 extension = ".aux";
856
857 if (flag == FILE_SAVE || flag == FILE_RESTORE)
858 extension = ".sav";
859 if (flag == FILE_SCRIPT)
860 extension = ".scr";
861 if (flag == FILE_RECORD || flag == FILE_PLAYBACK)
862 extension = ".rec";
863
864 /* Input file name (reserve four bytes for a file name extension) */
865 print_string("Enter file name (\"");
866 print_string(extension);
867 print_string("\" will be added).\nDefault is \"");
868 print_string(default_name);
869 print_string("\": ");
870
871 read_string(MAX_FILE_NAME - 4, (zchar *) file_name);
872
873 /* Use the default name if nothing was typed */
874 if (file_name[0] == 0)
875 strcpy(file_name, default_name);
876 if (strchr(file_name, '.') == NULL)
877 strcat(file_name, extension);
878
879 /* FIXME: UNTESTED Check if we're restricted to one directory. */
880 if (f_setup.restricted_path != NULL) {
881 for (i = strlen(file_name); i > 0; i--) {
882 if (file_name[i] == PATH_SEPARATOR) {
883 i++;
884 break;
885 }
886 }
887 tempname = strdup(file_name + i);
888 strcpy(file_name, f_setup.restricted_path);
889 if (file_name[strlen(file_name)-1] != PATH_SEPARATOR) {
890 strcat(file_name, "\\");
891 }
892 strcat(file_name, tempname);
893 }
894
895 /* Make sure it is safe to use this file name */
896 result = TRUE;
897
898 /* OK if the file is opened for reading */
899 if (flag != FILE_SAVE && flag != FILE_SAVE_AUX && flag != FILE_RECORD)
900 goto finished;
901
902 /* OK if the file does not exist */
903 if ((fp = fopen(file_name, "rb")) == NULL)
904 goto finished;
905
906 /* OK if this is a pseudo-file (like PRN, CON, NUL) */
907 terminal = isatty(fileno(fp));
908
909 fclose(fp);
910
911 if (terminal)
912 goto finished;
913
914 /* OK if user wants to overwrite */
915 result = read_yes_or_no ("Overwrite existing file");
916
917 finished:
918
919 /* Restore state of playback and recording */
920 istream_replay = saved_replay;
921 ostream_record = saved_record;
922
923 if (!result)
924 return NULL;
925
926 return strdup(file_name);
927 } /* os_read_file_name */
928
929
930 /*
931 * Called regularly by the interpreter, at least every few instructions
932 * (only when interpreting: e.g., not when waiting for input).
933 */
934 void os_tick(void)
935 {
936 /* do nothing */
937 }
+0
-89
src/owdos/owmouse.c less more
0 /*
1 * owmouse.h - DOS interface (Open Watcom version), mouse support
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <dos.h>
22 #include "frotz.h"
23 #include "owfrotz.h"
24
25 /*
26 * detect_mouse
27 *
28 * Return true if a mouse driver is present.
29 *
30 */
31 bool detect_mouse(void)
32 {
33 return dos_mouse_ax(0);
34 } /* detect_mouse */
35
36
37 /*
38 * read_mouse
39 *
40 * Report any mouse clicks. Return 2 for a double click, 1 for a single
41 * click or 0 if there was no mouse activity at all.
42 *
43 */
44 int read_mouse(void)
45 {
46 int click;
47
48 /* Read the current mouse status */
49 for (click = 0; click < 2; click++) {
50 union {
51 __int64 i;
52 struct {
53 int y, x, released;
54 } s;
55 } u;
56 int released, x, y;
57
58 if (click == 1)
59 delay(222);
60
61 /* Capture the returned bx, cx, and dx values all in a
62 single scalar value... */
63 u.i = dos_mouse_ax_bx(6, 0);
64 released = u.s.released;
65 x = u.s.x;
66 y = u.s.y;
67
68 if (released == 0)
69 break;
70
71 mouse_x = x;
72 mouse_y = y;
73
74 if (display <= _TEXT_) {
75 mouse_x /= 8;
76 mouse_y /= 8;
77 }
78
79 if (display == _MCGA_)
80 mouse_x /= 2;
81
82 mouse_x++;
83 mouse_y++;
84 }
85
86 /* Return single or double click */
87 return click;
88 } /* read_mouse */
+0
-656
src/owdos/owpic.c less more
0 /*
1 * owpic.c - DOS interface (Open Watcom version), picture functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <malloc.h>
22 #include <conio.h>
23 #include <dos.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include "frotz.h"
27 #include "owfrotz.h"
28
29 #define PIC_NUMBER 0
30 #define PIC_WIDTH 2
31 #define PIC_HEIGHT 4
32 #define PIC_FLAGS 6
33 #define PIC_DATA 8
34 #define PIC_COLOUR 11
35
36 #define READ_BYTE(v,p,o) ((v) = *(byte _huge *)((p) + (o)))
37 #define READ_WORD(v,p,o) ((v) = *(word _huge *)((p) + (o)))
38
39 extern volatile byte _far *get_scrnptr (int);
40
41 extern FILE *os_path_open(const char *, const char *);
42
43 static struct {
44 byte fileno;
45 byte flags;
46 word unused1;
47 word images;
48 word link;
49 byte entry_size;
50 byte padding;
51 word checksum;
52 word unused2;
53 word version;
54 } gheader;
55
56 int scaler = 1;
57
58 static word pic_width = 0;
59 static word pic_height = 0;
60 static word pic_flags = 0;
61 static long pic_data = 0;
62 static long pic_colour = 0;
63
64 static byte _far *table_val = NULL;
65 static word _far *table_ref = NULL;
66
67 static FILE *file = NULL;
68 static byte _huge *info = NULL;
69
70
71 /*
72 * open_graphics_file
73 *
74 * Open a graphics file. EGA pictures may be stored in two separate
75 * graphics files.
76 *
77 */
78 static bool open_graphics_file(int number)
79 {
80 char fname[MAX_FILE_NAME + 1];
81 char extension[4 + 1];
82 word images;
83 byte entry_size;
84 byte _huge *p;
85
86 /* Build graphics file name */
87 extension[0] = '.';
88 extension[1] = "cmem"[display - 2];
89 extension[2] = 'g';
90 extension[3] = '0' + number;
91 extension[4] = 0;
92
93 /* Why does DOS not like "graphics\\" anymore? */
94 strcpy(fname, "graphics/");
95 strcat(fname, f_setup.story_name);
96 strcat(fname, extension);
97
98 /* Open file, load header, allocate memory, load picture directory */
99 if ((file = fopen(fname, "rb")) == NULL)
100 goto failure1;
101 if (fread(&gheader, sizeof(gheader), 1, file) != 1)
102 goto failure2;
103 images = gheader.images;
104 entry_size = gheader.entry_size;
105 if ((info = halloc((long)images * entry_size, 1)) == NULL)
106 goto failure2;
107 p = info;
108 while (images != 0) {
109 if (fread((void _far *)info, gheader.entry_size, 1, file) != 1)
110 goto failure3;
111 p += entry_size;
112 --images;
113 }
114 return TRUE;
115
116 failure3:
117 hfree(info);
118 info = NULL;
119
120 failure2:
121 fclose(file);
122 file = NULL;
123
124 failure1:
125 return FALSE;
126
127 } /* open_graphics_file */
128
129
130 /*
131 * close_graphics_file
132 *
133 * Free resources allocated for pictures.
134 *
135 */
136 static void close_graphics_file(void)
137 {
138 if (file != NULL) {
139 fclose(file);
140 file = NULL;
141 }
142 if (info != NULL) {
143 hfree(info);
144 info = NULL;
145 }
146
147 } /* close_graphics_file */
148
149
150 /*
151 * init_pictures
152 *
153 * Prepare to draw pictures. Return true if pictures are available.
154 *
155 */
156 bool init_pictures(void)
157 {
158
159 /* Allocate memory for decompression */
160 table_val = (byte _far *) _fmalloc(3 * 3840);
161 table_ref = (word _far *) (table_val + 3840);
162
163 if (table_val == NULL)
164 return FALSE;
165
166 /* Open the [first of two] graphics file[s] */
167 return open_graphics_file(1);
168
169 } /* init_pictures */
170
171
172 /*
173 * reset_pictures
174 *
175 * Free resources allocated for decompression of pictures.
176 *
177 */
178 void reset_pictures(void)
179 {
180 if (table_val != NULL) {
181 _ffree(table_val);
182 table_val = NULL;
183 }
184 if (file != NULL) {
185 fclose(file);
186 file = NULL;
187 }
188 if (info != NULL) {
189 hfree(info);
190 info = NULL;
191 }
192
193 } /* reset_pictures */
194
195
196 /*
197 * load_picture_info
198 *
199 * Helper function for os_picture_data. Load all information about
200 * the given picture from the graphics file and store it in global
201 * variables.
202 *
203 */
204 static bool load_picture_info(int picture)
205 {
206 byte _huge *ptr;
207 byte fileno;
208
209 fileno = gheader.fileno;
210
211 do {
212 int i;
213
214 /* Abort if there is a problem with the graphics file */
215 if (file == NULL)
216 return FALSE;
217
218 /* Scan the directory of the current graphics file */
219 ptr = info;
220 for (i = 0; i < gheader.images; i++) {
221 if (picture == *(int far *)ptr) {
222 READ_WORD(pic_width, ptr, PIC_WIDTH);
223 READ_WORD(pic_height, ptr, PIC_HEIGHT);
224 READ_WORD(pic_flags, ptr, PIC_FLAGS);
225
226 pic_height *= scaler;
227 pic_width *= scaler;
228
229 READ_BYTE(byte0(pic_data), ptr, PIC_DATA + 2);
230 READ_BYTE(byte1(pic_data), ptr, PIC_DATA + 1);
231 READ_BYTE(byte2(pic_data), ptr, PIC_DATA);
232
233 if (gheader.entry_size > PIC_COLOUR + 2) {
234 READ_BYTE(byte0(pic_colour), ptr,
235 PIC_COLOUR + 2);
236 READ_BYTE(byte1(pic_colour), ptr,
237 PIC_COLOUR + 1);
238 READ_BYTE(byte2(pic_colour), ptr,
239 PIC_COLOUR);
240 } else
241 pic_colour = 0;
242
243 return TRUE;
244 }
245 ptr += gheader.entry_size;
246 }
247
248 /* Close current graphics file */
249 close_graphics_file();
250
251 /* Open next graphics file */
252 open_graphics_file((gheader.link !=
253 0) ? gheader.fileno + 1 : 1);
254
255 } while (fileno != gheader.fileno);
256
257 return FALSE;
258 } /* load_picture_info */
259
260
261 /*
262 * load_colour_map
263 *
264 * Helper function for os_draw_picture. Load a colour map from the
265 * graphics file then copy it to the palette registers.
266 *
267 */
268 static void load_colour_map(int first_colour)
269 {
270 byte rgb[42];
271 int n, i;
272
273 fseek(file, pic_colour, SEEK_SET);
274
275 /* Some pictures from Arthur mistakenly claim to have 16 colours */
276 if ((n = fgetc(file)) == 16)
277 n = 14;
278
279 /* Each colour is stored in three bytes R-G-B */
280 fread(rgb, 3, n, file);
281
282 /* MCGA boards can only handle R-G-B values from 0 to 63 */
283 for (i = 0; i < 42; i++)
284 rgb[i] = (rgb[i] * 63 + 128) / 255;
285
286 /* Synchronise with vertical retrace */
287 while ((inp(0x03da) & 8) == 0) ;
288 while ((inp(0x03da) & 8) == 8) ;
289
290 /* Copy colours to palette registers */
291 bios_video_ax_bx_cx_esdx(0x1012, first_colour, n, rgb);
292 } /* load_colour_map */
293
294
295 /*
296 * draw_picture
297 *
298 * Helper function for os_draw_picture. The real work of drawing a
299 * picture happens here.
300 *
301 */
302 #pragma warn -def
303 static void draw_picture(int y, int x)
304 {
305 static int raise_bits[4] = {
306 0x0100, 0x0300, 0x0700, 0x0000
307 };
308
309 byte buf[512];
310 volatile byte _far *screen;
311 byte transparent;
312 byte colour_shift;
313 int first_colour;
314 int code, prev_code;
315 int next_entry;
316 int bits_per_code;
317 int bits_shift;
318 int bits;
319 int current_y;
320 int current_x;
321 int bufpos;
322 int pixels;
323 int i;
324
325 bufpos = 0;
326
327 /* When the given picture provides a colour map then activate it.
328 This is only used for MCGA pictures; the colour map affects
329 every picture on the screen. The first colour to be defined is
330 colour 2. Every map defines up to 14 colours (colour 2 to 15).
331 These colours are not related to the standard Z-machine colour
332 scheme which remains unchanged. (This is based on the Amiga
333 interpreter which had to work with 16 colours. Colours 0 and 1
334 were used for text; changing the text colours actually changed
335 palette entries 0 and 1. This interface uses the same trick in
336 Amiga mode.) */
337 if (display == _CGA_)
338 colour_shift = -2;
339 if (display == _EGA_)
340 colour_shift = 0;
341 if (display == _MCGA_) {
342 colour_shift = 32;
343 first_colour = 34;
344 }
345 if (display == _AMIGA_) {
346 colour_shift = -1;
347 first_colour = 65;
348 }
349
350 if (pic_colour != 0)
351 load_colour_map(first_colour);
352
353 fseek(file, pic_data, SEEK_SET);
354
355 /* Bit 0 of "flags" indicates that the picture uses a transparent
356 colour, the top four bits tell us which colour it is. For CGA
357 and MCGA pictures this is always 0; for EGA pictures it can be
358 any colour between 0 and 15. */
359 transparent = 0xff;
360
361 if (pic_flags & 1)
362 transparent = pic_flags >> 12;
363
364 /* Prepare EGA hardware for setting pixels */
365 if (display >= _EGA_) {
366 outpw(0x03ce, 0x0205);
367 outpw(0x03ce, 0xff08);
368 }
369
370 /* The uncompressed picture is a long sequence of bytes. Every
371 byte holds the colour of a pixel, starting at the top left,
372 stopping at the bottom right. We keep track of our position
373 in the current line. (There is a special case: CGA pictures
374 with no transparent colour are stored as bit patterns, i.e.
375 every byte holds the pattern for eight pixels. A pixel must
376 be white if the corresponding bit is set, otherwise it must
377 be black.) */
378 current_x = x + pic_width;
379 current_y = y - 1;
380 screen = get_scrnptr(current_y);
381
382 /* The compressed picture is a stream of bits. We read the file
383 byte-wise, storing the current byte in the variable "bits".
384 Several bits make one code; the variable "bits_shift" helps
385 us to build the next code. */
386 bits_shift = 0;
387 bits = 0;
388
389 reset_table:
390
391 /* Clear the table. We use a table of 3840 entries. Each entry
392 consists of both a value and a reference to another table
393 entry. Following these references we get a sequence of
394 values. At the start of decompression all table entries are
395 undefined. Later we see how entries are set and used. */
396 next_entry = 1;
397
398 /* At the start of decompression 9 bits make one code; during
399 the process this can rise to 12 bits per code. 9 bits are
400 sufficient to address both 256 literal values and 256 table
401 entries; 12 bits are sufficient to address both 256 literal
402 values and all 3840 table entries. The number of bits per
403 code rises with the number of table entries. When the table
404 is cleared, the number of bits per code drops back to 9. */
405 bits_per_code = 9;
406
407 next_code:
408
409 /* Read the next code from the graphics file. This requires
410 some confusing bit operations. Note that low bits always
411 come first. Usually there are a few bits left over from
412 the previous code; these bits must be used before further
413 bits are read from the graphics file. */
414 code = bits >> (8 - bits_shift);
415
416 do {
417 bits = fgetc(file);
418 code |= bits << bits_shift;
419 bits_shift += 8;
420 } while (bits_shift < bits_per_code);
421
422 bits_shift -= bits_per_code;
423 code &= 0xfff >> (12 - bits_per_code);
424
425 /* There are two codes with a special meaning. The first one
426 is 256 which clears the table and sets the number of bits
427 per code to 9. (This is necessary when the table is full.)
428 The second one is 257 which marks the end of the picture.
429 For the sake of efficiency, we decrement the code by 256. */
430 code -= 256;
431
432 if (code == 0)
433 goto reset_table;
434 if (code == 1)
435 return;
436
437 /* Codes from 0 to 255 are literals, i.e. they represent a
438 plain byte value. Codes from 258 onwards are references
439 to table entries, i.e. they represent a sequence of byte
440 values (see the remarks on the table above). This means
441 that for each code one or several byte values are added
442 to the decompressed picture. But there is yet more work
443 to do: Every time we read a code one table entry is set.
444 As we said above, a table entry consist of both a value
445 and a reference to another table entry. If the current
446 code is a literal, then the value has to be set to this
447 literal; but if the code refers to a sequence of byte
448 values, then the value has to be set to the last byte of
449 this sequence. In any case, the reference is set to the
450 previous code. Finally, one should be aware that a code
451 may legally refer to the table entry which is currently
452 being set. This requires some extra care. */
453 table_ref[next_entry] = prev_code;
454
455 prev_code = code;
456
457 while (code >= 0) {
458 buf[bufpos++] = table_val[code];
459 code = (short)table_ref[code];
460 }
461
462 if (next_entry == prev_code)
463 buf[0] = code;
464
465 table_val[next_entry] = code;
466
467 /* The number of bits per code is incremented when the current
468 number of bits no longer suffices to address all defined
469 table entries; but in any case the number of bits may never
470 be greater than 12. */
471 next_entry++;
472
473 if (next_entry == raise_bits[bits_per_code - 9])
474 bits_per_code++;
475
476 reverse_buffer:
477
478 /* Append the sequence of byte values (pixels) to the picture.
479 The order of the sequence must be reversed. (This is why we
480 have stored the sequence in a buffer; experiments show that
481 a buffer of 512 bytes suffices.) The sequence of values may
482 spread over several lines of the picture, so we must take
483 care to start a new line when we reach the right border of
484 the picture. */
485 if (current_x == x + pic_width) {
486 screen = get_scrnptr(current_y);
487 current_x -= pic_width;
488 current_y += scaler;
489 }
490
491 /* Either add a single pixel or a pattern of eight bits (b/w
492 CGA pictures without a transparent colour) to the current
493 line. Increment our position by 1 or 8 respectively. The
494 pixel may have to be painted several times if the scaling
495 factor is greater than one. */
496 if (display == _CGA_ && transparent == 0xff) {
497 pixels = x + pic_width - current_x;
498 if (pixels > 8)
499 pixels = 8;
500
501 _asm {
502 les bx, screen
503 mov dx, current_x
504 dec dx
505 push dx
506 mov cl, 3
507 shr dx, cl
508 add bx, dx
509 mov ax, es:[bx]
510 mov dx, 0xffff
511 mov cl, byte ptr pixels
512 shr dl, cl
513 pop cx
514 and cl, 7
515 ror dx, cl
516 and ax, dx
517 mov dx, code
518 inc dh
519 ror dx, cl
520 or ax, dx
521 mov es:[bx], ax
522 }
523
524 current_x += pixels;
525 } else for (i = 0; i < scaler; i++) {
526 _asm {
527 mov ah, byte ptr code
528 cmp ah, transparent
529 jz L4
530 add ah, colour_shift
531 les bx, screen
532 mov dx, current_x
533 dec dx
534 mov si, display
535 cmp si, _MCGA_
536 jz L2
537 push dx
538 mov cl, 3
539 shr dx, cl
540 pop cx
541 and cl, 7
542 add bx, dx
543 mov al, es:[bx]
544 cmp si, _CGA_
545 jnz L1
546 mov dl, 0x7f
547 ror dl, cl
548 and al, dl
549 xor ah, 1
550 ror ah, 1
551 shr ah, cl
552 or ah, al
553 jmp L3
554 L1: mov al, 0x80
555 shr al, cl
556 mov dx, 0x03cf
557 out dx, al
558 jmp L3
559 L2: add bx, dx
560 L3: mov es:[bx], ah
561 cmp si, _AMIGA_
562 jnz L4
563 add bx, 80
564 mov al, es:[bx]
565 mov es:[bx], ah
566 L4:
567 }
568 current_x++;
569 }
570
571 /* If there are no more values in the buffer then read the
572 next code from the file. Otherwise fetch the next byte
573 value from the buffer and continue painting the picture. */
574 if (bufpos == 0)
575 goto next_code;
576
577 code = buf[--bufpos];
578
579 goto reverse_buffer;
580 } /* draw_picture */
581
582 #pragma warn +def
583
584 /*
585 * os_draw_picture
586 *
587 * Display a picture at the given coordinates. Top left is (1,1).
588 *
589 */
590 void os_draw_picture(int picture, int y, int x)
591 {
592 if (load_picture_info(picture))
593 draw_picture(y, x);
594
595 } /* os_draw_picture */
596
597
598 /*
599 * os_peek_colour
600 *
601 * Return the colour of the pixel below the cursor. This is used
602 * by V6 games to print text on top of pictures. The coulor need
603 * not be in the standard set of Z-machine colours. To handle
604 * this situation, Frotz extends the colour scheme: Values above
605 * 15 (and below 256) may be used by the interface to refer to
606 * non-standard colours. Of course, os_set_colour must be able to
607 * deal with these colours. Interfaces which refer to characters
608 * instead of pixels might return the current background colour
609 * instead.
610 *
611 */
612 int os_peek_colour(void)
613 {
614 if (display >= _CGA_)
615 return (int)(byte)bios_video_ah_bh_cx_dx(13, 0,
616 cursor_x, cursor_y) + 16;
617 else
618 return current_bg;
619 } /* os_peek_colour */
620
621
622 /*
623 * os_picture_data
624 *
625 * Return true if the given picture is available. If so, write the
626 * width and height of the picture into the appropriate variables.
627 * Only when picture 0 is asked for, write the number of available
628 * pictures and the release number instead.
629 *
630 */
631
632 bool os_picture_data(int picture, int *height, int *width)
633 {
634 bool avail;
635
636 if (picture == 0) {
637 avail = FALSE;
638
639 /* This is the special case mentioned above. In practice, only
640 the release number is used; and even this is only used by
641 the DOS version of "Zork Zero". Infocom's Amiga interpreter
642 could not handle this feature, and the Amiga version of the
643 story file does not use it. */
644
645 pic_height = gheader.images;
646 pic_width = gheader.version;
647
648 } else
649 avail = load_picture_info(picture);
650
651 *height = pic_height;
652 *width = pic_width;
653
654 return avail;
655 } /* os_picture_data */
+0
-406
src/owdos/owsample.c less more
0 /*
1 * file "owsample.c"
2 *
3 * Open Watcom C front end, sound support
4 *
5 */
6
7 #include <malloc.h>
8 #include <conio.h>
9 #include <dos.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include "frotz.h"
14 #include "owfrotz.h"
15
16 #ifdef SOUND_SUPPORT
17
18 #define SWAP_BYTES(v) { (v) = bswap16(v); }
19
20 #define READ_DSP(v) {while(!inp(sound_adr+14)&0x80);(v)=inp(sound_adr+10);}
21 #define WRITE_DSP(v) {while(inp(sound_adr+12)&0x80);outp(sound_adr+12,(v));}
22
23 extern void end_of_sound(void);
24
25 static struct {
26 word prefix;
27 byte repeats;
28 byte base_note;
29 word frequency;
30 word unused;
31 word length;
32 } sheader;
33
34 static int current_sample = 0;
35
36 static void interrupt(*vect) (void) = NULL;
37
38 static int play_part = 0;
39 static int play_count = 0;
40
41 static word sound_adr = 0;
42 static word sound_irq = 0;
43 static word sound_dma = 0;
44 static word sound_int = 0;
45 static word sound_ver = 0;
46
47 static byte _huge *sample_data = NULL;
48
49 static long sample_adr1 = 0;
50 static long sample_adr2 = 0;
51 static word sample_len1 = 0;
52 static word sample_len2 = 0;
53
54 /*
55 * start_of_dma
56 *
57 * Start the DMA transfer to the sound board.
58 *
59 */
60 static void start_of_dma(long address, unsigned length)
61 {
62 static unsigned dma_page_port[] = {
63 0x87, 0x83, 0x81, 0x82
64 };
65
66 length--;
67
68 /* Set up DMA chip */
69 outp(0x0a, 0x04 | sound_dma);
70 outp(0x0c, 0x00);
71 outp(0x0b, 0x48 | sound_dma);
72 outp(2 * sound_dma, byte0(address));
73 outp(2 * sound_dma, byte1(address));
74 outp(dma_page_port[sound_dma], byte2(address));
75 outp(2 * sound_dma + 1, byte0(length));
76 outp(2 * sound_dma + 1, byte1(length));
77 outp(0x0a, sound_dma);
78
79 /* Play 8-bit mono sample */
80 WRITE_DSP(0x14)
81 WRITE_DSP(byte0(length))
82 WRITE_DSP(byte1(length))
83 } /* start_of_dma */
84
85
86 /*
87 * end_of_dma
88 *
89 * This function is called when a hardware interrupt signals the
90 * end of the current sound. We may have to play the second half
91 * of the sound effect, or we may have to repeat it, or call the
92 * end_of_sound function when we are finished.
93 *
94 */
95 static void interrupt end_of_dma(void)
96 {
97 /* Play the second half, play another cycle or finish */
98 if (play_part == 1 && sample_len2 != 0) {
99 play_part = 2;
100 start_of_dma(sample_adr2, sample_len2);
101 } else if (play_count == 255 || --play_count != 0) {
102 play_part = 1;
103 start_of_dma(sample_adr1, sample_len1);
104 } else {
105 play_part = 0;
106 end_of_sound();
107 }
108
109 /* Tell interrupt controller(s) + sound board we are done */
110 outp(0x20, 0x20);
111
112 if (sound_irq >= 8)
113 outp(0xa0, 0x20);
114
115 inp(sound_adr + 14);
116 } /* end_of_dma */
117
118
119 /*
120 * dos_init_sound
121 *
122 * Initialise the sound board and various sound related variables.
123 *
124 */
125 bool dos_init_sound(void)
126 {
127 const char *settings;
128 word irc_mask_port;
129
130 /* Read the IRQ, port address, DMA channel and SB version */
131 if ((settings = getenv("BLASTER")) == NULL)
132 return FALSE;
133
134 sound_irq = dectoi(strchr(settings, 'I') + 1);
135 sound_adr = hextoi(strchr(settings, 'A') + 1);
136 sound_dma = dectoi(strchr(settings, 'D') + 1);
137 sound_ver = dectoi(strchr(settings, 'T') + 1);
138
139 /* Reset mixer chip and DSP */
140 outp(sound_adr + 4, 0);
141 outp(sound_adr + 5, 0);
142
143 outp(sound_adr + 6, 1);
144 inp(sound_adr + 6);
145 inp(sound_adr + 6);
146 inp(sound_adr + 6);
147 outp(sound_adr + 6, 0);
148
149 /* Turn on speakers */
150 WRITE_DSP(0xd1)
151 /* Install the end_of_dma interrupt */
152 if (sound_irq < 8) {
153 irc_mask_port = 0x21;
154 sound_int = 0x08 + sound_irq;
155 } else {
156 irc_mask_port = 0xa1;
157 sound_int = 0x68 + sound_irq;
158 }
159
160 vect = _dos_getvect(sound_int);
161 _dos_setvect(sound_int, end_of_dma);
162
163 /* Allocate 64KB RAM for sample data */
164 if ((sample_data = (byte _huge *) halloc(0x10000L, 1)) == NULL)
165 return FALSE;
166
167 word0(sample_adr1) = FP_OFF(sample_data) | (FP_SEG(sample_data) << 4);
168 word1(sample_adr1) = FP_SEG(sample_data) >> 12;
169 word0(sample_adr2) = 0;
170 word1(sample_adr2) = word1(sample_adr1) + 1;
171
172 /* Enable the end_of_dma interrupt */
173 outp(0x20, 0x20);
174
175 if (sound_irq >= 8)
176 outp(0xa0, 0x20);
177
178 outp(irc_mask_port,
179 inp(irc_mask_port) & ~(1 << (sound_irq & 7)));
180
181 /* Indicate success */
182 return TRUE;
183
184 } /* init_sound */
185
186
187 /*
188 * dos_reset_sound
189 *
190 * Free resources allocated for playing samples.
191 *
192 */
193 void dos_reset_sound(void)
194 {
195 os_stop_sample(0);
196
197 if (sample_data != NULL) {
198 hfree(sample_data);
199 sample_data = NULL;
200 }
201 if (sound_adr != 0) {
202 _dos_setvect(sound_int, vect);
203 sound_adr = 0;
204 }
205
206 } /* dos_reset_sound */
207
208 #endif /* SOUND_SUPPORT */
209
210
211 /*
212 * os_beep
213 *
214 * Play a beep sound. Ideally, the sound should be high- (number == 1)
215 * or low-pitched (number == 2).
216 *
217 */
218 void os_beep(int number)
219 {
220 word T = 888 * number;
221
222 outp(0x43, 0xb6);
223 outp(0x42, lo(T));
224 outp(0x42, hi(T));
225 outp(0x61, inp(0x61) | 3);
226
227 delay(75);
228
229 outp(0x61, inp(0x61) & ~3);
230 } /* os_beep */
231
232 /*
233 * os_init_sound
234 *
235 * Dummy function to satisfy the core code. DOS Frotz does its sound
236 * initialization in bcinit.c in os_init_screen().
237 *
238 * FIXME: Move the sound initlization from os_init_screen() to here and
239 * somehow work around the ifs.
240 *
241 */
242 void os_init_sound(void)
243 {
244 /* do nothing */
245 }
246
247 /*
248 * os_prepare_sample
249 *
250 * Load the sample from the disk.
251 *
252 */
253 void os_prepare_sample(int number)
254 {
255 #ifdef SOUND_SUPPORT
256
257 os_stop_sample(0);
258
259 /* Exit if the sound board isn't set up properly */
260 if (sample_data == NULL)
261 return;
262 if (sound_adr == 0)
263 return;
264
265 /* Continue only if the desired sample is not already present */
266 if (current_sample != number) {
267
268 char sample_name[MAX_FILE_NAME + 1];
269 char numstr[2];
270 FILE *fp;
271
272 /* Build sample file name */
273 strcpy(sample_name, "sound/");
274
275 numstr[0] = '0' + number / 10;
276 numstr[1] = '0' + number % 10;
277
278 strncat(sample_name, f_setup.story_name, 6);
279 strncat(sample_name, numstr, 2);
280 strncat(sample_name, ".snd", 4);
281
282 /* Open sample file */
283 if ((fp = fopen(sample_name, "rb")) == NULL)
284 return;
285
286 /* Load header and sample data */
287 fread(&sheader, sizeof(sheader), 1, fp);
288
289 SWAP_BYTES(sheader.frequency)
290 SWAP_BYTES(sheader.length)
291 fread(sample_data, 1, sheader.length, fp);
292
293 sample_len1 = -word0(sample_adr1);
294
295 if (sample_len1 > sheader.length || sample_len1 == 0)
296 sample_len1 = sheader.length;
297
298 sample_len2 = sheader.length - sample_len1;
299
300 WRITE_DSP(0x40)
301 WRITE_DSP(256 - 1000000L / sheader.frequency)
302 current_sample = number;
303
304 /* Close sample file */
305 fclose(fp);
306
307 }
308 #endif /* SOUND_SUPPORT */
309 } /* os_prepare_sample */
310
311
312 /*
313 * os_start_sample
314 *
315 * Play the given sample at the given volume (ranging from 1 to 8 and
316 * 255 meaning a default volume). The sound is played once or several
317 * times in the background (255 meaning forever). The end_of_sound
318 * function is called as soon as the sound finishes.
319 *
320 */
321 void os_start_sample(int number, int volume, int repeats, zword eos)
322 {
323 #ifdef SOUND_SUPPORT
324 eos = eos; /* not used in DOS Frotz */
325
326 os_stop_sample(0);
327
328 /* Exit if the sound board isn't set up properly */
329 if (sample_data == NULL)
330 return;
331 if (sound_adr == 0)
332 return;
333
334 /* Load new sample */
335 os_prepare_sample(number);
336
337 /* Continue only if the sample's in memory now */
338 if (current_sample == number) {
339 play_count = repeats;
340
341 if (sound_ver < 6) { /* Set up SB pro mixer chip */
342 volume = (volume != 255) ? 7 + volume : 15;
343 outp(sound_adr + 4, 0x04);
344 outp(sound_adr + 5, (volume << 4) | volume);
345 outp(sound_adr + 4, 0x22);
346 outp(sound_adr + 5, 0xff);
347 } else { /* Set up SB16 mixer chip */
348 /* Many thanks to Linards Ticmanis for writing this part! */
349 volume = (volume != 255) ? 127 + 16 * volume : 255;
350 outp(sound_adr + 4, 0x32);
351 outp(sound_adr + 5, volume);
352 outp(sound_adr + 4, 0x33);
353 outp(sound_adr + 5, volume);
354 outp(sound_adr + 4, 0x30);
355 outp(sound_adr + 5, 0xff);
356 outp(sound_adr + 4, 0x31);
357 outp(sound_adr + 5, 0xff);
358 }
359
360 play_part = 1;
361 start_of_dma(sample_adr1, sample_len1);
362
363 }
364
365 #endif /* SOUND_SUPPORT */
366 } /* os_start_sample */
367
368
369 /*
370 * os_stop_sample
371 *
372 * Turn off the current sample.
373 *
374 */
375 void os_stop_sample(int UNUSED(id))
376 {
377 #ifdef SOUND_SUPPORT
378 play_part = 0;
379
380 /* Exit if the sound board isn't set up properly */
381 if (sample_data == NULL)
382 return;
383 if (sound_adr == 0)
384 return;
385
386 /* Tell DSP to stop the current sample */
387 WRITE_DSP(0xd0)
388 #endif /* SOUND_SUPPORT */
389 } /* os_stop_sample */
390
391
392 /*
393 * os_finish_with_sample
394 *
395 * Remove the current sample from memory (if any).
396 *
397 */
398 void os_finish_with_sample(int UNUSED(id))
399 {
400 #ifdef SOUND_SUPPORT
401
402 os_stop_sample(0); /* we keep 64KB allocated all the time */
403
404 #endif /* SOUND_SUPPORT */
405 } /* os_finish_with_sample */
+0
-266
src/owdos/owscreen.c less more
0 /*
1 * owscreen.c - DOS interface (Open Watcom version), screen manipulation
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <conio.h>
22 #include <dos.h>
23 #include <mem.h>
24 #include "frotz.h"
25 #include "owfrotz.h"
26
27
28 /*
29 * get_scrnptr
30 *
31 * Return a pointer to the given line in video RAM.
32 *
33 */
34 volatile byte _far *get_scrnptr(int y)
35 {
36 if (display == _CGA_)
37 return MK_FP((y & 1) ? 0xba00 : 0xb800, 40 * (y & ~1));
38 else if (display == _MCGA_)
39 return MK_FP(0xa000, 320 * y);
40 else
41 return MK_FP(0xa000, 80 * y);
42 } /* get_scrnptr */
43
44
45 /*
46 * clear_byte
47 *
48 * Helper function for clear_line.
49 *
50 */
51 static void clear_byte(volatile byte _far * scrn, word mask)
52 {
53 if (display == _CGA_)
54 if (scrn_attr == 0)
55 *scrn &= ~mask;
56 else
57 *scrn |= mask;
58 else {
59 outpw(0x03ce, 0x0205);
60 outp(0x03ce, 0x08);
61 outp(0x03cf, mask);
62 video_latch(*scrn);
63 *scrn = scrn_attr;
64 }
65 } /* clear_byte */
66
67
68 /*
69 * clear_line
70 *
71 * Helper function for os_erase_area.
72 *
73 */ static void clear_line(int y, int left, int right)
74 {
75 volatile byte _far *scrn = get_scrnptr(y);
76
77 if (display == _MCGA_)
78 _fmemset((byte _far *)scrn + left, scrn_attr,
79 right - left + 1);
80 else {
81 word mask1 = 0x00ff >> (left & 7);
82 word mask2 = 0xff80 >> (right & 7);
83
84 int x = right / 8 - left / 8;
85
86 scrn += left / 8;
87
88 if (x == 0) {
89 mask1 &= mask2;
90 mask2 = 0;
91 }
92
93 /* Clear first byte */
94 clear_byte(scrn++, mask1);
95
96 /* Clear middle bytes */
97 if (display >= _EGA_)
98 outpw(0x03ce, 0xff08);
99
100 while (--x > 0)
101 *scrn++ = scrn_attr;
102
103 /* Clear last byte */
104 clear_byte(scrn, mask2);
105 }
106 } /* clear_line */
107
108
109 /*
110 * os_erase_area
111 *
112 * Fill a rectangular area of the screen with the current background
113 * colour. Top left coordinates are (1,1). The cursor does not move.
114 *
115 * The final argument gives the window being changed, -1 if only a
116 * portion of a window is being erased, or -2 if the whole screen is
117 * being erased. This is not relevant for the DOS interface, and so
118 * this function ignores that argument.
119 *
120 */
121 void os_erase_area(int top, int left, int bottom, int right, int win)
122 {
123 int y;
124
125 top--;
126 left--;
127 bottom--;
128 right--;
129
130 if (display <= _TEXT_) {
131 bios_video_ax_bh_ch_cl_dh_dl(0x0600, scrn_attr,
132 top, left, bottom, right);
133 } else
134 for (y = top; y <= bottom; y++)
135 clear_line(y, left, right);
136 } /* os_erase_area */
137
138
139 /*
140 * copy_byte
141 *
142 * Helper function for copy_line.
143 *
144 */
145 static void copy_byte(volatile byte _far * scrn1, volatile byte _far * scrn2,
146 byte mask)
147 {
148 int i;
149
150 if (display == _CGA_)
151 *scrn1 = (*scrn1 & ~mask) | (*scrn2 & mask);
152 else {
153 outpw(0x03ce, 0x0005);
154 outp(0x03ce, 0x08);
155 outp(0x03cf, mask);
156 outp(0x03ce, 0x04);
157 outp(0x03c4, 0x02);
158
159 for (i = 0; i < 4; i++) {
160 byte t;
161
162 outp(0x03cf, i);
163 outp(0x03c5, 1 << i);
164
165 t = *scrn2;
166 video_latch(*scrn1);
167 *scrn1 = t;
168 }
169 outp(0x03c5, 0x0f);
170 }
171 } /* copy_byte */
172
173
174 /*
175 * copy_line
176 *
177 * Helper function for os_scroll_area.
178 *
179 */
180 static void copy_line(int y1, int y2, int left, int right)
181 {
182 volatile byte _far *scrn1 = get_scrnptr(y1);
183 volatile byte _far *scrn2 = get_scrnptr(y2);
184
185 if (display == _MCGA_)
186 _fmemcpy((byte _far *)(scrn1 + left),
187 (byte _far *)(scrn2 + left), right - left + 1);
188 else {
189 word mask1 = 0x00ff >> (left & 7);
190 word mask2 = 0xff80 >> (right & 7);
191
192 int x = right / 8 - left / 8;
193
194 scrn1 += left / 8;
195 scrn2 += left / 8;
196
197 if (x == 0) {
198 mask1 &= mask2;
199 mask2 = 0;
200 }
201
202 /* Copy first byte */
203 copy_byte(scrn1++, scrn2++, mask1);
204
205 /* Copy middle bytes */
206 if (display >= _EGA_)
207 outpw(0x03ce, 0x0105);
208
209 while (--x > 0)
210 *scrn1++ = *scrn2++;
211
212 /* Copy last byte */
213 copy_byte(scrn1, scrn2, mask2);
214 }
215 } /* copy_line */
216
217
218 /*
219 * os_scroll_area
220 *
221 * Scroll a rectangular area of the screen up (units > 0) or down
222 * (units < 0) and fill the empty space with the current background
223 * colour. Top left coordinates are (1,1). The cursor stays put.
224 *
225 */
226 void os_scroll_area(int top, int left, int bottom, int right, int units)
227 {
228 int y;
229
230 top--;
231 left--;
232 bottom--;
233 right--;
234
235 if (display <= _TEXT_) {
236 word ax;
237 if (units > 0)
238 ax = 0x0600 | (byte)units;
239 else
240 ax = 0x0700 | (byte)-units;
241 bios_video_ax_bh_ch_cl_dh_dl(ax, scrn_attr, top, left,
242 bottom, right);
243 } else if (units > 0) {
244 for (y = top; y <= bottom; y++) {
245 if (y <= bottom - units)
246 copy_line(y, y + units, left, right);
247 else
248 clear_line(y, left, right);
249 }
250 } else {
251 for (y = bottom; y >= top; y--) {
252 if (y >= top - units)
253 copy_line(y, y + units, left, right);
254 else
255 clear_line(y, left, right);
256 }
257 }
258 } /* os_scroll_area */
259
260
261 bool os_repaint_window(int win, int ypos_old, int ypos_new, int xpos,
262 int ysize, int xsize)
263 {
264 return FALSE;
265 }
+0
-815
src/owdos/owtext.c less more
0 /*
1 * owtext.c - DOS interface (Open Watcom version), text functions
2 *
3 * This file is part of Frotz.
4 *
5 * Frotz is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * Frotz is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Or visit http://www.fsf.org/
19 */
20
21 #include <stdio.h>
22 #include <string.h>
23 #include <conio.h>
24 #include <dos.h>
25 #include "frotz.h"
26 #include "owfrotz.h"
27 #include "fontdata.h"
28
29 extern volatile byte _far *get_scrnptr(int);
30
31 int current_bg = 0;
32 int current_fg = 0;
33 int current_style = 0;
34 int current_font = 0;
35
36 byte text_bg = 0;
37 byte text_fg = 0;
38 byte bg = 0;
39 byte fg = 0;
40 byte scrn_attr = 0;
41
42 int cursor_x = 0;
43 int cursor_y = 0;
44
45 char latin1_to_ascii[] =
46 " ! c L >o<Y | S '' C a << not- R _ "
47 "^0 +/-^2 ^3 ' my P . , ^1 o >> 1/41/23/4? "
48 "A A A A Ae A AE C E E E E I I I I "
49 "Th N O O O O Oe * O U U U Ue Y Th ss "
50 "a a a a ae a ae c e e e e i i i i "
51 "th n o o o o oe : o u u u ue y th y ";
52
53 char latin1_to_ibm[] = {
54 0x20, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5,
55 0xf9, 0xb8, 0xa6, 0xae, 0xaa, 0xf0, 0xa9, 0xee,
56 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa,
57 0xf7, 0xfb, 0xa7, 0xaf, 0xac, 0xab, 0xf3, 0xa8,
58 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80,
59 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8,
60 0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0x9e,
61 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0xe1,
62 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87,
63 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b,
64 0xd0, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6,
65 0x9b, 0x97, 0xa3, 0x96, 0x81, 0xec, 0xe7, 0x98
66 };
67
68 static byte _far *graphics_font = NULL;
69 static byte _far *mcga_font = NULL;
70 static byte _far *mcga_width = NULL;
71 static word _far *serif_font = NULL;
72 static byte _far *serif_width = NULL;
73
74
75 /*
76 * load_fonts
77 *
78 * Load the proportional and graphics fonts. In the release version all
79 * font data is appended to the end of the executable.
80 *
81 */
82 void load_fonts(void)
83 {
84 static word chunk_offset[] = {
85 0x6660,
86 0x6300,
87 0x4A40,
88 0x3180,
89 0x18C0,
90 0x00
91 };
92
93 if (display == _MCGA_) {
94 mcga_font = font_data + chunk_offset[1];
95 mcga_width = (byte *) mcga_font + 0x300;
96 } else
97 graphics_font = font_data + chunk_offset[0];
98
99 if (display == _AMIGA_ && user_font != 0) {
100 serif_font = (word *) (font_data + chunk_offset[1 + user_font]);
101 serif_width = (byte *) serif_font + 0x1800;
102 }
103 } /* load_fonts */
104
105
106 /*
107 * os_font_data
108 *
109 * Return true if the given font is available. The font can be
110 *
111 * TEXT_FONT
112 * PICTURE_FONT
113 * GRAPHICS_FONT
114 * FIXED_WIDTH_FONT
115 *
116 * The font size should be stored in "height" and "width". If the given
117 * font is unavailable then these values must _not_ be changed.
118 *
119 */
120 int os_font_data(int font, int *height, int *width)
121 {
122 /* All fonts of this interface have the same size */
123 *height = z_header.font_height;
124 *width = z_header.font_width;
125
126 /* Not every font is available in every mode */
127 if (font == TEXT_FONT)
128 return TRUE;
129 if (font == GRAPHICS_FONT && (display == _CGA_ || display >= _EGA_))
130 return TRUE;
131 if (font == FIXED_WIDTH_FONT)
132 return TRUE;
133
134 /* Unavailable font */
135 return FALSE;
136 } /* os_font_data */
137
138
139 /*
140 * switch_scrn_attr
141 *
142 * Parts of the screen are usually erased to background colour. However,
143 * for deleting text in the input routine it can be useful to erase to
144 * the current text background colour. The two colours can be different,
145 * for example when the reverse text style is used. This helper function
146 * toggles between the two possible behaviours.
147 *
148 */
149 void switch_scrn_attr(bool flag)
150 {
151 byte scrn_bg;
152 byte scrn_fg;
153
154 if (flag) {
155 scrn_bg = text_bg;
156 scrn_fg = text_fg;
157 } else {
158 scrn_bg = bg;
159 scrn_fg = fg;
160 }
161
162 if (display <= _TEXT_)
163 scrn_attr = (scrn_bg << 4) | scrn_fg;
164 else if (display == _CGA_)
165 scrn_attr = (scrn_bg != BLACK) ? 0xff : 0x00;
166 else
167 scrn_attr = scrn_bg;
168 } /* switch_scrn_attr */
169
170
171 /*
172 * adjust_style
173 *
174 * Set the current colours. This combines the current colour selection
175 * and the current text style.
176 *
177 */
178 static void adjust_style(void)
179 {
180 static byte amiga_palette[][3] = {
181 {0x00, 0x00, 0x00},
182 {0x2a, 0x00, 0x00},
183 {0x00, 0x2a, 0x00},
184 {0x3f, 0x3f, 0x15},
185 {0x00, 0x00, 0x2a},
186 {0x2a, 0x00, 0x2a},
187 {0x00, 0x2a, 0x2a},
188 {0x3f, 0x3f, 0x3f},
189 {0x30, 0x30, 0x30},
190 {0x20, 0x20, 0x20},
191 {0x10, 0x10, 0x10},
192 };
193
194 static byte pc_colour[] = {
195 BLACK,
196 RED,
197 GREEN,
198 YELLOW,
199 BLUE,
200 MAGENTA,
201 CYAN,
202 WHITE,
203 DARKGRAY
204 };
205
206 static byte palette_bg = 0xff;
207 static byte palette_fg = 0xff;
208
209 fg = current_fg;
210 bg = current_bg;
211
212 /* V6 game, Amiga mode: Alter the palette registers if the colours
213 of window 0 have changed. DAC register #79 holds the foreground,
214 DAC register #64 the background colour. */
215
216 if (display == _AMIGA_ && z_header.version == V6 && cwin == 0) {
217 if (fg < 16 && fg != palette_fg) {
218 byte R = amiga_palette[fg - 2][0];
219 byte G = amiga_palette[fg - 2][1];
220 byte B = amiga_palette[fg - 2][2];
221
222 bios_video_ax_bx_dh_ch_cl(0x1010, 79, R, G, B);
223
224 palette_fg = fg;
225 }
226
227 if (bg < 16 && bg != palette_bg) {
228 byte R = amiga_palette[bg - 2][0];
229 byte G = amiga_palette[bg - 2][1];
230 byte B = amiga_palette[bg - 2][2];
231
232 bios_video_ax_bx_dh_ch_cl(0x1010, 64, R, G, B);
233
234 palette_bg = bg;
235
236 }
237
238 }
239
240 /* Handle colours */
241 if (fg < 16) {
242 if (display == _MONO_)
243 fg = (fg == WHITE_COLOUR) ? LIGHTGRAY : BLACK;
244 else if (z_header.version == V6 && display == _AMIGA_)
245 fg = (palette_fg == fg) ? 15 : 0;
246 else
247 fg = pc_colour[fg - 2];
248 } else
249 fg -= 16;
250
251 if (bg < 16) {
252 if (display == _MONO_)
253 bg = (bg == WHITE_COLOUR) ? LIGHTGRAY : BLACK;
254 else if (z_header.version == V6 && display == _AMIGA_)
255 bg = (palette_bg == bg) ? 0 : 15;
256 else
257 bg = pc_colour[bg - 2];
258
259 } else
260 bg -= 16;
261
262 /* Handle reverse text style */
263 if (current_style & REVERSE_STYLE) {
264 text_fg = (user_reverse_fg != -1) ? user_reverse_fg : bg;
265 text_bg = (user_reverse_bg != -1) ? user_reverse_bg : fg;
266 } else {
267 text_fg = fg;
268 text_bg = bg;
269 }
270
271 /* Handle emphasis style */
272 if (current_style & EMPHASIS_STYLE) {
273 if (display == _MONO_ && text_bg == BLACK)
274 text_fg = BLUE; /* blue in monochrome mode is underlined */
275 if (display == _TEXT_)
276 text_fg =
277 (user_emphasis != -1) ? user_emphasis : YELLOW;
278 }
279
280 /* Handle boldface style */
281 if (current_style & BOLDFACE_STYLE) {
282 if (display == _MONO_)
283 text_fg = WHITE;
284 if (display == _TEXT_)
285 text_fg ^= 8;
286
287 }
288
289 /* Set the screen attribute for scrolling and erasing */
290 switch_scrn_attr(FALSE);
291 } /* adjust_style */
292
293
294 /*
295 * os_set_colour
296 *
297 * Set the foreground and background colours which can be:
298 *
299 * DEFAULT_COLOUR
300 * BLACK_COLOUR
301 * RED_COLOUR
302 * GREEN_COLOUR
303 * YELLOW_COLOUR
304 * BLUE_COLOUR
305 * MAGENTA_COLOUR
306 * CYAN_COLOUR
307 * WHITE_COLOUR
308 *
309 * MS-DOS 320 columns MCGA mode only:
310 *
311 * GREY_COLOUR
312 *
313 * Amiga only:
314 *
315 * LIGHTGREY_COLOUR
316 * MEDIUMGREY_COLOUR
317 * DARKGREY_COLOUR
318 *
319 * There may be more colours in the range from 16 to 255; see the remarks
320 * on os_peek_colour.
321 *
322 */
323 void os_set_colour(int new_foreground, int new_background)
324 {
325 current_fg = new_foreground;
326 current_bg = new_background;
327
328 /* Apply changes */
329 adjust_style();
330
331 } /* os_set_colour */
332
333
334 /*
335 * os_set_text_style
336 *
337 * Set the current text style. Following flags can be set:
338 *
339 * REVERSE_STYLE
340 * BOLDFACE_STYLE
341 * EMPHASIS_STYLE (aka underline aka italics)
342 * FIXED_WIDTH_STYLE
343 *
344 */
345 void os_set_text_style(int new_style)
346 {
347 current_style = new_style;
348
349 /* Apply changes */
350 adjust_style();
351
352 } /* os_set_text_style */
353
354
355 /*
356 * os_set_font
357 *
358 * Set the font for text output. The interpreter takes care not to
359 * choose fonts which aren't supported by the interface.
360 *
361 */
362 void os_set_font(int new_font)
363 {
364 current_font = new_font;
365 } /* os_set_font */
366
367
368 /*
369 * write_pattern
370 *
371 * Helper function for drawing characters in EGA and Amiga mode.
372 *
373 */
374 void write_pattern(volatile byte _far * screen, byte val, byte mask)
375 {
376 byte bg = text_bg, fg = text_fg;
377 if (mask != 0) {
378 if (display == _CGA_) {
379 if (bg == BLACK)
380 *screen &= ~mask;
381 if (bg == WHITE)
382 *screen |= mask;
383 if (fg != bg)
384 *screen ^= val;
385 } else if (display == _MCGA_) {
386 byte i;
387
388 for (i = 0x80; (mask & i) != 0; i >>= 1)
389 *screen++ = (val & i) ? fg : bg;
390 } else {
391 outp(0x3cf, mask);
392 video_latch(*screen);
393 *screen = bg;
394
395 outp(0x3cf, val);
396 video_latch(*screen);
397 *screen = fg;
398 }
399 }
400 } /* write_pattern */
401
402
403 /*
404 * os_display_char
405 *
406 * Display a character of the current font using the current colours and
407 * text style. The cursor moves to the next position. Printable codes are
408 * all ASCII values from 32 to 126, ISO Latin-1 characters from 160 to
409 * 255, ZC_GAP (gap between two sentences) and ZC_INDENT (paragraph
410 * indentation). The screen should not be scrolled after printing to the
411 * bottom right corner.
412 *
413 */ void os_display_char(zchar c)
414 {
415 int width = os_char_width(c);
416
417 /* Handle accented characters */
418 if (c >= ZC_LATIN1_MIN
419 && (story_id != BEYOND_ZORK || (z_header.flags & GRAPHICS_FLAG)))
420 if (display == _CGA_ || display == _MCGA_) {
421 char *ptr = latin1_to_ascii + 3 * (c - ZC_LATIN1_MIN);
422
423 char c1 = *ptr++;
424 char c2 = *ptr++;
425 char c3 = *ptr++;
426
427 os_display_char(c1);
428
429 if (c2 != ' ')
430 os_display_char(c2);
431 if (c3 != ' ')
432 os_display_char(c3);
433
434 return;
435
436 } else if (display == _AMIGA_ && current_font == TEXT_FONT
437 && !(current_style & FIXED_WIDTH_STYLE)
438 && user_font != 0) {
439
440 if (c >= ZC_LATIN1_MIN)
441 c -= 32;
442 } else
443 c = latin1_to_ibm[c - ZC_LATIN1_MIN];
444
445 /* Handle special indentations */
446 if (c == ZC_INDENT) {
447 os_display_char(' ');
448 os_display_char(' ');
449 os_display_char(' ');
450 return;
451 }
452 if (c == ZC_GAP) {
453 os_display_char(' ');
454 os_display_char(' ');
455 return;
456 }
457
458 /* Display character */
459 if (display <= _TEXT_) {
460 bios_video_ah_bh_dh_dl(2, 0, cursor_y, cursor_x);
461 bios_video_ah_al_bh_bl_cx(9, c, 0, text_bg << 4 | text_fg, 1);
462 } else {
463
464 void _far *table;
465 word mask;
466 word val;
467 byte mask0;
468 byte mask1;
469 int align;
470 int underline;
471 int boldface;
472 int type;
473
474 int shift = (display != _MCGA_) ? cursor_x % 8 : 0;
475 int offset = (display != _MCGA_) ? cursor_x / 8 : cursor_x;
476
477 int i;
478
479 if (current_font == GRAPHICS_FONT) {
480 table = graphics_font + 8 * (c - 32);
481 mask = 0xff;
482 underline = -1;
483 boldface = -1;
484 align = 0;
485 type = 1;
486 } else if (display == _AMIGA_ && current_font == TEXT_FONT
487 && !(current_style & FIXED_WIDTH_STYLE)
488 && user_font != 0) {
489 table = serif_font + 16 * (c - 32);
490 mask = 0xffff << (16 - width);
491 underline = 14;
492 boldface = 1;
493 align = 0;
494 type = 2;
495 } else if (display == _CGA_) {
496 table = (byte _far *) MK_FP(0xf000, 0xfa6e) + 8 * c;
497 mask = 0xff;
498 underline = 7;
499 boldface = (user_bold_typing != -1) ? 1 : -1;
500 align = 0;
501 type = 3;
502 } else if (display >= _EGA_) {
503 table = (byte _far *) _dos_getvect(0x43) + z_header.font_height * c;
504 mask = 0xff;
505 underline = z_header.font_height - 1;
506 boldface = (user_bold_typing != -1) ? 1 : -1;
507 align = 0;
508 type = 3;
509 } else {
510 table = mcga_font + 8 * (c - 32);
511 mask = 0xff & (0xff << (8 - width));
512 underline = 7;
513 boldface = -1;
514 align = (width + 1 - mcga_width[c - 32]) / 2;
515 type = 3;
516 }
517
518 mask0 = mask >> shift;
519 mask1 = mask << (8 - shift);
520
521 if (!(current_style & BOLDFACE_STYLE))
522 boldface = -1;
523 if (!(current_style & EMPHASIS_STYLE))
524 underline = -1;
525
526 if (display >= _EGA_) {
527 outpw(0x03ce, 0x0205);
528 outpw(0x03ce, 0xff08);
529 }
530
531 for (i = 0; i < z_header.font_height; i++) {
532 volatile byte _far *screen =
533 get_scrnptr(cursor_y + i) + offset;
534
535 if (type == 1) {
536 val =
537 *((byte _far *) table +
538 8 * i / z_header.font_height);
539 }
540 if (type == 2)
541 val = *((word _far *) table + i);
542 if (type == 3)
543 val = *((byte _far *) table + i);
544
545 if (align != 0)
546 val >>= align;
547
548 if (boldface == 1)
549 val |= val >> 1;
550 if (underline == i)
551 val ^= mask;
552
553 if (type == 2)
554 write_pattern(screen++, val >> (8 + shift),
555 mask >> (8 + shift));
556
557 write_pattern(screen + 0, val >> shift, mask0);
558 write_pattern(screen + 1, val << (8 - shift), mask1);
559 }
560 }
561
562 /* Move cursor to next position */
563 cursor_x += width;
564 } /* os_display_char */
565
566
567 /*
568 * os_display_string
569 *
570 * Pass a string of characters to os_display_char.
571 *
572 */
573 void os_display_string(const zchar * s)
574 {
575 zchar c;
576
577 while ((c = *s++) != 0) {
578 if (c == ZC_NEW_FONT || c == ZC_NEW_STYLE) {
579
580 int arg = *s++;
581
582 if (c == ZC_NEW_FONT)
583 os_set_font(arg);
584 if (c == ZC_NEW_STYLE)
585 os_set_text_style(arg);
586
587 } else
588 os_display_char(c);
589 }
590 } /* os_display_string */
591
592
593 /*
594 * os_char_width
595 *
596 * Return the width of the character in screen units.
597 *
598 */
599
600 int os_char_width(zchar c)
601 {
602 /* Handle accented characters */
603 if (c >= ZC_LATIN1_MIN
604 && (story_id != BEYOND_ZORK || (z_header.flags & GRAPHICS_FLAG)))
605 if (display == _CGA_ || display == _MCGA_) {
606
607 const char *ptr =
608 latin1_to_ascii + 3 * (c - ZC_LATIN1_MIN);
609
610 int width = 0;
611
612 char c1 = *ptr++;
613 char c2 = *ptr++;
614 char c3 = *ptr++;
615
616 width = os_char_width(c1);
617
618 if (c2 != ' ')
619 width += os_char_width(c2);
620 if (c3 != ' ')
621 width += os_char_width(c3);
622
623 return width;
624
625 } else if (display == _AMIGA_ && current_font == TEXT_FONT
626 && !(current_style & FIXED_WIDTH_STYLE)
627 && user_font != 0)
628 if (c >= ZC_LATIN1_MIN)
629 c -= 32;
630
631 /* Handle special indentations */
632 if (c == ZC_INDENT)
633 return 3 * os_char_width(' ');
634 if (c == ZC_GAP)
635 return 2 * os_char_width(' ');
636
637 /* Calculate width */
638 if (display <= _TEXT_)
639 return 1;
640 if (display == _CGA_)
641 return 8;
642 if (display == _EGA_)
643 return 8;
644
645 if (current_font == GRAPHICS_FONT)
646 return 8;
647 if (current_font == FIXED_WIDTH_FONT
648 || (current_style & FIXED_WIDTH_STYLE) || (display == _AMIGA_
649 && user_font == 0))
650 return (display == _AMIGA_) ? 8 : 5;
651
652 if (display == _MCGA_)
653 return mcga_width[c - 32];
654 if (display == _AMIGA_)
655 return serif_width[c - 32] +
656 ((current_style & BOLDFACE_STYLE) ? 1 : 0);
657
658 return 0;
659 } /* os_char_width */
660
661
662 /*
663 * os_string_width
664 *
665 * Calculate the length of a word in screen units. Apart from letters,
666 * the word may contain special codes:
667 *
668 * ZC_NEW_STYLE - next character is a new text style
669 * ZC_NEW_FONT - next character is a new font
670 *
671 */
672 int os_string_width(const zchar * s)
673 {
674 int width = 0;
675
676 int saved_font = current_font;
677 int saved_style = current_style;
678
679 zchar c;
680
681 while ((c = *s++) != 0) {
682 if (c == ZC_NEW_STYLE || c == ZC_NEW_FONT) {
683
684 int arg = *s++;
685
686 if (c == ZC_NEW_FONT)
687 current_font = arg;
688 if (c == ZC_NEW_STYLE)
689 current_style = arg;
690
691 } else
692 width += os_char_width(c);
693 }
694 current_font = saved_font;
695 current_style = saved_style;
696
697 return width;
698 } /* os_string_width */
699
700
701 /*
702 * os_set_cursor
703 *
704 * Place the text cursor at the given coordinates. Top left is (1,1).
705 *
706 */
707 void os_set_cursor(int y, int x)
708 {
709 cursor_y = y - 1;
710 cursor_x = x - 1;
711 } /* os_set_cursor */
712
713
714 /*
715 * os_more_prompt
716 *
717 * Display a MORE prompt, wait for a keypress and remove the MORE
718 * prompt from the screen.
719 *
720 */
721 void os_more_prompt(void)
722 {
723 int saved_x;
724
725 /* Save text font and style */
726 int saved_font = current_font;
727 int saved_style = current_style;
728
729 /* Choose plain text style */
730 current_font = TEXT_FONT;
731 current_style = 0;
732
733 adjust_style();
734
735 /* Wait until the user presses a key */
736 saved_x = cursor_x;
737 os_display_string((zchar *) "[MORE]");
738 os_read_key(0, TRUE);
739
740 os_erase_area(cursor_y + 1,
741 saved_x + 1, cursor_y + z_header.font_height, cursor_x + 1, -1);
742
743 cursor_x = saved_x;
744
745 /* Restore text font and style */
746 current_font = saved_font;
747 current_style = saved_style;
748
749 adjust_style();
750 } /* os_more_prompt */
751
752 /*
753 * os_from_true_colour
754 *
755 * Given a true colour, return an appropriate colour index.
756 *
757 * This currently follows xfrotz's "pretty brain-dead" (but very much working)
758 * implementation.
759 *
760 */
761 int os_from_true_colour(zword colour)
762 {
763 if (colour == 0xfffe)
764 return 0;
765 else if (colour == 0xffff)
766 return 1;
767 else {
768 int r = colour & 0x001F;
769 int g = colour & 0x03E0;
770 int b = colour & 0x7C00;
771 int index = (r ? 4 : 0) | (g ? 2 : 0) | (b ? 1 : 0);
772
773 switch (index) {
774 case 0: return 2;
775 case 1: return 6;
776 case 2: return 4;
777 case 3: return 8;
778 case 4: return 3;
779 case 5: return 7;
780 case 6: return 5;
781 case 7: return 9;
782 default: return 1; /* Can't happen */
783 }
784 }
785 return 0;
786 }
787
788 /*
789 * os_to_true_colour
790 *
791 * Given a colour index, return the appropriate true colour.
792 *
793 * This currently follows xfrotz's implementation.
794 *
795 */
796 zword os_to_true_colour(int index)
797 {
798 switch (index) {
799 case 0: return -2;
800 case 1: return -1;
801 case 2: return 0x0000;
802 case 3: return 0x001D;
803 case 4: return 0x0340;
804 case 5: return 0x03BD;
805 case 6: return 0x59A0;
806 case 7: return 0x7C1F;
807 case 8: return 0x77A0;
808 case 9: return 0x7FFF;
809 case 10: return 0x5AD6;
810 case 11: return 0x4631;
811 case 12: return 0x2D6B;
812 default: return 0x0000;
813 }
814 }
3737 /* Paths where z-files may be found */
3838 #define PATH1 "ZCODE_PATH"
3939 #define PATH2 "INFOCOM_PATH"
40
41 #define CONFIG_FILE ".sfrotzrc"
42
43 #define DEFAULT_WIDTH 640
44 #define DEFAULT_HEIGHT 400
4045
4146 #define MAX(x,y) ((x)>(y)) ? (x) : (y)
4247 #define MIN(x,y) ((x)<(y)) ? (x) : (y
98103 extern int m_frequency;
99104
100105 extern double m_gamma;
106 extern double m_xscale;
107 extern double m_yscale;
101108
102109 extern bool sdl_active;
103110
2727
2828 #include <ft2build.h>
2929 #include FT_FREETYPE_H
30 #include <freetype2/freetype/freetype.h>
30 #include <freetype/freetype.h>
3131
3232 #include "sf_font3ttf.h"
3333
4646
4747 /* various data */
4848 bool m_tandy = 0;
49 int m_v6scale;
49 int m_v6scale_x;
50 int m_v6scale_y;
5051 double m_gfxScale_w = 1.0;
5152 double m_gfxScale_h = 1.0;
5253 ulong m_defaultFore;
6364 bool m_aafonts = 0;
6465 char m_names_format = 0;
6566 char *m_reslist_file = NULL;
66 char *m_setupfile = ".sfrotzrc";
6767 extern int m_frequency;
6868
6969 bool sdl_active;
7676 static char *ResPict = "PIC%d";
7777 static char *ResSnd = "SND%d";
7878
79 int AcWidth = 640, AcHeight = 400;
79 int AcWidth = DEFAULT_WIDTH;
80 int AcHeight = DEFAULT_HEIGHT;
81
8082 int option_scrollback_buffer = 0;
8183 bool option_disable_color = 0;
8284 bool m_adaptiveMode = FALSE;
8385
86 bb_resolution_t *reso;
87
8488 static void checkwidths()
8589 {
86 bb_resolution_t *reso;
8790 reso = bb_get_resolution(blorb_map);
8891 if (reso) {
8992 /* ignore small resolution hints */
122125 checkwidths();
123126 bb_count_resources(blorb_map, bb_ID_Pict, &countedpics, NULL,
124127 &maxlegalpic);
128
125129 releaseno = bb_get_release_num(blorb_map);
126130 if (bb_load_chunk_by_type (blorb_map,
127131 bb_method_Memory,
393397 {
394398 char *p;
395399
396 sf_InitProfile(m_setupfile);
400 sf_InitProfile(f_setup.config_file);
397401
398402 m_aafonts = sf_GetProfileInt("Fonts", "antialias", 0);
399403 m_fontdir = sf_GetProfileString("Fonts", "fontdir", NULL);
432436 AcHeight = sf_GetProfileInt("Window", "AcHeight", AcHeight);
433437
434438 m_frequency = sf_GetProfileInt("Audio", "Frequency", m_frequency);
435 m_v6scale = sf_GetProfileInt("Display", "Infocom V6 Scaling", 2);
439 m_v6scale_x = sf_GetProfileInt("Display", "Infocom V6 Scaling X", 2);
440 m_v6scale_y = sf_GetProfileInt("Display", "Infocom V6 Scaling Y", 2);
436441 m_gfxScale_w = 1.0;
437442 m_gfxScale_h = 1.0;
438443 sf_initcolours();
641646
642647 /* Set the graphics scaling */
643648 if (sf_IsInfocomV6() || (story_id == BEYOND_ZORK)) {
644 m_gfxScale_w = (double)m_v6scale;
645 m_gfxScale_h = (double)m_v6scale;
649 /* EGA's 640x200 mode has rectangular pixels that are
650 * narrower than they are tall. For Infocom's V6 EGA
651 * graphics to look correct, the X scale must be halved.
652 */
653 if (reso != NULL && (reso->px == 640 && reso->py == 200))
654 m_v6scale_x /= 2.0;
655
656 m_gfxScale_w = (double)m_v6scale_x;
657 m_gfxScale_h = (double)m_v6scale_y;
646658 } else {
647659 m_gfxScale_w = 1.0;
648660 m_gfxScale_h = 1.0;
649661 }
650 m_gfxScale_w *= (double) AcWidth /640.0;
651 m_gfxScale_h *= (double) AcHeight /400.0;
662
663 if (m_xscale > 0.0)
664 m_gfxScale_w *= m_xscale;
665
666 if (m_yscale > 0.0)
667 m_gfxScale_h *= m_yscale;
652668
653669 /* Set the configuration */
654670 if (z_header.version == V3) {
11091125
11101126 void os_init_setup(void)
11111127 {
1128 f_setup.config_file = strdup(CONFIG_FILE);
11121129 sf_setdialog();
11131130 sf_initloader();
11141131 sdl_active = FALSE;
186186 static void stopsample()
187187 {
188188 if (!e_sfx)
189 return;
190 if (!e_sfx->ended)
189191 return;
190192 e_sfx->active = 0;
191193 Mix_HaltChannel(0);
434436 {
435437 if ((e_sfx) && (e_sfx->ended)) {
436438 e_sfx->ended = 0;
437 if (e_sfx->eos) {
439 if (z_header.version <= V4 || e_sfx->eos) {
438440 end_of_sound_flag = 1;
439441 end_of_sound();
440442 }
441443 }
442444 if ((e_mod) && (e_mod->ended)) {
443445 e_mod->ended = 0;
444 if (e_mod->eos) {
446 if (z_header.version <= V4 || e_mod->eos) {
445447 end_of_sound_flag = 1;
446448 end_of_sound();
447449 }
3636
3737 #ifdef UNIX
3838 #include <unistd.h>
39 #include <getopt.h>
3940 #endif
4041
4142 extern f_setup_t f_setup;
133134 int m_fullscreen = -1;
134135 int m_reqW = 0, m_reqH = 0;
135136 int m_vga_fonts = 0;
136 extern char *m_setupfile;
137137 extern char m_names_format;
138138 static char user_names_format = 0;
139139 extern char *m_reslist_file;
150150 "-A watch attribute testing",
151151 "-b <colourname> background colour",
152152 "-c # context lines",
153 "-C <file> load this configuration file",
153154 "-d disable color",
154155 "-f <colorname> foreground colour",
155156 "-F fullscreen mode",
195196 "More options and information are in the manual page. Type \"man sfrotz\".\n";
196197
197198
198 #define WIDCOL 40
199 #define WIDCOL 42
199200 static void usage(int type)
200201 {
201202 char **p;
247248
248249 static const char *progname = NULL;
249250
250 /*
251251 extern char *optarg;
252252 extern int optind;
253 */
254253
255254 extern int m_timerinterval;
256255
257 static char *options = "@:%aAb:B:c:df:FH:iI:l:L:m:N:oOPqr:s:S:tTu:vVW:xXZ:";
256 double m_xscale = 0;
257 double m_yscale = 0;
258
259 static int xscale_flag = 0;
260 static int yscale_flag = 0;
261
262 static char *options = "@:%aAb:B:c:C:df:FH:iI:l:L:m:N:oOPqr:s:S:tTu:vVW:xXZ:";
263 static struct option long_options[] = {
264 {"xscale", required_argument, &xscale_flag, 1},
265 {"yscale", required_argument, &yscale_flag, 1},
266 {0, 0, 0, 0}
267 };
258268
259269 static int limit(int v, int m, int M)
260270 {
272282
273283 do {
274284 int num = 0, copt = 0;;
275
276 c = zgetopt(argc, argv, options);
277
278 if (zoptarg != NULL) {
279 num = atoi(zoptarg);
280 copt = zoptarg[0];
285 int option_index = 0;
286
287 c = getopt_long(argc, argv, options, long_options, &option_index);
288
289 if (optarg != NULL) {
290 num = atoi(optarg);
291 copt = optarg[0];
281292 }
282293
294 if (c == 0) {
295 if (xscale_flag)
296 m_xscale = atof(optarg);
297 if (yscale_flag)
298 m_yscale = atof(optarg);
299 }
283300 if (c == '%')
284301 m_localfiles = true;
285302 if (c == 'a')
287304 if (c == 'A')
288305 f_setup.attribute_testing = 1;
289306 if (c == 'b')
290 user_background = getcolor(zoptarg);
307 user_background = getcolor(optarg);
291308 if (c == 'B')
292309 option_scrollback_buffer = num;
293310 if (c == 'c')
294311 f_setup.context_lines = num;
312 if (c == 'C') {
313 /* originally allocated in os_init_setup() */
314 free(f_setup.config_file);
315 f_setup.config_file = strdup(optarg);
316 }
295317 if (c == 'd')
296318 option_disable_color = 1;
297319 if (c == 'm')
299321 if (c == 'N')
300322 user_names_format = copt;
301323 if (c == '@')
302 m_reslist_file = zoptarg;
324 m_reslist_file = optarg;
303325 if (c == 'f')
304 user_foreground = getcolor(zoptarg);
326 user_foreground = getcolor(optarg);
305327 if (c == 'F')
306328 m_fullscreen = 1;
307329 if (c == 'H')
316338 f_setup.left_margin = num;
317339 if (c == 'L') {
318340 f_setup.restore_mode = TRUE;
319 f_setup.tmp_save_name = strdup(zoptarg);
341 f_setup.tmp_save_name = strdup(optarg);
320342 }
321343 if (c == 'q')
322344 m_no_sound = 1;
414436 {
415437 char *p;
416438
417 zoptarg = NULL;
439 optarg = NULL;
418440
419441 sf_installhandlers();
442
443 /* Parse command line first because we might be told to load a
444 * different config file. Then read from that config file.
445 * Finally we parse the command line again because options
446 * specified there must override the config file.
447 */
448 parse_options(argc, argv);
420449 sf_readsettings();
421450 parse_options(argc, argv);
422451
423 if (argv[zoptind] == NULL) {
452 if (argv[optind] == NULL) {
424453 usage(USAGE_NORMAL);
425454 os_quit(EXIT_SUCCESS);
426455 }
427 f_setup.story_file = strdup(argv[zoptind]);
428
429 if (argv[zoptind + 1] != NULL)
430 f_setup.blorb_file = argv[zoptind + 1];
456 f_setup.story_file = strdup(argv[optind]);
457
458 if (argv[optind + 1] != NULL)
459 f_setup.blorb_file = argv[optind + 1];
431460
432461 /* Strip path and extension off the story file name */
433462 f_setup.story_name = new_basename(f_setup.story_file);
450479 *p = '\0'; /* extension removed */
451480 }
452481 }
453 f_setup.story_path = new_dirname(argv[zoptind]);
482 f_setup.story_path = new_dirname(argv[optind]);
454483
455484 /* Create nice default file names */
456485 f_setup.script_name = malloc((strlen(f_setup.story_name) + strlen(EXT_SCRIPT) + 1) * sizeof(char));
00 # For GNU Make.
11
2 SOURCES = x_init.c x_input.c x_pic.c x_sample.c x_screen.c x_text.c x_blorb.c
2 SOURCES = x_init.c x_input.c x_pic.c x_oldpic.c x_sample.c x_screen.c x_text.c x_blorb.c
33 OBJECTS = $(SOURCES:.c=.o)
44 HEADERS = x_frotz.h x_setup.h x_blorb.h
55
1313 SOUND ?= ao
1414
1515 CFLAGS += -DNO_SOUND
16 CFLAGS += `pkg-config $(X11_PKGS) --cflags`
1617
1718 .PHONY: clean
1819 .SUFFIXES: .bdf .c .o .pcf
4949
5050 void x_init_colour(char *bg_name, char *fg_name);
5151
52 bool x_init_pictures(void);
5253 #endif
553553 }
554554 bgpm = XCreatePixmap(dpy, main_window, X_WIDTH, X_HEIGHT, DefaultDepth(dpy,DefaultScreen(dpy)));
555555 XSetWindowBackgroundPixmap(dpy, main_window, bgpm);
556 x_init_pictures();
556557
557558 } /* os_init_screen */
558559
0 /*
1 * x_oldpic.c
2 *
3 * X interface, stubs for picture functions
4 *
5 * This file is part of Frotz.
6 *
7 * Frotz is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * Frotz is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 * Or visit http://www.fsf.org/
21 *
22 * Copyright (c) 1998-2000 Daniel Schepler
23 *
24 */
25
26 #include "x_frotz.h"
27
28 #ifdef NO_BLORB
29
30 #include <X11/Xutil.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 struct picture_data {
36 int number, width, height, flags, data, colour;
37 };
38
39
40 static FILE *graphics_fp = NULL;
41 static struct {
42 int fileno, flags, unused1, images, link, entry_size,
43 padding, checksum, unused2, version;
44 } gheader;
45 struct picture_data *gtable;
46
47
48 static int read_word(FILE * fp)
49 {
50 int result;
51
52 result = fgetc(fp);
53 result |= fgetc(fp) << 8;
54 return result;
55 }
56
57
58 static int open_graphics_file(void)
59 {
60 char *graphics_name;
61 const char *base_start, *base_end;
62 int i;
63
64 base_start = strrchr(f_setup.story_name, '/');
65 if (base_start)
66 base_start++;
67 else
68 base_start = f_setup.story_name;
69 base_end = strrchr(base_start, '.');
70 if (!base_end)
71 base_end = strchr(base_start, 0);
72
73 if (f_setup.blorb_file == NULL) {
74 graphics_name = malloc(base_end - f_setup.story_name + 5);
75 sprintf(graphics_name, "%.*s.mg1", (int)(base_end - f_setup.story_name),
76 f_setup.story_name);
77 } else
78 graphics_name = f_setup.blorb_file;
79
80 if ((graphics_fp = fopen(graphics_name, "r")) == NULL)
81 os_fatal("Unable to open graphics file: %s", graphics_name);
82
83 gheader.fileno = fgetc(graphics_fp);
84 gheader.flags = fgetc(graphics_fp);
85 gheader.unused1 = read_word(graphics_fp);
86 gheader.images = read_word(graphics_fp);
87 gheader.link = read_word(graphics_fp);
88 gheader.entry_size = fgetc(graphics_fp);
89 gheader.padding = fgetc(graphics_fp);
90 gheader.checksum = read_word(graphics_fp);
91 gheader.unused2 = read_word(graphics_fp);
92 gheader.version = read_word(graphics_fp);
93
94 gtable = malloc(sizeof(struct picture_data) * gheader.images);
95 for (i = 0; i < gheader.images; i++) {
96 gtable[i].number = read_word(graphics_fp);
97 gtable[i].width = read_word(graphics_fp);
98 gtable[i].height = read_word(graphics_fp);
99 gtable[i].flags = read_word(graphics_fp);
100 gtable[i].data = fgetc(graphics_fp) << 16;
101 gtable[i].data |= fgetc(graphics_fp) << 8;
102 gtable[i].data |= fgetc(graphics_fp);
103 if (gheader.entry_size >= 14) {
104 gtable[i].colour = fgetc(graphics_fp) << 16;
105 gtable[i].colour |= fgetc(graphics_fp) << 8;
106 gtable[i].colour |= fgetc(graphics_fp);
107 } else
108 gtable[i].colour = 0;
109 fseek(graphics_fp,
110 gheader.entry_size - (gheader.entry_size >= 14 ? 14 : 11),
111 SEEK_CUR);
112 }
113
114 return 1;
115 }
116
117
118 static struct picture_data *find_picture(int picture)
119 {
120 int i;
121
122 for (i = 0; i < gheader.images; i++)
123 if (gtable[i].number == picture)
124 return gtable + i;
125 return NULL;
126 }
127
128
129 static unsigned long colourmap[16];
130 static unsigned long ega_colourmap[16];
131 static int old_colourmap_pos = -1;
132
133 void load_colourmap(int pos)
134 {
135 XColor color_dat;
136 int num_colours, i;
137
138 /* if (pos == old_colourmap_pos) */
139 if (pos == old_colourmap_pos || (pos == 0 && old_colourmap_pos != -1))
140 return;
141 if (old_colourmap_pos == -1) {
142 for (i = 0; i < 16; i++) {
143 if (i & 1)
144 color_dat.blue = 0xaaaa;
145 else
146 color_dat.blue = 0x0000;
147 if (i & 2)
148 color_dat.green = 0xaaaa;
149 else
150 color_dat.green = 0x0000;
151 if (i & 4)
152 color_dat.red = 0xaaaa;
153 else
154 color_dat.red = 0x0000;
155 if (i & 8) {
156 color_dat.blue += 0x5555;
157 color_dat.green += 0x5555;
158 color_dat.red += 0x5555;
159 }
160 XAllocColor(dpy,
161 DefaultColormap(dpy, DefaultScreen(dpy)),
162 &color_dat);
163 ega_colourmap[i] = color_dat.pixel;
164 }
165 }
166
167 old_colourmap_pos = pos;
168
169 memcpy(colourmap, ega_colourmap, sizeof(colourmap));
170 if (pos == 0)
171 return;
172
173 fseek(graphics_fp, pos, SEEK_SET);
174
175 num_colours = fgetc(graphics_fp);
176 if (num_colours > 14)
177 num_colours = 14;
178
179 for (i = 0; i < num_colours; i++) {
180 color_dat.red = fgetc(graphics_fp) * 0x101;
181 color_dat.green = fgetc(graphics_fp) * 0x101;
182 color_dat.blue = fgetc(graphics_fp) * 0x101;
183 XAllocColor(dpy, DefaultColormap(dpy, DefaultScreen(dpy)),
184 &color_dat);
185 colourmap[i + 2] = color_dat.pixel;
186 }
187 }
188
189
190 static unsigned char last[3840];
191 static int prev_seq[3840];
192 static int current_code, prev_code;
193 static int bits_left, byte_read, bits_per_code;
194 static unsigned char buf[512];
195 static int bufpos;
196
197
198 static void init_decompress(void)
199 {
200 bufpos = 0;
201 bits_per_code = 9;
202 bits_left = 0;
203 }
204
205
206 static int read_code(void)
207 {
208 int i, code;
209
210 code = 0;
211 i = bits_per_code;
212 do {
213 if (bits_left <= 0) {
214 byte_read = fgetc(graphics_fp);
215 bits_left = 8;
216 }
217
218 code |= (byte_read >> (8 - bits_left)) << (bits_per_code - i);
219
220 i -= bits_left;
221 bits_left = -i;
222 } while (i > 0);
223
224 return code & (0xfff >> (12 - bits_per_code));
225 }
226
227
228 static int decompress(void)
229 {
230 int code, val;
231
232 if (bufpos == 0) {
233 while ((code = read_code()) == 256) {
234 bits_per_code = 9;
235 current_code = 257;
236 }
237
238 if (code == 257)
239 return -1;
240
241 if (current_code < 4096)
242 prev_seq[current_code - 256] = prev_code;
243 for (val = code; val > 256; val = prev_seq[val - 256])
244 buf[bufpos++] = last[val - 256];
245 buf[bufpos++] = val;
246 if (code == current_code)
247 buf[0] = val;
248
249 if (current_code < 4096)
250 last[current_code - 256] = val;
251 prev_code = code;
252
253 if (++current_code == 1 << bits_per_code && bits_per_code < 12)
254 bits_per_code++;
255 }
256
257 return buf[--bufpos];
258 }
259
260
261 /*
262 * os_draw_picture
263 *
264 * Display a picture at the given coordinates. Top left is (1,1).
265 *
266 */
267 void os_draw_picture(int picture, int y, int x)
268 {
269 struct picture_data *data;
270 XImage *contents_image, *mask_image;
271 char *contents, *mask;
272 int transparent = -1;
273 int xpos, ypos, im_x, im_y;
274 int image_value;
275 unsigned long pixel_value;
276
277 if (graphics_fp == NULL)
278 if (!open_graphics_file())
279 return;
280
281 if ((data = find_picture(picture)) == NULL)
282 return;
283
284 load_colourmap(data->colour);
285 contents_image =
286 XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)),
287 DefaultDepth(dpy, DefaultScreen(dpy)), ZPixmap, 0,
288 NULL, data->width * 5 / 2, data->height * 3, 32, 0);
289 contents =
290 malloc(contents_image->height * contents_image->bytes_per_line);
291 contents_image->data = contents;
292 if (data->flags & 1) {
293 transparent = data->flags >> 12;
294 mask_image =
295 XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)),
296 /* DefaultDepth(dpy, DefaultScreen(dpy)), */ 1,
297 XYBitmap, 0, NULL,
298 data->width * 5 / 2, data->height * 3, 8, 0);
299 mask =
300 calloc(mask_image->height * mask_image->bytes_per_line, 1);
301 mask_image->data = mask;
302 }
303
304 fseek(graphics_fp, data->data, SEEK_SET);
305 init_decompress();
306 for (ypos = 0; ypos < data->height; ypos++)
307 for (xpos = 0; xpos < data->width; xpos++) {
308 image_value = decompress();
309 pixel_value = colourmap[image_value];
310 if (image_value == transparent)
311 pixel_value = 0;
312 for (im_y = ypos * 3; im_y < ypos * 3 + 3; im_y++)
313 for (im_x = xpos * 5 / 2;
314 im_x < (xpos + 1) * 5 / 2; im_x++)
315 XPutPixel(contents_image, im_x, im_y,
316 pixel_value);
317 if (image_value == transparent)
318 for (im_y = ypos * 3; im_y < ypos * 3 + 3;
319 im_y++)
320 for (im_x = xpos * 5 / 2;
321 im_x < (xpos + 1) * 5 / 2; im_x++)
322 XPutPixel(mask_image, im_x,
323 im_y, 1);
324 }
325
326 if (data->flags & 1) {
327 XSetFunction(dpy, bw_gc, GXand);
328 XPutImage(dpy, main_window, bw_gc, mask_image, 0, 0,
329 x - 1, y - 1, data->width * 5 / 2, data->height * 3);
330 }
331 XSetFunction(dpy, bw_gc, (data->flags & 1 ? GXor : GXcopy));
332 XPutImage(dpy, main_window, bw_gc, contents_image, 0, 0,
333 x - 1, y - 1, data->width * 5 / 2, data->height * 3);
334
335 XSetFunction(dpy, normal_gc, GXcopy);
336 XDestroyImage(contents_image);
337 if (data->flags & 1)
338 XDestroyImage(mask_image);
339 } /* os_draw_picture */
340
341
342 /*
343 * os_peek_colour
344 *
345 * Return the colour of the pixel below the cursor. This is used
346 * by V6 games to print text on top of pictures. The coulor need
347 * not be in the standard set of Z-machine colours. To handle
348 * this situation, Frotz extends the colour scheme: Values above
349 * 15 (and below 256) may be used by the interface to refer to
350 * non-standard colours. Of course, os_set_colour must be able to
351 * deal with these colours. Interfaces which refer to characters
352 * instead of pixels might return the current background colour
353 * instead.
354 *
355 */
356 extern long pixel_values[17];
357
358 int os_peek_colour(void)
359 {
360 XImage *point;
361
362 point = XGetImage(dpy, main_window, curr_x, curr_y, 1, 1,
363 AllPlanes, ZPixmap);
364
365 pixel_values[16] = XGetPixel(point, 0, 0);
366 return 16;
367 } /* os_peek_colour */
368
369
370 /*
371 * os_picture_data
372 *
373 * Return true if the given picture is available. If so, write the
374 * width and height of the picture into the appropriate variables.
375 * Only when picture 0 is asked for, write the number of available
376 * pictures and the release number instead.
377 *
378 */
379 int os_picture_data(int picture, int *height, int *width)
380 {
381 struct picture_data *entry;
382
383 if (graphics_fp == NULL)
384 if (!open_graphics_file())
385 return 0;
386
387 if (picture == 0) {
388 *height = gheader.images;
389 *width = gheader.version;
390 return 1;
391 }
392
393 entry = find_picture(picture);
394 if (entry == NULL)
395 return 0;
396 *height = entry->height * 3; /* 600 / 200 */
397 *width = entry->width * 5 / 2; /* 800 / 320 */
398 return 1;
399
400 } /* os_picture_data */
401
402 bool x_init_pictures(void)
403 {
404 return TRUE;
405 }
406
407 #endif /* NO_BLORB */
2424 */
2525
2626 #include "x_frotz.h"
27 #ifndef NO_BLORB
28
2729 #include <X11/Xutil.h>
2830 #include <stdio.h>
2931 #include <stdlib.h>
3032 #include <string.h>
3133
32 struct picture_data {
33 int number, width, height, flags, data, colour;
34
35 #include <math.h>
36 #include <stdint.h>
37
38 #include "png.h"
39 #include <setjmp.h>
40
41 #include "x_blorb.h"
42
43 #define PIC_FILE_HEADER_FLAGS 1
44 #define PIC_FILE_HEADER_NUM_IMAGES 4
45 #define PIC_FILE_HEADER_ENTRY_SIZE 8
46 #define PIC_FILE_HEADER_VERSION 14
47
48 #define PIC_HEADER_NUMBER 0
49 #define PIC_HEADER_WIDTH 2
50 #define PIC_HEADER_HEIGHT 4
51
52 extern bb_map_t *blorb_map;
53 static bool m_adaptiveMode = FALSE;
54
55 typedef struct
56 {
57 int z_num;
58 int width;
59 int height;
60 int orig_width;
61 int orig_height;
62 uint32_t type;
63 uint8_t *pixels;
64 uint32_t palette[16];
65 int palette_entries;
66 int transparentcolor;
67 bool adaptive;
68 bool usespalette;
69 } pict_info_t;
70 static pict_info_t *pict_info;
71 static int num_pictures = 0;
72
73 static int x_loadpic(int picture, pict_info_t * graphic);
74
75 /* Default picture resource width and height */
76 static int blrb_width = 512;
77 static int blrb_height = 400;
78
79 /* Dimension of the colorcube for the color table */
80 #define CCUBEDIM 6
81 static unsigned long colortab[CCUBEDIM * CCUBEDIM * CCUBEDIM];
82 static unsigned red_max, green_max, blue_max;
83 static unsigned red_mult, green_mult, blue_mult;
84 static unsigned long red_mask, green_mask, blue_mask;
85 static unsigned red_bits, green_bits, blue_bits;
86 static unsigned red_shift, green_shift, blue_shift;
87 static unsigned is_truecolor = 0;
88 static void init_colormap()
89 {
90 int red, green, blue;
91 XColor color;
92 int i;
93 XVisualInfo *vinfo, vinfotplt;
94 int nitems;
95 unsigned long tmpmask;
96
97 vinfotplt.visualid = XVisualIDFromVisual(DefaultVisual(dpy,DefaultScreen(dpy)));
98
99 vinfo = XGetVisualInfo(dpy,VisualIDMask,&vinfotplt,&nitems);
100 if (nitems) {
101 if (vinfo->class == TrueColor) {
102 is_truecolor = 1;
103 red_mask = vinfo->red_mask;
104 green_mask = vinfo->green_mask;
105 blue_mask = vinfo->blue_mask;
106 tmpmask = red_mask;
107 red_shift = 0;
108 red_bits = 0;
109 while(!(tmpmask & 1)) {
110 tmpmask >>= 1;
111 red_shift++;
112 }
113 while((tmpmask & 1)) {
114 tmpmask >>= 1;
115 red_bits++;
116 }
117
118 tmpmask = green_mask;
119 green_shift = 0;
120 green_bits = 0;
121 while(!(tmpmask & 1)) {
122 tmpmask >>= 1;
123 green_shift++;
124 }
125 while((tmpmask & 1)) {
126 tmpmask >>= 1;
127 green_bits++;
128 }
129
130 tmpmask = blue_mask;
131 blue_shift = 0;
132 blue_bits = 0;
133 while(!(tmpmask & 1)) {
134 tmpmask >>= 1;
135 blue_shift++;
136 }
137 while((tmpmask & 1)) {
138 tmpmask >>= 1;
139 blue_bits++;
140 }
141 } else {
142 is_truecolor = 0;
143 red_max = CCUBEDIM - 1;
144 green_max = CCUBEDIM - 1;
145 blue_max = CCUBEDIM - 1;
146 red_mult = CCUBEDIM * CCUBEDIM;
147 green_mult = CCUBEDIM;
148 blue_mult = 1;
149
150 i=0;
151 for(red = 0; red <= red_max; red++) {
152 for(green = 0; green <= green_max; green++) {
153 for(blue = 0; blue <= blue_max; blue++) {
154 color.red = (0xffff * red)/red_max;
155 color.green = (0xffff * green)/green_max;
156 color.blue = (0xffff * blue)/blue_max;
157 XAllocColor(dpy,
158 DefaultColormap(dpy,
159 DefaultScreen(dpy)),
160 &color);
161 colortab[i++] = color.pixel;
162 }
163 }
164 }
165 }
166 }
167 if (vinfo) XFree((char *) vinfo);
168 }
169
170 static void lookup_color(XColor *x)
171 {
172 unsigned r,g,b;
173 if (is_truecolor) {
174 r = x->red >> (16 - red_bits);
175 g = x->green >> (16 - green_bits);
176 b = x->blue >> (16 - blue_bits);
177 x->pixel = ((r << red_shift) & red_mask) |
178 ((g << green_shift) & green_mask) |
179 ((b << blue_shift) & blue_mask);
180 } else {
181 r = x->red * (red_max + 1);
182 g = x->green * (green_max + 1);
183 b = x->blue * (blue_max + 1);
184 if (r) r -= 1;
185 if (g) g -= 1;
186 if (b) b -= 1;
187 x->pixel = colortab[((r/0xffff) * red_mult) +
188 ((g/0xffff) * green_mult) +
189 ((b/0xffff) * blue_mult) ];
190 }
191 }
192
193 bool x_init_pictures (void)
194 {
195 int maxlegalpic = 0;
196 int i,j;
197 bool success = FALSE;
198 bb_result_t res;
199 bb_resolution_t *reso;
200
201 init_colormap();
202 if (blorb_map == NULL) return FALSE;
203
204 reso = bb_get_resolution(blorb_map);
205
206 if (reso)
207 {
208 if (reso->px)
209 blrb_width = reso->px;
210 if (reso->py)
211 blrb_height = reso->py;
212 }
213 bb_count_resources(blorb_map, bb_ID_Pict, &num_pictures, NULL, &maxlegalpic);
214 pict_info = malloc((num_pictures + 1) * sizeof(*pict_info));
215 pict_info[0].z_num = 0;
216 pict_info[0].height = num_pictures;
217 pict_info[0].width = bb_get_release_num(blorb_map);
218 if (bb_load_chunk_by_type (blorb_map,
219 bb_method_Memory,
220 &res,
221 bb_ID_APal,
222 0) == bb_err_None) {
223 m_adaptiveMode = TRUE;
224 bb_unload_chunk(blorb_map, res.chunknum);
225 }
226
227
228 for (i = 0, j = 0; (i < num_pictures) && (j <= maxlegalpic); j++) {
229 if (bb_load_resource(blorb_map, bb_method_Memory, &res, bb_ID_Pict, j) == bb_err_None) {
230 i++;
231 pict_info[i].type = blorb_map->chunks[res.chunknum].type;
232 pict_info[i].transparentcolor = -1;
233 /* Copy and scale. */
234 pict_info[i].z_num = j;
235 x_loadpic(j, &pict_info[i]);
236 success = TRUE;
237 } /* if */
238
239 } /* for */
240
241 if (success) z_header.config |= CONFIG_PICTURES;
242 else z_header.flags &= ~GRAPHICS_FLAG;
243
244 return success;
245 } /* x_init_pictures */
246
247
248 /* Convert a Z picture number to an index into pict_info. */
249 static int z_num_to_index(int n)
250 {
251 int i;
252 for (i = 0; i <= num_pictures; i++) {
253 if (pict_info[i].z_num == n)
254 return i;
255 }
256 return -1;
257 } /* z_num_to_index */
258
259
260
261 static uint8_t toLinear[256];
262 static uint8_t fromLinear[256];
263 extern bool m_adaptiveMode;
264
265 uint32_t x_blend(int a, uint32_t s, uint32_t d)
266 {
267 uint32_t r;
268 r = fromLinear[(toLinear[s & 0xff] * a +
269 toLinear[d & 0xff] * (256 - a)) >> 8];
270 s >>= 8;
271 d >>= 8;
272 r |= (fromLinear
273 [(toLinear[s & 0xff] * a +
274 toLinear[d & 0xff] * (256 - a)) >> 8]) << 8;
275 s >>= 8;
276 d >>= 8;
277 r |= (fromLinear
278 [(toLinear[s & 0xff] * a +
279 toLinear[d & 0xff] * (256 - a)) >> 8]) << 16;
280 return r;
281 }
282
283
284 /* Set the screen gamma and build gamma correction tables */
285 void x_setgamma(double gamma)
286 {
287 int i;
288
289 for (i = 0; i < 256; i++)
290 toLinear[i] = (int)((pow(i / 255.0, gamma) * 255.0) + 0.5);
291 gamma = 1.0 / gamma;
292 for (i = 0; i < 256; i++)
293 fromLinear[i] = (int)((pow(i / 255.0, gamma) * 255.0) + 0.5);
294 }
295
296 /****************************************************************************
297 * Loader for PNG images
298 ****************************************************************************
299 */
300
301 typedef struct {
302 uint8_t *gfxData;
303 unsigned long offset;
304 } PNGData;
305
306
307 static void readPNGData(png_structp png_ptr, png_bytep data, png_size_t length)
308 {
309 PNGData *pngData = (PNGData *) png_get_io_ptr(png_ptr);
310 memmove(data, pngData->gfxData + pngData->offset, length);
311 pngData->offset += length;
312 }
313
314
315 static int loadpng(uint8_t * data, int length, pict_info_t * graphic)
316 {
317 png_bytep *rowPointers = NULL;
318 png_structp png_ptr = NULL;
319 png_infop info_ptr = NULL;
320 png_infop end_info = NULL;
321 PNGData pngData;
322 png_uint_32 width, height;
323 int color_type, size, bit_depth;
324 double gamma;
325
326 graphic->pixels = NULL;
327 graphic->orig_width = graphic->orig_height = 0;
328
329 if (!png_check_sig(data, 8))
330 return 0;
331
332 png_ptr = png_create_read_struct
333 (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL);
334 if (!png_ptr)
335 return 0;
336
337 info_ptr = png_create_info_struct(png_ptr);
338 if (!info_ptr) {
339 png_destroy_read_struct(&png_ptr,
340 (png_infopp) NULL, (png_infopp) NULL);
341 return 0;
342 }
343
344 end_info = png_create_info_struct(png_ptr);
345 if (!end_info) {
346 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL);
347 return 0;
348 }
349
350 if (setjmp(png_jmpbuf(png_ptr))) {
351 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
352 if (rowPointers)
353 free(rowPointers);
354 if (graphic->pixels) {
355 free(graphic->pixels);
356 graphic->pixels = NULL;
357 }
358 return 0;
359 }
360
361 pngData.gfxData = data;
362 pngData.offset = 8;
363 png_set_read_fn(png_ptr, &pngData, readPNGData);
364
365 png_set_sig_bytes(png_ptr, 8);
366 png_read_info(png_ptr, info_ptr);
367
368 width = png_get_image_width(png_ptr, info_ptr);
369 height = png_get_image_height(png_ptr, info_ptr);
370 bit_depth = png_get_bit_depth(png_ptr,info_ptr);
371 color_type = png_get_color_type(png_ptr, info_ptr);
372
373 graphic->orig_width = width;
374 graphic->orig_height = height;
375 graphic->usespalette = FALSE;
376
377 if (png_get_gAMA(png_ptr, info_ptr, &gamma))
378 png_set_gamma(png_ptr, 2.2, gamma);
379
380 if (m_adaptiveMode && (color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth <= 4) {
381 graphic->usespalette = TRUE;
382 png_set_packing(png_ptr);
383
384 /* Check for transparency. In practice, the transparent
385 * color will always be color 0.
386 */
387 png_bytep trans;
388 int num_trans;
389 png_color_16p trans_values;
390
391 if (png_get_tRNS
392 (png_ptr, info_ptr, &trans, &num_trans, &trans_values)
393 && num_trans >= 1)
394 graphic->transparentcolor = trans[0];
395
396 size = width * height;
397 graphic->pixels = (uint8_t *) malloc(size);
398
399 rowPointers = malloc(sizeof(png_bytep) * height);
400 for (int i = 0; i < (int)height; i++)
401 rowPointers[i] = graphic->pixels + (width * i);
402 png_read_image(png_ptr, rowPointers);
403
404 /* Get the palette after reading the image, so that the gamma
405 * correction is applied.
406 */
407 png_colorp palette;
408 int num_palette;
409 if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette)) {
410 graphic->palette_entries = num_palette;
411 for (int i = 0; i < num_palette; i++) {
412 uint32_t color =
413 palette[i].red | (palette[i].
414 green << 8) | (palette[i].
415 blue <<
416 16);
417 graphic->palette[i] = color;
418 }
419 }
420 } else {
421 if (graphic->adaptive)
422 os_fatal("Non-paletted graphics cannot be adaptive");
423 if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8)
424 png_set_palette_to_rgb(png_ptr);
425 if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
426 png_set_expand_gray_1_2_4_to_8(png_ptr);
427 if (png_get_valid(png_ptr,info_ptr,PNG_INFO_tRNS))
428 png_set_tRNS_to_alpha(png_ptr);
429
430 if (bit_depth == 16)
431 png_set_strip_16(png_ptr);
432 if (bit_depth < 8)
433 png_set_packing(png_ptr);
434 if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
435 png_set_gray_to_rgb(png_ptr);
436
437 png_set_filler(png_ptr,0xff,PNG_FILLER_AFTER);
438 size = width*height*4;
439 graphic->pixels = (uint8_t *) malloc(size);
440 rowPointers = malloc(sizeof(png_bytep) * height);
441 for (int i = 0; i < (int)height; i++)
442 rowPointers[i] = graphic->pixels + (width * i * 4);
443 png_read_image(png_ptr, rowPointers);
444 }
445
446 /* Reading done. */
447 png_read_end(png_ptr, end_info);
448 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
449 if (rowPointers)
450 free(rowPointers);
451
452 return 1;
453 }
454
455 /****************************************************************************
456 * Loader for JPEG images
457 ****************************************************************************
458 */
459
460 #include <jpeglib.h>
461
462 /* Error Handling */
463 struct JPEGErrorInfo {
464 struct jpeg_error_mgr base;
465 jmp_buf errorJump;
34466 };
35467
36468
37 static FILE *graphics_fp = NULL;
38 static struct {
39 int fileno, flags, unused1, images, link, entry_size,
40 padding, checksum, unused2, version;
41 } gheader;
42 struct picture_data *gtable;
43
44
45 static int read_word(FILE * fp)
46 {
47 int result;
48
49 result = fgetc(fp);
50 result |= fgetc(fp) << 8;
51 return result;
52 }
53
54
55 static int open_graphics_file(void)
56 {
57 char *graphics_name;
58 const char *base_start, *base_end;
469 static void errorJPEGExit(j_common_ptr cinfo)
470 {
471 struct JPEGErrorInfo *error = (struct JPEGErrorInfo *)cinfo->err;
472 (*cinfo->err->output_message) (cinfo);
473 longjmp(error->errorJump, 1);
474 }
475
476
477 static void outputJPEGMessage(j_common_ptr cinfo)
478 {
479 char buffer[JMSG_LENGTH_MAX];
480 (*cinfo->err->format_message) (cinfo, buffer);
481 }
482
483
484 /* Memory Data Source */
485 static void memJPEGInit(j_decompress_ptr unused)
486 {
487 /* Nothing here */
488 }
489
490
491 static int memJPEGFillInput(j_decompress_ptr unused)
492 {
493 return 0;
494 }
495
496
497 static void memJPEGSkipInput(j_decompress_ptr cinfo, long num_bytes)
498 {
499 if (num_bytes > 0) {
500 if (num_bytes > (long)cinfo->src->bytes_in_buffer)
501 num_bytes = (long)cinfo->src->bytes_in_buffer;
502
503 cinfo->src->next_input_byte += num_bytes;
504 cinfo->src->bytes_in_buffer -= num_bytes;
505 }
506 }
507
508
509 static void memJPEGTerm(j_decompress_ptr unused)
510 {
511 /* Nothing here */
512 }
513
514
515 static int loadjpeg(uint8_t * data, int length, pict_info_t * graphic)
516 {
517 struct jpeg_decompress_struct info;
518 struct JPEGErrorInfo error;
519 int width, height, size;
520 JSAMPARRAY buffer;
521
522 graphic->pixels = NULL;
523 graphic->orig_width = graphic->orig_height = 0;
524
525 info.err = jpeg_std_error(&(error.base));
526 error.base.error_exit = errorJPEGExit;
527 error.base.output_message = outputJPEGMessage;
528 if (setjmp(error.errorJump)) {
529 jpeg_destroy_decompress(&info);
530 if (graphic->pixels) {
531 free(graphic->pixels);
532 graphic->pixels = NULL;
533 }
534 return 0;
535 }
536
537 jpeg_create_decompress(&info);
538
539 info.src = (struct jpeg_source_mgr *)(info.mem->alloc_small)
540 ((j_common_ptr) (&info), JPOOL_PERMANENT,
541 sizeof(struct jpeg_source_mgr));
542 info.src->init_source = memJPEGInit;
543 info.src->fill_input_buffer = memJPEGFillInput;
544 info.src->skip_input_data = memJPEGSkipInput;
545 info.src->resync_to_restart = jpeg_resync_to_restart;
546 info.src->term_source = memJPEGTerm;
547 info.src->bytes_in_buffer = length;
548 info.src->next_input_byte = data;
549
550 jpeg_read_header(&info, TRUE);
551 jpeg_calc_output_dimensions(&info);
552 width = info.output_width;
553 height = info.output_height;
554
555 graphic->orig_width = width;
556 graphic->orig_height = height;
557 size = width * height * 4;
558 graphic->pixels = (uint8_t *) malloc(size);
559
560 /* Force RGB output */
561 info.out_color_space = JCS_RGB;
562
563 /* Get an output buffer */
564 buffer = (*info.mem->alloc_sarray)
565 ((j_common_ptr) & info, JPOOL_IMAGE, width * 3, 1);
566
567 jpeg_start_decompress(&info);
568 while ((int)info.output_scanline < height) {
569 uint8_t *pixelRow;
570 int i;
571 jpeg_read_scanlines(&info, buffer, 1);
572
573 pixelRow = graphic->pixels +
574 (width * (info.output_scanline - 1) * 4);
575 for (i = 0; i < width; i++) {
576 pixelRow[(i * 4) + 0] = (*buffer)[(i * 3) + 0];
577 pixelRow[(i * 4) + 1] = (*buffer)[(i * 3) + 1];
578 pixelRow[(i * 4) + 2] = (*buffer)[(i * 3) + 2];
579 pixelRow[(i * 4) + 3] = 0xFF;
580 }
581 }
582 jpeg_finish_decompress(&info);
583 jpeg_destroy_decompress(&info);
584
585 return 1;
586 }
587
588 /****************************************************************************
589 * Loader for simple rectangles
590 ****************************************************************************
591 */
592
593 static int loadrect(uint8_t * data, int length, pict_info_t * graphic)
594 {
595 graphic->orig_width =
596 (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
597 graphic->orig_height =
598 (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
599 graphic->pixels = NULL;
600 return 1;
601 }
602
603 /*****************************/
604 /* If true, this picture has an adaptive palette */
605 bool x_IsAdaptive(int picture)
606 {
607 bb_result_t result;
608 bool adaptive = FALSE;
609
610 if (blorb_map == NULL) return FALSE;
611
612 if (bb_load_chunk_by_type
613 (blorb_map, bb_method_Memory, &result, bb_ID_APal, 0) == bb_err_None) {
614 for (int i = 0; i < (int)result.length; i += 4) {
615 unsigned char *data =
616 ((unsigned char *)result.data.ptr) + i;
617 int entry =
618 (data[0] << 24) | (data[1] << 16) | (data[2] << 8) |
619 data[3];
620 if (picture == entry) {
621 adaptive = TRUE;
622 break;
623 }
624 }
625 }
626 bb_unload_chunk(blorb_map, result.chunknum);
627 return adaptive;
628 }
629
630
631 /* Get a picture from the Blorb resource map */
632 static int x_loadpic(int picture, pict_info_t * graphic)
633 {
634 myresource res;
635 int st = 0;
636
637 /* Set whether graphic has an adaptive palette */
638 graphic->adaptive = x_IsAdaptive(picture) ? TRUE : FALSE;
639
640 if (bb_load_resource(blorb_map, bb_method_Memory, (bb_result_t *) &res, bb_ID_Pict, picture) == bb_err_None) {
641 uint8_t *data = (uint8_t *) res.bbres.data.ptr;
642 int length = res.bbres.length;
643 unsigned int id = blorb_map->chunks[res.bbres.chunknum].type;
644
645 /* Look for a recognized format */
646 if (id == bb_ID_PNG) {
647 st = loadpng(data, length, graphic);
648 if (!st)
649 st = loadjpeg(data, length, graphic);
650 } else if (id == bb_ID_JPEG) {
651 st = loadjpeg(data, length, graphic);
652 if (!st)
653 st = loadpng(data, length, graphic);
654 } else if (id == bb_ID_Rect)
655 st = loadrect(data, length, graphic);
656 if (graphic->orig_width > blrb_width)
657 {
658 blrb_height = blrb_height * graphic->orig_width / blrb_width;
659 blrb_width = graphic->orig_width;
660 }
661 graphic->height = (graphic->orig_height * X_HEIGHT) /blrb_height;
662 graphic->width = (graphic->orig_width * X_WIDTH) / blrb_width;
663 }
664
665 return st;
666 }
667
668 #if 0
669 /*******************
670 * CACHE
671 */
672
673 #define MAXCACHE 1
674
675 static x_picture cached[MAXCACHE];
676 static int cacheinited = 0;
677
678 static void cacheflush()
679 {
59680 int i;
60
61 base_start = strrchr(f_setup.story_name, '/');
62 if (base_start)
63 base_start++;
64 else
65 base_start = f_setup.story_name;
66 base_end = strrchr(base_start, '.');
67 if (!base_end)
68 base_end = strchr(base_start, 0);
69
70 if (f_setup.blorb_file == NULL) {
71 graphics_name = malloc(base_end - f_setup.story_name + 5);
72 sprintf(graphics_name, "%.*s.mg1", (int)(base_end - f_setup.story_name),
73 f_setup.story_name);
74 } else
75 graphics_name = f_setup.blorb_file;
76
77 if ((graphics_fp = fopen(graphics_name, "r")) == NULL)
78 os_fatal("Unable to open graphics file: %s", graphics_name);
79
80 gheader.fileno = fgetc(graphics_fp);
81 gheader.flags = fgetc(graphics_fp);
82 gheader.unused1 = read_word(graphics_fp);
83 gheader.images = read_word(graphics_fp);
84 gheader.link = read_word(graphics_fp);
85 gheader.entry_size = fgetc(graphics_fp);
86 gheader.padding = fgetc(graphics_fp);
87 gheader.checksum = read_word(graphics_fp);
88 gheader.unused2 = read_word(graphics_fp);
89 gheader.version = read_word(graphics_fp);
90
91 gtable = malloc(sizeof(struct picture_data) * gheader.images);
92 for (i = 0; i < gheader.images; i++) {
93 gtable[i].number = read_word(graphics_fp);
94 gtable[i].width = read_word(graphics_fp);
95 gtable[i].height = read_word(graphics_fp);
96 gtable[i].flags = read_word(graphics_fp);
97 gtable[i].data = fgetc(graphics_fp) << 16;
98 gtable[i].data |= fgetc(graphics_fp) << 8;
99 gtable[i].data |= fgetc(graphics_fp);
100 if (gheader.entry_size >= 14) {
101 gtable[i].colour = fgetc(graphics_fp) << 16;
102 gtable[i].colour |= fgetc(graphics_fp) << 8;
103 gtable[i].colour |= fgetc(graphics_fp);
104 } else
105 gtable[i].colour = 0;
106 fseek(graphics_fp,
107 gheader.entry_size - (gheader.entry_size >= 14 ? 14 : 11),
108 SEEK_CUR);
109 }
110
111 return 1;
112 }
113
114
115 static struct picture_data *find_picture(int picture)
681 if (!cacheinited)
682 return;
683 for (i = 0; i < MAXCACHE; i++) {
684 cached[i].number = -1;
685 if (cached[i].pixels)
686 free(cached[i].pixels);
687 cached[i].pixels = NULL;
688 }
689 cacheinited = 0;
690 }
691
692
693 static void cacheinit()
116694 {
117695 int i;
118
119 for (i = 0; i < gheader.images; i++)
120 if (gtable[i].number == picture)
121 return gtable + i;
696 if (cacheinited)
697 return;
698 CLEANREG(cacheflush);
699 for (i = 0; i < MAXCACHE; i++) {
700 cached[i].number = -1;
701 cached[i].pixels = NULL;
702 }
703 %cacheinited = 1;
704 }
705
706
707 static x_picture *cachefind(int n)
708 {
709 int i;
710 for (i = 0; i < MAXCACHE; i++)
711 if (cached[i].number == n)
712 return (cached + i);
713 if (n < 0) {
714 cached[0].number = -1;
715 if (cached[0].pixels)
716 free(cached[0].pixels);
717 cached[0].pixels = NULL;
718 return (cached + 0);
719 }
122720 return NULL;
123721 }
124722
125
126 static unsigned long colourmap[16];
127 static unsigned long ega_colourmap[16];
128 static int old_colourmap_pos = -1;
129
130 void load_colourmap(int pos)
131 {
132 XColor color_dat;
133 int num_colours, i;
134
135 /* if (pos == old_colourmap_pos) */
136 if (pos == old_colourmap_pos || (pos == 0 && old_colourmap_pos != -1))
137 return;
138 if (old_colourmap_pos == -1) {
139 for (i = 0; i < 16; i++) {
140 if (i & 1)
141 color_dat.blue = 0xaaaa;
142 else
143 color_dat.blue = 0x0000;
144 if (i & 2)
145 color_dat.green = 0xaaaa;
146 else
147 color_dat.green = 0x0000;
148 if (i & 4)
149 color_dat.red = 0xaaaa;
150 else
151 color_dat.red = 0x0000;
152 if (i & 8) {
153 color_dat.blue += 0x5555;
154 color_dat.green += 0x5555;
155 color_dat.red += 0x5555;
156 }
157 XAllocColor(dpy,
158 DefaultColormap(dpy, DefaultScreen(dpy)),
159 &color_dat);
160 ega_colourmap[i] = color_dat.pixel;
723 #endif
724
725 pict_info_t *x_getpic(int num)
726 {
727 pict_info_t *res;
728 res = &pict_info[z_num_to_index(num)];
729 if (res->pixels)
730 return res;
731 if (x_loadpic(num, res))
732 return res;
733 return NULL;
734 }
735
736 static unsigned long screen_palette[16];
737
738 /* Apply the picture's palette to the screen palette. */
739 /* Adapted from FrotzGfx::ApplyPalette() in Windows Frotz. */
740 static bool ApplyPalette(pict_info_t * graphic)
741 {
742 bool changed = FALSE;
743 int i, colors;
744
745 memset(&screen_palette, 0, sizeof(unsigned long));
746
747 if (graphic->usespalette) {
748 colors = graphic->palette_entries;
749 if (colors > 16)
750 colors = 16;
751 for (i = 0; i < colors; i++) {
752 if (screen_palette[i] != graphic->palette[i]) {
753 changed = TRUE;
754 screen_palette[i] = graphic->palette[i];
755 }
161756 }
162757 }
163
164 old_colourmap_pos = pos;
165
166 memcpy(colourmap, ega_colourmap, sizeof(colourmap));
167 if (pos == 0)
168 return;
169
170 fseek(graphics_fp, pos, SEEK_SET);
171
172 num_colours = fgetc(graphics_fp);
173 if (num_colours > 14)
174 num_colours = 14;
175
176 for (i = 0; i < num_colours; i++) {
177 color_dat.red = fgetc(graphics_fp) * 0x101;
178 color_dat.green = fgetc(graphics_fp) * 0x101;
179 color_dat.blue = fgetc(graphics_fp) * 0x101;
180 XAllocColor(dpy, DefaultColormap(dpy, DefaultScreen(dpy)),
181 &color_dat);
182 colourmap[i + 2] = color_dat.pixel;
183 }
184 }
185
186
187 static unsigned char last[3840];
188 static int prev_seq[3840];
189 static int current_code, prev_code;
190 static int bits_left, byte_read, bits_per_code;
191 static unsigned char buf[512];
192 static int bufpos;
193
194
195 static void init_decompress(void)
196 {
197 bufpos = 0;
198 bits_per_code = 9;
199 bits_left = 0;
200 }
201
202
203 static int read_code(void)
204 {
205 int i, code;
206
207 code = 0;
208 i = bits_per_code;
209 do {
210 if (bits_left <= 0) {
211 byte_read = fgetc(graphics_fp);
212 bits_left = 8;
213 }
214
215 code |= (byte_read >> (8 - bits_left)) << (bits_per_code - i);
216
217 i -= bits_left;
218 bits_left = -i;
219 } while (i > 0);
220
221 return code & (0xfff >> (12 - bits_per_code));
222 }
223
224
225 static int decompress(void)
226 {
227 int code, val;
228
229 if (bufpos == 0) {
230 while ((code = read_code()) == 256) {
231 bits_per_code = 9;
232 current_code = 257;
233 }
234
235 if (code == 257)
236 return -1;
237
238 if (current_code < 4096)
239 prev_seq[current_code - 256] = prev_code;
240 for (val = code; val > 256; val = prev_seq[val - 256])
241 buf[bufpos++] = last[val - 256];
242 buf[bufpos++] = val;
243 if (code == current_code)
244 buf[0] = val;
245
246 if (current_code < 4096)
247 last[current_code - 256] = val;
248 prev_code = code;
249
250 if (++current_code == 1 << bits_per_code && bits_per_code < 12)
251 bits_per_code++;
252 }
253
254 return buf[--bufpos];
255 }
256
758 return changed;
759 }
257760
258761 /*
259762 * os_draw_picture
263766 */
264767 void os_draw_picture(int picture, int y, int x)
265768 {
266 struct picture_data *data;
769 pict_info_t *data;
267770 XImage *contents_image, *mask_image;
268771 char *contents, *mask;
269 int transparent = -1;
270772 int xpos, ypos, im_x, im_y;
271773 int image_value;
272 unsigned long pixel_value;
273
274 if (graphics_fp == NULL)
275 if (!open_graphics_file())
276 return;
277
278 if ((data = find_picture(picture)) == NULL)
774 XColor pixel_value;
775
776 mask_image = NULL;
777 if ((data = x_getpic(picture)) == NULL)
279778 return;
280
281 load_colourmap(data->colour);
779 if (data->pixels == NULL)
780 return;
781
282782 contents_image =
283783 XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)),
284784 DefaultDepth(dpy, DefaultScreen(dpy)), ZPixmap, 0,
285 NULL, data->width * 5 / 2, data->height * 3, 32, 0);
785 NULL, data->width, data->height, 32, 0);
286786 contents =
287787 malloc(contents_image->height * contents_image->bytes_per_line);
288788 contents_image->data = contents;
289 if (data->flags & 1) {
290 transparent = data->flags >> 12;
789 if (data->transparentcolor != -1) {
291790 mask_image =
292791 XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)),
293792 /* DefaultDepth(dpy, DefaultScreen(dpy)), */ 1,
294793 XYBitmap, 0, NULL,
295 data->width * 5 / 2, data->height * 3, 8, 0);
794 data->width, data->height, 8, 0);
296795 mask =
297796 calloc(mask_image->height * mask_image->bytes_per_line, 1);
298797 mask_image->data = mask;
299798 }
300799
301 fseek(graphics_fp, data->data, SEEK_SET);
302 init_decompress();
303 for (ypos = 0; ypos < data->height; ypos++)
304 for (xpos = 0; xpos < data->width; xpos++) {
305 image_value = decompress();
306 pixel_value = colourmap[image_value];
307 if (image_value == transparent)
308 pixel_value = 0;
309 for (im_y = ypos * 3; im_y < ypos * 3 + 3; im_y++)
310 for (im_x = xpos * 5 / 2;
311 im_x < (xpos + 1) * 5 / 2; im_x++)
800 for (ypos = 0; ypos < data->orig_height; ypos++)
801 for (xpos = 0; xpos < data->orig_width; xpos++) {
802 if (data->usespalette) {
803 image_value = data->pixels[ypos*data->orig_width + xpos];
804 if (!data->adaptive)
805 ApplyPalette(data);
806 pixel_value.blue = (screen_palette[image_value] & 0xff0000) >> 8;
807 pixel_value.green = (screen_palette[image_value] & 0x00ff00);
808 pixel_value.red = (screen_palette[image_value] & 0x0000ff) << 8;
809 } else {
810 pixel_value.blue = data->pixels[(ypos*data->orig_width + xpos)*4 +2] *256;
811 pixel_value.green = data->pixels[(ypos*data->orig_width + xpos)*4 +1] *256;
812 pixel_value.red = data->pixels[(ypos*data->orig_width + xpos)*4] *256;
813 image_value = (pixel_value.blue << 8) + (pixel_value.green) + (pixel_value.red >> 8);
814 }
815 if (image_value == data->transparentcolor)
816 {
817 pixel_value.red = 0;
818 pixel_value.green = 0;
819 pixel_value.blue = 0;
820 }
821 lookup_color(&pixel_value);
822 for (im_y = ypos * X_HEIGHT / blrb_height;
823 im_y < (ypos + 1) * X_HEIGHT / blrb_height;
824 im_y++)
825 for (im_x = xpos * X_WIDTH / blrb_width;
826 im_x < (xpos + 1) * X_WIDTH / blrb_width;
827 im_x++)
312828 XPutPixel(contents_image, im_x, im_y,
313 pixel_value);
314 if (image_value == transparent)
315 for (im_y = ypos * 3; im_y < ypos * 3 + 3;
316 im_y++)
317 for (im_x = xpos * 5 / 2;
318 im_x < (xpos + 1) * 5 / 2; im_x++)
829 pixel_value.pixel);
830 if (mask_image && image_value == data->transparentcolor)
831 for (im_y = ypos * X_HEIGHT / blrb_height;
832 im_y < (ypos + 1) * X_HEIGHT / blrb_height;
833 im_y++)
834 for (im_x = xpos * X_WIDTH / blrb_width;
835 im_x < (xpos + 1) * X_WIDTH / blrb_width;
836 im_x++)
319837 XPutPixel(mask_image, im_x,
320838 im_y, 1);
321839 }
322840
323 if (data->flags & 1) {
841 if (mask_image) {
324842 XSetFunction(dpy, bw_gc, GXand);
325843 XPutImage(dpy, main_window, bw_gc, mask_image, 0, 0,
326 x - 1, y - 1, data->width * 5 / 2, data->height * 3);
327 }
328 XSetFunction(dpy, bw_gc, (data->flags & 1 ? GXor : GXcopy));
844 x - 1, y - 1, data->width, data->height);
845 }
846 XSetFunction(dpy, bw_gc, ((data->transparentcolor != -1) ? GXor : GXcopy));
329847 XPutImage(dpy, main_window, bw_gc, contents_image, 0, 0,
330 x - 1, y - 1, data->width * 5 / 2, data->height * 3);
848 x - 1, y - 1, data->width, data->height);
331849
332850 XSetFunction(dpy, normal_gc, GXcopy);
333851 XDestroyImage(contents_image);
334 if (data->flags & 1)
852 if (mask_image)
335853 XDestroyImage(mask_image);
336854 } /* os_draw_picture */
337855
375893 */
376894 int os_picture_data(int picture, int *height, int *width)
377895 {
378 struct picture_data *entry;
379
380 if (graphics_fp == NULL)
381 if (!open_graphics_file())
382 return 0;
383
384 if (picture == 0) {
385 *height = gheader.images;
386 *width = gheader.version;
387 return 1;
388 }
389
390 entry = find_picture(picture);
391 if (entry == NULL)
392 return 0;
393 *height = entry->height * 3; /* 600 / 200 */
394 *width = entry->width * 5 / 2; /* 800 / 320 */
395 return 1;
896 int index;
897 *height = 0;
898 *width = 0;
899
900 if (!pict_info)
901 return FALSE;
902 if ((index = z_num_to_index(picture)) == -1)
903 return FALSE;
904
905 *height = pict_info[index].height;
906 *width = pict_info[index].width;
907
908 return TRUE;
396909
397910 } /* os_picture_data */
911
912 #endif /* NO_BLORB */
0 @ECHO OFF
1 REM This batch file is for compiling Frotz using Turbo C 3.00 for DOS.
2 REM It's just a bit of syntactic sugar so I don't have to always
3 REM remember that I need to specify the other Makefile for DOS
4 REM compilation. DG
5 make -f makefile.tc %1