summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-09-15 11:11:16 +0000
committerDave Chapman <dave@dchapman.com>2006-09-15 11:11:16 +0000
commit05a7f14f8dbf46fa64c035127ff1e04cfffb841b (patch)
treec107a0038736337811de70dd0e48e670d35246a2 /apps
parent1350d57751f30f1700912e6abaa1d845af973f75 (diff)
downloadrockbox-05a7f14f8dbf46fa64c035127ff1e04cfffb841b.tar.gz
rockbox-05a7f14f8dbf46fa64c035127ff1e04cfffb841b.tar.bz2
rockbox-05a7f14f8dbf46fa64c035127ff1e04cfffb841b.zip
Initial commit of zxbox - a ZX Spectrum emulator ported by Anton Romanov. It theoretically runs on all targets, but I have not included it in the Archos builds because it is just too slow to be usable.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10950 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/SUBDIRS5
-rw-r--r--apps/plugins/viewers.config4
-rw-r--r--apps/plugins/zxbox.c31
-rw-r--r--apps/plugins/zxbox/COPYING339
-rw-r--r--apps/plugins/zxbox/ChangeLog193
-rw-r--r--apps/plugins/zxbox/Makefile89
-rw-r--r--apps/plugins/zxbox/README770
-rw-r--r--apps/plugins/zxbox/README.DOS33
-rw-r--r--apps/plugins/zxbox/README.Z80182
-rw-r--r--apps/plugins/zxbox/SOURCES33
-rw-r--r--apps/plugins/zxbox/acconfig.h43
-rw-r--r--apps/plugins/zxbox/akey.h111
-rw-r--r--apps/plugins/zxbox/archos.lds47
-rw-r--r--apps/plugins/zxbox/ax.c815
-rw-r--r--apps/plugins/zxbox/ax.h114
-rw-r--r--apps/plugins/zxbox/compr.c67
-rw-r--r--apps/plugins/zxbox/compr.h28
-rw-r--r--apps/plugins/zxbox/helpers.c55
-rw-r--r--apps/plugins/zxbox/helpers.h15
-rw-r--r--apps/plugins/zxbox/interf.c108
-rw-r--r--apps/plugins/zxbox/interf.h32
-rw-r--r--apps/plugins/zxbox/keymaps.h82
-rw-r--r--apps/plugins/zxbox/keynames.c201
-rw-r--r--apps/plugins/zxbox/loadim.c134
-rw-r--r--apps/plugins/zxbox/menu.h1
-rw-r--r--apps/plugins/zxbox/misc.c140
-rw-r--r--apps/plugins/zxbox/misc.h38
-rw-r--r--apps/plugins/zxbox/rom_imag.c1652
-rw-r--r--apps/plugins/zxbox/snapshot.c727
-rw-r--r--apps/plugins/zxbox/snapshot.h37
-rw-r--r--apps/plugins/zxbox/sp_def.h84
-rw-r--r--apps/plugins/zxbox/spconf.c141
-rw-r--r--apps/plugins/zxbox/spconf.h39
-rw-r--r--apps/plugins/zxbox/spconf_p.h81
-rw-r--r--apps/plugins/zxbox/spect.c75
-rw-r--r--apps/plugins/zxbox/spectkey.c1602
-rw-r--r--apps/plugins/zxbox/spkey.c983
-rw-r--r--apps/plugins/zxbox/spkey.h30
-rw-r--r--apps/plugins/zxbox/spkey_p.h217
-rw-r--r--apps/plugins/zxbox/spmain.c567
-rw-r--r--apps/plugins/zxbox/spmain.h37
-rw-r--r--apps/plugins/zxbox/spperif.c99
-rw-r--r--apps/plugins/zxbox/spperif.h92
-rw-r--r--apps/plugins/zxbox/spscr.c270
-rw-r--r--apps/plugins/zxbox/spscr.h41
-rw-r--r--apps/plugins/zxbox/spscr_p.h40
-rw-r--r--apps/plugins/zxbox/spsound.c288
-rw-r--r--apps/plugins/zxbox/spsound.h34
-rw-r--r--apps/plugins/zxbox/sptape.c765
-rw-r--r--apps/plugins/zxbox/sptape.h36
-rw-r--r--apps/plugins/zxbox/sptiming.c55
-rw-r--r--apps/plugins/zxbox/sptiming.h33
-rw-r--r--apps/plugins/zxbox/spver.h29
-rw-r--r--apps/plugins/zxbox/tapef_p.h61
-rw-r--r--apps/plugins/zxbox/tapefile.c1047
-rw-r--r--apps/plugins/zxbox/tapefile.h85
-rw-r--r--apps/plugins/zxbox/z80.c132
-rw-r--r--apps/plugins/zxbox/z80.h193
-rw-r--r--apps/plugins/zxbox/z80_ari.h88
-rw-r--r--apps/plugins/zxbox/z80_def.h165
-rw-r--r--apps/plugins/zxbox/z80_op1.c376
-rw-r--r--apps/plugins/zxbox/z80_op1.h130
-rw-r--r--apps/plugins/zxbox/z80_op1x.c125
-rw-r--r--apps/plugins/zxbox/z80_op2.c165
-rw-r--r--apps/plugins/zxbox/z80_op2.h188
-rw-r--r--apps/plugins/zxbox/z80_op2x.c116
-rw-r--r--apps/plugins/zxbox/z80_op3.c142
-rw-r--r--apps/plugins/zxbox/z80_op3.h157
-rw-r--r--apps/plugins/zxbox/z80_op3x.c89
-rw-r--r--apps/plugins/zxbox/z80_op4.c305
-rw-r--r--apps/plugins/zxbox/z80_op4.h105
-rw-r--r--apps/plugins/zxbox/z80_op4x.c38
-rw-r--r--apps/plugins/zxbox/z80_op5.c449
-rw-r--r--apps/plugins/zxbox/z80_op5.h109
-rw-r--r--apps/plugins/zxbox/z80_op6.c437
-rw-r--r--apps/plugins/zxbox/z80_op6.h291
-rw-r--r--apps/plugins/zxbox/z80_step.c176
-rw-r--r--apps/plugins/zxbox/z80_type.h33
-rw-r--r--apps/plugins/zxbox/z80optab.c1470
-rw-r--r--apps/plugins/zxbox/z80optab.h31
-rw-r--r--apps/plugins/zxbox/zxbox.c293
-rw-r--r--apps/plugins/zxbox/zxbox_keyb.c497
-rw-r--r--apps/plugins/zxbox/zxbox_keyb.h1
-rw-r--r--apps/plugins/zxbox/zxconfig.h61
-rw-r--r--apps/plugins/zxbox/zxvid_16bpp.c99
-rw-r--r--apps/plugins/zxbox/zxvid_4bpp.c81
-rw-r--r--apps/plugins/zxbox/zxvid_com.h28
-rw-r--r--apps/plugins/zxbox/zxvid_grey.c97
88 files changed, 19624 insertions, 0 deletions
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index 73771713bd..74e7fe36d8 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -19,6 +19,11 @@ chessbox
sudoku
#endif
+/* For all 2bpp and colour targets */
+#if (LCD_DEPTH >= 2)
+zxbox
+#endif
+
/* For all the colour targets and iriver H1x0 */
#if defined(HAVE_LCD_COLOR) || defined(IRIVER_H100_SERIES)
pacbox
diff --git a/apps/plugins/viewers.config b/apps/plugins/viewers.config
index cc05bbc47d..d9ecd6bbc8 100644
--- a/apps/plugins/viewers.config
+++ b/apps/plugins/viewers.config
@@ -23,3 +23,7 @@ wav,viewers/wavplay,60 7F 05 35 3F 00
bmp,rocks/rockpaint, 01 10 01 10 01 10
m2v,viewers/mpegplayer,5D 7F 5D 7F 5D 7F
iriver,viewers/iriver_flash,2A 7F 41 41 7F 2A
+tap,viewers/zxbox,66 52 4A 66 52 4A
+sna,viewers/zxbox,66 52 4A 66 52 4A
+tzx,viewers/zxbox,66 52 4A 66 52 4A
+z80,viewers/zxbox,66 52 4A 66 52 4A
diff --git a/apps/plugins/zxbox.c b/apps/plugins/zxbox.c
new file mode 100644
index 0000000000..2f3ce97788
--- /dev/null
+++ b/apps/plugins/zxbox.c
@@ -0,0 +1,31 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Overlay loader stub plugin for zxbox on Archos
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "plugin.h"
+
+#if MEM <= 8 && !defined(SIMULATOR)
+
+#include "overlay.h"
+
+PLUGIN_HEADER
+
+/* this is the plugin entry point */
+enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
+{
+ return run_overlay(api, parameter, "/.rockbox/viewers/zxbox.ovl", "ZXBox");
+}
+#endif
diff --git a/apps/plugins/zxbox/COPYING b/apps/plugins/zxbox/COPYING
new file mode 100644
index 0000000000..b8dec3ec35
--- /dev/null
+++ b/apps/plugins/zxbox/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/apps/plugins/zxbox/ChangeLog b/apps/plugins/zxbox/ChangeLog
new file mode 100644
index 0000000000..00b2b70ebe
--- /dev/null
+++ b/apps/plugins/zxbox/ChangeLog
@@ -0,0 +1,193 @@
+04.09.2006 code cleanup; now using IRAM correctly (i hope)
+
+31.08.2006 far better sound, volume option is working now
+
+29.08.2006 predefined keymaps, menu reworking, volume settings
+
+28.08.2006 more options : frame-skipping, sound on/off, toggle 'fast' mode
+28.08.2006 output actual speed of emulation in percent rather than number of rendered frames
+28.08.2006 timing implementation (no >100 % speed in sims)
+
+
+15.08.2006 output FPS on screen when in buffered and into logf when in unbuffered mode (grayscale)
+
+
+15.08.2006 buffered mode when in grayscale mode
+
+11.08.2006 support for grayscale lib
+
+05/2006 - edited by Anton Romanov for
+RockBox - http://www.rockbox.org
+with the help of Dave Chapman and Szeredi Miklos
+
+
+98/05/18 Version 0.94 released
+===============================
+
+98/05/18 Updated the man page (a more complete man-page is still needed!)
+98/05/15 Some bugs fixed
+
+98/05/14 Version 0.93.4 released
+--------------------------------
+
+98/05/14 Small additions:
+ - Keyboard matrix is emulated (only 1 level, I hope this is enough)
+ - "color refreshing" (maybe some other aplications could do it!)
+ - Keyboard configuration is now fully implemented
+
+98/05/11 Added DOS timer support with Allegro library
+
+98/05/08 Version 0.93.3 released
+---------------------------------
+
+98/05/08 Created README.Z80 to describe how to use Z80 emulation
+98/05/06 Small new features + bugfixes
+ - Function keys for commonly used functions
+ - Keyboard config: (extended, spectrum, compat) and (shifted, raw)
+ are now working. No custom keyboard or joystick yet
+ - Small modifications to make z80 emulation separate
+
+98/04/30 Version 0.93.2 released
+---------------------------------
+
+98/04/30 I've removed the BROKEN_VGAKEYBOARD part from vgakey.c.
+ I hope nobody's using SVGALIB version smaller than 1.2.11.
+
+98/04/29 Some small new features: (see example.cfg for a complete list)
+ - different icon when the emulator is paused
+ - optional private colormap
+ - configurable colours (grayscale looks better on
+ monochrome displays)
+ - filetype can be given on the command line (tapefiles too)
+ - optional immediate loading of tapes (-load-immed)
+
+98/04/27 Added configurability to spectemu:
+ - global config file (($prefix)/share/spectemu/spectemu.cfg)
+ - user's config file (~/.spectemurc)
+ - X resource database
+ - command line
+
+98/04/23 Mode 320x240 is used in vgaspect (if available)
+
+98/04/22 Version 0.93.1 released
+---------------------------------
+
+98/04/21 Handle "extra" ascii keys: []{}|\~
+98/04/19 Added Spectrum keyboard picture, which shows pressed keys, and
+ keys can be pressed with mouse.
+98/04/16 Rewrite keyboard handling:
+ - Fixes keyboard bug in X (key remained pressed)
+ - Better configurability: spectrum key definitions are in spkey.c
+ instead of xkey.c and vgakey.c
+
+98/04/07 Added readline support by Christian Sievers <sievers@cip.rz.tu-bs.de>
+
+98/03/24 Version 0.92 released
+===============================
+
+98/03/23 Last minute bugfixes
+
+98/03/20 Version 0.92p3 released
+98/03/20 Eliminated all sorts of minor bugs
+98/03/19 Implement LOOP/CALL/RETURN blocks in TZX handling
+98/03/17 Fixed (hopefully all) bugs in TZX handling:
+ - There must be a 1ms pause at end of tape.
+ - Pausing after data blocks fixed.
+ - Made tape I/O timing ultra precise (e.g. see Flashpoint)
+
+98/03/14 Fixed small bug in quick load
+98/03/13 Sound of tape is now fixed (not perfect, but good enough)
+ Created simple man page
+
+98/03/11 Version 0.92pre2 released
+98/03/10 Fixed quick load of tapefiles
+98/03/10 Fixed resize bugs
+
+98/03/09 Version 0.92pre1 released
+98/03/08 C-version now handles bits 3 and 5 of the Flag register
+ (I hope I didn't break anything with this).
+98/03/08 Wrote 'tapeout' utility to save tapefiles to real tape (via
+ soundcard).
+
+98/03/06 Implemented emulator pause.
+98/03/06 Added ability to display spectrum keyboard layout on text
+ console (Radovan.Garabik@fmph.uniba.sk).
+
+98/03/05 Rewrite of snapshot handeling:
+ - All versions of Z80 snapshots can now be loaded.
+ - Loading and saving of SNA snapshot format is supported.
+ - Quick loading and saving of temporary snapshot.
+
+98/03/03 Rewrite of tapefile handeling:
+ - Support for most TZX blocks (recognise length of all v1.11
+ blocks)
+ - SPT tapefiles are no longer supported
+ - Added quick loading of tapefiles
+ - Timing in tape emulation is very exact now, but this makes
+ tape sound ugly (this will be fixed).
+
+98/01/28 Version 0.91a released
+98/01/26 Added detection for underlines in asm names to configure
+
+98/01/12 Version 0.91 released
+===============================
+
+98/01/08 Changes to configure to detect X libraries better
+
+97/11/29 Use XSetWMProperties instead of XmbSetWMProperties
+97/11/26 Created icon for xspect
+97/11/20 IO and memory timing are improved (ULA / CPU clash)
+
+97/11/18 Fixed 0xfe port problems
+97/11/17 Input from unused ports (others than 0xFE) result in 0xFF, not 0x00
+
+97/11/12 8000 sample/sec sound on SUN
+97/11/12 Fixed screen bugs
+
+97/11/11 Window resizing in X (thanks to Egmont)
+97/11/11 Fixed FocusIn/FocusOut bug (twm, olwm, ...)
+97/11/11 Small changes and bugfixes
+
+97/11/09 Sound on SUN (sample rate 16000, but 8000 is coming for older
+ SUNs.
+
+97/10/26 'Interrupted system call' is not an error on sound device
+97/10/26 Fixed screen scramble bug in console background running
+
+97/10/20 Version 0.90pre1 released
+
+97/10/20 Tested on the following Machines/Operating systems/Compilers:
+ o Intel/Linux/gcc (assembly)
+ o Sparc/Solaris/gcc (C)
+ o Alpha/OSF1/cc (C)
+ o Sequent(i486)/Dynix-Ptx/gcc (assembly)
+
+97/10/20 Automatic configuration with 'configure' script
+97/10/20 Bugfixes and cleanups
+97/10/20 Experimental DOS support with DJGPP (timer missing)
+97/10/20 Added emulation in C
+97/05/22 Background running for svgalib added (Needs svgalib >= 1.2.11)
+
+97/04/17 Version 0.84 released
+===============================
+
+97/04/17 Added SLL to the emulated instructions
+
+97/04/12 The following changes were inspired by Egmont Koblinger:
+ - Resize bug fixed
+ - Implemented tape file pause
+ - Implemented saving to tape file
+ - Snapshot loading from command line
+ - Other small changes
+
+97/04/03 Bug fix in tape handling (thanks to Egmont Koblinger)
+97/03/26 Speeded up border drawing in X
+97/03/26 Added .TAP support
+
+97/03/10 Version 0.81 released
+===============================
+
+97/03/10 Bug fixes and minor changes (thanks to Tamas Meszaros)
+
+97/01/21 Version 0.8: First public release
+===========================================
diff --git a/apps/plugins/zxbox/Makefile b/apps/plugins/zxbox/Makefile
new file mode 100644
index 0000000000..d9f75d44c5
--- /dev/null
+++ b/apps/plugins/zxbox/Makefile
@@ -0,0 +1,89 @@
+# __________ __ ___.
+# Open \______ \ ____ ____ | | _\_ |__ _______ ___
+# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+# \/ \/ \/ \/ \/
+#
+
+INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \
+ -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR) -I. $(TARGET_INC)
+CFLAGS = $(INCLUDES) $(GCCOPTS) -O2 $(TARGET) $(EXTRA_DEFINES) \
+ -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN
+
+
+ifdef APPEXTRA
+ INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA)))
+endif
+
+LINKFILE := $(OBJDIR)/link.lds
+DEPFILE = $(OBJDIR)/dep-zxbox
+
+# This sets up 'SRC' based on the files mentioned in SOURCES
+include $(TOOLSDIR)/makesrc.inc
+
+SOURCES = $(SRC)
+OBJS2 := $(SRC:%.c=$(OBJDIR)/%.o)
+OBJS = $(patsubst %.S, $(OBJDIR)/%.o, $(OBJS2))
+DIRS = .
+
+ifndef SIMVER
+ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
+ LDS := archos.lds
+ OUTPUT = $(OUTDIR)/zxbox.ovl
+else ## iRiver/iPod/... targets
+ LDS := ../plugin.lds
+ OUTPUT = $(OUTDIR)/zxbox.rock
+endif
+else ## simulators
+ OUTPUT = $(OUTDIR)/zxbox.rock
+endif
+
+all: $(OUTPUT)
+
+ifndef SIMVER
+$(OBJDIR)/zxbox.elf: $(OBJS) $(LINKFILE)
+ @echo "LD "`basename $@`
+ @$(CC) $(GCCOPTS) -O -nostdlib -o $@ $(OBJS) -L$(BUILDDIR) -lplugin -lgcc \
+ -T$(LINKFILE) -Wl,-Map,$(OBJDIR)/zxbox.map
+
+$(OUTPUT): $(OBJDIR)/zxbox.elf
+ @echo "OBJCOPY "`basename $@`
+ @$(OC) -O binary $< $@
+else
+
+ifeq ($(SIMVER), sdl)
+###################################################
+# This is the SDL simulator version
+
+$(OUTPUT): $(OBJS)
+ @echo "LD $<"
+ @$(CC) $(CFLAGS) -shared $(OBJS) -L$(BUILDDIR) -lplugin -o $@
+ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
+# 'x' must be kept or you'll have "Win32 error 5"
+# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
+# #define ERROR_ACCESS_DENIED 5L
+else
+ @chmod -x $@
+endif
+
+endif
+endif # end of simulator section
+
+
+include $(TOOLSDIR)/make.inc
+
+# MEMORYSIZE should be passed on to this makefile with the chosen memory size
+# given in number of MB
+$(LINKFILE): $(LDS)
+ @echo "build "`basename $@`
+ @cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) \
+ $(DEFINES) -E -P - >$@
+
+clean:
+ @echo "cleaning zxbox"
+ @rm -rf $(OBJDIR)/zxbox
+ @rm -f $(OBJDIR)/zxbox.* $(DEPFILE)
+
+-include $(DEPFILE)
+
diff --git a/apps/plugins/zxbox/README b/apps/plugins/zxbox/README
new file mode 100644
index 0000000000..9169840276
--- /dev/null
+++ b/apps/plugins/zxbox/README
@@ -0,0 +1,770 @@
+
+ * * * * * * * * * * * * * * *
+ * *
+ * S P E C T E M U *
+ * *
+ * Version 0.94 *
+ * *
+ * * * * * * * * * * * * * * *
+
+
+This package contains a 48k ZX-Spectrum emulator for Linux and other
+UNIX operating systems, with full Z80 instruction set, comprehensive
+screen, sound and tape emulation, and snapshot file saving and
+loading. It can run on a Linux console, or in an X11 window.
+
+The program is free software and is copyrighted under the GNU General
+Public License. It comes with absolutely no warranty. See the file
+COPYING for details.
+
+Written by Miklos Szeredi
+Email: mszeredi@inf.bme.hu
+
+It can be downloaded by FTP from:
+ tsx-11.mit.edu:/pub/linux/ALPHA/spectemu/spectemu-0.94.tar.gz
+or
+ sunsite.unc.edu:/pub/Linux/system/emulators/zx/spectemu-0.94.tar.gz
+
+For news and updates have a look at the Spectemu Page:
+ http://www.inf.bme.hu/~mszeredi/spectemu/
+
+
+You can also join a mailing list (at the Spectemu Page), to receive a
+notice when new versions of spectemu are available.
+
+
+Table of contents
+=================
+
+ 1. Requirements
+
+ 2. Recommended
+
+ 3. Features
+
+ 4. Drawbacks
+
+ 5. Compiling and installation
+
+ 6. Using the emulator
+
+ 6.1 Command line arguments and configuration files (NEW)
+
+ 6.2 Using the Spectrum keyboard
+
+ 6.3 Keys that control the emulator
+
+ 6.4 Effects of changing frame frequency and sound buffer size
+
+ 7. Where can I get ZX Spectrum games for this emulator
+
+ 8. Tape files
+
+ 8.1 Loading a tape file
+
+ 8.2 Quick loading of tape files
+
+ 8.3 Saving to a tape file
+
+ 8.4 Saving a tape file to real tape
+
+ 8.5 Making a tape file from a real tape
+
+ 9. Bug reports
+
+ 10. Credits
+
+
+1. Requirements
+===============
+
+Linux or other UNIX OS.
+Color X11 server (depths 8, 16 and 32 bits are supported)
+ and/or
+SVGALIB console graphics library on Linux.
+
+2. Recommended
+==============
+
+A sound-card on Linux for wonderful spectrum 1-bit sound. And well, a
+fast enough processor... (Especially for the X11 version.)
+
+3. Features
+===========
+
+ - Very fast because of assembly code in emulation (only on Intel
+ processors).
+
+ - Emulation also in C, which is slower, but supports any processor.
+
+ - X support (with MITSHM if available, optionally double size window)
+
+ - Linux console graphics (with SVGALIB)
+
+ - Sound support (through Linux kernel sound-card driver,
+ or SUN sound drivers)
+
+ - Snapshot saving and loading (.Z80 and .SNA format)
+
+ - Tape emulation: loading from tape files (.TAP and .TZX format)
+
+ - Optional quick loading of tapes.
+
+ - Saving to tape files.
+
+ - Separate utility to save tape files to real tape
+
+ - Configurable with config files and from command line
+
+4. Drawbacks
+============
+
+ - Poor user interface
+
+See the file TODO for a list of things which still need to be done (Maybe
+by YOU)
+
+5. Compiling and installation
+=============================
+
+To install the precompiled Linux executables just run 'make install'
+as root.
+
+To recompile the programs on other platforms first type
+
+ ./configure
+
+This tries to determine the system type and parameters. Probably you
+won't have to give any options to configure, but here is the list of
+the most important options:
+
+ --help Print a full list of options
+
+ --prefix=PREFIX Install files under PREFIX (default is /usr/local)
+ Executables go under PREFIX/bin, ...
+
+ --without-readline Do not use the readline library (default is to
+ use it if it's available on your system)
+
+ --without-i386asm Do not use the Intel assembly code (default is
+ to use it, if your system is Intel based)
+
+You may want to have a look at the produced `Makefile' and `config.h'.
+Then just type
+
+ make clean
+ make
+
+Then to install the program, login as root, and run
+
+ make install
+
+(If you want to compile on another machine be sure to `make realclean'
+before re-configuring and re-making the program!)
+
+At the moment, there are two executable programs for running the emulator:
+
+ xspect the X11 version
+ vgaspect the Linux console version
+
+'vgaspect' uses the SVGALIB library. If you do not have this installed
+on your system 'vgaspect' cannot be started. You _MUST_ have SVGALIB
+version 1.2.10 or greater installed, and it is STRONGLY recommended,
+that you get version 1.2.11 or later!
+
+SVGALIB is available at:
+sunsite.unc.edu:/pub/Linux/libs/graphics/
+
+If you have SVGALIB version 1.2.11 or later, the emulator can run in
+background when you switch virtual consoles.
+
+6. Using the emulator
+=====================
+
+After starting 'xspect' or 'vgaspect' you should get the '(C) 1982 Sinclair
+Research Ltd' message, and after pressing a key, the flashing cursor. If
+not, then all I can say, is hard luck to you (if you are ambitious, compile
+the programs with debug information, and try to figure out what is causing
+the problem). Do not start the emulator processes in the background, the
+terminal is needed when loading or saving files.
+
+To load a snapshot immediately after the start of the emulator, you
+can enter the name of the snapshot file on the command line. (Also see
+section 6.1)
+
+E.g.
+
+xspect snap/chuckie2
+
+In X you can resize the window. Window size can only be a multiple of
+the smallest window size (320x256). Smaller window means faster
+emulation, so if emulation doesn't run at full speed, try making the
+window smaller.
+
+6.1 Command line arguments and configuration files
+--------------------------------------------------
+
+You can give options to Spectemu in three different ways:
+
+ 1) In a configuration file (either ~/.spectemurc, or
+ /usr/local/share/spectemu/spectemu.cfg)
+
+ 2) With the X Resource Database (.Xdefaults), this applies only to 'xspect'
+
+ 3) On the command line
+
+Most of the options are common to all three methods, only the syntax
+differs slightly. Here are examples of the different syntax:
+
+Config File:
+ scale = 1
+ private-map = true
+ sound = false
+ color-type = grayscale
+
+.Xdefaults:
+ xspect.scale: 1
+ xspect.privateMap: true
+ xspect.sound: false
+ xspect.colorType: grayscale
+
+Command line:
+ xspect -scale 1 -private-map -no-sound -color-type grayscale
+
+List of common options:
+~~~~~~~~~~~~~~~~~~~~~~~
+
+ NAME RANGE DEFAULT DESCRIPTION
+ ---- ----- ------- -----------
+
+ frame-skip 1... 2 The smaller this is, the more
+ often the screen is updatated
+
+ scale 1..4 2 Window size of 'xspect'
+
+ private-map yes/no no Use private colormap in 'xspect'
+
+ mit-shm yes/no yes Use MIT-SHM extension in X server
+ if available
+
+ vga-mode 320x200 320x240 Resolution to use in 'vgaspect',
+ 320x240 320x200 is faster (but not so nice)
+
+ sound yes/no yes Spectrum sound, if availble
+
+ sound-delay 1... 4 The amount of frames (1/50 seconds)
+ to delay sound. See section 6.4
+
+ sound-device filename (system The name of the sound device
+ dependent)
+
+ sound-sample-rate 4000... ~15625 Sample rate of sound device
+
+ sound-autoclose yes/no yes Whether to close sound device when
+ unused (so other programs can use it)
+
+ sound-dsp-setfrag yes/no yes Set this to 'no' if you use PCSND
+ sound driver
+
+ keyboard-type extended extended Specifies the mapping of the keys,
+ spectrum from the PC keyboard to the spectrum
+ compat keys. See section 6.2
+ custom
+
+ cursor-type shifted shifted How to use the arrow keys on the
+ raw PC keyboard. See section 6.2
+ joystick
+
+ allow-ascii yes/no yes Interpret other keys on the PC
+ keyboard. See section 6.2
+
+ true-shift <modif>* alt Modifier to get shifted symbol
+ as on the PC.
+
+ func_shift <modif>* control Modifier to get control functions.
+
+ color-type normal normal What type of colors to use. Gray-
+ grayscale scale looks better on monochrome
+ custom displays.
+
+ pause-on-iconify yes/no no Whether to pause emulator, when it
+ is iconified ('xspect' only)
+
+ vga-pause-bg yes/no no Whether to pasue emulator, when you
+ switch to a different console
+
+ quick-load yes/no no Use built in (quick) loader for
+ tapefiles.
+
+ auto-stop yes/no no Pause tape after each segment when
+ quick loading.
+
+ load-immed yes/no no Load tapefile immediately (as if
+ you typed LOAD "" / ENTER)
+
+ pause yes/no no Pause the emulator on startup
+
+
+* <modif> can be one of: none, shift, lock, control, alt,
+ mod2, mod3, mod4, mod5
+
+Extra command line parameters:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On the command line you may also use the following options:
+
+ -help Prints usage information, and a list of available
+ options
+
+ -version Prints out the version
+
+
+Also on the command line, a snapshot file and/or a tapefile can be
+specified. Spectemu figures out the type of file from the extension.
+You can omit the extension, e.g. you have a snapshot file 'snap.z80'
+and you start spectemu with 'xspect snap', then it will add the '.z80'
+extension.
+
+You can specify what type is the file by preceding it with one of
+'-z80', '-sna', '-tap' or '-tzx' options. This is useful for cases,
+when the filename does not have an extension (e.g. automatic starting
+with the midnight commander).
+
+Extra config file options:
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Color configuration
+'''''''''''''''''''
+You can configure the custom colors in the config files (and the X
+Resource Database) with:
+
+ color[0..15] = R G B
+
+e.g.
+
+ color-type = custom
+
+ color0 = 10 20 30
+ color7 = 40 50 60
+
+changes the 0-th (black) and the 7-th (white) colors.
+
+Keyboard configuration
+''''''''''''''''''''''
+You can set custom key bindings in the config file:
+
+ Key_<keysym_name> = K ...
+ ...
+
+Or in the X resource database:
+
+ xspect.keys: <keysym_name> = K ...; ...
+
+
+The <keysym_name> can be set to any keysym (defined in 'spkey_p.h').
+The K arguments are the spectrum keys to be assigned to the given PC
+key. K can be any letter, number (a..z, 0..9) or the following:
+
+ none, space, enter, capsshift, symbolshift,
+ kempston_up, kempston_down, kempston_left, kempston_right, kempston_fire
+
+e.g.
+
+ keyboard-type = custom
+ true-shift = none
+
+ Key_Insert = capsshift 9
+ Key_Tab = capsshift symbolshift
+ Key_Shift_R = kempston_fire
+ Key_Alt_L = symbolshift
+ Key_Alt_R = symbolshift
+
+or as it would appear in a .Xdefaults file:
+
+ xspect.keyboardType: custom
+ xspect.trueShift: none
+
+ xspect.keys: Insert = capsshift 9; \
+ Tab = capsshift symbolshift; \
+ Shift_R = kempston_fire; \
+ Alt_L = symbolshift; Alt_R = symbolshift
+
+6.2 Using the Spectrum keyboard
+-------------------------------
+
+Those of you that have at some time used a Spectrum know, that the keyboard
+of this little computer is something very strange, with a LOT of keywords
+and symbols on and around each key. If you have not seen this keyboard (or
+have somehow managed to forget some bit of information that is on it) we
+produced quite a good copy of it, found in the 'spectkey.gif' file.
+
+If you are using 'xspect' than pressing 'Ctrl-k' brings up the picture
+of the spectrum keyboard. You can press keys with the mouse (even more
+than one if you like), and it also shows which keys are pressed. (You
+can see what the emulator does when, for example you press 'BackSpace'
+or a '[' key on the PC keyboard).
+
+The default mapping of the spectrum's keyboard to the PC's is the
+following:
+
+The numbers, the letters, Enter and Space are the same. The left Shift on
+the PC corresponds to the CAPS SHIFT key of the Spectrum, and the right
+Shift corresponds to the SYMBOL SHIFT. This is quite simple and with these
+keys you can get all the functionality of the original Spectrum (assuming
+of course, you know how).
+
+But...
+
+To make life a bit easier, you can also use the Backspace, the arrow
+keys, and the following symbols as on a PC keyboard: ,./;'-=<>?:"_+[]{}\|~
+(unless you turn the 'allow-ascii' option off)
+
+To get a symbol which is written above the numbers on the PC, and not
+the function or symbol that is on the Spectrum, press Alt (actually
+the value of the 'true-shift' option) instead of Shift.
+
+You can slightly modify the mapping with the 'keyboard-type' and
+'cursor-type' options. Every mapping includes the basic keys (letters,
+numbers, Space and Enter). Here are the mappings special to each
+keyboard type and cursor type:
+
+ PC Key Spectrum Key
+ ------ ------------
+
+(Keyboard Types)
+
+extended: (default)
+ Left Shift -> Caps Shift
+ Right Shift -> Symbol Shift
+ Back Space -> Caps Shift + '0'
+ Escape -> Caps Shift + '1'
+
+spectrum: (spectrum-like layout, useful for some games, e.g. Jumping Jack)
+ < same as extended, plus: >
+ Comma (,) -> Symbol Shift
+ Period (.) -> Space
+ Semicolon (;) -> Enter
+
+compat: (similar to other emulators' layouts, e.g. Z80, X128, XZX ...)
+ Shift (both) -> Caps Shift
+ Alt -> Symbol Shift
+ Back Space -> Caps Shift + '0'
+ Escape -> Caps Shift + '1'
+
+custom:
+ Use key bindings specified in the config file (see section 6.1)
+
+(Cursor Types)
+
+shifted: (default)
+ Left Arrow -> Caps Shift + '5'
+ Down Arrow -> Caps Shift + '6'
+ Up Arrow -> Caps Shift + '7'
+ Right Arrow -> Caps Shift + '8'
+
+raw:
+ Left Arrow -> '5'
+ Down Arrow -> '6'
+ Up Arrow -> '7'
+ Right Arrow -> '8'
+
+
+joystick:
+ Left Arrow -> Kempston Left
+ Down Arrow -> Kempston Down
+ Up Arrow -> Kempston Up
+ Right Arrow -> Kempston Right
+ Keypad Ins -> Kempston Fire
+ Keypad Del -> Kempston Fire
+ Keypad Home -> Kempston Up + Left
+ Keypad PgUp -> Kempston Up + Right
+ Keypad End -> Kempston Down + Left
+ Keypad PgDn -> Kempston Down + Right
+
+
+6.3 Keys that control the emulator
+----------------------------------
+
+All control keys are produced by pressing the Ctrl key and another key.
+
+ Ctrl-c, F10 Quit the emulator immediately
+
+ Ctrl-l, F3 Load a snapshot file; you must type the path and
+ filename on the terminal where you started the emulator,
+ e.g. 'snap/chuckie2'. The type and extension of the
+ file is determined automatically (.z80 or .sna).
+
+ Ctrl-t, F2 Save the current state of the emulator in a snapshot file.
+ Format depends on the extension (.z80 or .sna). If no
+ extension is given, .z80 is appended.
+
+ Ctrl-w, Ctrl-F2 Save a snapshot to a temporary file
+
+ Ctrl-e, Ctrl-F3 Restore last temporary snapshot saved with 'Ctrl-w'
+
+ Ctrl-q, F5 Reset the Spectrum
+
+ Ctrl-f Fast mode
+
+ Ctrl-n Normal speed mode
+
+ Ctrl-b Pause/Unpause emulator (you can do operations like loading
+ a snapshot file, etc... in paused mode too)
+
+ Ctrl-m Toggle sound on/off
+
+ Ctrl-h, F1 Print help
+
+ Ctrl-k Display (undisplay) keyboard of spectrum. See section 6.2.
+
+ Ctrl-p, F4 Play tape. Tape file must be entered on the terminal.
+ Optionally the starting segment can be entered;
+ e.g. 'tape/tape1.tap' or 'tape/tape1.tzx 13'
+
+ Ctrl-s, F7 Stop tape
+
+ Ctrl-y Toggle quick loading
+
+ Ctrl-o, F6 Pause and unpause during tapefile playing (restarts the
+ current segment).
+
+ Ctrl-r Record to tape file. See section 8.3.
+
+ Ctrl-\, F9 Refresh screen, reset keyboard state and
+ refresh colors.
+
+ Ctrl-j Toggle private colormap mode (only X)
+
+ Ctrl-comma Decrease window size (only X)
+
+ Ctrl-dot Increase window size (only X)
+
+ Ctrl-equals Skip more screen frames
+
+ Ctrl-minus Skip less screen frames
+
+ Ctrl-] Increase sound buffer size
+
+ Ctrl-[ Decrease sound buffer size
+
+
+6.4 Effects of changing frame frequency and sound buffer size
+-------------------------------------------------------------
+
+ONLY READ THIS IF YOU ARE NOT TOTALLY SATISFIED WITH THE EMULATOR'S
+PERFORMANCE
+
+This should be totally automatic, so I'm now programming you to do what
+the emulator should. (Luckily you are much easier to program)
+
+Frame skipping determines, after how many frames the emulator displays one
+on the screen. There are 50 frames in one second, and normally every other
+frame is displayed (25 per second). If the emulator is too slow under X,
+increasing frame skipping can have a good effect on performance, but at the
+cost of poorer quality. But the interesting thing is, that increasing frame
+skipping may cause a worsening of both performance and of picture quality
+(I will not explain it here why).
+
+Decreasing frame skipping has the opposite effect of the above.
+
+If the emulator uses sound, but sound is not continuous, then experiment
+with increasing sound buffer size, and increasing frame skipping. If you
+are lucky you can make things a bit better. Increasing sound buffer size
+has also the negative effect of delaying more the sound effects.
+
+7. Where can I get ZX Spectrum games for this emulator
+======================================================
+
+On the Spectemu homepage (http://www.inf.bme.hu/~mszeredi/spectemu/)
+you can find a list of sites worth checking. Here are some:
+
+http://www.void.demon.nl/spectrum.html
+http://www.nvg.unit.no/sinclair/planet/
+
+The fact is, that there were a lot of Spectrum games around on audio tapes,
+and some of them are really good. There were always cracked and copyable
+versions around, and nobody was interested in copyrights. Unfortunately the
+big FTP archives do not allow non free software on their servers, so I
+can't include any games in this distribution.
+
+(Because Spectrums have died out, and perhaps some of the software
+companies do not exist any more, probably some games could be distributed
+freely. But I will not check on those things.)
+
+I've included a program named 'spconv', written by Henk de Groot
+(hegr@ensae.ericsson.se) which can convert between snapshot file formats.
+
+Alternatively if you have some old spectrum tapes laying around, and you
+are very brave, you can check out section 8.5.
+
+8. Tape files
+=============
+
+8.1 Loading a tape file
+-----------------------
+
+The emulator now supports G.A. Lunter's .TAP and Tomaz Kac's .TZX tape
+files. To load a file, enter
+
+LOAD ""
+
+to the spectrum (by pressing keys j""), then press 'Ctrl-p'.
+On the terminal enter the name of the tape file to load, e.g.
+
+tape/cnamemat
+
+The emulator will now load from the tape file 'tape/cnamemat.tzx' or
+'tape/cnamemat.tap' whichever exists. Playing automatically stops at
+the end of the tape file. To stop loading before this press Ctrl-s.
+
+The default extensions are '.tap' / '.tzx' or '.TAP' / '.TZX' depending
+on whether the entered tape file is upper or lower case.
+
+While loading try pressing Ctrl-f, which can speed things up. After loading
+the file press press Ctrl-n to restore normal speed.
+
+8.2 Quick loading of tape files
+-------------------------------
+
+Quick loading means bypassing of the tape loading routine in the
+spectrum ROM, and loading of tape blocks directly into the memory.
+Some programs use their own tape loading routines, and in that case
+the tape blocks are always "slow loaded" (see above section).
+
+Quick loading is optional and can be toggled with the 'Ctrl-y' key.
+
+When quick loading is on, after entering 'LOAD ""' you are immediately
+prompted for a tapefile. If the tapefile can't be loaded, the quick
+loading of the first header block is cancelled, but you can still load
+the rest of tape by pressing 'Ctrl-p' and entering the tapefile name.
+
+Even in quick load mode, the playing of tapes is not automatically
+paused, when the program doesn't load more blocks, so with '.tap'
+files containing multipart games, you have to pause the tape at the
+end of each part with 'Ctrl-o' ('.tzx' tapefiles can contain a
+"Stop the Tape" mark, to automatically pause playing).
+
+8.3 Saving to a tape file
+-------------------------
+
+If you want to save something to a tape file using the spectrum's "SAVE"
+command, do the following:
+
+1) Enter 'SAVE "file"' on the spectrum
+2) press Ctrl-r to start the recording
+3) on the terminal enter the name of the tapefile to use
+4) press a key on the spectrum
+5) wait for the recording to stop
+6) press Ctrl-s to stop recording
+
+If the specified tape file already exists, the newly saved segments are
+appended to the old tapefile.
+
+
+8.4 Saving a tape file to real tape
+-----------------------------------
+
+The utility 'tapeout' enables you to save tape files (.tap and .tzx)
+to real tape via the soundcard. At the moment it only works on Linux,
+because it uses the OSS sound driver. (You can compile it for non
+linux systems, by adding -DNO_SOUNDCARD to CFLAGS in Makefile. Then
+instead of writing to the sound device, the program writes to a
+headerless wav file (bits: 8, sample rate: what you've given).)
+
+You can compile 'tapeout' by entering
+
+ make tapeout
+
+in the main directory of spectemu. The command line parameters are:
+
+ tapeout sample_rate tapefile [start_block [output_file]]
+
+The default value for start_block is 0, for output_file it is "/dev/dsp"
+(or if compiled -DNO_SOUNDCARD it is "tape.out").
+
+You can stop recording to the tape by pressing Ctrl-C.
+
+8.5 Making a tape file from a real tape
+---------------------------------------
+
+WARNING, ONLY TRY THIS IF YOU REALLY-REALLY WANT TO!
+
+Well it's not so bad as that, I've digitized a lot Spectrum tapes with
+ease, but I have the advantage of having played with tapes a lot on the
+real Spectrum, and of being able to modify the code which does the
+digitization.
+
+First of all you must have a sound-card to do this. If you've got it, then
+you have a small chance of succeeding.
+
+First get the cassette player which you used to play Spectrum tapes. Then
+plug it in your sound-card's 'line-in' or 'mic' inputs. Then somehow set the
+sound driver so that it reads things form the input in which you plugged
+your cassette (I use 'xmmix' the 'Motif Audio Mixer' to do this). And if
+you've managed to get this far, go to the directory where you want to store
+the tape files (remember, there will be a lot of little files: one for each
+little segment!), and enter the following command:
+
+ recs - 32000 | filt | spload tapefile
+
+ or
+
+ recs - 32000 | spload tapefile
+
+(The first type worked better for me)
+
+Where 'recs', 'filt' and 'spload' are programs found in the utils
+directory, and 'tapefile' is the name of the tape file without the '.spt'
+extension.
+
+'.spt' tape files only exist because of historical reasons (the tape
+digitizing program preceeded the emulator, and also at that time I didn't
+know of the '.TAP' format), and now it isn't suppurted by the emulator
+any more. So you must convert '.spt' files to '.tap' with the utility
+spt2tap (in the utils directory) to use it with the emulator.
+
+(The contents of the utils directory can be remade by changing to that
+directory and entering the command: 'make realclean; make')
+
+Now you can put your favorite Spectrum cassette in the cassette player, and
+press the Play button.
+
+'spload' will write a lot of information on the terminal, of which you
+might try to make some sense. Also you can do a 'tail -f tapefile.spt' in
+another terminal, to see what is happening. Again if nothing happens, then
+you are on your own (and most probably at first nothing will happen).
+
+And remember that this digitizer is not better than the real Spectrum, so
+if you cannot load a program with a Spectrum, you'll most probably will not
+be able to load it with 'spload'.
+
+Good Luck!
+
+9. Bug reports
+==============
+
+Please send bug reports to:
+
+mszeredi@inf.bme.hu
+
+If you make any changes to the source, please mail me the 'diff -u' of the
+file(s) changed, and also why were the changes needed.
+
+Please also tell me if you would like to maintain, or to continue
+developing spectemu.
+
+10. Credits
+===========
+
+Szeredi Tamas, for testing the emulator, and for helping with the
+'spectkey.gif'.
+
+Egmont Koblinger for helping to write some parts of the emulator, and for
+a lot of useful suggestions.
+
+Dani Nagy and Zsazsa for helping to test the emulator.
+
+G.A. Lunter for a very good description of the Spectrum, the undocumented
+features of Z80, and the '.z80' snapshot file format.
+
+And lots of others, who sent me good ideas and modifications.
diff --git a/apps/plugins/zxbox/README.DOS b/apps/plugins/zxbox/README.DOS
new file mode 100644
index 0000000000..4d663e9ad6
--- /dev/null
+++ b/apps/plugins/zxbox/README.DOS
@@ -0,0 +1,33 @@
+Spectemu is now basically usable under DOS.
+
+Still missing:
+
+1) Sound
+2) Decent GUI
+
+How to compile:
+---------------
+
+- You will need DJGPP version 2, libkb, and the allegro game library.
+ You can get these at:
+
+To get DJGPP, read:
+ ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/00README.TXT
+
+Libkb is at:
+ ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2tk/libkb100.zip
+
+Allegro is at:
+ ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2tk/allegro/alleg30.zip
+
+
+- Not all files are needed (no long named files are needed, you can
+ try to get rid of them, but they cause no harm)
+
+- copy 'Makefile.dos' to 'Makefile', and 'config.dos' to 'config.h'
+
+- type 'make'
+
+It should compile without warnings. To start it, enter 'vgaspect'.
+
+See also README, for what can be done with the emulator.
diff --git a/apps/plugins/zxbox/README.Z80 b/apps/plugins/zxbox/README.Z80
new file mode 100644
index 0000000000..39f57eff3b
--- /dev/null
+++ b/apps/plugins/zxbox/README.Z80
@@ -0,0 +1,182 @@
+This file describes how to use the Z80 processor emulation as a
+standalone module (without the ZX Spectrum emulation).
+
+===========================================================================
+You will need the following files:
+
+For the 'intel x86' assembly version:
+-------------------------------------
+
+z80.c z80.h z80_type.h i386step.S i386def.S i386op1.S i386op1x.S
+i386op2.S i386op2x.S i386op3.S i386op3x.S i386op4.S i386op5.S i386op6.S
+sp_to_s.c
+
+For the 'C' version:
+--------------------
+
+z80.c z80.h z80_type.h z80_step.c z80_def.h z80_ari.h z80optab.c z80optab.h
+z80_op1.c z80_op1x.c z80_op1.h z80_op2.c z80_op2x.c z80_op2.h
+z80_op3.c z80_op3x.c z80_op3.h z80_op4.c z80_op4x.c z80_op4.h
+z80_op5.c z80_op5.h z80_op6.c z80_op6.h
+
+===========================================================================
+Makefile rules:
+
+For the 'intel x86' assembly version:
+-------------------------------------
+
+CC = gcc
+AR = ar
+CPPFLAGS =
+CFLAGS = -Wall -O3
+CPP = $(CC) -E
+
+z80_i386_objs = z80.o i386emul.o
+
+libz80.a: $(z80_i386_objs)
+ $(AR) cr libz80.a $(z80_i386_objs)
+
+i386emul.o: i386emul.s
+ $(CC) -c $(CFLAGS) i386emul.s
+
+i386emul.s: i386emul.sp sp_to_s
+ ./sp_to_s < i386emul.sp > i386emul.s
+
+i386emul.sp: i386step.S
+ $(CPP) $(CPPFLAGS) i386step.S > i386emul.sp
+
+sp_to_s: sp_to_s.o
+ $(CC) -o sp_to_s $(LDFLAGS) sp_to_s.o
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
+
+
+For 'C' version:
+----------------
+
+CC = gcc
+AR = ar
+CPPFLAGS = -DZ80C
+CFLAGS = -Wall -O3 -fomit-frame-pointer -funroll-loops
+
+z80_c_objs = z80.o z80_step.o z80optab.o z80_op1.o z80_op2.o z80_op3.o \
+ z80_op4.o z80_op5.o z80_op6.o
+
+libz80.a: $(z80_c_objs)
+ $(AR) cr libz80.a $(z80_c_objs)
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
+
+===========================================================================
+The following functions are defined by libz80.a:
+
+void z80_init()
+---------------
+
+This function initializes the processor emulation. This must be called
+only once at the beginning of the program.
+
+int z80_step(int ticknum)
+-------------------------
+
+This function executes z80 instructions for 'ticknum' number of clock
+cycles. It returns the remaining number of ticks.
+
+NOTE: the remaining number of ticks is always zero or negative,
+meaning that exactly, or more than the given 'ticknum' clock cycles
+were executed. This is because WHOLE instructions are executed at a
+time.
+
+NOTE: HALT, LDDR, etc... do not count as one instruction, but as a
+series of instructions (e.g. HALT is a series of NOPs).
+
+void z80_reset()
+----------------
+
+This function resets the Z80 processor. This has the same effect as
+applying a pulse to the RESET input of the processor.
+
+NOTE: z80_init() does not reset the Z80, z80_reset() should be called
+after it.
+
+void z80_interrupt(int data)
+-----------------------------
+
+Causes a Maskable Interrupt. Interrupt mode 1 and 2 are emulated
+correctly, in interrupt mode 2 'data' is used in the address
+calculation. In interrupt mode 0, it is assumed (as on the ZX
+Spectrum) that 0xFF is on the data bus, and always RST 38 is
+generated.
+
+NOTE: It is not emulated, that in the instruction after EI no
+interrupt can be generated.
+
+void z80_nmi()
+--------------
+
+Causes a Non Maskable Interrupt.
+
+===========================================================================
+Accessing the memory, the I/O ports and the Z80 processor's state
+(i.e. registers, etc...)
+
+To use the functions above and the variables below, include the
+"z80.h" include file.
+
+Memory
+------
+
+The memory is stored in the z80_proc.mem[] byte array, which has a
+size of 65536. By default it is all RAM. To make parts of it read
+only, you have to redefine the appropriate macros in i386step.S and/or
+z80_def.h. (These macros are sorounded by #ifdef SPECT_MEM, #else,
+#endif statements.)
+
+The memory is initialised to random data. You must fill it in before
+starting the emulation, but AFTER the call to z80_init().
+
+I/O
+---
+
+The input port values are stored in z80_inports[] array, which has a
+size of 256. The IN instruction will use the appropriate element of
+this array. This array is initialised to all zeroes.
+
+The output port values can be queried from the z80_outports[] array,
+which has also a size of 256. The OUT instruction will store the value
+in the element addressed by the instruction.
+
+If you need more complex behaviour of the I/O, you must redefine the
+appropriate macros in i386step.S and z80_def.h.
+
+Processor state
+---------------
+
+You can access the processor's state with the following variables and
+macros defined in "z80.h".
+
+Registers:
+
+Double registers:
+ normal: BC, DE, HL, AF, IR, IX, IY, PC, SP,
+ aux: BCBK, DEBK, HLBK, AFBK
+
+Single registers:
+ RB, RC, RD, RE, RH, RL, RA, RF, RI, RR, XH, XL, YH, YL, PCH, PCL, SPH, SPL
+
+Misc state:
+ z80_proc.haltstate (1: processor is in halt mode, 0: processor is runnig)
+ z80_proc.it_mode (interrupt mode 0, 1 or 2)
+ z80_proc.iff1 (interrupt flip-flop 1)
+ z80_proc.iff2 (interrupt flip-flop 2)
+
+You need not access the other parts of z80_proc, they are meaningless
+outside the z80_step() function.
diff --git a/apps/plugins/zxbox/SOURCES b/apps/plugins/zxbox/SOURCES
new file mode 100644
index 0000000000..cd02f48787
--- /dev/null
+++ b/apps/plugins/zxbox/SOURCES
@@ -0,0 +1,33 @@
+compr.c
+helpers.c
+interf.c
+keynames.c
+loadim.c
+misc.c
+rom_imag.c
+snapshot.c
+spconf.c
+spect.c
+spectkey.c
+spkey.c
+spmain.c
+spperif.c
+spscr.c
+spsound.c
+sptape.c
+sptiming.c
+tapefile.c
+z80.c
+z80_op1.c
+z80_op2.c
+z80_op3.c
+z80_op4.c
+z80_op5.c
+z80_op6.c
+z80_step.c
+z80optab.c
+zxbox.c
+zxbox_keyb.c
+zxvid_16bpp.c
+zxvid_4bpp.c
+zxvid_grey.c
diff --git a/apps/plugins/zxbox/acconfig.h b/apps/plugins/zxbox/acconfig.h
new file mode 100644
index 0000000000..57031096e8
--- /dev/null
+++ b/apps/plugins/zxbox/acconfig.h
@@ -0,0 +1,43 @@
+
+/* Define this on i386 architectures if the C compiler generates symbols
+ beginning with underscores, eg. on old aout versions of Linux */
+#undef AOUT_FORMAT
+
+/* Define this to enable running in background on the Linux console.
+ Works only with SVGALIB 1.2.11 or newer */
+#undef RUN_IN_BACKGROUND
+
+/* Define this if Xlib has the MITSHM extension */
+#undef HAVE_MITSHM
+
+/* Define this if program can query MITSHM extension */
+#undef HAVE_SHMQUERY
+
+/* Define this if you have the readline library */
+#undef HAVE_READLINE
+
+/* Define this to use the C version of the program insead of the
+ i386 assembly. Define this on non intel machines */
+#undef Z80C
+
+/* Always define this for the spectrum emulator. */
+#undef SPECT_MEM
+
+/* Define if sound driver is available. */
+#undef HAVE_SOUND
+
+/* Define if sound driver is Open Sound System (OSS) */
+#undef OSS_SOUND
+
+/* Define if sound driver is SUN */
+#undef SUN_SOUND
+
+/* Define this to use the inline intel assembly sections */
+#undef I386_ASM
+
+/* Define this to use an alternative way of passing the z80 processor
+ data to the z80 instruction emulation functions. May make emulation
+ faster on some machines, but not on intel, and sparc. */
+#undef PROCP
+
+@TOP@
diff --git a/apps/plugins/zxbox/akey.h b/apps/plugins/zxbox/akey.h
new file mode 100644
index 0000000000..033f034da5
--- /dev/null
+++ b/apps/plugins/zxbox/akey.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* akey.h
+ *
+ * Header of the AKEY module
+ *
+ * Keyboard handeling routines and key identification labels
+ *
+ * Created: 92/12/01 Szeredi Miklos
+ */
+
+
+#ifndef _AKEY_H
+#define _AKEY_H
+
+
+#define NOKEY -1
+#define UNKNOWNKEY -2
+#define ERRKEY -3
+#define MOUSEKEY -256
+
+#define UPKEY (256 + 1)
+#define DOWNKEY (256 + 2)
+#define RIGHTKEY (256 + 3)
+#define LEFTKEY (256 + 4)
+#define INSKEY (256 + 5)
+#define DELKEY (256 + 6)
+#define HOMEKEY (256 + 7)
+#define ENDKEY (256 + 8)
+#define PUKEY (256 + 9)
+#define PDKEY (256 + 10)
+#define BSKEY (256 + 16)
+
+#define FKEYOFFS (256 + 128)
+#define FKEYFIRST (FKEYOFFS + 1)
+#define FKEYLAST (FKEYOFFS + 12)
+#define FKEY(num) (FKEYOFFS + num)
+
+#define ALTKEY (1 << 11)
+#define CTRKEY (1 << 10)
+#define SHKEY (1 << 9)
+
+#define BKTABKEY (TABKEY | SHKEY)
+
+#define CTL(ch) ((ch) - 96)
+#define META(ch) ((ch) | ALTKEY)
+
+#define TABKEY 9
+#define LFKEY 13
+#define CRKEY 10
+#define ENTERKEY LFKEY
+#define ESCKEY 27
+
+#define lastakey() __lastakey
+#define waitakey() ((void)readakey())
+#define setakey(key) ((void)(__lastakey = (key)))
+#define setakeydo(todo) (__atodo = (todo))
+
+
+typedef int keytype;
+typedef void (*__atodotype)(void);
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern __atodotype __atodo;
+
+extern keytype __lastakey;
+
+ extern keytype getakey(void);
+/* extern void setakey(keytype); */ /* MACRO */
+ extern keytype readakey(void);
+/* extern keytype lastakey(void); */ /* MACRO */
+/* extern void waitakey(void); */ /* MACRO */
+ extern int pressedakey(void);
+ extern void clearakeybuff(void);
+/* extern void setakeydo(dofn __atodotype); */ /* MACRO */
+ extern void ungetakey(void);
+ extern int insertakey(keytype key);
+ extern void setasmalldelay(int delay);
+
+ extern int initakey(void);
+ extern void closeakey(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _AKEY_H */
+
+/* End of akey.h */
+
diff --git a/apps/plugins/zxbox/archos.lds b/apps/plugins/zxbox/archos.lds
new file mode 100644
index 0000000000..319b9eb626
--- /dev/null
+++ b/apps/plugins/zxbox/archos.lds
@@ -0,0 +1,47 @@
+#include "config.h"
+
+/* linker script for chessbox as an overlay,
+ * only used/ necessary for SH-based archos targets */
+
+OUTPUT_FORMAT(elf32-sh)
+
+#define DRAMORIG 0x09000000
+#define PLUGIN_LENGTH PLUGIN_BUFFER_SIZE
+
+#define OVERLAY_LENGTH 0x80000
+#define OVERLAY_ORIGIN (DRAMORIG + (MEMORYSIZE * 0x100000) - PLUGIN_LENGTH - OVERLAY_LENGTH)
+
+MEMORY
+{
+ OVERLAY_RAM : ORIGIN = OVERLAY_ORIGIN, LENGTH = OVERLAY_LENGTH
+}
+
+SECTIONS
+{
+ .header : {
+ _plugin_start_addr = .;
+ *(.header)
+ } > OVERLAY_RAM
+
+ .text : {
+ *(.text)
+ *(.text.*)
+ } > OVERLAY_RAM
+
+ .rodata : {
+ *(.rodata)
+ *(.rodata.*)
+ } > OVERLAY_RAM
+
+ .data : {
+ *(.data)
+ } > OVERLAY_RAM
+
+ .bss : {
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _plugin_end_addr = .;
+ } > OVERLAY_RAM
+}
diff --git a/apps/plugins/zxbox/ax.c b/apps/plugins/zxbox/ax.c
new file mode 100644
index 0000000000..c7db7f5c6b
--- /dev/null
+++ b/apps/plugins/zxbox/ax.c
@@ -0,0 +1,815 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ *
+ * ax.c
+ *
+ *
+ *
+ * Created: 94/11/11 Szeredi Miklos
+ *
+ * Version: 0.1 94/11/11
+ * 0.2 95/06/12
+ *
+ */
+
+/* #define DEBUG_EVENTS */
+
+#include "ax.h"
+#include <X11/Xutil.h>
+#include <X11/Xresource.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <signal.h>
+
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+typedef int boolean;
+#define max(x, y) ((x) < (y) ? (y) : (x))
+#define min(x, y) ((x) < (y) ? (x) : (y))
+#define minmax(a, l, u) ((a) < (l) ? (l) : ((a) > (u) ? (u) : (a)))
+
+#define MAX_PROG_NAME_LEN 128
+#define MAX_CLASS_NAME_LEN MAX_PROG_NAME_LEN
+#define MAX_PRES_LEN 256
+#define MAX_FILENAME_LEN 1024
+
+static const char *empty_str = "";
+
+typedef void (*eventproc_t)(XEvent *, void *);
+
+typedef struct _event_proc_struct {
+ eventproc_t event_proc;
+ unsigned long event_mask;
+ Display *disp;
+ void *ptr;
+ Window event_win;
+ boolean done_proc;
+ struct _event_proc_struct *next_proc;
+} event_proc_struct;
+
+typedef struct {
+ const char *event_name;
+ boolean win_given;
+ event_proc_struct *next_proc;
+} event_struct;
+
+typedef struct _disp_struct{
+ Display *disp;
+ XFontStruct *font;
+ struct _disp_struct *next_disp;
+} disp_struct;
+
+
+#define EVENT_NUM LASTEvent
+
+static event_struct event_info[EVENT_NUM];
+
+static disp_struct disp_start = {NULL, NULL, NULL};
+
+static boolean disp_chain_modified;
+
+static char prog_name[MAX_PROG_NAME_LEN + 1];
+static char class_name[MAX_CLASS_NAME_LEN + 1];
+
+static XrmDatabase rDB = NULL; /* Has to be global otherwise Xlib hangs */
+
+static int opTableEntries = 19;
+static aX_options opTable[] = {
+ {"-display", ".display", XrmoptionSepArg, NULL},
+ {"-geometry", ".geometry", XrmoptionSepArg, NULL},
+ {"-bg", ".background", XrmoptionSepArg, NULL},
+ {"-background", ".background", XrmoptionSepArg, NULL},
+ {"-bd", ".borderColor", XrmoptionSepArg, NULL},
+ {"-bordercolor", ".borderColor", XrmoptionSepArg, NULL},
+ {"-bw", ".borderWidth", XrmoptionSepArg, NULL},
+ {"-borderwidth", ".borderWidth", XrmoptionSepArg, NULL},
+ {"-fg", ".foreground", XrmoptionSepArg, NULL},
+ {"-foreground", ".foreground", XrmoptionSepArg, NULL},
+ {"-fn", ".font", XrmoptionSepArg, NULL},
+ {"-font", ".font", XrmoptionSepArg, NULL},
+ {"-name", ".name", XrmoptionSepArg, NULL},
+ {"-rv", ".reverseVideo", XrmoptionNoArg, "on"},
+ {"-reverse", ".reverseVideo", XrmoptionNoArg, "on"},
+ {"+rv", ".reverseVideo", XrmoptionNoArg, "off"},
+ {"-bg", ".background", XrmoptionSepArg, NULL},
+ {"-title", ".title", XrmoptionSepArg, NULL},
+ {"-xrm", NULL, XrmoptionResArg, NULL}
+};
+
+static char *addstr(const char str1[], const char str2[], char str12[],
+ unsigned int str12len)
+{
+ unsigned int i, j, k;
+
+ str12[str12len-1] = '\0';
+
+ for(i=0, j=0, k=0; i + 1 < str12len; ) {
+ if(str1[j]) str12[i] = str1[j++];
+ else str12[i] = str2[k++];
+ if(! str12[i++]) break;
+ }
+ return str12;
+}
+
+
+static char *pname(const char *resource) {
+ static char pnameres[MAX_PRES_LEN];
+
+ return addstr(prog_name, resource, pnameres, MAX_PRES_LEN);
+}
+
+static char *pclass(const char *resource) {
+ static char pclassres[MAX_PRES_LEN];
+
+ return addstr(class_name, resource, pclassres, MAX_PRES_LEN);
+}
+
+
+static void fill_event_info(void)
+{
+ int i;
+
+ for(i = 0; i < EVENT_NUM; i++) {
+ event_info[i].event_name = empty_str;
+ event_info[i].win_given = TRUE;
+ event_info[i].next_proc = NULL;
+ }
+
+ event_info[MappingNotify].win_given = FALSE;
+
+ event_info[ButtonPress].event_name = "ButtonPress";
+ event_info[ButtonRelease].event_name = "ButtonRelease";
+ event_info[CirculateNotify].event_name = "CirculateNotify";
+ event_info[CirculateRequest].event_name = "CirculateRequest";
+ event_info[ClientMessage].event_name = "ClientMessage";
+ event_info[ColormapNotify].event_name = "ColormapNotify";
+ event_info[ConfigureNotify].event_name = "ConfigureNotify";
+ event_info[ConfigureRequest].event_name = "ConfigureRequest";
+ event_info[CreateNotify].event_name = "CreateNotify";
+ event_info[DestroyNotify].event_name = "DestroyNotify";
+ event_info[EnterNotify].event_name = "EnterNotify";
+ event_info[LeaveNotify].event_name = "LeaveNotify";
+ event_info[Expose].event_name = "Expose";
+ event_info[FocusIn].event_name = "FocusIn";
+ event_info[FocusOut].event_name = "FocusOut";
+ event_info[GraphicsExpose].event_name = "GraphicsExpose";
+ event_info[NoExpose].event_name = "NoExpose";
+ event_info[GravityNotify].event_name = "GravityNotify";
+ event_info[KeymapNotify].event_name = "KeymapNotify";
+ event_info[KeyPress].event_name = "KeyPress";
+ event_info[KeyRelease].event_name = "KeyRelease";
+ event_info[MapNotify].event_name = "MapNotify";
+ event_info[UnmapNotify].event_name = "UnmapNotify";
+ event_info[MappingNotify].event_name = "MappingNotify";
+ event_info[MapRequest].event_name = "MapRequest";
+ event_info[MotionNotify].event_name = "MotionNotify";
+ event_info[PropertyNotify].event_name = "PropertyNotify";
+ event_info[ReparentNotify].event_name = "ReparentNotify";
+ event_info[ResizeRequest].event_name = "ResizeRequest";
+ event_info[SelectionClear].event_name = "SelectionClear";
+ event_info[SelectionNotify].event_name = "SelectionNotify";
+ event_info[SelectionRequest].event_name = "SelectionRequest";
+ event_info[VisibilityNotify].event_name = "VisibilityNotify";
+
+}
+
+static void get_def_res(aX_default_resources *defres)
+{
+ XrmValue value;
+ char *str_type;
+ int flags;
+ XColor color_def;
+ unsigned long tmp_pixel;
+ Colormap def_map;
+ int font_spec;
+
+
+ defres->window_name = prog_name;
+ defres->icon_name = prog_name;
+
+
+ defres->scr = DefaultScreen(defres->disp);
+ defres->scr_ptr = ScreenOfDisplay(defres->disp, defres->scr);
+ def_map = DefaultColormapOfScreen(defres->scr_ptr);
+
+
+ if(XrmGetResource(rDB, pname(".title"), pclass(".Title"),
+ &str_type, &value))
+ defres->window_name = (char *) value.addr;
+
+ defres->sflags = PSize;
+ if(XrmGetResource(rDB, pname(".geometry"), pclass(".Geometry"),
+ &str_type, &value)) {
+ flags = XParseGeometry((char *) value.addr, &(defres->x), &(defres->y),
+ &(defres->width), &(defres->height));
+ if((XValue | YValue) & flags) defres->sflags |= USPosition;
+ if((WidthValue | HeightValue) & flags)
+ defres->sflags = (defres->sflags & ~PSize) | USSize;
+ }
+
+ defres->background = defres->background ?
+ WhitePixel(defres->disp, defres->scr) :
+ BlackPixel(defres->disp, defres->scr);
+
+ if(XrmGetResource(rDB, pname(".background"), pclass(".Background"),
+ &str_type, &value)) {
+ if(XParseColor(defres->disp, def_map, value.addr, &color_def)) {
+ if(XAllocColor(defres->disp, def_map, &color_def))
+ defres->background = color_def.pixel;
+ }
+ else fprintf(stderr, "%s: aX: warning: Invalid color specification %s\n",
+ prog_name, value.addr);
+ }
+
+ defres->foreground = defres->foreground ?
+ WhitePixel(defres->disp, defres->scr) :
+ BlackPixel(defres->disp, defres->scr);
+
+ if(XrmGetResource(rDB, pname(".foreground"), pclass(".Foreground"),
+ &str_type, &value)) {
+ if(XParseColor(defres->disp, def_map, value.addr, &color_def)) {
+ if(XAllocColor(defres->disp, def_map, &color_def))
+ defres->foreground = color_def.pixel;
+ }
+ else fprintf(stderr, "%s: aX: warning: Invalid color specification %s\n",
+ prog_name, value.addr);
+ }
+
+ if(XrmGetResource(rDB, pname(".borderWidth"), pclass(".BorderWidth"),
+ &str_type, &value)) {
+ defres->border_width = atoi(value.addr);
+ }
+
+ defres->border_color = defres->foreground;
+ if(XrmGetResource(rDB, pname(".borderColor"), pclass(".BorderColor"),
+ &str_type, &value)) {
+ if(XParseColor(defres->disp, def_map, value.addr, &color_def)) {
+ if(XAllocColor(defres->disp, def_map, &color_def))
+ defres->border_color = color_def.pixel;
+ }
+ else fprintf(stderr, "%s: aX: warning: Invalid color specification %s\n",
+ prog_name, value.addr);
+ }
+
+ font_spec = 0;
+ if(XrmGetResource(rDB, pname(".font"), pclass(".Font"),
+ &str_type, &value)) {
+ defres->font_name = value.addr;
+ if(defres->font_name != NULL) font_spec = 1;
+
+ }
+
+ if(XrmGetResource(rDB, pname(".fallbackFont"), pclass(".Font"),
+ &str_type, &value))
+ defres->fallback_font_name = value.addr;
+
+ if(defres->font_name == NULL ||
+ (defres->font = XLoadQueryFont(defres->disp, defres->font_name))
+ == NULL) {
+
+ if(font_spec)
+ fprintf(stderr, "%s: aX: warning: cannot open %s font, ",
+ prog_name, defres->font_name);
+
+ defres->font_name = defres->fallback_font_name;
+
+ if(font_spec && defres->font_name != NULL)
+ fprintf(stderr, "trying %s...\n",defres->font_name);
+
+ if(defres->font_name == NULL ||
+ (defres->font =
+ XLoadQueryFont(defres->disp, defres->fallback_font_name)) == NULL) {
+
+ if(defres->font_name != NULL) {
+
+ fprintf(stderr, "%s: aX: warning: cannot open %s font, ",
+ prog_name, defres->font_name);
+ }
+
+ defres->font_name = "fixed";
+
+ fprintf(stderr, "trying %s...\n",defres->font_name);
+
+ if((defres->font = XLoadQueryFont(defres->disp, defres->font_name))
+ == NULL) {
+
+ fprintf(stderr, "%s: aX: warning: cannot open %s font\n",
+ prog_name, defres->font_name);
+
+ exit(-1);
+ }
+ }
+ else defres->font_name = defres->fallback_font_name;
+ }
+
+ if(XrmGetResource(rDB, pname(".reverseVideo"), pclass(".ReverseVideo"),
+ &str_type, &value))
+ if(strcmp(value.addr, "on") == 0) {
+ tmp_pixel = defres->foreground;
+ defres->foreground = defres->background;
+ defres->background = tmp_pixel;
+ }
+
+}
+
+
+static void add_disp(aX_default_resources *defres)
+{
+ disp_struct *last;
+
+ for(last = &disp_start; last->next_disp != NULL; last = last->next_disp);
+
+ if((last->next_disp = malloc(sizeof(disp_struct))) == NULL) {
+ fprintf(stderr, "%s: aX: Not enough memory.\n", prog_name);
+ exit(-1);
+ };
+
+ last = last->next_disp;
+
+ last->disp = defres->disp;
+ last->font = defres->font;
+ last->next_disp = NULL;
+
+
+ disp_chain_modified = TRUE;
+}
+
+void aX_open_disp(aX_options *useropt, int useroptlen,
+ int *argcp, char *argv[],
+ aX_default_resources *defres)
+{
+
+ XrmValue value;
+ char *str_type;
+ char *disp_res;
+ char *environment;
+ char *display_name = NULL;
+ char filename[MAX_FILENAME_LEN];
+ int i;
+ XrmDatabase commandlineDB = NULL, usercommandlineDB = NULL;
+ XrmDatabase homeDB, serverDB, applicationDB;
+
+/*
+ if(disp_start.next_disp != NULL) {
+ fprintf(stderr, "aX_open_disp: Cannot open first display twice.\n");
+ exit(-1);
+ }
+*/
+
+ XrmInitialize();
+
+ class_name[0] = '\0';
+ class_name[MAX_CLASS_NAME_LEN] = '\0';
+ if(defres->class_name != NULL)
+ strncpy(class_name, defres->class_name, MAX_CLASS_NAME_LEN);
+
+
+ fill_event_info();
+
+ for(i = 1; i < *argcp; i++)
+ if(strcmp(argv[i], "-name") == 0 && ++i < *argcp){
+ defres->prog_name = argv[i];
+ break;
+ }
+
+
+ prog_name[0] = '\0';
+ prog_name[MAX_PROG_NAME_LEN] = '\0';
+ if(defres->prog_name != NULL)
+ strncpy(prog_name, defres->prog_name, MAX_PROG_NAME_LEN);
+ else
+ strncpy(prog_name, argv[0], MAX_PROG_NAME_LEN);
+
+ defres->prog_name = prog_name;
+
+ XrmParseCommand(&commandlineDB, (XrmOptionDescRec *) opTable,
+ opTableEntries, prog_name, argcp, argv);
+
+ if(useropt != NULL)
+ XrmParseCommand(&usercommandlineDB, (XrmOptionDescRec *) useropt,
+ useroptlen, prog_name, argcp, argv);
+ else usercommandlineDB = NULL;
+
+/*
+ if(*argcp != 1) {
+ fprintf(stderr,
+ "%s: aX_open_disp: Unrecognised options in command line!\n",
+ prog_name);
+ exit(-1);
+ }
+*/
+
+ if(XrmGetResource(commandlineDB, pname(".display"), pclass(".Display"),
+ &str_type, &value)) display_name = (char *) value.addr;
+
+ if((defres->disp = XOpenDisplay(display_name)) == NULL) {
+ fprintf(stderr, "%s: aX_open_disp: cannot connect to X server %s\n",
+ prog_name, XDisplayName(display_name));
+ exit(-1);
+ }
+
+ applicationDB = XrmGetFileDatabase(
+ addstr("/usr/lib/X11/app-defaults/",
+ class_name,
+ filename,
+ MAX_FILENAME_LEN));
+/*
+ if(defres->disp->xdefaults)
+ serverDB = XrmGetStringDatabase(defres->disp->xdefaults);
+ else serverDB = NULL;
+*/
+
+
+ disp_res = XResourceManagerString(defres->disp);
+
+ if(disp_res) serverDB = XrmGetStringDatabase(disp_res);
+ else serverDB = NULL;
+
+
+ if((environment = getenv("XENVIRONMENT")) != NULL)
+ homeDB = XrmGetFileDatabase(environment);
+ else homeDB = NULL;
+
+
+ XrmMergeDatabases(applicationDB, &rDB);
+ XrmMergeDatabases(serverDB, &rDB);
+ XrmMergeDatabases(homeDB, &rDB);
+ XrmMergeDatabases(commandlineDB, &rDB);
+ XrmMergeDatabases(usercommandlineDB, &rDB);
+
+ get_def_res(defres);
+
+ add_disp(defres);
+
+}
+
+
+void aX_open_second_disp(char *display_name,
+ aX_default_resources *defres)
+{
+ char *disp_res;
+
+ XrmDatabase serverDB;
+
+
+ if((defres->disp = XOpenDisplay(display_name)) == NULL) {
+ fprintf(stderr,
+ "%s: aX_open_second_disp: cannot connect to X server %s\n",
+ prog_name, XDisplayName(display_name));
+ exit(-1);
+ }
+
+
+ disp_res = XResourceManagerString(defres->disp);
+
+ if(disp_res) serverDB = XrmGetStringDatabase(disp_res);
+ else serverDB = NULL;
+
+
+ XrmMergeDatabases(serverDB, &rDB);
+
+ get_def_res(defres);
+
+ add_disp(defres);
+}
+
+/*
+
+void smallwait(boolean event_prev)
+{
+ event_prev = event_prev;
+ sleep(1);
+}
+
+*/
+
+
+static void sigalrm_handler(int i)
+{
+ i = i;
+ signal(SIGALRM, SIG_IGN);
+}
+
+
+static void smallwait(boolean event_prev)
+{
+ struct itimerval value;
+
+ signal(SIGALRM, sigalrm_handler);
+
+ event_prev = event_prev;
+
+ value.it_interval.tv_sec = 0L;
+ value.it_interval.tv_usec = 0L;
+ value.it_value.tv_sec = 0L;
+ value.it_value.tv_usec = 100000L;
+ setitimer(ITIMER_REAL, &value, NULL);
+
+ pause();
+}
+
+/* This aX_wait_all_muck needs to be cleared out! */
+
+void aX_wait_event(int eventtype)
+{
+ XEvent ev;
+ event_proc_struct **curr;
+ int i;
+ disp_struct *dsp, *dsp1;
+
+ boolean event_prev;
+
+
+start:;
+
+ if(disp_start.next_disp == NULL) {
+ fprintf(stderr, "%s: aX_wait_event: No connection to any display\n",
+ prog_name);
+ exit(-1);
+ }
+
+ dsp = disp_start.next_disp;
+
+
+ do {
+ event_prev = TRUE;
+
+ dsp1 = dsp;
+ if((disp_start.next_disp)->next_disp != NULL ||
+ eventtype == AX_LOOK_EVENTS)
+ while(XPending(dsp->disp) == 0) {
+ dsp = dsp->next_disp;
+ if(dsp == NULL) dsp = disp_start.next_disp;
+
+ if(dsp == dsp1) {
+ if(eventtype == AX_LOOK_EVENTS) return;
+
+ smallwait(event_prev);
+ event_prev = FALSE;
+ dsp = dsp1 = disp_start.next_disp;
+ }
+ }
+
+ XNextEvent(dsp->disp, &ev);
+#ifdef DEBUG_EVENTS
+ fprintf(stderr,"Event: %s (%i) in win: %li)\n",
+ event_info[ev.type].event_name,
+ ev.type,
+ ev.xany.window);
+#endif
+
+
+ if(dsp->disp != ev.xany.display)
+ fprintf(stderr, "Ha! Event read from wrong display! Stupid XLib!!!\n");
+
+ curr = &(event_info[ev.type].next_proc);
+ i = 0;
+ while(*curr != NULL) {
+ if((*curr)->disp == dsp->disp &&
+ (!event_info[ev.type].win_given ||
+ ev.xany.window == (*curr)->event_win) &&
+ !(*curr)->done_proc) {
+ i++;
+ (*curr)->done_proc = TRUE;
+ disp_chain_modified = FALSE;
+
+ if((*curr)->event_proc != NULL) {
+ (*((*curr)->event_proc))(&ev, (*curr)->ptr);
+ }
+
+ if(disp_chain_modified) goto start;
+ curr = &(event_info[ev.type].next_proc);
+ }
+ else curr = &((*curr)->next_proc);
+ }
+ curr = &(event_info[ev.type].next_proc);
+ while(*curr != NULL) {
+ (*curr)->done_proc = FALSE;
+ curr = &((*curr)->next_proc);
+ }
+
+ if(i == 0)
+ fprintf(stderr, "%s: aX_wait_event: warning: "
+ "Unexpected event: %s (%i) in win: %li)\n",
+ prog_name,
+ event_info[ev.type].event_name,
+ ev.type,
+ ev.xany.window);
+
+ } while(eventtype != ev.type && eventtype != AX_ANY_EVENT);
+}
+
+
+void aX_look_events(void)
+{
+ aX_wait_event(AX_LOOK_EVENTS);
+}
+
+char *aX_get_prog_res(const char *resname, const char* resclass)
+{
+ XrmValue value;
+ char *str_type;
+
+ if(XrmGetResource(rDB, pname(resname), pclass(resclass),
+ &str_type, &value))
+ return (char *)value.addr;
+ else return NULL;
+}
+
+char *aX_get_resource(const char *resname, const char* resclass)
+{
+ XrmValue value;
+ char *str_type;
+
+ if(XrmGetResource(rDB, resname, resclass,
+ &str_type, &value))
+ return (char *)value.addr;
+ else return NULL;
+}
+
+static long get_win_mask(Display *disp, Window win)
+{
+ int evt;
+ event_proc_struct *ep;
+ long winmask;
+
+ for(evt = 0, winmask = 0; evt < EVENT_NUM; evt++) {
+ ep = event_info[evt].next_proc;
+ while(ep != NULL) {
+ if(ep->event_win == win && ep->disp == disp) winmask |= ep->event_mask;
+ ep = ep->next_proc;
+ }
+ }
+ return winmask;
+}
+
+
+
+void aX_add_event_proc(Display *disp,
+ Window win,
+ int eventtype,
+ void (*eventproc)(XEvent *, void *),
+ unsigned long eventmask,
+ void *ptr)
+{
+ event_proc_struct **epp;
+ long winmask;
+
+ epp = &(event_info[eventtype].next_proc);
+ while(*epp != NULL) epp = &((*epp)->next_proc);
+
+ if((*epp = (event_proc_struct *)
+ malloc((size_t) sizeof(event_proc_struct))) == NULL) {
+ fprintf(stderr,
+ "%s: aX_add_event_proc_disp: Not enough memory.\n", prog_name);
+ exit(-1);
+ }
+
+ (*epp)->event_proc = eventproc;
+ (*epp)->ptr = ptr;
+ (*epp)->event_mask = eventmask;
+ (*epp)->disp = disp;
+ (*epp)->event_win = win;
+ (*epp)->done_proc = FALSE;
+ (*epp)->next_proc = NULL;
+
+ if(win) {
+ winmask = get_win_mask(disp, win);
+ XSelectInput(disp, win, winmask);
+ }
+}
+
+void aX_remove_event_proc(Display *disp,
+ Window win,
+ int eventtype,
+ void (*eventproc)(XEvent *, void *))
+{
+ event_proc_struct **epp;
+ event_proc_struct *tmp;
+ long winmask;
+
+ epp = &(event_info[eventtype].next_proc);
+ while(*epp != NULL) {
+ if((*epp)->disp == disp &&
+ (*epp)->event_win == win &&
+ (*epp)->event_proc == eventproc) {
+ tmp = (*epp)->next_proc;
+ free(*epp);
+ *epp = tmp;
+ if(win) {
+ winmask = get_win_mask(disp, win);
+ XSelectInput(disp, win, winmask);
+ }
+ return;
+ }
+ else epp = &((*epp)->next_proc);
+ }
+ fprintf(stderr, "%s: aX_remove_event_proc_disp: warning: "
+ "Could not remove event proc (event: %s (%i), window: %lX)\n",
+ prog_name, event_info[eventtype].event_name, eventtype, win);
+
+}
+
+void aX_close_one_disp(Display *disp)
+{
+/* int evt;
+ event_proc_struct **curr; */
+ disp_struct *dsp, *dsp_tmp;
+
+/*
+ for(evt = 0; evt < EVENT_NUM; evt++) {
+ curr = &(event_info[evt].next_proc);
+ while(*curr != NULL) {
+ if(disp == (*curr)->disp) {
+ aX_remove_event_proc_disp((*curr)->disp, (*curr)->event_win,
+ evt, (*curr)->event_proc);
+ curr = &(event_info[evt].next_proc);
+ }
+ else curr = &((*curr)->next_proc);
+ }
+ }
+
+*/
+
+ for(dsp = &disp_start; dsp->next_disp->disp != disp; dsp = dsp->next_disp)
+ if(dsp->next_disp == NULL) {
+ fprintf(stderr,
+ "%s: aX_close_one_disp: warning: Trying to close unopened display.\n",
+ prog_name);
+ return;
+ }
+
+ XUnloadFont(dsp->next_disp->disp, dsp->next_disp->font->fid);
+ XCloseDisplay(dsp->next_disp->disp);
+
+ dsp_tmp = dsp->next_disp;
+ dsp->next_disp = dsp->next_disp->next_disp;
+ free(dsp_tmp);
+
+ disp_chain_modified = TRUE;
+
+}
+
+void aX_close_disp(void)
+{
+
+ while(disp_start.next_disp != NULL)
+ aX_close_one_disp(disp_start.next_disp->disp);
+
+}
+
+
+unsigned long aX_get_color(Display *disp, int scr, unsigned long def_col,
+ const char *color_name)
+{
+ XColor color_def;
+ Colormap def_map;
+ Screen *scr_ptr;
+
+
+ if(color_name == NULL) return def_col;
+
+ scr_ptr = ScreenOfDisplay(disp, scr);
+ def_map = DefaultColormapOfScreen(scr_ptr);
+
+ if(XParseColor(disp, def_map, color_name, &color_def)) {
+ if(XAllocColor(disp, def_map, &color_def))
+ return color_def.pixel;
+ }
+ else fprintf(stderr,
+ "%s: aX_get_color: warning: Invalid color specification %s\n",
+ prog_name, color_name);
+
+ return def_col;
+
+}
diff --git a/apps/plugins/zxbox/ax.h b/apps/plugins/zxbox/ax.h
new file mode 100644
index 0000000000..5c4784df6a
--- /dev/null
+++ b/apps/plugins/zxbox/ax.h
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* ax.h
+ *
+ * Header of the AX module
+ *
+ *
+ * Created: 94/11/11 Szeredi Miklos
+ */
+
+
+#ifndef _AX_H
+#define _AX_H
+
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+
+/*typedef XrmOptionDescRec aX_options; */
+
+typedef struct {
+ const char *option; /* Option abbreviation in argv */
+ const char *specifier; /* Resource specifier */
+ XrmOptionKind argKind; /* Which style of option it is */
+ const char *value; /* Value to provide if XrmoptionNoArg */
+} aX_options;
+
+
+#define AX_NO_EVENT LASTEvent
+#define AX_ANY_EVENT 0
+#define AX_LOOK_EVENTS -1
+
+typedef struct{
+ Display *disp;
+ int scr;
+ Screen *scr_ptr;
+ unsigned int width;
+ unsigned int height;
+ int x;
+ int y;
+ unsigned int border_width;
+ unsigned long foreground;
+ unsigned long background;
+ unsigned long border_color;
+ const char *font_name;
+ const char *fallback_font_name;
+ XFontStruct *font;
+ long sflags;
+ const char *prog_name;
+ const char *class_name;
+ char *window_name;
+ char *icon_name;
+ } aX_default_resources;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+extern void aX_open_disp(aX_options *useropt, int useroptlen,
+ int *argcp, char *argv[],
+ aX_default_resources *defres);
+extern void aX_open_second_disp(char *display_name,
+ aX_default_resources *defres);
+extern void aX_wait_event(int eventtype);
+extern void aX_look_events(void);
+extern char *aX_get_prog_res(const char *resname, const char* resclass);
+extern char *aX_get_resource(const char *resname, const char* resclass);
+
+extern void aX_add_event_proc(Display *disp,
+ Window win,
+ int eventtype,
+ void (*eventproc)(XEvent *, void *),
+ unsigned long eventmask,
+ void *ptr);
+
+extern void aX_remove_event_proc(Display *disp,
+ Window win,
+ int eventtype,
+ void (*eventproc)(XEvent *, void *));
+
+extern void aX_close_one_disp(Display *disp);
+extern void aX_close_disp(void);
+extern unsigned long aX_get_color(Display *disp, int scr,
+ unsigned long def_col, const char *color_name);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _AX_H */
+
+/* End of ax.h */
+
diff --git a/apps/plugins/zxbox/compr.c b/apps/plugins/zxbox/compr.c
new file mode 100644
index 0000000000..a82e0ce384
--- /dev/null
+++ b/apps/plugins/zxbox/compr.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "compr.h"
+
+void compr(void)
+{
+ int j, c, lc, lled, rep, num;
+
+ rep = 0;
+
+ c = compr_read_byte();
+ lc = 0;
+ num = 0;
+
+ while(c >= 0) {
+ if(lc == 0xED) lled = 1;
+ else lled = 0;
+
+ lc = c;
+ c = compr_read_byte();
+ if(c == lc && num != 255 && (!lled || rep)) {
+ if(!rep) {
+ num = 1;
+ rep = 1;
+ }
+ num++;
+ }
+ else {
+ if(rep) {
+ if(num < 5 && lc != 0xED) for(j = 0; j < num; j++) compr_put_byte(lc);
+ else{
+ compr_put_byte(0xED);
+ compr_put_byte(0xED);
+ compr_put_byte(num);
+ compr_put_byte(lc);
+ num = 0;
+ }
+ rep = 0;
+ }
+ else compr_put_byte(lc);
+ }
+ }
+
+ compr_put_byte(0x00);
+ compr_put_byte(0xED);
+ compr_put_byte(0xED);
+ compr_put_byte(0x00);
+}
+
diff --git a/apps/plugins/zxbox/compr.h b/apps/plugins/zxbox/compr.h
new file mode 100644
index 0000000000..25efad879a
--- /dev/null
+++ b/apps/plugins/zxbox/compr.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef COMPR_H
+#define COMPR_H
+
+extern void compr(void);
+extern int compr_read_byte(void);
+extern void compr_put_byte(int i);
+
+#endif /* COMPR_H */
diff --git a/apps/plugins/zxbox/helpers.c b/apps/plugins/zxbox/helpers.c
new file mode 100644
index 0000000000..dd43434bec
--- /dev/null
+++ b/apps/plugins/zxbox/helpers.c
@@ -0,0 +1,55 @@
+#include "zxconfig.h"
+
+int my_getc(int fd){
+ unsigned char c;
+ if ( rb->read(fd, &c, 1) )
+ return c;
+ else
+ return EOF;
+}
+
+off_t my_ftell(int fd){
+ return rb->lseek(fd, 0, SEEK_CUR);
+}
+
+int my_putc(char c , int fd){
+ return rb->write(fd,&c,1);
+}
+
+void *my_malloc(size_t size)
+{
+ static char *offset = NULL;
+ static int totalSize = 0;
+ char *ret;
+
+ int remainder = size % 4;
+
+ size = size + 4-remainder;
+
+ if (offset == NULL)
+ {
+ offset = rb->plugin_get_audio_buffer(&totalSize);
+ }
+
+ if (size + 4 > abs(totalSize) )
+ {
+ /* printf("\nMALLOC BARF");
+ printf("\nMALLOC BARF");
+ printf("\nMALLOC BARF");
+ printf("\nMALLOC BARF");
+ printf("\nMALLOC BARF");
+ printf("\nMALLOC BARF");
+ printf("\nMALLOC BARF");*/
+ /* We've made our point. */
+
+ return NULL;
+ }
+
+ ret = offset + 4;
+ *((unsigned int *)offset) = size;
+
+ offset += size + 4;
+ totalSize -= size + 4;
+ return ret;
+
+}
diff --git a/apps/plugins/zxbox/helpers.h b/apps/plugins/zxbox/helpers.h
new file mode 100644
index 0000000000..ba8607d5cb
--- /dev/null
+++ b/apps/plugins/zxbox/helpers.h
@@ -0,0 +1,15 @@
+#ifndef HELPERS_H
+#define HELPERS_H
+
+extern int my_getc(int);
+extern int my_putc(char,int);
+extern off_t my_ftell(int);
+extern void *my_malloc(size_t size);
+
+
+#define getc my_getc
+#define malloc my_malloc
+#define ftell my_ftell
+#define putc my_putc
+
+#endif /* HELPERS_H */
diff --git a/apps/plugins/zxbox/interf.c b/apps/plugins/zxbox/interf.c
new file mode 100644
index 0000000000..b57a46ab1f
--- /dev/null
+++ b/apps/plugins/zxbox/interf.c
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "zxconfig.h"
+#include "interf.h"
+
+#include <stdio.h>
+#include <ctype.h>
+
+#define MAXMSGLEN 2048
+
+char filenamebuf[MAXFILENAME];
+char msgbuf[MAXMSGLEN];
+
+char *spif_get_filename(void)
+{
+ char *name=NULL;
+/* char *name, *s;
+
+ s = get_filename_line();
+ for(; *s && isspace((int) *s); s++);
+ name = s;
+ for(; *s && isgraph((int) *s); s++);
+ *s = '\0';
+
+ if(name == s) {
+ printf("Canceled!\n");
+ return NULL;
+ }
+*/
+ return name;
+}
+
+char *spif_get_tape_fileinfo(int *startp, int *nump)
+{
+ *startp=*nump=0;
+ char *name=NULL;
+ /* char *name, *s;
+ int res;
+
+ s = get_filename_line();
+ for(; *s && isspace((int) *s); s++);
+ name = s;
+ for(; *s && isgraph((int) *s); s++);
+
+ if(name != s) res = 1;
+ else res = 0;
+
+ if(*s) {
+ *s = '\0';
+ s++;
+ if(*s) {
+ int r1;
+
+ r1 = sscanf(s, "%d %d", startp, nump);
+ if(r1 > 0) res += r1;
+ }
+ }
+
+ if(res < 1) {
+ printf("Canceled!\n");
+ return NULL;
+ }
+
+ if(res < 2) *startp = -1;
+ if(res < 3) *nump = -1;
+*/
+ return name;
+}
+
+void put_msg(const char *msg)
+{
+#ifndef USE_GRAY
+ rb->splash (HZ/10,true , msg );
+#else
+ LOGF(msg);
+ (void)msg;
+#endif
+}
+
+
+void put_tmp_msg(const char *msg)
+{
+#ifndef USE_GRAY
+ rb->splash (HZ/10,true , msg );
+#else
+ LOGF(msg);
+ (void)msg;
+#endif
+}
+
diff --git a/apps/plugins/zxbox/interf.h b/apps/plugins/zxbox/interf.h
new file mode 100644
index 0000000000..6ab3ae1564
--- /dev/null
+++ b/apps/plugins/zxbox/interf.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef INTERF_H
+#define INTERF_H
+
+#define MAXFILENAME 1024
+
+extern char filenamebuf[];
+extern char msgbuf[];
+extern char *spif_get_filename(void);
+extern void put_msg(const char *msg);
+extern void put_tmp_msg(const char *msg);
+
+#endif /* INTERF_H */
diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h
new file mode 100644
index 0000000000..c22a17379e
--- /dev/null
+++ b/apps/plugins/zxbox/keymaps.h
@@ -0,0 +1,82 @@
+#ifndef KEYMAPS_H
+#define KEYMAPS_H
+
+#if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IPOD_3G_PAD)
+
+#define ZX_UP BUTTON_MENU
+#define ZX_DOWN BUTTON_PLAY
+#define ZX_SELECT BUTTON_SELECT
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+
+#elif CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
+
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_SELECT BUTTON_SELECT
+#define ZX_MENU BUTTON_MODE
+
+#elif CONFIG_KEYPAD == GIGABEAT_PAD
+
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_SELECT BUTTON_SELECT
+#define ZX_MENU BUTTON_MENU
+
+#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
+
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+#define ZX_SELECT BUTTON_SELECT
+#define ZX_MENU BUTTON_PLAY
+
+#elif CONFIG_KEYPAD == RECORDER_PAD
+#define ZX_SELECT BUTTON_PLAY
+#define ZX_MENU BUTTON_OFF
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+
+#elif CONFIG_KEYPAD == ONDIO_PAD
+#define ZX_SELECT BUTTON_MENU
+#define ZX_MENU BUTTON_OFF
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+
+#elif CONFIG_KEYPAD == GMINI100_PAD
+#define ZX_SELECT BUTTON_PLAY
+#define ZX_MENU BUTTON_OFF
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+
+#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
+#define ZX_SELECT BUTTON_SELECT
+#define ZX_MENU BUTTON_PLAY
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+
+#elif CONFIG_KEYPAD == IRIVER_H10_PAD
+#define ZX_SELECT BUTTON_REW
+#define ZX_MENU BUTTON_FF
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_UP BUTTON_SCROLL_UP
+#define ZX_DOWN BUTTON_SCROLL_DOWN
+
+#endif
+
+#endif
diff --git a/apps/plugins/zxbox/keynames.c b/apps/plugins/zxbox/keynames.c
new file mode 100644
index 0000000000..3936a35a43
--- /dev/null
+++ b/apps/plugins/zxbox/keynames.c
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdio.h>
+
+const char *spcf_keynames_ascii[95] = {
+ "space",
+ "exclam",
+ "quotedbl",
+ "numbersign",
+ "dollar",
+ "percent",
+ "ampersand",
+ "apostrophe",
+ "parenleft",
+ "parenright",
+ "asterisk",
+ "plus",
+ "comma",
+ "minus",
+ "period",
+ "slash",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "colon",
+ "semicolon",
+ "less",
+ "equal",
+ "greater",
+ "question",
+ "at",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ "bracketleft",
+ "backslash",
+ "bracketright",
+ "asciicircum",
+ "underscore",
+ "grave",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "braceleft",
+ "bar",
+ "braceright",
+ "asciitilde"
+};
+
+const char *spcf_keynames_misc[256] = {
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ "BackSpace", "Tab", "Linefeed", "Clear",
+ NULL, "Return", NULL, NULL,
+
+ NULL, NULL, NULL, "Pause",
+ "Scroll_Lock", "Sys_Req", NULL, NULL,
+ NULL, NULL, NULL, "Escape",
+ NULL, NULL, NULL, NULL,
+
+ "Multi_key", NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+
+ "Home", "Left", "Up", "Right",
+ "Down", "Page_Up", "Page_Down", "End",
+ "Begin", NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+
+ "Select", "Print", "Execute", "Insert",
+ NULL, "Undo", "Redo", "Menu",
+ "Find", "Cancel", "Help", "Break",
+ NULL, NULL, NULL, NULL,
+
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, "Mode_switch", "Num_Lock",
+
+ "KP_Space", NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ "KP_Tab", NULL, NULL, NULL,
+ NULL, "KP_Enter", NULL, NULL,
+
+ NULL, "KP_F1", "KP_F2", "KP_F3",
+ "KP_F4", "KP_Home", "KP_Left", "KP_Up",
+ "KP_Right", "KP_Down", "KP_Page_Up", "KP_Page_Down",
+ "KP_End", "KP_Begin", "KP_Insert", "KP_Delete",
+
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, "KP_Multiply", "KP_Add",
+ "KP_Separator", "KP_Subtract", "KP_Decimal", "KP_Divide",
+
+ "KP_0", "KP_1", "KP_2", "KP_3",
+ "KP_4", "KP_5", "KP_6", "KP_7",
+ "KP_8", "KP_9", NULL, NULL,
+ NULL, "KP_Equal", "F1", "F2",
+
+ "F3", "F4", "F5", "F6",
+ "F7", "F8", "F9", "F10",
+ "F11", "F12", "F13", "F14",
+ "F15", "F16", "F17", "F18",
+
+ "F19", "F20", "F21", "F22",
+ "F23", "F24", "F25", "F26",
+ "F27", "F28", "F29", "F30",
+ "F31", "F32", "F33", "F34",
+
+ "F35", "Shift_L", "Shift_R", "Control_L",
+ "Control_R", "Caps_Lock", "Shift_Lock", "Meta_L",
+ "Meta_R", "Alt_L", "Alt_R", "Super_L",
+ "Super_R", "Hyper_L", "Hyper_R", NULL,
+
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, "Delete"
+};
diff --git a/apps/plugins/zxbox/loadim.c b/apps/plugins/zxbox/loadim.c
new file mode 100644
index 0000000000..5c59e83464
--- /dev/null
+++ b/apps/plugins/zxbox/loadim.c
@@ -0,0 +1,134 @@
+/* loadim.c */
+
+/*
+ This file was generated by ./bin_to_c from binary image
+ file `loadim.z80'
+ */
+
+unsigned char loadim[] = {
+ 0x00, 0x40, 0x11, 0x00, 0xCB, 0x5C, 0x59, 0x05, 0x4C, 0xFF,
+ 0x3F, 0x57, 0x2E, 0x11, 0x00, 0x21, 0x17, 0x9B, 0x36, 0xBC,
+ 0x7E, 0x00, 0x01, 0x3A, 0x5C, 0xE2, 0x5C, 0x01, 0x01, 0x61,
+ 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
+ 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
+ 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
+ 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
+ 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
+ 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
+ 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
+ 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
+ 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
+ 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0x18, 0x00,
+ 0xED, 0xED, 0xFF, 0x38, 0xED, 0xED, 0xFF, 0x38, 0xED, 0xED,
+ 0xFF, 0x38, 0x38, 0x38, 0x38, 0xED, 0xED, 0xFF, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x00, 0x0D, 0x05, 0x23, 0x0D, 0x0D, 0x23,
+ 0x05, 0xED, 0xED, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0B,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0xED, 0xED,
+ 0x1A, 0x00, 0x3C, 0x40, 0x00, 0xFF, 0x8C, 0x01, 0x54, 0xFF,
+ 0xED, 0xED, 0x05, 0x00, 0xFF, 0xFE, 0xFF, 0x01, 0x38, 0x00,
+ 0x00, 0xCB, 0x5C, 0x00, 0x00, 0xB6, 0x5C, 0xB6, 0x5C, 0xCB,
+ 0x5C, 0xD0, 0x5C, 0xCA, 0x5C, 0xCC, 0x5C, 0xCF, 0x5C, 0xCF,
+ 0x5C, 0x00, 0x00, 0xD1, 0x5C, 0xF3, 0x5C, 0xF3, 0x5C, 0x1B,
+ 0x92, 0x5C, 0x10, 0x02, 0xED, 0xED, 0x08, 0x00, 0x01, 0x1A,
+ 0x00, 0x00, 0x93, 0x00, 0x00, 0x58, 0xFF, 0x00, 0x00, 0x21,
+ 0x00, 0x5B, 0x21, 0x17, 0x00, 0x40, 0xE0, 0x50, 0x21, 0x18,
+ 0x21, 0x17, 0x01, 0x38, 0x00, 0x38, 0xED, 0xED, 0x22, 0x00,
+ 0x57, 0xFF, 0xFF, 0xFF, 0xF4, 0x09, 0xA8, 0x10, 0x4B, 0xF4,
+ 0x09, 0xC4, 0x15, 0x53, 0x81, 0x0F, 0xC4, 0x15, 0x52, 0xF4,
+ 0x09, 0xC4, 0x15, 0x50, 0x80, 0x80, 0xEF, 0x22, 0x22, 0x0D,
+ 0x80, 0x00, 0xFF, 0xED, 0xED, 0x09, 0x20, 0x00, 0x00, 0x00,
+ 0x80, 0xED, 0xED, 0x12, 0x00, 0x80, 0x0D, 0xCE, 0x5C, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
+ 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
+ 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xC4,
+ 0x00, 0xF3, 0x0D, 0xCE, 0x0B, 0xE3, 0x50, 0xCE, 0x0B, 0xE4,
+ 0x50, 0x1D, 0x17, 0xDC, 0x0A, 0xCE, 0x0B, 0xE7, 0x50, 0x1A,
+ 0x17, 0xDC, 0x0A, 0xD7, 0x18, 0x38, 0x00, 0x38, 0x00, 0x0D,
+ 0x19, 0xCF, 0x5C, 0xA9, 0x18, 0x06, 0x03, 0x07, 0x5C, 0xB1,
+ 0x33, 0xB1, 0x33, 0xD6, 0x5C, 0xD0, 0x5C, 0x13, 0x01, 0x5D,
+ 0x16, 0xA5, 0x16, 0x71, 0x07, 0xE2, 0x5C, 0xCB, 0x5C, 0x76,
+ 0x1B, 0x03, 0x13, 0x00, 0x3E, 0x00, 0x3C, 0x42, 0x42, 0x7E,
+ 0x42, 0x42, 0x00, 0x00, 0x7C, 0x42, 0x7C, 0x42, 0x42, 0x7C,
+ 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00,
+ 0x78, 0x44, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x7E, 0x40,
+ 0x7C, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x7E, 0x40, 0x7C, 0x40,
+ 0x40, 0x40, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x4E, 0x42, 0x3C,
+ 0x00, 0x00, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00,
+ 0x3E, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x02, 0x02,
+ 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x44, 0x48, 0x70, 0x48,
+ 0x44, 0x42, 0x00, 0x00, 0xED, 0xED, 0x05, 0x40, 0x7E, 0x00,
+ 0x00, 0x42, 0x66, 0x5A, 0x42, 0x42, 0x42, 0x00, 0x00, 0x42,
+ 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00, 0x00, 0x3C, 0x42, 0x42,
+ 0x42, 0x42, 0x3C, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x40,
+ 0x40, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x52, 0x4A, 0x3C, 0x00,
+ 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x44, 0x42, 0x00, 0x00, 0x3C,
+ 0x40, 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0xFE, 0xED, 0xED,
+ 0x05, 0x10, 0x00, 0x00, 0xED, 0xED, 0x05, 0x42, 0x3C, 0x00,
+ 0x00, 0xED, 0xED, 0x00
+};
+
+const unsigned long loadim_size = 1204;
+
+/* End of loadim.c */
diff --git a/apps/plugins/zxbox/menu.h b/apps/plugins/zxbox/menu.h
new file mode 100644
index 0000000000..b616279880
--- /dev/null
+++ b/apps/plugins/zxbox/menu.h
@@ -0,0 +1 @@
+extern bool zxbox_menu(void);
diff --git a/apps/plugins/zxbox/misc.c b/apps/plugins/zxbox/misc.c
new file mode 100644
index 0000000000..a5a3c6bbb4
--- /dev/null
+++ b/apps/plugins/zxbox/misc.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "misc.h"
+#include "zxconfig.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "helpers.h"
+/*#include <errno.h>*/
+#include "zxconfig.h"
+#define DIR_SEP_CHAR '/'
+
+char *get_base_name(char *fname)
+{
+ char *p;
+
+ p = fname;
+ for(; *p; p++);
+ for(; p >= fname && *p != DIR_SEP_CHAR; p--);
+ return ++p;
+}
+
+
+int check_ext(const char *filename, const char *ext)
+{
+ int flen, elen;
+ int i;
+
+ flen = (int) rb->strlen(filename);
+ elen = (int) rb->strlen(ext);
+
+ if(flen <= elen + 1) return 0;
+
+ if(filename[flen-elen-1] != '.') return 0;
+ for(i = 0; i < elen; i++) if(filename[flen-elen+i] != toupper(ext[i])) break;
+ if(i == elen) return 1;
+ for(i = 0; i < elen; i++) if(filename[flen-elen+i] != tolower(ext[i])) break;
+ if(i == elen) return 1;
+ return 0;
+}
+
+void add_extension(char *filename, const char *ext)
+{
+ int i;
+ int upper;
+
+ i = (int) rb->strlen(filename);
+ if(filename[i] > 64 && filename[i] < 96) upper = 1;
+ else upper = 0;
+
+ filename[i++] = '.';
+ if(upper)
+ for(; *ext; i++, ext++) filename[i] = toupper(*ext);
+ else
+ for(; *ext; i++, ext++) filename[i] = tolower(*ext);
+}
+
+int file_exist(const char *filename)
+{
+ /*FILE *fp;*/
+ int fd;
+
+ fd = rb->open(filename, O_RDONLY);
+ if(fd != NULL) {
+ rb->close(fd);
+ return 1;
+ }
+ else return 0;
+/* if(errno == ENOENT) return 0;
+ return 1;*/
+}
+
+int try_extension(char *filename, const char *ext)
+{
+ int tend;
+
+ tend = (int) rb->strlen(filename);
+ add_extension(filename, ext);
+ if(file_exist(filename)) return 1;
+
+ filename[tend] = '\0';
+ return 0;
+}
+
+void *malloc_err(size_t size)
+{
+ char *p;
+
+ p = (char *) my_malloc(size);
+ if(p == NULL) {
+ // fprintf(stderr, "Out of memory!\n");
+ /*exit(1);*/
+ }
+ return (void *) p;
+}
+
+char *make_string(char *ostr, const char *nstr)
+{
+ if(ostr != NULL) /*free(ostr)*/ostr=0;
+ ostr = malloc_err(rb->strlen(nstr) + 1);
+ rb->strcpy(ostr, nstr);
+ return ostr;
+}
+
+void free_string(char *ostr)
+{
+ if(ostr != NULL) /*free(ostr)*/ostr=0;
+}
+
+int mis_strcasecmp(const char *s1, const char *s2)
+{
+ int c1, c2;
+
+ for(;; s1++, s2++) {
+ c1 = tolower(*s1);
+ c2 = tolower(*s2);
+
+ if(!c1 || c1 != c2) break;
+ }
+ return c1-c2;
+}
diff --git a/apps/plugins/zxbox/misc.h b/apps/plugins/zxbox/misc.h
new file mode 100644
index 0000000000..2dc9f60105
--- /dev/null
+++ b/apps/plugins/zxbox/misc.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef MISC_H
+#define MISC_H
+
+#include <sys/types.h>
+
+extern char *get_base_name(char *fname);
+extern int check_ext(const char *filename, const char *ext);
+extern void add_extension(char *filename, const char *ext);
+extern int file_exist(const char *filename);
+extern int try_extension(char *filename, const char *ext);
+extern char *spif_get_tape_fileinfo(int *startp, int *nump);
+extern void *malloc_err(size_t size);
+extern char *make_string(char *ostr, const char *nstr);
+extern void free_string(char *ostr);
+
+extern int mis_strcasecmp(const char *s1, const char *s2);
+
+#endif /* MISC_H */
diff --git a/apps/plugins/zxbox/rom_imag.c b/apps/plugins/zxbox/rom_imag.c
new file mode 100644
index 0000000000..2b623188d7
--- /dev/null
+++ b/apps/plugins/zxbox/rom_imag.c
@@ -0,0 +1,1652 @@
+/* rom_imag.c */
+
+/*
+ This file was generated by ./bin_to_c from binary image
+ file `rom'
+ */
+
+unsigned char rom_imag[] = {
+ 0xF3, 0xAF, 0x11, 0xFF, 0xFF, 0xC3, 0xCB, 0x11, 0x2A, 0x5D,
+ 0x5C, 0x22, 0x5F, 0x5C, 0x18, 0x43, 0xC3, 0xF2, 0x15, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x5D, 0x5C, 0x7E, 0xCD, 0x7D,
+ 0x00, 0xD0, 0xCD, 0x74, 0x00, 0x18, 0xF7, 0xFF, 0xFF, 0xFF,
+ 0xC3, 0x5B, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2A,
+ 0x61, 0x5C, 0xE5, 0xC3, 0x9E, 0x16, 0xF5, 0xE5, 0x2A, 0x78,
+ 0x5C, 0x23, 0x22, 0x78, 0x5C, 0x7C, 0xB5, 0x20, 0x03, 0xFD,
+ 0x34, 0x40, 0xC5, 0xD5, 0xCD, 0xBF, 0x02, 0xD1, 0xC1, 0xE1,
+ 0xF1, 0xFB, 0xC9, 0xE1, 0x6E, 0xFD, 0x75, 0x00, 0xED, 0x7B,
+ 0x3D, 0x5C, 0xC3, 0xC5, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xF5, 0xE5, 0x2A, 0xB0, 0x5C, 0x7C, 0xB5, 0x20,
+ 0x01, 0xE9, 0xE1, 0xF1, 0xED, 0x45, 0x2A, 0x5D, 0x5C, 0x23,
+ 0x22, 0x5D, 0x5C, 0x7E, 0xC9, 0xFE, 0x21, 0xD0, 0xFE, 0x0D,
+ 0xC8, 0xFE, 0x10, 0xD8, 0xFE, 0x18, 0x3F, 0xD8, 0x23, 0xFE,
+ 0x16, 0x38, 0x01, 0x23, 0x37, 0x22, 0x5D, 0x5C, 0xC9, 0xBF,
+ 0x52, 0x4E, 0xC4, 0x49, 0x4E, 0x4B, 0x45, 0x59, 0xA4, 0x50,
+ 0xC9, 0x46, 0xCE, 0x50, 0x4F, 0x49, 0x4E, 0xD4, 0x53, 0x43,
+ 0x52, 0x45, 0x45, 0x4E, 0xA4, 0x41, 0x54, 0x54, 0xD2, 0x41,
+ 0xD4, 0x54, 0x41, 0xC2, 0x56, 0x41, 0x4C, 0xA4, 0x43, 0x4F,
+ 0x44, 0xC5, 0x56, 0x41, 0xCC, 0x4C, 0x45, 0xCE, 0x53, 0x49,
+ 0xCE, 0x43, 0x4F, 0xD3, 0x54, 0x41, 0xCE, 0x41, 0x53, 0xCE,
+ 0x41, 0x43, 0xD3, 0x41, 0x54, 0xCE, 0x4C, 0xCE, 0x45, 0x58,
+ 0xD0, 0x49, 0x4E, 0xD4, 0x53, 0x51, 0xD2, 0x53, 0x47, 0xCE,
+ 0x41, 0x42, 0xD3, 0x50, 0x45, 0x45, 0xCB, 0x49, 0xCE, 0x55,
+ 0x53, 0xD2, 0x53, 0x54, 0x52, 0xA4, 0x43, 0x48, 0x52, 0xA4,
+ 0x4E, 0x4F, 0xD4, 0x42, 0x49, 0xCE, 0x4F, 0xD2, 0x41, 0x4E,
+ 0xC4, 0x3C, 0xBD, 0x3E, 0xBD, 0x3C, 0xBE, 0x4C, 0x49, 0x4E,
+ 0xC5, 0x54, 0x48, 0x45, 0xCE, 0x54, 0xCF, 0x53, 0x54, 0x45,
+ 0xD0, 0x44, 0x45, 0x46, 0x20, 0x46, 0xCE, 0x43, 0x41, 0xD4,
+ 0x46, 0x4F, 0x52, 0x4D, 0x41, 0xD4, 0x4D, 0x4F, 0x56, 0xC5,
+ 0x45, 0x52, 0x41, 0x53, 0xC5, 0x4F, 0x50, 0x45, 0x4E, 0x20,
+ 0xA3, 0x43, 0x4C, 0x4F, 0x53, 0x45, 0x20, 0xA3, 0x4D, 0x45,
+ 0x52, 0x47, 0xC5, 0x56, 0x45, 0x52, 0x49, 0x46, 0xD9, 0x42,
+ 0x45, 0x45, 0xD0, 0x43, 0x49, 0x52, 0x43, 0x4C, 0xC5, 0x49,
+ 0x4E, 0xCB, 0x50, 0x41, 0x50, 0x45, 0xD2, 0x46, 0x4C, 0x41,
+ 0x53, 0xC8, 0x42, 0x52, 0x49, 0x47, 0x48, 0xD4, 0x49, 0x4E,
+ 0x56, 0x45, 0x52, 0x53, 0xC5, 0x4F, 0x56, 0x45, 0xD2, 0x4F,
+ 0x55, 0xD4, 0x4C, 0x50, 0x52, 0x49, 0x4E, 0xD4, 0x4C, 0x4C,
+ 0x49, 0x53, 0xD4, 0x53, 0x54, 0x4F, 0xD0, 0x52, 0x45, 0x41,
+ 0xC4, 0x44, 0x41, 0x54, 0xC1, 0x52, 0x45, 0x53, 0x54, 0x4F,
+ 0x52, 0xC5, 0x4E, 0x45, 0xD7, 0x42, 0x4F, 0x52, 0x44, 0x45,
+ 0xD2, 0x43, 0x4F, 0x4E, 0x54, 0x49, 0x4E, 0x55, 0xC5, 0x44,
+ 0x49, 0xCD, 0x52, 0x45, 0xCD, 0x46, 0x4F, 0xD2, 0x47, 0x4F,
+ 0x20, 0x54, 0xCF, 0x47, 0x4F, 0x20, 0x53, 0x55, 0xC2, 0x49,
+ 0x4E, 0x50, 0x55, 0xD4, 0x4C, 0x4F, 0x41, 0xC4, 0x4C, 0x49,
+ 0x53, 0xD4, 0x4C, 0x45, 0xD4, 0x50, 0x41, 0x55, 0x53, 0xC5,
+ 0x4E, 0x45, 0x58, 0xD4, 0x50, 0x4F, 0x4B, 0xC5, 0x50, 0x52,
+ 0x49, 0x4E, 0xD4, 0x50, 0x4C, 0x4F, 0xD4, 0x52, 0x55, 0xCE,
+ 0x53, 0x41, 0x56, 0xC5, 0x52, 0x41, 0x4E, 0x44, 0x4F, 0x4D,
+ 0x49, 0x5A, 0xC5, 0x49, 0xC6, 0x43, 0x4C, 0xD3, 0x44, 0x52,
+ 0x41, 0xD7, 0x43, 0x4C, 0x45, 0x41, 0xD2, 0x52, 0x45, 0x54,
+ 0x55, 0x52, 0xCE, 0x43, 0x4F, 0x50, 0xD9, 0x42, 0x48, 0x59,
+ 0x36, 0x35, 0x54, 0x47, 0x56, 0x4E, 0x4A, 0x55, 0x37, 0x34,
+ 0x52, 0x46, 0x43, 0x4D, 0x4B, 0x49, 0x38, 0x33, 0x45, 0x44,
+ 0x58, 0x0E, 0x4C, 0x4F, 0x39, 0x32, 0x57, 0x53, 0x5A, 0x20,
+ 0x0D, 0x50, 0x30, 0x31, 0x51, 0x41, 0xE3, 0xC4, 0xE0, 0xE4,
+ 0xB4, 0xBC, 0xBD, 0xBB, 0xAF, 0xB0, 0xB1, 0xC0, 0xA7, 0xA6,
+ 0xBE, 0xAD, 0xB2, 0xBA, 0xE5, 0xA5, 0xC2, 0xE1, 0xB3, 0xB9,
+ 0xC1, 0xB8, 0x7E, 0xDC, 0xDA, 0x5C, 0xB7, 0x7B, 0x7D, 0xD8,
+ 0xBF, 0xAE, 0xAA, 0xAB, 0xDD, 0xDE, 0xDF, 0x7F, 0xB5, 0xD6,
+ 0x7C, 0xD5, 0x5D, 0xDB, 0xB6, 0xD9, 0x5B, 0xD7, 0x0C, 0x07,
+ 0x06, 0x04, 0x05, 0x08, 0x0A, 0x0B, 0x09, 0x0F, 0xE2, 0x2A,
+ 0x3F, 0xCD, 0xC8, 0xCC, 0xCB, 0x5E, 0xAC, 0x2D, 0x2B, 0x3D,
+ 0x2E, 0x2C, 0x3B, 0x22, 0xC7, 0x3C, 0xC3, 0x3E, 0xC5, 0x2F,
+ 0xC9, 0x60, 0xC6, 0x3A, 0xD0, 0xCE, 0xA8, 0xCA, 0xD3, 0xD4,
+ 0xD1, 0xD2, 0xA9, 0xCF, 0x2E, 0x2F, 0x11, 0xFF, 0xFF, 0x01,
+ 0xFE, 0xFE, 0xED, 0x78, 0x2F, 0xE6, 0x1F, 0x28, 0x0E, 0x67,
+ 0x7D, 0x14, 0xC0, 0xD6, 0x08, 0xCB, 0x3C, 0x30, 0xFA, 0x53,
+ 0x5F, 0x20, 0xF4, 0x2D, 0xCB, 0x00, 0x38, 0xE6, 0x7A, 0x3C,
+ 0xC8, 0xFE, 0x28, 0xC8, 0xFE, 0x19, 0xC8, 0x7B, 0x5A, 0x57,
+ 0xFE, 0x18, 0xC9, 0xCD, 0x8E, 0x02, 0xC0, 0x21, 0x00, 0x5C,
+ 0xCB, 0x7E, 0x20, 0x07, 0x23, 0x35, 0x2B, 0x20, 0x02, 0x36,
+ 0xFF, 0x7D, 0x21, 0x04, 0x5C, 0xBD, 0x20, 0xEE, 0xCD, 0x1E,
+ 0x03, 0xD0, 0x21, 0x00, 0x5C, 0xBE, 0x28, 0x2E, 0xEB, 0x21,
+ 0x04, 0x5C, 0xBE, 0x28, 0x27, 0xCB, 0x7E, 0x20, 0x04, 0xEB,
+ 0xCB, 0x7E, 0xC8, 0x5F, 0x77, 0x23, 0x36, 0x05, 0x23, 0x3A,
+ 0x09, 0x5C, 0x77, 0x23, 0xFD, 0x4E, 0x07, 0xFD, 0x56, 0x01,
+ 0xE5, 0xCD, 0x33, 0x03, 0xE1, 0x77, 0x32, 0x08, 0x5C, 0xFD,
+ 0xCB, 0x01, 0xEE, 0xC9, 0x23, 0x36, 0x05, 0x23, 0x35, 0xC0,
+ 0x3A, 0x0A, 0x5C, 0x77, 0x23, 0x7E, 0x18, 0xEA, 0x42, 0x16,
+ 0x00, 0x7B, 0xFE, 0x27, 0xD0, 0xFE, 0x18, 0x20, 0x03, 0xCB,
+ 0x78, 0xC0, 0x21, 0x05, 0x02, 0x19, 0x7E, 0x37, 0xC9, 0x7B,
+ 0xFE, 0x3A, 0x38, 0x2F, 0x0D, 0xFA, 0x4F, 0x03, 0x28, 0x03,
+ 0xC6, 0x4F, 0xC9, 0x21, 0xEB, 0x01, 0x04, 0x28, 0x03, 0x21,
+ 0x05, 0x02, 0x16, 0x00, 0x19, 0x7E, 0xC9, 0x21, 0x29, 0x02,
+ 0xCB, 0x40, 0x28, 0xF4, 0xCB, 0x5A, 0x28, 0x0A, 0xFD, 0xCB,
+ 0x30, 0x5E, 0xC0, 0x04, 0xC0, 0xC6, 0x20, 0xC9, 0xC6, 0xA5,
+ 0xC9, 0xFE, 0x30, 0xD8, 0x0D, 0xFA, 0x9D, 0x03, 0x20, 0x19,
+ 0x21, 0x54, 0x02, 0xCB, 0x68, 0x28, 0xD3, 0xFE, 0x38, 0x30,
+ 0x07, 0xD6, 0x20, 0x04, 0xC8, 0xC6, 0x08, 0xC9, 0xD6, 0x36,
+ 0x04, 0xC8, 0xC6, 0xFE, 0xC9, 0x21, 0x30, 0x02, 0xFE, 0x39,
+ 0x28, 0xBA, 0xFE, 0x30, 0x28, 0xB6, 0xE6, 0x07, 0xC6, 0x80,
+ 0x04, 0xC8, 0xEE, 0x0F, 0xC9, 0x04, 0xC8, 0xCB, 0x68, 0x21,
+ 0x30, 0x02, 0x20, 0xA4, 0xD6, 0x10, 0xFE, 0x22, 0x28, 0x06,
+ 0xFE, 0x20, 0xC0, 0x3E, 0x5F, 0xC9, 0x3E, 0x40, 0xC9, 0xF3,
+ 0x7D, 0xCB, 0x3D, 0xCB, 0x3D, 0x2F, 0xE6, 0x03, 0x4F, 0x06,
+ 0x00, 0xDD, 0x21, 0xD1, 0x03, 0xDD, 0x09, 0x3A, 0x48, 0x5C,
+ 0xE6, 0x38, 0x0F, 0x0F, 0x0F, 0xF6, 0x08, 0x00, 0x00, 0x00,
+ 0x04, 0x0C, 0x0D, 0x20, 0xFD, 0x0E, 0x3F, 0x05, 0xC2, 0xD6,
+ 0x03, 0xEE, 0x10, 0xD3, 0xFE, 0x44, 0x4F, 0xCB, 0x67, 0x20,
+ 0x09, 0x7A, 0xB3, 0x28, 0x09, 0x79, 0x4D, 0x1B, 0xDD, 0xE9,
+ 0x4D, 0x0C, 0xDD, 0xE9, 0xFB, 0xC9, 0xEF, 0x31, 0x27, 0xC0,
+ 0x03, 0x34, 0xEC, 0x6C, 0x98, 0x1F, 0xF5, 0x04, 0xA1, 0x0F,
+ 0x38, 0x21, 0x92, 0x5C, 0x7E, 0xA7, 0x20, 0x5E, 0x23, 0x4E,
+ 0x23, 0x46, 0x78, 0x17, 0x9F, 0xB9, 0x20, 0x54, 0x23, 0xBE,
+ 0x20, 0x50, 0x78, 0xC6, 0x3C, 0xF2, 0x25, 0x04, 0xE2, 0x6C,
+ 0x04, 0x06, 0xFA, 0x04, 0xD6, 0x0C, 0x30, 0xFB, 0xC6, 0x0C,
+ 0xC5, 0x21, 0x6E, 0x04, 0xCD, 0x06, 0x34, 0xCD, 0xB4, 0x33,
+ 0xEF, 0x04, 0x38, 0xF1, 0x86, 0x77, 0xEF, 0xC0, 0x02, 0x31,
+ 0x38, 0xCD, 0x94, 0x1E, 0xFE, 0x0B, 0x30, 0x22, 0xEF, 0xE0,
+ 0x04, 0xE0, 0x34, 0x80, 0x43, 0x55, 0x9F, 0x80, 0x01, 0x05,
+ 0x34, 0x35, 0x71, 0x03, 0x38, 0xCD, 0x99, 0x1E, 0xC5, 0xCD,
+ 0x99, 0x1E, 0xE1, 0x50, 0x59, 0x7A, 0xB3, 0xC8, 0x1B, 0xC3,
+ 0xB5, 0x03, 0xCF, 0x0A, 0x89, 0x02, 0xD0, 0x12, 0x86, 0x89,
+ 0x0A, 0x97, 0x60, 0x75, 0x89, 0x12, 0xD5, 0x17, 0x1F, 0x89,
+ 0x1B, 0x90, 0x41, 0x02, 0x89, 0x24, 0xD0, 0x53, 0xCA, 0x89,
+ 0x2E, 0x9D, 0x36, 0xB1, 0x89, 0x38, 0xFF, 0x49, 0x3E, 0x89,
+ 0x43, 0xFF, 0x6A, 0x73, 0x89, 0x4F, 0xA7, 0x00, 0x54, 0x89,
+ 0x5C, 0x00, 0x00, 0x00, 0x89, 0x69, 0x14, 0xF6, 0x24, 0x89,
+ 0x76, 0xF1, 0x10, 0x05, 0xCD, 0xFB, 0x24, 0x3A, 0x3B, 0x5C,
+ 0x87, 0xFA, 0x8A, 0x1C, 0xE1, 0xD0, 0xE5, 0xCD, 0xF1, 0x2B,
+ 0x62, 0x6B, 0x0D, 0xF8, 0x09, 0xCB, 0xFE, 0xC9, 0x21, 0x3F,
+ 0x05, 0xE5, 0x21, 0x80, 0x1F, 0xCB, 0x7F, 0x28, 0x03, 0x21,
+ 0x98, 0x0C, 0x08, 0x13, 0xDD, 0x2B, 0xF3, 0x3E, 0x02, 0x47,
+ 0x10, 0xFE, 0xD3, 0xFE, 0xEE, 0x0F, 0x06, 0xA4, 0x2D, 0x20,
+ 0xF5, 0x05, 0x25, 0xF2, 0xD8, 0x04, 0x06, 0x2F, 0x10, 0xFE,
+ 0xD3, 0xFE, 0x3E, 0x0D, 0x06, 0x37, 0x10, 0xFE, 0xD3, 0xFE,
+ 0x01, 0x0E, 0x3B, 0x08, 0x6F, 0xC3, 0x07, 0x05, 0x7A, 0xB3,
+ 0x28, 0x0C, 0xDD, 0x6E, 0x00, 0x7C, 0xAD, 0x67, 0x3E, 0x01,
+ 0x37, 0xC3, 0x25, 0x05, 0x6C, 0x18, 0xF4, 0x79, 0xCB, 0x78,
+ 0x10, 0xFE, 0x30, 0x04, 0x06, 0x42, 0x10, 0xFE, 0xD3, 0xFE,
+ 0x06, 0x3E, 0x20, 0xEF, 0x05, 0xAF, 0x3C, 0xCB, 0x15, 0xC2,
+ 0x14, 0x05, 0x1B, 0xDD, 0x23, 0x06, 0x31, 0x3E, 0x7F, 0xDB,
+ 0xFE, 0x1F, 0xD0, 0x7A, 0x3C, 0xC2, 0xFE, 0x04, 0x06, 0x3B,
+ 0x10, 0xFE, 0xC9, 0xF5, 0x3A, 0x48, 0x5C, 0xE6, 0x38, 0x0F,
+ 0x0F, 0x0F, 0xD3, 0xFE, 0x3E, 0x7F, 0xDB, 0xFE, 0x1F, 0xFB,
+ 0x38, 0x02, 0xCF, 0x0C, 0xF1, 0xC9, 0x14, 0x08, 0x15, 0xF3,
+ 0x3E, 0x0F, 0xD3, 0xFE, 0x21, 0x3F, 0x05, 0xE5, 0xDB, 0xFE,
+ 0x1F, 0xE6, 0x20, 0xF6, 0x02, 0x4F, 0xBF, 0xC0, 0xCD, 0xE7,
+ 0x05, 0x30, 0xFA, 0x21, 0x15, 0x04, 0x10, 0xFE, 0x2B, 0x7C,
+ 0xB5, 0x20, 0xF9, 0xCD, 0xE3, 0x05, 0x30, 0xEB, 0x06, 0x9C,
+ 0xCD, 0xE3, 0x05, 0x30, 0xE4, 0x3E, 0xC6, 0xB8, 0x30, 0xE0,
+ 0x24, 0x20, 0xF1, 0x06, 0xC9, 0xCD, 0xE7, 0x05, 0x30, 0xD5,
+ 0x78, 0xFE, 0xD4, 0x30, 0xF4, 0xCD, 0xE7, 0x05, 0xD0, 0x79,
+ 0xEE, 0x03, 0x4F, 0x26, 0x00, 0x06, 0xB0, 0x18, 0x1F, 0x08,
+ 0x20, 0x07, 0x30, 0x0F, 0xDD, 0x75, 0x00, 0x18, 0x0F, 0xCB,
+ 0x11, 0xAD, 0xC0, 0x79, 0x1F, 0x4F, 0x13, 0x18, 0x07, 0xDD,
+ 0x7E, 0x00, 0xAD, 0xC0, 0xDD, 0x23, 0x1B, 0x08, 0x06, 0xB2,
+ 0x2E, 0x01, 0xCD, 0xE3, 0x05, 0xD0, 0x3E, 0xCB, 0xB8, 0xCB,
+ 0x15, 0x06, 0xB0, 0xD2, 0xCA, 0x05, 0x7C, 0xAD, 0x67, 0x7A,
+ 0xB3, 0x20, 0xCA, 0x7C, 0xFE, 0x01, 0xC9, 0xCD, 0xE7, 0x05,
+ 0xD0, 0x3E, 0x16, 0x3D, 0x20, 0xFD, 0xA7, 0x04, 0xC8, 0x3E,
+ 0x7F, 0xDB, 0xFE, 0x1F, 0xD0, 0xA9, 0xE6, 0x20, 0x28, 0xF3,
+ 0x79, 0x2F, 0x4F, 0xE6, 0x07, 0xF6, 0x08, 0xD3, 0xFE, 0x37,
+ 0xC9, 0xF1, 0x3A, 0x74, 0x5C, 0xD6, 0xE0, 0x32, 0x74, 0x5C,
+ 0xCD, 0x8C, 0x1C, 0xCD, 0x30, 0x25, 0x28, 0x3C, 0x01, 0x11,
+ 0x00, 0x3A, 0x74, 0x5C, 0xA7, 0x28, 0x02, 0x0E, 0x22, 0xF7,
+ 0xD5, 0xDD, 0xE1, 0x06, 0x0B, 0x3E, 0x20, 0x12, 0x13, 0x10,
+ 0xFC, 0xDD, 0x36, 0x01, 0xFF, 0xCD, 0xF1, 0x2B, 0x21, 0xF6,
+ 0xFF, 0x0B, 0x09, 0x03, 0x30, 0x0F, 0x3A, 0x74, 0x5C, 0xA7,
+ 0x20, 0x02, 0xCF, 0x0E, 0x78, 0xB1, 0x28, 0x0A, 0x01, 0x0A,
+ 0x00, 0xDD, 0xE5, 0xE1, 0x23, 0xEB, 0xED, 0xB0, 0xDF, 0xFE,
+ 0xE4, 0x20, 0x49, 0x3A, 0x74, 0x5C, 0xFE, 0x03, 0xCA, 0x8A,
+ 0x1C, 0xE7, 0xCD, 0xB2, 0x28, 0xCB, 0xF9, 0x30, 0x0B, 0x21,
+ 0x00, 0x00, 0x3A, 0x74, 0x5C, 0x3D, 0x28, 0x15, 0xCF, 0x01,
+ 0xC2, 0x8A, 0x1C, 0xCD, 0x30, 0x25, 0x28, 0x18, 0x23, 0x7E,
+ 0xDD, 0x77, 0x0B, 0x23, 0x7E, 0xDD, 0x77, 0x0C, 0x23, 0xDD,
+ 0x71, 0x0E, 0x3E, 0x01, 0xCB, 0x71, 0x28, 0x01, 0x3C, 0xDD,
+ 0x77, 0x00, 0xEB, 0xE7, 0xFE, 0x29, 0x20, 0xDA, 0xE7, 0xCD,
+ 0xEE, 0x1B, 0xEB, 0xC3, 0x5A, 0x07, 0xFE, 0xAA, 0x20, 0x1F,
+ 0x3A, 0x74, 0x5C, 0xFE, 0x03, 0xCA, 0x8A, 0x1C, 0xE7, 0xCD,
+ 0xEE, 0x1B, 0xDD, 0x36, 0x0B, 0x00, 0xDD, 0x36, 0x0C, 0x1B,
+ 0x21, 0x00, 0x40, 0xDD, 0x75, 0x0D, 0xDD, 0x74, 0x0E, 0x18,
+ 0x4D, 0xFE, 0xAF, 0x20, 0x4F, 0x3A, 0x74, 0x5C, 0xFE, 0x03,
+ 0xCA, 0x8A, 0x1C, 0xE7, 0xCD, 0x48, 0x20, 0x20, 0x0C, 0x3A,
+ 0x74, 0x5C, 0xA7, 0xCA, 0x8A, 0x1C, 0xCD, 0xE6, 0x1C, 0x18,
+ 0x0F, 0xCD, 0x82, 0x1C, 0xDF, 0xFE, 0x2C, 0x28, 0x0C, 0x3A,
+ 0x74, 0x5C, 0xA7, 0xCA, 0x8A, 0x1C, 0xCD, 0xE6, 0x1C, 0x18,
+ 0x04, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0xCD, 0x99,
+ 0x1E, 0xDD, 0x71, 0x0B, 0xDD, 0x70, 0x0C, 0xCD, 0x99, 0x1E,
+ 0xDD, 0x71, 0x0D, 0xDD, 0x70, 0x0E, 0x60, 0x69, 0xDD, 0x36,
+ 0x00, 0x03, 0x18, 0x44, 0xFE, 0xCA, 0x28, 0x09, 0xCD, 0xEE,
+ 0x1B, 0xDD, 0x36, 0x0E, 0x80, 0x18, 0x17, 0x3A, 0x74, 0x5C,
+ 0xA7, 0xC2, 0x8A, 0x1C, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE,
+ 0x1B, 0xCD, 0x99, 0x1E, 0xDD, 0x71, 0x0D, 0xDD, 0x70, 0x0E,
+ 0xDD, 0x36, 0x00, 0x00, 0x2A, 0x59, 0x5C, 0xED, 0x5B, 0x53,
+ 0x5C, 0x37, 0xED, 0x52, 0xDD, 0x75, 0x0B, 0xDD, 0x74, 0x0C,
+ 0x2A, 0x4B, 0x5C, 0xED, 0x52, 0xDD, 0x75, 0x0F, 0xDD, 0x74,
+ 0x10, 0xEB, 0x3A, 0x74, 0x5C, 0xA7, 0xCA, 0x70, 0x09, 0xE5,
+ 0x01, 0x11, 0x00, 0xDD, 0x09, 0xDD, 0xE5, 0x11, 0x11, 0x00,
+ 0xAF, 0x37, 0xCD, 0x56, 0x05, 0xDD, 0xE1, 0x30, 0xF2, 0x3E,
+ 0xFE, 0xCD, 0x01, 0x16, 0xFD, 0x36, 0x52, 0x03, 0x0E, 0x80,
+ 0xDD, 0x7E, 0x00, 0xDD, 0xBE, 0xEF, 0x20, 0x02, 0x0E, 0xF6,
+ 0xFE, 0x04, 0x30, 0xD9, 0x11, 0xC0, 0x09, 0xC5, 0xCD, 0x0A,
+ 0x0C, 0xC1, 0xDD, 0xE5, 0xD1, 0x21, 0xF0, 0xFF, 0x19, 0x06,
+ 0x0A, 0x7E, 0x3C, 0x20, 0x03, 0x79, 0x80, 0x4F, 0x13, 0x1A,
+ 0xBE, 0x23, 0x20, 0x01, 0x0C, 0xD7, 0x10, 0xF6, 0xCB, 0x79,
+ 0x20, 0xB3, 0x3E, 0x0D, 0xD7, 0xE1, 0xDD, 0x7E, 0x00, 0xFE,
+ 0x03, 0x28, 0x0C, 0x3A, 0x74, 0x5C, 0x3D, 0xCA, 0x08, 0x08,
+ 0xFE, 0x02, 0xCA, 0xB6, 0x08, 0xE5, 0xDD, 0x6E, 0xFA, 0xDD,
+ 0x66, 0xFB, 0xDD, 0x5E, 0x0B, 0xDD, 0x56, 0x0C, 0x7C, 0xB5,
+ 0x28, 0x0D, 0xED, 0x52, 0x38, 0x26, 0x28, 0x07, 0xDD, 0x7E,
+ 0x00, 0xFE, 0x03, 0x20, 0x1D, 0xE1, 0x7C, 0xB5, 0x20, 0x06,
+ 0xDD, 0x6E, 0x0D, 0xDD, 0x66, 0x0E, 0xE5, 0xDD, 0xE1, 0x3A,
+ 0x74, 0x5C, 0xFE, 0x02, 0x37, 0x20, 0x01, 0xA7, 0x3E, 0xFF,
+ 0xCD, 0x56, 0x05, 0xD8, 0xCF, 0x1A, 0xDD, 0x5E, 0x0B, 0xDD,
+ 0x56, 0x0C, 0xE5, 0x7C, 0xB5, 0x20, 0x06, 0x13, 0x13, 0x13,
+ 0xEB, 0x18, 0x0C, 0xDD, 0x6E, 0xFA, 0xDD, 0x66, 0xFB, 0xEB,
+ 0x37, 0xED, 0x52, 0x38, 0x09, 0x11, 0x05, 0x00, 0x19, 0x44,
+ 0x4D, 0xCD, 0x05, 0x1F, 0xE1, 0xDD, 0x7E, 0x00, 0xA7, 0x28,
+ 0x3E, 0x7C, 0xB5, 0x28, 0x13, 0x2B, 0x46, 0x2B, 0x4E, 0x2B,
+ 0x03, 0x03, 0x03, 0xDD, 0x22, 0x5F, 0x5C, 0xCD, 0xE8, 0x19,
+ 0xDD, 0x2A, 0x5F, 0x5C, 0x2A, 0x59, 0x5C, 0x2B, 0xDD, 0x4E,
+ 0x0B, 0xDD, 0x46, 0x0C, 0xC5, 0x03, 0x03, 0x03, 0xDD, 0x7E,
+ 0xFD, 0xF5, 0xCD, 0x55, 0x16, 0x23, 0xF1, 0x77, 0xD1, 0x23,
+ 0x73, 0x23, 0x72, 0x23, 0xE5, 0xDD, 0xE1, 0x37, 0x3E, 0xFF,
+ 0xC3, 0x02, 0x08, 0xEB, 0x2A, 0x59, 0x5C, 0x2B, 0xDD, 0x22,
+ 0x5F, 0x5C, 0xDD, 0x4E, 0x0B, 0xDD, 0x46, 0x0C, 0xC5, 0xCD,
+ 0xE5, 0x19, 0xC1, 0xE5, 0xC5, 0xCD, 0x55, 0x16, 0xDD, 0x2A,
+ 0x5F, 0x5C, 0x23, 0xDD, 0x4E, 0x0F, 0xDD, 0x46, 0x10, 0x09,
+ 0x22, 0x4B, 0x5C, 0xDD, 0x66, 0x0E, 0x7C, 0xE6, 0xC0, 0x20,
+ 0x0A, 0xDD, 0x6E, 0x0D, 0x22, 0x42, 0x5C, 0xFD, 0x36, 0x0A,
+ 0x00, 0xD1, 0xDD, 0xE1, 0x37, 0x3E, 0xFF, 0xC3, 0x02, 0x08,
+ 0xDD, 0x4E, 0x0B, 0xDD, 0x46, 0x0C, 0xC5, 0x03, 0xF7, 0x36,
+ 0x80, 0xEB, 0xD1, 0xE5, 0xE5, 0xDD, 0xE1, 0x37, 0x3E, 0xFF,
+ 0xCD, 0x02, 0x08, 0xE1, 0xED, 0x5B, 0x53, 0x5C, 0x7E, 0xE6,
+ 0xC0, 0x20, 0x19, 0x1A, 0x13, 0xBE, 0x23, 0x20, 0x02, 0x1A,
+ 0xBE, 0x1B, 0x2B, 0x30, 0x08, 0xE5, 0xEB, 0xCD, 0xB8, 0x19,
+ 0xE1, 0x18, 0xEC, 0xCD, 0x2C, 0x09, 0x18, 0xE2, 0x7E, 0x4F,
+ 0xFE, 0x80, 0xC8, 0xE5, 0x2A, 0x4B, 0x5C, 0x7E, 0xFE, 0x80,
+ 0x28, 0x25, 0xB9, 0x28, 0x08, 0xC5, 0xCD, 0xB8, 0x19, 0xC1,
+ 0xEB, 0x18, 0xF0, 0xE6, 0xE0, 0xFE, 0xA0, 0x20, 0x12, 0xD1,
+ 0xD5, 0xE5, 0x23, 0x13, 0x1A, 0xBE, 0x20, 0x06, 0x17, 0x30,
+ 0xF7, 0xE1, 0x18, 0x03, 0xE1, 0x18, 0xE0, 0x3E, 0xFF, 0xD1,
+ 0xEB, 0x3C, 0x37, 0xCD, 0x2C, 0x09, 0x18, 0xC4, 0x20, 0x10,
+ 0x08, 0x22, 0x5F, 0x5C, 0xEB, 0xCD, 0xB8, 0x19, 0xCD, 0xE8,
+ 0x19, 0xEB, 0x2A, 0x5F, 0x5C, 0x08, 0x08, 0xD5, 0xCD, 0xB8,
+ 0x19, 0x22, 0x5F, 0x5C, 0x2A, 0x53, 0x5C, 0xE3, 0xC5, 0x08,
+ 0x38, 0x07, 0x2B, 0xCD, 0x55, 0x16, 0x23, 0x18, 0x03, 0xCD,
+ 0x55, 0x16, 0x23, 0xC1, 0xD1, 0xED, 0x53, 0x53, 0x5C, 0xED,
+ 0x5B, 0x5F, 0x5C, 0xC5, 0xD5, 0xEB, 0xED, 0xB0, 0xE1, 0xC1,
+ 0xD5, 0xCD, 0xE8, 0x19, 0xD1, 0xC9, 0xE5, 0x3E, 0xFD, 0xCD,
+ 0x01, 0x16, 0xAF, 0x11, 0xA1, 0x09, 0xCD, 0x0A, 0x0C, 0xFD,
+ 0xCB, 0x02, 0xEE, 0xCD, 0xD4, 0x15, 0xDD, 0xE5, 0x11, 0x11,
+ 0x00, 0xAF, 0xCD, 0xC2, 0x04, 0xDD, 0xE1, 0x06, 0x32, 0x76,
+ 0x10, 0xFD, 0xDD, 0x5E, 0x0B, 0xDD, 0x56, 0x0C, 0x3E, 0xFF,
+ 0xDD, 0xE1, 0xC3, 0xC2, 0x04, 0x80, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x20, 0x74, 0x61, 0x70, 0x65, 0x2C, 0x20, 0x74, 0x68,
+ 0x65, 0x6E, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61,
+ 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79, 0xAE, 0x0D, 0x50, 0x72,
+ 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x3A, 0xA0, 0x0D, 0x4E, 0x75,
+ 0x6D, 0x62, 0x65, 0x72, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79,
+ 0x3A, 0xA0, 0x0D, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3A, 0xA0,
+ 0x0D, 0x42, 0x79, 0x74, 0x65, 0x73, 0x3A, 0xA0, 0xCD, 0x03,
+ 0x0B, 0xFE, 0x20, 0xD2, 0xD9, 0x0A, 0xFE, 0x06, 0x38, 0x69,
+ 0xFE, 0x18, 0x30, 0x65, 0x21, 0x0B, 0x0A, 0x5F, 0x16, 0x00,
+ 0x19, 0x5E, 0x19, 0xE5, 0xC3, 0x03, 0x0B, 0x4E, 0x57, 0x10,
+ 0x29, 0x54, 0x53, 0x52, 0x37, 0x50, 0x4F, 0x5F, 0x5E, 0x5D,
+ 0x5C, 0x5B, 0x5A, 0x54, 0x53, 0x0C, 0x3E, 0x22, 0xB9, 0x20,
+ 0x11, 0xFD, 0xCB, 0x01, 0x4E, 0x20, 0x09, 0x04, 0x0E, 0x02,
+ 0x3E, 0x18, 0xB8, 0x20, 0x03, 0x05, 0x0E, 0x21, 0xC3, 0xD9,
+ 0x0D, 0x3A, 0x91, 0x5C, 0xF5, 0xFD, 0x36, 0x57, 0x01, 0x3E,
+ 0x20, 0xCD, 0x65, 0x0B, 0xF1, 0x32, 0x91, 0x5C, 0xC9, 0xFD,
+ 0xCB, 0x01, 0x4E, 0xC2, 0xCD, 0x0E, 0x0E, 0x21, 0xCD, 0x55,
+ 0x0C, 0x05, 0xC3, 0xD9, 0x0D, 0xCD, 0x03, 0x0B, 0x79, 0x3D,
+ 0x3D, 0xE6, 0x10, 0x18, 0x5A, 0x3E, 0x3F, 0x18, 0x6C, 0x11,
+ 0x87, 0x0A, 0x32, 0x0F, 0x5C, 0x18, 0x0B, 0x11, 0x6D, 0x0A,
+ 0x18, 0x03, 0x11, 0x87, 0x0A, 0x32, 0x0E, 0x5C, 0x2A, 0x51,
+ 0x5C, 0x73, 0x23, 0x72, 0xC9, 0x11, 0xF4, 0x09, 0xCD, 0x80,
+ 0x0A, 0x2A, 0x0E, 0x5C, 0x57, 0x7D, 0xFE, 0x16, 0xDA, 0x11,
+ 0x22, 0x20, 0x29, 0x44, 0x4A, 0x3E, 0x1F, 0x91, 0x38, 0x0C,
+ 0xC6, 0x02, 0x4F, 0xFD, 0xCB, 0x01, 0x4E, 0x20, 0x16, 0x3E,
+ 0x16, 0x90, 0xDA, 0x9F, 0x1E, 0x3C, 0x47, 0x04, 0xFD, 0xCB,
+ 0x02, 0x46, 0xC2, 0x55, 0x0C, 0xFD, 0xBE, 0x31, 0xDA, 0x86,
+ 0x0C, 0xC3, 0xD9, 0x0D, 0x7C, 0xCD, 0x03, 0x0B, 0x81, 0x3D,
+ 0xE6, 0x1F, 0xC8, 0x57, 0xFD, 0xCB, 0x01, 0xC6, 0x3E, 0x20,
+ 0xCD, 0x3B, 0x0C, 0x15, 0x20, 0xF8, 0xC9, 0xCD, 0x24, 0x0B,
+ 0xFD, 0xCB, 0x01, 0x4E, 0x20, 0x1A, 0xFD, 0xCB, 0x02, 0x46,
+ 0x20, 0x08, 0xED, 0x43, 0x88, 0x5C, 0x22, 0x84, 0x5C, 0xC9,
+ 0xED, 0x43, 0x8A, 0x5C, 0xED, 0x43, 0x82, 0x5C, 0x22, 0x86,
+ 0x5C, 0xC9, 0xFD, 0x71, 0x45, 0x22, 0x80, 0x5C, 0xC9, 0xFD,
+ 0xCB, 0x01, 0x4E, 0x20, 0x14, 0xED, 0x4B, 0x88, 0x5C, 0x2A,
+ 0x84, 0x5C, 0xFD, 0xCB, 0x02, 0x46, 0xC8, 0xED, 0x4B, 0x8A,
+ 0x5C, 0x2A, 0x86, 0x5C, 0xC9, 0xFD, 0x4E, 0x45, 0x2A, 0x80,
+ 0x5C, 0xC9, 0xFE, 0x80, 0x38, 0x3D, 0xFE, 0x90, 0x30, 0x26,
+ 0x47, 0xCD, 0x38, 0x0B, 0xCD, 0x03, 0x0B, 0x11, 0x92, 0x5C,
+ 0x18, 0x47, 0x21, 0x92, 0x5C, 0xCD, 0x3E, 0x0B, 0xCB, 0x18,
+ 0x9F, 0xE6, 0x0F, 0x4F, 0xCB, 0x18, 0x9F, 0xE6, 0xF0, 0xB1,
+ 0x0E, 0x04, 0x77, 0x23, 0x0D, 0x20, 0xFB, 0xC9, 0xD6, 0xA5,
+ 0x30, 0x09, 0xC6, 0x15, 0xC5, 0xED, 0x4B, 0x7B, 0x5C, 0x18,
+ 0x0B, 0xCD, 0x10, 0x0C, 0xC3, 0x03, 0x0B, 0xC5, 0xED, 0x4B,
+ 0x36, 0x5C, 0xEB, 0x21, 0x3B, 0x5C, 0xCB, 0x86, 0xFE, 0x20,
+ 0x20, 0x02, 0xCB, 0xC6, 0x26, 0x00, 0x6F, 0x29, 0x29, 0x29,
+ 0x09, 0xC1, 0xEB, 0x79, 0x3D, 0x3E, 0x21, 0x20, 0x0E, 0x05,
+ 0x4F, 0xFD, 0xCB, 0x01, 0x4E, 0x28, 0x06, 0xD5, 0xCD, 0xCD,
+ 0x0E, 0xD1, 0x79, 0xB9, 0xD5, 0xCC, 0x55, 0x0C, 0xD1, 0xC5,
+ 0xE5, 0x3A, 0x91, 0x5C, 0x06, 0xFF, 0x1F, 0x38, 0x01, 0x04,
+ 0x1F, 0x1F, 0x9F, 0x4F, 0x3E, 0x08, 0xA7, 0xFD, 0xCB, 0x01,
+ 0x4E, 0x28, 0x05, 0xFD, 0xCB, 0x30, 0xCE, 0x37, 0xEB, 0x08,
+ 0x1A, 0xA0, 0xAE, 0xA9, 0x12, 0x08, 0x38, 0x13, 0x14, 0x23,
+ 0x3D, 0x20, 0xF2, 0xEB, 0x25, 0xFD, 0xCB, 0x01, 0x4E, 0xCC,
+ 0xDB, 0x0B, 0xE1, 0xC1, 0x0D, 0x23, 0xC9, 0x08, 0x3E, 0x20,
+ 0x83, 0x5F, 0x08, 0x18, 0xE6, 0x7C, 0x0F, 0x0F, 0x0F, 0xE6,
+ 0x03, 0xF6, 0x58, 0x67, 0xED, 0x5B, 0x8F, 0x5C, 0x7E, 0xAB,
+ 0xA2, 0xAB, 0xFD, 0xCB, 0x57, 0x76, 0x28, 0x08, 0xE6, 0xC7,
+ 0xCB, 0x57, 0x20, 0x02, 0xEE, 0x38, 0xFD, 0xCB, 0x57, 0x66,
+ 0x28, 0x08, 0xE6, 0xF8, 0xCB, 0x6F, 0x20, 0x02, 0xEE, 0x07,
+ 0x77, 0xC9, 0xE5, 0x26, 0x00, 0xE3, 0x18, 0x04, 0x11, 0x95,
+ 0x00, 0xF5, 0xCD, 0x41, 0x0C, 0x38, 0x09, 0x3E, 0x20, 0xFD,
+ 0xCB, 0x01, 0x46, 0xCC, 0x3B, 0x0C, 0x1A, 0xE6, 0x7F, 0xCD,
+ 0x3B, 0x0C, 0x1A, 0x13, 0x87, 0x30, 0xF5, 0xD1, 0xFE, 0x48,
+ 0x28, 0x03, 0xFE, 0x82, 0xD8, 0x7A, 0xFE, 0x03, 0xD8, 0x3E,
+ 0x20, 0xD5, 0xD9, 0xD7, 0xD9, 0xD1, 0xC9, 0xF5, 0xEB, 0x3C,
+ 0xCB, 0x7E, 0x23, 0x28, 0xFB, 0x3D, 0x20, 0xF8, 0xEB, 0xF1,
+ 0xFE, 0x20, 0xD8, 0x1A, 0xD6, 0x41, 0xC9, 0xFD, 0xCB, 0x01,
+ 0x4E, 0xC0, 0x11, 0xD9, 0x0D, 0xD5, 0x78, 0xFD, 0xCB, 0x02,
+ 0x46, 0xC2, 0x02, 0x0D, 0xFD, 0xBE, 0x31, 0x38, 0x1B, 0xC0,
+ 0xFD, 0xCB, 0x02, 0x66, 0x28, 0x16, 0xFD, 0x5E, 0x2D, 0x1D,
+ 0x28, 0x5A, 0x3E, 0x00, 0xCD, 0x01, 0x16, 0xED, 0x7B, 0x3F,
+ 0x5C, 0xFD, 0xCB, 0x02, 0xA6, 0xC9, 0xCF, 0x04, 0xFD, 0x35,
+ 0x52, 0x20, 0x45, 0x3E, 0x18, 0x90, 0x32, 0x8C, 0x5C, 0x2A,
+ 0x8F, 0x5C, 0xE5, 0x3A, 0x91, 0x5C, 0xF5, 0x3E, 0xFD, 0xCD,
+ 0x01, 0x16, 0xAF, 0x11, 0xF8, 0x0C, 0xCD, 0x0A, 0x0C, 0xFD,
+ 0xCB, 0x02, 0xEE, 0x21, 0x3B, 0x5C, 0xCB, 0xDE, 0xCB, 0xAE,
+ 0xD9, 0xCD, 0xD4, 0x15, 0xD9, 0xFE, 0x20, 0x28, 0x45, 0xFE,
+ 0xE2, 0x28, 0x41, 0xF6, 0x20, 0xFE, 0x6E, 0x28, 0x3B, 0x3E,
+ 0xFE, 0xCD, 0x01, 0x16, 0xF1, 0x32, 0x91, 0x5C, 0xE1, 0x22,
+ 0x8F, 0x5C, 0xCD, 0xFE, 0x0D, 0xFD, 0x46, 0x31, 0x04, 0x0E,
+ 0x21, 0xC5, 0xCD, 0x9B, 0x0E, 0x7C, 0x0F, 0x0F, 0x0F, 0xE6,
+ 0x03, 0xF6, 0x58, 0x67, 0x11, 0xE0, 0x5A, 0x1A, 0x4E, 0x06,
+ 0x20, 0xEB, 0x12, 0x71, 0x13, 0x23, 0x10, 0xFA, 0xC1, 0xC9,
+ 0x80, 0x73, 0x63, 0x72, 0x6F, 0x6C, 0x6C, 0xBF, 0xCF, 0x0C,
+ 0xFE, 0x02, 0x38, 0x80, 0xFD, 0x86, 0x31, 0xD6, 0x19, 0xD0,
+ 0xED, 0x44, 0xC5, 0x47, 0x2A, 0x8F, 0x5C, 0xE5, 0x2A, 0x91,
+ 0x5C, 0xE5, 0xCD, 0x4D, 0x0D, 0x78, 0xF5, 0x21, 0x6B, 0x5C,
+ 0x46, 0x78, 0x3C, 0x77, 0x21, 0x89, 0x5C, 0xBE, 0x38, 0x03,
+ 0x34, 0x06, 0x18, 0xCD, 0x00, 0x0E, 0xF1, 0x3D, 0x20, 0xE8,
+ 0xE1, 0xFD, 0x75, 0x57, 0xE1, 0x22, 0x8F, 0x5C, 0xED, 0x4B,
+ 0x88, 0x5C, 0xFD, 0xCB, 0x02, 0x86, 0xCD, 0xD9, 0x0D, 0xFD,
+ 0xCB, 0x02, 0xC6, 0xC1, 0xC9, 0xAF, 0x2A, 0x8D, 0x5C, 0xFD,
+ 0xCB, 0x02, 0x46, 0x28, 0x04, 0x67, 0xFD, 0x6E, 0x0E, 0x22,
+ 0x8F, 0x5C, 0x21, 0x91, 0x5C, 0x20, 0x02, 0x7E, 0x0F, 0xAE,
+ 0xE6, 0x55, 0xAE, 0x77, 0xC9, 0xCD, 0xAF, 0x0D, 0x21, 0x3C,
+ 0x5C, 0xCB, 0xAE, 0xCB, 0xC6, 0xCD, 0x4D, 0x0D, 0xFD, 0x46,
+ 0x31, 0xCD, 0x44, 0x0E, 0x21, 0xC0, 0x5A, 0x3A, 0x8D, 0x5C,
+ 0x05, 0x18, 0x07, 0x0E, 0x20, 0x2B, 0x77, 0x0D, 0x20, 0xFB,
+ 0x10, 0xF7, 0xFD, 0x36, 0x31, 0x02, 0x3E, 0xFD, 0xCD, 0x01,
+ 0x16, 0x2A, 0x51, 0x5C, 0x11, 0xF4, 0x09, 0xA7, 0x73, 0x23,
+ 0x72, 0x23, 0x11, 0xA8, 0x10, 0x3F, 0x38, 0xF6, 0x01, 0x21,
+ 0x17, 0x18, 0x2A, 0x21, 0x00, 0x00, 0x22, 0x7D, 0x5C, 0xFD,
+ 0xCB, 0x30, 0x86, 0xCD, 0x94, 0x0D, 0x3E, 0xFE, 0xCD, 0x01,
+ 0x16, 0xCD, 0x4D, 0x0D, 0x06, 0x18, 0xCD, 0x44, 0x0E, 0x2A,
+ 0x51, 0x5C, 0x11, 0xF4, 0x09, 0x73, 0x23, 0x72, 0xFD, 0x36,
+ 0x52, 0x01, 0x01, 0x21, 0x18, 0x21, 0x00, 0x5B, 0xFD, 0xCB,
+ 0x01, 0x4E, 0x20, 0x12, 0x78, 0xFD, 0xCB, 0x02, 0x46, 0x28,
+ 0x05, 0xFD, 0x86, 0x31, 0xD6, 0x18, 0xC5, 0x47, 0xCD, 0x9B,
+ 0x0E, 0xC1, 0x3E, 0x21, 0x91, 0x5F, 0x16, 0x00, 0x19, 0xC3,
+ 0xDC, 0x0A, 0x06, 0x17, 0xCD, 0x9B, 0x0E, 0x0E, 0x08, 0xC5,
+ 0xE5, 0x78, 0xE6, 0x07, 0x78, 0x20, 0x0C, 0xEB, 0x21, 0xE0,
+ 0xF8, 0x19, 0xEB, 0x01, 0x20, 0x00, 0x3D, 0xED, 0xB0, 0xEB,
+ 0x21, 0xE0, 0xFF, 0x19, 0xEB, 0x47, 0xE6, 0x07, 0x0F, 0x0F,
+ 0x0F, 0x4F, 0x78, 0x06, 0x00, 0xED, 0xB0, 0x06, 0x07, 0x09,
+ 0xE6, 0xF8, 0x20, 0xDB, 0xE1, 0x24, 0xC1, 0x0D, 0x20, 0xCD,
+ 0xCD, 0x88, 0x0E, 0x21, 0xE0, 0xFF, 0x19, 0xEB, 0xED, 0xB0,
+ 0x06, 0x01, 0xC5, 0xCD, 0x9B, 0x0E, 0x0E, 0x08, 0xC5, 0xE5,
+ 0x78, 0xE6, 0x07, 0x0F, 0x0F, 0x0F, 0x4F, 0x78, 0x06, 0x00,
+ 0x0D, 0x54, 0x5D, 0x36, 0x00, 0x13, 0xED, 0xB0, 0x11, 0x01,
+ 0x07, 0x19, 0x3D, 0xE6, 0xF8, 0x47, 0x20, 0xE5, 0xE1, 0x24,
+ 0xC1, 0x0D, 0x20, 0xDC, 0xCD, 0x88, 0x0E, 0x62, 0x6B, 0x13,
+ 0x3A, 0x8D, 0x5C, 0xFD, 0xCB, 0x02, 0x46, 0x28, 0x03, 0x3A,
+ 0x48, 0x5C, 0x77, 0x0B, 0xED, 0xB0, 0xC1, 0x0E, 0x21, 0xC9,
+ 0x7C, 0x0F, 0x0F, 0x0F, 0x3D, 0xF6, 0x50, 0x67, 0xEB, 0x61,
+ 0x68, 0x29, 0x29, 0x29, 0x29, 0x29, 0x44, 0x4D, 0xC9, 0x3E,
+ 0x18, 0x90, 0x57, 0x0F, 0x0F, 0x0F, 0xE6, 0xE0, 0x6F, 0x7A,
+ 0xE6, 0x18, 0xF6, 0x40, 0x67, 0xC9, 0xF3, 0x06, 0xB0, 0x21,
+ 0x00, 0x40, 0xE5, 0xC5, 0xCD, 0xF4, 0x0E, 0xC1, 0xE1, 0x24,
+ 0x7C, 0xE6, 0x07, 0x20, 0x0A, 0x7D, 0xC6, 0x20, 0x6F, 0x3F,
+ 0x9F, 0xE6, 0xF8, 0x84, 0x67, 0x10, 0xE7, 0x18, 0x0D, 0xF3,
+ 0x21, 0x00, 0x5B, 0x06, 0x08, 0xC5, 0xCD, 0xF4, 0x0E, 0xC1,
+ 0x10, 0xF9, 0x3E, 0x04, 0xD3, 0xFB, 0xFB, 0x21, 0x00, 0x5B,
+ 0xFD, 0x75, 0x46, 0xAF, 0x47, 0x77, 0x23, 0x10, 0xFC, 0xFD,
+ 0xCB, 0x30, 0x8E, 0x0E, 0x21, 0xC3, 0xD9, 0x0D, 0x78, 0xFE,
+ 0x03, 0x9F, 0xE6, 0x02, 0xD3, 0xFB, 0x57, 0xCD, 0x54, 0x1F,
+ 0x38, 0x0A, 0x3E, 0x04, 0xD3, 0xFB, 0xFB, 0xCD, 0xDF, 0x0E,
+ 0xCF, 0x0C, 0xDB, 0xFB, 0x87, 0xF8, 0x30, 0xEB, 0x0E, 0x20,
+ 0x5E, 0x23, 0x06, 0x08, 0xCB, 0x12, 0xCB, 0x13, 0xCB, 0x1A,
+ 0xDB, 0xFB, 0x1F, 0x30, 0xFB, 0x7A, 0xD3, 0xFB, 0x10, 0xF0,
+ 0x0D, 0x20, 0xE9, 0xC9, 0x2A, 0x3D, 0x5C, 0xE5, 0x21, 0x7F,
+ 0x10, 0xE5, 0xED, 0x73, 0x3D, 0x5C, 0xCD, 0xD4, 0x15, 0xF5,
+ 0x16, 0x00, 0xFD, 0x5E, 0xFF, 0x21, 0xC8, 0x00, 0xCD, 0xB5,
+ 0x03, 0xF1, 0x21, 0x38, 0x0F, 0xE5, 0xFE, 0x18, 0x30, 0x31,
+ 0xFE, 0x07, 0x38, 0x2D, 0xFE, 0x10, 0x38, 0x3A, 0x01, 0x02,
+ 0x00, 0x57, 0xFE, 0x16, 0x38, 0x0C, 0x03, 0xFD, 0xCB, 0x37,
+ 0x7E, 0xCA, 0x1E, 0x10, 0xCD, 0xD4, 0x15, 0x5F, 0xCD, 0xD4,
+ 0x15, 0xD5, 0x2A, 0x5B, 0x5C, 0xFD, 0xCB, 0x07, 0x86, 0xCD,
+ 0x55, 0x16, 0xC1, 0x23, 0x70, 0x23, 0x71, 0x18, 0x0A, 0xFD,
+ 0xCB, 0x07, 0x86, 0x2A, 0x5B, 0x5C, 0xCD, 0x52, 0x16, 0x12,
+ 0x13, 0xED, 0x53, 0x5B, 0x5C, 0xC9, 0x5F, 0x16, 0x00, 0x21,
+ 0x99, 0x0F, 0x19, 0x5E, 0x19, 0xE5, 0x2A, 0x5B, 0x5C, 0xC9,
+ 0x09, 0x66, 0x6A, 0x50, 0xB5, 0x70, 0x7E, 0xCF, 0xD4, 0x2A,
+ 0x49, 0x5C, 0xFD, 0xCB, 0x37, 0x6E, 0xC2, 0x97, 0x10, 0xCD,
+ 0x6E, 0x19, 0xCD, 0x95, 0x16, 0x7A, 0xB3, 0xCA, 0x97, 0x10,
+ 0xE5, 0x23, 0x4E, 0x23, 0x46, 0x21, 0x0A, 0x00, 0x09, 0x44,
+ 0x4D, 0xCD, 0x05, 0x1F, 0xCD, 0x97, 0x10, 0x2A, 0x51, 0x5C,
+ 0xE3, 0xE5, 0x3E, 0xFF, 0xCD, 0x01, 0x16, 0xE1, 0x2B, 0xFD,
+ 0x35, 0x0F, 0xCD, 0x55, 0x18, 0xFD, 0x34, 0x0F, 0x2A, 0x59,
+ 0x5C, 0x23, 0x23, 0x23, 0x23, 0x22, 0x5B, 0x5C, 0xE1, 0xCD,
+ 0x15, 0x16, 0xC9, 0xFD, 0xCB, 0x37, 0x6E, 0x20, 0x08, 0x21,
+ 0x49, 0x5C, 0xCD, 0x0F, 0x19, 0x18, 0x6D, 0xFD, 0x36, 0x00,
+ 0x10, 0x18, 0x1D, 0xCD, 0x31, 0x10, 0x18, 0x05, 0x7E, 0xFE,
+ 0x0D, 0xC8, 0x23, 0x22, 0x5B, 0x5C, 0xC9, 0xCD, 0x31, 0x10,
+ 0x01, 0x01, 0x00, 0xC3, 0xE8, 0x19, 0xCD, 0xD4, 0x15, 0xCD,
+ 0xD4, 0x15, 0xE1, 0xE1, 0xE1, 0x22, 0x3D, 0x5C, 0xFD, 0xCB,
+ 0x00, 0x7E, 0xC0, 0xF9, 0xC9, 0x37, 0xCD, 0x95, 0x11, 0xED,
+ 0x52, 0x19, 0x23, 0xC1, 0xD8, 0xC5, 0x44, 0x4D, 0x62, 0x6B,
+ 0x23, 0x1A, 0xE6, 0xF0, 0xFE, 0x10, 0x20, 0x09, 0x23, 0x1A,
+ 0xD6, 0x17, 0xCE, 0x00, 0x20, 0x01, 0x23, 0xA7, 0xED, 0x42,
+ 0x09, 0xEB, 0x38, 0xE6, 0xC9, 0xFD, 0xCB, 0x37, 0x6E, 0xC0,
+ 0x2A, 0x49, 0x5C, 0xCD, 0x6E, 0x19, 0xEB, 0xCD, 0x95, 0x16,
+ 0x21, 0x4A, 0x5C, 0xCD, 0x1C, 0x19, 0xCD, 0x95, 0x17, 0x3E,
+ 0x00, 0xC3, 0x01, 0x16, 0xFD, 0xCB, 0x37, 0x7E, 0x28, 0xA8,
+ 0xC3, 0x81, 0x0F, 0xFD, 0xCB, 0x30, 0x66, 0x28, 0xA1, 0xFD,
+ 0x36, 0x00, 0xFF, 0x16, 0x00, 0xFD, 0x5E, 0xFE, 0x21, 0x90,
+ 0x1A, 0xCD, 0xB5, 0x03, 0xC3, 0x30, 0x0F, 0xE5, 0xCD, 0x90,
+ 0x11, 0x2B, 0xCD, 0xE5, 0x19, 0x22, 0x5B, 0x5C, 0xFD, 0x36,
+ 0x07, 0x00, 0xE1, 0xC9, 0xFD, 0xCB, 0x02, 0x5E, 0xC4, 0x1D,
+ 0x11, 0xA7, 0xFD, 0xCB, 0x01, 0x6E, 0xC8, 0x3A, 0x08, 0x5C,
+ 0xFD, 0xCB, 0x01, 0xAE, 0xF5, 0xFD, 0xCB, 0x02, 0x6E, 0xC4,
+ 0x6E, 0x0D, 0xF1, 0xFE, 0x20, 0x30, 0x52, 0xFE, 0x10, 0x30,
+ 0x2D, 0xFE, 0x06, 0x30, 0x0A, 0x47, 0xE6, 0x01, 0x4F, 0x78,
+ 0x1F, 0xC6, 0x12, 0x18, 0x2A, 0x20, 0x09, 0x21, 0x6A, 0x5C,
+ 0x3E, 0x08, 0xAE, 0x77, 0x18, 0x0E, 0xFE, 0x0E, 0xD8, 0xD6,
+ 0x0D, 0x21, 0x41, 0x5C, 0xBE, 0x77, 0x20, 0x02, 0x36, 0x00,
+ 0xFD, 0xCB, 0x02, 0xDE, 0xBF, 0xC9, 0x47, 0xE6, 0x07, 0x4F,
+ 0x3E, 0x10, 0xCB, 0x58, 0x20, 0x01, 0x3C, 0xFD, 0x71, 0xD3,
+ 0x11, 0x0D, 0x11, 0x18, 0x06, 0x3A, 0x0D, 0x5C, 0x11, 0xA8,
+ 0x10, 0x2A, 0x4F, 0x5C, 0x23, 0x23, 0x73, 0x23, 0x72, 0x37,
+ 0xC9, 0xCD, 0x4D, 0x0D, 0xFD, 0xCB, 0x02, 0x9E, 0xFD, 0xCB,
+ 0x02, 0xAE, 0x2A, 0x8A, 0x5C, 0xE5, 0x2A, 0x3D, 0x5C, 0xE5,
+ 0x21, 0x67, 0x11, 0xE5, 0xED, 0x73, 0x3D, 0x5C, 0x2A, 0x82,
+ 0x5C, 0xE5, 0x37, 0xCD, 0x95, 0x11, 0xEB, 0xCD, 0x7D, 0x18,
+ 0xEB, 0xCD, 0xE1, 0x18, 0x2A, 0x8A, 0x5C, 0xE3, 0xEB, 0xCD,
+ 0x4D, 0x0D, 0x3A, 0x8B, 0x5C, 0x92, 0x38, 0x26, 0x20, 0x06,
+ 0x7B, 0xFD, 0x96, 0x50, 0x30, 0x1E, 0x3E, 0x20, 0xD5, 0xCD,
+ 0xF4, 0x09, 0xD1, 0x18, 0xE9, 0x16, 0x00, 0xFD, 0x5E, 0xFE,
+ 0x21, 0x90, 0x1A, 0xCD, 0xB5, 0x03, 0xFD, 0x36, 0x00, 0xFF,
+ 0xED, 0x5B, 0x8A, 0x5C, 0x18, 0x02, 0xD1, 0xE1, 0xE1, 0x22,
+ 0x3D, 0x5C, 0xC1, 0xD5, 0xCD, 0xD9, 0x0D, 0xE1, 0x22, 0x82,
+ 0x5C, 0xFD, 0x36, 0x26, 0x00, 0xC9, 0x2A, 0x61, 0x5C, 0x2B,
+ 0xA7, 0xED, 0x5B, 0x59, 0x5C, 0xFD, 0xCB, 0x37, 0x6E, 0xC8,
+ 0xED, 0x5B, 0x61, 0x5C, 0xD8, 0x2A, 0x63, 0x5C, 0xC9, 0x7E,
+ 0xFE, 0x0E, 0x01, 0x06, 0x00, 0xCC, 0xE8, 0x19, 0x7E, 0x23,
+ 0xFE, 0x0D, 0x20, 0xF1, 0xC9, 0xF3, 0x3E, 0xFF, 0xED, 0x5B,
+ 0xB2, 0x5C, 0xD9, 0xED, 0x4B, 0xB4, 0x5C, 0xED, 0x5B, 0x38,
+ 0x5C, 0x2A, 0x7B, 0x5C, 0xD9, 0x47, 0x3E, 0x07, 0xD3, 0xFE,
+ 0x3E, 0x3F, 0xED, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x62, 0x6B, 0x36, 0x02, 0x2B, 0xBC, 0x20, 0xFA, 0xA7, 0xED,
+ 0x52, 0x19, 0x23, 0x30, 0x06, 0x35, 0x28, 0x03, 0x35, 0x28,
+ 0xF3, 0x2B, 0xD9, 0xED, 0x43, 0xB4, 0x5C, 0xED, 0x53, 0x38,
+ 0x5C, 0x22, 0x7B, 0x5C, 0xD9, 0x04, 0x28, 0x19, 0x22, 0xB4,
+ 0x5C, 0x11, 0xAF, 0x3E, 0x01, 0xA8, 0x00, 0xEB, 0xED, 0xB8,
+ 0xEB, 0x23, 0x22, 0x7B, 0x5C, 0x2B, 0x01, 0x40, 0x00, 0xED,
+ 0x43, 0x38, 0x5C, 0x22, 0xB2, 0x5C, 0x21, 0x00, 0x3C, 0x22,
+ 0x36, 0x5C, 0x2A, 0xB2, 0x5C, 0x36, 0x3E, 0x2B, 0xF9, 0x2B,
+ 0x2B, 0x22, 0x3D, 0x5C, 0xED, 0x56, 0xFD, 0x21, 0x3A, 0x5C,
+ 0xFB, 0x21, 0xB6, 0x5C, 0x22, 0x4F, 0x5C, 0x11, 0xAF, 0x15,
+ 0x01, 0x15, 0x00, 0xEB, 0xED, 0xB0, 0xEB, 0x2B, 0x22, 0x57,
+ 0x5C, 0x23, 0x22, 0x53, 0x5C, 0x22, 0x4B, 0x5C, 0x36, 0x80,
+ 0x23, 0x22, 0x59, 0x5C, 0x36, 0x0D, 0x23, 0x36, 0x80, 0x23,
+ 0x22, 0x61, 0x5C, 0x22, 0x63, 0x5C, 0x22, 0x65, 0x5C, 0x3E,
+ 0x38, 0x32, 0x8D, 0x5C, 0x32, 0x8F, 0x5C, 0x32, 0x48, 0x5C,
+ 0x21, 0x23, 0x05, 0x22, 0x09, 0x5C, 0xFD, 0x35, 0xC6, 0xFD,
+ 0x35, 0xCA, 0x21, 0xC6, 0x15, 0x11, 0x10, 0x5C, 0x01, 0x0E,
+ 0x00, 0xED, 0xB0, 0xFD, 0xCB, 0x01, 0xCE, 0xCD, 0xDF, 0x0E,
+ 0xFD, 0x36, 0x31, 0x02, 0xCD, 0x6B, 0x0D, 0xAF, 0x11, 0x38,
+ 0x15, 0xCD, 0x0A, 0x0C, 0xFD, 0xCB, 0x02, 0xEE, 0x18, 0x07,
+ 0xFD, 0x36, 0x31, 0x02, 0xCD, 0x95, 0x17, 0xCD, 0xB0, 0x16,
+ 0x3E, 0x00, 0xCD, 0x01, 0x16, 0xCD, 0x2C, 0x0F, 0xCD, 0x17,
+ 0x1B, 0xFD, 0xCB, 0x00, 0x7E, 0x20, 0x12, 0xFD, 0xCB, 0x30,
+ 0x66, 0x28, 0x40, 0x2A, 0x59, 0x5C, 0xCD, 0xA7, 0x11, 0xFD,
+ 0x36, 0x00, 0xFF, 0x18, 0xDD, 0x2A, 0x59, 0x5C, 0x22, 0x5D,
+ 0x5C, 0xCD, 0xFB, 0x19, 0x78, 0xB1, 0xC2, 0x5D, 0x15, 0xDF,
+ 0xFE, 0x0D, 0x28, 0xC0, 0xFD, 0xCB, 0x30, 0x46, 0xC4, 0xAF,
+ 0x0D, 0xCD, 0x6E, 0x0D, 0x3E, 0x19, 0xFD, 0x96, 0x4F, 0x32,
+ 0x8C, 0x5C, 0xFD, 0xCB, 0x01, 0xFE, 0xFD, 0x36, 0x00, 0xFF,
+ 0xFD, 0x36, 0x0A, 0x01, 0xCD, 0x8A, 0x1B, 0x76, 0xFD, 0xCB,
+ 0x01, 0xAE, 0xFD, 0xCB, 0x30, 0x4E, 0xC4, 0xCD, 0x0E, 0x3A,
+ 0x3A, 0x5C, 0x3C, 0xF5, 0x21, 0x00, 0x00, 0xFD, 0x74, 0x37,
+ 0xFD, 0x74, 0x26, 0x22, 0x0B, 0x5C, 0x21, 0x01, 0x00, 0x22,
+ 0x16, 0x5C, 0xCD, 0xB0, 0x16, 0xFD, 0xCB, 0x37, 0xAE, 0xCD,
+ 0x6E, 0x0D, 0xFD, 0xCB, 0x02, 0xEE, 0xF1, 0x47, 0xFE, 0x0A,
+ 0x38, 0x02, 0xC6, 0x07, 0xCD, 0xEF, 0x15, 0x3E, 0x20, 0xD7,
+ 0x78, 0x11, 0x91, 0x13, 0xCD, 0x0A, 0x0C, 0xAF, 0x11, 0x36,
+ 0x15, 0xCD, 0x0A, 0x0C, 0xED, 0x4B, 0x45, 0x5C, 0xCD, 0x1B,
+ 0x1A, 0x3E, 0x3A, 0xD7, 0xFD, 0x4E, 0x0D, 0x06, 0x00, 0xCD,
+ 0x1B, 0x1A, 0xCD, 0x97, 0x10, 0x3A, 0x3A, 0x5C, 0x3C, 0x28,
+ 0x1B, 0xFE, 0x09, 0x28, 0x04, 0xFE, 0x15, 0x20, 0x03, 0xFD,
+ 0x34, 0x0D, 0x01, 0x03, 0x00, 0x11, 0x70, 0x5C, 0x21, 0x44,
+ 0x5C, 0xCB, 0x7E, 0x28, 0x01, 0x09, 0xED, 0xB8, 0xFD, 0x36,
+ 0x0A, 0xFF, 0xFD, 0xCB, 0x01, 0x9E, 0xC3, 0xAC, 0x12, 0x80,
+ 0x4F, 0xCB, 0x4E, 0x45, 0x58, 0x54, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x6F, 0x75, 0x74, 0x20, 0x46, 0x4F, 0xD2, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x6E, 0x6F, 0x74,
+ 0x20, 0x66, 0x6F, 0x75, 0x6E, 0xE4, 0x53, 0x75, 0x62, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x77, 0x72, 0x6F, 0x6E,
+ 0xE7, 0x4F, 0x75, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x65,
+ 0x6D, 0x6F, 0x72, 0xF9, 0x4F, 0x75, 0x74, 0x20, 0x6F, 0x66,
+ 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0xEE, 0x4E, 0x75, 0x6D,
+ 0x62, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x6F, 0x20, 0x62, 0x69,
+ 0xE7, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4E, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x47, 0x4F, 0x53, 0x55,
+ 0xC2, 0x45, 0x6E, 0x64, 0x20, 0x6F, 0x66, 0x20, 0x66, 0x69,
+ 0x6C, 0xE5, 0x53, 0x54, 0x4F, 0x50, 0x20, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x6D, 0x65, 0x6E, 0xF4, 0x49, 0x6E, 0x76, 0x61,
+ 0x6C, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0xF4, 0x49, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20,
+ 0x6F, 0x75, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x72, 0x61, 0x6E,
+ 0x67, 0xE5, 0x4E, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x65,
+ 0x20, 0x69, 0x6E, 0x20, 0x42, 0x41, 0x53, 0x49, 0xC3, 0x42,
+ 0x52, 0x45, 0x41, 0x4B, 0x20, 0x2D, 0x20, 0x43, 0x4F, 0x4E,
+ 0x54, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0xF3, 0x4F,
+ 0x75, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x44, 0x41, 0x54, 0xC1,
+ 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x66, 0x69,
+ 0x6C, 0x65, 0x20, 0x6E, 0x61, 0x6D, 0xE5, 0x4E, 0x6F, 0x20,
+ 0x72, 0x6F, 0x6F, 0x6D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6C,
+ 0x69, 0x6E, 0xE5, 0x53, 0x54, 0x4F, 0x50, 0x20, 0x69, 0x6E,
+ 0x20, 0x49, 0x4E, 0x50, 0x55, 0xD4, 0x46, 0x4F, 0x52, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x4E, 0x45,
+ 0x58, 0xD4, 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20,
+ 0x49, 0x2F, 0x4F, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0xE5,
+ 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x63, 0x6F,
+ 0x6C, 0x6F, 0x75, 0xF2, 0x42, 0x52, 0x45, 0x41, 0x4B, 0x20,
+ 0x69, 0x6E, 0x74, 0x6F, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72,
+ 0x61, 0xED, 0x52, 0x41, 0x4D, 0x54, 0x4F, 0x50, 0x20, 0x6E,
+ 0x6F, 0x20, 0x67, 0x6F, 0x6F, 0xE4, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x73, 0xF4,
+ 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x73, 0x74,
+ 0x72, 0x65, 0x61, 0xED, 0x46, 0x4E, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x6F, 0x75, 0x74, 0x20, 0x44, 0x45, 0xC6, 0x50, 0x61,
+ 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x72,
+ 0x72, 0x6F, 0xF2, 0x54, 0x61, 0x70, 0x65, 0x20, 0x6C, 0x6F,
+ 0x61, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x72, 0x72, 0x6F,
+ 0xF2, 0x2C, 0xA0, 0x7F, 0x20, 0x31, 0x39, 0x38, 0x32, 0x20,
+ 0x53, 0x69, 0x6E, 0x63, 0x6C, 0x61, 0x69, 0x72, 0x20, 0x52,
+ 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x4C, 0x74,
+ 0xE4, 0x3E, 0x10, 0x01, 0x00, 0x00, 0xC3, 0x13, 0x13, 0xED,
+ 0x43, 0x49, 0x5C, 0x2A, 0x5D, 0x5C, 0xEB, 0x21, 0x55, 0x15,
+ 0xE5, 0x2A, 0x61, 0x5C, 0x37, 0xED, 0x52, 0xE5, 0x60, 0x69,
+ 0xCD, 0x6E, 0x19, 0x20, 0x06, 0xCD, 0xB8, 0x19, 0xCD, 0xE8,
+ 0x19, 0xC1, 0x79, 0x3D, 0xB0, 0x28, 0x28, 0xC5, 0x03, 0x03,
+ 0x03, 0x03, 0x2B, 0xED, 0x5B, 0x53, 0x5C, 0xD5, 0xCD, 0x55,
+ 0x16, 0xE1, 0x22, 0x53, 0x5C, 0xC1, 0xC5, 0x13, 0x2A, 0x61,
+ 0x5C, 0x2B, 0x2B, 0xED, 0xB8, 0x2A, 0x49, 0x5C, 0xEB, 0xC1,
+ 0x70, 0x2B, 0x71, 0x2B, 0x73, 0x2B, 0x72, 0xF1, 0xC3, 0xA2,
+ 0x12, 0xF4, 0x09, 0xA8, 0x10, 0x4B, 0xF4, 0x09, 0xC4, 0x15,
+ 0x53, 0x81, 0x0F, 0xC4, 0x15, 0x52, 0xF4, 0x09, 0xC4, 0x15,
+ 0x50, 0x80, 0xCF, 0x12, 0x01, 0x00, 0x06, 0x00, 0x0B, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x00, 0xFD, 0xCB,
+ 0x02, 0x6E, 0x20, 0x04, 0xFD, 0xCB, 0x02, 0xDE, 0xCD, 0xE6,
+ 0x15, 0xD8, 0x28, 0xFA, 0xCF, 0x07, 0xD9, 0xE5, 0x2A, 0x51,
+ 0x5C, 0x23, 0x23, 0x18, 0x08, 0x1E, 0x30, 0x83, 0xD9, 0xE5,
+ 0x2A, 0x51, 0x5C, 0x5E, 0x23, 0x56, 0xEB, 0xCD, 0x2C, 0x16,
+ 0xE1, 0xD9, 0xC9, 0x87, 0xC6, 0x16, 0x6F, 0x26, 0x5C, 0x5E,
+ 0x23, 0x56, 0x7A, 0xB3, 0x20, 0x02, 0xCF, 0x17, 0x1B, 0x2A,
+ 0x4F, 0x5C, 0x19, 0x22, 0x51, 0x5C, 0xFD, 0xCB, 0x30, 0xA6,
+ 0x23, 0x23, 0x23, 0x23, 0x4E, 0x21, 0x2D, 0x16, 0xCD, 0xDC,
+ 0x16, 0xD0, 0x16, 0x00, 0x5E, 0x19, 0xE9, 0x4B, 0x06, 0x53,
+ 0x12, 0x50, 0x1B, 0x00, 0xFD, 0xCB, 0x02, 0xC6, 0xFD, 0xCB,
+ 0x01, 0xAE, 0xFD, 0xCB, 0x30, 0xE6, 0x18, 0x04, 0xFD, 0xCB,
+ 0x02, 0x86, 0xFD, 0xCB, 0x01, 0x8E, 0xC3, 0x4D, 0x0D, 0xFD,
+ 0xCB, 0x01, 0xCE, 0xC9, 0x01, 0x01, 0x00, 0xE5, 0xCD, 0x05,
+ 0x1F, 0xE1, 0xCD, 0x64, 0x16, 0x2A, 0x65, 0x5C, 0xEB, 0xED,
+ 0xB8, 0xC9, 0xF5, 0xE5, 0x21, 0x4B, 0x5C, 0x3E, 0x0E, 0x5E,
+ 0x23, 0x56, 0xE3, 0xA7, 0xED, 0x52, 0x19, 0xE3, 0x30, 0x09,
+ 0xD5, 0xEB, 0x09, 0xEB, 0x72, 0x2B, 0x73, 0x23, 0xD1, 0x23,
+ 0x3D, 0x20, 0xE8, 0xEB, 0xD1, 0xF1, 0xA7, 0xED, 0x52, 0x44,
+ 0x4D, 0x03, 0x19, 0xEB, 0xC9, 0x00, 0x00, 0xEB, 0x11, 0x8F,
+ 0x16, 0x7E, 0xE6, 0xC0, 0x20, 0xF7, 0x56, 0x23, 0x5E, 0xC9,
+ 0x2A, 0x63, 0x5C, 0x2B, 0xCD, 0x55, 0x16, 0x23, 0x23, 0xC1,
+ 0xED, 0x43, 0x61, 0x5C, 0xC1, 0xEB, 0x23, 0xC9, 0x2A, 0x59,
+ 0x5C, 0x36, 0x0D, 0x22, 0x5B, 0x5C, 0x23, 0x36, 0x80, 0x23,
+ 0x22, 0x61, 0x5C, 0x2A, 0x61, 0x5C, 0x22, 0x63, 0x5C, 0x2A,
+ 0x63, 0x5C, 0x22, 0x65, 0x5C, 0xE5, 0x21, 0x92, 0x5C, 0x22,
+ 0x68, 0x5C, 0xE1, 0xC9, 0xED, 0x5B, 0x59, 0x5C, 0xC3, 0xE5,
+ 0x19, 0x23, 0x7E, 0xA7, 0xC8, 0xB9, 0x23, 0x20, 0xF8, 0x37,
+ 0xC9, 0xCD, 0x1E, 0x17, 0xCD, 0x01, 0x17, 0x01, 0x00, 0x00,
+ 0x11, 0xE2, 0xA3, 0xEB, 0x19, 0x38, 0x07, 0x01, 0xD4, 0x15,
+ 0x09, 0x4E, 0x23, 0x46, 0xEB, 0x71, 0x23, 0x70, 0xC9, 0xE5,
+ 0x2A, 0x4F, 0x5C, 0x09, 0x23, 0x23, 0x23, 0x4E, 0xEB, 0x21,
+ 0x16, 0x17, 0xCD, 0xDC, 0x16, 0x4E, 0x06, 0x00, 0x09, 0xE9,
+ 0x4B, 0x05, 0x53, 0x03, 0x50, 0x01, 0xE1, 0xC9, 0xCD, 0x94,
+ 0x1E, 0xFE, 0x10, 0x38, 0x02, 0xCF, 0x17, 0xC6, 0x03, 0x07,
+ 0x21, 0x10, 0x5C, 0x4F, 0x06, 0x00, 0x09, 0x4E, 0x23, 0x46,
+ 0x2B, 0xC9, 0xEF, 0x01, 0x38, 0xCD, 0x1E, 0x17, 0x78, 0xB1,
+ 0x28, 0x16, 0xEB, 0x2A, 0x4F, 0x5C, 0x09, 0x23, 0x23, 0x23,
+ 0x7E, 0xEB, 0xFE, 0x4B, 0x28, 0x08, 0xFE, 0x53, 0x28, 0x04,
+ 0xFE, 0x50, 0x20, 0xCF, 0xCD, 0x5D, 0x17, 0x73, 0x23, 0x72,
+ 0xC9, 0xE5, 0xCD, 0xF1, 0x2B, 0x78, 0xB1, 0x20, 0x02, 0xCF,
+ 0x0E, 0xC5, 0x1A, 0xE6, 0xDF, 0x4F, 0x21, 0x7A, 0x17, 0xCD,
+ 0xDC, 0x16, 0x30, 0xF1, 0x4E, 0x06, 0x00, 0x09, 0xC1, 0xE9,
+ 0x4B, 0x06, 0x53, 0x08, 0x50, 0x0A, 0x00, 0x1E, 0x01, 0x18,
+ 0x06, 0x1E, 0x06, 0x18, 0x02, 0x1E, 0x10, 0x0B, 0x78, 0xB1,
+ 0x20, 0xD5, 0x57, 0xE1, 0xC9, 0x18, 0x90, 0xED, 0x73, 0x3F,
+ 0x5C, 0xFD, 0x36, 0x02, 0x10, 0xCD, 0xAF, 0x0D, 0xFD, 0xCB,
+ 0x02, 0xC6, 0xFD, 0x46, 0x31, 0xCD, 0x44, 0x0E, 0xFD, 0xCB,
+ 0x02, 0x86, 0xFD, 0xCB, 0x30, 0xC6, 0x2A, 0x49, 0x5C, 0xED,
+ 0x5B, 0x6C, 0x5C, 0xA7, 0xED, 0x52, 0x19, 0x38, 0x22, 0xD5,
+ 0xCD, 0x6E, 0x19, 0x11, 0xC0, 0x02, 0xEB, 0xED, 0x52, 0xE3,
+ 0xCD, 0x6E, 0x19, 0xC1, 0xC5, 0xCD, 0xB8, 0x19, 0xC1, 0x09,
+ 0x38, 0x0E, 0xEB, 0x56, 0x23, 0x5E, 0x2B, 0xED, 0x53, 0x6C,
+ 0x5C, 0x18, 0xED, 0x22, 0x6C, 0x5C, 0x2A, 0x6C, 0x5C, 0xCD,
+ 0x6E, 0x19, 0x28, 0x01, 0xEB, 0xCD, 0x33, 0x18, 0xFD, 0xCB,
+ 0x02, 0xA6, 0xC9, 0x3E, 0x03, 0x18, 0x02, 0x3E, 0x02, 0xFD,
+ 0x36, 0x02, 0x00, 0xCD, 0x30, 0x25, 0xC4, 0x01, 0x16, 0xDF,
+ 0xCD, 0x70, 0x20, 0x38, 0x14, 0xDF, 0xFE, 0x3B, 0x28, 0x04,
+ 0xFE, 0x2C, 0x20, 0x06, 0xE7, 0xCD, 0x82, 0x1C, 0x18, 0x08,
+ 0xCD, 0xE6, 0x1C, 0x18, 0x03, 0xCD, 0xDE, 0x1C, 0xCD, 0xEE,
+ 0x1B, 0xCD, 0x99, 0x1E, 0x78, 0xE6, 0x3F, 0x67, 0x69, 0x22,
+ 0x49, 0x5C, 0xCD, 0x6E, 0x19, 0x1E, 0x01, 0xCD, 0x55, 0x18,
+ 0xD7, 0xFD, 0xCB, 0x02, 0x66, 0x28, 0xF6, 0x3A, 0x6B, 0x5C,
+ 0xFD, 0x96, 0x4F, 0x20, 0xEE, 0xAB, 0xC8, 0xE5, 0xD5, 0x21,
+ 0x6C, 0x5C, 0xCD, 0x0F, 0x19, 0xD1, 0xE1, 0x18, 0xE0, 0xED,
+ 0x4B, 0x49, 0x5C, 0xCD, 0x80, 0x19, 0x16, 0x3E, 0x28, 0x05,
+ 0x11, 0x00, 0x00, 0xCB, 0x13, 0xFD, 0x73, 0x2D, 0x7E, 0xFE,
+ 0x40, 0xC1, 0xD0, 0xC5, 0xCD, 0x28, 0x1A, 0x23, 0x23, 0x23,
+ 0xFD, 0xCB, 0x01, 0x86, 0x7A, 0xA7, 0x28, 0x05, 0xD7, 0xFD,
+ 0xCB, 0x01, 0xC6, 0xD5, 0xEB, 0xFD, 0xCB, 0x30, 0x96, 0x21,
+ 0x3B, 0x5C, 0xCB, 0x96, 0xFD, 0xCB, 0x37, 0x6E, 0x28, 0x02,
+ 0xCB, 0xD6, 0x2A, 0x5F, 0x5C, 0xA7, 0xED, 0x52, 0x20, 0x05,
+ 0x3E, 0x3F, 0xCD, 0xC1, 0x18, 0xCD, 0xE1, 0x18, 0xEB, 0x7E,
+ 0xCD, 0xB6, 0x18, 0x23, 0xFE, 0x0D, 0x28, 0x06, 0xEB, 0xCD,
+ 0x37, 0x19, 0x18, 0xE0, 0xD1, 0xC9, 0xFE, 0x0E, 0xC0, 0x23,
+ 0x23, 0x23, 0x23, 0x23, 0x23, 0x7E, 0xC9, 0xD9, 0x2A, 0x8F,
+ 0x5C, 0xE5, 0xCB, 0xBC, 0xCB, 0xFD, 0x22, 0x8F, 0x5C, 0x21,
+ 0x91, 0x5C, 0x56, 0xD5, 0x36, 0x00, 0xCD, 0xF4, 0x09, 0xE1,
+ 0xFD, 0x74, 0x57, 0xE1, 0x22, 0x8F, 0x5C, 0xD9, 0xC9, 0x2A,
+ 0x5B, 0x5C, 0xA7, 0xED, 0x52, 0xC0, 0x3A, 0x41, 0x5C, 0xCB,
+ 0x07, 0x28, 0x04, 0xC6, 0x43, 0x18, 0x16, 0x21, 0x3B, 0x5C,
+ 0xCB, 0x9E, 0x3E, 0x4B, 0xCB, 0x56, 0x28, 0x0B, 0xCB, 0xDE,
+ 0x3C, 0xFD, 0xCB, 0x30, 0x5E, 0x28, 0x02, 0x3E, 0x43, 0xD5,
+ 0xCD, 0xC1, 0x18, 0xD1, 0xC9, 0x5E, 0x23, 0x56, 0xE5, 0xEB,
+ 0x23, 0xCD, 0x6E, 0x19, 0xCD, 0x95, 0x16, 0xE1, 0xFD, 0xCB,
+ 0x37, 0x6E, 0xC0, 0x72, 0x2B, 0x73, 0xC9, 0x7B, 0xA7, 0xF8,
+ 0x18, 0x0D, 0xAF, 0x09, 0x3C, 0x38, 0xFC, 0xED, 0x42, 0x3D,
+ 0x28, 0xF1, 0xC3, 0xEF, 0x15, 0xCD, 0x1B, 0x2D, 0x30, 0x30,
+ 0xFE, 0x21, 0x38, 0x2C, 0xFD, 0xCB, 0x01, 0x96, 0xFE, 0xCB,
+ 0x28, 0x24, 0xFE, 0x3A, 0x20, 0x0E, 0xFD, 0xCB, 0x37, 0x6E,
+ 0x20, 0x16, 0xFD, 0xCB, 0x30, 0x56, 0x28, 0x14, 0x18, 0x0E,
+ 0xFE, 0x22, 0x20, 0x0A, 0xF5, 0x3A, 0x6A, 0x5C, 0xEE, 0x04,
+ 0x32, 0x6A, 0x5C, 0xF1, 0xFD, 0xCB, 0x01, 0xD6, 0xD7, 0xC9,
+ 0xE5, 0x2A, 0x53, 0x5C, 0x54, 0x5D, 0xC1, 0xCD, 0x80, 0x19,
+ 0xD0, 0xC5, 0xCD, 0xB8, 0x19, 0xEB, 0x18, 0xF4, 0x7E, 0xB8,
+ 0xC0, 0x23, 0x7E, 0x2B, 0xB9, 0xC9, 0x23, 0x23, 0x23, 0x22,
+ 0x5D, 0x5C, 0x0E, 0x00, 0x15, 0xC8, 0xE7, 0xBB, 0x20, 0x04,
+ 0xA7, 0xC9, 0x23, 0x7E, 0xCD, 0xB6, 0x18, 0x22, 0x5D, 0x5C,
+ 0xFE, 0x22, 0x20, 0x01, 0x0D, 0xFE, 0x3A, 0x28, 0x04, 0xFE,
+ 0xCB, 0x20, 0x04, 0xCB, 0x41, 0x28, 0xDF, 0xFE, 0x0D, 0x20,
+ 0xE3, 0x15, 0x37, 0xC9, 0xE5, 0x7E, 0xFE, 0x40, 0x38, 0x17,
+ 0xCB, 0x6F, 0x28, 0x14, 0x87, 0xFA, 0xC7, 0x19, 0x3F, 0x01,
+ 0x05, 0x00, 0x30, 0x02, 0x0E, 0x12, 0x17, 0x23, 0x7E, 0x30,
+ 0xFB, 0x18, 0x06, 0x23, 0x23, 0x4E, 0x23, 0x46, 0x23, 0x09,
+ 0xD1, 0xA7, 0xED, 0x52, 0x44, 0x4D, 0x19, 0xEB, 0xC9, 0xCD,
+ 0xDD, 0x19, 0xC5, 0x78, 0x2F, 0x47, 0x79, 0x2F, 0x4F, 0x03,
+ 0xCD, 0x64, 0x16, 0xEB, 0xE1, 0x19, 0xD5, 0xED, 0xB0, 0xE1,
+ 0xC9, 0x2A, 0x59, 0x5C, 0x2B, 0x22, 0x5D, 0x5C, 0xE7, 0x21,
+ 0x92, 0x5C, 0x22, 0x65, 0x5C, 0xCD, 0x3B, 0x2D, 0xCD, 0xA2,
+ 0x2D, 0x38, 0x04, 0x21, 0xF0, 0xD8, 0x09, 0xDA, 0x8A, 0x1C,
+ 0xC3, 0xC5, 0x16, 0xD5, 0xE5, 0xAF, 0xCB, 0x78, 0x20, 0x20,
+ 0x60, 0x69, 0x1E, 0xFF, 0x18, 0x08, 0xD5, 0x56, 0x23, 0x5E,
+ 0xE5, 0xEB, 0x1E, 0x20, 0x01, 0x18, 0xFC, 0xCD, 0x2A, 0x19,
+ 0x01, 0x9C, 0xFF, 0xCD, 0x2A, 0x19, 0x0E, 0xF6, 0xCD, 0x2A,
+ 0x19, 0x7D, 0xCD, 0xEF, 0x15, 0xE1, 0xD1, 0xC9, 0xB1, 0xCB,
+ 0xBC, 0xBF, 0xC4, 0xAF, 0xB4, 0x93, 0x91, 0x92, 0x95, 0x98,
+ 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x7F, 0x81, 0x2E, 0x6C,
+ 0x6E, 0x70, 0x48, 0x94, 0x56, 0x3F, 0x41, 0x2B, 0x17, 0x1F,
+ 0x37, 0x77, 0x44, 0x0F, 0x59, 0x2B, 0x43, 0x2D, 0x51, 0x3A,
+ 0x6D, 0x42, 0x0D, 0x49, 0x5C, 0x44, 0x15, 0x5D, 0x01, 0x3D,
+ 0x02, 0x06, 0x00, 0x67, 0x1E, 0x06, 0xCB, 0x05, 0xF0, 0x1C,
+ 0x06, 0x00, 0xED, 0x1E, 0x00, 0xEE, 0x1C, 0x00, 0x23, 0x1F,
+ 0x04, 0x3D, 0x06, 0xCC, 0x06, 0x05, 0x03, 0x1D, 0x04, 0x00,
+ 0xAB, 0x1D, 0x05, 0xCD, 0x1F, 0x05, 0x89, 0x20, 0x05, 0x02,
+ 0x2C, 0x05, 0xB2, 0x1B, 0x00, 0xB7, 0x11, 0x03, 0xA1, 0x1E,
+ 0x05, 0xF9, 0x17, 0x08, 0x00, 0x80, 0x1E, 0x03, 0x4F, 0x1E,
+ 0x00, 0x5F, 0x1E, 0x03, 0xAC, 0x1E, 0x00, 0x6B, 0x0D, 0x09,
+ 0x00, 0xDC, 0x22, 0x06, 0x00, 0x3A, 0x1F, 0x05, 0xED, 0x1D,
+ 0x05, 0x27, 0x1E, 0x03, 0x42, 0x1E, 0x09, 0x05, 0x82, 0x23,
+ 0x00, 0xAC, 0x0E, 0x05, 0xC9, 0x1F, 0x05, 0xF5, 0x17, 0x0B,
+ 0x0B, 0x0B, 0x0B, 0x08, 0x00, 0xF8, 0x03, 0x09, 0x05, 0x20,
+ 0x23, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x00, 0x7A,
+ 0x1E, 0x06, 0x00, 0x94, 0x22, 0x05, 0x60, 0x1F, 0x06, 0x2C,
+ 0x0A, 0x00, 0x36, 0x17, 0x06, 0x00, 0xE5, 0x16, 0x0A, 0x00,
+ 0x93, 0x17, 0x0A, 0x2C, 0x0A, 0x00, 0x93, 0x17, 0x0A, 0x00,
+ 0x93, 0x17, 0x00, 0x93, 0x17, 0xFD, 0xCB, 0x01, 0xBE, 0xCD,
+ 0xFB, 0x19, 0xAF, 0x32, 0x47, 0x5C, 0x3D, 0x32, 0x3A, 0x5C,
+ 0x18, 0x01, 0xE7, 0xCD, 0xBF, 0x16, 0xFD, 0x34, 0x0D, 0xFA,
+ 0x8A, 0x1C, 0xDF, 0x06, 0x00, 0xFE, 0x0D, 0x28, 0x7A, 0xFE,
+ 0x3A, 0x28, 0xEB, 0x21, 0x76, 0x1B, 0xE5, 0x4F, 0xE7, 0x79,
+ 0xD6, 0xCE, 0xDA, 0x8A, 0x1C, 0x4F, 0x21, 0x48, 0x1A, 0x09,
+ 0x4E, 0x09, 0x18, 0x03, 0x2A, 0x74, 0x5C, 0x7E, 0x23, 0x22,
+ 0x74, 0x5C, 0x01, 0x52, 0x1B, 0xC5, 0x4F, 0xFE, 0x20, 0x30,
+ 0x0C, 0x21, 0x01, 0x1C, 0x06, 0x00, 0x09, 0x4E, 0x09, 0xE5,
+ 0xDF, 0x05, 0xC9, 0xDF, 0xB9, 0xC2, 0x8A, 0x1C, 0xE7, 0xC9,
+ 0xCD, 0x54, 0x1F, 0x38, 0x02, 0xCF, 0x14, 0xFD, 0xCB, 0x0A,
+ 0x7E, 0x20, 0x71, 0x2A, 0x42, 0x5C, 0xCB, 0x7C, 0x28, 0x14,
+ 0x21, 0xFE, 0xFF, 0x22, 0x45, 0x5C, 0x2A, 0x61, 0x5C, 0x2B,
+ 0xED, 0x5B, 0x59, 0x5C, 0x1B, 0x3A, 0x44, 0x5C, 0x18, 0x33,
+ 0xCD, 0x6E, 0x19, 0x3A, 0x44, 0x5C, 0x28, 0x19, 0xA7, 0x20,
+ 0x43, 0x47, 0x7E, 0xE6, 0xC0, 0x78, 0x28, 0x0F, 0xCF, 0xFF,
+ 0xC1, 0xCD, 0x30, 0x25, 0xC8, 0x2A, 0x55, 0x5C, 0x3E, 0xC0,
+ 0xA6, 0xC0, 0xAF, 0xFE, 0x01, 0xCE, 0x00, 0x56, 0x23, 0x5E,
+ 0xED, 0x53, 0x45, 0x5C, 0x23, 0x5E, 0x23, 0x56, 0xEB, 0x19,
+ 0x23, 0x22, 0x55, 0x5C, 0xEB, 0x22, 0x5D, 0x5C, 0x57, 0x1E,
+ 0x00, 0xFD, 0x36, 0x0A, 0xFF, 0x15, 0xFD, 0x72, 0x0D, 0xCA,
+ 0x28, 0x1B, 0x14, 0xCD, 0x8B, 0x19, 0x28, 0x08, 0xCF, 0x16,
+ 0xCD, 0x30, 0x25, 0xC0, 0xC1, 0xC1, 0xDF, 0xFE, 0x0D, 0x28,
+ 0xBA, 0xFE, 0x3A, 0xCA, 0x28, 0x1B, 0xC3, 0x8A, 0x1C, 0x0F,
+ 0x1D, 0x4B, 0x09, 0x67, 0x0B, 0x7B, 0x8E, 0x71, 0xB4, 0x81,
+ 0xCF, 0xCD, 0xDE, 0x1C, 0xBF, 0xC1, 0xCC, 0xEE, 0x1B, 0xEB,
+ 0x2A, 0x74, 0x5C, 0x4E, 0x23, 0x46, 0xEB, 0xC5, 0xC9, 0xCD,
+ 0xB2, 0x28, 0xFD, 0x36, 0x37, 0x00, 0x30, 0x08, 0xFD, 0xCB,
+ 0x37, 0xCE, 0x20, 0x18, 0xCF, 0x01, 0xCC, 0x96, 0x29, 0xFD,
+ 0xCB, 0x01, 0x76, 0x20, 0x0D, 0xAF, 0xCD, 0x30, 0x25, 0xC4,
+ 0xF1, 0x2B, 0x21, 0x71, 0x5C, 0xB6, 0x77, 0xEB, 0xED, 0x43,
+ 0x72, 0x5C, 0x22, 0x4D, 0x5C, 0xC9, 0xC1, 0xCD, 0x56, 0x1C,
+ 0xCD, 0xEE, 0x1B, 0xC9, 0x3A, 0x3B, 0x5C, 0xF5, 0xCD, 0xFB,
+ 0x24, 0xF1, 0xFD, 0x56, 0x01, 0xAA, 0xE6, 0x40, 0x20, 0x24,
+ 0xCB, 0x7A, 0xC2, 0xFF, 0x2A, 0xC9, 0xCD, 0xB2, 0x28, 0xF5,
+ 0x79, 0xF6, 0x9F, 0x3C, 0x20, 0x14, 0xF1, 0x18, 0xA9, 0xE7,
+ 0xCD, 0x82, 0x1C, 0xFE, 0x2C, 0x20, 0x09, 0xE7, 0xCD, 0xFB,
+ 0x24, 0xFD, 0xCB, 0x01, 0x76, 0xC0, 0xCF, 0x0B, 0xCD, 0xFB,
+ 0x24, 0xFD, 0xCB, 0x01, 0x76, 0xC8, 0x18, 0xF4, 0xFD, 0xCB,
+ 0x01, 0x7E, 0xFD, 0xCB, 0x02, 0x86, 0xC4, 0x4D, 0x0D, 0xF1,
+ 0x3A, 0x74, 0x5C, 0xD6, 0x13, 0xCD, 0xFC, 0x21, 0xCD, 0xEE,
+ 0x1B, 0x2A, 0x8F, 0x5C, 0x22, 0x8D, 0x5C, 0x21, 0x91, 0x5C,
+ 0x7E, 0x07, 0xAE, 0xE6, 0xAA, 0xAE, 0x77, 0xC9, 0xCD, 0x30,
+ 0x25, 0x28, 0x13, 0xFD, 0xCB, 0x02, 0x86, 0xCD, 0x4D, 0x0D,
+ 0x21, 0x90, 0x5C, 0x7E, 0xF6, 0xF8, 0x77, 0xFD, 0xCB, 0x57,
+ 0xB6, 0xDF, 0xCD, 0xE2, 0x21, 0x18, 0x9F, 0xC3, 0x05, 0x06,
+ 0xFE, 0x0D, 0x28, 0x04, 0xFE, 0x3A, 0x20, 0x9C, 0xCD, 0x30,
+ 0x25, 0xC8, 0xEF, 0xA0, 0x38, 0xC9, 0xCF, 0x08, 0xC1, 0xCD,
+ 0x30, 0x25, 0x28, 0x0A, 0xEF, 0x02, 0x38, 0xEB, 0xCD, 0xE9,
+ 0x34, 0xDA, 0xB3, 0x1B, 0xC3, 0x29, 0x1B, 0xFE, 0xCD, 0x20,
+ 0x09, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0x18, 0x06,
+ 0xCD, 0xEE, 0x1B, 0xEF, 0xA1, 0x38, 0xEF, 0xC0, 0x02, 0x01,
+ 0xE0, 0x01, 0x38, 0xCD, 0xFF, 0x2A, 0x22, 0x68, 0x5C, 0x2B,
+ 0x7E, 0xCB, 0xFE, 0x01, 0x06, 0x00, 0x09, 0x07, 0x38, 0x06,
+ 0x0E, 0x0D, 0xCD, 0x55, 0x16, 0x23, 0xE5, 0xEF, 0x02, 0x02,
+ 0x38, 0xE1, 0xEB, 0x0E, 0x0A, 0xED, 0xB0, 0x2A, 0x45, 0x5C,
+ 0xEB, 0x73, 0x23, 0x72, 0xFD, 0x56, 0x0D, 0x14, 0x23, 0x72,
+ 0xCD, 0xDA, 0x1D, 0xD0, 0xFD, 0x46, 0x38, 0x2A, 0x45, 0x5C,
+ 0x22, 0x42, 0x5C, 0x3A, 0x47, 0x5C, 0xED, 0x44, 0x57, 0x2A,
+ 0x5D, 0x5C, 0x1E, 0xF3, 0xC5, 0xED, 0x4B, 0x55, 0x5C, 0xCD,
+ 0x86, 0x1D, 0xED, 0x43, 0x55, 0x5C, 0xC1, 0x38, 0x11, 0xE7,
+ 0xF6, 0x20, 0xB8, 0x28, 0x03, 0xE7, 0x18, 0xE8, 0xE7, 0x3E,
+ 0x01, 0x92, 0x32, 0x44, 0x5C, 0xC9, 0xCF, 0x11, 0x7E, 0xFE,
+ 0x3A, 0x28, 0x18, 0x23, 0x7E, 0xE6, 0xC0, 0x37, 0xC0, 0x46,
+ 0x23, 0x4E, 0xED, 0x43, 0x42, 0x5C, 0x23, 0x4E, 0x23, 0x46,
+ 0xE5, 0x09, 0x44, 0x4D, 0xE1, 0x16, 0x00, 0xC5, 0xCD, 0x8B,
+ 0x19, 0xC1, 0xD0, 0x18, 0xE0, 0xFD, 0xCB, 0x37, 0x4E, 0xC2,
+ 0x2E, 0x1C, 0x2A, 0x4D, 0x5C, 0xCB, 0x7E, 0x28, 0x1F, 0x23,
+ 0x22, 0x68, 0x5C, 0xEF, 0xE0, 0xE2, 0x0F, 0xC0, 0x02, 0x38,
+ 0xCD, 0xDA, 0x1D, 0xD8, 0x2A, 0x68, 0x5C, 0x11, 0x0F, 0x00,
+ 0x19, 0x5E, 0x23, 0x56, 0x23, 0x66, 0xEB, 0xC3, 0x73, 0x1E,
+ 0xCF, 0x00, 0xEF, 0xE1, 0xE0, 0xE2, 0x36, 0x00, 0x02, 0x01,
+ 0x03, 0x37, 0x00, 0x04, 0x38, 0xA7, 0xC9, 0x38, 0x37, 0xC9,
+ 0xE7, 0xCD, 0x1F, 0x1C, 0xCD, 0x30, 0x25, 0x28, 0x29, 0xDF,
+ 0x22, 0x5F, 0x5C, 0x2A, 0x57, 0x5C, 0x7E, 0xFE, 0x2C, 0x28,
+ 0x09, 0x1E, 0xE4, 0xCD, 0x86, 0x1D, 0x30, 0x02, 0xCF, 0x0D,
+ 0xCD, 0x77, 0x00, 0xCD, 0x56, 0x1C, 0xDF, 0x22, 0x57, 0x5C,
+ 0x2A, 0x5F, 0x5C, 0xFD, 0x36, 0x26, 0x00, 0xCD, 0x78, 0x00,
+ 0xDF, 0xFE, 0x2C, 0x28, 0xC9, 0xCD, 0xEE, 0x1B, 0xC9, 0xCD,
+ 0x30, 0x25, 0x20, 0x0B, 0xCD, 0xFB, 0x24, 0xFE, 0x2C, 0xC4,
+ 0xEE, 0x1B, 0xE7, 0x18, 0xF5, 0x3E, 0xE4, 0x47, 0xED, 0xB9,
+ 0x11, 0x00, 0x02, 0xC3, 0x8B, 0x19, 0xCD, 0x99, 0x1E, 0x60,
+ 0x69, 0xCD, 0x6E, 0x19, 0x2B, 0x22, 0x57, 0x5C, 0xC9, 0xCD,
+ 0x99, 0x1E, 0x78, 0xB1, 0x20, 0x04, 0xED, 0x4B, 0x78, 0x5C,
+ 0xED, 0x43, 0x76, 0x5C, 0xC9, 0x2A, 0x6E, 0x5C, 0xFD, 0x56,
+ 0x36, 0x18, 0x0C, 0xCD, 0x99, 0x1E, 0x60, 0x69, 0x16, 0x00,
+ 0x7C, 0xFE, 0xF0, 0x30, 0x2C, 0x22, 0x42, 0x5C, 0xFD, 0x72,
+ 0x0A, 0xC9, 0xCD, 0x85, 0x1E, 0xED, 0x79, 0xC9, 0xCD, 0x85,
+ 0x1E, 0x02, 0xC9, 0xCD, 0xD5, 0x2D, 0x38, 0x15, 0x28, 0x02,
+ 0xED, 0x44, 0xF5, 0xCD, 0x99, 0x1E, 0xF1, 0xC9, 0xCD, 0xD5,
+ 0x2D, 0x18, 0x03, 0xCD, 0xA2, 0x2D, 0x38, 0x01, 0xC8, 0xCF,
+ 0x0A, 0xCD, 0x67, 0x1E, 0x01, 0x00, 0x00, 0xCD, 0x45, 0x1E,
+ 0x18, 0x03, 0xCD, 0x99, 0x1E, 0x78, 0xB1, 0x20, 0x04, 0xED,
+ 0x4B, 0xB2, 0x5C, 0xC5, 0xED, 0x5B, 0x4B, 0x5C, 0x2A, 0x59,
+ 0x5C, 0x2B, 0xCD, 0xE5, 0x19, 0xCD, 0x6B, 0x0D, 0x2A, 0x65,
+ 0x5C, 0x11, 0x32, 0x00, 0x19, 0xD1, 0xED, 0x52, 0x30, 0x08,
+ 0x2A, 0xB4, 0x5C, 0xA7, 0xED, 0x52, 0x30, 0x02, 0xCF, 0x15,
+ 0xEB, 0x22, 0xB2, 0x5C, 0xD1, 0xC1, 0x36, 0x3E, 0x2B, 0xF9,
+ 0xC5, 0xED, 0x73, 0x3D, 0x5C, 0xEB, 0xE9, 0xD1, 0xFD, 0x66,
+ 0x0D, 0x24, 0xE3, 0x33, 0xED, 0x4B, 0x45, 0x5C, 0xC5, 0xE5,
+ 0xED, 0x73, 0x3D, 0x5C, 0xD5, 0xCD, 0x67, 0x1E, 0x01, 0x14,
+ 0x00, 0x2A, 0x65, 0x5C, 0x09, 0x38, 0x0A, 0xEB, 0x21, 0x50,
+ 0x00, 0x19, 0x38, 0x03, 0xED, 0x72, 0xD8, 0x2E, 0x03, 0xC3,
+ 0x55, 0x00, 0x01, 0x00, 0x00, 0xCD, 0x05, 0x1F, 0x44, 0x4D,
+ 0xC9, 0xC1, 0xE1, 0xD1, 0x7A, 0xFE, 0x3E, 0x28, 0x0B, 0x3B,
+ 0xE3, 0xEB, 0xED, 0x73, 0x3D, 0x5C, 0xC5, 0xC3, 0x73, 0x1E,
+ 0xD5, 0xE5, 0xCF, 0x06, 0xCD, 0x99, 0x1E, 0x76, 0x0B, 0x78,
+ 0xB1, 0x28, 0x0C, 0x78, 0xA1, 0x3C, 0x20, 0x01, 0x03, 0xFD,
+ 0xCB, 0x01, 0x6E, 0x28, 0xEE, 0xFD, 0xCB, 0x01, 0xAE, 0xC9,
+ 0x3E, 0x7F, 0xDB, 0xFE, 0x1F, 0xD8, 0x3E, 0xFE, 0xDB, 0xFE,
+ 0x1F, 0xC9, 0xCD, 0x30, 0x25, 0x28, 0x05, 0x3E, 0xCE, 0xC3,
+ 0x39, 0x1E, 0xFD, 0xCB, 0x01, 0xF6, 0xCD, 0x8D, 0x2C, 0x30,
+ 0x16, 0xE7, 0xFE, 0x24, 0x20, 0x05, 0xFD, 0xCB, 0x01, 0xB6,
+ 0xE7, 0xFE, 0x28, 0x20, 0x3C, 0xE7, 0xFE, 0x29, 0x28, 0x20,
+ 0xCD, 0x8D, 0x2C, 0xD2, 0x8A, 0x1C, 0xEB, 0xE7, 0xFE, 0x24,
+ 0x20, 0x02, 0xEB, 0xE7, 0xEB, 0x01, 0x06, 0x00, 0xCD, 0x55,
+ 0x16, 0x23, 0x23, 0x36, 0x0E, 0xFE, 0x2C, 0x20, 0x03, 0xE7,
+ 0x18, 0xE0, 0xFE, 0x29, 0x20, 0x13, 0xE7, 0xFE, 0x3D, 0x20,
+ 0x0E, 0xE7, 0x3A, 0x3B, 0x5C, 0xF5, 0xCD, 0xFB, 0x24, 0xF1,
+ 0xFD, 0xAE, 0x01, 0xE6, 0x40, 0xC2, 0x8A, 0x1C, 0xCD, 0xEE,
+ 0x1B, 0xCD, 0x30, 0x25, 0xE1, 0xC8, 0xE9, 0x3E, 0x03, 0x18,
+ 0x02, 0x3E, 0x02, 0xCD, 0x30, 0x25, 0xC4, 0x01, 0x16, 0xCD,
+ 0x4D, 0x0D, 0xCD, 0xDF, 0x1F, 0xCD, 0xEE, 0x1B, 0xC9, 0xDF,
+ 0xCD, 0x45, 0x20, 0x28, 0x0D, 0xCD, 0x4E, 0x20, 0x28, 0xFB,
+ 0xCD, 0xFC, 0x1F, 0xCD, 0x4E, 0x20, 0x28, 0xF3, 0xFE, 0x29,
+ 0xC8, 0xCD, 0xC3, 0x1F, 0x3E, 0x0D, 0xD7, 0xC9, 0xDF, 0xFE,
+ 0xAC, 0x20, 0x0D, 0xCD, 0x79, 0x1C, 0xCD, 0xC3, 0x1F, 0xCD,
+ 0x07, 0x23, 0x3E, 0x16, 0x18, 0x10, 0xFE, 0xAD, 0x20, 0x12,
+ 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xC3, 0x1F, 0xCD, 0x99, 0x1E,
+ 0x3E, 0x17, 0xD7, 0x79, 0xD7, 0x78, 0xD7, 0xC9, 0xCD, 0xF2,
+ 0x21, 0xD0, 0xCD, 0x70, 0x20, 0xD0, 0xCD, 0xFB, 0x24, 0xCD,
+ 0xC3, 0x1F, 0xFD, 0xCB, 0x01, 0x76, 0xCC, 0xF1, 0x2B, 0xC2,
+ 0xE3, 0x2D, 0x78, 0xB1, 0x0B, 0xC8, 0x1A, 0x13, 0xD7, 0x18,
+ 0xF7, 0xFE, 0x29, 0xC8, 0xFE, 0x0D, 0xC8, 0xFE, 0x3A, 0xC9,
+ 0xDF, 0xFE, 0x3B, 0x28, 0x14, 0xFE, 0x2C, 0x20, 0x0A, 0xCD,
+ 0x30, 0x25, 0x28, 0x0B, 0x3E, 0x06, 0xD7, 0x18, 0x06, 0xFE,
+ 0x27, 0xC0, 0xCD, 0xF5, 0x1F, 0xE7, 0xCD, 0x45, 0x20, 0x20,
+ 0x01, 0xC1, 0xBF, 0xC9, 0xFE, 0x23, 0x37, 0xC0, 0xE7, 0xCD,
+ 0x82, 0x1C, 0xA7, 0xCD, 0xC3, 0x1F, 0xCD, 0x94, 0x1E, 0xFE,
+ 0x10, 0xD2, 0x0E, 0x16, 0xCD, 0x01, 0x16, 0xA7, 0xC9, 0xCD,
+ 0x30, 0x25, 0x28, 0x08, 0x3E, 0x01, 0xCD, 0x01, 0x16, 0xCD,
+ 0x6E, 0x0D, 0xFD, 0x36, 0x02, 0x01, 0xCD, 0xC1, 0x20, 0xCD,
+ 0xEE, 0x1B, 0xED, 0x4B, 0x88, 0x5C, 0x3A, 0x6B, 0x5C, 0xB8,
+ 0x38, 0x03, 0x0E, 0x21, 0x47, 0xED, 0x43, 0x88, 0x5C, 0x3E,
+ 0x19, 0x90, 0x32, 0x8C, 0x5C, 0xFD, 0xCB, 0x02, 0x86, 0xCD,
+ 0xD9, 0x0D, 0xC3, 0x6E, 0x0D, 0xCD, 0x4E, 0x20, 0x28, 0xFB,
+ 0xFE, 0x28, 0x20, 0x0E, 0xE7, 0xCD, 0xDF, 0x1F, 0xDF, 0xFE,
+ 0x29, 0xC2, 0x8A, 0x1C, 0xE7, 0xC3, 0xB2, 0x21, 0xFE, 0xCA,
+ 0x20, 0x11, 0xE7, 0xCD, 0x1F, 0x1C, 0xFD, 0xCB, 0x37, 0xFE,
+ 0xFD, 0xCB, 0x01, 0x76, 0xC2, 0x8A, 0x1C, 0x18, 0x0D, 0xCD,
+ 0x8D, 0x2C, 0xD2, 0xAF, 0x21, 0xCD, 0x1F, 0x1C, 0xFD, 0xCB,
+ 0x37, 0xBE, 0xCD, 0x30, 0x25, 0xCA, 0xB2, 0x21, 0xCD, 0xBF,
+ 0x16, 0x21, 0x71, 0x5C, 0xCB, 0xB6, 0xCB, 0xEE, 0x01, 0x01,
+ 0x00, 0xCB, 0x7E, 0x20, 0x0B, 0x3A, 0x3B, 0x5C, 0xE6, 0x40,
+ 0x20, 0x02, 0x0E, 0x03, 0xB6, 0x77, 0xF7, 0x36, 0x0D, 0x79,
+ 0x0F, 0x0F, 0x30, 0x05, 0x3E, 0x22, 0x12, 0x2B, 0x77, 0x22,
+ 0x5B, 0x5C, 0xFD, 0xCB, 0x37, 0x7E, 0x20, 0x2C, 0x2A, 0x5D,
+ 0x5C, 0xE5, 0x2A, 0x3D, 0x5C, 0xE5, 0x21, 0x3A, 0x21, 0xE5,
+ 0xFD, 0xCB, 0x30, 0x66, 0x28, 0x04, 0xED, 0x73, 0x3D, 0x5C,
+ 0x2A, 0x61, 0x5C, 0xCD, 0xA7, 0x11, 0xFD, 0x36, 0x00, 0xFF,
+ 0xCD, 0x2C, 0x0F, 0xFD, 0xCB, 0x01, 0xBE, 0xCD, 0xB9, 0x21,
+ 0x18, 0x03, 0xCD, 0x2C, 0x0F, 0xFD, 0x36, 0x22, 0x00, 0xCD,
+ 0xD6, 0x21, 0x20, 0x0A, 0xCD, 0x1D, 0x11, 0xED, 0x4B, 0x82,
+ 0x5C, 0xCD, 0xD9, 0x0D, 0x21, 0x71, 0x5C, 0xCB, 0xAE, 0xCB,
+ 0x7E, 0xCB, 0xBE, 0x20, 0x1C, 0xE1, 0xE1, 0x22, 0x3D, 0x5C,
+ 0xE1, 0x22, 0x5F, 0x5C, 0xFD, 0xCB, 0x01, 0xFE, 0xCD, 0xB9,
+ 0x21, 0x2A, 0x5F, 0x5C, 0xFD, 0x36, 0x26, 0x00, 0x22, 0x5D,
+ 0x5C, 0x18, 0x17, 0x2A, 0x63, 0x5C, 0xED, 0x5B, 0x61, 0x5C,
+ 0x37, 0xED, 0x52, 0x44, 0x4D, 0xCD, 0xB2, 0x2A, 0xCD, 0xFF,
+ 0x2A, 0x18, 0x03, 0xCD, 0xFC, 0x1F, 0xCD, 0x4E, 0x20, 0xCA,
+ 0xC1, 0x20, 0xC9, 0x2A, 0x61, 0x5C, 0x22, 0x5D, 0x5C, 0xDF,
+ 0xFE, 0xE2, 0x28, 0x0C, 0x3A, 0x71, 0x5C, 0xCD, 0x59, 0x1C,
+ 0xDF, 0xFE, 0x0D, 0xC8, 0xCF, 0x0B, 0xCD, 0x30, 0x25, 0xC8,
+ 0xCF, 0x10, 0x2A, 0x51, 0x5C, 0x23, 0x23, 0x23, 0x23, 0x7E,
+ 0xFE, 0x4B, 0xC9, 0xE7, 0xCD, 0xF2, 0x21, 0xD8, 0xDF, 0xFE,
+ 0x2C, 0x28, 0xF6, 0xFE, 0x3B, 0x28, 0xF2, 0xC3, 0x8A, 0x1C,
+ 0xFE, 0xD9, 0xD8, 0xFE, 0xDF, 0x3F, 0xD8, 0xF5, 0xE7, 0xF1,
+ 0xD6, 0xC9, 0xF5, 0xCD, 0x82, 0x1C, 0xF1, 0xA7, 0xCD, 0xC3,
+ 0x1F, 0xF5, 0xCD, 0x94, 0x1E, 0x57, 0xF1, 0xD7, 0x7A, 0xD7,
+ 0xC9, 0xD6, 0x11, 0xCE, 0x00, 0x28, 0x1D, 0xD6, 0x02, 0xCE,
+ 0x00, 0x28, 0x56, 0xFE, 0x01, 0x7A, 0x06, 0x01, 0x20, 0x04,
+ 0x07, 0x07, 0x06, 0x04, 0x4F, 0x7A, 0xFE, 0x02, 0x30, 0x16,
+ 0x79, 0x21, 0x91, 0x5C, 0x18, 0x38, 0x7A, 0x06, 0x07, 0x38,
+ 0x05, 0x07, 0x07, 0x07, 0x06, 0x38, 0x4F, 0x7A, 0xFE, 0x0A,
+ 0x38, 0x02, 0xCF, 0x13, 0x21, 0x8F, 0x5C, 0xFE, 0x08, 0x38,
+ 0x0B, 0x7E, 0x28, 0x07, 0xB0, 0x2F, 0xE6, 0x24, 0x28, 0x01,
+ 0x78, 0x4F, 0x79, 0xCD, 0x6C, 0x22, 0x3E, 0x07, 0xBA, 0x9F,
+ 0xCD, 0x6C, 0x22, 0x07, 0x07, 0xE6, 0x50, 0x47, 0x3E, 0x08,
+ 0xBA, 0x9F, 0xAE, 0xA0, 0xAE, 0x77, 0x23, 0x78, 0xC9, 0x9F,
+ 0x7A, 0x0F, 0x06, 0x80, 0x20, 0x03, 0x0F, 0x06, 0x40, 0x4F,
+ 0x7A, 0xFE, 0x08, 0x28, 0x04, 0xFE, 0x02, 0x30, 0xBD, 0x79,
+ 0x21, 0x8F, 0x5C, 0xCD, 0x6C, 0x22, 0x79, 0x0F, 0x0F, 0x0F,
+ 0x18, 0xD8, 0xCD, 0x94, 0x1E, 0xFE, 0x08, 0x30, 0xA9, 0xD3,
+ 0xFE, 0x07, 0x07, 0x07, 0xCB, 0x6F, 0x20, 0x02, 0xEE, 0x07,
+ 0x32, 0x48, 0x5C, 0xC9, 0x3E, 0xAF, 0x90, 0xDA, 0xF9, 0x24,
+ 0x47, 0xA7, 0x1F, 0x37, 0x1F, 0xA7, 0x1F, 0xA8, 0xE6, 0xF8,
+ 0xA8, 0x67, 0x79, 0x07, 0x07, 0x07, 0xA8, 0xE6, 0xC7, 0xA8,
+ 0x07, 0x07, 0x6F, 0x79, 0xE6, 0x07, 0xC9, 0xCD, 0x07, 0x23,
+ 0xCD, 0xAA, 0x22, 0x47, 0x04, 0x7E, 0x07, 0x10, 0xFD, 0xE6,
+ 0x01, 0xC3, 0x28, 0x2D, 0xCD, 0x07, 0x23, 0xCD, 0xE5, 0x22,
+ 0xC3, 0x4D, 0x0D, 0xED, 0x43, 0x7D, 0x5C, 0xCD, 0xAA, 0x22,
+ 0x47, 0x04, 0x3E, 0xFE, 0x0F, 0x10, 0xFD, 0x47, 0x7E, 0xFD,
+ 0x4E, 0x57, 0xCB, 0x41, 0x20, 0x01, 0xA0, 0xCB, 0x51, 0x20,
+ 0x02, 0xA8, 0x2F, 0x77, 0xC3, 0xDB, 0x0B, 0xCD, 0x14, 0x23,
+ 0x47, 0xC5, 0xCD, 0x14, 0x23, 0x59, 0xC1, 0x51, 0x4F, 0xC9,
+ 0xCD, 0xD5, 0x2D, 0xDA, 0xF9, 0x24, 0x0E, 0x01, 0xC8, 0x0E,
+ 0xFF, 0xC9, 0xDF, 0xFE, 0x2C, 0xC2, 0x8A, 0x1C, 0xE7, 0xCD,
+ 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0xEF, 0x2A, 0x3D, 0x38, 0x7E,
+ 0xFE, 0x81, 0x30, 0x05, 0xEF, 0x02, 0x38, 0x18, 0xA1, 0xEF,
+ 0xA3, 0x38, 0x36, 0x83, 0xEF, 0xC5, 0x02, 0x38, 0xCD, 0x7D,
+ 0x24, 0xC5, 0xEF, 0x31, 0xE1, 0x04, 0x38, 0x7E, 0xFE, 0x80,
+ 0x30, 0x08, 0xEF, 0x02, 0x02, 0x38, 0xC1, 0xC3, 0xDC, 0x22,
+ 0xEF, 0xC2, 0x01, 0xC0, 0x02, 0x03, 0x01, 0xE0, 0x0F, 0xC0,
+ 0x01, 0x31, 0xE0, 0x01, 0x31, 0xE0, 0xA0, 0xC1, 0x02, 0x38,
+ 0xFD, 0x34, 0x62, 0xCD, 0x94, 0x1E, 0x6F, 0xE5, 0xCD, 0x94,
+ 0x1E, 0xE1, 0x67, 0x22, 0x7D, 0x5C, 0xC1, 0xC3, 0x20, 0x24,
+ 0xDF, 0xFE, 0x2C, 0x28, 0x06, 0xCD, 0xEE, 0x1B, 0xC3, 0x77,
+ 0x24, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0xEF, 0xC5,
+ 0xA2, 0x04, 0x1F, 0x31, 0x30, 0x30, 0x00, 0x06, 0x02, 0x38,
+ 0xC3, 0x77, 0x24, 0xC0, 0x02, 0xC1, 0x02, 0x31, 0x2A, 0xE1,
+ 0x01, 0xE1, 0x2A, 0x0F, 0xE0, 0x05, 0x2A, 0xE0, 0x01, 0x3D,
+ 0x38, 0x7E, 0xFE, 0x81, 0x30, 0x07, 0xEF, 0x02, 0x02, 0x38,
+ 0xC3, 0x77, 0x24, 0xCD, 0x7D, 0x24, 0xC5, 0xEF, 0x02, 0xE1,
+ 0x01, 0x05, 0xC1, 0x02, 0x01, 0x31, 0xE1, 0x04, 0xC2, 0x02,
+ 0x01, 0x31, 0xE1, 0x04, 0xE2, 0xE5, 0xE0, 0x03, 0xA2, 0x04,
+ 0x31, 0x1F, 0xC5, 0x02, 0x20, 0xC0, 0x02, 0xC2, 0x02, 0xC1,
+ 0xE5, 0x04, 0xE0, 0xE2, 0x04, 0x0F, 0xE1, 0x01, 0xC1, 0x02,
+ 0xE0, 0x04, 0xE2, 0xE5, 0x04, 0x03, 0xC2, 0x2A, 0xE1, 0x2A,
+ 0x0F, 0x02, 0x38, 0x1A, 0xFE, 0x81, 0xC1, 0xDA, 0x77, 0x24,
+ 0xC5, 0xEF, 0x01, 0x38, 0x3A, 0x7D, 0x5C, 0xCD, 0x28, 0x2D,
+ 0xEF, 0xC0, 0x0F, 0x01, 0x38, 0x3A, 0x7E, 0x5C, 0xCD, 0x28,
+ 0x2D, 0xEF, 0xC5, 0x0F, 0xE0, 0xE5, 0x38, 0xC1, 0x05, 0x28,
+ 0x3C, 0x18, 0x14, 0xEF, 0xE1, 0x31, 0xE3, 0x04, 0xE2, 0xE4,
+ 0x04, 0x03, 0xC1, 0x02, 0xE4, 0x04, 0xE2, 0xE3, 0x04, 0x0F,
+ 0xC2, 0x02, 0x38, 0xC5, 0xEF, 0xC0, 0x02, 0xE1, 0x0F, 0x31,
+ 0x38, 0x3A, 0x7D, 0x5C, 0xCD, 0x28, 0x2D, 0xEF, 0x03, 0xE0,
+ 0xE2, 0x0F, 0xC0, 0x01, 0xE0, 0x38, 0x3A, 0x7E, 0x5C, 0xCD,
+ 0x28, 0x2D, 0xEF, 0x03, 0x38, 0xCD, 0xB7, 0x24, 0xC1, 0x10,
+ 0xC6, 0xEF, 0x02, 0x02, 0x01, 0x38, 0x3A, 0x7D, 0x5C, 0xCD,
+ 0x28, 0x2D, 0xEF, 0x03, 0x01, 0x38, 0x3A, 0x7E, 0x5C, 0xCD,
+ 0x28, 0x2D, 0xEF, 0x03, 0x38, 0xCD, 0xB7, 0x24, 0xC3, 0x4D,
+ 0x0D, 0xEF, 0x31, 0x28, 0x34, 0x32, 0x00, 0x01, 0x05, 0xE5,
+ 0x01, 0x05, 0x2A, 0x38, 0xCD, 0xD5, 0x2D, 0x38, 0x06, 0xE6,
+ 0xFC, 0xC6, 0x04, 0x30, 0x02, 0x3E, 0xFC, 0xF5, 0xCD, 0x28,
+ 0x2D, 0xEF, 0xE5, 0x01, 0x05, 0x31, 0x1F, 0xC4, 0x02, 0x31,
+ 0xA2, 0x04, 0x1F, 0xC1, 0x01, 0xC0, 0x02, 0x31, 0x04, 0x31,
+ 0x0F, 0xA1, 0x03, 0x1B, 0xC3, 0x02, 0x38, 0xC1, 0xC9, 0xCD,
+ 0x07, 0x23, 0x79, 0xB8, 0x30, 0x06, 0x69, 0xD5, 0xAF, 0x5F,
+ 0x18, 0x07, 0xB1, 0xC8, 0x68, 0x41, 0xD5, 0x16, 0x00, 0x60,
+ 0x78, 0x1F, 0x85, 0x38, 0x03, 0xBC, 0x38, 0x07, 0x94, 0x4F,
+ 0xD9, 0xC1, 0xC5, 0x18, 0x04, 0x4F, 0xD5, 0xD9, 0xC1, 0x2A,
+ 0x7D, 0x5C, 0x78, 0x84, 0x47, 0x79, 0x3C, 0x85, 0x38, 0x0D,
+ 0x28, 0x0D, 0x3D, 0x4F, 0xCD, 0xE5, 0x22, 0xD9, 0x79, 0x10,
+ 0xD9, 0xD1, 0xC9, 0x28, 0xF3, 0xCF, 0x0A, 0xDF, 0x06, 0x00,
+ 0xC5, 0x4F, 0x21, 0x96, 0x25, 0xCD, 0xDC, 0x16, 0x79, 0xD2,
+ 0x84, 0x26, 0x06, 0x00, 0x4E, 0x09, 0xE9, 0xCD, 0x74, 0x00,
+ 0x03, 0xFE, 0x0D, 0xCA, 0x8A, 0x1C, 0xFE, 0x22, 0x20, 0xF3,
+ 0xCD, 0x74, 0x00, 0xFE, 0x22, 0xC9, 0xE7, 0xFE, 0x28, 0x20,
+ 0x06, 0xCD, 0x79, 0x1C, 0xDF, 0xFE, 0x29, 0xC2, 0x8A, 0x1C,
+ 0xFD, 0xCB, 0x01, 0x7E, 0xC9, 0xCD, 0x07, 0x23, 0x2A, 0x36,
+ 0x5C, 0x11, 0x00, 0x01, 0x19, 0x79, 0x0F, 0x0F, 0x0F, 0xE6,
+ 0xE0, 0xA8, 0x5F, 0x79, 0xE6, 0x18, 0xEE, 0x40, 0x57, 0x06,
+ 0x60, 0xC5, 0xD5, 0xE5, 0x1A, 0xAE, 0x28, 0x04, 0x3C, 0x20,
+ 0x1A, 0x3D, 0x4F, 0x06, 0x07, 0x14, 0x23, 0x1A, 0xAE, 0xA9,
+ 0x20, 0x0F, 0x10, 0xF7, 0xC1, 0xC1, 0xC1, 0x3E, 0x80, 0x90,
+ 0x01, 0x01, 0x00, 0xF7, 0x12, 0x18, 0x0A, 0xE1, 0x11, 0x08,
+ 0x00, 0x19, 0xD1, 0xC1, 0x10, 0xD3, 0x48, 0xC3, 0xB2, 0x2A,
+ 0xCD, 0x07, 0x23, 0x79, 0x0F, 0x0F, 0x0F, 0x4F, 0xE6, 0xE0,
+ 0xA8, 0x6F, 0x79, 0xE6, 0x03, 0xEE, 0x58, 0x67, 0x7E, 0xC3,
+ 0x28, 0x2D, 0x22, 0x1C, 0x28, 0x4F, 0x2E, 0xF2, 0x2B, 0x12,
+ 0xA8, 0x56, 0xA5, 0x57, 0xA7, 0x84, 0xA6, 0x8F, 0xC4, 0xE6,
+ 0xAA, 0xBF, 0xAB, 0xC7, 0xA9, 0xCE, 0x00, 0xE7, 0xC3, 0xFF,
+ 0x24, 0xDF, 0x23, 0xE5, 0x01, 0x00, 0x00, 0xCD, 0x0F, 0x25,
+ 0x20, 0x1B, 0xCD, 0x0F, 0x25, 0x28, 0xFB, 0xCD, 0x30, 0x25,
+ 0x28, 0x11, 0xF7, 0xE1, 0xD5, 0x7E, 0x23, 0x12, 0x13, 0xFE,
+ 0x22, 0x20, 0xF8, 0x7E, 0x23, 0xFE, 0x22, 0x28, 0xF2, 0x0B,
+ 0xD1, 0x21, 0x3B, 0x5C, 0xCB, 0xB6, 0xCB, 0x7E, 0xC4, 0xB2,
+ 0x2A, 0xC3, 0x12, 0x27, 0xE7, 0xCD, 0xFB, 0x24, 0xFE, 0x29,
+ 0xC2, 0x8A, 0x1C, 0xE7, 0xC3, 0x12, 0x27, 0xC3, 0xBD, 0x27,
+ 0xCD, 0x30, 0x25, 0x28, 0x28, 0xED, 0x4B, 0x76, 0x5C, 0xCD,
+ 0x2B, 0x2D, 0xEF, 0xA1, 0x0F, 0x34, 0x37, 0x16, 0x04, 0x34,
+ 0x80, 0x41, 0x00, 0x00, 0x80, 0x32, 0x02, 0xA1, 0x03, 0x31,
+ 0x38, 0xCD, 0xA2, 0x2D, 0xED, 0x43, 0x76, 0x5C, 0x7E, 0xA7,
+ 0x28, 0x03, 0xD6, 0x10, 0x77, 0x18, 0x09, 0xCD, 0x30, 0x25,
+ 0x28, 0x04, 0xEF, 0xA3, 0x38, 0x34, 0xE7, 0xC3, 0xC3, 0x26,
+ 0x01, 0x5A, 0x10, 0xE7, 0xFE, 0x23, 0xCA, 0x0D, 0x27, 0x21,
+ 0x3B, 0x5C, 0xCB, 0xB6, 0xCB, 0x7E, 0x28, 0x1F, 0xCD, 0x8E,
+ 0x02, 0x0E, 0x00, 0x20, 0x13, 0xCD, 0x1E, 0x03, 0x30, 0x0E,
+ 0x15, 0x5F, 0xCD, 0x33, 0x03, 0xF5, 0x01, 0x01, 0x00, 0xF7,
+ 0xF1, 0x12, 0x0E, 0x01, 0x06, 0x00, 0xCD, 0xB2, 0x2A, 0xC3,
+ 0x12, 0x27, 0xCD, 0x22, 0x25, 0xC4, 0x35, 0x25, 0xE7, 0xC3,
+ 0xDB, 0x25, 0xCD, 0x22, 0x25, 0xC4, 0x80, 0x25, 0xE7, 0x18,
+ 0x48, 0xCD, 0x22, 0x25, 0xC4, 0xCB, 0x22, 0xE7, 0x18, 0x3F,
+ 0xCD, 0x88, 0x2C, 0x30, 0x56, 0xFE, 0x41, 0x30, 0x3C, 0xCD,
+ 0x30, 0x25, 0x20, 0x23, 0xCD, 0x9B, 0x2C, 0xDF, 0x01, 0x06,
+ 0x00, 0xCD, 0x55, 0x16, 0x23, 0x36, 0x0E, 0x23, 0xEB, 0x2A,
+ 0x65, 0x5C, 0x0E, 0x05, 0xA7, 0xED, 0x42, 0x22, 0x65, 0x5C,
+ 0xED, 0xB0, 0xEB, 0x2B, 0xCD, 0x77, 0x00, 0x18, 0x0E, 0xDF,
+ 0x23, 0x7E, 0xFE, 0x0E, 0x20, 0xFA, 0x23, 0xCD, 0xB4, 0x33,
+ 0x22, 0x5D, 0x5C, 0xFD, 0xCB, 0x01, 0xF6, 0x18, 0x14, 0xCD,
+ 0xB2, 0x28, 0xDA, 0x2E, 0x1C, 0xCC, 0x96, 0x29, 0x3A, 0x3B,
+ 0x5C, 0xFE, 0xC0, 0x38, 0x04, 0x23, 0xCD, 0xB4, 0x33, 0x18,
+ 0x33, 0x01, 0xDB, 0x09, 0xFE, 0x2D, 0x28, 0x27, 0x01, 0x18,
+ 0x10, 0xFE, 0xAE, 0x28, 0x20, 0xD6, 0xAF, 0xDA, 0x8A, 0x1C,
+ 0x01, 0xF0, 0x04, 0xFE, 0x14, 0x28, 0x14, 0xD2, 0x8A, 0x1C,
+ 0x06, 0x10, 0xC6, 0xDC, 0x4F, 0xFE, 0xDF, 0x30, 0x02, 0xCB,
+ 0xB1, 0xFE, 0xEE, 0x38, 0x02, 0xCB, 0xB9, 0xC5, 0xE7, 0xC3,
+ 0xFF, 0x24, 0xDF, 0xFE, 0x28, 0x20, 0x0C, 0xFD, 0xCB, 0x01,
+ 0x76, 0x20, 0x17, 0xCD, 0x52, 0x2A, 0xE7, 0x18, 0xF0, 0x06,
+ 0x00, 0x4F, 0x21, 0x95, 0x27, 0xCD, 0xDC, 0x16, 0x30, 0x06,
+ 0x4E, 0x21, 0xED, 0x26, 0x09, 0x46, 0xD1, 0x7A, 0xB8, 0x38,
+ 0x3A, 0xA7, 0xCA, 0x18, 0x00, 0xC5, 0x21, 0x3B, 0x5C, 0x7B,
+ 0xFE, 0xED, 0x20, 0x06, 0xCB, 0x76, 0x20, 0x02, 0x1E, 0x99,
+ 0xD5, 0xCD, 0x30, 0x25, 0x28, 0x09, 0x7B, 0xE6, 0x3F, 0x47,
+ 0xEF, 0x3B, 0x38, 0x18, 0x09, 0x7B, 0xFD, 0xAE, 0x01, 0xE6,
+ 0x40, 0xC2, 0x8A, 0x1C, 0xD1, 0x21, 0x3B, 0x5C, 0xCB, 0xF6,
+ 0xCB, 0x7B, 0x20, 0x02, 0xCB, 0xB6, 0xC1, 0x18, 0xC1, 0xD5,
+ 0x79, 0xFD, 0xCB, 0x01, 0x76, 0x20, 0x15, 0xE6, 0x3F, 0xC6,
+ 0x08, 0x4F, 0xFE, 0x10, 0x20, 0x04, 0xCB, 0xF1, 0x18, 0x08,
+ 0x38, 0xD7, 0xFE, 0x17, 0x28, 0x02, 0xCB, 0xF9, 0xC5, 0xE7,
+ 0xC3, 0xFF, 0x24, 0x2B, 0xCF, 0x2D, 0xC3, 0x2A, 0xC4, 0x2F,
+ 0xC5, 0x5E, 0xC6, 0x3D, 0xCE, 0x3E, 0xCC, 0x3C, 0xCD, 0xC7,
+ 0xC9, 0xC8, 0xCA, 0xC9, 0xCB, 0xC5, 0xC7, 0xC6, 0xC8, 0x00,
+ 0x06, 0x08, 0x08, 0x0A, 0x02, 0x03, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x06, 0xCD, 0x30, 0x25, 0x20, 0x35, 0xE7, 0xCD,
+ 0x8D, 0x2C, 0xD2, 0x8A, 0x1C, 0xE7, 0xFE, 0x24, 0xF5, 0x20,
+ 0x01, 0xE7, 0xFE, 0x28, 0x20, 0x12, 0xE7, 0xFE, 0x29, 0x28,
+ 0x10, 0xCD, 0xFB, 0x24, 0xDF, 0xFE, 0x2C, 0x20, 0x03, 0xE7,
+ 0x18, 0xF5, 0xFE, 0x29, 0xC2, 0x8A, 0x1C, 0xE7, 0x21, 0x3B,
+ 0x5C, 0xCB, 0xB6, 0xF1, 0x28, 0x02, 0xCB, 0xF6, 0xC3, 0x12,
+ 0x27, 0xE7, 0xE6, 0xDF, 0x47, 0xE7, 0xD6, 0x24, 0x4F, 0x20,
+ 0x01, 0xE7, 0xE7, 0xE5, 0x2A, 0x53, 0x5C, 0x2B, 0x11, 0xCE,
+ 0x00, 0xC5, 0xCD, 0x86, 0x1D, 0xC1, 0x30, 0x02, 0xCF, 0x18,
+ 0xE5, 0xCD, 0xAB, 0x28, 0xE6, 0xDF, 0xB8, 0x20, 0x08, 0xCD,
+ 0xAB, 0x28, 0xD6, 0x24, 0xB9, 0x28, 0x0C, 0xE1, 0x2B, 0x11,
+ 0x00, 0x02, 0xC5, 0xCD, 0x8B, 0x19, 0xC1, 0x18, 0xD7, 0xA7,
+ 0xCC, 0xAB, 0x28, 0xD1, 0xD1, 0xED, 0x53, 0x5D, 0x5C, 0xCD,
+ 0xAB, 0x28, 0xE5, 0xFE, 0x29, 0x28, 0x42, 0x23, 0x7E, 0xFE,
+ 0x0E, 0x16, 0x40, 0x28, 0x07, 0x2B, 0xCD, 0xAB, 0x28, 0x23,
+ 0x16, 0x00, 0x23, 0xE5, 0xD5, 0xCD, 0xFB, 0x24, 0xF1, 0xFD,
+ 0xAE, 0x01, 0xE6, 0x40, 0x20, 0x2B, 0xE1, 0xEB, 0x2A, 0x65,
+ 0x5C, 0x01, 0x05, 0x00, 0xED, 0x42, 0x22, 0x65, 0x5C, 0xED,
+ 0xB0, 0xEB, 0x2B, 0xCD, 0xAB, 0x28, 0xFE, 0x29, 0x28, 0x0D,
+ 0xE5, 0xDF, 0xFE, 0x2C, 0x20, 0x0D, 0xE7, 0xE1, 0xCD, 0xAB,
+ 0x28, 0x18, 0xBE, 0xE5, 0xDF, 0xFE, 0x29, 0x28, 0x02, 0xCF,
+ 0x19, 0xD1, 0xEB, 0x22, 0x5D, 0x5C, 0x2A, 0x0B, 0x5C, 0xE3,
+ 0x22, 0x0B, 0x5C, 0xD5, 0xE7, 0xE7, 0xCD, 0xFB, 0x24, 0xE1,
+ 0x22, 0x5D, 0x5C, 0xE1, 0x22, 0x0B, 0x5C, 0xE7, 0xC3, 0x12,
+ 0x27, 0x23, 0x7E, 0xFE, 0x21, 0x38, 0xFA, 0xC9, 0xFD, 0xCB,
+ 0x01, 0xF6, 0xDF, 0xCD, 0x8D, 0x2C, 0xD2, 0x8A, 0x1C, 0xE5,
+ 0xE6, 0x1F, 0x4F, 0xE7, 0xE5, 0xFE, 0x28, 0x28, 0x28, 0xCB,
+ 0xF1, 0xFE, 0x24, 0x28, 0x11, 0xCB, 0xE9, 0xCD, 0x88, 0x2C,
+ 0x30, 0x0F, 0xCD, 0x88, 0x2C, 0x30, 0x16, 0xCB, 0xB1, 0xE7,
+ 0x18, 0xF6, 0xE7, 0xFD, 0xCB, 0x01, 0xB6, 0x3A, 0x0C, 0x5C,
+ 0xA7, 0x28, 0x06, 0xCD, 0x30, 0x25, 0xC2, 0x51, 0x29, 0x41,
+ 0xCD, 0x30, 0x25, 0x20, 0x08, 0x79, 0xE6, 0xE0, 0xCB, 0xFF,
+ 0x4F, 0x18, 0x37, 0x2A, 0x4B, 0x5C, 0x7E, 0xE6, 0x7F, 0x28,
+ 0x2D, 0xB9, 0x20, 0x22, 0x17, 0x87, 0xF2, 0x3F, 0x29, 0x38,
+ 0x30, 0xD1, 0xD5, 0xE5, 0x23, 0x1A, 0x13, 0xFE, 0x20, 0x28,
+ 0xFA, 0xF6, 0x20, 0xBE, 0x28, 0xF4, 0xF6, 0x80, 0xBE, 0x20,
+ 0x06, 0x1A, 0xCD, 0x88, 0x2C, 0x30, 0x15, 0xE1, 0xC5, 0xCD,
+ 0xB8, 0x19, 0xEB, 0xC1, 0x18, 0xCE, 0xCB, 0xF8, 0xD1, 0xDF,
+ 0xFE, 0x28, 0x28, 0x09, 0xCB, 0xE8, 0x18, 0x0D, 0xD1, 0xD1,
+ 0xD1, 0xE5, 0xDF, 0xCD, 0x88, 0x2C, 0x30, 0x03, 0xE7, 0x18,
+ 0xF8, 0xE1, 0xCB, 0x10, 0xCB, 0x70, 0xC9, 0x2A, 0x0B, 0x5C,
+ 0x7E, 0xFE, 0x29, 0xCA, 0xEF, 0x28, 0x7E, 0xF6, 0x60, 0x47,
+ 0x23, 0x7E, 0xFE, 0x0E, 0x28, 0x07, 0x2B, 0xCD, 0xAB, 0x28,
+ 0x23, 0xCB, 0xA8, 0x78, 0xB9, 0x28, 0x12, 0x23, 0x23, 0x23,
+ 0x23, 0x23, 0xCD, 0xAB, 0x28, 0xFE, 0x29, 0xCA, 0xEF, 0x28,
+ 0xCD, 0xAB, 0x28, 0x18, 0xD9, 0xCB, 0x69, 0x20, 0x0C, 0x23,
+ 0xED, 0x5B, 0x65, 0x5C, 0xCD, 0xC0, 0x33, 0xEB, 0x22, 0x65,
+ 0x5C, 0xD1, 0xD1, 0xAF, 0x3C, 0xC9, 0xAF, 0x47, 0xCB, 0x79,
+ 0x20, 0x4B, 0xCB, 0x7E, 0x20, 0x0E, 0x3C, 0x23, 0x4E, 0x23,
+ 0x46, 0x23, 0xEB, 0xCD, 0xB2, 0x2A, 0xDF, 0xC3, 0x49, 0x2A,
+ 0x23, 0x23, 0x23, 0x46, 0xCB, 0x71, 0x28, 0x0A, 0x05, 0x28,
+ 0xE8, 0xEB, 0xDF, 0xFE, 0x28, 0x20, 0x61, 0xEB, 0xEB, 0x18,
+ 0x24, 0xE5, 0xDF, 0xE1, 0xFE, 0x2C, 0x28, 0x20, 0xCB, 0x79,
+ 0x28, 0x52, 0xCB, 0x71, 0x20, 0x06, 0xFE, 0x29, 0x20, 0x3C,
+ 0xE7, 0xC9, 0xFE, 0x29, 0x28, 0x6C, 0xFE, 0xCC, 0x20, 0x32,
+ 0xDF, 0x2B, 0x22, 0x5D, 0x5C, 0x18, 0x5E, 0x21, 0x00, 0x00,
+ 0xE5, 0xE7, 0xE1, 0x79, 0xFE, 0xC0, 0x20, 0x09, 0xDF, 0xFE,
+ 0x29, 0x28, 0x51, 0xFE, 0xCC, 0x28, 0xE5, 0xC5, 0xE5, 0xCD,
+ 0xEE, 0x2A, 0xE3, 0xEB, 0xCD, 0xCC, 0x2A, 0x38, 0x19, 0x0B,
+ 0xCD, 0xF4, 0x2A, 0x09, 0xD1, 0xC1, 0x10, 0xB3, 0xCB, 0x79,
+ 0x20, 0x66, 0xE5, 0xCB, 0x71, 0x20, 0x13, 0x42, 0x4B, 0xDF,
+ 0xFE, 0x29, 0x28, 0x02, 0xCF, 0x02, 0xE7, 0xE1, 0x11, 0x05,
+ 0x00, 0xCD, 0xF4, 0x2A, 0x09, 0xC9, 0xCD, 0xEE, 0x2A, 0xE3,
+ 0xCD, 0xF4, 0x2A, 0xC1, 0x09, 0x23, 0x42, 0x4B, 0xEB, 0xCD,
+ 0xB1, 0x2A, 0xDF, 0xFE, 0x29, 0x28, 0x07, 0xFE, 0x2C, 0x20,
+ 0xDB, 0xCD, 0x52, 0x2A, 0xE7, 0xFE, 0x28, 0x28, 0xF8, 0xFD,
+ 0xCB, 0x01, 0xB6, 0xC9, 0xCD, 0x30, 0x25, 0xC4, 0xF1, 0x2B,
+ 0xE7, 0xFE, 0x29, 0x28, 0x50, 0xD5, 0xAF, 0xF5, 0xC5, 0x11,
+ 0x01, 0x00, 0xDF, 0xE1, 0xFE, 0xCC, 0x28, 0x17, 0xF1, 0xCD,
+ 0xCD, 0x2A, 0xF5, 0x50, 0x59, 0xE5, 0xDF, 0xE1, 0xFE, 0xCC,
+ 0x28, 0x09, 0xFE, 0x29, 0xC2, 0x8A, 0x1C, 0x62, 0x6B, 0x18,
+ 0x13, 0xE5, 0xE7, 0xE1, 0xFE, 0x29, 0x28, 0x0C, 0xF1, 0xCD,
+ 0xCD, 0x2A, 0xF5, 0xDF, 0x60, 0x69, 0xFE, 0x29, 0x20, 0xE6,
+ 0xF1, 0xE3, 0x19, 0x2B, 0xE3, 0xA7, 0xED, 0x52, 0x01, 0x00,
+ 0x00, 0x38, 0x07, 0x23, 0xA7, 0xFA, 0x20, 0x2A, 0x44, 0x4D,
+ 0xD1, 0xFD, 0xCB, 0x01, 0xB6, 0xCD, 0x30, 0x25, 0xC8, 0xAF,
+ 0xFD, 0xCB, 0x01, 0xB6, 0xC5, 0xCD, 0xA9, 0x33, 0xC1, 0x2A,
+ 0x65, 0x5C, 0x77, 0x23, 0x73, 0x23, 0x72, 0x23, 0x71, 0x23,
+ 0x70, 0x23, 0x22, 0x65, 0x5C, 0xC9, 0xAF, 0xD5, 0xE5, 0xF5,
+ 0xCD, 0x82, 0x1C, 0xF1, 0xCD, 0x30, 0x25, 0x28, 0x12, 0xF5,
+ 0xCD, 0x99, 0x1E, 0xD1, 0x78, 0xB1, 0x37, 0x28, 0x05, 0xE1,
+ 0xE5, 0xA7, 0xED, 0x42, 0x7A, 0xDE, 0x00, 0xE1, 0xD1, 0xC9,
+ 0xEB, 0x23, 0x5E, 0x23, 0x56, 0xC9, 0xCD, 0x30, 0x25, 0xC8,
+ 0xCD, 0xA9, 0x30, 0xDA, 0x15, 0x1F, 0xC9, 0x2A, 0x4D, 0x5C,
+ 0xFD, 0xCB, 0x37, 0x4E, 0x28, 0x5E, 0x01, 0x05, 0x00, 0x03,
+ 0x23, 0x7E, 0xFE, 0x20, 0x28, 0xFA, 0x30, 0x0B, 0xFE, 0x10,
+ 0x38, 0x11, 0xFE, 0x16, 0x30, 0x0D, 0x23, 0x18, 0xED, 0xCD,
+ 0x88, 0x2C, 0x38, 0xE7, 0xFE, 0x24, 0xCA, 0xC0, 0x2B, 0x79,
+ 0x2A, 0x59, 0x5C, 0x2B, 0xCD, 0x55, 0x16, 0x23, 0x23, 0xEB,
+ 0xD5, 0x2A, 0x4D, 0x5C, 0x1B, 0xD6, 0x06, 0x47, 0x28, 0x11,
+ 0x23, 0x7E, 0xFE, 0x21, 0x38, 0xFA, 0xF6, 0x20, 0x13, 0x12,
+ 0x10, 0xF4, 0xF6, 0x80, 0x12, 0x3E, 0xC0, 0x2A, 0x4D, 0x5C,
+ 0xAE, 0xF6, 0x20, 0xE1, 0xCD, 0xEA, 0x2B, 0xE5, 0xEF, 0x02,
+ 0x38, 0xE1, 0x01, 0x05, 0x00, 0xA7, 0xED, 0x42, 0x18, 0x40,
+ 0xFD, 0xCB, 0x01, 0x76, 0x28, 0x06, 0x11, 0x06, 0x00, 0x19,
+ 0x18, 0xE7, 0x2A, 0x4D, 0x5C, 0xED, 0x4B, 0x72, 0x5C, 0xFD,
+ 0xCB, 0x37, 0x46, 0x20, 0x30, 0x78, 0xB1, 0xC8, 0xE5, 0xF7,
+ 0xD5, 0xC5, 0x54, 0x5D, 0x23, 0x36, 0x20, 0xED, 0xB8, 0xE5,
+ 0xCD, 0xF1, 0x2B, 0xE1, 0xE3, 0xA7, 0xED, 0x42, 0x09, 0x30,
+ 0x02, 0x44, 0x4D, 0xE3, 0xEB, 0x78, 0xB1, 0x28, 0x02, 0xED,
+ 0xB0, 0xC1, 0xD1, 0xE1, 0xEB, 0x78, 0xB1, 0xC8, 0xD5, 0xED,
+ 0xB0, 0xE1, 0xC9, 0x2B, 0x2B, 0x2B, 0x7E, 0xE5, 0xC5, 0xCD,
+ 0xC6, 0x2B, 0xC1, 0xE1, 0x03, 0x03, 0x03, 0xC3, 0xE8, 0x19,
+ 0x3E, 0xDF, 0x2A, 0x4D, 0x5C, 0xA6, 0xF5, 0xCD, 0xF1, 0x2B,
+ 0xEB, 0x09, 0xC5, 0x2B, 0x22, 0x4D, 0x5C, 0x03, 0x03, 0x03,
+ 0x2A, 0x59, 0x5C, 0x2B, 0xCD, 0x55, 0x16, 0x2A, 0x4D, 0x5C,
+ 0xC1, 0xC5, 0x03, 0xED, 0xB8, 0xEB, 0x23, 0xC1, 0x70, 0x2B,
+ 0x71, 0xF1, 0x2B, 0x77, 0x2A, 0x59, 0x5C, 0x2B, 0xC9, 0x2A,
+ 0x65, 0x5C, 0x2B, 0x46, 0x2B, 0x4E, 0x2B, 0x56, 0x2B, 0x5E,
+ 0x2B, 0x7E, 0x22, 0x65, 0x5C, 0xC9, 0xCD, 0xB2, 0x28, 0xC2,
+ 0x8A, 0x1C, 0xCD, 0x30, 0x25, 0x20, 0x08, 0xCB, 0xB1, 0xCD,
+ 0x96, 0x29, 0xCD, 0xEE, 0x1B, 0x38, 0x08, 0xC5, 0xCD, 0xB8,
+ 0x19, 0xCD, 0xE8, 0x19, 0xC1, 0xCB, 0xF9, 0x06, 0x00, 0xC5,
+ 0x21, 0x01, 0x00, 0xCB, 0x71, 0x20, 0x02, 0x2E, 0x05, 0xEB,
+ 0xE7, 0x26, 0xFF, 0xCD, 0xCC, 0x2A, 0xDA, 0x20, 0x2A, 0xE1,
+ 0xC5, 0x24, 0xE5, 0x60, 0x69, 0xCD, 0xF4, 0x2A, 0xEB, 0xDF,
+ 0xFE, 0x2C, 0x28, 0xE8, 0xFE, 0x29, 0x20, 0xBB, 0xE7, 0xC1,
+ 0x79, 0x68, 0x26, 0x00, 0x23, 0x23, 0x29, 0x19, 0xDA, 0x15,
+ 0x1F, 0xD5, 0xC5, 0xE5, 0x44, 0x4D, 0x2A, 0x59, 0x5C, 0x2B,
+ 0xCD, 0x55, 0x16, 0x23, 0x77, 0xC1, 0x0B, 0x0B, 0x0B, 0x23,
+ 0x71, 0x23, 0x70, 0xC1, 0x78, 0x23, 0x77, 0x62, 0x6B, 0x1B,
+ 0x36, 0x00, 0xCB, 0x71, 0x28, 0x02, 0x36, 0x20, 0xC1, 0xED,
+ 0xB8, 0xC1, 0x70, 0x2B, 0x71, 0x2B, 0x3D, 0x20, 0xF8, 0xC9,
+ 0xCD, 0x1B, 0x2D, 0x3F, 0xD8, 0xFE, 0x41, 0x3F, 0xD0, 0xFE,
+ 0x5B, 0xD8, 0xFE, 0x61, 0x3F, 0xD0, 0xFE, 0x7B, 0xC9, 0xFE,
+ 0xC4, 0x20, 0x19, 0x11, 0x00, 0x00, 0xE7, 0xD6, 0x31, 0xCE,
+ 0x00, 0x20, 0x0A, 0xEB, 0x3F, 0xED, 0x6A, 0xDA, 0xAD, 0x31,
+ 0xEB, 0x18, 0xEF, 0x42, 0x4B, 0xC3, 0x2B, 0x2D, 0xFE, 0x2E,
+ 0x28, 0x0F, 0xCD, 0x3B, 0x2D, 0xFE, 0x2E, 0x20, 0x28, 0xE7,
+ 0xCD, 0x1B, 0x2D, 0x38, 0x22, 0x18, 0x0A, 0xE7, 0xCD, 0x1B,
+ 0x2D, 0xDA, 0x8A, 0x1C, 0xEF, 0xA0, 0x38, 0xEF, 0xA1, 0xC0,
+ 0x02, 0x38, 0xDF, 0xCD, 0x22, 0x2D, 0x38, 0x0B, 0xEF, 0xE0,
+ 0xA4, 0x05, 0xC0, 0x04, 0x0F, 0x38, 0xE7, 0x18, 0xEF, 0xFE,
+ 0x45, 0x28, 0x03, 0xFE, 0x65, 0xC0, 0x06, 0xFF, 0xE7, 0xFE,
+ 0x2B, 0x28, 0x05, 0xFE, 0x2D, 0x20, 0x02, 0x04, 0xE7, 0xCD,
+ 0x1B, 0x2D, 0x38, 0xCB, 0xC5, 0xCD, 0x3B, 0x2D, 0xCD, 0xD5,
+ 0x2D, 0xC1, 0xDA, 0xAD, 0x31, 0xA7, 0xFA, 0xAD, 0x31, 0x04,
+ 0x28, 0x02, 0xED, 0x44, 0xC3, 0x4F, 0x2D, 0xFE, 0x30, 0xD8,
+ 0xFE, 0x3A, 0x3F, 0xC9, 0xCD, 0x1B, 0x2D, 0xD8, 0xD6, 0x30,
+ 0x4F, 0x06, 0x00, 0xFD, 0x21, 0x3A, 0x5C, 0xAF, 0x5F, 0x51,
+ 0x48, 0x47, 0xCD, 0xB6, 0x2A, 0xEF, 0x38, 0xA7, 0xC9, 0xF5,
+ 0xEF, 0xA0, 0x38, 0xF1, 0xCD, 0x22, 0x2D, 0xD8, 0xEF, 0x01,
+ 0xA4, 0x04, 0x0F, 0x38, 0xCD, 0x74, 0x00, 0x18, 0xF1, 0x07,
+ 0x0F, 0x30, 0x02, 0x2F, 0x3C, 0xF5, 0x21, 0x92, 0x5C, 0xCD,
+ 0x0B, 0x35, 0xEF, 0xA4, 0x38, 0xF1, 0xCB, 0x3F, 0x30, 0x0D,
+ 0xF5, 0xEF, 0xC1, 0xE0, 0x00, 0x04, 0x04, 0x33, 0x02, 0x05,
+ 0xE1, 0x38, 0xF1, 0x28, 0x08, 0xF5, 0xEF, 0x31, 0x04, 0x38,
+ 0xF1, 0x18, 0xE5, 0xEF, 0x02, 0x38, 0xC9, 0x23, 0x4E, 0x23,
+ 0x7E, 0xA9, 0x91, 0x5F, 0x23, 0x7E, 0x89, 0xA9, 0x57, 0xC9,
+ 0x0E, 0x00, 0xE5, 0x36, 0x00, 0x23, 0x71, 0x23, 0x7B, 0xA9,
+ 0x91, 0x77, 0x23, 0x7A, 0x89, 0xA9, 0x77, 0x23, 0x36, 0x00,
+ 0xE1, 0xC9, 0xEF, 0x38, 0x7E, 0xA7, 0x28, 0x05, 0xEF, 0xA2,
+ 0x0F, 0x27, 0x38, 0xEF, 0x02, 0x38, 0xE5, 0xD5, 0xEB, 0x46,
+ 0xCD, 0x7F, 0x2D, 0xAF, 0x90, 0xCB, 0x79, 0x42, 0x4B, 0x7B,
+ 0xD1, 0xE1, 0xC9, 0x57, 0x17, 0x9F, 0x5F, 0x4F, 0xAF, 0x47,
+ 0xCD, 0xB6, 0x2A, 0xEF, 0x34, 0xEF, 0x1A, 0x20, 0x9A, 0x85,
+ 0x04, 0x27, 0x38, 0xCD, 0xA2, 0x2D, 0xD8, 0xF5, 0x05, 0x04,
+ 0x28, 0x03, 0xF1, 0x37, 0xC9, 0xF1, 0xC9, 0xEF, 0x31, 0x36,
+ 0x00, 0x0B, 0x31, 0x37, 0x00, 0x0D, 0x02, 0x38, 0x3E, 0x30,
+ 0xD7, 0xC9, 0x2A, 0x38, 0x3E, 0x2D, 0xD7, 0xEF, 0xA0, 0xC3,
+ 0xC4, 0xC5, 0x02, 0x38, 0xD9, 0xE5, 0xD9, 0xEF, 0x31, 0x27,
+ 0xC2, 0x03, 0xE2, 0x01, 0xC2, 0x02, 0x38, 0x7E, 0xA7, 0x20,
+ 0x47, 0xCD, 0x7F, 0x2D, 0x06, 0x10, 0x7A, 0xA7, 0x20, 0x06,
+ 0xB3, 0x28, 0x09, 0x53, 0x06, 0x08, 0xD5, 0xD9, 0xD1, 0xD9,
+ 0x18, 0x57, 0xEF, 0xE2, 0x38, 0x7E, 0xD6, 0x7E, 0xCD, 0xC1,
+ 0x2D, 0x57, 0x3A, 0xAC, 0x5C, 0x92, 0x32, 0xAC, 0x5C, 0x7A,
+ 0xCD, 0x4F, 0x2D, 0xEF, 0x31, 0x27, 0xC1, 0x03, 0xE1, 0x38,
+ 0xCD, 0xD5, 0x2D, 0xE5, 0x32, 0xA1, 0x5C, 0x3D, 0x17, 0x9F,
+ 0x3C, 0x21, 0xAB, 0x5C, 0x77, 0x23, 0x86, 0x77, 0xE1, 0xC3,
+ 0xCF, 0x2E, 0xD6, 0x80, 0xFE, 0x1C, 0x38, 0x13, 0xCD, 0xC1,
+ 0x2D, 0xD6, 0x07, 0x47, 0x21, 0xAC, 0x5C, 0x86, 0x77, 0x78,
+ 0xED, 0x44, 0xCD, 0x4F, 0x2D, 0x18, 0x92, 0xEB, 0xCD, 0xBA,
+ 0x2F, 0xD9, 0xCB, 0xFA, 0x7D, 0xD9, 0xD6, 0x80, 0x47, 0xCB,
+ 0x23, 0xCB, 0x12, 0xD9, 0xCB, 0x13, 0xCB, 0x12, 0xD9, 0x21,
+ 0xAA, 0x5C, 0x0E, 0x05, 0x7E, 0x8F, 0x27, 0x77, 0x2B, 0x0D,
+ 0x20, 0xF8, 0x10, 0xE7, 0xAF, 0x21, 0xA6, 0x5C, 0x11, 0xA1,
+ 0x5C, 0x06, 0x09, 0xED, 0x6F, 0x0E, 0xFF, 0xED, 0x6F, 0x20,
+ 0x04, 0x0D, 0x0C, 0x20, 0x0A, 0x12, 0x13, 0xFD, 0x34, 0x71,
+ 0xFD, 0x34, 0x72, 0x0E, 0x00, 0xCB, 0x40, 0x28, 0x01, 0x23,
+ 0x10, 0xE7, 0x3A, 0xAB, 0x5C, 0xD6, 0x09, 0x38, 0x0A, 0xFD,
+ 0x35, 0x71, 0x3E, 0x04, 0xFD, 0xBE, 0x6F, 0x18, 0x41, 0xEF,
+ 0x02, 0xE2, 0x38, 0xEB, 0xCD, 0xBA, 0x2F, 0xD9, 0x3E, 0x80,
+ 0x95, 0x2E, 0x00, 0xCB, 0xFA, 0xD9, 0xCD, 0xDD, 0x2F, 0xFD,
+ 0x7E, 0x71, 0xFE, 0x08, 0x38, 0x06, 0xD9, 0xCB, 0x12, 0xD9,
+ 0x18, 0x20, 0x01, 0x00, 0x02, 0x7B, 0xCD, 0x8B, 0x2F, 0x5F,
+ 0x7A, 0xCD, 0x8B, 0x2F, 0x57, 0xC5, 0xD9, 0xC1, 0x10, 0xF1,
+ 0x21, 0xA1, 0x5C, 0x79, 0xFD, 0x4E, 0x71, 0x09, 0x77, 0xFD,
+ 0x34, 0x71, 0x18, 0xD3, 0xF5, 0x21, 0xA1, 0x5C, 0xFD, 0x4E,
+ 0x71, 0x06, 0x00, 0x09, 0x41, 0xF1, 0x2B, 0x7E, 0xCE, 0x00,
+ 0x77, 0xA7, 0x28, 0x05, 0xFE, 0x0A, 0x3F, 0x30, 0x08, 0x10,
+ 0xF1, 0x36, 0x01, 0x04, 0xFD, 0x34, 0x72, 0xFD, 0x70, 0x71,
+ 0xEF, 0x02, 0x38, 0xD9, 0xE1, 0xD9, 0xED, 0x4B, 0xAB, 0x5C,
+ 0x21, 0xA1, 0x5C, 0x78, 0xFE, 0x09, 0x38, 0x04, 0xFE, 0xFC,
+ 0x38, 0x26, 0xA7, 0xCC, 0xEF, 0x15, 0xAF, 0x90, 0xFA, 0x52,
+ 0x2F, 0x47, 0x18, 0x0C, 0x79, 0xA7, 0x28, 0x03, 0x7E, 0x23,
+ 0x0D, 0xCD, 0xEF, 0x15, 0x10, 0xF4, 0x79, 0xA7, 0xC8, 0x04,
+ 0x3E, 0x2E, 0xD7, 0x3E, 0x30, 0x10, 0xFB, 0x41, 0x18, 0xE6,
+ 0x50, 0x15, 0x06, 0x01, 0xCD, 0x4A, 0x2F, 0x3E, 0x45, 0xD7,
+ 0x4A, 0x79, 0xA7, 0xF2, 0x83, 0x2F, 0xED, 0x44, 0x4F, 0x3E,
+ 0x2D, 0x18, 0x02, 0x3E, 0x2B, 0xD7, 0x06, 0x00, 0xC3, 0x1B,
+ 0x1A, 0xD5, 0x6F, 0x26, 0x00, 0x5D, 0x54, 0x29, 0x29, 0x19,
+ 0x29, 0x59, 0x19, 0x4C, 0x7D, 0xD1, 0xC9, 0x7E, 0x36, 0x00,
+ 0xA7, 0xC8, 0x23, 0xCB, 0x7E, 0xCB, 0xFE, 0x2B, 0xC8, 0xC5,
+ 0x01, 0x05, 0x00, 0x09, 0x41, 0x4F, 0x37, 0x2B, 0x7E, 0x2F,
+ 0xCE, 0x00, 0x77, 0x10, 0xF8, 0x79, 0xC1, 0xC9, 0xE5, 0xF5,
+ 0x4E, 0x23, 0x46, 0x77, 0x23, 0x79, 0x4E, 0xC5, 0x23, 0x4E,
+ 0x23, 0x46, 0xEB, 0x57, 0x5E, 0xD5, 0x23, 0x56, 0x23, 0x5E,
+ 0xD5, 0xD9, 0xD1, 0xE1, 0xC1, 0xD9, 0x23, 0x56, 0x23, 0x5E,
+ 0xF1, 0xE1, 0xC9, 0xA7, 0xC8, 0xFE, 0x21, 0x30, 0x16, 0xC5,
+ 0x47, 0xD9, 0xCB, 0x2D, 0xCB, 0x1A, 0xCB, 0x1B, 0xD9, 0xCB,
+ 0x1A, 0xCB, 0x1B, 0x10, 0xF2, 0xC1, 0xD0, 0xCD, 0x04, 0x30,
+ 0xC0, 0xD9, 0xAF, 0x2E, 0x00, 0x57, 0x5D, 0xD9, 0x11, 0x00,
+ 0x00, 0xC9, 0x1C, 0xC0, 0x14, 0xC0, 0xD9, 0x1C, 0x20, 0x01,
+ 0x14, 0xD9, 0xC9, 0xEB, 0xCD, 0x6E, 0x34, 0xEB, 0x1A, 0xB6,
+ 0x20, 0x26, 0xD5, 0x23, 0xE5, 0x23, 0x5E, 0x23, 0x56, 0x23,
+ 0x23, 0x23, 0x7E, 0x23, 0x4E, 0x23, 0x46, 0xE1, 0xEB, 0x09,
+ 0xEB, 0x8E, 0x0F, 0xCE, 0x00, 0x20, 0x0B, 0x9F, 0x77, 0x23,
+ 0x73, 0x23, 0x72, 0x2B, 0x2B, 0x2B, 0xD1, 0xC9, 0x2B, 0xD1,
+ 0xCD, 0x93, 0x32, 0xD9, 0xE5, 0xD9, 0xD5, 0xE5, 0xCD, 0x9B,
+ 0x2F, 0x47, 0xEB, 0xCD, 0x9B, 0x2F, 0x4F, 0xB8, 0x30, 0x03,
+ 0x78, 0x41, 0xEB, 0xF5, 0x90, 0xCD, 0xBA, 0x2F, 0xCD, 0xDD,
+ 0x2F, 0xF1, 0xE1, 0x77, 0xE5, 0x68, 0x61, 0x19, 0xD9, 0xEB,
+ 0xED, 0x4A, 0xEB, 0x7C, 0x8D, 0x6F, 0x1F, 0xAD, 0xD9, 0xEB,
+ 0xE1, 0x1F, 0x30, 0x08, 0x3E, 0x01, 0xCD, 0xDD, 0x2F, 0x34,
+ 0x28, 0x23, 0xD9, 0x7D, 0xE6, 0x80, 0xD9, 0x23, 0x77, 0x2B,
+ 0x28, 0x1F, 0x7B, 0xED, 0x44, 0x3F, 0x5F, 0x7A, 0x2F, 0xCE,
+ 0x00, 0x57, 0xD9, 0x7B, 0x2F, 0xCE, 0x00, 0x5F, 0x7A, 0x2F,
+ 0xCE, 0x00, 0x30, 0x07, 0x1F, 0xD9, 0x34, 0xCA, 0xAD, 0x31,
+ 0xD9, 0x57, 0xD9, 0xAF, 0xC3, 0x55, 0x31, 0xC5, 0x06, 0x10,
+ 0x7C, 0x4D, 0x21, 0x00, 0x00, 0x29, 0x38, 0x0A, 0xCB, 0x11,
+ 0x17, 0x30, 0x03, 0x19, 0x38, 0x02, 0x10, 0xF3, 0xC1, 0xC9,
+ 0xCD, 0xE9, 0x34, 0xD8, 0x23, 0xAE, 0xCB, 0xFE, 0x2B, 0xC9,
+ 0x1A, 0xB6, 0x20, 0x22, 0xD5, 0xE5, 0xD5, 0xCD, 0x7F, 0x2D,
+ 0xEB, 0xE3, 0x41, 0xCD, 0x7F, 0x2D, 0x78, 0xA9, 0x4F, 0xE1,
+ 0xCD, 0xA9, 0x30, 0xEB, 0xE1, 0x38, 0x0A, 0x7A, 0xB3, 0x20,
+ 0x01, 0x4F, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0xD1, 0xCD, 0x93,
+ 0x32, 0xAF, 0xCD, 0xC0, 0x30, 0xD8, 0xD9, 0xE5, 0xD9, 0xD5,
+ 0xEB, 0xCD, 0xC0, 0x30, 0xEB, 0x38, 0x5A, 0xE5, 0xCD, 0xBA,
+ 0x2F, 0x78, 0xA7, 0xED, 0x62, 0xD9, 0xE5, 0xED, 0x62, 0xD9,
+ 0x06, 0x21, 0x18, 0x11, 0x30, 0x05, 0x19, 0xD9, 0xED, 0x5A,
+ 0xD9, 0xD9, 0xCB, 0x1C, 0xCB, 0x1D, 0xD9, 0xCB, 0x1C, 0xCB,
+ 0x1D, 0xD9, 0xCB, 0x18, 0xCB, 0x19, 0xD9, 0xCB, 0x19, 0x1F,
+ 0x10, 0xE4, 0xEB, 0xD9, 0xEB, 0xD9, 0xC1, 0xE1, 0x78, 0x81,
+ 0x20, 0x01, 0xA7, 0x3D, 0x3F, 0x17, 0x3F, 0x1F, 0xF2, 0x46,
+ 0x31, 0x30, 0x68, 0xA7, 0x3C, 0x20, 0x08, 0x38, 0x06, 0xD9,
+ 0xCB, 0x7A, 0xD9, 0x20, 0x5C, 0x77, 0xD9, 0x78, 0xD9, 0x30,
+ 0x15, 0x7E, 0xA7, 0x3E, 0x80, 0x28, 0x01, 0xAF, 0xD9, 0xA2,
+ 0xCD, 0xFB, 0x2F, 0x07, 0x77, 0x38, 0x2E, 0x23, 0x77, 0x2B,
+ 0x18, 0x29, 0x06, 0x20, 0xD9, 0xCB, 0x7A, 0xD9, 0x20, 0x12,
+ 0x07, 0xCB, 0x13, 0xCB, 0x12, 0xD9, 0xCB, 0x13, 0xCB, 0x12,
+ 0xD9, 0x35, 0x28, 0xD7, 0x10, 0xEA, 0x18, 0xD7, 0x17, 0x30,
+ 0x0C, 0xCD, 0x04, 0x30, 0x20, 0x07, 0xD9, 0x16, 0x80, 0xD9,
+ 0x34, 0x28, 0x18, 0xE5, 0x23, 0xD9, 0xD5, 0xD9, 0xC1, 0x78,
+ 0x17, 0xCB, 0x16, 0x1F, 0x77, 0x23, 0x71, 0x23, 0x72, 0x23,
+ 0x73, 0xE1, 0xD1, 0xD9, 0xE1, 0xD9, 0xC9, 0xCF, 0x05, 0xCD,
+ 0x93, 0x32, 0xEB, 0xAF, 0xCD, 0xC0, 0x30, 0x38, 0xF4, 0xEB,
+ 0xCD, 0xC0, 0x30, 0xD8, 0xD9, 0xE5, 0xD9, 0xD5, 0xE5, 0xCD,
+ 0xBA, 0x2F, 0xD9, 0xE5, 0x60, 0x69, 0xD9, 0x61, 0x68, 0xAF,
+ 0x06, 0xDF, 0x18, 0x10, 0x17, 0xCB, 0x11, 0xD9, 0xCB, 0x11,
+ 0xCB, 0x10, 0xD9, 0x29, 0xD9, 0xED, 0x6A, 0xD9, 0x38, 0x10,
+ 0xED, 0x52, 0xD9, 0xED, 0x52, 0xD9, 0x30, 0x0F, 0x19, 0xD9,
+ 0xED, 0x5A, 0xD9, 0xA7, 0x18, 0x08, 0xA7, 0xED, 0x52, 0xD9,
+ 0xED, 0x52, 0xD9, 0x37, 0x04, 0xFA, 0xD2, 0x31, 0xF5, 0x28,
+ 0xE1, 0x5F, 0x51, 0xD9, 0x59, 0x50, 0xF1, 0xCB, 0x18, 0xF1,
+ 0xCB, 0x18, 0xD9, 0xC1, 0xE1, 0x78, 0x91, 0xC3, 0x3D, 0x31,
+ 0x7E, 0xA7, 0xC8, 0xFE, 0x81, 0x30, 0x06, 0x36, 0x00, 0x3E,
+ 0x20, 0x18, 0x51, 0xFE, 0x91, 0x20, 0x1A, 0x23, 0x23, 0x23,
+ 0x3E, 0x80, 0xA6, 0x2B, 0xB6, 0x2B, 0x20, 0x03, 0x3E, 0x80,
+ 0xAE, 0x2B, 0x20, 0x36, 0x77, 0x23, 0x36, 0xFF, 0x2B, 0x3E,
+ 0x18, 0x18, 0x33, 0x30, 0x2C, 0xD5, 0x2F, 0xC6, 0x91, 0x23,
+ 0x56, 0x23, 0x5E, 0x2B, 0x2B, 0x0E, 0x00, 0xCB, 0x7A, 0x28,
+ 0x01, 0x0D, 0xCB, 0xFA, 0x06, 0x08, 0x90, 0x80, 0x38, 0x04,
+ 0x5A, 0x16, 0x00, 0x90, 0x28, 0x07, 0x47, 0xCB, 0x3A, 0xCB,
+ 0x1B, 0x10, 0xFA, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0x7E, 0xD6,
+ 0xA0, 0xF0, 0xED, 0x44, 0xD5, 0xEB, 0x2B, 0x47, 0xCB, 0x38,
+ 0xCB, 0x38, 0xCB, 0x38, 0x28, 0x05, 0x36, 0x00, 0x2B, 0x10,
+ 0xFB, 0xE6, 0x07, 0x28, 0x09, 0x47, 0x3E, 0xFF, 0xCB, 0x27,
+ 0x10, 0xFC, 0xA6, 0x77, 0xEB, 0xD1, 0xC9, 0xCD, 0x96, 0x32,
+ 0xEB, 0x7E, 0xA7, 0xC0, 0xD5, 0xCD, 0x7F, 0x2D, 0xAF, 0x23,
+ 0x77, 0x2B, 0x77, 0x06, 0x91, 0x7A, 0xA7, 0x20, 0x08, 0xB3,
+ 0x42, 0x28, 0x10, 0x53, 0x58, 0x06, 0x89, 0xEB, 0x05, 0x29,
+ 0x30, 0xFC, 0xCB, 0x09, 0xCB, 0x1C, 0xCB, 0x1D, 0xEB, 0x2B,
+ 0x73, 0x2B, 0x72, 0x2B, 0x70, 0xD1, 0xC9, 0x00, 0xB0, 0x00,
+ 0x40, 0xB0, 0x00, 0x01, 0x30, 0x00, 0xF1, 0x49, 0x0F, 0xDA,
+ 0xA2, 0x40, 0xB0, 0x00, 0x0A, 0x8F, 0x36, 0x3C, 0x34, 0xA1,
+ 0x33, 0x0F, 0x30, 0xCA, 0x30, 0xAF, 0x31, 0x51, 0x38, 0x1B,
+ 0x35, 0x24, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B,
+ 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x14, 0x30, 0x2D, 0x35, 0x3B,
+ 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B,
+ 0x35, 0x9C, 0x35, 0xDE, 0x35, 0xBC, 0x34, 0x45, 0x36, 0x6E,
+ 0x34, 0x69, 0x36, 0xDE, 0x35, 0x74, 0x36, 0xB5, 0x37, 0xAA,
+ 0x37, 0xDA, 0x37, 0x33, 0x38, 0x43, 0x38, 0xE2, 0x37, 0x13,
+ 0x37, 0xC4, 0x36, 0xAF, 0x36, 0x4A, 0x38, 0x92, 0x34, 0x6A,
+ 0x34, 0xAC, 0x34, 0xA5, 0x34, 0xB3, 0x34, 0x1F, 0x36, 0xC9,
+ 0x35, 0x01, 0x35, 0xC0, 0x33, 0xA0, 0x36, 0x86, 0x36, 0xC6,
+ 0x33, 0x7A, 0x36, 0x06, 0x35, 0xF9, 0x34, 0x9B, 0x36, 0x83,
+ 0x37, 0x14, 0x32, 0xA2, 0x33, 0x4F, 0x2D, 0x97, 0x32, 0x49,
+ 0x34, 0x1B, 0x34, 0x2D, 0x34, 0x0F, 0x34, 0xCD, 0xBF, 0x35,
+ 0x78, 0x32, 0x67, 0x5C, 0xD9, 0xE3, 0xD9, 0xED, 0x53, 0x65,
+ 0x5C, 0xD9, 0x7E, 0x23, 0xE5, 0xA7, 0xF2, 0x80, 0x33, 0x57,
+ 0xE6, 0x60, 0x0F, 0x0F, 0x0F, 0x0F, 0xC6, 0x7C, 0x6F, 0x7A,
+ 0xE6, 0x1F, 0x18, 0x0E, 0xFE, 0x18, 0x30, 0x08, 0xD9, 0x01,
+ 0xFB, 0xFF, 0x54, 0x5D, 0x09, 0xD9, 0x07, 0x6F, 0x11, 0xD7,
+ 0x32, 0x26, 0x00, 0x19, 0x5E, 0x23, 0x56, 0x21, 0x65, 0x33,
+ 0xE3, 0xD5, 0xD9, 0xED, 0x4B, 0x66, 0x5C, 0xC9, 0xF1, 0x3A,
+ 0x67, 0x5C, 0xD9, 0x18, 0xC3, 0xD5, 0xE5, 0x01, 0x05, 0x00,
+ 0xCD, 0x05, 0x1F, 0xE1, 0xD1, 0xC9, 0xED, 0x5B, 0x65, 0x5C,
+ 0xCD, 0xC0, 0x33, 0xED, 0x53, 0x65, 0x5C, 0xC9, 0xCD, 0xA9,
+ 0x33, 0xED, 0xB0, 0xC9, 0x62, 0x6B, 0xCD, 0xA9, 0x33, 0xD9,
+ 0xE5, 0xD9, 0xE3, 0xC5, 0x7E, 0xE6, 0xC0, 0x07, 0x07, 0x4F,
+ 0x0C, 0x7E, 0xE6, 0x3F, 0x20, 0x02, 0x23, 0x7E, 0xC6, 0x50,
+ 0x12, 0x3E, 0x05, 0x91, 0x23, 0x13, 0x06, 0x00, 0xED, 0xB0,
+ 0xC1, 0xE3, 0xD9, 0xE1, 0xD9, 0x47, 0xAF, 0x05, 0xC8, 0x12,
+ 0x13, 0x18, 0xFA, 0xA7, 0xC8, 0xF5, 0xD5, 0x11, 0x00, 0x00,
+ 0xCD, 0xC8, 0x33, 0xD1, 0xF1, 0x3D, 0x18, 0xF2, 0x4F, 0x07,
+ 0x07, 0x81, 0x4F, 0x06, 0x00, 0x09, 0xC9, 0xD5, 0x2A, 0x68,
+ 0x5C, 0xCD, 0x06, 0x34, 0xCD, 0xC0, 0x33, 0xE1, 0xC9, 0x62,
+ 0x6B, 0xD9, 0xE5, 0x21, 0xC5, 0x32, 0xD9, 0xCD, 0xF7, 0x33,
+ 0xCD, 0xC8, 0x33, 0xD9, 0xE1, 0xD9, 0xC9, 0xE5, 0xEB, 0x2A,
+ 0x68, 0x5C, 0xCD, 0x06, 0x34, 0xEB, 0xCD, 0xC0, 0x33, 0xEB,
+ 0xE1, 0xC9, 0x06, 0x05, 0x1A, 0x4E, 0xEB, 0x12, 0x71, 0x23,
+ 0x13, 0x10, 0xF7, 0xEB, 0xC9, 0x47, 0xCD, 0x5E, 0x33, 0x31,
+ 0x0F, 0xC0, 0x02, 0xA0, 0xC2, 0x31, 0xE0, 0x04, 0xE2, 0xC1,
+ 0x03, 0x38, 0xCD, 0xC6, 0x33, 0xCD, 0x62, 0x33, 0x0F, 0x01,
+ 0xC2, 0x02, 0x35, 0xEE, 0xE1, 0x03, 0x38, 0xC9, 0x06, 0xFF,
+ 0x18, 0x06, 0xCD, 0xE9, 0x34, 0xD8, 0x06, 0x00, 0x7E, 0xA7,
+ 0x28, 0x0B, 0x23, 0x78, 0xE6, 0x80, 0xB6, 0x17, 0x3F, 0x1F,
+ 0x77, 0x2B, 0xC9, 0xD5, 0xE5, 0xCD, 0x7F, 0x2D, 0xE1, 0x78,
+ 0xB1, 0x2F, 0x4F, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0xCD, 0xE9,
+ 0x34, 0xD8, 0xD5, 0x11, 0x01, 0x00, 0x23, 0xCB, 0x16, 0x2B,
+ 0x9F, 0x4F, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0xCD, 0x99, 0x1E,
+ 0xED, 0x78, 0x18, 0x04, 0xCD, 0x99, 0x1E, 0x0A, 0xC3, 0x28,
+ 0x2D, 0xCD, 0x99, 0x1E, 0x21, 0x2B, 0x2D, 0xE5, 0xC5, 0xC9,
+ 0xCD, 0xF1, 0x2B, 0x0B, 0x78, 0xB1, 0x20, 0x23, 0x1A, 0xCD,
+ 0x8D, 0x2C, 0x38, 0x09, 0xD6, 0x90, 0x38, 0x19, 0xFE, 0x15,
+ 0x30, 0x15, 0x3C, 0x3D, 0x87, 0x87, 0x87, 0xFE, 0xA8, 0x30,
+ 0x0C, 0xED, 0x4B, 0x7B, 0x5C, 0x81, 0x4F, 0x30, 0x01, 0x04,
+ 0xC3, 0x2B, 0x2D, 0xCF, 0x09, 0xE5, 0xC5, 0x47, 0x7E, 0x23,
+ 0xB6, 0x23, 0xB6, 0x23, 0xB6, 0x78, 0xC1, 0xE1, 0xC0, 0x37,
+ 0xC9, 0xCD, 0xE9, 0x34, 0xD8, 0x3E, 0xFF, 0x18, 0x06, 0xCD,
+ 0xE9, 0x34, 0x18, 0x05, 0xAF, 0x23, 0xAE, 0x2B, 0x07, 0xE5,
+ 0x3E, 0x00, 0x77, 0x23, 0x77, 0x23, 0x17, 0x77, 0x1F, 0x23,
+ 0x77, 0x23, 0x77, 0xE1, 0xC9, 0xEB, 0xCD, 0xE9, 0x34, 0xEB,
+ 0xD8, 0x37, 0x18, 0xE7, 0xEB, 0xCD, 0xE9, 0x34, 0xEB, 0xD0,
+ 0xA7, 0x18, 0xDE, 0xEB, 0xCD, 0xE9, 0x34, 0xEB, 0xD0, 0xD5,
+ 0x1B, 0xAF, 0x12, 0x1B, 0x12, 0xD1, 0xC9, 0x78, 0xD6, 0x08,
+ 0xCB, 0x57, 0x20, 0x01, 0x3D, 0x0F, 0x30, 0x08, 0xF5, 0xE5,
+ 0xCD, 0x3C, 0x34, 0xD1, 0xEB, 0xF1, 0xCB, 0x57, 0x20, 0x07,
+ 0x0F, 0xF5, 0xCD, 0x0F, 0x30, 0x18, 0x33, 0x0F, 0xF5, 0xCD,
+ 0xF1, 0x2B, 0xD5, 0xC5, 0xCD, 0xF1, 0x2B, 0xE1, 0x7C, 0xB5,
+ 0xE3, 0x78, 0x20, 0x0B, 0xB1, 0xC1, 0x28, 0x04, 0xF1, 0x3F,
+ 0x18, 0x16, 0xF1, 0x18, 0x13, 0xB1, 0x28, 0x0D, 0x1A, 0x96,
+ 0x38, 0x09, 0x20, 0xED, 0x0B, 0x13, 0x23, 0xE3, 0x2B, 0x18,
+ 0xDF, 0xC1, 0xF1, 0xA7, 0xF5, 0xEF, 0xA0, 0x38, 0xF1, 0xF5,
+ 0xDC, 0x01, 0x35, 0xF1, 0xF5, 0xD4, 0xF9, 0x34, 0xF1, 0x0F,
+ 0xD4, 0x01, 0x35, 0xC9, 0xCD, 0xF1, 0x2B, 0xD5, 0xC5, 0xCD,
+ 0xF1, 0x2B, 0xE1, 0xE5, 0xD5, 0xC5, 0x09, 0x44, 0x4D, 0xF7,
+ 0xCD, 0xB2, 0x2A, 0xC1, 0xE1, 0x78, 0xB1, 0x28, 0x02, 0xED,
+ 0xB0, 0xC1, 0xE1, 0x78, 0xB1, 0x28, 0x02, 0xED, 0xB0, 0x2A,
+ 0x65, 0x5C, 0x11, 0xFB, 0xFF, 0xE5, 0x19, 0xD1, 0xC9, 0xCD,
+ 0xD5, 0x2D, 0x38, 0x0E, 0x20, 0x0C, 0xF5, 0x01, 0x01, 0x00,
+ 0xF7, 0xF1, 0x12, 0xCD, 0xB2, 0x2A, 0xEB, 0xC9, 0xCF, 0x0A,
+ 0x2A, 0x5D, 0x5C, 0xE5, 0x78, 0xC6, 0xE3, 0x9F, 0xF5, 0xCD,
+ 0xF1, 0x2B, 0xD5, 0x03, 0xF7, 0xE1, 0xED, 0x53, 0x5D, 0x5C,
+ 0xD5, 0xED, 0xB0, 0xEB, 0x2B, 0x36, 0x0D, 0xFD, 0xCB, 0x01,
+ 0xBE, 0xCD, 0xFB, 0x24, 0xDF, 0xFE, 0x0D, 0x20, 0x07, 0xE1,
+ 0xF1, 0xFD, 0xAE, 0x01, 0xE6, 0x40, 0xC2, 0x8A, 0x1C, 0x22,
+ 0x5D, 0x5C, 0xFD, 0xCB, 0x01, 0xFE, 0xCD, 0xFB, 0x24, 0xE1,
+ 0x22, 0x5D, 0x5C, 0x18, 0xA0, 0x01, 0x01, 0x00, 0xF7, 0x22,
+ 0x5B, 0x5C, 0xE5, 0x2A, 0x51, 0x5C, 0xE5, 0x3E, 0xFF, 0xCD,
+ 0x01, 0x16, 0xCD, 0xE3, 0x2D, 0xE1, 0xCD, 0x15, 0x16, 0xD1,
+ 0x2A, 0x5B, 0x5C, 0xA7, 0xED, 0x52, 0x44, 0x4D, 0xCD, 0xB2,
+ 0x2A, 0xEB, 0xC9, 0xCD, 0x94, 0x1E, 0xFE, 0x10, 0xD2, 0x9F,
+ 0x1E, 0x2A, 0x51, 0x5C, 0xE5, 0xCD, 0x01, 0x16, 0xCD, 0xE6,
+ 0x15, 0x01, 0x00, 0x00, 0x30, 0x03, 0x0C, 0xF7, 0x12, 0xCD,
+ 0xB2, 0x2A, 0xE1, 0xCD, 0x15, 0x16, 0xC3, 0xBF, 0x35, 0xCD,
+ 0xF1, 0x2B, 0x78, 0xB1, 0x28, 0x01, 0x1A, 0xC3, 0x28, 0x2D,
+ 0xCD, 0xF1, 0x2B, 0xC3, 0x2B, 0x2D, 0xD9, 0xE5, 0x21, 0x67,
+ 0x5C, 0x35, 0xE1, 0x20, 0x04, 0x23, 0xD9, 0xC9, 0xD9, 0x5E,
+ 0x7B, 0x17, 0x9F, 0x57, 0x19, 0xD9, 0xC9, 0x13, 0x13, 0x1A,
+ 0x1B, 0x1B, 0xA7, 0x20, 0xEF, 0xD9, 0x23, 0xD9, 0xC9, 0xF1,
+ 0xD9, 0xE3, 0xD9, 0xC9, 0xEF, 0xC0, 0x02, 0x31, 0xE0, 0x05,
+ 0x27, 0xE0, 0x01, 0xC0, 0x04, 0x03, 0xE0, 0x38, 0xC9, 0xEF,
+ 0x31, 0x36, 0x00, 0x04, 0x3A, 0x38, 0xC9, 0x31, 0x3A, 0xC0,
+ 0x03, 0xE0, 0x01, 0x30, 0x00, 0x03, 0xA1, 0x03, 0x38, 0xC9,
+ 0xEF, 0x3D, 0x34, 0xF1, 0x38, 0xAA, 0x3B, 0x29, 0x04, 0x31,
+ 0x27, 0xC3, 0x03, 0x31, 0x0F, 0xA1, 0x03, 0x88, 0x13, 0x36,
+ 0x58, 0x65, 0x66, 0x9D, 0x78, 0x65, 0x40, 0xA2, 0x60, 0x32,
+ 0xC9, 0xE7, 0x21, 0xF7, 0xAF, 0x24, 0xEB, 0x2F, 0xB0, 0xB0,
+ 0x14, 0xEE, 0x7E, 0xBB, 0x94, 0x58, 0xF1, 0x3A, 0x7E, 0xF8,
+ 0xCF, 0xE3, 0x38, 0xCD, 0xD5, 0x2D, 0x20, 0x07, 0x38, 0x03,
+ 0x86, 0x30, 0x09, 0xCF, 0x05, 0x38, 0x07, 0x96, 0x30, 0x04,
+ 0xED, 0x44, 0x77, 0xC9, 0xEF, 0x02, 0xA0, 0x38, 0xC9, 0xEF,
+ 0x3D, 0x31, 0x37, 0x00, 0x04, 0x38, 0xCF, 0x09, 0xA0, 0x02,
+ 0x38, 0x7E, 0x36, 0x80, 0xCD, 0x28, 0x2D, 0xEF, 0x34, 0x38,
+ 0x00, 0x03, 0x01, 0x31, 0x34, 0xF0, 0x4C, 0xCC, 0xCC, 0xCD,
+ 0x03, 0x37, 0x00, 0x08, 0x01, 0xA1, 0x03, 0x01, 0x38, 0x34,
+ 0xEF, 0x01, 0x34, 0xF0, 0x31, 0x72, 0x17, 0xF8, 0x04, 0x01,
+ 0xA2, 0x03, 0xA2, 0x03, 0x31, 0x34, 0x32, 0x20, 0x04, 0xA2,
+ 0x03, 0x8C, 0x11, 0xAC, 0x14, 0x09, 0x56, 0xDA, 0xA5, 0x59,
+ 0x30, 0xC5, 0x5C, 0x90, 0xAA, 0x9E, 0x70, 0x6F, 0x61, 0xA1,
+ 0xCB, 0xDA, 0x96, 0xA4, 0x31, 0x9F, 0xB4, 0xE7, 0xA0, 0xFE,
+ 0x5C, 0xFC, 0xEA, 0x1B, 0x43, 0xCA, 0x36, 0xED, 0xA7, 0x9C,
+ 0x7E, 0x5E, 0xF0, 0x6E, 0x23, 0x80, 0x93, 0x04, 0x0F, 0x38,
+ 0xC9, 0xEF, 0x3D, 0x34, 0xEE, 0x22, 0xF9, 0x83, 0x6E, 0x04,
+ 0x31, 0xA2, 0x0F, 0x27, 0x03, 0x31, 0x0F, 0x31, 0x0F, 0x31,
+ 0x2A, 0xA1, 0x03, 0x31, 0x37, 0xC0, 0x00, 0x04, 0x02, 0x38,
+ 0xC9, 0xA1, 0x03, 0x01, 0x36, 0x00, 0x02, 0x1B, 0x38, 0xC9,
+ 0xEF, 0x39, 0x2A, 0xA1, 0x03, 0xE0, 0x00, 0x06, 0x1B, 0x33,
+ 0x03, 0xEF, 0x39, 0x31, 0x31, 0x04, 0x31, 0x0F, 0xA1, 0x03,
+ 0x86, 0x14, 0xE6, 0x5C, 0x1F, 0x0B, 0xA3, 0x8F, 0x38, 0xEE,
+ 0xE9, 0x15, 0x63, 0xBB, 0x23, 0xEE, 0x92, 0x0D, 0xCD, 0xED,
+ 0xF1, 0x23, 0x5D, 0x1B, 0xEA, 0x04, 0x38, 0xC9, 0xEF, 0x31,
+ 0x1F, 0x01, 0x20, 0x05, 0x38, 0xC9, 0xCD, 0x97, 0x32, 0x7E,
+ 0xFE, 0x81, 0x38, 0x0E, 0xEF, 0xA1, 0x1B, 0x01, 0x05, 0x31,
+ 0x36, 0xA3, 0x01, 0x00, 0x06, 0x1B, 0x33, 0x03, 0xEF, 0xA0,
+ 0x01, 0x31, 0x31, 0x04, 0x31, 0x0F, 0xA1, 0x03, 0x8C, 0x10,
+ 0xB2, 0x13, 0x0E, 0x55, 0xE4, 0x8D, 0x58, 0x39, 0xBC, 0x5B,
+ 0x98, 0xFD, 0x9E, 0x00, 0x36, 0x75, 0xA0, 0xDB, 0xE8, 0xB4,
+ 0x63, 0x42, 0xC4, 0xE6, 0xB5, 0x09, 0x36, 0xBE, 0xE9, 0x36,
+ 0x73, 0x1B, 0x5D, 0xEC, 0xD8, 0xDE, 0x63, 0xBE, 0xF0, 0x61,
+ 0xA1, 0xB3, 0x0C, 0x04, 0x0F, 0x38, 0xC9, 0xEF, 0x31, 0x31,
+ 0x04, 0xA1, 0x03, 0x1B, 0x28, 0xA1, 0x0F, 0x05, 0x24, 0x31,
+ 0x0F, 0x38, 0xC9, 0xEF, 0x22, 0xA3, 0x03, 0x1B, 0x38, 0xC9,
+ 0xEF, 0x31, 0x30, 0x00, 0x1E, 0xA2, 0x38, 0xEF, 0x01, 0x31,
+ 0x30, 0x00, 0x07, 0x25, 0x04, 0x38, 0xC3, 0xC4, 0x36, 0x02,
+ 0x31, 0x30, 0x00, 0x09, 0xA0, 0x01, 0x37, 0x00, 0x06, 0xA1,
+ 0x01, 0x05, 0x02, 0xA1, 0x38, 0xC9, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x24, 0x7E, 0x24, 0x24, 0x7E, 0x24, 0x00, 0x00, 0x08,
+ 0x3E, 0x28, 0x3E, 0x0A, 0x3E, 0x08, 0x00, 0x62, 0x64, 0x08,
+ 0x10, 0x26, 0x46, 0x00, 0x00, 0x10, 0x28, 0x10, 0x2A, 0x44,
+ 0x3A, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x00, 0x00, 0x20,
+ 0x10, 0x10, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x14, 0x08,
+ 0x3E, 0x08, 0x14, 0x00, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x08,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x02, 0x04,
+ 0x08, 0x10, 0x20, 0x00, 0x00, 0x3C, 0x46, 0x4A, 0x52, 0x62,
+ 0x3C, 0x00, 0x00, 0x18, 0x28, 0x08, 0x08, 0x08, 0x3E, 0x00,
+ 0x00, 0x3C, 0x42, 0x02, 0x3C, 0x40, 0x7E, 0x00, 0x00, 0x3C,
+ 0x42, 0x0C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x08, 0x18, 0x28,
+ 0x48, 0x7E, 0x08, 0x00, 0x00, 0x7E, 0x40, 0x7C, 0x02, 0x42,
+ 0x3C, 0x00, 0x00, 0x3C, 0x40, 0x7C, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x00, 0x3C,
+ 0x42, 0x3C, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x3C, 0x42, 0x42,
+ 0x3E, 0x02, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x20,
+ 0x00, 0x00, 0x04, 0x08, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08,
+ 0x04, 0x08, 0x10, 0x00, 0x00, 0x3C, 0x42, 0x04, 0x08, 0x00,
+ 0x08, 0x00, 0x00, 0x3C, 0x4A, 0x56, 0x5E, 0x40, 0x3C, 0x00,
+ 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x00, 0x00, 0x7C,
+ 0x42, 0x7C, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x3C, 0x42, 0x40,
+ 0x40, 0x42, 0x3C, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x44,
+ 0x78, 0x00, 0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x7E, 0x00,
+ 0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x00, 0x3C,
+ 0x42, 0x40, 0x4E, 0x42, 0x3C, 0x00, 0x00, 0x42, 0x42, 0x7E,
+ 0x42, 0x42, 0x42, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08,
+ 0x3E, 0x00, 0x00, 0x02, 0x02, 0x02, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x40,
+ 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x42, 0x66, 0x5A,
+ 0x42, 0x42, 0x42, 0x00, 0x00, 0x42, 0x62, 0x52, 0x4A, 0x46,
+ 0x42, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x00, 0x00, 0x3C,
+ 0x42, 0x42, 0x52, 0x4A, 0x3C, 0x00, 0x00, 0x7C, 0x42, 0x42,
+ 0x7C, 0x44, 0x42, 0x00, 0x00, 0x3C, 0x40, 0x3C, 0x02, 0x42,
+ 0x3C, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
+ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x42,
+ 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00, 0x42, 0x42, 0x42,
+ 0x42, 0x5A, 0x24, 0x00, 0x00, 0x42, 0x24, 0x18, 0x18, 0x24,
+ 0x42, 0x00, 0x00, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x00,
+ 0x00, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x0E,
+ 0x08, 0x08, 0x08, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20,
+ 0x10, 0x08, 0x04, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10,
+ 0x70, 0x00, 0x00, 0x10, 0x38, 0x54, 0x10, 0x10, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x1C,
+ 0x22, 0x78, 0x20, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x38, 0x04,
+ 0x3C, 0x44, 0x3C, 0x00, 0x00, 0x20, 0x20, 0x3C, 0x22, 0x22,
+ 0x3C, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x00,
+ 0x00, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3C, 0x00, 0x00, 0x00,
+ 0x38, 0x44, 0x78, 0x40, 0x3C, 0x00, 0x00, 0x0C, 0x10, 0x18,
+ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C,
+ 0x04, 0x38, 0x00, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x00,
+ 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00, 0x00, 0x04,
+ 0x00, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00, 0x20, 0x28, 0x30,
+ 0x30, 0x28, 0x24, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10,
+ 0x0C, 0x00, 0x00, 0x00, 0x68, 0x54, 0x54, 0x54, 0x54, 0x00,
+ 0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x78, 0x44,
+ 0x44, 0x78, 0x40, 0x40, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C,
+ 0x04, 0x06, 0x00, 0x00, 0x1C, 0x20, 0x20, 0x20, 0x20, 0x00,
+ 0x00, 0x00, 0x38, 0x40, 0x38, 0x04, 0x78, 0x00, 0x00, 0x10,
+ 0x38, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x44,
+ 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28,
+ 0x10, 0x00, 0x00, 0x00, 0x44, 0x54, 0x54, 0x54, 0x28, 0x00,
+ 0x00, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x3C, 0x04, 0x38, 0x00, 0x00, 0x7C, 0x08,
+ 0x10, 0x20, 0x7C, 0x00, 0x00, 0x0E, 0x08, 0x30, 0x08, 0x08,
+ 0x0E, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x70, 0x10, 0x0C, 0x10, 0x10, 0x70, 0x00, 0x00, 0x14,
+ 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA1,
+ 0xA1, 0x99, 0x42, 0x3C
+};
+
+const unsigned long rom_imag_size = 16384;
+
+/* End of rom_imag.c */
diff --git a/apps/plugins/zxbox/snapshot.c b/apps/plugins/zxbox/snapshot.c
new file mode 100644
index 0000000000..e1a3552382
--- /dev/null
+++ b/apps/plugins/zxbox/snapshot.c
@@ -0,0 +1,727 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "misc.h"
+#include "helpers.h"
+#include "spperif.h"
+#include "z80.h"
+
+#include "snapshot.h"
+#include "compr.h"
+#include "interf.h"
+
+#include "spconf.h"
+
+#include "interf.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+/*#include <errno.h>*/
+/*#include "string.h"*/
+#include <sys/types.h>
+
+#define COMPRESS_SAVE 1
+
+static char quick_snap_file[MAXFILENAME];
+static int qsnap_created = 0;
+typedef struct {
+ int isfile;
+ /*FILE *fp;*/
+ int fd;
+
+ unsigned len;
+ byte *at;
+} SNFILE;
+
+
+#define sngetc(snfp) ((snfp)->isfile ? getc((snfp)->fd) : snmgetc(snfp))
+
+static int snmgetc(SNFILE *snfp)
+{
+ if(!snfp->len) return EOF;
+ snfp->len--;
+ return *snfp->at++;
+}
+
+static int snread(void *ptr, int size, SNFILE *snfp)
+{
+ int i;
+ byte *dest;
+
+ if(snfp->isfile) /*return (int) fread(ptr, 1, (size_t) size, snfp->fp);*/
+ return (int) rb->read( snfp->fd,ptr, (size_t) size);
+
+ dest = (byte *) ptr;
+ for(i = 0; snfp->len && size; i++, snfp->len--, size--)
+ *dest++ = *snfp->at++;
+
+ return i;
+}
+
+
+
+/* These structures are taken from 'spconv' by Henk de Groot */
+
+struct sna_s {
+ byte i;
+ byte lbk;
+ byte hbk;
+ byte ebk;
+ byte dbk;
+ byte cbk;
+ byte bbk;
+ byte fbk;
+ byte abk;
+ byte l;
+ byte h;
+ byte e;
+ byte d;
+ byte c;
+ byte b;
+ byte iyl;
+ byte iyh;
+ byte ixl;
+ byte ixh;
+ byte iff2;
+ byte r;
+ byte f;
+ byte a;
+ byte spl;
+ byte sph;
+ byte im;
+ byte border;
+};
+
+#define sna_size 27 /* sizeof(struct sna_s)=27 */
+
+
+struct z80_1_s {
+ byte a; /*00*/
+ byte f; /*01*/
+ byte c; /*02*/
+ byte b; /*03*/
+ byte l; /*04*/
+ byte h; /*05*/
+ byte pcl; /*06*/
+ byte pch; /*07*/
+ byte spl; /*08*/
+ byte sph; /*09*/
+ byte i; /*0A*/
+ byte r; /*0B*/
+ byte data; /*0C*/
+ byte e; /*0D*/
+ byte d; /*0E*/
+ byte cbk; /*0F*/
+ byte bbk; /*10*/
+ byte ebk; /*11*/
+ byte dbk; /*12*/
+ byte lbk; /*13*/
+ byte hbk; /*14*/
+ byte abk; /*15*/
+ byte fbk; /*16*/
+ byte iyl; /*17*/
+ byte iyh; /*18*/
+ byte ixl; /*19*/
+ byte ixh; /*1A*/
+ byte iff1; /*1B*/
+ byte iff2; /*1C*/
+ byte im; /*1D*/
+};
+
+#define z80_145_size 0x1e /* length of z80 V1.45 header */
+
+
+struct z80_2_s {
+/* Extended 2.01 and 3.0 header, flagged with PC=0 */
+ byte h2_len_l; /*1E*/
+ byte h2_len_h; /*1F*/
+ byte n_pcl; /*20*/
+ byte n_pch; /*21*/
+ byte hardware; /*22*/
+ byte samram; /*23*/
+ byte if1_paged; /*24*/
+ byte r_ldir_emu; /*25*/
+ byte last_out; /*26*/
+ byte sound_reg[16]; /*27*/
+
+/* Continues with extended 3.0 header, but this part is not used anyway */
+};
+
+#define z80_201_ext_size 23 /* length of extended z80 V2.01 header */
+#define z80_300_ext_size 54 /* length of extended z80 V3.0 header */
+
+
+struct z80_page_s {
+ byte blklen_l; /*00*/
+ byte blklen_h; /*01*/
+ byte page_num; /*02*/
+};
+
+#define z80_pg_size 3 /* sizeof(struct z80_page_s)=3 */
+
+
+/*static FILE *savfp;*/
+static int savfd;
+static int memptr;
+
+int compr_read_byte(void)
+{
+ if(memptr < 0x10000) return z80_proc.mem[memptr++];
+ else return -1;
+}
+
+void compr_put_byte(int i)
+{
+ putc(i, savfd);
+}
+
+
+#define STORE_NORMAL_REGS(head) \
+ head.f = RF; /* F reg */ \
+ head.a = RA; /* A reg */ \
+ head.b = RB; /* B reg */ \
+ head.c = RC; /* C reg */ \
+ head.d = RD; /* D reg */ \
+ head.e = RE; /* E reg */ \
+ head.h = RH; /* H reg */ \
+ head.l = RL; /* L reg */ \
+ head.fbk = FBK; /* F' reg */ \
+ head.abk = ABK; /* A' reg */ \
+ head.bbk = BBK; /* B' reg */ \
+ head.cbk = CBK; /* C' reg */ \
+ head.dbk = DBK; /* D' reg */ \
+ head.ebk = EBK; /* E' reg */ \
+ head.hbk = HBK; /* H' reg */ \
+ head.lbk = LBK; /* L' reg */ \
+ head.iyh = YH; /* IY reg */ \
+ head.iyl = YL; \
+ head.ixh = XH; /* IX reg */ \
+ head.ixl = XL
+
+
+#define LOAD_NORMAL_REGS(head) \
+ RF = head.f; /* F reg */ \
+ RA = head.a; /* A reg */ \
+ RB = head.b; /* B reg */ \
+ RC = head.c; /* C reg */ \
+ RD = head.d; /* D reg */ \
+ RE = head.e; /* E reg */ \
+ RH = head.h; /* H reg */ \
+ RL = head.l; /* L reg */ \
+ FBK = head.fbk; /* F' reg */ \
+ ABK = head.abk; /* A' reg */ \
+ BBK = head.bbk; /* B' reg */ \
+ CBK = head.cbk; /* C' reg */ \
+ DBK = head.dbk; /* D' reg */ \
+ EBK = head.ebk; /* E' reg */ \
+ HBK = head.hbk; /* H' reg */ \
+ LBK = head.lbk; /* L' reg */ \
+ YH = head.iyh; /* IY reg */ \
+ YL = head.iyl; \
+ XH = head.ixh; /* IX reg */ \
+ XL = head.ixl
+
+
+static void snsh_z80_save(int fd)
+{
+ struct z80_1_s z80;
+
+ int to_comp = COMPRESS_SAVE;
+
+ STORE_NORMAL_REGS(z80);
+
+ z80.i = RI; /* I reg */
+ z80.r = RR; /* R reg */
+
+ z80.sph = SPH; /* SP reg */
+ z80.spl = SPL;
+ z80.pch = PCH; /* PC reg */
+ z80.pcl = PCL;
+
+ z80.iff1 = z80_proc.iff1; /* iff1 */
+ z80.iff2 = z80_proc.iff2; /* iff2 */
+
+ z80.im = (z80_proc.it_mode & 0x03) | 0x60;
+/*
+ Bit 0-1: Interrupt mode (0, 1 or 2)
+ Bit 2 : 1=Issue 2 emulation
+ Bit 3 : 1=Double interrupt frequency
+ Bit 4-5: 1=High video synchronisation
+ 3=Low video synchronisation
+ 0,2=Normal
+ Bit 6-7: 0=Cursor/Protek/AGF joystick
+ 1=Kempston joystick
+ 2=Sinclair 1 joystick
+ 3=Sinclair 2 joystick
+*/
+
+ z80.data = ((RR >> 7) & 0x01) |
+ ((z80_proc.ula_outport & 0x07) << 1) |
+ (to_comp ? 0x20 : 0);
+/*
+ Bit 0 : Bit 7 of the R-register
+ Bit 1-3: Border colour
+ Bit 4 : 1=Basic SamRom switched in
+ Bit 5 : 1=Block of data is compressed
+ Bit 6-7: No meaning
+*/
+
+
+ /*fwrite(&z80, z80_145_size, 1, fp);*/
+ rb->write(fd,&z80,z80_145_size);
+
+ if(!to_comp)
+ /*fwrite(z80_proc.mem + 0x4000, 0xC000, 1, fp);*/
+ rb->write(fd,z80_proc.mem + 0x4000,0xC000);
+ else {
+ memptr = 0x4000;
+ savfd = fd;
+ compr();
+ }
+}
+
+
+
+static void snsh_sna_save(int fd)
+{
+ struct sna_s sna;
+ byte saves1, saves2;
+
+ STORE_NORMAL_REGS(sna);
+
+ sna.i = RI; /* I reg */
+ sna.r = RR; /* R reg */
+
+ sna.border = z80_proc.ula_outport & 0x07;
+
+ SP -= 2;
+
+ sna.sph = SPH; /* SP reg */
+ sna.spl = SPL;
+
+ saves1 = z80_proc.mem[SP];
+ saves2 = z80_proc.mem[(dbyte)(SP+1)];
+ if(SP >= 0x4000) {
+ z80_proc.mem[SP] = PCL;
+ if(SP < 0xFFFF) z80_proc.mem[SP+1] = PCH;
+ }
+
+ sna.iff2 = z80_proc.iff2 ? 0xff : 0x00; /* iff2 */
+
+ sna.im = z80_proc.it_mode & 0x03;
+
+ /*fwrite(&sna, sna_size, 1, fp);
+ fwrite(z80_proc.mem + 0x4000, 0xC000, 1, fp);*/
+ rb->write(fd,&sna, sna_size);
+ rb->write(fd,z80_proc.mem + 0x4000, 0xC000);
+
+ if(SP > 0x4000) {
+ z80_proc.mem[SP] = saves1;
+ if(SP < 0xFFFF) z80_proc.mem[SP+1] = saves2;
+ }
+
+ SP += 2;
+}
+
+#define GET_DATA(c) { \
+ if(!datalen) break; \
+ c = sngetc(fp); \
+ if(c == EOF) break; \
+ if(datalen > 0) datalen--; \
+}
+
+
+static void read_compressed_data(SNFILE *fp, byte *start, unsigned size,
+ long datalen)
+{
+ int j;
+ int times, last_ed, ch;
+ byte *p, *end;
+
+ p = start;
+ end = start+size;
+ last_ed = 0;
+ while(p < end) {
+ GET_DATA(ch);
+ if(ch != 0xED) {
+ last_ed = 0;
+ *p++ = ch;
+ }
+ else {
+ if(last_ed) {
+ last_ed = 0;
+ p--;
+ GET_DATA(times);
+ if(times == 0) break;
+
+ GET_DATA(ch);
+ if(p + times > end) {
+ put_msg("Warning: Repeat parameter too large in snapshot");
+ times = (int) ((long) end - (long) p);
+ }
+ for(j = 0; j < times; j++) *p++ = ch;
+ }
+ else {
+ last_ed = 1;
+ *p++ = 0xED;
+ }
+ }
+ }
+
+ if(datalen < 0) {
+ if(sngetc(fp) != 0 || sngetc(fp) != 0xED ||
+ sngetc(fp) != 0xED || sngetc(fp) != 0)
+ put_msg("Warning: Illegal ending of snapshot");
+ }
+
+ if(datalen > 0) {
+ while(datalen) {
+ if(sngetc(fp) == EOF) break;
+ datalen--;
+ }
+ put_msg("Warning: Page too long in snapshot");
+ }
+
+ if(p < end) put_msg("Warning: Page too short in snapshot");
+}
+
+static int read_header(void *p, int size, SNFILE *fp)
+{
+ int res;
+
+ res = snread(p, size, fp);
+ if(res != size) {
+ put_msg("Error, End Of File in snapshot header");
+ return 0;
+ }
+ return 1;
+}
+
+static int read_z80_page(SNFILE *fp)
+{
+ struct z80_page_s page;
+ unsigned datalen;
+ unsigned pos = 0;
+ int validpage;
+
+ int res;
+
+ res = snread(&page, z80_pg_size, fp);
+ if(res == 0) return 0;
+ if(res != z80_pg_size) {
+ put_msg("Error, End Of File in page header");
+ return 0;
+ }
+
+ datalen = (page.blklen_h << 8) | page.blklen_l;
+
+ validpage = 1;
+ switch(page.page_num) {
+ case 4:
+ pos = 0x8000;
+ break;
+
+ case 5:
+ pos = 0xC000;
+ break;
+
+ case 8:
+ pos = 0x4000;
+ break;
+
+ default:
+ validpage = 0;
+ while(datalen) {
+ if(sngetc(fp) == EOF) {
+ put_msg("Warning: Page too short in snapshot");
+ break;
+ }
+ datalen--;
+ }
+ }
+
+ if(validpage) read_compressed_data(fp, z80_proc.mem+pos, 0x4000,
+ (long) datalen);
+ return 1;
+}
+
+
+static void snsh_z80_load(SNFILE *fp)
+{
+ struct z80_1_s z80;
+
+ if(!read_header(&z80, z80_145_size, fp)) return;
+ if(z80.pch == 0 && z80.pcl == 0) {
+ struct z80_2_s z80_2;
+ int ext_size, rem;
+ if(!read_header(&z80_2, 2, fp)) return;
+ ext_size = z80_2.h2_len_l | (z80_2.h2_len_h << 8);
+ if(ext_size < z80_201_ext_size) {
+ put_msg("Error in Z80 header");
+ return;
+ }
+ if(!read_header(&z80_2.n_pcl, z80_201_ext_size, fp)) return;
+ rem = ext_size - z80_201_ext_size;
+ for(; rem; rem--) sngetc(fp);
+
+ if(z80_2.hardware >= 3 && (ext_size == z80_201_ext_size ||
+ z80_2.hardware >= 4)) {
+ put_msg("Can't load non 48k snapshot");
+ return;
+ }
+ if(z80_2.if1_paged) {
+ put_msg("Can't load snapshot: IF1 roma paged in");
+ return;
+ }
+
+ PCH = z80_2.n_pch;
+ PCL = z80_2.n_pcl;
+
+ while(read_z80_page(fp));
+ }
+ else {
+ if(z80.data == 0xFF) z80.data = 1;
+ if(z80.data & 0x20)
+ read_compressed_data(fp, z80_proc.mem + 0x4000, 0xC000, -1);
+ else {
+ if(snread(z80_proc.mem + 0x4000, 0xC000, fp) != 0xC000)
+ put_msg("Warning: Snapshot file too short (z80)");
+ else if(sngetc(fp) != EOF)
+ put_msg("Warning: Snapshot file too long");
+ }
+
+ PCH = z80.pch;
+ PCL = z80.pcl;
+ }
+
+
+ LOAD_NORMAL_REGS(z80);
+
+ RI = z80.i; /* I reg */
+ RR = (z80.r & 0x7F) | ((z80.data & 0x01) << 7); /* R reg */
+
+ SPH = z80.sph; /* SP reg */
+ SPL = z80.spl;
+
+ z80_proc.ula_outport = (z80_proc.ula_outport & ~(0x07)) |
+ ((z80.data >> 1) & 0x07);
+
+/*
+ Bit 0 : Bit 7 of the R-register
+ Bit 1-3: Border colour
+ Bit 4 : 1=Basic SamRom switched in
+ Bit 5 : 1=Block of data is compressed
+ Bit 6-7: No meaning
+*/
+
+ z80_proc.iff1 = z80.iff1 ? 1 : 0;
+ z80_proc.iff2 = z80.iff2 ? 1 : 0;
+
+ z80_proc.it_mode = z80.im & 0x03;
+
+/*
+ Bit 0-1: Interrupt mode (0, 1 or 2)
+ Bit 2 : 1=Issue 2 emulation
+ Bit 3 : 1=Double interrupt frequency
+ Bit 4-5: 1=High video synchronisation
+ 3=Low video synchronisation
+ 0,2=Normal
+ Bit 6-7: 0=Cursor/Protek/AGF joystick
+ 1=Kempston joystick
+ 2=Sinclair 1 joystick
+ 3=Sinclair 2 joystick
+*/
+
+ z80_proc.haltstate = 0;
+
+ sp_init_screen_mark();
+}
+
+static void snsh_sna_load(SNFILE *fp)
+{
+ struct sna_s sna;
+
+ if(!read_header(&sna, sna_size, fp)) return;
+
+ if(snread(z80_proc.mem+0x4000, 0xC000, fp) != 0xC000)
+ put_msg("Warning: Snapshot file too short (sna)");
+ else if(sngetc(fp) != EOF)
+ put_msg("Warning: Snapshot file too long");
+
+ LOAD_NORMAL_REGS(sna);
+
+ RI = sna.i; /* I reg */
+ RR = sna.r; /* R reg */
+
+ z80_proc.ula_outport = (z80_proc.ula_outport & ~(0x07)) |
+ (sna.border & 0x07);
+
+ SPH = sna.sph; /* SP reg */
+ SPL = sna.spl;
+
+ PCL = z80_proc.mem[SP];
+ if(SP >= 0x4000) z80_proc.mem[SP] = 0;
+ SP++;
+ PCH = z80_proc.mem[SP];
+ if(SP >= 0x4000) z80_proc.mem[SP] = 0;
+ SP++;
+
+ z80_proc.iff1 = z80_proc.iff2 = sna.iff2 ? 1 : 0;
+ z80_proc.it_mode = sna.im & 0x03;
+
+ z80_proc.haltstate = 0;
+
+ sp_init_screen_mark();
+}
+/*
+static void cleanup_qsnap(void)
+{
+ if(qsnap_created) rb->remove(quick_snap_file);
+}
+*/
+static void save_snapshot_file_type(char *name, int type)
+{
+ /*FILE *snsh;*/
+ int snsh;
+ snsh = rb->open(name, O_WRONLY);
+ if(snsh < 0) {
+ snsh = rb->creat(name, O_WRONLY);
+/* sprintf(msgbuf, "Could not open snapshot file `%s', %s",
+ name, strerror(errno));*/
+ if(snsh < 0) {
+ put_msg("Could not create snapshot file");
+ return;
+ }
+ }
+
+ if(type == SN_SNA) snsh_sna_save(snsh);
+ else if(type == SN_Z80) snsh_z80_save(snsh);
+
+ rb->close(snsh);
+}
+
+void save_snapshot_file(char *name)
+{
+ int type;
+
+ rb->strncpy(filenamebuf, name, MAXFILENAME-10);
+ filenamebuf[MAXFILENAME-10] = '\0';
+
+ type = SN_Z80;
+ if(check_ext(filenamebuf, "z80")) type = SN_Z80;
+ else if(check_ext(filenamebuf, "sna")) type = SN_SNA;
+ else {
+ add_extension(filenamebuf, "z80");
+ type = SN_Z80;
+ }
+
+ save_snapshot_file_type(filenamebuf, type);
+
+/* sprintf(msgbuf, "Saved snapshot to file %s", filenamebuf);
+ put_msg(msgbuf);*/
+}
+
+void save_quick_snapshot(void)
+{
+/* if(!qsnap_created) {
+ if(tmpnam(quick_snap_file) == NULL) {
+ put_msg("Could not create temporary file for quick snapshot");
+ return;
+ }
+ qsnap_created = 1;
+ atexit(cleanup_qsnap);
+ }
+ save_snapshot_file_type(quick_snap_file, SN_Z80);*/
+}
+
+void save_snapshot(void)
+{
+ char name[MAXFILENAME];
+ name[0]='/';
+ name[1]='\0';
+ put_msg("Enter name of snapshot file to save:");
+ if (!rb->kbd_input((char*)&name, sizeof name))
+ save_snapshot_file(&name[0]);
+}
+
+
+void load_snapshot_file_type(char *name, int type)
+{
+ int filetype = FT_SNAPSHOT;
+ /*FILE *snsh;*/
+ int snsh;
+ SNFILE snfil;
+
+ rb->strncpy(filenamebuf, name, MAXFILENAME-10);
+ filenamebuf[MAXFILENAME-10] = '\0';
+
+ spcf_find_file_type(filenamebuf, &filetype, &type);
+ if(type < 0) type = SN_Z80;
+
+ snsh = rb->open(filenamebuf, O_RDONLY);
+ if(snsh < 0) {
+#ifndef USE_GRAY
+ rb->splash(HZ,true, "Could not open snapshot file `%s'",filenamebuf);
+#endif
+ return;
+ }
+
+ snfil.isfile = 1;
+ snfil.fd = snsh;
+
+ if(type == SN_SNA) snsh_sna_load(&snfil);
+ else if(type == SN_Z80) snsh_z80_load(&snfil);
+
+ rb->close(snsh);
+}
+
+void snsh_z80_load_intern(byte *p, unsigned len)
+{
+ SNFILE snfil;
+
+ snfil.isfile = 0;
+ snfil.at = p;
+ snfil.len = len;
+
+ snsh_z80_load(&snfil);
+}
+
+void load_quick_snapshot(void)
+{
+ if(!qsnap_created) {
+ put_msg("No quick snapshot saved yet");
+ return;
+ }
+ load_snapshot_file_type(quick_snap_file, SN_Z80);
+}
+
+
+void load_snapshot(void)
+{
+ char *name;
+
+ put_msg("Enter name of snapshot file to load:");
+
+ name = spif_get_filename();
+ if(name == NULL) return;
+
+ load_snapshot_file_type(name, -1);
+}
+
diff --git a/apps/plugins/zxbox/snapshot.h b/apps/plugins/zxbox/snapshot.h
new file mode 100644
index 0000000000..e5b6dbfd04
--- /dev/null
+++ b/apps/plugins/zxbox/snapshot.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SNAPSHOT_H
+#define SNAPSHOT_H
+
+#define SN_SNA 0
+#define SN_Z80 1
+
+extern void save_snapshot_file(char *snsh_name);
+extern void load_snapshot_file_type(char *snsh_name, int type);
+extern void snsh_z80_load_intern(unsigned char *p, unsigned len);
+
+extern void save_snapshot(void);
+extern void load_snapshot(void);
+
+extern void save_quick_snapshot(void);
+extern void load_quick_snapshot(void);
+
+#endif /* SNAPSHOT_H */
diff --git a/apps/plugins/zxbox/sp_def.h b/apps/plugins/zxbox/sp_def.h
new file mode 100644
index 0000000000..1030be120c
--- /dev/null
+++ b/apps/plugins/zxbox/sp_def.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "spperif.h"
+
+#define MARK_SCR(addr) SPNM(scr_mark)[(addr) >> 5] |= 1 << ((addr) & 0x1F)
+
+#define PUTMEM(addr, ptr, val) \
+{ \
+ register byte addrhi; \
+ addrhi = (dbyte) (addr) >> 8; \
+ if(addrhi >= 0x5B) *(ptr) = (val); \
+ else if(addrhi & 0x40) { \
+ *(ptr) = (val); \
+ MARK_SCR((dbyte) (addr)); \
+ if(DANM(next_scri) >= 0 && DANM(tc) > 86) \
+ DANM(tc) -= 2; \
+ } \
+}
+
+#define SOUNDPORT 0x10
+
+/* TODO: attribute or pixel byte is present on unused ports? */
+
+
+#define IN(porth, portl, dest) \
+{ \
+ if(!((portl) & DANM(inport_mask))) { \
+ dest = PORT(inports)[portl]; \
+ } \
+ else if(!((portl) & 1)) { \
+ if(DANM(imp_change) > DANM(tc)) { \
+ DANM(imp_change) = 0; \
+ DANM(ula_inport) ^= 0x40; \
+ } \
+ dest = SPECP(fe_inport_high)[porth] & DANM(ula_inport); \
+ DANM(tc) -= 1; \
+ } \
+ else { \
+ register int scri; \
+ scri = DANM(next_scri); \
+ dest = (scri < 0 || DANM(tc) <= 96) \
+ ? 0xFF : DANM(mem)[(scri<<5)+((224-DANM(tc))>>2)]; \
+ } \
+}
+
+
+#define OUT(porth, portl, source) \
+{ \
+ if(!((portl) & 1)) { \
+ if((DANM(ula_outport) ^ (source)) & SOUNDPORT) { \
+ DANM(sound_change) = 1; \
+ if((source) & SOUNDPORT) DANM(sound_sam) += DANM(tc); \
+ else DANM(sound_sam) -= DANM(tc); \
+ } \
+ DANM(ula_outport) = (source); \
+ DANM(tc) -= 1; \
+ } \
+ PORT(outports)[portl] = (source); \
+}
+
+#define DI_CHECK \
+ if(PC == LOAD_DI+1 && SPNM(quick_load)) \
+ SPNM(load_trapped) = 1, \
+ DANM(haltstate) = 1, \
+ DANM(tc) = 0;
+
diff --git a/apps/plugins/zxbox/spconf.c b/apps/plugins/zxbox/spconf.c
new file mode 100644
index 0000000000..7c49269fa3
--- /dev/null
+++ b/apps/plugins/zxbox/spconf.c
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+#include "misc.h"
+#include "spconf_p.h"
+#include "spver.h"
+#include "interf.h"
+#include "spscr_p.h"
+#include "spkey.h"
+
+#include "snapshot.h" /* for SN_Z80 and SN_SNA */
+#include "tapefile.h" /* for TAP_TAP and TAP_TZX */
+#include "zxconfig.h"
+#include "stdio.h"
+#include "string.h"
+/*#include <errno.h>*/
+#include "sys/types.h"
+#include "helpers.h"
+#include "ctype.h"
+
+
+extern const char *spcf_keynames_ascii[];
+extern const char *spcf_keynames_misc[];
+
+char *spcf_init_snapshot = NULL;
+int spcf_init_snapshot_type;
+char *spcf_init_tapefile = NULL;
+int spcf_init_tapefile_type;
+#ifndef USE_GRAY
+#define exit(i) rb->splash(HZ*1,true,"Exit: %d",i)
+#else
+#define exit(i) i=i
+#endif
+#define MAXLINELEN 512
+/*static int linectr;
+static FILE *conffp;
+static int conffd;
+static const char *conffile;
+*/
+
+static int file_type = -1;
+static int file_subtype;
+
+struct ext_type {
+ const char *ext;
+ int type;
+ int subtype;
+};
+
+static struct ext_type extensions[] = {
+ {"z80", FT_SNAPSHOT, SN_Z80},
+ {"sna", FT_SNAPSHOT, SN_SNA},
+ {"tzx", FT_TAPEFILE, TAP_TZX},
+ {"tap", FT_TAPEFILE, TAP_TAP},
+
+ {NULL, 0, 0}
+};
+
+int spcf_find_file_type(char *filename, int *ftp, int *ftsubp)
+{
+ int i;
+ int found;
+
+ if(*ftp >= 0 && *ftsubp >= 0) return 1;
+
+ found = 0;
+
+ for(i = 0; extensions[i].ext != NULL; i++)
+ if((*ftp < 0 || *ftp == extensions[i].type) &&
+ (*ftsubp < 0 || *ftsubp == extensions[i].subtype) &&
+ check_ext(filename, extensions[i].ext)) {
+ found = 1;
+ *ftp = extensions[i].type;
+ *ftsubp = extensions[i].subtype;
+ break;
+ }
+
+ if(!found) for(i = 0; extensions[i].ext != NULL; i++)
+ if((*ftp < 0 || *ftp == extensions[i].type) &&
+ (*ftsubp < 0 || *ftsubp == extensions[i].subtype) &&
+ try_extension(filename, extensions[i].ext)) {
+ found = 1;
+ *ftp = extensions[i].type;
+ *ftsubp = extensions[i].subtype;
+ break;
+ }
+
+ return found;
+}
+
+static int find_extension(const char *ext)
+{
+ int i;
+ for(i = 0; extensions[i].ext != NULL; i++)
+ if(rb->strcasecmp(extensions[i].ext, ext) == 0) return i;
+
+ return -1;
+}
+
+
+/* now actually a snapshot/tape loader*/
+void spcf_read_command_line(void* parameter)
+{
+ int ix;
+
+ ix = find_extension( parameter - 3 + rb->strlen (parameter) );
+
+ file_type = extensions[ix].type;
+ file_subtype = extensions[ix].subtype;
+ rb->strncpy(filenamebuf, parameter, MAXFILENAME - 10);
+ filenamebuf[MAXFILENAME-10] = '\0';
+ if(file_type < 0) file_subtype = -1;
+ if(!spcf_find_file_type(filenamebuf, &file_type, &file_subtype))
+ return;
+
+ if(file_type == FT_SNAPSHOT) {
+ spcf_init_snapshot = make_string(spcf_init_snapshot, filenamebuf);
+ spcf_init_snapshot_type = file_subtype;
+ }
+ else if(file_type == FT_TAPEFILE) {
+ spcf_init_tapefile = make_string(spcf_init_tapefile, filenamebuf);
+ spcf_init_tapefile_type = file_subtype;
+ }
+}
+
diff --git a/apps/plugins/zxbox/spconf.h b/apps/plugins/zxbox/spconf.h
new file mode 100644
index 0000000000..b7b89a22f7
--- /dev/null
+++ b/apps/plugins/zxbox/spconf.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPCONF_H
+#define SPCONF_H
+
+#define FT_SNAPSHOT 0
+#define FT_TAPEFILE 1
+
+extern char *spcf_init_snapshot;
+extern int spcf_init_snapshot_type;
+extern char *spcf_init_tapefile;
+extern int spcf_init_tapefile_type;
+
+
+/*extern int spcf_read_conf_file(const char *filename);*/
+extern void spcf_read_command_line(void* parameter);
+extern void spcf_read_xresources(void);
+extern int spcf_find_file_type(char *filename, int *ftp, int *ftsubp);
+
+
+#endif /* SPCONF_H */
diff --git a/apps/plugins/zxbox/spconf_p.h b/apps/plugins/zxbox/spconf_p.h
new file mode 100644
index 0000000000..fa7c587ace
--- /dev/null
+++ b/apps/plugins/zxbox/spconf_p.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPCONF_P_H
+#define SPCONF_P_H
+
+#include "spconf.h"
+
+struct sp_options {
+ const char *option;
+
+ int argtype;
+ void *argvalp;
+ const char **enums;
+ int disp;
+};
+
+extern struct sp_options spcf_options[];
+
+#define SA_BOOL 1
+#define SA_INT 2
+#define SA_STR 3
+#define SA_ENUM 4
+
+
+extern int showframe;
+extern int scrmul;
+extern int privatemap;
+extern int use_shm;
+
+extern int small_screen;
+
+extern int sound_on;
+extern int bufframes;
+extern const char *sound_dev_name;
+extern int sound_sample_rate;
+extern int sound_to_autoclose;
+extern int sound_dsp_setfrag;
+
+extern int keyboard_type;
+extern int cursor_type;
+extern int color_type;
+extern int pause_on_iconify;
+extern int vga_pause_bg;
+extern int sp_quick_load;
+extern int sp_paused;
+extern int load_immed;
+extern int spt_auto_stop;
+extern int spkb_allow_ascii;
+extern int spkb_trueshift;
+extern int spkb_funcshift;
+
+extern void spcf_set_val(int ix, const char *val, const char *name,
+ int ctr, int fatal);
+
+extern void spcf_set_color(int ix, const char *val, const char *name,
+ int ctr, int fatal);
+extern void spcf_set_key(int ix, const char *val, const char *name,
+ int ctr, int fatal);
+extern int spcf_match_keydef(const char *attr, const char *beg);
+extern int spcf_parse_conf_line(char *line, char **attrp, char **valp);
+
+
+#endif /* SPCONF_P_H */
diff --git a/apps/plugins/zxbox/spect.c b/apps/plugins/zxbox/spect.c
new file mode 100644
index 0000000000..8e9291f704
--- /dev/null
+++ b/apps/plugins/zxbox/spect.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "z80.h"
+#include "spperif.h"
+#include "spscr.h"
+
+#define SOUNDPORT 0x10
+
+int SPNM(halfframe)(int firsttick, int numlines)
+{
+
+ int tc, linesleft;
+ int feport, scline, border;
+ byte *scrptr;
+ qbyte cmark = 0;
+
+ scrptr = (byte *) SPNM(image);
+
+ tc = firsttick - CHKTICK;
+
+ for(linesleft = numlines; linesleft; linesleft--) {
+ DANM(next_scri) = SPNM(scri)[SPNM(scline)];
+ tc += CHKTICK;
+
+ tc = PRNM(step)(tc);
+
+ scline = SPNM(scline);
+
+ /* store sound */
+ SPNM(sound_buf)[scline] = DANM(sound_sam);
+ feport = DANM(ula_outport);
+
+ if(feport & SOUNDPORT) DANM(sound_sam) = 240;
+ else DANM(sound_sam) = 16;
+
+ /* change EAR bit, store MIC bit*/
+
+ SPNM(fe_outport_time)[scline] = feport;
+ if(DANM(imp_change)) DANM(ula_inport) ^= 0x40;
+ DANM(imp_change) = SPNM(tape_impinfo)[scline];
+
+ /* Check if updating screen */
+
+ if(SPNM(updating)) {
+ border = SPNM(lastborder);
+ if((feport & 0x07) != border) {
+ SPNM(border_update) = 2;
+ SPNM(lastborder) = feport & 0x07;
+ }
+ scrptr = update_screen_line(scrptr, SPNM(coli)[scline], DANM(next_scri),
+ border, &cmark);
+
+ }
+ SPNM(scline)++;
+ }
+ return tc;
+}
diff --git a/apps/plugins/zxbox/spectkey.c b/apps/plugins/zxbox/spectkey.c
new file mode 100644
index 0000000000..3b986d67ba
--- /dev/null
+++ b/apps/plugins/zxbox/spectkey.c
@@ -0,0 +1,1602 @@
+/* spectkey.c */
+
+/*
+ This file was generated by ./bin_to_c from binary image
+ file `spectkey.srl'
+ */
+
+unsigned char spectkey[] = {
+ 0xFF, 0x72, 0x07, 0xFF, 0x72, 0x07, 0xFF, 0x72, 0x07, 0xFE,
+ 0x72, 0x07, 0x7F, 0xE7, 0x20, 0x77, 0xFE, 0x72, 0x07, 0x7F,
+ 0xD7, 0x20, 0xA7, 0xFD, 0x72, 0x0A, 0x7F, 0xD7, 0x20, 0xA7,
+ 0xFC, 0x72, 0x0B, 0x7F, 0xC7, 0x20, 0xB7, 0xFC, 0x72, 0x0B,
+ 0x7F, 0xB7, 0x20, 0xC7, 0xFB, 0x72, 0x0C, 0x7F, 0xB7, 0x20,
+ 0xC7, 0xFA, 0x72, 0x0D, 0x7F, 0xA7, 0x20, 0xD7, 0xFA, 0x72,
+ 0x0D, 0x7F, 0x97, 0x20, 0xE0, 0x7F, 0x97, 0x20, 0xE0, 0x7F,
+ 0x97, 0x20, 0xE0, 0x7F, 0x97, 0x20, 0xE0, 0x7F, 0x87, 0x20,
+ 0xE1, 0x7F, 0x87, 0x20, 0xE1, 0x7F, 0x87, 0x20, 0xE1, 0x7F,
+ 0x87, 0x20, 0xE1, 0x7F, 0x77, 0x20, 0xE2, 0x7F, 0x77, 0x20,
+ 0xE2, 0x7F, 0x77, 0x20, 0xE2, 0x7F, 0x67, 0x20, 0xE3, 0x7F,
+ 0x67, 0x20, 0xE3, 0x7F, 0x67, 0x20, 0xE3, 0x7F, 0x67, 0x20,
+ 0xE3, 0x7F, 0x57, 0x20, 0xE4, 0x7F, 0x57, 0x20, 0xE4, 0x7F,
+ 0x57, 0x20, 0xE4, 0x7F, 0x57, 0x20, 0xE3, 0x78, 0xF4, 0x72,
+ 0x0E, 0x47, 0x8F, 0x47, 0x20, 0xE4, 0x78, 0xF4, 0x72, 0x0E,
+ 0x37, 0x88, 0xF3, 0x72, 0x0E, 0x47, 0x88, 0xF3, 0x72, 0x0E,
+ 0x47, 0x88, 0xF3, 0x72, 0x0E, 0x47, 0x88, 0xF3, 0x72, 0x0E,
+ 0x37, 0xA8, 0xF2, 0x72, 0x0E, 0x47, 0xA8, 0xF2, 0x72, 0x0E,
+ 0x47, 0xA8, 0xF2, 0x72, 0x0E, 0x47, 0xA8, 0xF2, 0x72, 0x0E,
+ 0x37, 0xB8, 0xF1, 0x72, 0x0E, 0x47, 0xB8, 0xF1, 0x72, 0x0E,
+ 0x47, 0xB8, 0xF1, 0x72, 0x0E, 0x37, 0xC8, 0xF0, 0x72, 0x0E,
+ 0x47, 0xC8, 0xF0, 0x72, 0x0E, 0x47, 0xC8, 0xF0, 0x72, 0x0E,
+ 0x47, 0xC8, 0xF0, 0x72, 0x0E, 0x37, 0xD8, 0xFF, 0x62, 0x0E,
+ 0x47, 0xD8, 0xFF, 0x62, 0x0E, 0x47, 0xD8, 0xFF, 0x62, 0x0E,
+ 0x47, 0xD8, 0xFE, 0x62, 0x0E, 0x47, 0xE0, 0x8F, 0xE6, 0x20,
+ 0xE4, 0x7E, 0x08, 0xFE, 0x62, 0x0E, 0x47, 0xE0, 0x8F, 0xE6,
+ 0x20, 0xE3, 0x7E, 0x18, 0xFD, 0x62, 0x0E, 0x47, 0xE1, 0x8F,
+ 0xD6, 0x20, 0xE4, 0x7E, 0x18, 0xF3, 0x12, 0x0F, 0x32, 0x09,
+ 0xF7, 0x30, 0x0E, 0x47, 0xE1, 0x8F, 0x31, 0x20, 0xF3, 0x20,
+ 0x9F, 0x73, 0x00, 0xE3, 0x7E, 0x28, 0xF3, 0x12, 0x0A, 0x9B,
+ 0x09, 0x90, 0xE0, 0x90, 0xB9, 0xA0, 0x99, 0x0A, 0x90, 0xA9,
+ 0xF6, 0x30, 0x0E, 0x47, 0xE2, 0x8F, 0x31, 0x20, 0xA9, 0x0A,
+ 0x90, 0x90, 0xD9, 0x09, 0x09, 0x90, 0xA9, 0x09, 0x09, 0x90,
+ 0xB9, 0xF6, 0x30, 0x0E, 0x47, 0xE2, 0x8F, 0x52, 0x00, 0xB1,
+ 0x00, 0x1C, 0x01, 0xA0, 0x10, 0xC1, 0xFF, 0x10, 0x0B, 0x70,
+ 0x0C, 0x70, 0xA7, 0xF7, 0x20, 0x03, 0xA0, 0x3A, 0x03, 0xB0,
+ 0xA3, 0x00, 0xC3, 0x03, 0xA0, 0x30, 0xC3, 0xA0, 0x3E, 0xB0,
+ 0xA2, 0x00, 0xB2, 0x00, 0xC2, 0x0C, 0x20, 0x2A, 0x02, 0xFC,
+ 0x10, 0x0A, 0x60, 0x06, 0xA0, 0x6A, 0x06, 0xA0, 0x6A, 0x06,
+ 0xFF, 0x10, 0x08, 0xA0, 0x80, 0xC8, 0x08, 0xC0, 0x8D, 0x0A,
+ 0x80, 0x08, 0xA0, 0x8E, 0xF0, 0x9A, 0x09, 0x09, 0xA0, 0x90,
+ 0xA9, 0x0C, 0x90, 0xC9, 0xF8, 0x80, 0x0A, 0x90, 0xA9, 0x09,
+ 0x0C, 0x90, 0xA9, 0x09, 0x0C, 0x90, 0x90, 0xC9, 0xF6, 0x30,
+ 0x0E, 0x37, 0xE3, 0x8F, 0x52, 0x00, 0x1A, 0x01, 0x01, 0xC0,
+ 0x1A, 0x01, 0x01, 0xF3, 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07,
+ 0x00, 0x7F, 0x62, 0x00, 0x33, 0x03, 0x30, 0x03, 0x03, 0x00,
+ 0x3A, 0x03, 0x03, 0xC0, 0x33, 0x00, 0x3A, 0x03, 0xB0, 0x30,
+ 0x3E, 0x90, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xC0,
+ 0x22, 0x00, 0x2F, 0xB1, 0x00, 0x6A, 0x06, 0x06, 0xA0, 0x60,
+ 0x06, 0x06, 0x00, 0x66, 0x00, 0x6F, 0xF1, 0x00, 0x8A, 0x08,
+ 0x08, 0xC0, 0x8C, 0x08, 0xC0, 0x8A, 0x08, 0x08, 0xA0, 0x8E,
+ 0xF0, 0x9A, 0x09, 0x09, 0xA0, 0x90, 0x09, 0xB0, 0x9A, 0x09,
+ 0xFC, 0x80, 0x0A, 0x9B, 0x09, 0x90, 0xC9, 0x0A, 0x90, 0x90,
+ 0xC9, 0x00, 0xD9, 0xF5, 0x30, 0x0E, 0x47, 0xE3, 0x8F, 0x52,
+ 0x00, 0x1A, 0x01, 0x01, 0xC0, 0x1A, 0x01, 0x01, 0xF3, 0x20,
+ 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x7F, 0x52, 0x00, 0x30,
+ 0x30, 0x30, 0x3A, 0x03, 0x03, 0xC0, 0x3C, 0x03, 0x03, 0x03,
+ 0xA0, 0x3A, 0x03, 0xA0, 0x3E, 0x80, 0x2C, 0x02, 0xA0, 0x20,
+ 0x2C, 0x02, 0xC0, 0x20, 0x20, 0x2F, 0xB1, 0x00, 0x6C, 0x06,
+ 0xA0, 0x60, 0x6A, 0x06, 0x06, 0x06, 0x06, 0xFF, 0x10, 0x08,
+ 0xA0, 0x80, 0x8C, 0x08, 0xC0, 0x8C, 0x08, 0xA0, 0x80, 0x8A,
+ 0x08, 0xEF, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x00, 0x9B, 0x09,
+ 0xA0, 0x9F, 0xC8, 0x00, 0xA9, 0x0A, 0x90, 0x90, 0xC9, 0xC0,
+ 0x90, 0xC9, 0x09, 0x0C, 0x9F, 0x53, 0x00, 0xE4, 0x7E, 0x38,
+ 0xF5, 0x20, 0x0B, 0x10, 0x01, 0xC0, 0x1A, 0x01, 0x0A, 0x1F,
+ 0x12, 0x00, 0xB7, 0x00, 0xA7, 0xA0, 0x7A, 0x07, 0xF5, 0x20,
+ 0x03, 0x03, 0x03, 0x03, 0xA0, 0x30, 0x30, 0xA3, 0x0A, 0x3A,
+ 0x03, 0x03, 0x03, 0xA0, 0x3A, 0x03, 0xA0, 0x3E, 0x80, 0x20,
+ 0xA2, 0x0B, 0x20, 0x0A, 0x2A, 0x0A, 0x2A, 0x02, 0x02, 0x02,
+ 0xFB, 0x10, 0x06, 0xD0, 0xA6, 0x00, 0x6A, 0x06, 0x06, 0x06,
+ 0x06, 0xF0, 0x20, 0x0A, 0x80, 0x0A, 0x8A, 0x08, 0xC0, 0x8C,
+ 0x08, 0xA0, 0x80, 0x8A, 0x08, 0xEF, 0x09, 0xA0, 0x90, 0xC9,
+ 0x00, 0x9B, 0x09, 0xA0, 0xA9, 0xFA, 0x80, 0x0A, 0x90, 0xA9,
+ 0x09, 0x0C, 0x90, 0xA9, 0x09, 0x0A, 0x90, 0x90, 0x99, 0x0B,
+ 0x9F, 0x53, 0x00, 0xE4, 0x7E, 0x38, 0xF5, 0x20, 0x01, 0xA0,
+ 0x10, 0x1C, 0x01, 0xA0, 0x10, 0x1F, 0x32, 0x00, 0x70, 0x7A,
+ 0x07, 0xC0, 0x7A, 0x07, 0xF5, 0x20, 0x03, 0xA0, 0x30, 0xC3,
+ 0x03, 0xA0, 0x30, 0x3C, 0x03, 0x00, 0x33, 0xA0, 0x3A, 0x0C,
+ 0x3E, 0x80, 0x2A, 0x02, 0x02, 0x02, 0xA0, 0x2C, 0x02, 0xC0,
+ 0x20, 0x02, 0x2F, 0xB1, 0x00, 0x6E, 0x00, 0x6A, 0x0C, 0x60,
+ 0x60, 0x06, 0x6F, 0x12, 0x00, 0x8A, 0x08, 0xC0, 0x8C, 0x08,
+ 0xC0, 0x8A, 0x08, 0x08, 0x08, 0x08, 0xEF, 0x09, 0x09, 0x09,
+ 0x09, 0xA0, 0x90, 0x09, 0xB0, 0x9A, 0x09, 0xFC, 0x80, 0x0A,
+ 0x9B, 0x09, 0x9C, 0x09, 0x0A, 0x90, 0x99, 0xA0, 0x99, 0x0A,
+ 0x90, 0xA9, 0xF5, 0x30, 0x0E, 0x37, 0xE4, 0x8F, 0x52, 0x00,
+ 0x1A, 0x01, 0x01, 0xC0, 0x1A, 0x01, 0x01, 0xF3, 0x20, 0x07,
+ 0x00, 0x70, 0x07, 0xC0, 0x70, 0x07, 0xF6, 0x20, 0x03, 0xA0,
+ 0x30, 0x3A, 0x03, 0x03, 0xA0, 0x30, 0x3C, 0x03, 0xA0, 0x3A,
+ 0x03, 0xA0, 0x3A, 0x03, 0xE8, 0x02, 0xA0, 0x20, 0x20, 0x02,
+ 0x00, 0x2C, 0x02, 0xC0, 0x2A, 0x02, 0xFB, 0x10, 0x06, 0xA0,
+ 0x6A, 0x06, 0xA0, 0x6A, 0x06, 0x06, 0xA0, 0x6F, 0x12, 0x00,
+ 0x8A, 0x08, 0xC0, 0x8C, 0x08, 0xC0, 0x8A, 0x08, 0x08, 0x08,
+ 0x08, 0xEF, 0x09, 0x09, 0x09, 0x09, 0xA0, 0x90, 0x09, 0xB0,
+ 0x9A, 0x09, 0xFC, 0x80, 0x0F, 0x32, 0x09, 0xF4, 0x30, 0x0E,
+ 0x47, 0xE4, 0x8F, 0x52, 0x00, 0xB1, 0x00, 0xC1, 0x00, 0xA1,
+ 0x00, 0xC1, 0xFF, 0x10, 0x07, 0xA0, 0x70, 0xC7, 0x0A, 0x7F,
+ 0x72, 0x00, 0x3A, 0x03, 0x03, 0xA0, 0x30, 0x0B, 0x30, 0xC3,
+ 0x03, 0xA0, 0x3A, 0x03, 0xA0, 0x3A, 0x03, 0xE9, 0x0B, 0x20,
+ 0x2A, 0x02, 0x0C, 0x20, 0xC2, 0x02, 0xA0, 0x2F, 0xC1, 0x00,
+ 0xA6, 0xB0, 0x6A, 0x06, 0xA0, 0x60, 0x6A, 0x06, 0xF1, 0x20,
+ 0x08, 0xA0, 0xC8, 0x0C, 0x80, 0xC8, 0x00, 0xA8, 0xA0, 0x80,
+ 0x8F, 0x81, 0x00, 0x90, 0x90, 0x09, 0xA0, 0x90, 0xA9, 0xA0,
+ 0x9A, 0x0C, 0x9F, 0x88, 0x00, 0xF3, 0x20, 0x9F, 0x43, 0x00,
+ 0xE4, 0x7E, 0x48, 0xFA, 0x62, 0x0E, 0x47, 0xE4, 0x8F, 0xA6,
+ 0x20, 0xE3, 0x7E, 0x58, 0xF9, 0x62, 0x0E, 0x47, 0xE5, 0x8F,
+ 0x96, 0x20, 0xE4, 0x7E, 0x58, 0xF9, 0x62, 0x0E, 0x37, 0xE6,
+ 0x8F, 0x52, 0x00, 0xC9, 0x0A, 0x9A, 0x0A, 0x90, 0xC9, 0xFF,
+ 0x10, 0x0A, 0x9B, 0x09, 0xA0, 0xB9, 0xA0, 0xB9, 0xA0, 0x9D,
+ 0x0A, 0x9A, 0x0A, 0x90, 0x09, 0xA0, 0x9D, 0x0C, 0x90, 0xB9,
+ 0x00, 0x9A, 0x09, 0x0C, 0x9A, 0x09, 0xA0, 0x90, 0xA9, 0x0A,
+ 0x9A, 0x0C, 0x90, 0x0A, 0x9E, 0x00, 0xA9, 0x09, 0xA0, 0x90,
+ 0x9A, 0x09, 0xB0, 0x9A, 0x09, 0x0A, 0x90, 0xA9, 0xA0, 0xC9,
+ 0x00, 0xA9, 0xEB, 0x09, 0x9F, 0x23, 0x00, 0xB9, 0xF4, 0x30,
+ 0x09, 0x9F, 0x73, 0x00, 0x99, 0xFE, 0x20, 0x0A, 0x90, 0x0B,
+ 0x9B, 0x09, 0xA0, 0xB9, 0x00, 0x9A, 0x09, 0x0A, 0x90, 0x0A,
+ 0x9A, 0x0B, 0x9E, 0x30, 0xA9, 0xA0, 0xC9, 0x09, 0xC0, 0xC9,
+ 0x0C, 0x90, 0xC9, 0xF1, 0x30, 0x0E, 0x47, 0xE6, 0x8F, 0x52,
+ 0x00, 0x9C, 0x09, 0x00, 0x9A, 0x09, 0xB0, 0x9F, 0x02, 0x00,
+ 0x9A, 0x09, 0x00, 0x90, 0x90, 0x09, 0xA0, 0x90, 0x9E, 0x00,
+ 0x9C, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0x00, 0x9E, 0x20,
+ 0x9A, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0xE0, 0x09, 0xA0,
+ 0x90, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xA0, 0x9E,
+ 0x00, 0x90, 0x09, 0x90, 0x09, 0x09, 0xA0, 0x9B, 0x09, 0xA0,
+ 0x90, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xA0, 0x9E,
+ 0x80, 0x99, 0x09, 0xF2, 0x30, 0x09, 0x00, 0x9F, 0x23, 0x00,
+ 0x99, 0x00, 0x99, 0xF5, 0x30, 0x09, 0x09, 0x9F, 0xB2, 0x00,
+ 0x9A, 0x09, 0x09, 0xA0, 0x90, 0x09, 0x09, 0x00, 0x9A, 0x09,
+ 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9A, 0x09, 0x09, 0xE7, 0x09,
+ 0x00, 0x90, 0x09, 0xC0, 0x9C, 0x09, 0xE0, 0x09, 0xA0, 0x9F,
+ 0x53, 0x00, 0xE4, 0x7E, 0x68, 0xF5, 0x20, 0x09, 0xC0, 0x9A,
+ 0x09, 0x00, 0x9B, 0x09, 0xF0, 0x20, 0x09, 0xC0, 0x9A, 0x09,
+ 0x09, 0xA0, 0x90, 0x9E, 0x00, 0x9C, 0x09, 0xA0, 0x90, 0x9C,
+ 0x09, 0x09, 0xE3, 0x09, 0xA0, 0x9A, 0x09, 0x09, 0xA0, 0x90,
+ 0x9E, 0x00, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0, 0x90, 0x9C,
+ 0x09, 0xA0, 0x9E, 0x00, 0x90, 0x09, 0x09, 0x09, 0x09, 0xA0,
+ 0x9B, 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9A, 0x09, 0x09, 0xC0,
+ 0x9A, 0x09, 0xE6, 0x09, 0x9A, 0x0E, 0x09, 0xFC, 0x20, 0x09,
+ 0x00, 0x9F, 0x03, 0x00, 0x99, 0xD0, 0x99, 0xFD, 0x20, 0x0E,
+ 0x09, 0xA0, 0x99, 0xF9, 0x20, 0x09, 0xC0, 0x9A, 0x09, 0x09,
+ 0xA0, 0x90, 0x9A, 0x09, 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9C,
+ 0x09, 0xE7, 0x09, 0xA0, 0x90, 0x9C, 0x09, 0xC0, 0x9E, 0x00,
+ 0x9A, 0x09, 0xF5, 0x30, 0x0E, 0x47, 0xE5, 0x82, 0xF5, 0x20,
+ 0x0A, 0x9A, 0x09, 0xA0, 0x90, 0x09, 0xB0, 0x9F, 0x02, 0x00,
+ 0x9C, 0x09, 0xA0, 0x90, 0xB9, 0xA0, 0xA9, 0xB0, 0x9C, 0x09,
+ 0xA0, 0x90, 0x9C, 0x09, 0x9E, 0x40, 0x9A, 0x0B, 0x90, 0x09,
+ 0xA0, 0x90, 0xA9, 0xC0, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0,
+ 0x90, 0xA9, 0xA0, 0x9A, 0x09, 0xE0, 0x09, 0x00, 0x90, 0x90,
+ 0x90, 0x9A, 0x09, 0xB0, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0,
+ 0x90, 0xA9, 0xA0, 0x9A, 0x09, 0xE4, 0x09, 0x9E, 0x40, 0x9F,
+ 0x92, 0x00, 0xB9, 0x00, 0xB9, 0xFD, 0x20, 0x0B, 0x90, 0x0B,
+ 0x9F, 0xD2, 0x00, 0x9E, 0x40, 0x99, 0xF7, 0x20, 0x09, 0x0A,
+ 0x90, 0xB9, 0x00, 0x9A, 0x09, 0x0B, 0x90, 0x0C, 0x90, 0x09,
+ 0x00, 0x9D, 0x0A, 0x9E, 0x40, 0x9A, 0x09, 0x0A, 0x9A, 0x09,
+ 0xC0, 0xA9, 0xC0, 0x9A, 0x0A, 0x9F, 0x33, 0x00, 0xE3, 0x7E,
+ 0x68, 0x2F, 0x52, 0x00, 0x9C, 0x09, 0xA0, 0x90, 0x09, 0xB0,
+ 0x9F, 0x02, 0x00, 0x9C, 0x0C, 0x90, 0x9E, 0x20, 0x9A, 0x09,
+ 0xC0, 0x9A, 0x09, 0x09, 0xC0, 0x90, 0x9E, 0x30, 0x9A, 0x09,
+ 0x09, 0xA0, 0x9A, 0x09, 0x09, 0xE1, 0x09, 0x09, 0xA0, 0x90,
+ 0x09, 0xA0, 0x90, 0x9C, 0x09, 0xA0, 0x9E, 0x00, 0x90, 0x09,
+ 0x00, 0x99, 0x00, 0x90, 0x9D, 0x09, 0x09, 0xA0, 0x90, 0x09,
+ 0xA0, 0x90, 0x9C, 0x09, 0xA0, 0x9E, 0x60, 0x99, 0xA0, 0xE0,
+ 0x9F, 0x92, 0x00, 0x99, 0xD0, 0x99, 0xF0, 0x30, 0x09, 0x00,
+ 0x9F, 0x03, 0x00, 0xE0, 0x9A, 0x09, 0x9F, 0x92, 0x00, 0x9A,
+ 0x09, 0x09, 0x09, 0xA0, 0xC9, 0x09, 0xC0, 0x9A, 0x09, 0x00,
+ 0x90, 0x09, 0xE2, 0x09, 0xE3, 0x09, 0xA0, 0x90, 0x9C, 0x09,
+ 0xC0, 0x9E, 0x00, 0x9A, 0x09, 0xF4, 0x30, 0x0E, 0x47, 0xE6,
+ 0x82, 0xF5, 0x20, 0x09, 0xC0, 0x90, 0x09, 0xA0, 0x9B, 0x09,
+ 0xF0, 0x20, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0xE2, 0x09,
+ 0xA0, 0x9C, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0x00, 0x9E,
+ 0x20, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0, 0x90, 0x9E, 0x10,
+ 0x90, 0x9A, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xA0,
+ 0x9E, 0x00, 0x90, 0x09, 0xA0, 0x90, 0x09, 0x09, 0x00, 0x99,
+ 0x00, 0x90, 0x9A, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09,
+ 0xA0, 0x9E, 0x80, 0x99, 0x09, 0xF1, 0x30, 0x09, 0x90, 0x09,
+ 0x9F, 0x23, 0x00, 0x90, 0x09, 0xF6, 0x30, 0x09, 0x09, 0x9F,
+ 0xB2, 0x00, 0x9A, 0x09, 0x09, 0x00, 0x90, 0x09, 0xA0, 0x90,
+ 0x9C, 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9A, 0x09, 0xC0, 0x9E,
+ 0x30, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xC0, 0x9E, 0x00, 0x9A,
+ 0x09, 0xF4, 0x30, 0x0E, 0x47, 0xE6, 0x82, 0xF5, 0x20, 0x0C,
+ 0x90, 0xA9, 0xA0, 0xA9, 0xA0, 0x9F, 0x12, 0x00, 0xA9, 0x00,
+ 0x9A, 0x09, 0x09, 0xC0, 0xB9, 0xB0, 0xC9, 0x00, 0xA9, 0xA0,
+ 0xA9, 0x00, 0x9A, 0x09, 0xE1, 0x09, 0xA0, 0x9A, 0x09, 0x00,
+ 0xA9, 0x00, 0xC9, 0xC0, 0x9A, 0x0A, 0x90, 0xA9, 0xA0, 0xC9,
+ 0x00, 0xA9, 0xE0, 0x0A, 0x90, 0x9A, 0x09, 0xA0, 0x9A, 0x09,
+ 0x9A, 0x09, 0xA0, 0xA9, 0x0A, 0x9A, 0x0C, 0x90, 0x0A, 0x9E,
+ 0xB0, 0x99, 0xF3, 0x30, 0x09, 0x9F, 0x43, 0x00, 0xB9, 0xF6,
+ 0x30, 0x09, 0x9F, 0xE2, 0x00, 0xB9, 0x09, 0xA0, 0x90, 0x9A,
+ 0x09, 0x09, 0xC0, 0x9A, 0x09, 0x0A, 0x90, 0x0A, 0x90, 0x0B,
+ 0x9E, 0x40, 0xA9, 0xA0, 0xC9, 0x0C, 0x90, 0xC9, 0xA0, 0x9A,
+ 0x0C, 0x9F, 0x03, 0x00, 0xE4, 0x7E, 0x58, 0x22, 0xF7, 0x62,
+ 0x0E, 0x37, 0xE6, 0x82, 0x2F, 0x66, 0x20, 0xE4, 0x7E, 0x68,
+ 0x22, 0xF6, 0x62, 0x0E, 0x47, 0xE5, 0x8A, 0x2F, 0x52, 0x00,
+ 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20,
+ 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0,
+ 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20,
+ 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5F, 0xC2,
+ 0x00, 0xE3, 0x7E, 0x68, 0xA2, 0xF5, 0x20, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xFA, 0x20, 0x0E, 0x47, 0xE6, 0x8A, 0x2F, 0x52, 0x00,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4F, 0xA2, 0x00, 0xE4, 0x7E, 0x68, 0xA2,
+ 0xF5, 0x20, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F,
+ 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xE1,
+ 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9,
+ 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05,
+ 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54,
+ 0xE9, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xFA, 0x20, 0x0E, 0x47,
+ 0xE5, 0x8B, 0x2F, 0x52, 0x00, 0xF8, 0x10, 0x5B, 0x9A, 0x59,
+ 0xD5, 0x4E, 0x90, 0xF8, 0x10, 0x59, 0xA5, 0xB9, 0xD5, 0x4E,
+ 0x90, 0xF8, 0x10, 0x59, 0xD5, 0x9D, 0x54, 0xE9, 0x0F, 0x81,
+ 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xB9, 0xA5,
+ 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x9A, 0x5B, 0x9D, 0x54,
+ 0xE9, 0x0F, 0x81, 0x05, 0x9D, 0x59, 0xD5, 0x4E, 0x90, 0xF8,
+ 0x10, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4F, 0xA2, 0x00, 0xE3, 0x7E, 0x68, 0xB2,
+ 0xF5, 0x20, 0x0E, 0x15, 0x99, 0xE7, 0x5B, 0x9A, 0x59, 0xD5,
+ 0x4E, 0x90, 0xD5, 0xC9, 0xE6, 0x59, 0xA5, 0xB9, 0xD5, 0x4E,
+ 0x90, 0xD5, 0xC9, 0xE6, 0x59, 0xD5, 0x9D, 0x54, 0xE9, 0x0E,
+ 0x25, 0x99, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xC5, 0xD9,
+ 0xE6, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xD5, 0xC9, 0xE6,
+ 0x59, 0xA5, 0xB9, 0xD5, 0x4E, 0x90, 0xB5, 0xE0, 0x9E, 0x65,
+ 0x9D, 0x59, 0xD5, 0x4E, 0x90, 0xC5, 0xC9, 0xE7, 0x5E, 0x19,
+ 0xD5, 0x4E, 0x90, 0xC5, 0xC9, 0xFC, 0x10, 0x54, 0xE9, 0x0C,
+ 0x5C, 0x9F, 0xC1, 0x05, 0x4F, 0x92, 0x00, 0xE4, 0x7E, 0x68,
+ 0xB2, 0xF5, 0x20, 0x0E, 0x05, 0xA9, 0xE7, 0x5B, 0x9A, 0x59,
+ 0xD5, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x59, 0xA5,
+ 0xB9, 0xD5, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x59,
+ 0xD5, 0x9D, 0x54, 0xE9, 0x0E, 0x15, 0xA9, 0xE6, 0x5E, 0x19,
+ 0xD5, 0x4E, 0x90, 0xC5, 0x99, 0xEA, 0x5B, 0x9A, 0x59, 0xD5,
+ 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x59, 0xA5, 0xB9,
+ 0xD5, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE6, 0x59, 0xD5,
+ 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0xE1,
+ 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05,
+ 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xF9,
+ 0x20, 0x0E, 0x47, 0xE6, 0x8B, 0x2F, 0x52, 0x00, 0xD5, 0xB9,
+ 0xE7, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0x9E, 0x55,
+ 0xE1, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E, 0x19,
+ 0xD5, 0x4E, 0x90, 0xE0, 0x5B, 0x9E, 0x65, 0xB9, 0xA5, 0x9D,
+ 0x54, 0xE9, 0x0C, 0x59, 0x9E, 0xA5, 0xB9, 0xA5, 0x9D, 0x54,
+ 0xE9, 0x0C, 0x59, 0x9E, 0xA5, 0xB9, 0xA5, 0x9D, 0x54, 0xE9,
+ 0x0E, 0x25, 0x99, 0xE6, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90,
+ 0xB5, 0x99, 0xA5, 0x99, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90,
+ 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59,
+ 0x95, 0x5A, 0x9F, 0xB1, 0x05, 0x4F, 0x92, 0x00, 0xE4, 0x7E,
+ 0x58, 0xC2, 0xF5, 0x20, 0x0E, 0x15, 0x99, 0xE7, 0x5E, 0x19,
+ 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0x9E, 0x55, 0xE1, 0x9D, 0x54,
+ 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E, 0x19, 0xD5, 0x4E, 0x90,
+ 0xE0, 0x5B, 0x9E, 0x65, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0C,
+ 0x5C, 0x9E, 0x75, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0C, 0x59,
+ 0x9E, 0xA5, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x15, 0x99,
+ 0xE7, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
+ 0x99, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
+ 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x95, 0x5A, 0x9F,
+ 0xB1, 0x05, 0x4F, 0x92, 0x00, 0xE3, 0x7E, 0x68, 0xC2, 0xF5,
+ 0x20, 0x0E, 0x15, 0x99, 0xE7, 0x5E, 0x19, 0xD5, 0x4E, 0x90,
+ 0xE3, 0x59, 0x9E, 0x55, 0xE1, 0x9D, 0x54, 0xE9, 0x0E, 0x05,
+ 0xB9, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xD5, 0x99, 0x59,
+ 0x9E, 0x65, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x25, 0x99,
+ 0xE6, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xC5, 0xD9, 0xE6,
+ 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x75,
+ 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0C, 0x5C, 0x9E, 0x75, 0xE1,
+ 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05,
+ 0x4E, 0x90, 0xB5, 0x99, 0x59, 0x59, 0x9F, 0xB1, 0x05, 0x4F,
+ 0x82, 0x00, 0xE4, 0x7E, 0x68, 0xC2, 0xF5, 0x20, 0x0E, 0x15,
+ 0x99, 0xE7, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xE2, 0x59, 0x9E,
+ 0x65, 0xE1, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E,
+ 0x19, 0xD5, 0x4E, 0x90, 0xD5, 0x99, 0x59, 0x9E, 0x65, 0xE1,
+ 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E, 0x19, 0xD5,
+ 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x5E, 0x19, 0xD5,
+ 0x4E, 0x90, 0xE0, 0x59, 0x9E, 0x85, 0xE1, 0x9D, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0xE1, 0x9D, 0x54, 0xE9,
+ 0x0C, 0x5D, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0x59,
+ 0x59, 0x9F, 0xB1, 0x05, 0x4F, 0x82, 0x00, 0xE4, 0x7E, 0x58,
+ 0xD2, 0xF5, 0x20, 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9,
+ 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0E, 0x35, 0x99,
+ 0xFA, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x59, 0x9F, 0xB1,
+ 0x05, 0x4E, 0x90, 0xE3, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90,
+ 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9, 0x0E, 0x05,
+ 0x99, 0xFD, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F,
+ 0xB1, 0x05, 0x4E, 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05, 0x4E,
+ 0x90, 0xB5, 0xA9, 0x55, 0x99, 0xFB, 0x10, 0x54, 0xF8, 0x20,
+ 0x0E, 0x37, 0xE6, 0x8D, 0x2F, 0x52, 0x00, 0xE1, 0x59, 0x9F,
+ 0xC1, 0x05, 0x4E, 0x90, 0xE0, 0x59, 0x9F, 0xD1, 0x05, 0x4E,
+ 0x90, 0xE3, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5, 0xE0,
+ 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xE3, 0x59, 0x9F, 0xA1, 0x05,
+ 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9,
+ 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
+ 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xFB, 0x10,
+ 0x54, 0xE9, 0x0B, 0x5A, 0x95, 0x59, 0x9F, 0xB1, 0x05, 0x4F,
+ 0x72, 0x00, 0xE4, 0x7E, 0x68, 0xD2, 0xF5, 0x20, 0x0E, 0x15,
+ 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F, 0xE1, 0x05,
+ 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9,
+ 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95,
+ 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99,
+ 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E,
+ 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B,
+ 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xB5, 0x99,
+ 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xF7, 0x20, 0x0E, 0x47, 0xE6,
+ 0x8D, 0x2F, 0x52, 0x00, 0xD5, 0xD9, 0xE4, 0x57, 0xE7, 0x54,
+ 0xE9, 0x0C, 0x5E, 0x09, 0xE6, 0x5A, 0x7E, 0x35, 0x4E, 0x90,
+ 0xD5, 0xC9, 0xE6, 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0E, 0x25,
+ 0x99, 0xE6, 0x57, 0xE6, 0x54, 0xE9, 0x0D, 0x5B, 0x9E, 0x45,
+ 0x77, 0x55, 0x7E, 0x55, 0x4E, 0x90, 0xD5, 0xC9, 0xE3, 0x57,
+ 0xE9, 0x54, 0xE9, 0x0D, 0x59, 0x9E, 0x55, 0x7E, 0xA5, 0x4E,
+ 0x90, 0xC5, 0xC9, 0xE5, 0x57, 0xE8, 0x54, 0xE9, 0x0C, 0x5C,
+ 0x9E, 0x65, 0x7E, 0x75, 0x4E, 0x90, 0xC5, 0xC9, 0xFC, 0x10,
+ 0x54, 0xF7, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x02, 0xF5, 0x20,
+ 0x0F, 0x71, 0x05, 0x7E, 0x75, 0x4E, 0x90, 0xF8, 0x10, 0x57,
+ 0xA5, 0x7E, 0x25, 0x4E, 0x90, 0xF8, 0x10, 0x57, 0x57, 0xE4,
+ 0x54, 0xE9, 0x0F, 0x71, 0x05, 0xB7, 0xE4, 0x54, 0xE9, 0x0E,
+ 0xE5, 0x77, 0x57, 0xE6, 0x54, 0xE9, 0x0E, 0xD5, 0x75, 0x7E,
+ 0x85, 0x4E, 0x90, 0xED, 0x57, 0xEA, 0x54, 0xE9, 0x0E, 0xE5,
+ 0x7E, 0x95, 0x4E, 0x90, 0xF8, 0x10, 0x57, 0xE6, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4F, 0x72, 0x00, 0xE3, 0x7E, 0x68, 0xE0,
+ 0x2F, 0x52, 0x00, 0xF7, 0x10, 0x57, 0xE7, 0x54, 0xE9, 0x0F,
+ 0x81, 0x05, 0x75, 0xA7, 0xE2, 0x54, 0xE9, 0x0F, 0x71, 0x05,
+ 0xC7, 0xE3, 0x54, 0xE9, 0x0E, 0xF5, 0x75, 0x7E, 0x65, 0x4E,
+ 0x90, 0xF8, 0x10, 0x57, 0xE6, 0x54, 0xE9, 0x0E, 0xE5, 0x7E,
+ 0x95, 0x4E, 0x90, 0xEC, 0x57, 0xEB, 0x54, 0xE9, 0x0E, 0xE5,
+ 0x7E, 0x95, 0x4E, 0x90, 0xF8, 0x10, 0x57, 0xE6, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4F, 0x62, 0x00, 0xE4, 0x7E, 0x68, 0xE0,
+ 0x2F, 0x52, 0x00, 0xF7, 0x10, 0x57, 0xE7, 0x54, 0xE9, 0x0F,
+ 0x81, 0x05, 0x75, 0x75, 0x7E, 0x25, 0x4E, 0x90, 0xF8, 0x10,
+ 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0F, 0x71, 0x05, 0xA7, 0xE5,
+ 0x54, 0xE9, 0x0F, 0x71, 0x05, 0x7E, 0x75, 0x4E, 0x90, 0xED,
+ 0x57, 0x57, 0x57, 0xE6, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xEE, 0x57, 0xE9, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x7E,
+ 0x65, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xF6, 0x20, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x12, 0xF5, 0x20, 0x0F, 0x71, 0x05, 0x7E, 0x75,
+ 0x4E, 0x90, 0xF8, 0x10, 0x57, 0x5A, 0x7E, 0x25, 0x4E, 0x90,
+ 0xF7, 0x10, 0x5C, 0x7E, 0x35, 0x4E, 0x90, 0xF8, 0x10, 0x57,
+ 0x57, 0xE4, 0x54, 0xE9, 0x0E, 0xF5, 0x7E, 0x85, 0x4E, 0x90,
+ 0xED, 0x57, 0x55, 0x7E, 0x75, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0E, 0xE5, 0x7E, 0x95, 0x4E, 0x90, 0xF8, 0x10, 0x57,
+ 0xE6, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4F, 0x62, 0x00, 0xE4,
+ 0x7E, 0x58, 0xE1, 0x2F, 0x52, 0x00, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x81, 0x05, 0x7E, 0x65, 0x4E, 0x90, 0xF8, 0x10, 0x57,
+ 0x57, 0xE4, 0x54, 0xE9, 0x0E, 0xF5, 0xB7, 0xE5, 0x54, 0xE9,
+ 0x0E, 0xF5, 0x75, 0x77, 0xE5, 0x54, 0xE9, 0x0E, 0xD5, 0x75,
+ 0x57, 0xE7, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xEE,
+ 0x57, 0xE9, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x7E, 0x65, 0x4E,
+ 0x90, 0xEC, 0x5E, 0x37, 0xE2, 0x54, 0xF6, 0x20, 0x0E, 0x37,
+ 0xE6, 0x8E, 0x12, 0xF5, 0x20, 0x0F, 0x71, 0x05, 0x7E, 0x75,
+ 0x4E, 0x90, 0xF9, 0x10, 0x5A, 0x7E, 0x35, 0x4E, 0x90, 0xF8,
+ 0x10, 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x7E,
+ 0x65, 0x4E, 0x90, 0xEE, 0x57, 0x55, 0x77, 0xE5, 0x54, 0xE9,
+ 0x0E, 0xE5, 0x77, 0x57, 0xE6, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xEF, 0x57, 0xE8, 0x54, 0xE9, 0x0F, 0x71, 0x05,
+ 0x7E, 0x75, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xF5, 0x20, 0x0E,
+ 0x47, 0xE6, 0x8E, 0x12, 0xF5, 0x20, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xF5, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x22, 0xF5, 0x20, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xF5, 0x20, 0x0E, 0x37, 0xE6, 0x8E, 0x22,
+ 0xF5, 0x20, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xF4, 0x20, 0x0E, 0x47,
+ 0xE6, 0x8E, 0x22, 0xF6, 0x20, 0x0F, 0x62, 0x04, 0xEA, 0x0F,
+ 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
+ 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F,
+ 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
+ 0xEA, 0x0F, 0x62, 0x04, 0xF4, 0x20, 0x0E, 0x47, 0xE6, 0x8E,
+ 0x22, 0xFF, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x32, 0xFF, 0x52,
+ 0x0E, 0x37, 0xE6, 0x8E, 0x32, 0xF5, 0x20, 0x0A, 0x7A, 0x0C,
+ 0x70, 0xC7, 0xB0, 0xC7, 0x07, 0xA0, 0x7F, 0x71, 0x00, 0xC7,
+ 0x07, 0xA0, 0x7F, 0xC2, 0x00, 0x7C, 0x0A, 0x70, 0x7A, 0x07,
+ 0x0C, 0x7F, 0x32, 0x00, 0xA7, 0x00, 0xB7, 0x00, 0xC7, 0x07,
+ 0xA0, 0x7D, 0x07, 0x07, 0xF8, 0x10, 0x0A, 0x70, 0x07, 0xD0,
+ 0xA7, 0xA0, 0xB7, 0x0C, 0x7D, 0x07, 0x07, 0xEA, 0x07, 0xA0,
+ 0x70, 0x0A, 0x70, 0x07, 0xA0, 0x70, 0xC7, 0xF0, 0x20, 0x0C,
+ 0x70, 0xB7, 0xB0, 0x7B, 0x0B, 0x70, 0xC7, 0xFA, 0x10, 0x0B,
+ 0x7A, 0x0A, 0x70, 0x0A, 0x70, 0x7A, 0x07, 0x0C, 0x7F, 0xD1,
+ 0x00, 0xA7, 0xB0, 0x7A, 0x0C, 0x7F, 0x62, 0x00, 0xC7, 0x00,
+ 0xA7, 0x00, 0xB7, 0x00, 0x7A, 0x07, 0xA0, 0x7A, 0x0C, 0x7F,
+ 0x72, 0x00, 0xE4, 0x7E, 0x68, 0xE3, 0x2F, 0x52, 0x00, 0x70,
+ 0x07, 0x00, 0x7C, 0x07, 0xE1, 0x07, 0xC0, 0x77, 0x00, 0x7F,
+ 0x71, 0x00, 0x7C, 0x07, 0x70, 0x07, 0xFC, 0x20, 0x07, 0xD0,
+ 0x70, 0x07, 0x70, 0x07, 0x07, 0xF6, 0x20, 0x07, 0xA0, 0x70,
+ 0x7A, 0x07, 0x07, 0xC0, 0x77, 0x00, 0x7D, 0x07, 0x07, 0xF7,
+ 0x10, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x70, 0x7C, 0x07,
+ 0xE3, 0x07, 0x07, 0xEA, 0x07, 0x70, 0x77, 0x07, 0xA0, 0x70,
+ 0x7A, 0x07, 0x07, 0xF4, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x00,
+ 0x70, 0x70, 0x07, 0xC0, 0x7F, 0xE1, 0x00, 0x7A, 0x07, 0x07,
+ 0xA0, 0x70, 0x07, 0x00, 0x77, 0x00, 0x7A, 0x07, 0xFE, 0x10,
+ 0x07, 0xA0, 0x70, 0x07, 0x07, 0xB0, 0x7F, 0x82, 0x00, 0x7C,
+ 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x07, 0x70, 0x77, 0x00, 0x70,
+ 0x7B, 0x07, 0xF9, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x42, 0xF5,
+ 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xE1, 0x07, 0xC0, 0x70,
+ 0x70, 0x7F, 0x71, 0x00, 0x7C, 0x07, 0x07, 0x07, 0xFC, 0x20,
+ 0x07, 0xD0, 0x70, 0x07, 0x07, 0x07, 0x07, 0xF6, 0x20, 0x07,
+ 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xC0, 0x70, 0x70, 0x7C, 0x0C,
+ 0x7E, 0xF0, 0x7C, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xC0, 0x7E,
+ 0x20, 0xC7, 0xE9, 0x07, 0x07, 0x07, 0x07, 0xA0, 0x70, 0x7A,
+ 0x07, 0x07, 0xF4, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xA0,
+ 0x70, 0x7C, 0x07, 0xFE, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07,
+ 0x00, 0x70, 0x07, 0x07, 0x07, 0xA0, 0x7F, 0xE1, 0x00, 0x7C,
+ 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x07, 0xC0, 0x7A, 0x07,
+ 0x07, 0xA0, 0x70, 0x70, 0x70, 0x70, 0x7A, 0x07, 0xA0, 0x7F,
+ 0x92, 0x00, 0xE4, 0x7E, 0x58, 0xE4, 0x2F, 0x52, 0x00, 0x7A,
+ 0x07, 0x0A, 0x7A, 0x0A, 0x7D, 0x0A, 0x7A, 0x07, 0x07, 0x07,
+ 0xF7, 0x10, 0x0A, 0x7A, 0x07, 0x07, 0x07, 0xFC, 0x20, 0x07,
+ 0xD0, 0x70, 0x07, 0x07, 0x07, 0x0A, 0x7F, 0x42, 0x00, 0x7A,
+ 0x07, 0x0B, 0x70, 0x0A, 0x7A, 0x07, 0x07, 0x07, 0xD0, 0x70,
+ 0x7F, 0x71, 0x00, 0x7C, 0x07, 0xC0, 0x7A, 0x07, 0x00, 0xA7,
+ 0x00, 0xA7, 0xE1, 0x07, 0x07, 0xEA, 0x07, 0x07, 0x07, 0x07,
+ 0xA0, 0x70, 0x7A, 0x07, 0x0A, 0x7F, 0x22, 0x00, 0xA7, 0xA0,
+ 0xB7, 0x00, 0x7A, 0x07, 0x00, 0xA7, 0x00, 0xA7, 0xFC, 0x10,
+ 0x0B, 0x70, 0x07, 0xA0, 0x70, 0x07, 0x00, 0x70, 0x70, 0x7A,
+ 0x07, 0xFE, 0x10, 0x07, 0xC0, 0x7A, 0x07, 0xA0, 0x7F, 0x82,
+ 0x00, 0xA7, 0xA0, 0x7A, 0x07, 0x0B, 0x70, 0x07, 0x07, 0x07,
+ 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x0E, 0x47, 0xE6, 0x8E,
+ 0x42, 0xF5, 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xE1, 0x07,
+ 0xC0, 0x70, 0x07, 0x7F, 0x71, 0x00, 0x7C, 0x07, 0x00, 0x77,
+ 0xFC, 0x20, 0x07, 0xD0, 0x70, 0x07, 0x00, 0x77, 0x07, 0xF6,
+ 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0, 0x70, 0x07, 0x7C,
+ 0x0C, 0x7E, 0xF0, 0x7C, 0x07, 0xC0, 0x7A, 0x07, 0xC0, 0x70,
+ 0x7E, 0x20, 0xC7, 0xE9, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x00,
+ 0x70, 0x70, 0x07, 0xF4, 0x20, 0x07, 0xC0, 0x70, 0x7A, 0x0C,
+ 0x7C, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xC0, 0x7A, 0x07, 0x00,
+ 0x70, 0x07, 0x00, 0x77, 0xA0, 0x7F, 0xE1, 0x00, 0x7C, 0x0C,
+ 0x7A, 0x07, 0xF8, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0x07,
+ 0xA0, 0x7A, 0x07, 0x0C, 0x7A, 0x07, 0xF8, 0x20, 0x0E, 0x47,
+ 0xE6, 0x8E, 0x42, 0xF5, 0x20, 0x07, 0x00, 0x70, 0x07, 0xC0,
+ 0x7E, 0x10, 0x7C, 0x07, 0xA0, 0x7F, 0x71, 0x00, 0x7C, 0x07,
+ 0xA0, 0x7F, 0xC2, 0x00, 0x7D, 0x07, 0x00, 0x7A, 0x07, 0x07,
+ 0xF6, 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0, 0x7A, 0x07,
+ 0xD0, 0x70, 0x7F, 0x71, 0x00, 0x7A, 0x07, 0x07, 0xC0, 0x7A,
+ 0x07, 0xC0, 0x70, 0x7E, 0x30, 0x70, 0x7E, 0xA0, 0x7A, 0x07,
+ 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00, 0x7F, 0x42, 0x00, 0x7C,
+ 0x07, 0x00, 0x70, 0x07, 0xA0, 0x7C, 0x07, 0x07, 0xFE, 0x10,
+ 0x07, 0xC0, 0x7A, 0x07, 0x00, 0x70, 0x07, 0xA0, 0x7A, 0x07,
+ 0xFE, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x82,
+ 0x00, 0x7C, 0x07, 0xA0, 0x70, 0x70, 0x07, 0x00, 0x7A, 0x07,
+ 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x0E, 0x47, 0xE5, 0x8E,
+ 0x52, 0xF5, 0x20, 0x0A, 0x7A, 0x0C, 0x70, 0x7E, 0x10, 0x7C,
+ 0x07, 0xA0, 0x7F, 0x71, 0x00, 0x7C, 0x07, 0xA0, 0x7F, 0xC2,
+ 0x00, 0xC7, 0x0A, 0x70, 0x7A, 0x07, 0x0C, 0x7F, 0x32, 0x00,
+ 0xA7, 0x00, 0x7C, 0x0C, 0x70, 0x7A, 0x07, 0xD0, 0x70, 0x7F,
+ 0x81, 0x00, 0xA7, 0x00, 0xC7, 0x00, 0xA7, 0x00, 0xB7, 0x00,
+ 0xC7, 0xD0, 0x70, 0x7E, 0xA0, 0x7A, 0x07, 0x00, 0xA7, 0xB0,
+ 0x7A, 0x0C, 0x7F, 0x02, 0x00, 0xC7, 0x07, 0xA0, 0x70, 0x7A,
+ 0x07, 0x0B, 0x70, 0x0C, 0x7F, 0xA1, 0x00, 0x7D, 0x0A, 0x70,
+ 0x0A, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0xF1, 0x00, 0xA7, 0x00,
+ 0x7A, 0x07, 0xA0, 0x7F, 0x82, 0x00, 0x7D, 0x0A, 0x70, 0x07,
+ 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20,
+ 0x0E, 0x37, 0xE6, 0x8E, 0x52, 0xFC, 0x52, 0x0E, 0x47, 0xE6,
+ 0x8E, 0x52, 0xFC, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xFC,
+ 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xFC, 0x52, 0x0E, 0x37,
+ 0xE6, 0x8E, 0x62, 0xFB, 0x52, 0x0E, 0x47, 0xE6, 0x8E, 0x52,
+ 0x1F, 0xB5, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x21, 0xFB, 0x52,
+ 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0x1F, 0xA5, 0x20, 0xE4, 0x7E,
+ 0x68, 0xE6, 0x21, 0xFA, 0x52, 0x0E, 0x47, 0xE6, 0x8E, 0x52,
+ 0x11, 0xFA, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0x11, 0xFA,
+ 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0x11, 0xF9, 0x52, 0x0E,
+ 0x47, 0xE6, 0x8E, 0x52, 0xA1, 0xF1, 0x40, 0x0B, 0x20, 0xA2,
+ 0x02, 0xA0, 0x2F, 0x92, 0x00, 0xA2, 0xA0, 0xA2, 0xA0, 0xB2,
+ 0xF5, 0x20, 0x0C, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xF7, 0x20,
+ 0x0A, 0x20, 0x2A, 0x02, 0x0C, 0x2F, 0x82, 0x00, 0xB2, 0x00,
+ 0x2A, 0x02, 0x0A, 0x2F, 0x92, 0x00, 0xB2, 0x0C, 0x20, 0xB2,
+ 0xE1, 0x02, 0xFF, 0x10, 0x0A, 0x20, 0x02, 0xA0, 0x20, 0xB2,
+ 0xE1, 0x02, 0xFF, 0x10, 0x0A, 0x2A, 0x0A, 0x20, 0x0A, 0x2A,
+ 0x0C, 0x2F, 0x02, 0x00, 0xB2, 0x00, 0xC2, 0x0C, 0x20, 0x2A,
+ 0x02, 0xF0, 0x20, 0x0C, 0x2A, 0x02, 0xA0, 0xB2, 0xFA, 0x10,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xA1, 0xF0, 0x40, 0x02, 0xD0,
+ 0x20, 0x02, 0x20, 0x02, 0xF8, 0x20, 0x02, 0xA0, 0x20, 0x2A,
+ 0x02, 0x02, 0xFB, 0x20, 0x02, 0xB0, 0x20, 0x20, 0x02, 0x20,
+ 0x02, 0xF8, 0x20, 0x02, 0x00, 0x22, 0x00, 0x2A, 0x02, 0xFA,
+ 0x20, 0x02, 0xA0, 0x20, 0x22, 0x00, 0x20, 0x20, 0x02, 0xF7,
+ 0x20, 0x02, 0xE0, 0x02, 0xA0, 0x2A, 0x02, 0xD0, 0xB2, 0xFC,
+ 0x10, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0x02, 0xA0, 0x2D, 0x0B,
+ 0x2F, 0xC1, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x20, 0x02,
+ 0x00, 0x2F, 0x42, 0x00, 0x2A, 0x02, 0x02, 0xC0, 0x2C, 0x02,
+ 0x00, 0x2F, 0x32, 0x00, 0x2B, 0x02, 0x02, 0x00, 0x2A, 0x02,
+ 0xF9, 0x10, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xA1, 0xF0, 0x40,
+ 0x02, 0xD0, 0x20, 0x02, 0x02, 0x02, 0xF8, 0x20, 0x02, 0xC0,
+ 0x2A, 0x02, 0x02, 0xFB, 0x20, 0x02, 0xA0, 0x2A, 0x02, 0x02,
+ 0x02, 0x02, 0xF8, 0x20, 0x02, 0x00, 0x20, 0x20, 0x2A, 0x02,
+ 0xFA, 0x20, 0x02, 0xA0, 0x20, 0x20, 0x20, 0x20, 0x2A, 0x02,
+ 0xF6, 0x20, 0x02, 0xE0, 0x02, 0xA0, 0x2A, 0x02, 0xC0, 0x20,
+ 0x2F, 0xE1, 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xC0,
+ 0x20, 0x2F, 0xE1, 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02,
+ 0x02, 0xF4, 0x20, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xC0, 0x20,
+ 0x2F, 0x42, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xF9,
+ 0x10, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xA1, 0xF1, 0x40, 0x0A,
+ 0x2A, 0x02, 0x00, 0x20, 0x20, 0x2F, 0x82, 0x00, 0x2C, 0x02,
+ 0xA0, 0x20, 0x0A, 0x2F, 0x82, 0x00, 0x2A, 0x02, 0xA0, 0x20,
+ 0x20, 0x20, 0x2F, 0x82, 0x00, 0x20, 0x02, 0x02, 0x02, 0xA0,
+ 0x2F, 0xA2, 0x00, 0xB2, 0x00, 0x20, 0x20, 0x20, 0x2A, 0x02,
+ 0xF7, 0x20, 0x0A, 0x2B, 0x02, 0xA0, 0xB2, 0xE0, 0x0A, 0x2F,
+ 0xD1, 0x00, 0x2C, 0x0C, 0x20, 0xB2, 0xE0, 0x0A, 0x2F, 0xD1,
+ 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0x0A, 0x2F, 0x22,
+ 0x00, 0xB2, 0x00, 0xA2, 0xA0, 0xA2, 0xA0, 0x22, 0xF5, 0x20,
+ 0x02, 0xA0, 0x2A, 0x02, 0x0B, 0x2F, 0x91, 0x00, 0xE4, 0x7E,
+ 0x68, 0xE5, 0x2B, 0x1F, 0x44, 0x00, 0x20, 0x02, 0x00, 0x20,
+ 0x02, 0x2F, 0x82, 0x00, 0x2C, 0x02, 0xA0, 0x2C, 0x02, 0xF7,
+ 0x20, 0x02, 0xA0, 0xC2, 0x02, 0x00, 0x22, 0xF8, 0x20, 0x02,
+ 0x00, 0x20, 0x02, 0x2A, 0x02, 0xFA, 0x20, 0x02, 0x02, 0xA0,
+ 0x20, 0x02, 0x20, 0x2A, 0x02, 0xFA, 0x20, 0x02, 0xA0, 0x2A,
+ 0x02, 0x02, 0xE2, 0x02, 0x02, 0xFC, 0x10, 0x02, 0xC0, 0x2A,
+ 0x02, 0x02, 0x02, 0xE2, 0x02, 0x02, 0xFC, 0x10, 0x02, 0xC0,
+ 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2F, 0x42, 0x00, 0x2C, 0x02,
+ 0xC0, 0x2C, 0x02, 0x02, 0xF4, 0x20, 0x02, 0xA0, 0xC2, 0x02,
+ 0xA0, 0x2F, 0x81, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2B, 0x1F,
+ 0x44, 0x00, 0x20, 0x02, 0x00, 0x2A, 0x02, 0xF8, 0x20, 0x02,
+ 0xA0, 0x20, 0x2A, 0x02, 0xC0, 0x2F, 0x72, 0x00, 0x2A, 0x02,
+ 0xA0, 0x20, 0x2A, 0x02, 0xF8, 0x20, 0x02, 0x00, 0x2A, 0x02,
+ 0xA0, 0x2F, 0xA2, 0x00, 0x20, 0x02, 0x00, 0x2A, 0x02, 0x02,
+ 0x00, 0x2F, 0xB2, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x02, 0xD0,
+ 0xB2, 0xFD, 0x10, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0x02, 0x00,
+ 0x2D, 0x0B, 0x2F, 0xD1, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20,
+ 0x20, 0x02, 0x00, 0x2F, 0x42, 0x00, 0x2C, 0x02, 0xC0, 0x2C,
+ 0x02, 0x00, 0x2F, 0x32, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x2A,
+ 0x02, 0xF8, 0x10, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xB1, 0xF0,
+ 0x40, 0x0B, 0x20, 0x0A, 0x20, 0x2A, 0x02, 0xF9, 0x20, 0x0A,
+ 0x2A, 0x0A, 0x20, 0x0B, 0x2F, 0x82, 0x00, 0x2A, 0x02, 0xA0,
+ 0x20, 0x2A, 0x02, 0xF7, 0x20, 0x0A, 0x20, 0x2A, 0x02, 0xA0,
+ 0x2F, 0xA2, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0xA2, 0xF8,
+ 0x20, 0x0B, 0x2B, 0x02, 0xA0, 0x2A, 0x02, 0xE0, 0x02, 0xFF,
+ 0x10, 0x0A, 0x20, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xE0, 0x02,
+ 0xFF, 0x10, 0x0A, 0x2A, 0x0A, 0x20, 0x0A, 0x2A, 0x0C, 0x2F,
+ 0x02, 0x00, 0x2C, 0x0C, 0x20, 0xC2, 0x02, 0xA0, 0x2F, 0x22,
+ 0x00, 0x2A, 0x02, 0xA0, 0x20, 0xB2, 0xF8, 0x10, 0x0E, 0x47,
+ 0xE6, 0x8E, 0x52, 0xC1, 0xF7, 0x52, 0x0E, 0x47, 0xE6, 0x8E,
+ 0x52, 0xC1, 0xF7, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xC1,
+ 0xF7, 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xC1, 0xF0, 0x40,
+ 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62,
+ 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA,
+ 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62,
+ 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0x0E,
+ 0x47, 0xE6, 0x8E, 0x52, 0xD1, 0xF0, 0x40, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE4, 0x7E, 0x68, 0xE5, 0x2D, 0x1F, 0x04, 0x00, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x47, 0xE5, 0x8E, 0x62, 0xD1, 0xF0, 0x40,
+ 0x0D, 0x5C, 0x9E, 0x45, 0x7E, 0x85, 0x4E, 0x90, 0xC5, 0x99,
+ 0xA5, 0x99, 0xE5, 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0C, 0x5E,
+ 0x09, 0xD5, 0x7E, 0xC5, 0x4E, 0x90, 0xB5, 0xD9, 0xE8, 0x57,
+ 0xE5, 0x54, 0xE9, 0x0D, 0x5D, 0x9E, 0x35, 0x7E, 0x85, 0x4E,
+ 0x90, 0xD5, 0x99, 0x55, 0x99, 0xE1, 0x57, 0xA5, 0x7A, 0x57,
+ 0x5A, 0x7C, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65,
+ 0xA7, 0x55, 0xB7, 0xC5, 0x4E, 0x90, 0xD5, 0xD9, 0xE5, 0x57,
+ 0xA5, 0xC7, 0xC5, 0x4E, 0x90, 0xD5, 0xC9, 0xFB, 0x10, 0x54,
+ 0xE9, 0x0C, 0x5D, 0x9F, 0xB1, 0x05, 0x4E, 0x37, 0xE6, 0x8E,
+ 0x62, 0xD1, 0xF0, 0x40, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x25,
+ 0x7E, 0x95, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE4, 0x57,
+ 0xA5, 0x7E, 0x35, 0x4E, 0x90, 0xC5, 0x99, 0xE5, 0x57, 0xEB,
+ 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0x7E, 0x65,
+ 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x65, 0x7E, 0x75, 0x4E, 0x90,
+ 0xD5, 0x99, 0x55, 0x99, 0xE0, 0x57, 0x57, 0x55, 0x77, 0x55,
+ 0x75, 0x75, 0x57, 0xB5, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99,
+ 0xE5, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0xB5, 0x4E, 0x90, 0xE1,
+ 0x59, 0x9E, 0x65, 0x75, 0x7B, 0x57, 0xE0, 0x54, 0xE9, 0x0C,
+ 0x59, 0x9A, 0x59, 0x9E, 0x85, 0x77, 0xE2, 0x54, 0xE9, 0x0C,
+ 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x37, 0xE6, 0x8E,
+ 0x52, 0xE0, 0x1F, 0x04, 0x00, 0xC5, 0x99, 0xA5, 0x99, 0xE1,
+ 0x57, 0xA5, 0xC7, 0xE2, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x95,
+ 0x99, 0xE3, 0x57, 0xC5, 0x7E, 0x25, 0x4E, 0x90, 0xC5, 0x99,
+ 0xE6, 0x57, 0x55, 0xC7, 0xE3, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
+ 0x59, 0x9E, 0x55, 0x7E, 0x75, 0x4E, 0x90, 0xE1, 0x59, 0x9E,
+ 0x75, 0x7E, 0x65, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xD5,
+ 0x7A, 0x57, 0x57, 0x57, 0x57, 0x57, 0xA5, 0x7A, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x55, 0x7A, 0x57, 0x57, 0xA5,
+ 0x7B, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE5, 0x57, 0xA5, 0x7A,
+ 0x57, 0xE0, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x85,
+ 0x77, 0xE2, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1,
+ 0x05, 0x4E, 0x37, 0xE5, 0x8E, 0x62, 0xE0, 0x1F, 0x04, 0x00,
+ 0xC5, 0x99, 0xA5, 0x99, 0xE0, 0x57, 0xEB, 0x54, 0xE9, 0x0C,
+ 0x59, 0x95, 0x95, 0x99, 0xE2, 0x57, 0xE0, 0x57, 0xE1, 0x54,
+ 0xE9, 0x0C, 0x59, 0x9E, 0x75, 0x7E, 0x95, 0x4E, 0x90, 0xB5,
+ 0x99, 0xA5, 0x99, 0xE4, 0x57, 0xE8, 0x54, 0xE9, 0x0E, 0x15,
+ 0x99, 0xE8, 0x57, 0xE5, 0x54, 0xE9, 0x0D, 0x59, 0x95, 0x59,
+ 0x9D, 0x57, 0xA5, 0x75, 0x75, 0x75, 0x75, 0x7A, 0x57, 0xA5,
+ 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE5, 0x57, 0xA5, 0x75,
+ 0xB7, 0xC5, 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x55, 0x7A, 0x57,
+ 0xA5, 0x7E, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA,
+ 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0xA5, 0x75,
+ 0x7D, 0x54, 0xE2, 0x7E, 0x68, 0xE6, 0x2E, 0x01, 0xF0, 0x40,
+ 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x15, 0x7E, 0xA5, 0x4E, 0x90,
+ 0xC5, 0x99, 0x59, 0x59, 0x9E, 0x35, 0x7C, 0x57, 0xE2, 0x54,
+ 0xE9, 0x0C, 0x5C, 0x9E, 0x35, 0x7E, 0xA5, 0x4E, 0x90, 0xB5,
+ 0xD9, 0xE6, 0x57, 0xE7, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE7,
+ 0x57, 0xE6, 0x54, 0xE9, 0x0E, 0x05, 0xB9, 0xE0, 0x5C, 0x75,
+ 0x75, 0x57, 0x75, 0x7A, 0x57, 0xA5, 0x4E, 0x90, 0xB5, 0x99,
+ 0xA5, 0x99, 0xE5, 0x57, 0xA5, 0x75, 0x75, 0x7D, 0x54, 0xE9,
+ 0x0E, 0x15, 0x99, 0xE5, 0x5C, 0x7A, 0x57, 0xE0, 0x54, 0xE9,
+ 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5,
+ 0xD9, 0xEB, 0x57, 0x57, 0xD5, 0x4E, 0x27, 0xE6, 0x8E, 0x52,
+ 0xE1, 0x1F, 0x04, 0x00, 0xC5, 0x99, 0xA5, 0x99, 0xE2, 0x57,
+ 0x55, 0xC7, 0xE2, 0x54, 0xE9, 0x0C, 0x5E, 0x09, 0xE4, 0x57,
+ 0xA5, 0x7E, 0x35, 0x4E, 0x90, 0xC5, 0x99, 0xE5, 0x57, 0xA5,
+ 0xC7, 0xE3, 0x54, 0xE9, 0x0B, 0x59, 0x95, 0x99, 0xE8, 0x57,
+ 0xE6, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE6, 0x57, 0xE7, 0x54,
+ 0xE9, 0x0E, 0x15, 0x99, 0xE1, 0x57, 0xA5, 0x75, 0x7A, 0x57,
+ 0x57, 0x55, 0x7B, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E,
+ 0x55, 0x7A, 0x57, 0x57, 0x55, 0x7C, 0x54, 0xE9, 0x0E, 0x15,
+ 0x99, 0xE5, 0x57, 0xA5, 0x7A, 0x57, 0xE0, 0x54, 0xE9, 0x0C,
+ 0x59, 0x9A, 0x59, 0x9E, 0x85, 0x77, 0xE2, 0x54, 0xE9, 0x0C,
+ 0x59, 0x9F, 0xF1, 0x05, 0x4E, 0x27, 0xE6, 0x8E, 0x52, 0xE1,
+ 0x1F, 0x04, 0x00, 0xC5, 0x99, 0xA5, 0x99, 0xE3, 0x57, 0xE8,
+ 0x54, 0xE9, 0x0C, 0x5E, 0x09, 0xE5, 0x57, 0x57, 0xE4, 0x54,
+ 0xE9, 0x0C, 0x59, 0x9E, 0x45, 0x7E, 0xC5, 0x4E, 0x90, 0xB5,
+ 0x99, 0x55, 0x99, 0xE8, 0x57, 0xE5, 0x54, 0xE9, 0x0E, 0x15,
+ 0x99, 0xE5, 0x57, 0xE8, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE1,
+ 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x5A, 0x7C, 0x54, 0xE9, 0x0B,
+ 0x59, 0x9A, 0x59, 0x9E, 0x65, 0xA7, 0x55, 0x7A, 0x57, 0xB5,
+ 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x55, 0x7A, 0x57, 0xA5, 0x7E,
+ 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE9, 0x57, 0xE2,
+ 0x54, 0xE9, 0x0C, 0x59, 0x9F, 0xF1, 0x05, 0x4E, 0x27, 0xE5,
+ 0x8E, 0x62, 0xE1, 0x1F, 0x04, 0x00, 0xC5, 0xB9, 0x59, 0x9F,
+ 0xA1, 0x05, 0x4E, 0x90, 0xD5, 0xC9, 0xFB, 0x10, 0x54, 0xE9,
+ 0x0C, 0x59, 0x9F, 0xF1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0x55,
+ 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xFC, 0x10,
+ 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0B,
+ 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xE1, 0x59,
+ 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE8,
+ 0x57, 0xE3, 0x54, 0xE9, 0x0C, 0x59, 0x9F, 0xF1, 0x05, 0x4E,
+ 0x17, 0xE6, 0x8E, 0x62, 0xE1, 0x1F, 0x04, 0x00, 0xC5, 0x99,
+ 0x5B, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x59, 0x9F,
+ 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xE1,
+ 0x59, 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xE1, 0x59, 0x9F, 0xC1,
+ 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54,
+ 0xE9, 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0C, 0x59,
+ 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF,
+ 0x10, 0x54, 0xE1, 0x7E, 0x68, 0xE5, 0x2E, 0x21, 0xF0, 0x40,
+ 0x0D, 0x5C, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x59,
+ 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0xE0, 0x9F, 0xA1, 0x05,
+ 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9,
+ 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0E, 0x15, 0x99,
+ 0xFC, 0x10, 0x54, 0xE9, 0x0C, 0x5C, 0x9F, 0xC1, 0x05, 0x4E,
+ 0x90, 0xD5, 0xD9, 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x5C, 0x9F,
+ 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE1,
+ 0x7E, 0x68, 0xE5, 0x2E, 0x21, 0xF0, 0x40, 0x0E, 0x35, 0x99,
+ 0xFA, 0x10, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x17, 0xE5, 0x8E, 0x62, 0xE2, 0x1F,
+ 0x04, 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x07, 0xE6, 0x8E, 0x62,
+ 0xE2, 0x1F, 0x04, 0x00, 0xE3, 0x5B, 0x95, 0x59, 0xD5, 0xA9,
+ 0x55, 0xC9, 0xC5, 0x4E, 0x90, 0xE2, 0x5A, 0x9A, 0x5B, 0x9B,
+ 0x59, 0xA5, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x5B, 0x95,
+ 0x5C, 0x95, 0x9A, 0x59, 0xC5, 0x4E, 0x90, 0xE9, 0x5B, 0x95,
+ 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5, 0x4E, 0x90, 0xE4, 0x5B,
+ 0x9B, 0x59, 0xA5, 0x9A, 0x59, 0x5A, 0x9D, 0x54, 0xE9, 0x05,
+ 0x5B, 0x95, 0x5C, 0x95, 0xC9, 0x59, 0xA5, 0x95, 0xB9, 0x55,
+ 0x9A, 0x59, 0x54, 0xE9, 0x0F, 0x91, 0x05, 0xA9, 0x5C, 0x9B,
+ 0x54, 0xE9, 0x0E, 0x05, 0xA9, 0x59, 0xA5, 0x95, 0xB9, 0x55,
+ 0x9A, 0x59, 0x5C, 0x9B, 0x54, 0xE9, 0x0E, 0x35, 0xB9, 0xA5,
+ 0xA9, 0x55, 0x9A, 0x59, 0x5C, 0x9C, 0x54, 0xE9, 0x0E, 0x25,
+ 0xB9, 0x55, 0xB9, 0x55, 0xA9, 0x59, 0xA5, 0x95, 0xC9, 0x55,
+ 0x4E, 0x07, 0xE6, 0x8E, 0x52, 0xE3, 0x1F, 0x04, 0x00, 0xE3,
+ 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54,
+ 0xE9, 0x0E, 0x25, 0x95, 0x59, 0x55, 0x9A, 0x59, 0x55, 0x95,
+ 0x95, 0x59, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x95, 0x9A, 0x59,
+ 0x59, 0xC5, 0x99, 0x59, 0x9C, 0x54, 0xE9, 0x0E, 0x95, 0x9A,
+ 0x59, 0x59, 0xA5, 0x95, 0x99, 0x55, 0x9C, 0x54, 0xE9, 0x0E,
+ 0x45, 0x9A, 0x59, 0x55, 0x95, 0x95, 0x59, 0x95, 0x59, 0x59,
+ 0x55, 0x9C, 0x54, 0xE9, 0x05, 0x59, 0xA5, 0x95, 0x9E, 0x05,
+ 0x9A, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x95, 0x59, 0x54,
+ 0xE9, 0x0F, 0xA1, 0x05, 0x95, 0x59, 0xE1, 0x54, 0xE9, 0x0E,
+ 0x15, 0x95, 0x59, 0x95, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59,
+ 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x9A, 0x59, 0x59, 0xA5,
+ 0x95, 0x95, 0x59, 0x55, 0x9E, 0x25, 0x4E, 0x90, 0xE2, 0x59,
+ 0xA5, 0x95, 0x9A, 0x59, 0x55, 0x95, 0x59, 0x95, 0x59, 0xA5,
+ 0x9B, 0x54, 0xE0, 0x7E, 0x58, 0xE6, 0x2E, 0x31, 0xF0, 0x40,
+ 0x0E, 0x35, 0x9A, 0x59, 0x59, 0xC5, 0x9A, 0x59, 0xA5, 0x9E,
+ 0x05, 0x4E, 0x90, 0xE2, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59,
+ 0xA5, 0x95, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x59, 0xA5,
+ 0x95, 0x9C, 0x59, 0x59, 0x59, 0xC5, 0x4E, 0x90, 0xE9, 0x59,
+ 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x59, 0x59, 0xC5, 0x4E, 0x90,
+ 0xE4, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x59, 0x59, 0x59,
+ 0xA5, 0x9B, 0x54, 0xE9, 0x05, 0x59, 0xA5, 0x95, 0x9E, 0x05,
+ 0x9A, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x59, 0x59, 0x54,
+ 0xE9, 0x0F, 0xA1, 0x05, 0x95, 0x59, 0xE1, 0x54, 0xE9, 0x0E,
+ 0x15, 0x95, 0x59, 0x59, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59,
+ 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x9A, 0x59, 0x59, 0xA5,
+ 0x95, 0x95, 0x9A, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x25, 0x9A,
+ 0x59, 0x59, 0xA5, 0x95, 0x59, 0x55, 0x95, 0x95, 0x9A, 0x59,
+ 0xB5, 0x4D, 0x7E, 0x68, 0xE6, 0x2E, 0x31, 0xF0, 0x40, 0x0E,
+ 0x35, 0xB9, 0x55, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54,
+ 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x5B, 0x95, 0x59, 0xA5, 0x95,
+ 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x5B, 0x95, 0x5A, 0x9A,
+ 0x59, 0x59, 0x59, 0xC5, 0x4E, 0x90, 0xE9, 0x5B, 0x95, 0x59,
+ 0xA5, 0x95, 0x95, 0x95, 0x9C, 0x54, 0xE9, 0x0E, 0x45, 0xB9,
+ 0x55, 0x9A, 0x59, 0x59, 0x59, 0x59, 0x59, 0xA5, 0x9B, 0x54,
+ 0xE9, 0x05, 0x5B, 0x95, 0x5A, 0x9C, 0x59, 0xA5, 0x9A, 0x59,
+ 0x5B, 0x95, 0x59, 0x59, 0x59, 0x54, 0xE9, 0x0F, 0xA1, 0x05,
+ 0x95, 0x5A, 0x9D, 0x54, 0xE9, 0x0E, 0x15, 0x95, 0x59, 0x59,
+ 0x59, 0x5B, 0x95, 0x59, 0xA5, 0x9A, 0x59, 0xD5, 0x4E, 0x90,
+ 0xE3, 0x5B, 0x95, 0x59, 0xA5, 0x95, 0x99, 0xB5, 0xA9, 0xE0,
+ 0x54, 0xE9, 0x0E, 0x25, 0xB9, 0x55, 0xB9, 0xA5, 0x95, 0x59,
+ 0x59, 0x59, 0xA5, 0x9B, 0x54, 0xD7, 0xE6, 0x8E, 0x52, 0xE4,
+ 0x1F, 0x04, 0x00, 0xE3, 0x59, 0xC5, 0x9C, 0x59, 0xA5, 0x9A,
+ 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x59, 0x59,
+ 0xA5, 0xC9, 0x59, 0x59, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x59,
+ 0x59, 0xA5, 0x9C, 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x95,
+ 0x95, 0x9A, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x9C, 0x54, 0xE9,
+ 0x0E, 0x45, 0x95, 0x9A, 0x5C, 0x95, 0x95, 0x59, 0x95, 0x9A,
+ 0x59, 0xB5, 0x4E, 0x90, 0x55, 0x95, 0x9A, 0x59, 0xE0, 0x59,
+ 0xA5, 0x9A, 0x59, 0x59, 0x59, 0xA5, 0x95, 0x59, 0x95, 0x4E,
+ 0x90, 0xFA, 0x10, 0x59, 0x55, 0x9E, 0x15, 0x4E, 0x90, 0xE1,
+ 0x59, 0x55, 0x95, 0x59, 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59,
+ 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0x59,
+ 0xA5, 0x9E, 0x25, 0x4E, 0x90, 0xE2, 0x59, 0xC5, 0x95, 0x9B,
+ 0x59, 0x55, 0x95, 0x59, 0x9A, 0x59, 0xB5, 0x4D, 0x7E, 0x68,
+ 0xE5, 0x2E, 0x41, 0xF0, 0x40, 0x0E, 0x35, 0x9C, 0x59, 0xC5,
+ 0x9A, 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90, 0xE2, 0x59, 0x55,
+ 0x95, 0x59, 0x55, 0x95, 0x59, 0xA5, 0x95, 0x95, 0x95, 0x9D,
+ 0x54, 0xE9, 0x0E, 0x95, 0x95, 0x59, 0x55, 0x9C, 0x59, 0xA5,
+ 0x9C, 0x54, 0xE9, 0x0E, 0x95, 0x95, 0x59, 0x55, 0x9A, 0x59,
+ 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x45, 0x95, 0x59, 0x55,
+ 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x95, 0x59, 0xC5, 0x4E, 0x90,
+ 0x55, 0x95, 0x59, 0x55, 0x9E, 0x05, 0x9A, 0x59, 0xA5, 0x95,
+ 0x95, 0x59, 0x55, 0x9A, 0x59, 0x54, 0xE9, 0x0F, 0xA1, 0x05,
+ 0x95, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x15, 0x95, 0x59, 0xA5,
+ 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE3,
+ 0x59, 0xC5, 0x9A, 0x59, 0x59, 0x55, 0x95, 0x59, 0xE2, 0x54,
+ 0xE9, 0x0E, 0x25, 0x9C, 0x59, 0x55, 0x9A, 0x59, 0x55, 0x9A,
+ 0x59, 0xA5, 0x9B, 0x54, 0xD7, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
+ 0x04, 0x00, 0xE3, 0x59, 0xC5, 0xC9, 0x55, 0xA9, 0xB5, 0x9E,
+ 0x05, 0x4E, 0x90, 0xE2, 0x5A, 0x9A, 0x59, 0xA5, 0x95, 0x9A,
+ 0x59, 0x55, 0x95, 0x9E, 0x05, 0x4E, 0x90, 0xE9, 0x59, 0xA5,
+ 0x95, 0xC9, 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x95, 0x9A,
+ 0x59, 0x55, 0xA9, 0x55, 0x9A, 0x59, 0xC5, 0x4E, 0x90, 0xE4,
+ 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0xA9, 0xD5,
+ 0x4E, 0x90, 0x55, 0x9A, 0x59, 0x5C, 0x9A, 0x59, 0xB5, 0xA9,
+ 0x55, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x4E, 0x90, 0xF9, 0x10,
+ 0x5A, 0x95, 0x9E, 0x15, 0x4E, 0x90, 0xE0, 0x5A, 0x95, 0x9A,
+ 0x59, 0x59, 0xD5, 0xA9, 0xB5, 0x9D, 0x54, 0xE9, 0x0E, 0x35,
+ 0x9D, 0x5A, 0x95, 0x59, 0xA5, 0x95, 0xC9, 0xC5, 0x4E, 0x90,
+ 0xE2, 0x59, 0xC5, 0x9A, 0x59, 0x5A, 0x95, 0x9A, 0x59, 0xA5,
+ 0x9B, 0x54, 0xC7, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x04, 0x00,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4C, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0,
+ 0x40, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xC7, 0xE5, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x24, 0x00, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E,
+ 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6,
+ 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E,
+ 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6,
+ 0x20, 0x4C, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E,
+ 0x37, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x05, 0x20, 0xE4, 0x7E,
+ 0x68, 0xE5, 0x2E, 0x51, 0xF3, 0x40, 0x07, 0xB0, 0xB7, 0x07,
+ 0xA0, 0x7F, 0x82, 0x00, 0x7B, 0x0A, 0x7A, 0x0B, 0x7F, 0x82,
+ 0x00, 0x7A, 0x0C, 0x70, 0x7A, 0x07, 0xF6, 0x20, 0x07, 0xA0,
+ 0x70, 0xC7, 0x0B, 0x70, 0x0A, 0x70, 0xC7, 0x07, 0xA0, 0x7E,
+ 0xF0, 0x7A, 0x07, 0x0C, 0x70, 0xB7, 0xA0, 0xA7, 0x00, 0xC7,
+ 0xFA, 0x10, 0x0A, 0x7F, 0x43, 0x00, 0xA7, 0xF5, 0x30, 0x0A,
+ 0x70, 0x7A, 0x07, 0xFE, 0x20, 0x0A, 0x70, 0x07, 0xA0, 0x70,
+ 0xC7, 0xF9, 0x20, 0x0B, 0x7F, 0x91, 0x00, 0xE4, 0x7E, 0x58,
+ 0xE6, 0x2E, 0x41, 0xF3, 0x40, 0x07, 0x07, 0x00, 0x7C, 0x07,
+ 0x70, 0x07, 0xF7, 0x20, 0x07, 0x07, 0x00, 0x7A, 0x07, 0x07,
+ 0xFB, 0x20, 0x07, 0x07, 0xB0, 0x7A, 0x07, 0x70, 0x07, 0xF6,
+ 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x70, 0x07, 0x00,
+ 0x7C, 0x07, 0xA0, 0x7E, 0xF0, 0x77, 0x07, 0x70, 0x7C, 0x07,
+ 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xF8, 0x30,
+ 0x07, 0xF6, 0x30, 0x07, 0x00, 0x77, 0x00, 0x7F, 0xD2, 0x00,
+ 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xFA, 0x20, 0x07, 0xB0,
+ 0x7F, 0x81, 0x00, 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41, 0xF2,
+ 0x40, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0x07, 0x07, 0xF6, 0x20,
+ 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xFA, 0x20, 0x07, 0xA0, 0x7A,
+ 0x07, 0xA0, 0x70, 0x70, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x07,
+ 0xC0, 0x7A, 0x07, 0x00, 0x70, 0x07, 0xC0, 0x7A, 0x07, 0xEF,
+ 0x07, 0x07, 0x07, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xC0, 0x7F,
+ 0xE1, 0x00, 0x7F, 0x83, 0x00, 0x7F, 0x63, 0x00, 0x70, 0x07,
+ 0x07, 0x07, 0xFD, 0x20, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0,
+ 0x7F, 0x92, 0x00, 0x70, 0x07, 0x70, 0x07, 0xEF, 0x0E, 0x47,
+ 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x24, 0x00, 0x7A, 0x07, 0x00,
+ 0xA7, 0x00, 0x70, 0x70, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x07,
+ 0xD0, 0xA7, 0xF7, 0x20, 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x70,
+ 0x70, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x0A, 0x7A, 0x0B, 0x7A,
+ 0x07, 0x00, 0xA7, 0xB0, 0xA7, 0xF7, 0x10, 0x07, 0x07, 0x07,
+ 0x0A, 0x7A, 0x0B, 0x70, 0x07, 0x0A, 0x70, 0xA7, 0xFC, 0x10,
+ 0x07, 0xF8, 0x30, 0x07, 0xF6, 0x30, 0x07, 0x00, 0x70, 0x70,
+ 0x7F, 0xD2, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF9,
+ 0x20, 0x07, 0x07, 0xB0, 0x7E, 0xF0, 0xE4, 0x7E, 0x68, 0xE5,
+ 0x2E, 0x41, 0xF3, 0x40, 0x0C, 0x7C, 0x07, 0x07, 0x00, 0x77,
+ 0xF6, 0x20, 0x0C, 0x70, 0x7E, 0x20, 0x7F, 0x62, 0x00, 0xC7,
+ 0xA0, 0x7A, 0x07, 0x00, 0x77, 0xF7, 0x20, 0x07, 0x07, 0x00,
+ 0x7C, 0x07, 0x07, 0xB0, 0x70, 0x07, 0xE0, 0x07, 0xF8, 0x10,
+ 0x07, 0xA0, 0x70, 0x7C, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0x07,
+ 0xFE, 0x10, 0x07, 0xF8, 0x30, 0x07, 0xF6, 0x30, 0x07, 0x00,
+ 0x70, 0x07, 0x7F, 0xD2, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A,
+ 0x07, 0xF9, 0x20, 0x07, 0x07, 0xB0, 0x7E, 0xF0, 0xE4, 0x7E,
+ 0x58, 0xE6, 0x2E, 0x41, 0xF3, 0x40, 0x07, 0xA0, 0x7C, 0x07,
+ 0x07, 0xA0, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7C,
+ 0x07, 0xF6, 0x20, 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x7A, 0x07,
+ 0xF7, 0x20, 0x07, 0x07, 0x00, 0x7C, 0x07, 0x00, 0x7A, 0x07,
+ 0x00, 0x7E, 0x00, 0x7F, 0x81, 0x00, 0x7A, 0x07, 0x07, 0xC0,
+ 0x70, 0x07, 0x00, 0x7A, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xF8,
+ 0x30, 0x07, 0xF6, 0x30, 0x07, 0x00, 0x7A, 0x07, 0xFD, 0x20,
+ 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x92, 0x00, 0x70,
+ 0x07, 0x70, 0x07, 0xEF, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x34, 0x00, 0x7A, 0x07, 0x0B, 0x70, 0x07, 0xA0, 0x7F,
+ 0x62, 0x00, 0x7A, 0x07, 0x00, 0xA7, 0x00, 0xB7, 0xF7, 0x20,
+ 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x07,
+ 0xA0, 0xC7, 0x07, 0xA0, 0x70, 0xA7, 0x07, 0xE0, 0x07, 0xF8,
+ 0x10, 0x07, 0xA0, 0x70, 0xC7, 0x07, 0xA0, 0x70, 0x0B, 0x70,
+ 0xC7, 0xFA, 0x10, 0x0A, 0x7F, 0x43, 0x00, 0xA7, 0xF5, 0x30,
+ 0x0A, 0x70, 0x7A, 0x07, 0xFE, 0x20, 0x0A, 0x7A, 0x0A, 0x7B,
+ 0x07, 0xFA, 0x20, 0x07, 0xB0, 0x7E, 0xF0, 0xE4, 0x7E, 0x68,
+ 0xE5, 0x2E, 0x51, 0xF5, 0x32, 0x0B, 0x7F, 0x71, 0x00, 0xE4,
+ 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5,
+ 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x68, 0xE5,
+ 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47, 0xE6, 0x8E, 0x52, 0xE5,
+ 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20,
+ 0xE4, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58,
+ 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62,
+ 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x68, 0xE5, 0x2E, 0x51,
+ 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x35,
+ 0x00, 0xB2, 0x00, 0xC2, 0xA0, 0x2A, 0x0A, 0x2F, 0x22, 0x00,
+ 0xB2, 0x00, 0xC2, 0x00, 0xB2, 0x0C, 0x20, 0x0A, 0x20, 0x0B,
+ 0x20, 0x0C, 0x2E, 0x70, 0xA2, 0xC0, 0x2A, 0x0C, 0x2A, 0x02,
+ 0xF3, 0x20, 0x0B, 0x20, 0x0A, 0x20, 0x02, 0xA0, 0x2F, 0x82,
+ 0x00, 0x2A, 0x0B, 0x2A, 0x0B, 0x2F, 0x72, 0x00, 0xB2, 0x00,
+ 0xA2, 0x00, 0xB2, 0xF7, 0x20, 0x02, 0xA0, 0x2A, 0x02, 0xA0,
+ 0x2F, 0xA2, 0x00, 0x2C, 0x0C, 0x20, 0x2A, 0x02, 0xF6, 0x20,
+ 0x02, 0xA0, 0x20, 0x0B, 0x20, 0xB2, 0xF6, 0x30, 0x0E, 0x37,
+ 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x35, 0x00, 0x2A, 0x02, 0x02,
+ 0xD0, 0x20, 0x20, 0x02, 0x00, 0x2F, 0x12, 0x00, 0x2A, 0x02,
+ 0x02, 0xC0, 0x2E, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x2A, 0x02,
+ 0x02, 0xEB, 0x02, 0x00, 0x2A, 0x02, 0x02, 0xB0, 0x2B, 0x02,
+ 0x02, 0xF1, 0x20, 0x02, 0xC0, 0x2A, 0x02, 0x02, 0x20, 0x02,
+ 0xF7, 0x20, 0x02, 0x02, 0x00, 0x2A, 0x02, 0x02, 0xFA, 0x20,
+ 0x02, 0xC0, 0x2A, 0x02, 0x02, 0xA0, 0x2F, 0x62, 0x00, 0x2A,
+ 0x02, 0x00, 0x20, 0x20, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2C,
+ 0x02, 0x20, 0x02, 0xF6, 0x20, 0x02, 0xA0, 0x20, 0x2C, 0x02,
+ 0xA0, 0x2F, 0x43, 0x00, 0xE4, 0x7E, 0x68, 0xE5, 0x2E, 0x51,
+ 0xF3, 0x50, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xA0, 0x20, 0x2A,
+ 0x02, 0xF0, 0x20, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xE0, 0x02,
+ 0xA0, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2E, 0xB0, 0x2A, 0x02,
+ 0x02, 0xA0, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xF0, 0x20, 0x02,
+ 0xC0, 0x2C, 0x02, 0x02, 0x02, 0xF6, 0x20, 0x02, 0xA0, 0x20,
+ 0x2A, 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2A, 0x02, 0x02,
+ 0xA0, 0x2F, 0x62, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2F,
+ 0xA2, 0x00, 0x2C, 0x02, 0xC0, 0x20, 0x20, 0x2F, 0x62, 0x00,
+ 0x2A, 0x02, 0x02, 0xC0, 0x2A, 0x02, 0xF4, 0x30, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x45, 0x00, 0xB2, 0x00, 0xA2,
+ 0xA0, 0x2A, 0x02, 0x02, 0xA0, 0x2F, 0x02, 0x00, 0xB2, 0x00,
+ 0xA2, 0xB0, 0xA2, 0xB0, 0x2A, 0x02, 0xA0, 0x20, 0xB2, 0x00,
+ 0xA2, 0xE9, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xA0, 0x2A, 0x02,
+ 0xA0, 0x2F, 0x12, 0x00, 0xA2, 0x00, 0x20, 0xA2, 0x02, 0x02,
+ 0x02, 0xF6, 0x20, 0x02, 0xA0, 0x20, 0xB2, 0xA0, 0xA2, 0xF8,
+ 0x20, 0x0A, 0x20, 0x02, 0xA0, 0x20, 0xB2, 0xF7, 0x20, 0x02,
+ 0xA0, 0x20, 0x2A, 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0xA2,
+ 0xA0, 0x20, 0x20, 0x2F, 0x62, 0x00, 0x2A, 0x02, 0x00, 0xA2,
+ 0x00, 0xB2, 0xF5, 0x30, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x45, 0x00, 0x20, 0x2A, 0x02, 0xC0, 0xC2, 0x02, 0xA0,
+ 0x2F, 0x02, 0x00, 0x20, 0x2A, 0x02, 0xE2, 0x02, 0xA0, 0x2A,
+ 0x02, 0xA0, 0x20, 0x20, 0x2A, 0x02, 0xEB, 0x02, 0xA0, 0x20,
+ 0xC2, 0xA0, 0x2A, 0x0C, 0x2F, 0x42, 0x00, 0x20, 0x2A, 0x02,
+ 0x02, 0x00, 0x22, 0xF6, 0x20, 0x0C, 0x20, 0x2A, 0x02, 0xC0,
+ 0x2F, 0xA2, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x92,
+ 0x00, 0x20, 0x20, 0x0C, 0x20, 0x2F, 0xA2, 0x00, 0x2C, 0x02,
+ 0xC0, 0x20, 0x02, 0x2F, 0x62, 0x00, 0x2A, 0x02, 0xC0, 0x20,
+ 0x20, 0x2F, 0x63, 0x00, 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41,
+ 0xF4, 0x50, 0x02, 0x00, 0x20, 0x02, 0xC0, 0x2A, 0x02, 0x02,
+ 0x00, 0x2F, 0x12, 0x00, 0x20, 0x02, 0x00, 0x2E, 0x20, 0x2A,
+ 0x02, 0xA0, 0x2A, 0x02, 0x02, 0x00, 0x20, 0x02, 0xEB, 0x02,
+ 0x00, 0x20, 0x02, 0xA0, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xF4,
+ 0x20, 0x02, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xF6, 0x20, 0x02,
+ 0xA0, 0x20, 0x2A, 0x02, 0xC0, 0x2F, 0xA2, 0x00, 0x20, 0x20,
+ 0x02, 0x00, 0x20, 0x02, 0xF8, 0x20, 0x02, 0x02, 0x00, 0x2A,
+ 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2C, 0x02, 0xA0, 0x2F,
+ 0x62, 0x00, 0x2A, 0x02, 0xC0, 0x20, 0x20, 0x02, 0xF4, 0x30,
+ 0x0E, 0x47, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x45, 0x00, 0x2A,
+ 0x02, 0x0C, 0x20, 0x2A, 0x02, 0x0A, 0x2F, 0x22, 0x00, 0x2A,
+ 0x02, 0x0C, 0x20, 0xB2, 0xB0, 0x2B, 0x0A, 0x20, 0x02, 0xA0,
+ 0x20, 0xC2, 0xE7, 0x0A, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xA0,
+ 0x2A, 0x02, 0xF0, 0x20, 0x0B, 0x2A, 0x0B, 0x20, 0x2A, 0x02,
+ 0xF6, 0x20, 0x02, 0xA0, 0x20, 0xB2, 0x00, 0xB2, 0xF7, 0x20,
+ 0x0B, 0x2A, 0x02, 0x20, 0x20, 0x2A, 0x02, 0xF8, 0x20, 0x02,
+ 0xA0, 0x2A, 0x02, 0x0C, 0x2F, 0x62, 0x00, 0xC2, 0x0C, 0x20,
+ 0x2A, 0x02, 0xF7, 0x20, 0x0A, 0x20, 0x0B, 0x20, 0x02, 0xA0,
+ 0x2F, 0x33, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
+ 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41, 0xF0, 0x52, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE5, 0x1F, 0x55, 0x00, 0xF6, 0x20, 0x5E,
+ 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6,
+ 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E,
+ 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6,
+ 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0x32, 0xE4, 0x1F, 0x65,
+ 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x22, 0xE4, 0x1F, 0x65, 0x00,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x12, 0xE5, 0x1F, 0x65, 0x00, 0xD5,
+ 0xA9, 0xC5, 0xB7, 0x5C, 0x75, 0x5A, 0x75, 0x5B, 0x7A, 0x54,
+ 0xE9, 0x0C, 0x5C, 0x9E, 0x15, 0x7A, 0x57, 0x55, 0xA7, 0x55,
+ 0xC7, 0xA5, 0x4E, 0x90, 0xB5, 0xC9, 0xD5, 0xB7, 0x5C, 0x75,
+ 0xC7, 0x5B, 0x75, 0x54, 0xE9, 0x0B, 0x5E, 0x09, 0xE1, 0x5C,
+ 0x75, 0x5A, 0x7E, 0x25, 0x4E, 0x90, 0xE0, 0x5B, 0x9A, 0x5C,
+ 0x75, 0x7A, 0x57, 0x5C, 0x75, 0x7A, 0x57, 0x54, 0xE9, 0x0C,
+ 0x59, 0x9A, 0x59, 0x9E, 0x45, 0x7E, 0x75, 0x4E, 0x90, 0xE2,
+ 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99,
+ 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE1, 0x2E, 0x41, 0xF7, 0x50, 0x0C,
+ 0x59, 0x95, 0x99, 0xA5, 0x7E, 0x05, 0x7A, 0x57, 0xA5, 0x75,
+ 0x7A, 0x57, 0x55, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE0,
+ 0x57, 0x75, 0x57, 0x57, 0xA5, 0x7A, 0x57, 0xC5, 0x4E, 0x90,
+ 0xB5, 0x99, 0x55, 0x99, 0xB5, 0x7E, 0x05, 0x7A, 0x57, 0xC5,
+ 0x7A, 0x57, 0x54, 0xE9, 0x0B, 0x59, 0x9E, 0x85, 0x7A, 0x57,
+ 0xA5, 0x7E, 0x15, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xB5,
+ 0x7A, 0x57, 0xA5, 0x75, 0x7C, 0x57, 0x75, 0x57, 0x54, 0xE9,
+ 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x35, 0xA7, 0xE6, 0x54, 0xE9,
+ 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A,
+ 0x59, 0x9E, 0x55, 0x7E, 0x65, 0x4E, 0x90, 0xD5, 0x99, 0xFE,
+ 0x10, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x12, 0xE4, 0x1F,
+ 0x75, 0x00, 0xC5, 0x99, 0x59, 0x9A, 0x57, 0xE0, 0x57, 0xA5,
+ 0x7A, 0x57, 0x57, 0xA5, 0x75, 0x54, 0xE9, 0x0B, 0x59, 0x9E,
+ 0x55, 0x75, 0x75, 0x75, 0x7A, 0x57, 0xA5, 0x7C, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9A, 0x59, 0x9A, 0x57, 0xE0, 0x57, 0xA5, 0x7C,
+ 0x57, 0xA5, 0x75, 0x4E, 0x90, 0xB5, 0x99, 0xE8, 0x57, 0xA5,
+ 0x7A, 0x57, 0xE1, 0x54, 0xE9, 0x0C, 0x59, 0x9E, 0x25, 0x7A,
+ 0x57, 0xA5, 0x75, 0x7C, 0x57, 0x57, 0x57, 0x54, 0xE9, 0x0C,
+ 0x59, 0x9A, 0x59, 0x9E, 0x25, 0x75, 0x75, 0x7E, 0x55, 0x4E,
+ 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99,
+ 0x55, 0x99, 0xE6, 0x57, 0xE6, 0x54, 0xE9, 0x0D, 0x59, 0x9E,
+ 0x65, 0xC7, 0xE5, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x12,
+ 0xE4, 0x1F, 0x75, 0x00, 0xB5, 0x99, 0xA5, 0x99, 0xA5, 0xA7,
+ 0xB5, 0x7A, 0x57, 0xA5, 0x75, 0xB7, 0xA5, 0x4E, 0x90, 0xB5,
+ 0x99, 0xE5, 0x57, 0x57, 0x57, 0x57, 0xA5, 0x7A, 0x57, 0xC5,
+ 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xB5, 0xA7, 0xB5, 0x7A,
+ 0x5A, 0x7A, 0x5B, 0x75, 0x54, 0xE9, 0x0B, 0x59, 0x9E, 0x85,
+ 0x7A, 0x57, 0xA5, 0x7E, 0x15, 0x4E, 0x90, 0xC5, 0x99, 0xE2,
+ 0x57, 0xA5, 0xC7, 0x5A, 0x7A, 0x57, 0x57, 0x57, 0x54, 0xE9,
+ 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x45, 0x7E, 0x75, 0x4E, 0x90,
+ 0xE2, 0x59, 0x9E, 0x25, 0xC7, 0xE6, 0x54, 0xE9, 0x0C, 0x59,
+ 0x95, 0x99, 0xE5, 0x5C, 0x7E, 0x45, 0x4E, 0x90, 0xD5, 0x99,
+ 0xFE, 0x10, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x02, 0xE5,
+ 0x1F, 0x75, 0x00, 0xB5, 0x99, 0xA5, 0x99, 0xD5, 0x7A, 0x57,
+ 0xA5, 0x7A, 0x57, 0x57, 0xD5, 0x4E, 0x90, 0xC5, 0xA9, 0xE3,
+ 0x57, 0x55, 0x77, 0x57, 0xA5, 0x7A, 0x57, 0xC5, 0x4E, 0x90,
+ 0xB5, 0x99, 0xA5, 0x99, 0xE0, 0x57, 0xA5, 0x7A, 0x57, 0xC5,
+ 0x7C, 0x54, 0xE9, 0x0B, 0x5C, 0x9E, 0x55, 0x7A, 0x57, 0xA5,
+ 0x7E, 0x15, 0x4E, 0x90, 0xC5, 0x99, 0xE2, 0x57, 0xA5, 0x7A,
+ 0x57, 0x57, 0xC5, 0x75, 0x57, 0x75, 0x4E, 0x90, 0xC5, 0xE0,
+ 0x9E, 0x45, 0x7E, 0x75, 0x4E, 0x90, 0xE2, 0x59, 0x9F, 0xB1,
+ 0x05, 0x4E, 0x90, 0xC5, 0xB9, 0xE8, 0x57, 0xE6, 0x54, 0xE9,
+ 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE0, 0x2E, 0x41, 0xF8, 0x50, 0x0B, 0x59, 0x9A, 0x59, 0x9D,
+ 0x57, 0xA5, 0x7A, 0x57, 0xA5, 0x75, 0x7D, 0x54, 0xE9, 0x0E,
+ 0x05, 0xA9, 0xE1, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0xA5, 0x7C,
+ 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x05, 0x7A, 0x57,
+ 0xA5, 0x7C, 0x57, 0xC5, 0x4E, 0x90, 0xB5, 0x99, 0xE8, 0x57,
+ 0xA5, 0x7A, 0x57, 0xE1, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x5A,
+ 0x9B, 0x57, 0xA5, 0x7A, 0x57, 0x57, 0xC5, 0x7A, 0x57, 0x54,
+ 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x45, 0x7E, 0x75, 0x4E,
+ 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0xB9,
+ 0xE8, 0x57, 0xE6, 0x54, 0xE9, 0x0D, 0x59, 0x9E, 0x65, 0xC7,
+ 0xE5, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x02, 0xE4, 0x1F,
+ 0x85, 0x00, 0xB5, 0xE0, 0x95, 0x5B, 0x7B, 0x57, 0xB5, 0xA7,
+ 0x55, 0x7D, 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xE0, 0x57, 0xA5,
+ 0x75, 0x5A, 0x7B, 0x57, 0xC5, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
+ 0x99, 0xA5, 0xB7, 0xB5, 0x7A, 0x5C, 0x75, 0x7C, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9E, 0x85, 0x7B, 0x5A, 0x7E, 0x25, 0x4E, 0x90,
+ 0xC5, 0x99, 0xA5, 0x99, 0xB5, 0x7A, 0x57, 0xA5, 0x75, 0xC7,
+ 0x57, 0xA5, 0x75, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE4,
+ 0x57, 0xE7, 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54,
+ 0xE9, 0x0C, 0x59, 0x95, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0D,
+ 0x59, 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0xC9, 0x59, 0xA5,
+ 0x95, 0xC9, 0x5C, 0x95, 0xB9, 0xC5, 0x4E, 0x02, 0xE4, 0x1F,
+ 0x85, 0x00, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9,
+ 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
+ 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xF0, 0x20,
+ 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E,
+ 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE4, 0x57, 0xE7, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5,
+ 0x99, 0x55, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F,
+ 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0x9C, 0x59, 0x95, 0x59, 0xA5,
+ 0x9A, 0x59, 0xC5, 0x9A, 0x59, 0xB5, 0x4D, 0x2E, 0x41, 0xF9,
+ 0x50, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90,
+ 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59,
+ 0x95, 0x59, 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xF0,
+ 0x20, 0x54, 0xE9, 0x0D, 0x59, 0x95, 0x59, 0x9F, 0xA1, 0x05,
+ 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9,
+ 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5,
+ 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F,
+ 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0x9C, 0x59, 0x59, 0x59, 0xA5,
+ 0x9A, 0x59, 0xC5, 0x9A, 0x59, 0xB5, 0x4D, 0x2E, 0x41, 0xF9,
+ 0x50, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90,
+ 0xC5, 0xC9, 0xFC, 0x10, 0x54, 0xE9, 0x0B, 0x5C, 0x9F, 0xD1,
+ 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xF0, 0x20, 0x54, 0xE9, 0x0E,
+ 0x05, 0xC9, 0xFA, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59,
+ 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5, 0xC9, 0xFC, 0x10, 0x54,
+ 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90,
+ 0xD5, 0xD9, 0xFA, 0x10, 0x54, 0xE9, 0x0C, 0x5A, 0x9A, 0x59,
+ 0x59, 0x59, 0xA5, 0x9A, 0x5A, 0x9A, 0x5B, 0x9C, 0x54, 0xD2,
+ 0xE4, 0x1F, 0x95, 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0C, 0x59, 0xC5, 0x95, 0x59, 0x9A,
+ 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xD5, 0x4C, 0x2E, 0x51, 0xF9,
+ 0x50, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xC5, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xA5, 0x9C,
+ 0x59, 0x55, 0x9C, 0x54, 0xC2, 0xE4, 0x1F, 0xA5, 0x00, 0xE7,
+ 0x59, 0xA5, 0x95, 0xC9, 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90,
+ 0xE5, 0x5B, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0x5C, 0x9B, 0x54,
+ 0xE9, 0x0E, 0x95, 0xA9, 0xA5, 0xA9, 0x59, 0xA5, 0x9E, 0x05,
+ 0x4E, 0x90, 0xE8, 0x5C, 0x95, 0x5A, 0x95, 0x5B, 0x9E, 0x05,
+ 0x4E, 0x90, 0xE5, 0x5A, 0x9A, 0x5A, 0x95, 0x5C, 0x95, 0x5A,
+ 0x9C, 0x54, 0xE9, 0x0C, 0x5A, 0x9A, 0x5A, 0x9A, 0x5B, 0x95,
+ 0x9A, 0x59, 0x5B, 0x9D, 0x54, 0xE9, 0x0E, 0x45, 0x9D, 0x5A,
+ 0x9B, 0x59, 0xA5, 0xA9, 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0xC5,
+ 0xA9, 0x55, 0xB9, 0x5C, 0x9E, 0x05, 0x4E, 0x90, 0xE7, 0x59,
+ 0xC5, 0xC9, 0x5C, 0x9E, 0x05, 0x4E, 0x90, 0xC5, 0xC9, 0x59,
+ 0xA5, 0x9A, 0x59, 0xA5, 0xC9, 0x59, 0xA5, 0x9B, 0x54, 0xC2,
+ 0xE4, 0x1F, 0xA5, 0x00, 0xE7, 0x59, 0x95, 0x59, 0x59, 0xC5,
+ 0x9A, 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x45, 0x9D, 0x59, 0x59,
+ 0x55, 0x9A, 0x59, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x95, 0x95,
+ 0x59, 0xA5, 0x95, 0x59, 0x95, 0x99, 0xE0, 0x54, 0xE9, 0x0E,
+ 0x85, 0x9C, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xD5, 0x4E, 0x90,
+ 0xE4, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xA5,
+ 0x9B, 0x54, 0xE9, 0x0B, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59,
+ 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x45,
+ 0x9C, 0x59, 0xA5, 0x95, 0x59, 0x59, 0x55, 0x95, 0x59, 0xC5,
+ 0x4E, 0x90, 0xE3, 0x59, 0xD5, 0x95, 0x59, 0xE0, 0x59, 0xE2,
+ 0x54, 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xE0, 0x59, 0xE2, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4C, 0x2E, 0x41, 0xFA, 0x50, 0x0E,
+ 0x75, 0x95, 0x95, 0x95, 0x9C, 0x59, 0xA5, 0x9E, 0x05, 0x4E,
+ 0x90, 0xE4, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9E,
+ 0x15, 0x4E, 0x90, 0xE9, 0x59, 0xA5, 0x95, 0x59, 0x55, 0x95,
+ 0x95, 0x9E, 0x05, 0x4E, 0x90, 0xE8, 0x59, 0xC5, 0x9A, 0x59,
+ 0x59, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
+ 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xB5, 0x4E, 0x90, 0xB5, 0x9C,
+ 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5,
+ 0x4E, 0x90, 0xE4, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95,
+ 0x9A, 0x59, 0xB5, 0x4E, 0x90, 0xE3, 0x59, 0xD5, 0x95, 0x59,
+ 0xE0, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xE0,
+ 0x59, 0xE2, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4B, 0x2E, 0x51,
+ 0xFA, 0x50, 0x0E, 0x75, 0x95, 0x95, 0x95, 0xA9, 0xA5, 0x9A,
+ 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x55, 0xA9, 0x55, 0x9A, 0x59,
+ 0x59, 0xA5, 0x95, 0xA9, 0xD5, 0x4E, 0x90, 0xE9, 0x59, 0xA5,
+ 0x95, 0x59, 0x55, 0x95, 0x95, 0x9E, 0x05, 0x4E, 0x90, 0xE8,
+ 0x5A, 0x9A, 0x59, 0xA5, 0x95, 0xB9, 0xE0, 0x54, 0xE9, 0x0E,
+ 0x45, 0x95, 0xA9, 0x59, 0xA5, 0x9A, 0x59, 0xA5, 0x9A, 0x59,
+ 0xB5, 0x4E, 0x90, 0xB5, 0x95, 0xA9, 0x59, 0xA5, 0x95, 0x5A,
+ 0x95, 0x59, 0xA5, 0x95, 0xB9, 0xD5, 0x4E, 0x90, 0xE4, 0x59,
+ 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xB5, 0x4E,
+ 0x90, 0xE3, 0x59, 0xD5, 0x9A, 0x5A, 0x9B, 0x59, 0xE2, 0x54,
+ 0xE9, 0x0E, 0x75, 0x9C, 0x5A, 0x9C, 0x59, 0xE2, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4B, 0x2E, 0x41, 0xFB, 0x50, 0x0E, 0x75,
+ 0x95, 0x59, 0x95, 0x9C, 0x59, 0x59, 0x59, 0xE0, 0x54, 0xE9,
+ 0x0E, 0x85, 0x95, 0xC9, 0x55, 0x95, 0x95, 0x59, 0xE1, 0x54,
+ 0xE9, 0x0E, 0x95, 0x9A, 0x59, 0x55, 0x95, 0x59, 0xA5, 0x9E,
+ 0x05, 0x4E, 0x90, 0xE8, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0x59,
+ 0xE1, 0x54, 0xE9, 0x0E, 0x45, 0x9A, 0x59, 0x59, 0xA5, 0x9A,
+ 0x59, 0xA5, 0x9A, 0x59, 0xB5, 0x4E, 0x90, 0xB5, 0x9A, 0x59,
+ 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5,
+ 0x4E, 0x90, 0xE4, 0x59, 0xC5, 0x9A, 0x59, 0x5C, 0x95, 0x9A,
+ 0x59, 0xB5, 0x4E, 0x90, 0xE3, 0x59, 0xD5, 0x9D, 0x59, 0xA5,
+ 0x9E, 0x25, 0x4E, 0x90, 0xE7, 0x59, 0xC5, 0x9E, 0x05, 0x9E,
+ 0x25, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xB2, 0xE4, 0x1F, 0xB5,
+ 0x00, 0xE7, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0x59, 0x59, 0xE0,
+ 0x54, 0xE9, 0x0E, 0x85, 0x95, 0x9A, 0x59, 0x55, 0x95, 0x95,
+ 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x95, 0x95, 0x59, 0xA5, 0x95,
+ 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90, 0xE8, 0x59, 0xC5, 0x9A,
+ 0x59, 0x59, 0x55, 0x9E, 0x05, 0x4E, 0x90, 0xE4, 0x59, 0xA5,
+ 0x95, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xA5, 0x9B, 0x54, 0xE9,
+ 0x0B, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5, 0x95, 0x9A, 0x59,
+ 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
+ 0x95, 0x9A, 0x59, 0x59, 0x55, 0x9C, 0x54, 0xE9, 0x0E, 0x35,
+ 0x9D, 0x59, 0xD5, 0x9A, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x75,
+ 0x9C, 0x59, 0xE0, 0x59, 0xE2, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4B, 0x2E, 0x41, 0xFB, 0x50, 0x0E, 0x75, 0x9A, 0x59, 0x5C,
+ 0x95, 0x59, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x45, 0xB9, 0x55,
+ 0x9A, 0x59, 0xA5, 0x9A, 0x5C, 0x9B, 0x54, 0xE9, 0x0E, 0x95,
+ 0xA9, 0xA5, 0xA9, 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90, 0xE8,
+ 0x59, 0xD5, 0xA9, 0x55, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE5,
+ 0x5B, 0x95, 0x5A, 0x9B, 0x59, 0xB5, 0xA9, 0xC5, 0x4E, 0x90,
+ 0xC5, 0xB9, 0x55, 0xA9, 0x55, 0xB9, 0xA5, 0xA9, 0x55, 0xB9,
+ 0xD5, 0x4E, 0x90, 0xE4, 0x5C, 0x95, 0x5A, 0x95, 0x59, 0xA5,
+ 0x95, 0xA9, 0xD5, 0x4E, 0x90, 0xE3, 0x5C, 0x95, 0xA9, 0x5B,
+ 0x9B, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x75, 0xC9, 0x5C, 0x9A,
+ 0x59, 0xE2, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4A, 0x2E, 0x41,
+ 0xFC, 0x50, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xA2, 0xE4, 0x1F, 0xC5,
+ 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4A, 0x2E, 0x41, 0xFD, 0x50, 0x0F,
+ 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
+ 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F,
+ 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
+ 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0x22, 0xE5,
+ 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x49, 0x00,
+ 0x7F, 0x63, 0x00, 0x7F, 0x93, 0x00, 0x7F, 0x33, 0x00, 0x7F,
+ 0x73, 0x00, 0xA7, 0x00, 0xA7, 0x0B, 0x7A, 0x0A, 0x70, 0x07,
+ 0xC0, 0xC7, 0xEF, 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x7E, 0x40,
+ 0x7F, 0xF1, 0x00, 0xB7, 0x00, 0xA7, 0x00, 0xB7, 0x00, 0xC7,
+ 0x0C, 0x70, 0x7A, 0x07, 0xE0, 0x07, 0xE7, 0x07, 0xA0, 0xC7,
+ 0x0C, 0x70, 0xB7, 0xF6, 0x20, 0x0E, 0x37, 0xE6, 0x8E, 0x62,
+ 0xE4, 0x1F, 0xE5, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x73, 0x00,
+ 0x7F, 0x73, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53, 0x00, 0x7A,
+ 0x07, 0x00, 0x70, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xC0,
+ 0x7F, 0xA1, 0x00, 0x7A, 0x07, 0x00, 0x70, 0x70, 0x07, 0xE3,
+ 0x0B, 0x7F, 0xC1, 0x00, 0x7C, 0x07, 0xA0, 0x70, 0x7A, 0x07,
+ 0x07, 0xC0, 0x7C, 0x07, 0x70, 0x07, 0xD0, 0xB7, 0xE4, 0x07,
+ 0x07, 0xB0, 0x7C, 0x07, 0xA0, 0x7A, 0x07, 0xF4, 0x20, 0x0E,
+ 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE5, 0x00, 0x70, 0x70,
+ 0x7F, 0x23, 0x00, 0x7F, 0x73, 0x00, 0x7F, 0x73, 0x00, 0x7F,
+ 0x53, 0x00, 0x7F, 0x53, 0x00, 0x7D, 0x07, 0x00, 0x7A, 0x07,
+ 0x07, 0xC0, 0x7C, 0x07, 0xFA, 0x10, 0x07, 0xA0, 0x70, 0x7A,
+ 0x07, 0x07, 0xE2, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xC0, 0x7C,
+ 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0, 0x70, 0x70, 0x7C, 0x07,
+ 0x07, 0xE5, 0x07, 0xA0, 0x7A, 0x07, 0xC0, 0x7A, 0x07, 0xA0,
+ 0x7F, 0x42, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x60, 0x07, 0xF3, 0x30, 0x07, 0xF8, 0x30, 0x07, 0xF5, 0x30,
+ 0x07, 0xF7, 0x30, 0x07, 0xF4, 0x30, 0x07, 0xD0, 0x70, 0x0B,
+ 0x70, 0x07, 0xC0, 0x7C, 0x0A, 0x7F, 0x81, 0x00, 0x7A, 0x07,
+ 0x07, 0xA0, 0x70, 0x7E, 0x30, 0xA7, 0xFE, 0x10, 0x0A, 0x70,
+ 0x07, 0xC0, 0xB7, 0x00, 0xA7, 0xA0, 0xA7, 0xA0, 0x70, 0x70,
+ 0x7D, 0x0A, 0x7E, 0x40, 0x7A, 0x07, 0xA0, 0x7C, 0x07, 0xA0,
+ 0xB7, 0xF5, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
+ 0x59, 0x00, 0x7F, 0x93, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53,
+ 0x00, 0x7F, 0x53, 0x00, 0x7D, 0x07, 0x00, 0x70, 0x7A, 0x07,
+ 0xC0, 0x7C, 0x07, 0xFB, 0x10, 0x07, 0x07, 0x00, 0xC7, 0x07,
+ 0xE4, 0x07, 0x07, 0xF0, 0x20, 0x07, 0x07, 0xC0, 0x70, 0x7A,
+ 0x07, 0xC0, 0x7C, 0x07, 0x00, 0x77, 0xE0, 0x07, 0x07, 0xE3,
+ 0x0C, 0x7A, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xF6, 0x20, 0x0E,
+ 0x37, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x59, 0x00, 0x7F, 0x93,
+ 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53, 0x00,
+ 0x7A, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0xA0, 0x70,
+ 0x7C, 0x07, 0xFB, 0x10, 0x07, 0x07, 0x00, 0x7A, 0x07, 0x07,
+ 0xE2, 0x0B, 0x7F, 0x12, 0x00, 0x70, 0x7A, 0x07, 0x07, 0x00,
+ 0x70, 0x07, 0xC0, 0x7C, 0x07, 0xA0, 0x7C, 0x0B, 0x7E, 0x40,
+ 0x7A, 0x07, 0xA0, 0x7C, 0x07, 0xA0, 0x70, 0x07, 0xF4, 0x20,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x69, 0x00, 0x7F,
+ 0xA3, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x33, 0x00, 0x7F, 0x73,
+ 0x00, 0xA7, 0x00, 0xA7, 0x07, 0xA0, 0x70, 0x0A, 0x70, 0x0C,
+ 0x70, 0xC7, 0xF8, 0x10, 0x07, 0xA0, 0x7A, 0x07, 0x0C, 0x7E,
+ 0x00, 0x7F, 0xE1, 0x00, 0xB7, 0xA0, 0xA7, 0x00, 0x7A, 0x07,
+ 0x0C, 0x70, 0xC7, 0x07, 0xA0, 0x7E, 0x00, 0x7E, 0x50, 0x7A,
+ 0x07, 0xA0, 0x7C, 0x07, 0xA0, 0x7A, 0x07, 0xF3, 0x20, 0x0E,
+ 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3, 0x7E,
+ 0x68, 0xE6, 0x2E, 0x41, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E,
+ 0x62, 0xE5, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E,
+ 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
+ 0x15, 0x20, 0xE3, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4,
+ 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5,
+ 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x68, 0xE5,
+ 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0xD7, 0x00,
+ 0x2C, 0x02, 0xA0, 0x2F, 0xC2, 0x00, 0xC2, 0x02, 0xA0, 0x20,
+ 0xB2, 0xF7, 0x20, 0x02, 0xC0, 0xB2, 0x00, 0xB2, 0x00, 0xA2,
+ 0x02, 0xA0, 0x20, 0xC2, 0xEF, 0x02, 0xC0, 0x2C, 0x0A, 0x20,
+ 0x0B, 0x20, 0xC2, 0xFC, 0x10, 0x0B, 0x20, 0x0A, 0x20, 0x2A,
+ 0x02, 0xF8, 0x20, 0x0A, 0x20, 0x2A, 0x02, 0x02, 0xA0, 0x20,
+ 0xC2, 0x02, 0xA0, 0x2E, 0x00, 0x2E, 0xD0, 0xB2, 0x00, 0xA2,
+ 0xF0, 0x80, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE7,
+ 0x00, 0x2C, 0x02, 0x20, 0x02, 0xFC, 0x20, 0x02, 0xC0, 0x2A,
+ 0x02, 0x02, 0xA0, 0x2F, 0x62, 0x00, 0x2C, 0x02, 0xA0, 0x20,
+ 0x2A, 0x02, 0x00, 0x20, 0x02, 0x20, 0x02, 0xA0, 0x2F, 0x81,
+ 0x00, 0x2C, 0x02, 0xD0, 0x20, 0x02, 0xE0, 0x02, 0xFE, 0x10,
+ 0x02, 0xA0, 0x20, 0x02, 0x00, 0x22, 0x00, 0x2F, 0x92, 0x00,
+ 0x20, 0x02, 0x20, 0x02, 0x02, 0x00, 0x20, 0x02, 0xC0, 0x2A,
+ 0x02, 0xD0, 0xB2, 0xEB, 0x02, 0xA0, 0x20, 0x02, 0xF1, 0x80,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE7, 0x00, 0x2C,
+ 0x02, 0x02, 0x02, 0xFC, 0x20, 0x02, 0xD0, 0x20, 0x20, 0x02,
+ 0xA0, 0x2F, 0x62, 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02,
+ 0x00, 0x20, 0x02, 0x02, 0x02, 0xA0, 0x2F, 0x81, 0x00, 0x2C,
+ 0x02, 0xD0, 0x20, 0x02, 0xE0, 0x02, 0xFE, 0x10, 0x02, 0xA0,
+ 0x20, 0x02, 0x00, 0x20, 0x20, 0x2F, 0x92, 0x00, 0x20, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0xA0, 0x2C, 0x02, 0xA0, 0x2C, 0x02,
+ 0x02, 0xED, 0x02, 0xA0, 0x20, 0x02, 0xF1, 0x80, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE7, 0x00, 0x2C, 0x02, 0x02,
+ 0x02, 0xFC, 0x20, 0x0A, 0x2C, 0x02, 0xA0, 0xB2, 0xF7, 0x20,
+ 0x02, 0xC0, 0xB2, 0x00, 0xB2, 0xA0, 0x20, 0x02, 0x02, 0x02,
+ 0xA0, 0x2F, 0x81, 0x00, 0x2C, 0x02, 0xD0, 0x2A, 0x0A, 0x2B,
+ 0x02, 0xFE, 0x10, 0x0B, 0x2A, 0x02, 0x00, 0x20, 0x20, 0x2F,
+ 0x92, 0x00, 0x20, 0x02, 0x02, 0x02, 0x02, 0x2B, 0x0A, 0x2B,
+ 0x0A, 0x2E, 0x00, 0xA2, 0xEC, 0x0B, 0x2A, 0x02, 0xF1, 0x80,
+ 0x0E, 0x37, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0xE7, 0x00, 0x2C,
+ 0x02, 0x00, 0x22, 0xFC, 0x20, 0x02, 0xD0, 0x20, 0x20, 0x02,
+ 0xFA, 0x20, 0x02, 0xC0, 0x2C, 0x02, 0x02, 0xB0, 0x20, 0x02,
+ 0x00, 0x22, 0xA0, 0x2F, 0x81, 0x00, 0x2C, 0x02, 0xD0, 0x2D,
+ 0x02, 0xA0, 0x2F, 0xE1, 0x00, 0x2A, 0x02, 0x00, 0x20, 0x02,
+ 0x00, 0x22, 0xF9, 0x20, 0x02, 0x00, 0x20, 0x02, 0x20, 0x20,
+ 0x2A, 0x02, 0xE0, 0x02, 0xE2, 0x02, 0x02, 0xEB, 0x02, 0xD0,
+ 0x2F, 0x08, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x51, 0xFE,
+ 0x70, 0x02, 0xC0, 0x2A, 0x02, 0xFC, 0x20, 0x02, 0xC0, 0x2A,
+ 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2C, 0x02, 0x00, 0x2A,
+ 0x02, 0x00, 0x2A, 0x02, 0xA0, 0x2F, 0x81, 0x00, 0x2C, 0x02,
+ 0xD0, 0x2D, 0x02, 0xA0, 0x2F, 0xE1, 0x00, 0x2A, 0x02, 0x00,
+ 0x20, 0x02, 0xA0, 0x2F, 0x92, 0x00, 0x20, 0x02, 0xA0, 0x20,
+ 0x20, 0x02, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0xB2, 0xEC, 0x02,
+ 0xD0, 0x2F, 0x08, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41,
+ 0xFF, 0x70, 0x0C, 0x20, 0x2A, 0x02, 0xFC, 0x20, 0x0C, 0x20,
+ 0x2A, 0x02, 0x02, 0xFA, 0x20, 0x0C, 0x20, 0x2C, 0x02, 0xA0,
+ 0x20, 0xA2, 0x02, 0xA0, 0x2A, 0x02, 0xF8, 0x10, 0x0C, 0x20,
+ 0xC2, 0x0A, 0x20, 0xB2, 0xB0, 0x2F, 0xE1, 0x00, 0xB2, 0x00,
+ 0xA2, 0x02, 0xA0, 0x2F, 0x82, 0x00, 0xA2, 0x02, 0xA0, 0x20,
+ 0x2A, 0x02, 0x0C, 0x2A, 0x02, 0xE2, 0x02, 0xED, 0x02, 0xC0,
+ 0xA2, 0xFF, 0x70, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F,
+ 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x51, 0xF0, 0x52,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4,
+ 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xFE, 0x30, 0x0F, 0x13, 0x05,
+ 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F,
+ 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05,
+ 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F,
+ 0x62, 0x05, 0xEA, 0x0F, 0x24, 0x05, 0xD1, 0xFE, 0x30, 0x0F,
+ 0x13, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF2, 0x40, 0x54, 0xC1, 0xFE, 0x30, 0x0F, 0x13, 0x05, 0x4E,
+ 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xEC, 0x5B, 0x95,
+ 0x5B, 0x95, 0x5C, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xEB, 0x54,
+ 0xB1, 0xFF, 0x30, 0x0E, 0x25, 0xC9, 0xB5, 0xA9, 0xB5, 0xD9,
+ 0xA5, 0xC9, 0xE3, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
+ 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x71, 0x05, 0xA7, 0xE5, 0x54,
+ 0xE9, 0x0F, 0x91, 0x05, 0x7E, 0x55, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xEC, 0x59, 0xA5, 0x95,
+ 0x9A, 0x59, 0x59, 0xD5, 0x95, 0x95, 0x59, 0x55, 0x9E, 0xC5,
+ 0x4B, 0x1F, 0xF3, 0x00, 0xE1, 0x59, 0x9A, 0x59, 0x95, 0x59,
+ 0x95, 0x99, 0xA5, 0x99, 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x9E,
+ 0x25, 0x4E, 0x90, 0xC5, 0xE0, 0x9E, 0x25, 0x77, 0xE8, 0x54,
+ 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x25, 0xA7, 0xE8, 0x54,
+ 0xE9, 0x0E, 0x05, 0xB9, 0xE4, 0x57, 0xA5, 0x7E, 0x45, 0x4E,
+ 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE6, 0x57, 0xE6, 0x54, 0xE9,
+ 0x0B, 0x5D, 0x9E, 0x85, 0x7E, 0x55, 0x4E, 0x90, 0xD5, 0x99,
+ 0xA5, 0x99, 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59,
+ 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0E,
+ 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xA5, 0x95,
+ 0x95, 0x9E, 0xD5, 0x4B, 0x1F, 0xF3, 0x00, 0xE1, 0x59, 0x9D,
+ 0x59, 0x9A, 0x59, 0x95, 0x59, 0x9A, 0x59, 0x95, 0x99, 0xE7,
+ 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xE3, 0x57, 0x7E, 0x85, 0x4E,
+ 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE1, 0x57, 0xA5, 0x7E, 0x75,
+ 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xE7, 0x57, 0xE4, 0x54,
+ 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0x7E, 0x65, 0x4E,
+ 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE5, 0x57, 0x57, 0x57, 0xE3,
+ 0x54, 0xE9, 0x0D, 0x5A, 0x95, 0x59, 0x9F, 0x91, 0x05, 0x4E,
+ 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9, 0x0A,
+ 0x5B, 0x75, 0x7A, 0x57, 0x57, 0xA5, 0x75, 0xB7, 0xA5, 0xA7,
+ 0x55, 0x7C, 0x54, 0xE9, 0x0E, 0xC5, 0xB9, 0x55, 0xB9, 0x55,
+ 0xA9, 0xA5, 0x9A, 0x59, 0x59, 0x9E, 0xE5, 0x4B, 0x1F, 0xF3,
+ 0x00, 0xE1, 0x59, 0x9D, 0x59, 0x9A, 0x59, 0x95, 0x5D, 0x9A,
+ 0x5C, 0x9E, 0x35, 0x4E, 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05,
+ 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x9E, 0x35, 0x7E, 0xA5, 0x4E,
+ 0x90, 0xC5, 0x99, 0xEB, 0x57, 0xE5, 0x54, 0xE9, 0x0B, 0x59,
+ 0x9A, 0x59, 0x9E, 0x55, 0x7E, 0x75, 0x4E, 0x90, 0xB5, 0x99,
+ 0xA5, 0x99, 0xE6, 0x5A, 0x7E, 0x45, 0x4E, 0x90, 0xD5, 0xA9,
+ 0x55, 0x99, 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x5A, 0x95, 0xA9,
+ 0xFA, 0x10, 0x54, 0xE9, 0x05, 0x57, 0xC5, 0x7A, 0x57, 0x57,
+ 0x75, 0x77, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x57, 0xC5, 0x4E,
+ 0x90, 0xEC, 0x59, 0xA5, 0x95, 0x95, 0x9A, 0x59, 0xC5, 0xC9,
+ 0x59, 0x59, 0xED, 0x54, 0xA1, 0xF0, 0x40, 0x0E, 0x15, 0x99,
+ 0xD5, 0xE0, 0x95, 0x59, 0x9E, 0x45, 0x99, 0xE2, 0x54, 0xE9,
+ 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95,
+ 0x99, 0xE2, 0x5A, 0x7E, 0x95, 0x4E, 0x90, 0xC5, 0x99, 0xEA,
+ 0x57, 0xE6, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x45,
+ 0x7E, 0x85, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE5, 0x57,
+ 0x57, 0x57, 0xE3, 0x54, 0xE9, 0x0D, 0x5B, 0x95, 0x99, 0xE2,
+ 0x57, 0x7E, 0x75, 0x4E, 0x90, 0xC5, 0xA9, 0x5A, 0x9E, 0x55,
+ 0x77, 0xE5, 0x54, 0xE9, 0x05, 0x57, 0xC5, 0x7A, 0x57, 0x57,
+ 0x57, 0x57, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x57, 0xC5, 0x4E,
+ 0x90, 0xEC, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x55, 0x9C, 0x59,
+ 0xA5, 0x95, 0x95, 0x59, 0xEC, 0x54, 0xA1, 0xF0, 0x40, 0x0E,
+ 0x15, 0x99, 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x95, 0x59, 0x9D,
+ 0x59, 0x9A, 0x59, 0x9E, 0x25, 0x4E, 0x90, 0xE1, 0x59, 0x9E,
+ 0x45, 0x77, 0xE8, 0x54, 0xE9, 0x0D, 0x5A, 0x9E, 0x45, 0x7E,
+ 0xA5, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9, 0x0C,
+ 0x59, 0x95, 0x99, 0xE5, 0x57, 0xE8, 0x54, 0xE9, 0x0B, 0x5D,
+ 0x9E, 0x85, 0x7E, 0x55, 0x4E, 0x90, 0xD5, 0x99, 0x59, 0x59,
+ 0x9E, 0x35, 0x7E, 0x75, 0x4E, 0x90, 0xC5, 0xE0, 0x9E, 0x55,
+ 0x77, 0xE5, 0x54, 0xE9, 0x0A, 0x5A, 0x7A, 0x5A, 0x75, 0x57,
+ 0x57, 0x57, 0x5B, 0x75, 0x57, 0xA5, 0x75, 0x7C, 0x54, 0xE9,
+ 0x0E, 0xC5, 0xB9, 0x55, 0x9A, 0x59, 0x5C, 0x95, 0x9A, 0x59,
+ 0x59, 0xA5, 0x9E, 0xB5, 0x4A, 0x1F, 0x04, 0x00, 0xE2, 0x5C,
+ 0x95, 0x59, 0x9A, 0x59, 0x95, 0x59, 0x9E, 0x05, 0xC9, 0xE3,
+ 0x54, 0xE9, 0x0E, 0x05, 0x99, 0xE5, 0x57, 0x7E, 0x85, 0x4E,
+ 0x90, 0xD5, 0xA9, 0xE3, 0x57, 0xEB, 0x54, 0xE9, 0x0C, 0x59,
+ 0x9E, 0xA5, 0x7E, 0x65, 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x9E,
+ 0x45, 0x7E, 0x95, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB,
+ 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x95, 0xB9, 0xE2, 0x57, 0xE8,
+ 0x54, 0xE9, 0x0C, 0x5E, 0x09, 0xFA, 0x10, 0x54, 0xE9, 0x0D,
+ 0x57, 0xA5, 0x7A, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x57, 0xA5,
+ 0x75, 0x7C, 0x54, 0xE9, 0x0F, 0x24, 0x05, 0x41, 0x1F, 0x14,
+ 0x00, 0xF1, 0x30, 0x54, 0xE9, 0x0E, 0x05, 0x99, 0xFD, 0x10,
+ 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x99, 0xE2, 0x5C, 0x7E, 0x75,
+ 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9, 0x0C, 0x59,
+ 0x95, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59,
+ 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0xA9, 0xF9,
+ 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x95, 0x99, 0xFA, 0x10,
+ 0x54, 0xE9, 0x0D, 0x57, 0xA5, 0x7A, 0x57, 0xA5, 0x75, 0x7A,
+ 0x57, 0x57, 0xA5, 0x75, 0x7C, 0x54, 0xE9, 0x0F, 0x24, 0x05,
+ 0x41, 0x1F, 0x14, 0x00, 0xF1, 0x30, 0x54, 0xE9, 0x0D, 0x59,
+ 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x9F, 0xC1,
+ 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9, 0x0C,
+ 0x59, 0x95, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
+ 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0xA9,
+ 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x95, 0x99, 0xFA,
+ 0x10, 0x54, 0xE9, 0x05, 0x5B, 0x7B, 0x57, 0xA5, 0x7A, 0x57,
+ 0x5B, 0x7A, 0x5A, 0x75, 0x5C, 0x75, 0x4E, 0x90, 0xE8, 0x5C,
+ 0x95, 0x5D, 0x9B, 0x5A, 0x9C, 0x5B, 0x95, 0x5E, 0x09, 0xE6,
+ 0x54, 0x11, 0xF1, 0x40, 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xD5,
+ 0x99, 0xFE, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F,
+ 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xFA, 0x10,
+ 0x54, 0xE9, 0x0D, 0x5A, 0x9F, 0xD1, 0x05, 0x4E, 0x90, 0xB5,
+ 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9A,
+ 0x59, 0x9F, 0x91, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x59,
+ 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0E,
+ 0x75, 0xE0, 0x95, 0xE0, 0x9A, 0x5A, 0x9B, 0x5D, 0x95, 0xE0,
+ 0x9E, 0x65, 0x41, 0x1F, 0x14, 0x00, 0xD5, 0xC9, 0x55, 0x99,
+ 0xA5, 0x99, 0x5D, 0x95, 0xE0, 0x95, 0xD9, 0xE0, 0x54, 0xE9,
+ 0x0C, 0x5E, 0x09, 0xFA, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
+ 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xE0, 0x5B, 0x9F, 0xB1,
+ 0x05, 0x4E, 0x90, 0xD5, 0xA9, 0xFD, 0x10, 0x54, 0xE9, 0x0B,
+ 0x5D, 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0xA5, 0x99,
+ 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0E, 0x75, 0x99,
+ 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x95, 0x59, 0x95, 0x99, 0x55,
+ 0xA9, 0x55, 0x99, 0x59, 0x9E, 0xB5, 0x41, 0xF2, 0x40, 0x0C,
+ 0x59, 0x9A, 0x59, 0x95, 0x99, 0xA5, 0x99, 0xA5, 0x99, 0xA5,
+ 0x99, 0xE1, 0x59, 0x9E, 0x25, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xE7, 0x59, 0x9D, 0x59, 0x9A, 0x59, 0x95,
+ 0x59, 0x95, 0x99, 0x55, 0x99, 0xD5, 0x99, 0xEB, 0x54, 0x1F,
+ 0x24, 0x00, 0xC5, 0x99, 0xD5, 0x99, 0xA5, 0x99, 0xA5, 0x99,
+ 0xA5, 0x99, 0xE1, 0x59, 0x9E, 0x25, 0x4E, 0x90, 0xE5, 0x5A,
+ 0x9A, 0x5A, 0x95, 0x5B, 0x95, 0x59, 0xA5, 0x9B, 0x54, 0xE9,
+ 0x0C, 0x5A, 0x95, 0x59, 0xC5, 0xC9, 0xA5, 0x9A, 0x5B, 0x9D,
+ 0x54, 0xE9, 0x0E, 0x35, 0xA9, 0xA5, 0xA9, 0x55, 0x9A, 0x59,
+ 0x5C, 0x9D, 0x54, 0xE9, 0x0E, 0x85, 0xA9, 0x55, 0x9D, 0x5B,
+ 0x9E, 0x05, 0x4E, 0x90, 0x5B, 0x9A, 0x5A, 0x95, 0x5B, 0x95,
+ 0x5A, 0x9A, 0x5C, 0x95, 0xB9, 0xA5, 0x4E, 0x90, 0xE3, 0x59,
+ 0xA5, 0x95, 0xC9, 0x59, 0xA5, 0x95, 0xC9, 0xC5, 0x4E, 0x90,
+ 0xD5, 0xB9, 0xB5, 0x9A, 0x59, 0xA5, 0x95, 0x5B, 0x95, 0xC9,
+ 0xA5, 0x4E, 0x90, 0xD5, 0xB7, 0x57, 0xA5, 0x75, 0xA7, 0x5C,
+ 0x75, 0xC7, 0xD5, 0x4E, 0x90, 0xE7, 0x5B, 0x9B, 0x59, 0x9A,
+ 0x59, 0x95, 0x99, 0xA5, 0x99, 0x59, 0x9D, 0x5C, 0x9E, 0x85,
+ 0x41, 0xF2, 0x40, 0x0D, 0x5C, 0x95, 0x5E, 0x09, 0xA5, 0x99,
+ 0xA5, 0xC9, 0xC5, 0x99, 0xE2, 0x54, 0xE9, 0x0E, 0x45, 0x9A,
+ 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x9B, 0x54,
+ 0xE9, 0x0B, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xD5, 0x95, 0x95,
+ 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x59,
+ 0xA5, 0x95, 0x99, 0x55, 0x9A, 0x59, 0xE1, 0x54, 0xE9, 0x0E,
+ 0x75, 0x9A, 0x59, 0x59, 0xC5, 0x9E, 0x45, 0x4E, 0x90, 0x59,
+ 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x55,
+ 0x9C, 0x59, 0xA5, 0x95, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0x55,
+ 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54, 0xE9, 0x0D,
+ 0x59, 0xA5, 0x95, 0x59, 0x59, 0x55, 0x9A, 0x59, 0x59, 0xC5,
+ 0x9E, 0x05, 0x4E, 0x90, 0xC5, 0x7C, 0x57, 0xA5, 0x75, 0x57,
+ 0x55, 0x7E, 0x05, 0x7E, 0x15, 0x4E, 0x90, 0xE8, 0x5C, 0x95,
+ 0x5E, 0x09, 0x59, 0x9A, 0x59, 0x95, 0x99, 0xD5, 0xC9, 0xE8,
+ 0x54, 0xF3, 0x40, 0x0E, 0x35, 0x99, 0x59, 0x9A, 0x59, 0x9A,
+ 0x59, 0x9A, 0x59, 0x9E, 0x15, 0x99, 0xE2, 0x54, 0xE9, 0x0E,
+ 0x45, 0x9C, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x9B,
+ 0x54, 0xE9, 0x0B, 0x59, 0xC5, 0x9C, 0x59, 0xC5, 0x9A, 0x59,
+ 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x25, 0x9C, 0x59, 0xA5,
+ 0x95, 0x95, 0x95, 0x9A, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x75,
+ 0x9C, 0x59, 0xC5, 0x9E, 0x45, 0x4E, 0x90, 0x59, 0xA5, 0x95,
+ 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xC5, 0x9A,
+ 0x59, 0x55, 0x4E, 0x90, 0xE3, 0x59, 0x59, 0x59, 0x59, 0xD5,
+ 0x95, 0x9B, 0x59, 0xE0, 0x54, 0xE9, 0x0D, 0x59, 0xA5, 0x95,
+ 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xE0, 0x54, 0xE9,
+ 0x0C, 0x57, 0xC5, 0x7A, 0x57, 0x55, 0x75, 0x57, 0xE0, 0x57,
+ 0xE1, 0x54, 0xE9, 0x0E, 0xA5, 0xB9, 0x5D, 0x95, 0x5E, 0x09,
+ 0x59, 0x9D, 0x59, 0x9E, 0xB5, 0x4F, 0x34, 0x00, 0xC5, 0x99,
+ 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x9A, 0x59, 0x9A, 0x59, 0x9E,
+ 0x15, 0x99, 0xE2, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
+ 0x95, 0xB9, 0xA5, 0xA9, 0xC5, 0x4E, 0x90, 0xB5, 0x9C, 0x59,
+ 0xC5, 0xA9, 0xA5, 0x9A, 0x59, 0x5B, 0x9D, 0x54, 0xE9, 0x0E,
+ 0x25, 0x9C, 0x59, 0xA5, 0x95, 0x95, 0x95, 0x9A, 0x59, 0xE1,
+ 0x54, 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xD5, 0xA9, 0xE1, 0x54,
+ 0xE9, 0x05, 0xB9, 0x55, 0x9A, 0x59, 0x5B, 0x95, 0x59, 0xA5,
+ 0x95, 0xA9, 0xA5, 0xB9, 0xA5, 0x4E, 0x90, 0xE3, 0x59, 0x59,
+ 0x59, 0x5A, 0x9C, 0x59, 0xC5, 0x9E, 0x05, 0x4E, 0x90, 0xD5,
+ 0xB9, 0x55, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x5A, 0x95, 0x5A,
+ 0x9C, 0x54, 0xE9, 0x0D, 0x5A, 0x75, 0x5C, 0x75, 0x57, 0x55,
+ 0xA7, 0xC5, 0x7E, 0x15, 0x4E, 0x90, 0xEC, 0x59, 0x95, 0x99,
+ 0xD5, 0xE0, 0x95, 0x99, 0xD5, 0x99, 0xEB, 0x54, 0xF3, 0x40,
+ 0x0D, 0x5C, 0x95, 0x59, 0x9A, 0x59, 0x95, 0xD9, 0x59, 0x9E,
+ 0x15, 0x99, 0xE2, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
+ 0x95, 0x9E, 0x05, 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0xC5, 0x9C,
+ 0x59, 0xC5, 0xC9, 0x59, 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x25,
+ 0x9C, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x9A, 0x59, 0xE1, 0x54,
+ 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xE2, 0x59, 0xE0, 0x54, 0xE9,
+ 0x05, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x95, 0x9A, 0x59, 0xA5,
+ 0x95, 0x9C, 0x59, 0x59, 0xB5, 0x4E, 0x90, 0xE3, 0x59, 0x55,
+ 0x99, 0x59, 0xD5, 0x95, 0x9B, 0x59, 0xE0, 0x54, 0xE9, 0x0D,
+ 0x59, 0xC5, 0xC9, 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xE0, 0x54,
+ 0xE9, 0x0E, 0x25, 0x75, 0x7A, 0x57, 0x55, 0x75, 0x57, 0xE0,
+ 0x57, 0xE1, 0x54, 0xE9, 0x0E, 0x75, 0x99, 0xA5, 0x99, 0x59,
+ 0x9D, 0x59, 0x9A, 0x59, 0x95, 0xA9, 0x55, 0x99, 0x59, 0x9E,
+ 0xB5, 0x4F, 0x34, 0x00, 0xF1, 0x30, 0x54, 0xE9, 0x0E, 0x45,
+ 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9E, 0x05, 0x9D, 0x54, 0xE9,
+ 0x0B, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xC5, 0x9A, 0x59, 0x59,
+ 0x55, 0x9D, 0x54, 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x59, 0xA5,
+ 0x95, 0x9A, 0x59, 0xA5, 0x9E, 0x15, 0x4E, 0x90, 0xE7, 0x59,
+ 0xA5, 0x95, 0x9E, 0x25, 0x9E, 0x05, 0x4E, 0x90, 0x59, 0xA5,
+ 0x95, 0x9A, 0x59, 0x59, 0x55, 0x95, 0x59, 0x55, 0x95, 0x59,
+ 0xC5, 0x95, 0x59, 0xA5, 0x4E, 0x90, 0xE3, 0x59, 0xA5, 0x95,
+ 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54, 0xE9, 0x0D, 0x59,
+ 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xE0, 0x54,
+ 0xE9, 0x0E, 0x25, 0x75, 0x7A, 0x57, 0x55, 0x75, 0x57, 0xE0,
+ 0x57, 0xE1, 0x54, 0xE9, 0x0E, 0x75, 0xE0, 0x95, 0x99, 0xD5,
+ 0x99, 0xA5, 0x99, 0x55, 0xD9, 0x5E, 0x09, 0xE6, 0x54, 0xF3,
+ 0x40, 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xE5, 0x5A, 0x9A, 0x5A,
+ 0x95, 0x59, 0xE0, 0x59, 0xD5, 0x4E, 0x90, 0xC5, 0xA9, 0x55,
+ 0xC9, 0x5C, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x9C, 0x54, 0xE9,
+ 0x0E, 0x35, 0xA9, 0xA5, 0xA9, 0x55, 0x9A, 0x59, 0xA5, 0x9E,
+ 0x15, 0x4E, 0x90, 0xE8, 0x5A, 0x95, 0x5C, 0x95, 0xB9, 0xE1,
+ 0x54, 0xE9, 0x05, 0xB9, 0xA5, 0xA9, 0x55, 0x9A, 0x59, 0x5A,
+ 0x9A, 0x5C, 0x95, 0x9A, 0x59, 0x55, 0x4E, 0x90, 0xE3, 0x59,
+ 0xA5, 0x95, 0xC9, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54, 0xE9,
+ 0x0D, 0x59, 0xC5, 0x9A, 0x59, 0x55, 0xA9, 0x55, 0xB9, 0x55,
+ 0xC9, 0xA5, 0x4E, 0x90, 0xC5, 0xB7, 0x55, 0x7A, 0x57, 0x5A,
+ 0x75, 0x7E, 0x05, 0x7E, 0x15, 0x4E, 0x90, 0xE8, 0x5C, 0x95,
+ 0x59, 0x9D, 0x59, 0x9A, 0x59, 0x9A, 0x5B, 0x95, 0x5E, 0x09,
+ 0xE6, 0x54, 0xF3, 0x40, 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xF6,
+ 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
+ 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
+ 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
+ 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF2, 0x40, 0x54, 0xF3, 0x40,
+ 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
+ 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
+ 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
+ 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
+ 0x90, 0xF2, 0x40, 0x54, 0xF4, 0x40, 0x0F, 0x13, 0x04, 0xEA,
+ 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62,
+ 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA,
+ 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62,
+ 0x04, 0xEA, 0x0F, 0x24, 0x04, 0xFF, 0x42, 0x0E, 0x47, 0xE5,
+ 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3, 0x7E, 0x68, 0xE5,
+ 0x2E, 0x51, 0xF7, 0x80, 0x0B, 0x70, 0x0C, 0x70, 0xC7, 0x0B,
+ 0x7F, 0x12, 0x00, 0xA7, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xF8,
+ 0x20, 0x0B, 0x7B, 0x07, 0xA0, 0xB7, 0x00, 0xC7, 0x0B, 0x7F,
+ 0xB1, 0x00, 0xC7, 0x07, 0xE0, 0x07, 0xB0, 0xB7, 0x07, 0xA0,
+ 0x7F, 0xA1, 0x00, 0xB7, 0x00, 0xB7, 0x00, 0xA7, 0x00, 0xA7,
+ 0x00, 0x7A, 0x07, 0x0C, 0x7F, 0x71, 0x00, 0xA7, 0x00, 0x7A,
+ 0x07, 0x0C, 0x70, 0xB7, 0xF1, 0x20, 0x0A, 0x70, 0x7A, 0x07,
+ 0x07, 0xA0, 0x70, 0xC7, 0x0B, 0x7A, 0x0B, 0x70, 0xC7, 0xF8,
+ 0x50, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x88, 0x00,
+ 0x7A, 0x07, 0x07, 0xC0, 0x7C, 0x07, 0xA0, 0x7F, 0x12, 0x00,
+ 0x70, 0x07, 0x70, 0x07, 0x07, 0x00, 0x7F, 0x92, 0x00, 0x7A,
+ 0x07, 0x00, 0x70, 0x70, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0,
+ 0x7F, 0xA1, 0x00, 0x7C, 0x07, 0xD0, 0x70, 0x70, 0x07, 0xC0,
+ 0x7A, 0x07, 0xFA, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x00,
+ 0x70, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x81, 0x00,
+ 0x7A, 0x07, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x7F, 0x12,
+ 0x00, 0x70, 0x07, 0x70, 0x07, 0x07, 0xA0, 0x70, 0x7C, 0x07,
+ 0xA0, 0x70, 0x7C, 0x07, 0xFC, 0x50, 0x0E, 0x47, 0xE5, 0x8E,
+ 0x62, 0xE4, 0x1F, 0x88, 0x00, 0x7A, 0x07, 0x07, 0xC0, 0x7C,
+ 0x07, 0xA0, 0x7F, 0x12, 0x00, 0x70, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0xFA, 0x20, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xA0,
+ 0x70, 0x7C, 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0x7C, 0x07, 0xC0,
+ 0x7A, 0x07, 0x07, 0xC0, 0x7A, 0x07, 0xFA, 0x10, 0x07, 0xA0,
+ 0x70, 0x7A, 0x07, 0x00, 0x70, 0x07, 0xC0, 0x7A, 0x07, 0xA0,
+ 0x7F, 0x81, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x70, 0x7C, 0x07,
+ 0xA0, 0x7F, 0x12, 0x00, 0x70, 0x07, 0x07, 0x07, 0x07, 0xA0,
+ 0x70, 0x7C, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xFC, 0x50, 0x0E,
+ 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x88, 0x00, 0xB7, 0x00,
+ 0xA7, 0xA0, 0xA7, 0xA0, 0xB7, 0xF2, 0x20, 0x07, 0x00, 0x70,
+ 0x70, 0x70, 0x77, 0xFB, 0x20, 0x0B, 0x70, 0x07, 0xA0, 0x70,
+ 0xB7, 0x00, 0xA7, 0xA0, 0xB7, 0xFB, 0x10, 0x0A, 0x7A, 0x07,
+ 0xC0, 0x7A, 0x07, 0x00, 0xA7, 0x00, 0xC7, 0xFA, 0x10, 0x0B,
+ 0x70, 0x0B, 0x7A, 0x07, 0x00, 0x70, 0xA7, 0x0C, 0x7A, 0x07,
+ 0xF8, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x0A, 0x7A, 0x0B,
+ 0x7F, 0x22, 0x00, 0x70, 0x07, 0x07, 0x07, 0x07, 0xA0, 0x70,
+ 0xA7, 0xA0, 0xB7, 0xA0, 0xA7, 0x00, 0xA7, 0xF9, 0x50, 0x0E,
+ 0x47, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x88, 0x00, 0x7A, 0x07,
+ 0x07, 0xC0, 0x7C, 0x07, 0xF5, 0x20, 0x07, 0x00, 0x70, 0x07,
+ 0x70, 0x70, 0x7F, 0xA2, 0x00, 0x7C, 0x0C, 0x70, 0x7C, 0x07,
+ 0xC0, 0x70, 0x7F, 0xC1, 0x00, 0x7C, 0x07, 0xC0, 0xC7, 0xC0,
+ 0x70, 0x7A, 0x07, 0xFA, 0x10, 0x07, 0xA0, 0x70, 0x70, 0x7B,
+ 0x07, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x10,
+ 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00, 0x7C, 0x07, 0x07, 0xF3,
+ 0x20, 0x07, 0x00, 0x70, 0x07, 0x70, 0x07, 0x07, 0x00, 0x7C,
+ 0x07, 0x07, 0xE0, 0x07, 0x07, 0xFB, 0x50, 0x0E, 0x47, 0xE5,
+ 0x8E, 0x62, 0xE4, 0x1F, 0x98, 0x00, 0x7A, 0x07, 0x07, 0xC0,
+ 0x7C, 0x07, 0xF5, 0x20, 0x07, 0x00, 0x7A, 0x07, 0x07, 0x00,
+ 0x7F, 0x92, 0x00, 0x7C, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0,
+ 0x70, 0x07, 0xFB, 0x10, 0x07, 0xC0, 0x7C, 0x07, 0xA0, 0x7C,
+ 0x07, 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0x7A, 0x07, 0x07, 0x00,
+ 0x7A, 0x07, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF8,
+ 0x10, 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00, 0x7C, 0x07, 0x00,
+ 0x7F, 0x22, 0x00, 0x70, 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00,
+ 0x7C, 0x07, 0x00, 0x7D, 0x07, 0x07, 0xFB, 0x50, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x98, 0x00, 0xB7, 0x00, 0xC7,
+ 0x0C, 0x70, 0x7F, 0x42, 0x00, 0xA7, 0x07, 0xA0, 0x70, 0x7A,
+ 0x07, 0xF8, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xC0, 0xC7,
+ 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0x7C, 0x0C, 0x70, 0x7A, 0x07,
+ 0x0B, 0x70, 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0xB7, 0x00, 0x7A,
+ 0x07, 0x0A, 0x70, 0x0B, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x91,
+ 0x00, 0xA7, 0xB0, 0x7A, 0x0C, 0x70, 0x7A, 0x07, 0xF0, 0x20,
+ 0x0A, 0x70, 0x7A, 0x07, 0xA0, 0x7A, 0x0C, 0x70, 0x7A, 0x07,
+ 0x0B, 0x70, 0x0C, 0x7F, 0x75, 0x00, 0xE3, 0x7E, 0x68, 0xE6,
+ 0x2E, 0x41, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
+ 0xE3, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58,
+ 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62,
+ 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x51,
+ 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15,
+ 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E,
+ 0x37, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E,
+ 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E,
+ 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E,
+ 0x41, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
+ 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3,
+ 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47, 0xE5,
+ 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6,
+ 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x15, 0x20, 0xE3, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
+ 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37,
+ 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58,
+ 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62,
+ 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41,
+ 0xF1, 0x52, 0x0E, 0x37, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15,
+ 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E,
+ 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E,
+ 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE5, 0x8E,
+ 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E,
+ 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
+ 0x15, 0x20, 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41, 0xF0, 0x52,
+ 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4,
+ 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5,
+ 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3, 0x7E, 0x58, 0xE6,
+ 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
+ 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
+ 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
+ 0xE3, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47,
+ 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58,
+ 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE5, 0x8E, 0x62,
+ 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41,
+ 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15,
+ 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF0, 0x52, 0x0E,
+ 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E,
+ 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x30, 0x0A
+};
+
+const unsigned long spectkey_size = 15887;
+
+/* End of spectkey.c */
diff --git a/apps/plugins/zxbox/spkey.c b/apps/plugins/zxbox/spkey.c
new file mode 100644
index 0000000000..28a390ae2e
--- /dev/null
+++ b/apps/plugins/zxbox/spkey.c
@@ -0,0 +1,983 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* #define DEBUG_KEYS */
+#include "misc.h"
+
+#include "spkey.h"
+#include "spkey_p.h"
+
+#include "spperif.h"
+#include "z80.h"
+
+#include "sptape.h"
+#include "snapshot.h"
+#include "spsound.h"
+#include "spscr.h"
+
+#include "interf.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+int keyboard_type = 0;
+
+/* for kempston support via SK_KP_Up and so on.... */
+int cursor_type = 2;
+
+
+int spkb_allow_ascii = 1;
+int spkb_trueshift = -1;
+int spkb_funcshift = -1;
+
+static unsigned trueshift;
+static unsigned funcshift;
+
+struct spkeydef {
+ int type;
+ spkeyboard kb;
+};
+
+struct spbasekey {
+ int index;
+ spkeyboard kb;
+ spkeyboard misc;
+};
+
+struct spnamedkey {
+ const char *name;
+ spkeyboard kb;
+ spkeyboard misc;
+};
+
+extern int endofsingle;
+extern int sp_nosync;
+extern int showframe;
+extern int privatemap;
+
+spkeyboard spkey_state;
+spkeyboard spmisc_state;
+
+static spkeyboard oldstate = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+
+struct keystate spkb_kbstate[NR_SPKEYS];
+struct onekey spkb_last;
+
+int spkb_state_changed;
+
+#define SKE {0, 0, 0, 0, 0, 0, 0, 0}
+
+#define SKP(x) (1 << x)
+
+#define SKN0(x) {SKP(x), 0, 0, 0, 0, 0, 0, 0}
+#define SKN1(x) {0, SKP(x), 0, 0, 0, 0, 0, 0}
+#define SKN2(x) {0, 0, SKP(x), 0, 0, 0, 0, 0}
+#define SKN3(x) {0, 0, 0, SKP(x), 0, 0, 0, 0}
+#define SKN4(x) {0, 0, 0, 0, SKP(x), 0, 0, 0}
+#define SKN5(x) {0, 0, 0, 0, 0, SKP(x), 0, 0}
+#define SKN6(x) {0, 0, 0, 0, 0, 0, SKP(x), 0}
+#define SKN7(x) {0, 0, 0, 0, 0, 0, 0, SKP(x)}
+
+#define SKCS0(x) {SKP(0) | SKP(x), 0, 0, 0, 0, 0, 0, 0}
+#define SKCS1(x) {SKP(0), SKP(x), 0, 0, 0, 0, 0, 0}
+#define SKCS2(x) {SKP(0), 0, SKP(x), 0, 0, 0, 0, 0}
+#define SKCS3(x) {SKP(0), 0, 0, SKP(x), 0, 0, 0, 0}
+#define SKCS4(x) {SKP(0), 0, 0, 0, SKP(x), 0, 0, 0}
+#define SKCS5(x) {SKP(0), 0, 0, 0, 0, SKP(x), 0, 0}
+#define SKCS6(x) {SKP(0), 0, 0, 0, 0, 0, SKP(x), 0}
+#define SKCS7(x) {SKP(0), 0, 0, 0, 0, 0, 0, SKP(x)}
+
+
+#define SKSS0(x) {SKP(x), 0, 0, 0, 0, 0, 0, SKP(1)}
+#define SKSS1(x) {0, SKP(x), 0, 0, 0, 0, 0, SKP(1)}
+#define SKSS2(x) {0, 0, SKP(x), 0, 0, 0, 0, SKP(1)}
+#define SKSS3(x) {0, 0, 0, SKP(x), 0, 0, 0, SKP(1)}
+#define SKSS4(x) {0, 0, 0, 0, SKP(x), 0, 0, SKP(1)}
+#define SKSS5(x) {0, 0, 0, 0, 0, SKP(x), 0, SKP(1)}
+#define SKSS6(x) {0, 0, 0, 0, 0, 0, SKP(x), SKP(1)}
+#define SKSS7(x) {0, 0, 0, 0, 0, 0, 0, SKP(x) | SKP(1)}
+
+
+#define KEMP(x) {x, 0, 0, 0, 0, 0, 0, 0}
+
+#define KEMPR 0x01
+#define KEMPL 0x02
+#define KEMPD 0x04
+#define KEMPU 0x08
+#define KEMPF 0x10
+
+#define KEMP_PORT 0x1F
+
+
+#define T_MAIN 0
+#define T_CMPX 1
+#define T_EXTR 2
+
+#define SPK_SPACE SKN7(0)
+
+#define SPK_0 SKN4(0)
+#define SPK_1 SKN3(0)
+#define SPK_2 SKN3(1)
+#define SPK_3 SKN3(2)
+#define SPK_4 SKN3(3)
+#define SPK_5 SKN3(4)
+#define SPK_6 SKN4(4)
+#define SPK_7 SKN4(3)
+#define SPK_8 SKN4(2)
+#define SPK_9 SKN4(1)
+
+#define SPK_A SKN1(0)
+#define SPK_B SKN7(4)
+#define SPK_C SKN0(3)
+#define SPK_D SKN1(2)
+#define SPK_E SKN2(2)
+#define SPK_F SKN1(3)
+#define SPK_G SKN1(4)
+#define SPK_H SKN6(4)
+#define SPK_I SKN5(2)
+#define SPK_J SKN6(3)
+#define SPK_K SKN6(2)
+#define SPK_L SKN6(1)
+#define SPK_M SKN7(2)
+#define SPK_N SKN7(3)
+#define SPK_O SKN5(1)
+#define SPK_P SKN5(0)
+#define SPK_Q SKN2(0)
+#define SPK_R SKN2(3)
+#define SPK_S SKN1(1)
+#define SPK_T SKN2(4)
+#define SPK_U SKN5(3)
+#define SPK_V SKN0(4)
+#define SPK_W SKN2(1)
+#define SPK_X SKN0(2)
+#define SPK_Y SKN5(4)
+#define SPK_Z SKN0(1)
+
+#define SPK_ENTER SKN6(0)
+#define SPK_CAPSSHIFT SKN0(0)
+#define SPK_SYMBOLSHIFT SKN7(1)
+
+#define SPK_BS SKCS4(0)
+#define SPK_UP SKCS4(3)
+#define SPK_DOWN SKCS4(4)
+#define SPK_LEFT SKCS3(4)
+#define SPK_RIGHT SKCS4(2)
+#define SPK_CAPSLOCK SKCS3(1)
+#define SPK_EXTRA SKCS7(1)
+#define SPK_EDIT SKCS3(0)
+
+static spkeyboard spk_extra = SPK_EXTRA;
+
+static struct spkeydef spkey_ascii[] = {
+ {T_MAIN, SPK_SPACE}, /* space */
+ {T_CMPX, SKSS3(0)}, /* ! */
+ {T_CMPX, SKSS5(0)}, /* " */
+ {T_CMPX, SKSS3(2)}, /* # */
+ {T_CMPX, SKSS3(3)}, /* $ */
+ {T_CMPX, SKSS3(4)}, /* % */
+ {T_CMPX, SKSS4(4)}, /* & */
+ {T_CMPX, SKSS4(3)}, /* ' */
+ {T_CMPX, SKSS4(2)}, /* ( */
+ {T_CMPX, SKSS4(1)}, /* ) */
+ {T_CMPX, SKSS7(4)}, /* * */
+ {T_CMPX, SKSS6(2)}, /* + */
+ {T_CMPX, SKSS7(3)}, /* , */
+ {T_CMPX, SKSS6(3)}, /* - */
+ {T_CMPX, SKSS7(2)}, /* . */
+ {T_CMPX, SKSS0(4)}, /* / */
+
+ {T_MAIN, SPK_0}, /* 0 */
+ {T_MAIN, SPK_1}, /* 1 */
+ {T_MAIN, SPK_2}, /* 2 */
+ {T_MAIN, SPK_3}, /* 3 */
+ {T_MAIN, SPK_4}, /* 4 */
+ {T_MAIN, SPK_5}, /* 5 */
+ {T_MAIN, SPK_6}, /* 6 */
+ {T_MAIN, SPK_7}, /* 7 */
+ {T_MAIN, SPK_8}, /* 8 */
+ {T_MAIN, SPK_9}, /* 9 */
+
+ {T_CMPX, SKSS0(1)}, /* : */
+ {T_CMPX, SKSS5(1)}, /* ; */
+ {T_CMPX, SKSS2(3)}, /* < */
+ {T_CMPX, SKSS6(1)}, /* = */
+ {T_CMPX, SKSS2(4)}, /* > */
+ {T_CMPX, SKSS0(3)}, /* ? */
+ {T_CMPX, SKSS3(1)}, /* @ */
+
+ {T_CMPX, SKCS1(0)}, /* A */
+ {T_CMPX, SKCS7(4)}, /* B */
+ {T_CMPX, SKCS0(3)}, /* C */
+ {T_CMPX, SKCS1(2)}, /* D */
+ {T_CMPX, SKCS2(2)}, /* E */
+ {T_CMPX, SKCS1(3)}, /* F */
+ {T_CMPX, SKCS1(4)}, /* G */
+ {T_CMPX, SKCS6(4)}, /* H */
+ {T_CMPX, SKCS5(2)}, /* I */
+ {T_CMPX, SKCS6(3)}, /* J */
+ {T_CMPX, SKCS6(2)}, /* K */
+ {T_CMPX, SKCS6(1)}, /* L */
+ {T_CMPX, SKCS7(2)}, /* M */
+ {T_CMPX, SKCS7(3)}, /* N */
+ {T_CMPX, SKCS5(1)}, /* O */
+ {T_CMPX, SKCS5(0)}, /* P */
+ {T_CMPX, SKCS2(0)}, /* Q */
+ {T_CMPX, SKCS2(3)}, /* R */
+ {T_CMPX, SKCS1(1)}, /* S */
+ {T_CMPX, SKCS2(4)}, /* T */
+ {T_CMPX, SKCS5(3)}, /* U */
+ {T_CMPX, SKCS0(4)}, /* V */
+ {T_CMPX, SKCS2(1)}, /* W */
+ {T_CMPX, SKCS0(2)}, /* X */
+ {T_CMPX, SKCS5(4)}, /* Y */
+ {T_CMPX, SKCS0(1)}, /* Z */
+
+ {T_EXTR, SKCS5(4)}, /* [ */
+ {T_EXTR, SKCS1(2)}, /* backslash */
+ {T_EXTR, SKCS5(3)}, /* ] */
+ {T_CMPX, SKSS6(4)}, /* ^ */
+ {T_CMPX, SKSS4(0)}, /* _ */
+ {T_CMPX, SKSS0(2)}, /* ` */
+
+ {T_MAIN, SPK_A}, /* a */
+ {T_MAIN, SPK_B}, /* b */
+ {T_MAIN, SPK_C}, /* c */
+ {T_MAIN, SPK_D}, /* d */
+ {T_MAIN, SPK_E}, /* e */
+ {T_MAIN, SPK_F}, /* f */
+ {T_MAIN, SPK_G}, /* g */
+ {T_MAIN, SPK_H}, /* h */
+ {T_MAIN, SPK_I}, /* i */
+ {T_MAIN, SPK_J}, /* j */
+ {T_MAIN, SPK_K}, /* k */
+ {T_MAIN, SPK_L}, /* l */
+ {T_MAIN, SPK_M}, /* m */
+ {T_MAIN, SPK_N}, /* n */
+ {T_MAIN, SPK_O}, /* o */
+ {T_MAIN, SPK_P}, /* p */
+ {T_MAIN, SPK_Q}, /* q */
+ {T_MAIN, SPK_R}, /* r */
+ {T_MAIN, SPK_S}, /* s */
+ {T_MAIN, SPK_T}, /* t */
+ {T_MAIN, SPK_U}, /* u */
+ {T_MAIN, SPK_V}, /* v */
+ {T_MAIN, SPK_W}, /* w */
+ {T_MAIN, SPK_X}, /* x */
+ {T_MAIN, SPK_Y}, /* y */
+ {T_MAIN, SPK_Z}, /* z */
+
+ {T_EXTR, SKCS1(3)}, /* { */
+ {T_EXTR, SKCS1(1)}, /* | */
+ {T_EXTR, SKCS1(4)}, /* } */
+ {T_EXTR, SKCS1(0)}, /* ~ */
+};
+
+static struct spnamedkey spkey_misc[] = {
+ {"none", SKE, SKE},
+
+ {"space", SPK_SPACE, SKE},
+ {"enter", SPK_ENTER, SKE},
+ {"capsshift", SPK_CAPSSHIFT, SKE},
+ {"symbolshift", SPK_SYMBOLSHIFT, SKE},
+
+ {"kempston_up", SKE, KEMP(KEMPU)},
+ {"kempston_down", SKE, KEMP(KEMPD)},
+ {"kempston_left", SKE, KEMP(KEMPL)},
+ {"kempston_right", SKE, KEMP(KEMPR)},
+ {"kempston_fire", SKE, KEMP(KEMPF)},
+
+ {NULL, SKE, SKE}
+};
+
+#define MAXBASEKEYS 128
+
+static struct spbasekey basekeys[MAXBASEKEYS];
+static int numbasekeys;
+
+static struct spbasekey customkeys[MAXBASEKEYS];
+static int numcustomkeys = 0;
+
+static struct spbasekey normalkeys[] = {
+ {'0', SPK_0, SKE}, /* 0 */
+ {'1', SPK_1, SKE}, /* 1 */
+ {'2', SPK_2, SKE}, /* 2 */
+ {'3', SPK_3, SKE}, /* 3 */
+ {'4', SPK_4, SKE}, /* 4 */
+ {'5', SPK_5, SKE}, /* 5 */
+ {'6', SPK_6, SKE}, /* 6 */
+ {'7', SPK_7, SKE}, /* 7 */
+ {'8', SPK_8, SKE}, /* 8 */
+ {'9', SPK_9, SKE}, /* 9 */
+
+ {'a', SPK_A, SKE}, /* a */
+ {'b', SPK_B, SKE}, /* b */
+ {'c', SPK_C, SKE}, /* c */
+ {'d', SPK_D, SKE}, /* d */
+ {'e', SPK_E, SKE}, /* e */
+ {'f', SPK_F, SKE}, /* f */
+ {'g', SPK_G, SKE}, /* g */
+ {'h', SPK_H, SKE}, /* h */
+ {'i', SPK_I, SKE}, /* i */
+ {'j', SPK_J, SKE}, /* j */
+ {'k', SPK_K, SKE}, /* k */
+ {'l', SPK_L, SKE}, /* l */
+ {'m', SPK_M, SKE}, /* m */
+ {'n', SPK_N, SKE}, /* n */
+ {'o', SPK_O, SKE}, /* o */
+ {'p', SPK_P, SKE}, /* p */
+ {'q', SPK_Q, SKE}, /* q */
+ {'r', SPK_R, SKE}, /* r */
+ {'s', SPK_S, SKE}, /* s */
+ {'t', SPK_T, SKE}, /* t */
+ {'u', SPK_U, SKE}, /* u */
+ {'v', SPK_V, SKE}, /* v */
+ {'w', SPK_W, SKE}, /* w */
+ {'x', SPK_X, SKE}, /* x */
+ {'y', SPK_Y, SKE}, /* y */
+ {'z', SPK_Z, SKE}, /* z */
+
+ {-1, SKE, SKE}
+};
+
+static struct spbasekey extendedkeys[] = {
+ {' ', SPK_SPACE, SKE}, /* space */
+ {TRKS(SK_Return), SPK_ENTER, SKE}, /* enter */
+ {TRKS(SK_KP_Enter), SPK_ENTER, SKE},
+ {TRKS(SK_Shift_L), SPK_CAPSSHIFT, SKE}, /* caps shift */
+ {TRKS(SK_Shift_R), SPK_SYMBOLSHIFT, SKE}, /* symbol shift */
+ {TRKS(SK_BackSpace), SPK_BS, SKE}, /* backspace */
+ {TRKS(SK_Delete), SPK_BS, SKE},
+ {TRKS(SK_KP_Delete), SPK_BS, SKE},
+ {TRKS(SK_Escape), SPK_EDIT, SKE}, /* caps shift + '1' */
+
+ {-1, SKE, SKE}
+};
+
+static struct spbasekey spectrumkeys[] = {
+ {',', SPK_SYMBOLSHIFT, SKE},
+ {'.', SPK_SPACE, SKE},
+ {';', SPK_ENTER, SKE},
+
+ {-1, SKE, SKE}
+};
+
+
+static struct spbasekey compatkeys[] = {
+ {TRKS(SK_Shift_L), SPK_CAPSSHIFT, SKE}, /* caps shift */
+ {TRKS(SK_Shift_R), SPK_CAPSSHIFT, SKE},
+ {TRKS(SK_Alt_L), SPK_SYMBOLSHIFT, SKE}, /* symbol shift */
+ {TRKS(SK_Alt_R), SPK_SYMBOLSHIFT, SKE},
+ {TRKS(SK_Meta_L), SPK_SYMBOLSHIFT, SKE},
+ {TRKS(SK_Meta_R), SPK_SYMBOLSHIFT, SKE},
+#if TRUEKOMPAT
+ {TRKS(SK_Control_L), SPK_EXTRA, SKE}, /* caps shift + symbol shift */
+ {TRKS(SK_Control_R), SPK_EXTRA, SKE},
+#endif
+
+ {-1, SKE, SKE}
+};
+
+static struct spbasekey shiftedcurs[] = {
+ {TRKS(SK_Up), SPK_UP, SKE}, /* up */
+ {TRKS(SK_KP_Up), SPK_UP, SKE},
+ {TRKS(SK_Down), SPK_DOWN, SKE}, /* down */
+ {TRKS(SK_KP_Down), SPK_DOWN, SKE},
+ {TRKS(SK_Left), SPK_LEFT, SKE}, /* left */
+ {TRKS(SK_KP_Left), SPK_LEFT, SKE},
+ {TRKS(SK_Right), SPK_RIGHT, SKE}, /* right */
+ {TRKS(SK_KP_Right), SPK_RIGHT, SKE},
+
+ {-1, SKE, SKE}
+};
+
+static struct spbasekey rawcurs[] = {
+ {TRKS(SK_Up), SPK_7, SKE}, /* up */
+ {TRKS(SK_KP_Up), SPK_7, SKE},
+ {TRKS(SK_Down), SPK_6, SKE}, /* down */
+ {TRKS(SK_KP_Down), SPK_6, SKE},
+ {TRKS(SK_Left), SPK_5, SKE}, /* left */
+ {TRKS(SK_KP_Left), SPK_5, SKE},
+ {TRKS(SK_Right), SPK_8, SKE}, /* right */
+ {TRKS(SK_KP_Right), SPK_8, SKE},
+
+ {-1, SKE, SKE}
+};
+
+static struct spbasekey joycurs[] = {
+ {TRKS(SK_Up), SKE, KEMP(KEMPU)}, /* up */
+ {TRKS(SK_KP_Up), SKE, KEMP(KEMPU)},
+ {TRKS(SK_Down), SKE, KEMP(KEMPD)}, /* down */
+ {TRKS(SK_KP_Down), SKE, KEMP(KEMPD)},
+ {TRKS(SK_Left), SKE, KEMP(KEMPL)}, /* left */
+ {TRKS(SK_KP_Left), SKE, KEMP(KEMPL)},
+ {TRKS(SK_Right), SKE, KEMP(KEMPR)}, /* right */
+ {TRKS(SK_KP_Right), SKE, KEMP(KEMPR)},
+ {TRKS(SK_KP_Insert), SKE, KEMP(KEMPF)}, /* fire */
+ {TRKS(SK_Insert), SKE, KEMP(KEMPF)},
+ {TRKS(SK_KP_Delete), SKE, KEMP(KEMPF)},
+ {TRKS(SK_KP_Home), SKE, KEMP(KEMPU | KEMPL)}, /* up + left*/
+ {TRKS(SK_Home), SKE, KEMP(KEMPU | KEMPL)},
+ {TRKS(SK_KP_Page_Up), SKE, KEMP(KEMPU | KEMPR)}, /* up + right*/
+ {TRKS(SK_Page_Up), SKE, KEMP(KEMPU | KEMPR)},
+ {TRKS(SK_KP_End), SKE, KEMP(KEMPD | KEMPL)}, /* down + left*/
+ {TRKS(SK_End), SKE, KEMP(KEMPD | KEMPL)},
+ {TRKS(SK_KP_Page_Down), SKE, KEMP(KEMPD | KEMPR)}, /* down + right*/
+ {TRKS(SK_Page_Down), SKE, KEMP(KEMPD | KEMPR)},
+
+ {-1, SKE, SKE}
+};
+
+int spkey_new_custom(int key)
+{
+ if(numcustomkeys >= MAXBASEKEYS) return 0;
+
+ customkeys[numcustomkeys].index = key;
+ SP_SETEMPTY(customkeys[numcustomkeys].kb);
+ SP_SETEMPTY(customkeys[numcustomkeys].misc);
+ numcustomkeys++;
+
+ return 1;
+}
+
+int spkey_add_custom(const char *name)
+{
+ int curr;
+
+ curr = numcustomkeys - 1;
+
+ if(!name[1] && isalnum(name[0])) {
+ int ai;
+ ai = tolower(name[0])-32;
+ SP_COMBINE(customkeys[curr].kb, spkey_ascii[ai].kb);
+ return 1;
+ }
+ else {
+ int i;
+
+ for(i = 0; spkey_misc[i].name != NULL; i++) {
+ if(mis_strcasecmp(spkey_misc[i].name, name) == 0) {
+ SP_COMBINE(customkeys[curr].kb, spkey_misc[i].kb);
+ SP_COMBINE(customkeys[curr].misc, spkey_misc[i].misc);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+static int key_reset(struct keystate *ck)
+{
+ if(ck->state == 2 && sp_int_ctr >= ck->frame) {
+ ck->state = 0;
+ return 1;
+ }
+ else return 0;
+}
+
+
+void process_keys(void)
+{
+ int i;
+ struct keystate *ck;
+ int tsh;
+ int kalone;
+ static int extrai = 0;
+ static qbyte extraendframe;
+
+ if(extrai && !spkb_kbstate[extrai].state) extrai = 0;
+
+ if(!spkb_state_changed && (!extrai || !extraendframe)) return;
+
+ SP_SETEMPTY(spkey_state);
+ SP_SETEMPTY(spmisc_state);
+
+ kalone = 0;
+ ck = spkb_kbstate + spkb_last.index;
+ tsh = spkb_last.modif & trueshift;
+ key_reset(ck);
+
+
+ if(spkb_allow_ascii && ck->state && (!ck->base || tsh)) {
+ unsigned ks;
+ ks = tsh ? spkb_last.shifted : spkb_last.keysym;
+ if(ks >= 32 && ks < 127) {
+ if(spkey_ascii[ks-32].type <= T_CMPX) {
+ SP_COMBINE(spkey_state, spkey_ascii[ks-32].kb);
+ kalone = 1;
+ }
+ else if(spkey_ascii[ks-32].type == T_EXTR) {
+ if(!extrai || sp_int_ctr < extraendframe) {
+ if(!extrai) {
+ extrai = spkb_last.index;
+ extraendframe = sp_int_ctr + 1;
+ }
+ SP_COMBINE(spkey_state, spk_extra);
+ }
+ else {
+ SP_COMBINE(spkey_state, spkey_ascii[ks-32].kb);
+ extraendframe = 0;
+ }
+ kalone = 1;
+ }
+ }
+ }
+
+ if(!kalone) {
+ for(i = 0; i < numbasekeys; i++) {
+ ck = spkb_kbstate + basekeys[i].index;
+ key_reset(ck);
+ if(ck->state) {
+ SP_COMBINE(spkey_state, basekeys[i].kb);
+ SP_COMBINE(spmisc_state, basekeys[i].misc);
+ }
+ }
+ }
+ SP_COMBINE(spkey_state, kb_mkey);
+
+ spkb_refresh();
+ spkb_state_changed = 0;
+}
+
+void clear_keystates(void)
+{
+ int i;
+ for(i = 0; i < NR_SPKEYS; i++) spkb_kbstate[i].state = 0;
+ spkb_last.index = 0;
+ SP_SETEMPTY(spkey_state);
+ SP_SETEMPTY(kb_mkey);
+ SP_SETEMPTY(spmisc_state);
+ spkb_refresh();
+}
+
+static void keycpy(struct spbasekey *to, struct spbasekey *from)
+{
+ to->index = from->index;
+ SP_COPY(to->kb, from->kb);
+ SP_COPY(to->misc, from->misc);
+}
+
+static void copy_key(struct spbasekey *addk)
+{
+ int i;
+ int nindex;
+
+ nindex = addk->index;
+
+ if(SP_NONEMPTY(addk->kb) || SP_NONEMPTY(addk->misc)) {
+ for(i = 0; i < numbasekeys; i++) {
+ if(basekeys[i].index == nindex) { /* Replace */
+ keycpy(&basekeys[i], addk);
+ return;
+ }
+ }
+ if(numbasekeys < MAXBASEKEYS - 1) { /* Add */
+ keycpy(&basekeys[numbasekeys], addk);
+ spkb_kbstate[nindex].base = 1;
+ numbasekeys++;
+ }
+ }
+ else { /* Delete */
+ for(i = 0; i < numbasekeys; i++) {
+ if(basekeys[i].index == nindex) {
+ i++;
+ for(; i < numbasekeys; i++) keycpy(&basekeys[i-1], &basekeys[i]);
+ spkb_kbstate[nindex].base = 0;
+ numbasekeys--;
+ break;
+ }
+ }
+ }
+}
+
+static void copy_basekeys(struct spbasekey *addk)
+{
+ int i;
+
+ for(i = 0; addk[i].index >= 0; i++) copy_key(&addk[i]);
+}
+
+static unsigned transform_shift(int modif)
+{
+ if(!modif) return 0;
+ else return (1 << (modif - 1));
+}
+
+
+void init_basekeys(void)
+{
+ int i;
+ numbasekeys = 0;
+
+ for(i = 0; i < NR_SPKEYS; i++) spkb_kbstate[i].base = 0;
+
+ customkeys[numcustomkeys].index = -1;
+
+ copy_basekeys(normalkeys);
+ copy_basekeys(extendedkeys);
+ copy_basekeys(shiftedcurs);
+
+ switch(keyboard_type) {
+ case 0:
+ break;
+
+ case 1:
+ copy_basekeys(spectrumkeys);
+ break;
+
+ case 2:
+ if(spkb_trueshift == -1) spkb_trueshift = 0;
+#if TRUEKOMPAT
+ if(spkb_funcshift == -1) spkb_funcshift = 0;
+#endif
+
+ copy_basekeys(compatkeys);
+ break;
+
+ case 3:
+ copy_basekeys(customkeys);
+ break;
+ }
+
+ switch(cursor_type) {
+ case 0:
+ break;
+
+ case 1:
+ copy_basekeys(rawcurs);
+ break;
+
+ case 2:
+ copy_basekeys(joycurs);
+ break;
+ }
+
+ if(spkb_trueshift == -1) spkb_trueshift = 4; /* mod1 */
+ if(spkb_funcshift == -1) spkb_funcshift = 3; /* control */
+
+ trueshift = transform_shift(spkb_trueshift);
+ funcshift = transform_shift(spkb_funcshift);
+}
+
+
+void spkb_refresh(void)
+{
+ int port, pb;
+ int i, j, changed;
+ byte *km, *kmo;
+ byte mm;
+ byte pv;
+ spkeyboard statemx;
+
+ km = spkey_state;
+ kmo = oldstate;
+ changed = 0;
+ for(i = 8; i; i--) {
+ if(*km != *kmo) *kmo = *km, changed = 1;
+ km++, kmo++;
+ }
+
+ if(changed) {
+
+ /* Matrix behavior: ONLY 1 level, does anybody need more ? */
+
+ for(i = 0; i < 8; i++) {
+ pv = spkey_state[i];
+ mm = pv;
+ if(pv) {
+ km = spkey_state;
+ for(j = 8; j; j--) {
+ if((*km & pv) & 0x1F) mm |= *km;
+ km++;
+ }
+ }
+ statemx[i] = mm;
+ }
+
+ for(port = 0; port < 256; port++) {
+ km = statemx;
+ pv = 0;
+ pb = port;
+ for(i = 8; i; i--) {
+ if(!(pb & 1)) pv |= *km;
+ pb >>= 1;
+ km++;
+ }
+ sp_fe_inport_high[port] =
+ (sp_fe_inport_high[port] | 0x1F) & ~(pv & 0x1F);
+ }
+ }
+
+ pv = spmisc_state[0];
+
+ if((pv & KEMPR) && (pv & KEMPL)) pv &= ~(KEMPR | KEMPL);
+ if((pv & KEMPU) && (pv & KEMPD)) pv &= ~(KEMPD | KEMPU);
+ z80_inports[KEMP_PORT] = pv;
+}
+
+
+
+
+#if 0
+static void print_help(int lev)
+{
+ lev=lev;
+#if 0
+switch(lev) {
+ case 0:
+ printf(" = ZX Spectrum Emulation (C) Szeredi Miklos 1996-98 = \n"
+ " ----------------------------------------------------------\n"
+ " Left Shift Spectrum - CAPS SHIFT \n"
+ " Right Shift Spectrum - SYMBOL SHIFT \n"
+ " Alt \"True\" Shift \n"
+ " Ctrl Commands \n"
+ " ----------------------------------------------------------\n"
+ " Ctrl-c F10 Quit \n"
+ " Ctrl-h F1 More help \n"
+ " Ctrl-t F2 Save snapshot \n"
+ " Ctrl-l F3 Load snapshot \n"
+ " Ctrl-p F4 Play tape \n"
+ " Ctrl-q F5 Reset \n"
+ " Ctrl-o F6 Pause/unpause tape \n"
+ " Ctrl-s F7 Stop tape \n"
+ " Ctrl-f Fast \n"
+ " Ctrl-n Normal speed \n"
+ " Ctrl-b Pause/Unpause emulator \n"
+ " Ctrl-m Toggle sound \n"
+ " Ctrl-y Toggle quick loading of tapes \n"
+ " Ctrl-\\ F9 Refresh screen / reset keyboard \n"
+ " ==========================================================\n");
+ break;
+
+ case 1:
+ printf(" = ZX Spectrum Emulation (C) Szeredi Miklos 1996-98 = \n"
+ " ----------------------------------------------------------\n"
+ " More help: \n"
+ " ----------------------------------------------------------\n"
+ " Ctrl-h F1 Normal help \n"
+ " Ctrl-k Display (undisplay) keyboard \n"
+ " Ctrl-w Ctrl-F2 Save temporary snapshot \n"
+ " Ctrl-e Ctrl-F3 Load temporary snapshot \n"
+ " Ctrl-r Save to tapefile \n"
+ " Ctrl-, Reduce screen size (X only) \n"
+ " Ctrl-. Increase screen size (X only) \n"
+ " Ctrl-. Toggle private color-map (X only) \n"
+ " Ctrl-= Decrease frame frequency \n"
+ " Ctrl-- Increase frame frequency \n"
+ " Ctrl-] Increase sound buffer size \n"
+ " Ctrl-[ Decrease sound buffer size \n"
+ " ==========================================================\n");
+ break;
+
+ case 2:
+ printf(
+" --------------------------------------------------------------------- \n"
+"|BLUE |RED |MAGENT|GREEN |CYAN |YELLOW|WHITE | | |BLACK | \n"
+"| 1 ! | 2 @ | 3 # | 4 $ | 5 %% | 6 & | 7 ' | 8 ( | 9 ) | 0 _ | \n"
+"|EDIT |CAPS |TRU VD|INV VD| <- | v | ^ | -> |GRAPH |DELETE| \n"
+"|DEF FN|FN |LINE |OPEN# |CLOSE#|MOVE |ERASE |POINT |CAT |FORMAT| \n"
+" ------------------------------------------------------------------------ \n"
+" |SIN |COS |TAN |INT |RND |STR$ |CHR$ |CODE |PEEK |TAB | \n"
+" | Q <= | W <> | E >= | R < | T > | Y AND| U OR | I AT | O ; | P \" | \n"
+" |PLOT |DRAW |REM |RUN |RAND |RETURN|IF |INPUT |POKE |PRINT | \n"
+" |ASN |ACS |ATN |VERIFY|MERGE | [ | ] |IN |OUT |(C) | \n"
+" ------------------------------------------------------------------------ \n"
+" |READ |RESTOR|DATA |SGN |ABS |SQR |VAL |LEN |USR | |\n"
+" |A STOP| S NOT|D STEP| F TO |G THEN| H ^ | J - | K + | L = | |\n"
+" |NEW |SAVE |DIM |FOR |GO TO |GO SUB|LOAD |LIST |LET |ENTER|\n"
+" | ~ | | | \\ | { | } |CIRCLE|VAL$ |SCRN$ |ATTR | |\n"
+" -------------------------------------------------------------------------- \n"
+" | |LN |EXP |LPRINT|LLIST |BIN |INKEY$| PI | | | \n"
+" | CAPS | Z : | X GBP| C ? | V / | B * | N , | M . |SYMBOL| BREAK | \n"
+" | SHIFT |COPY |CLEAR |CONT |CLS |BORDER|NEXT |PAUSE |SHIFT | SPACE | \n"
+" | |BEEP |INK |PAPER |FLASH |BRIGHT|OVER |INVERS| | | \n"
+" ----------------------------------------------------------------------- \n"
+ );
+ break;
+
+ }
+/* if(need_switch_mode) {
+ printf(" Press ENTER to continue! \n");
+ while(getchar() != '\n');
+ }*/
+#endif
+}
+#endif
+#ifdef DEBUG_Z80
+extern int deb_steps;
+#endif
+
+#define CF(x) ((x) + 12)
+
+int spkey_keyfuncs(void)
+{
+ static int help_mode = 0;
+ int lch;
+ int new_help_mode;
+
+ lch = spkb_last.keysym;
+
+ if(!(spkb_last.modif & funcshift) &&
+ (lch < SK_F1 || lch > SK_F12 ||
+ (spkb_last.modif & SKMod1Mask))) return 0;
+
+ if(lch >= 'A' && lch <= 'Z') lch += 32;
+ if((spkb_last.modif & funcshift) && lch >= SK_F1 && lch <= SK_F12)
+ lch = CF(lch);
+
+ new_help_mode = 0;
+
+ switch(lch) {
+ case 'c':
+/* case SK_F10:
+ exit(0);*/
+ case 'p':
+ case SK_F4:
+ spkey_textmode();
+ start_play();
+ spkey_screenmode();
+ break;
+ case 'r':
+ spkey_textmode();
+ start_rec();
+ spkey_screenmode();
+ break;
+ case 'o':
+ case SK_F6:
+ pause_play();
+ break;
+ case 's':
+ case SK_F7:
+ stop_play();
+ break;
+ case 'f':
+ sp_nosync = 1;
+ sp_paused = 0;
+ autoclose_sound();
+ break;
+ case 'n':
+ sp_nosync = 0;
+ sp_paused = 0;
+ break;
+ case 'b':
+ sp_paused = !sp_paused;
+ if(sp_paused) clear_keystates();
+ /*sprintf(msgbuf, "%s emulator", sp_paused ? "Paused" : "Unpaused");
+ put_msg(msgbuf);*/
+/* rb->splash (HZ*2, true,sp_paused ? "Paused" : "Unpaused");*/
+ break;
+ case 'q':
+ case SK_F5:
+ z80_reset();
+ break;
+ case 't':
+ case SK_F2:
+ spkey_textmode();
+ save_snapshot();
+ spkey_screenmode();
+ break;
+ case 'l':
+ case SK_F3:
+ spkey_textmode();
+ load_snapshot();
+ spkey_screenmode();
+ break;
+#ifdef DEBUG_Z80
+ case 'v':
+ deb_steps = 0;
+ break;
+#endif
+ case '=':
+ if(showframe < 10) showframe++;
+/* sprintf(msgbuf, "showframe: %i", showframe);
+ put_msg(msgbuf);*/
+ break;
+ case '-':
+ if(showframe > 1) showframe--;
+/* sprintf(msgbuf, "showframe: %i", showframe);
+ put_msg(msgbuf);*/
+ break;
+ case ']':
+ if(bufframes < 25) bufframes++;
+/* sprintf(msgbuf, "msgbuf, bufframes: %i", bufframes);
+ put_msg(msgbuf);*/
+ setbufsize();
+ break;
+ case '[':
+ if(bufframes > 1) bufframes--;
+/* sprintf(msgbuf, "bufframes: %i", bufframes);
+ put_msg(msgbuf);*/
+ setbufsize();
+ break;
+ case 'm':
+ sound_on = !sound_on;
+/* sprintf(msgbuf, "sound %s", sound_on ? "on" : "off");
+ put_msg(msgbuf);*/
+ break;
+ case 'h':
+ case SK_F1:
+/* case SK_Help:
+ spkey_textmode();
+ print_help(help_mode);
+ spkey_screenmode();
+ new_help_mode = 1 - help_mode;
+ break;*/
+/* case 'k':
+ spkey_textmode();
+ if(!display_keyboard()) print_help(2);
+ spkey_screenmode();
+ break;*/
+ case '\\':
+ case SK_F9:
+ spscr_refresh_colors();
+/* sp_init_screen_mark(); already donde in prev fn. */
+ clear_keystates();
+ break;
+ case '.':
+ resize_spect_scr(scrmul+1);
+ break;
+ case ',':
+ resize_spect_scr(scrmul-1);
+ break;
+ case 'y':
+ sp_quick_load = !sp_quick_load;
+/* sprintf(msgbuf, "Quick load %s", sp_quick_load ? "on" : "off");
+ put_msg(msgbuf);*/
+ break;
+ case 'w':
+ case CF(SK_F2):
+ save_quick_snapshot();
+ break;
+ case 'e':
+ case CF(SK_F3):
+ load_quick_snapshot();
+ break;
+ case 'j':
+ privatemap = !privatemap;
+/* sprintf(msgbuf, "Private colormap %s", privatemap ? "on" : "off");
+ put_msg(msgbuf);*/
+ spscr_refresh_colors();
+ break;
+ }
+
+ help_mode = new_help_mode;
+
+ return 1;
+}
diff --git a/apps/plugins/zxbox/spkey.h b/apps/plugins/zxbox/spkey.h
new file mode 100644
index 0000000000..a61d209471
--- /dev/null
+++ b/apps/plugins/zxbox/spkey.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPKEY_H
+#define SPKEY_H
+
+extern void spkb_process_events(int evenframe);
+extern void init_spect_key(void);
+
+extern int spkey_new_custom(int key);
+extern int spkey_add_custom(const char *name);
+
+#endif /* SPKEY_H */
diff --git a/apps/plugins/zxbox/spkey_p.h b/apps/plugins/zxbox/spkey_p.h
new file mode 100644
index 0000000000..e73ef8deaa
--- /dev/null
+++ b/apps/plugins/zxbox/spkey_p.h
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPKEY_P_H
+#define SPKEY_P_H
+
+#include "z80_type.h"
+
+struct keystate {
+ dbyte press;
+ byte state;
+ byte base;
+ qbyte frame;
+};
+
+struct onekey {
+ int index;
+ unsigned keysym;
+ unsigned shifted;
+ unsigned modif;
+};
+
+typedef byte spkeyboard[8];
+
+#define SPIP(spk, h) (((qbyte *) (spk))[h])
+
+#define SP_COMBINE(spk1, spk2) \
+ SPIP(spk1, 0) |= SPIP(spk2, 0), \
+ SPIP(spk1, 1) |= SPIP(spk2, 1)
+
+
+#define SP_SUBSTRACT(spk1, spk2) \
+ SPIP(spk1, 0) &= ~SPIP(spk2, 0), \
+ SPIP(spk1, 1) &= ~SPIP(spk2, 1)
+
+
+#define SP_NONEMPTY(spk) (SPIP(spk, 0) || SPIP(spk, 1))
+
+#define SP_CONTAINS(spk1, spk2) \
+ ((SPIP(spk1, 0) & SPIP(spk2, 0)) || (SPIP(spk1, 1) & SPIP(spk2, 1)))
+
+#define SP_SETEMPTY(spk) \
+ SPIP(spk, 0) = 0, \
+ SPIP(spk, 1) = 0
+
+#define SP_COPY(spk1, spk2) \
+ SPIP(spk1, 0) = SPIP(spk2, 0), \
+ SPIP(spk1, 1) = SPIP(spk2, 1)
+
+
+#define TRKS(ks) ((ks) - 0xFF00 + 0x100)
+#define KS_TO_KEY(ks) \
+ (((ks) >= 0x0000 && (ks) <= 0x00FF) ? (int) (ks) : \
+ (((ks) >= 0xFF00 && (ks) <= 0xFFFF) ? (int) TRKS(ks) : -1))
+
+
+
+/* These are _accidently_ the same as the XK_ counterparts */
+
+#define SK_BackSpace 0xFF08 /* back space, back char */
+#define SK_Tab 0xFF09
+#define SK_Linefeed 0xFF0A /* Linefeed, LF */
+#define SK_Clear 0xFF0B
+#define SK_Return 0xFF0D /* Return, enter */
+#define SK_Pause 0xFF13 /* Pause, hold */
+#define SK_Scroll_Lock 0xFF14
+#define SK_Sys_Req 0xFF15
+#define SK_Escape 0xFF1B
+#define SK_Delete 0xFFFF /* Delete, rubout */
+
+#define SK_Home 0xFF50
+#define SK_Left 0xFF51 /* Move left, left arrow */
+#define SK_Up 0xFF52 /* Move up, up arrow */
+#define SK_Right 0xFF53 /* Move right, right arrow */
+#define SK_Down 0xFF54 /* Move down, down arrow */
+#define SK_Page_Up 0xFF55 /* Prior, previous */
+#define SK_Page_Down 0xFF56 /* Next */
+#define SK_End 0xFF57 /* EOL */
+#define SK_Begin 0xFF58 /* BOL */
+
+#define SK_Select 0xFF60 /* Select, mark */
+#define SK_Print 0xFF61
+#define SK_Execute 0xFF62 /* Execute, run, do */
+#define SK_Insert 0xFF63 /* Insert, insert here */
+#define SK_Undo 0xFF65 /* Undo, oops */
+#define SK_Redo 0xFF66 /* redo, again */
+#define SK_Menu 0xFF67
+#define SK_Find 0xFF68 /* Find, search */
+#define SK_Cancel 0xFF69 /* Cancel, stop, abort, exit */
+#define SK_Help 0xFF6A /* Help */
+#define SK_Break 0xFF6B
+#define SK_Mode_switch 0xFF7E /* Character set switch */
+#define SK_Num_Lock 0xFF7F
+
+#define SK_KP_Space 0xFF80 /* space */
+#define SK_KP_Tab 0xFF89
+#define SK_KP_Enter 0xFF8D /* enter */
+#define SK_KP_F1 0xFF91 /* PF1, KP_A, ... */
+#define SK_KP_F2 0xFF92
+#define SK_KP_F3 0xFF93
+#define SK_KP_F4 0xFF94
+#define SK_KP_Home 0xFF95
+#define SK_KP_Left 0xFF96
+#define SK_KP_Up 0xFF97
+#define SK_KP_Right 0xFF98
+#define SK_KP_Down 0xFF99
+#define SK_KP_Page_Up 0xFF9A
+#define SK_KP_Page_Down 0xFF9B
+#define SK_KP_End 0xFF9C
+#define SK_KP_Begin 0xFF9D
+#define SK_KP_Insert 0xFF9E
+#define SK_KP_Delete 0xFF9F
+#define SK_KP_Equal 0xFFBD /* equals */
+#define SK_KP_Multiply 0xFFAA
+#define SK_KP_Add 0xFFAB
+#define SK_KP_Separator 0xFFAC /* separator, often comma */
+#define SK_KP_Subtract 0xFFAD
+#define SK_KP_Decimal 0xFFAE
+#define SK_KP_Divide 0xFFAF
+
+#define SK_KP_0 0xFFB0
+#define SK_KP_1 0xFFB1
+#define SK_KP_2 0xFFB2
+#define SK_KP_3 0xFFB3
+#define SK_KP_4 0xFFB4
+#define SK_KP_5 0xFFB5
+#define SK_KP_6 0xFFB6
+#define SK_KP_7 0xFFB7
+#define SK_KP_8 0xFFB8
+#define SK_KP_9 0xFFB9
+
+#define SK_F1 0xFFBE
+#define SK_F2 0xFFBF
+#define SK_F3 0xFFC0
+#define SK_F4 0xFFC1
+#define SK_F5 0xFFC2
+#define SK_F6 0xFFC3
+#define SK_F7 0xFFC4
+#define SK_F8 0xFFC5
+#define SK_F9 0xFFC6
+#define SK_F10 0xFFC7
+#define SK_F11 0xFFC8
+#define SK_F12 0xFFC9
+
+#define SK_Shift_L 0xFFE1 /* Left shift */
+#define SK_Shift_R 0xFFE2 /* Right shift */
+#define SK_Control_L 0xFFE3 /* Left control */
+#define SK_Control_R 0xFFE4 /* Right control */
+#define SK_Caps_Lock 0xFFE5 /* Caps lock */
+#define SK_Shift_Lock 0xFFE6 /* Shift lock */
+
+#define SK_Meta_L 0xFFE7 /* Left meta */
+#define SK_Meta_R 0xFFE8 /* Right meta */
+#define SK_Alt_L 0xFFE9 /* Left alt */
+#define SK_Alt_R 0xFFEA /* Right alt */
+#define SK_Super_L 0xFFEB /* Left super */
+#define SK_Super_R 0xFFEC /* Right super */
+#define SK_Hyper_L 0xFFED /* Left hyper */
+#define SK_Hyper_R 0xFFEE /* Right hyper */
+
+/* Modifier masks */
+
+#define SKShiftMask (1<<0)
+#define SKLockMask (1<<1)
+#define SKControlMask (1<<2)
+#define SKMod1Mask (1<<3)
+#define SKMod2Mask (1<<4)
+#define SKMod3Mask (1<<5)
+#define SKMod4Mask (1<<6)
+#define SKMod5Mask (1<<7)
+
+
+#define NR_SPKEYS 512
+
+#define ISFKEY(ks) ((ks) >= SK_F1 && (ks) <= SK_F12)
+
+extern volatile int accept_keys;
+
+extern qbyte sp_int_ctr;
+extern struct keystate spkb_kbstate[];
+extern struct onekey spkb_last;
+
+extern int spkb_state_changed;
+
+extern spkeyboard spkey_state;
+extern spkeyboard kb_mkey;
+
+extern void spkey_textmode(void);
+extern void spkey_screenmode(void);
+
+extern const int need_switch_mode;
+
+extern int spkey_keyfuncs(void);
+extern void spkb_refresh(void);
+extern void clear_keystates(void);
+extern int display_keyboard(void);
+extern void process_keys(void);
+extern void init_basekeys(void);
+
+#endif /* SPKEY_P_H */
diff --git a/apps/plugins/zxbox/spmain.c b/apps/plugins/zxbox/spmain.c
new file mode 100644
index 0000000000..2460164e4f
--- /dev/null
+++ b/apps/plugins/zxbox/spmain.c
@@ -0,0 +1,567 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+#include "misc.h"
+#include "zxconfig.h"
+#include "lib/configfile.h"
+
+#include "spperif.h"
+#include "z80.h"
+#include "spmain.h"
+#include "sptiming.h"
+#include "spscr.h"
+#include "spkey_p.h"
+#include "spkey.h"
+#include "sptape.h"
+#include "spsound.h"
+#include "snapshot.h"
+#include "spver.h"
+
+#include "spconf.h"
+
+#include "interf.h"
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#ifdef USE_GRAY
+#include "../lib/gray.h"
+#endif
+
+#include "zxbox_keyb.h"
+
+int endofsingle;
+
+int sp_nosync = 0;
+
+int showframe = 1;
+int load_immed = 1;
+
+qbyte sp_int_ctr = 0;
+int intkeys[5];
+
+#ifdef USE_DJGPP
+#define DOS
+#endif
+
+#define GLOBALCFG "zxbox.cfg"
+
+/* here goes settings hadling */
+
+/*static struct zxbox_settings settings;*/
+static struct zxbox_settings old_settings;
+
+static char* noyes_options[] = { "No", "Yes" };
+/*static char* kempston_options[] = { "No", "Yes" };
+static char* showfps_options[] = {"No", "Yes"};*/
+
+static struct configdata config[] =
+{
+ {TYPE_ENUM, 0, 2, &settings.invert_colors, "Invert Colors", noyes_options, NULL},
+ {TYPE_ENUM, 0, 2, &settings.kempston, "Map keys to kempston", noyes_options, NULL},
+ {TYPE_ENUM, 0, 2, &settings.showfps, "Show Speed", noyes_options, NULL},
+ {TYPE_ENUM, 0, 2, &settings.sound, "Sound", noyes_options, NULL},
+ {TYPE_INT, 0, 9, &settings.frameskip, "Frameskip", NULL, NULL},
+ {TYPE_INT, 1, 10, &settings.volume, "Volume", NULL, NULL},
+ {TYPE_STRING, 0, 5, NULL,"Key Mapping", NULL, (char*)&settings.keymap},
+};
+int spcf_read_conf_file(const char *filename)
+{
+ settings.volume = 10;
+ settings.showfps=1;
+ settings.keymap[0]='2';
+ settings.keymap[1]='w';
+ settings.keymap[2]='9';
+ settings.keymap[3]='0';
+ settings.keymap[4]='z';
+ settings.kempston = 1 ;
+ settings.invert_colors=0;
+ settings.sound = 0;
+ settings.frameskip = 0;
+
+
+ configfile_init(rb);
+ if (configfile_load(filename, config,
+ sizeof(config)/sizeof(*config),
+ SETTINGS_MIN_VERSION
+ ) < 0)
+ {
+ /* If the loading failed, save a new config file (as the disk is
+ already spinning) */
+ configfile_save(filename, config,
+ sizeof(config)/sizeof(*config),
+ SETTINGS_VERSION);
+ }
+ /* Keep a copy of the saved version of the settings - so we can check if
+ the settings have changed when we quit */
+ old_settings = settings;
+ sound_on = settings.sound;
+ showframe = settings.frameskip+1;
+ int i;
+ for ( i=0 ; i<5 ; i++){
+ if (settings.keymap[i] == 'E')
+ intkeys[i]=SK_KP_Enter;
+ else if ( settings.keymap[i] == 'S' )
+ intkeys[i]=SK_KP_Space;
+ else
+ intkeys[i] = (unsigned) settings.keymap[i];
+ }
+ return 1;
+}
+
+/* and here it stops (settings loading ;) )*/
+
+/* set keys */
+static void set_keys(void){
+ int m;
+ char c;
+ int result;
+ int menu_quit=0;
+ static const struct menu_item items[] = {
+ { "Map Up key", NULL },
+ { "Map Down key", NULL },
+ { "Map Left key", NULL },
+ { "Map Right key", NULL },
+ { "Map Fire/Jump key", NULL },
+ };
+
+ m = rb->menu_init(items, sizeof(items) / sizeof(*items),
+ NULL, NULL, NULL, NULL);
+
+ rb->button_clear_queue();
+
+ while (!menu_quit) {
+ result=rb->menu_show(m);
+
+ switch(result)
+ {
+ case 0:
+ if (!zx_kbd_input((char*) &c))
+ {
+ settings.keymap[0]=c;
+ }
+ break;
+ case 1:
+ if (!zx_kbd_input((char*) &c))
+ {
+ settings.keymap[1]=c;
+ }
+ break;
+ case 2:
+ if (!zx_kbd_input((char*) &c))
+ {
+ settings.keymap[2]=c;
+ }
+ break;
+ case 3:
+ if (!zx_kbd_input((char*) &c))
+ {
+ settings.keymap[3]=c;
+ }
+ break;
+ case 4:
+ if (!zx_kbd_input((char*) &c))
+ {
+ settings.keymap[4]=c;
+ }
+ break;
+ default:
+ menu_quit=1;
+ break;
+ }
+ }
+
+ rb->menu_exit(m);
+}
+
+/* select predefined keymap */
+static void select_keymap(void){
+ int m;
+ int result;
+ int menu_quit=0;
+ static const struct menu_item items[] = {
+ { "2w90z", NULL },
+ { "qaopS", NULL },
+ { "7658S", NULL },
+ };
+
+ m = rb->menu_init(items, sizeof(items) / sizeof(*items),
+ NULL, NULL, NULL, NULL);
+
+ rb->button_clear_queue();
+
+ while (!menu_quit) {
+ result=rb->menu_show(m);
+
+ switch(result)
+ {
+ case 0:
+ rb->memcpy ( (void*)&settings.keymap[0] , (void*)items[0].desc , sizeof(items[0].desc));
+ menu_quit=1;
+ break;
+ case 1:
+ rb->memcpy ( (void*)&settings.keymap[0] , (void*)items[1].desc , sizeof(items[1].desc));
+ menu_quit=1;
+ break;
+ case 2:
+ rb->memcpy ( (void*)&settings.keymap[0] , (void*)items[2].desc , sizeof(items[2].desc));
+ menu_quit=1;
+ break;
+ default:
+ menu_quit=1;
+ break;
+ }
+ }
+
+ rb->menu_exit(m);
+}
+
+/* options menu */
+static void options_menu(void){
+ static const struct opt_items no_yes[2] = {
+ { "No", NULL },
+ { "Yes", NULL },
+ };
+ int m;
+ int result;
+ int menu_quit=0;
+ int new_setting;
+ static const struct menu_item items[] = {
+ { "Map Keys to kempston", NULL },
+ { "Display Speed", NULL },
+ { "Invert Colors", NULL },
+ { "Frameskip", NULL },
+ { "Sound", NULL },
+ { "Volume", NULL },
+ { "Predefined keymap", NULL },
+ { "Custom keymap", NULL },
+ };
+ static struct opt_items frameskip_items[] = {
+ { "0", NULL },
+ { "1", NULL },
+ { "2", NULL },
+ { "3", NULL },
+ { "4", NULL },
+ { "5", NULL },
+ { "6", NULL },
+ { "7", NULL },
+ { "8", NULL },
+ { "9", NULL },
+ };
+
+
+ m = rb->menu_init(items, sizeof(items) / sizeof(*items),
+ NULL, NULL, NULL, NULL);
+
+ rb->button_clear_queue();
+
+ while (!menu_quit) {
+ result=rb->menu_show(m);
+
+ switch(result)
+ {
+ case 0:
+ new_setting=settings.kempston;
+ rb->set_option("Map Keys to kempston",&new_setting,INT,
+ no_yes, 2, NULL);
+ if (new_setting != settings.kempston )
+ settings.kempston=new_setting;
+ break;
+ case 1:
+ new_setting = settings.showfps;
+ rb->set_option("Display Speed",&new_setting,INT,
+ no_yes, 2, NULL);
+ if (new_setting != settings.showfps )
+ settings.showfps=new_setting;
+ break;
+ case 2:
+ new_setting = settings.invert_colors;
+ rb->set_option("Invert Colors",&new_setting,INT,
+ no_yes, 2, NULL);
+ if (new_setting != settings.invert_colors )
+ settings.invert_colors=new_setting;
+ rb->splash(HZ, true , "Restart to see effect");
+ break;
+ case 3:
+ new_setting = settings.frameskip;
+ rb->set_option("Frameskip",&new_setting,INT,
+ frameskip_items, 10, NULL);
+ if (new_setting != settings.frameskip )
+ settings.frameskip=new_setting;
+ break;
+ case 4:
+ new_setting = settings.sound;
+ rb->set_option("Sound",&new_setting,INT,
+ no_yes, 2, NULL);
+ if (new_setting != settings.sound )
+ settings.sound=new_setting;
+#if CODEC == SWCODEC && !defined SIMULATOR
+ rb->pcm_play_stop();
+#endif
+ break;
+ case 5:
+ new_setting = 9 - settings.volume;
+ rb->set_option("Volume",&new_setting,INT,
+ frameskip_items, 10, NULL);
+ new_setting = 9 - new_setting;
+ if (new_setting != settings.volume )
+ settings.volume=new_setting;
+ break;
+ case 6:
+ select_keymap();
+ break;
+ case 7:
+ set_keys();
+ break;
+ default:
+ menu_quit=1;
+ break;
+ }
+ }
+
+ rb->menu_exit(m);
+}
+
+/* menu */
+static bool zxbox_menu(void)
+{
+#if CODEC == SWCODEC && !defined SIMULATOR
+ rb->pcm_play_stop();
+#endif
+ int m;
+ int result;
+ int menu_quit=0;
+ int exit=0;
+ char c;
+ static const struct menu_item items[] = {
+ { "VKeyboard", NULL },
+ { "Play/Pause Tape", NULL },
+ { "Save Snapshot", NULL },
+ { "Toggle \"fast\" mode", NULL },
+ { "Options", NULL },
+ { "Quit", NULL },
+ };
+
+ m = rb->menu_init(items, sizeof(items) / sizeof(*items),
+ NULL, NULL, NULL, NULL);
+
+ rb->button_clear_queue();
+
+ while (!menu_quit) {
+ result=rb->menu_show(m);
+
+ switch(result)
+ {
+ case 0:
+ if (!zx_kbd_input((char*) &c))
+ {
+ press_key(c);
+ }
+ clear_kbd=1;
+ menu_quit=1;
+ break;
+ case 1:
+ pause_play();
+/* SPNM(load_trapped) = 1;
+ DANM(haltstate) = 1;
+ DANM(tc) = 0;*/
+ menu_quit=1;
+ break;
+ case 2:
+ save_snapshot();
+ break;
+ case 3:
+ sp_nosync=!sp_nosync;
+ menu_quit=1;
+ break;
+ case 4:
+ options_menu();
+ break;
+ case 5:
+ menu_quit=1;
+ exit=1;
+ break;
+ default:
+ menu_quit=1;
+ break;
+ }
+ }
+
+ rb->menu_exit(m);
+#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
+ rb->cpu_boost(true);
+#endif
+
+ int i;
+ for ( i=0 ; i<5 ; i++){
+ if (settings.keymap[i] == 'E')
+ intkeys[i]=SK_KP_Enter;
+ else if ( settings.keymap[i] == 'S' )
+ intkeys[i]=SK_KP_Space;
+ else
+ intkeys[i] = (unsigned) settings.keymap[i];
+ }
+#ifdef USE_GRAY
+ gray_show(true);
+#endif
+ return (exit);
+}
+
+
+/* */
+extern unsigned char loadim[];
+extern unsigned long loadim_size;
+
+#define SHOW_OFFS 1
+
+static void update(void)
+{
+ update_screen();
+ sp_border_update >>= 1;
+ sp_imag_vert = sp_imag_horiz = 0;
+}
+
+static void run_singlemode(void)
+{
+ int t = 0;
+ int evenframe, halfsec, updateframe;
+
+ sp_int_ctr = 0;
+ endofsingle = 0;
+ spti_reset();
+
+ while(!endofsingle) {
+ video_frames++;
+ if (clear_kbd){
+ clear_keystates();
+ clear_kbd=0;
+ }
+ if(exit_requested){
+ if (zxbox_menu()){
+ /* Save the user settings if they have changed */
+ if (rb->memcmp(&settings,&old_settings,sizeof(settings))!=0) {
+#ifdef USE_GRAY
+ gray_show(false);
+#endif
+ rb->splash(0,true,"Saving settings...");
+ configfile_save(GLOBALCFG, config,sizeof(config)/sizeof(*config),SETTINGS_VERSION);
+ }
+
+ return;
+ }
+ exit_requested = 0;
+ video_frames=-1;
+ start_time = *rb->current_tick;
+ sound_on = settings.sound;
+ showframe = settings.frameskip+1;
+ spti_reset();
+ }
+ if(sp_paused) {
+ autoclose_sound();
+ while(sp_paused) {
+ spkb_process_events(1);
+ spti_sleep(SKIPTICKS);
+ translate_screen();
+ update();
+ }
+ spti_reset();
+ }
+ halfsec = !(sp_int_ctr % 25);
+ evenframe = !(sp_int_ctr & 1);
+
+ if(screen_visible) updateframe = sp_nosync ? halfsec :
+ !((sp_int_ctr+SHOW_OFFS) % showframe);
+ else updateframe = 0;
+ if(halfsec) {
+ sp_flash_state = ~sp_flash_state;
+ flash_change();
+ }
+ if(evenframe) {
+ play_tape();
+ sp_scline = 0;
+ }
+ spkb_process_events(evenframe);
+ sp_updating = updateframe;
+ t += CHKTICK;
+ t = sp_halfframe(t, evenframe ? EVENHF : ODDHF);
+ if(SPNM(load_trapped)) {
+ SPNM(load_trapped) = 0;
+ DANM(haltstate) = 0;
+ qload();
+ }
+ z80_interrupt(0xFF);
+ sp_int_ctr++;
+ if(!evenframe) rec_tape();
+ if(!sp_nosync) {
+ if(!sound_avail) spti_wait();
+
+ if(updateframe) update();
+ play_sound(evenframe);
+ }
+ else if(updateframe) update();
+ }
+
+}
+
+
+void check_params(void* parameter)
+{
+ spcf_read_conf_file(GLOBALCFG);
+ spcf_read_command_line(parameter);
+}
+
+static void init_load(void *parameter)
+{
+ if(load_immed) snsh_z80_load_intern(loadim, loadim_size);
+
+ check_params (parameter);
+ if(spcf_init_snapshot != NULL) {
+#ifndef USE_GRAY
+ rb->splash(HZ,true, "Loading snapshot '%s'", spcf_init_snapshot);
+#endif
+
+ load_snapshot_file_type(spcf_init_snapshot, spcf_init_snapshot_type);
+ free_string(spcf_init_snapshot);
+ }
+
+ if(spcf_init_tapefile != NULL) {
+ /*sprintf(msgbuf, "Loading tape '%s'", spcf_init_tapefile);
+ put_msg(msgbuf);*/
+ start_play_file_type(spcf_init_tapefile, 0, spcf_init_tapefile_type);
+ if(!load_immed) pause_play();
+ free_string(spcf_init_tapefile);
+ }
+}
+
+void start_spectemu(void *parameter)
+{
+ spti_init();
+ init_load(parameter);
+ init_spect_scr();
+ init_spect_sound();
+ init_spect_key();
+
+ run_singlemode();
+}
+
+
+
+
diff --git a/apps/plugins/zxbox/spmain.h b/apps/plugins/zxbox/spmain.h
new file mode 100644
index 0000000000..8168b261f6
--- /dev/null
+++ b/apps/plugins/zxbox/spmain.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPMAIN_H
+#define SPMAIN_H
+
+extern void check_params(void* parameter);
+extern void start_spectemu(void* parameter);
+extern struct zxbox_settings settings;
+struct zxbox_settings {
+ int invert_colors;
+ int kempston;
+ char keymap[5];
+ int showfps;
+ int volume;
+ int sound;
+ int frameskip;
+};
+
+#endif /* SPMAIN_H */
diff --git a/apps/plugins/zxbox/spperif.c b/apps/plugins/zxbox/spperif.c
new file mode 100644
index 0000000000..6255ba689a
--- /dev/null
+++ b/apps/plugins/zxbox/spperif.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "spperif.h"
+#include "z80.h"
+
+extern unsigned char rom_imag[];
+
+int SPNM(quick_load) = 1;
+int SPNM(load_trapped);
+
+qbyte SPNM(scr_mark)[SCRMARK_SIZE];
+byte SPNM(fe_inport_high)[256];
+
+int SPNM(scline);
+
+
+unsigned char SPNM(colors)[16];
+
+int SPNM(flash_state);
+
+qbyte *SPNM(scr_f0_table);
+qbyte *SPNM(scr_f1_table);
+
+byte SPNM(tape_impinfo)[PORT_TIME_NUM];
+byte SPNM(fe_inport_default);
+byte SPNM(fe_outport_time)[PORT_TIME_NUM];
+byte SPNM(sound_buf)[PORT_TIME_NUM];
+signed char SPNM(tape_sound)[TMNUM];
+int SPNM(scri)[PORT_TIME_NUM];
+int SPNM(coli)[PORT_TIME_NUM];
+
+int SPNM(playing_tape) = 0;
+int SPNM(paused) = 0;
+
+char *SPNM(image);
+int SPNM(updating);
+qbyte SPNM(imag_mark)[192];
+qbyte SPNM(imag_horiz);
+qbyte SPNM(imag_vert);
+int SPNM(border_update);
+int SPNM(lastborder);
+
+void SPNM(init_screen_mark)(void)
+{
+ int i;
+
+ for(i = 0x200; i < 0x2D8; i++) SPNM(scr_mark)[i] = ~((qbyte) 0);
+
+ SPNM(border_update) = 1;
+}
+
+void SPNM(init)(void)
+{
+ int i;
+
+ PRNM(init)();
+ PRNM(reset)();
+
+ SPNM(load_trapped) = 0;
+
+ for(i = 0; i < PORTNUM; i++) PRNM(inports)[i] = 0x00;
+
+ DANM(inport_mask) = 0x20;
+/* TODO: Kempston is always present, this is not nice */
+
+ SPNM(fe_inport_default) = 0xBF; /* Issue 3 */
+
+ DANM(ula_outport) = 0xFF;
+
+ for(i = 0; i < 256; i++) SPNM(fe_inport_high)[i] = 0xFF;
+
+ for(i = 0; i < PORT_TIME_NUM; i++) SPNM(tape_impinfo)[i] = 0;
+ DANM(imp_change) = 0;
+ DANM(ula_inport) = SPNM(fe_inport_default);
+
+ SPNM(scline) = 0;
+
+ for(i = 0; i < 0x4000; i++) PRNM(proc).mem[i] = rom_imag[i];
+
+ SPNM(init_screen_mark)();
+}
diff --git a/apps/plugins/zxbox/spperif.h b/apps/plugins/zxbox/spperif.h
new file mode 100644
index 0000000000..cb0d550072
--- /dev/null
+++ b/apps/plugins/zxbox/spperif.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPPERIF_H
+#define SPPERIF_H
+
+#ifndef COMPARISON
+#define SPNM(x) sp_ ## x
+#else
+#define SPNM(x) spx_ ## x
+#endif
+
+#include "z80_type.h"
+
+#define ST 140000
+#define CHKTICK 224
+
+/* #define TMNUM (ST / CHKTICK) */
+
+#if 0
+# define TMNUM 625
+# define EVENHF 313
+# define ODDHF 312
+#else
+# define TMNUM 624
+# define EVENHF 312
+# define ODDHF 312
+#endif
+
+
+#define LOAD_DI 0x0559
+#define SA_LD_RET 0x053F
+
+extern int SPNM(quick_load);
+extern int SPNM(load_trapped);
+
+#define SCRMARK_SIZE 2048
+extern qbyte SPNM(scr_mark)[];
+extern byte SPNM(fe_inport_high)[];
+extern int SPNM(playing_tape);
+extern int SPNM(paused);
+
+extern int SPNM(scline);
+
+extern unsigned char SPNM(colors)[];
+
+extern int SPNM(flash_state);
+
+extern qbyte *SPNM(scr_f0_table);
+extern qbyte *SPNM(scr_f1_table);
+
+extern int SPNM(scri)[];
+extern int SPNM(coli)[];
+
+#define PORT_TIME_NUM 1024
+extern byte SPNM(tape_impinfo)[];
+extern byte SPNM(fe_inport_default);
+extern byte SPNM(fe_outport_time)[];
+extern signed char SPNM(tape_sound)[];
+extern byte SPNM(sound_buf)[];
+
+
+extern char *SPNM(image);
+extern int SPNM(updating);
+extern qbyte SPNM(imag_mark)[];
+extern qbyte SPNM(imag_horiz);
+extern qbyte SPNM(imag_vert);
+extern int SPNM(border_update);
+extern int SPNM(lastborder);
+
+extern void SPNM(init_screen_mark)(void);
+extern void SPNM(init)(void);
+extern int SPNM(halfframe)(int firsttick, int numlines);
+
+#endif /* SPPERIF_H */
diff --git a/apps/plugins/zxbox/spscr.c b/apps/plugins/zxbox/spscr.c
new file mode 100644
index 0000000000..4cae8654ae
--- /dev/null
+++ b/apps/plugins/zxbox/spscr.c
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "spscr_p.h"
+#include "spscr.h"
+
+#include "spperif.h"
+#include "z80.h"
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int color_type = 0;
+
+#define N0 0x04
+#define N1 0x34
+
+#define B0 0x08
+#define B1 0x3F
+
+
+struct rgb *spscr_crgb;
+
+static struct rgb norm_colors[COLORNUM]={
+ {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
+ {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},
+
+ {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
+ {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
+};
+
+static struct rgb gray_colors[COLORNUM]={
+ {0,0,0},{20,20,20},{26,26,26},{32,32,32},
+ {38,38,38},{44,44,44},{50,50,50},{56,56,56},
+
+ {16,16,16},{23,23,23},{30,30,30},{36,36,36},
+ {43,43,43},{50,50,50},{56,56,56},{63,63,63}
+};
+
+struct rgb custom_colors[COLORNUM]={
+ {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
+ {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},
+
+ {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
+ {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
+};
+
+
+#define TABOFFS 2
+
+volatile int screen_visible = 1;
+volatile int accept_keys = 1;
+
+
+byte *update_screen_line(byte *scrp, int coli, int scri, int border,
+ qbyte *cmarkp)
+{
+ qbyte *scrptr;
+ qbyte brd_color;
+ int i;
+ qbyte *tmptr, *mptr;
+ qbyte mark, cmark;
+
+ cmark = *cmarkp;
+ scrptr = (qbyte *) scrp;
+ if(scri >= 0) { /* normal line */
+ if(SPNM(border_update)) {
+ brd_color = SPNM(colors)[border];
+ brd_color |= brd_color << 8;
+ brd_color |= brd_color << 16;
+ for(i = 8; i; i--) *scrptr++ = brd_color;
+ scrptr += 0x40;
+ for(i = 8; i; i--) *scrptr++ = brd_color;
+ scrptr -= 0x48;
+ }
+ else scrptr += 0x08;
+ tmptr = SPNM(scr_mark) + 0x2C0 + (coli >> 3);
+ mark = *tmptr;
+ if(!(coli & 0x07)) {
+ cmark = mark;
+ *tmptr = 0;
+ }
+ else cmark |= mark;
+ mptr = SPNM(scr_mark) + scri;
+
+ mark = *mptr | cmark;
+ if(mark) {
+ byte *spmp, *spcp;
+ qbyte *scr_tab;
+
+ *mptr = 0;
+ SPNM(imag_mark)[coli] |= mark;
+ SPNM(imag_horiz) |= mark;
+ coli >>= 3;
+ SPNM(imag_vert) |= (1 << coli);
+
+ spmp = PRNM(proc).mem + (scri << 5);
+ spcp = PRNM(proc).mem + 0x5800 + (coli << 5);
+
+ if(!SPNM(flash_state)) scr_tab = SPNM(scr_f0_table);
+ else scr_tab = SPNM(scr_f1_table);
+ for(i = 32; i; i--) {
+ register dbyte spcx, spmx;
+ spcx = (*spcp++) << 6;
+ spmx = *spmp++;
+ *scrptr++ = scr_tab[spcx|((spmx & 0xf0) >> 4)];
+ *scrptr++ = scr_tab[spcx|((spmx & 0x0f))];
+ }
+ scrptr +=0x08;
+ }
+ else scrptr += 0x48;
+ }
+ else if(scri == -1) { /* only border */
+ if(SPNM(border_update)) {
+ brd_color = SPNM(colors)[border];
+ brd_color |= brd_color << 8;
+ brd_color |= brd_color << 16;
+ for(i = 0x50; i; i--) *scrptr++ = brd_color;
+ }
+ else scrptr += 0x50;
+ }
+
+ *cmarkp = cmark;
+ return (byte *) scrptr;
+}
+
+void translate_screen(void)
+{
+ int border, scline;
+ byte *scrptr;
+ qbyte cmark = 0;
+
+ scrptr = (byte *) SPNM(image);
+
+ border = DANM(ula_outport) & 0x07;
+ if(border != SPNM(lastborder)) {
+ SPNM(border_update) = 2;
+ SPNM(lastborder) = border;
+ }
+
+ for(scline = 0; scline < (TMNUM / 2); scline++)
+ scrptr = update_screen_line(scrptr, SPNM(coli)[scline], SPNM(scri)[scline],
+ border, &cmark);
+
+}
+
+
+void spscr_init_mask_color(void)
+{
+ int clb;
+ int bwb;
+ int hb;
+ int ix, j;
+ int bc, fc;
+ byte *tab_f0, *tab_f1;
+
+ sp_scr_f0_table = (qbyte *) (PRNM(proc).mem + 0x10000);
+ sp_scr_f1_table = (qbyte *) (PRNM(proc).mem + 0x20000);
+
+ sp_colors[8] = sp_colors[0];
+
+ for(clb = 0; clb < 256; clb++)
+ for(hb = 0; hb < 16; hb++) {
+
+ bc = (clb & 0x38) >> 3;
+ fc = clb & 0x07;
+
+ if(clb & 0x40) {
+ fc |= 0x08;
+ bc |= 0x08;
+ }
+ bwb = hb;
+
+ ix = (clb << 8) + (hb << TABOFFS);
+ tab_f0 = ((byte *) sp_scr_f0_table) + ix + 3;
+ tab_f1 = ((byte *) sp_scr_f1_table) + ix + 3;
+
+ for(j = 4; j; bwb >>= 1, j--) {
+ *tab_f0-- = (byte) sp_colors[(bwb & 0x01) ? fc : bc];
+ *tab_f1-- = (byte) sp_colors[(clb & 0x80) ?
+ ((bwb & 0x01) ? bc : fc) :
+ ((bwb & 0x01) ? fc : bc)];
+ }
+ }
+}
+
+void flash_change(void)
+{
+ int i,j;
+ byte *scp;
+ qbyte *mcp;
+ register unsigned int val;
+
+ mcp = sp_scr_mark + 0x2C0;
+ scp = z80_proc.mem + 0x5800;
+
+ for(i = 24; i; mcp++, i--) {
+ val = 0;
+ for(j = 32; j; scp++, j--) {
+ val >>= 1;
+ if(*scp & 0x80) val |= (1 << 31);
+ }
+ *mcp |= val;
+ }
+}
+
+void spscr_init_line_pointers(int lines)
+{
+ int i;
+ int bs;
+ int y;
+ int scline;
+
+ bs = (lines - 192) / 2;
+
+ for(i = 0; i < PORT_TIME_NUM; i++) {
+
+ sp_scri[i] = -2;
+
+ if(i < ODDHF) scline = i;
+ else scline = i - ODDHF;
+
+ if(scline >= 64-bs && scline < 256+bs) {
+ if(scline >= 64 && scline < 256) {
+ y = scline - 64;
+ sp_coli[i] = y;
+ sp_scri[i] = 0x200 +
+ (y & 0xC0) + ((y & 0x07) << 3) + ((y & 0x38) >> 3);
+ }
+ else sp_scri[i] = -1;
+ }
+ }
+}
+
+void spscr_init_colors(void)
+{
+ spscr_crgb = norm_colors;
+
+ switch(color_type) {
+ case 0:
+ spscr_crgb = norm_colors;
+ break;
+
+ case 1:
+ spscr_crgb = gray_colors;
+ break;
+
+ case 2:
+ spscr_crgb = custom_colors;
+ break;
+ }
+}
diff --git a/apps/plugins/zxbox/spscr.h b/apps/plugins/zxbox/spscr.h
new file mode 100644
index 0000000000..028e676dcf
--- /dev/null
+++ b/apps/plugins/zxbox/spscr.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPSCR_H
+#define SPSCR_H
+
+#include "z80_type.h"
+
+extern int scrmul;
+extern volatile int screen_visible;
+
+extern void init_spect_scr(void);
+extern void destroy_spect_scr(void);
+extern void resize_spect_scr(int newsize);
+extern void update_screen(void);
+extern void flash_change(void);
+extern void translate_screen(void);
+
+extern byte *update_screen_line(byte *scrp, int coli, int scri, int border,
+ qbyte *cmarkp);
+
+extern void spscr_refresh_colors(void);
+
+#endif /* SPSCR_H */
diff --git a/apps/plugins/zxbox/spscr_p.h b/apps/plugins/zxbox/spscr_p.h
new file mode 100644
index 0000000000..394ce2abd9
--- /dev/null
+++ b/apps/plugins/zxbox/spscr_p.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPSCR_P_H
+#define SPSCR_P_H
+
+#define COLORNUM 16
+
+struct rgb {
+ int r, g, b;
+};
+
+#define SCRSIZE 6912
+#define COLORBEG 6144
+
+extern struct rgb *spscr_crgb;
+extern struct rgb custom_colors[];
+
+extern void spscr_init_mask_color(void);
+extern void spscr_init_line_pointers(int lines);
+extern void spscr_init_colors(void);
+
+#endif /* SPSCR_P_H */
diff --git a/apps/plugins/zxbox/spsound.c b/apps/plugins/zxbox/spsound.c
new file mode 100644
index 0000000000..3ff2690d00
--- /dev/null
+++ b/apps/plugins/zxbox/spsound.c
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos 2006 Anton Romanov
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* #define DEBUG_AUDIO */
+
+#include "spsound.h"
+
+#include "zxconfig.h"
+#include "spperif.h"
+#include "z80.h"
+#include "misc.h"
+#include "interf.h"
+#include "spmain.h"
+
+#include <stdio.h>
+
+int bufframes = 1;
+
+int sound_avail = 0;
+int sound_on = 1;
+
+int sound_to_autoclose = 0;
+int doneplay=0;
+
+
+#ifdef HAVE_SOUND
+
+#include "stdlib.h"
+#include "file.h"
+#include "time.h"
+#include "errno.h"
+#include "string.h"
+
+
+
+#define SKIPTIME 5000
+
+static int last_not_played=0;
+
+#define SPS_OPENED 0
+#define SPS_AUTOCLOSED -1
+#define SPS_BUSY -2
+#define SPS_CLOSED -3
+#define SPS_NONEXIST -4
+
+static int sndstate = SPS_CLOSED;
+
+static void close_snd(int normal);
+unsigned short my_buf[TMNUM*2*3*2] IBSS_ATTR;
+
+
+const byte lin8_ulaw[] = {
+ 31, 31, 31, 32, 32, 32, 32, 33,
+ 33, 33, 33, 34, 34, 34, 34, 35,
+ 35, 35, 35, 36, 36, 36, 36, 37,
+ 37, 37, 37, 38, 38, 38, 38, 39,
+ 39, 39, 39, 40, 40, 40, 40, 41,
+ 41, 41, 41, 42, 42, 42, 42, 43,
+ 43, 43, 43, 44, 44, 44, 44, 45,
+ 45, 45, 45, 46, 46, 46, 46, 47,
+ 47, 47, 47, 48, 48, 49, 49, 50,
+ 50, 51, 51, 52, 52, 53, 53, 54,
+ 54, 55, 55, 56, 56, 57, 57, 58,
+ 58, 59, 59, 60, 60, 61, 61, 62,
+ 62, 63, 63, 64, 65, 66, 67, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 81, 83, 85, 87, 89,
+ 91, 93, 95, 99, 103, 107, 111, 119,
+ 255, 247, 239, 235, 231, 227, 223, 221,
+ 219, 217, 215, 213, 211, 209, 207, 206,
+ 205, 204, 203, 202, 201, 200, 199, 198,
+ 197, 196, 195, 194, 193, 192, 191, 191,
+ 190, 190, 189, 189, 188, 188, 187, 187,
+ 186, 186, 185, 185, 184, 184, 183, 183,
+ 182, 182, 181, 181, 180, 180, 179, 179,
+ 178, 178, 177, 177, 176, 176, 175, 175,
+ 175, 175, 174, 174, 174, 174, 173, 173,
+ 173, 173, 172, 172, 172, 172, 171, 171,
+ 171, 171, 170, 170, 170, 170, 169, 169,
+ 169, 169, 168, 168, 168, 168, 167, 167,
+ 167, 167, 166, 166, 166, 166, 165, 165,
+ 165, 165, 164, 164, 164, 164, 163, 163,
+ 163, 163, 162, 162, 162, 162, 161, 161,
+ 161, 161, 160, 160, 160, 160, 159, 159,
+};
+
+static void open_snd(void)
+{
+ sndstate = SPS_OPENED;
+ sound_avail=1;
+ rb->pcm_play_stop();
+ rb->pcm_set_frequency(44100);
+
+}
+
+static void close_snd(int normal)
+{
+ (void)normal;
+ sound_avail = 0;
+ rb->pcm_play_stop();
+ rb->pcm_set_frequency(44100);
+}
+
+
+
+void init_spect_sound(void)
+{
+#if 1 /* TODO: Is this OK? */
+ open_snd();
+#endif
+}
+
+
+//#define VOLREDUCE settings.volume
+//
+#ifndef VOLREDUCE
+#define VOLREDUCE 0
+#endif
+
+#define CONVU8(x) ((byte) (((x) >> VOLREDUCE) + 128))
+
+#ifdef CONVERT_TO_ULAW
+# define CONV(x) lin8_ulaw[(int) CONVU8(x)]
+#else
+# define CONV(x) CONVU8(x)
+#endif
+
+#define HIGH_PASS(hp, sv) (((hp) * 15 + (sv)) >> 4)
+#define TAPESOUND(tsp) ((*tsp) >> 4)
+
+static void process_sound(void)
+{
+ static int soundhp;
+ int i;
+ byte *sb;
+ register int sv;
+
+ sb = sp_sound_buf;
+ if(last_not_played) {
+ soundhp = *sb;
+ last_not_played = 0;
+ }
+
+ if(!sp_playing_tape) {
+ for(i = TMNUM; i; sb++,i--) {
+ sv = *sb;
+ soundhp = HIGH_PASS(soundhp, sv);
+ *sb = CONV(sv - soundhp);
+ }
+ }
+ else {
+ signed char *tsp;
+
+ tsp = sp_tape_sound;
+ for(i = TMNUM; i; sb++,tsp++,i--) {
+ sv = *sb + TAPESOUND(tsp);
+ soundhp = (soundhp * 15 + sv)>>4;
+ *sb = CONV(sv - soundhp);
+ }
+ }
+}
+
+void autoclose_sound(void)
+{
+ /* do we have any reason to autoclose sound? */
+#if 0
+ if(sound_on && sound_to_autoclose && sndstate >= SPS_CLOSED) {
+ close_snd(1);
+ sndstate = SPS_AUTOCLOSED;
+ }
+#endif
+}
+void get_more(unsigned char** start, size_t* size)
+{
+ doneplay = 1;
+ *start = (unsigned char*)(my_buf);
+ *size = TMNUM*4*3*2;
+}
+
+/* sp_sound_buf is Unsigned 8 bit, Rate 8000 Hz, Mono */
+
+void write_buf(void){
+ int i,j;
+
+ /* still not sure what is the best way to do this */
+#if 0
+ my_buf[i] = /*(sp_sound_buf[i]<<8)-0x8000*/sp_sound_buf[i]<<8;
+
+
+ for (i = 0, j = 0; i<TMNUM; i++, j+=6)
+ my_buf[j] = my_buf[j+1] = my_buf[j+2] = my_buf[j+3] = my_buf[j+4] = my_buf[j+5] = (((byte)sp_sound_buf[i])<<8) >> settings.volume;
+#endif
+
+
+ for (i = 0, j = 0; i<TMNUM; i++, j+=12)
+ my_buf[j] = my_buf[j+1] = my_buf[j+2] = my_buf[j+3]\
+ = my_buf[j+4] = my_buf[j+5] = my_buf[j+6]\
+ = my_buf[j+7] = my_buf[j+8] = my_buf[j+9] \
+ = my_buf[j+10] = my_buf[j+11] \
+ = (((byte)sp_sound_buf[i])<<8) >> settings.volume;
+
+ rb->pcm_play_data(&get_more,NULL,0);
+
+#if 0
+ /* can use to save and later analyze what we produce */
+ i = rb->open ( "/sound.raw" , O_WRONLY | O_APPEND | O_CREAT );
+ rb->write ( i , sp_sound_buf , TMNUM );
+ rb->close (i);
+
+
+ i = rb->open ( "/sound2.raw" , O_WRONLY | O_APPEND |O_CREAT);
+ rb->write ( i , (unsigned char *)my_buf , TMNUM*4*3 );
+ rb->close (i);
+#endif
+
+
+ while(!doneplay)
+ rb->yield();
+
+}
+void play_sound(int evenframe)
+{
+ if(evenframe) return;
+ if(!sound_on) {
+ if(sndstate <= SPS_CLOSED) return;
+ if(sndstate < SPS_OPENED) {
+ sndstate = SPS_CLOSED;
+ return;
+ }
+ close_snd(1);
+ return;
+ }
+
+ z80_proc.sound_change = 0;
+
+ process_sound();
+
+ write_buf();
+}
+
+
+void setbufsize(void)
+{
+
+}
+
+
+#else /* HAVE_SOUND */
+
+/* Dummy functions */
+
+void setbufsize(void)
+{
+}
+
+void init_spect_sound(void)
+{
+}
+
+void play_sound(int evenframe)
+{
+ (void)evenframe;
+}
+
+void autoclose_sound(void)
+{
+}
+
+#endif /* NO_SOUND */
+
+
diff --git a/apps/plugins/zxbox/spsound.h b/apps/plugins/zxbox/spsound.h
new file mode 100644
index 0000000000..09bf6c8f01
--- /dev/null
+++ b/apps/plugins/zxbox/spsound.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPSOUND_H
+#define SPSOUND_H
+
+extern int bufframes;
+extern int sound_avail;
+extern void setbufsize(void);
+
+extern void autoclose_sound(void);
+extern void init_spect_sound(void);
+extern void play_sound(int evenframe);
+
+extern int sound_on;
+
+#endif /* SPSOUND_H */
diff --git a/apps/plugins/zxbox/sptape.c b/apps/plugins/zxbox/sptape.c
new file mode 100644
index 0000000000..d3642eea4c
--- /dev/null
+++ b/apps/plugins/zxbox/sptape.c
@@ -0,0 +1,765 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+#include "misc.h"
+
+#include "sptape.h"
+#include "tapefile.h"
+
+#include "spperif.h"
+#include "z80.h"
+#include "interf.h"
+#include "spconf.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+
+#define MAXLINELEN 256
+
+int spt_auto_stop = 1;
+
+static int playing = 0;
+static int paused = 0;
+/*static FILE *tapefp;*/
+/*static int *tapefp;*/
+
+static char tapename[MAXFILENAME];
+static int tapetype;
+
+#define EARBIT 0x40
+
+#define IMPBUFLEN 1024
+
+static int ingroup;
+static int segtype;
+
+static int lastdatak;
+
+static int currseg;
+
+static void stop_playing(void)
+{
+ if(playing) close_tapefile();
+ playing = 0;
+}
+
+static void pause_playing(void)
+{
+ if(playing) {
+ paused = 1;
+ playing = 0;
+ }
+}
+
+static void unpause_playing(void)
+{
+ if(paused) {
+ paused = 0;
+ playing = 1;
+ segtype = SEG_END;
+ }
+}
+
+#define MAXDESCLEN 256
+
+static void put_seg_desc(void)
+{
+ if(segtype != SEG_VIRTUAL) {
+ if(segtype > SEG_END) {
+ if(!ingroup) {
+ long len;
+ int i, ml;
+ char *me;
+
+ len = get_seglen();
+
+ me = msgbuf;
+ rb->snprintf(me,MAXDESCLEN, "%4i: ", currseg);
+ me = me+rb->strlen(me);
+ if(segtype >= SEG_DATA && len) {
+ rb->snprintf(me,MAXDESCLEN, "%5li bytes, ", len);
+ me = me+rb->strlen(me);
+ }
+
+ ml = 0;
+ for(i = 0; seg_desc[i]; i++) {
+ if(seg_desc[i] == '\n') {
+ *me = '\0';
+ put_msg(msgbuf);
+
+ me = msgbuf;
+ rb->snprintf(me,MAXDESCLEN, " ");
+ me = me+rb->strlen(me);
+ ml = 0;
+ }
+ else {
+ if(ml < MAXDESCLEN) *me++ = seg_desc[i];
+ ml++;
+ }
+ }
+ *me = '\0';
+ put_msg(msgbuf);
+ }
+ else {
+ rb->snprintf(msgbuf,MAXDESCLEN, "%4i:", currseg);
+ put_tmp_msg(msgbuf);
+ }
+ }
+ else put_msg(seg_desc);
+ }
+#ifdef DEBUG_TAPE
+ else fprintf(stderr, "virtual segment\n");
+#endif
+}
+
+static void get_next_segment(void)
+{
+ int propseg;
+
+ do {
+ propseg = 1;
+
+ segtype = next_segment();
+ currseg = segment_pos();
+
+ put_seg_desc();
+
+ switch(segtype) {
+ case SEG_ERROR:
+ case SEG_END:
+ stop_playing();
+ break;
+
+ case SEG_STOP:
+ pause_playing();
+ put_msg(" * Tape paused; Press Ctrl-o to restart * ");
+ break;
+
+ case SEG_SKIP:
+ propseg = 0;
+ break;
+
+ case SEG_GRP_BEG:
+ ingroup = 1;
+ propseg = 0;
+ break;
+
+ case SEG_GRP_END:
+ ingroup = 0;
+ propseg = 0;
+ break;
+ }
+ } while(!propseg);
+
+ lastdatak = 0;
+}
+
+
+void play_tape(void)
+{
+ static dbyte impbuf[IMPBUFLEN];
+
+ static int clevel;
+ static dbyte *impbufp;
+ static int impbufrem;
+ static long imprem;
+
+ static int cleared_buffers = 1;
+
+ int tsn;
+ dbyte *ibp;
+ byte *tsp;
+ int ibr;
+ long ir;
+ int cl;
+ signed char *op;
+ int ov;
+ int ca;
+
+ tsp = sp_tape_impinfo;
+ op = sp_tape_sound;
+ tsn = TMNUM;
+
+ if(!playing) {
+ if(cleared_buffers) return;
+
+ sp_playing_tape = 0;
+
+ if(!clevel) {
+ ca = CHKTICK;
+ clevel = ~clevel;
+ }
+ else {
+ ca = 0;
+ cleared_buffers = 1;
+ }
+ imprem = CHKTICK * TMNUM;
+ }
+ else if(!sp_playing_tape) {
+ sp_playing_tape = 1;
+ cleared_buffers = 0;
+
+ impbufrem = 0;
+ imprem = 0;
+ clevel = get_level() ? ~(0) : 0;
+ if(clevel) ca = 0;
+ else ca = 1;
+ }
+ else ca = 0;
+
+#ifdef DEBUG_TAPE
+ if(((clevel ? 1 : 0) ^
+ (DANM(ula_inport) & EARBIT ? 1 : 0) ^
+ (DANM(imp_change) ? 1 : 0) ^
+ (ca ? 1 : 0)) == 0)
+ fprintf(stderr, "Levels don't match %i %i\n", imprem, impbufrem);
+#endif
+
+ cl = clevel;
+ ibr = impbufrem;
+ ir = imprem;
+ ibp = impbufp;
+
+ if(cl) ov = CHKTICK/2;
+ else ov = -(CHKTICK/2);
+
+ do {
+ if(ir > 0) {
+ *tsp++ = ca;
+ *op++ = ov;
+ ir -= CHKTICK;
+ tsn--;
+ if(!tsn) goto done;
+
+ if(cl) ov = CHKTICK/2;
+ else ov = -(CHKTICK/2);
+
+ while(ir > 0) {
+ *tsp++ = 0;
+ *op++ = ov;
+ ir -= CHKTICK;
+ tsn--;
+ if(!tsn) goto done;
+ }
+ ca = 0;
+ }
+ if(ibr) {
+ if(!ca) {
+ if(cl) {
+ ov += ir;
+ ca = (CHKTICK/2) - ov + 1;
+ }
+ else {
+ ov -= ir;
+ ca = ov + (CHKTICK/2) + 1;
+ }
+ }
+ else {
+ ca = 0;
+ if(cl) ov += ir;
+ else ov -= ir;
+ }
+ ir += *ibp++;
+ ibr--;
+ cl = ~cl;
+ }
+ else {
+ ibp = impbuf;
+ do {
+ ibr = next_imps(impbuf, IMPBUFLEN, CHKTICK * tsn);
+ if(ibr) break;
+ get_next_segment();
+ if(!playing) {
+ if(!cl) {
+ if(ca) ca = 0;
+ else ca = CHKTICK;
+ cl = ~cl;
+ }
+ ir = tsn*CHKTICK;
+ ov = -(CHKTICK/2);
+ break;
+ }
+ } while(1);
+ }
+
+ } while(1);
+
+ done:
+
+ clevel = cl;
+ impbufrem = ibr;
+ imprem = ir;
+ impbufp = ibp;
+
+ if(segtype >= SEG_DATA) {
+ int datak;
+
+ datak = (int) (get_segpos() / 1000);
+ if(datak > lastdatak) {
+/* if(ingroup) sprintf(msgbuf, "%4i: ", currseg);
+ else sprintf(msgbuf, " ");
+ sprintf(msgbuf+strlen(msgbuf), "%3ik", datak);
+ put_tmp_msg(msgbuf);
+*/
+ lastdatak = datak;
+ }
+ }
+}
+
+/*
+
+2168
+2168 (9-10)
+
+667
+735 (2-4)
+
+855
+855 (3-5)
+
+1710
+1710 (7-9)
+
+945 (4-5)
+
+hosszu: 7..9
+rovid: 2..5
+
+*/
+
+#define MICBIT 0x08
+
+
+#define RC_NONE 0
+#define RC_LEADER 1
+#define RC_SYNC 2
+#define RC_DATA 3
+
+#define MAXLEN TMNUM
+
+#define LEADER_MIN 9
+#define LEADER_MAX 10
+#define SYNC_MIN 2
+#define SYNC_MAX 4
+
+#define BIT0_MIN 3
+#define BIT0_MAX 5
+#define BIT1_MIN 7
+#define BIT1_MAX 9
+
+#define LEADER_MIN_COUNT 512
+/*
+static int rec_segment;
+static int rec_state = RC_NONE;
+static byte *recbuf = NULL;
+static const char *waitchars = "-\\|/";
+*/
+static int recording = 0;
+
+
+
+void rec_tape(void)
+{
+/* static byte lastmic = 0;
+ static int lastlen = 0;
+ static int whole;
+ static int leadercount;
+ static byte data;
+ static byte parity;
+ static int bitnum;
+ static int bytecount;
+ static int recbufsize;
+ static int firsthalf;
+ static int frameswait = 0;
+
+ int tsl;
+ byte *fep;
+ int thishalf;
+
+
+ if(!recording) return;
+
+ for(fep = sp_fe_outport_time, tsl = TMNUM; tsl; fep++, tsl--) {
+ lastlen++;
+ if((*fep & MICBIT) == lastmic) {
+ if(lastlen < MAXLEN) continue;
+ }
+ else lastmic = ~lastmic & MICBIT;
+
+ switch(rec_state) {
+ case RC_NONE:
+ if(lastlen >= LEADER_MIN && lastlen <= LEADER_MAX) {
+ rec_state = RC_LEADER;
+
+ leadercount = 0;
+ break;
+ }
+ if((frameswait++ & 15)) break;
+ frameswait &= 0x3F;
+ sprintf(msgbuf, " %s: WAITING %c",
+ tapename, waitchars[(frameswait >> 4)]);
+ put_tmp_msg(msgbuf);
+ break;
+ case RC_LEADER:
+ if(lastlen >= LEADER_MIN && lastlen <= LEADER_MAX) {
+ leadercount++;
+ if(leadercount == LEADER_MIN_COUNT) {
+ sprintf(msgbuf, " %s: LEADER", tapename);
+ put_tmp_msg(msgbuf);
+ }
+ break;
+ }
+ if(leadercount >= LEADER_MIN_COUNT &&
+ lastlen >= SYNC_MIN && lastlen <= SYNC_MAX) rec_state = RC_SYNC;
+ else rec_state = RC_NONE;
+ break;
+ case RC_SYNC:
+ if(lastlen >= SYNC_MIN && lastlen <= SYNC_MAX) {
+ rec_state = RC_DATA;
+ whole = 0;
+ data = 0;
+ bitnum = 0;
+ bytecount = 0;
+ recbuf = NULL;
+ recbufsize = 0;
+ parity = 0;
+
+ sprintf(msgbuf, " %s: DATA", tapename);
+ put_tmp_msg(msgbuf);
+ }
+ else rec_state = RC_NONE;
+ break;
+ case RC_DATA:
+ thishalf = -1;
+ if(lastlen >= BIT0_MIN && lastlen <= BIT0_MAX) thishalf = 0;
+ else if(lastlen >= BIT1_MIN && lastlen <= BIT1_MAX) thishalf = 1;
+
+ if(thishalf < 0 || (whole && firsthalf != thishalf)) {
+ char filename[11];
+ int filesize;
+ int filetype;
+
+ sprintf(msgbuf, "%s: %03d", tapename, rec_segment);
+ if(bytecount >= 1) {
+ sprintf(msgbuf+strlen(msgbuf),
+ " %02X %5d %3s", recbuf[0], bytecount-2,
+ parity == 0 ? "OK" : "ERR");
+ if(recbuf[0] == 0 && bytecount - 2 >= 17) {
+ filetype = recbuf[1];
+ strncpy(filename, (char*) recbuf+2, 10);
+ filename[10] = '\0';
+ filesize = recbuf[12] + (recbuf[13] << 8);
+
+ sprintf(msgbuf+strlen(msgbuf),
+ " %02X %10s %5i", filetype, filename, filesize);
+ }
+ }
+ put_msg(msgbuf);
+
+ putc(bytecount & 0xFF, tapefp);
+ putc((bytecount >> 8) & 0xFF, tapefp);
+
+ fwrite(recbuf, 1, (size_t) bytecount, tapefp);
+ fflush(tapefp);
+
+ rec_segment++;
+ free(recbuf);
+ recbuf = NULL;
+ rec_state = RC_NONE;
+ break;
+ }
+
+ if(!whole) {
+ whole = 1;
+ firsthalf = thishalf;
+ }
+ else {
+ whole = 0;
+ data |= thishalf;
+ bitnum++;
+
+ if(bitnum == 8) {
+ bitnum = 0;
+ if(recbufsize <= bytecount) {
+ recbufsize += 1024;
+ recbuf = realloc(recbuf, (size_t) recbufsize);
+ if(recbuf == NULL) {
+ //fprintf(stderr, "Out of memory\n");
+ exit(1);
+ }
+ }
+ recbuf[bytecount] = data;
+ parity = parity ^ data;
+ data = 0;
+ bytecount++;
+
+ if(!(bytecount & 1023)) {
+ sprintf(msgbuf, " %s: DATA %i kB",
+ tapename, bytecount >> 10);
+ put_tmp_msg(msgbuf);
+ }
+ }
+ data <<= 1;
+ }
+ break;
+ }
+
+ lastlen = 0;
+ }*/
+}
+
+static void stop_recording(void)
+{
+/* if(recording) {
+ recording = 0;
+ free(recbuf);
+ recbuf = NULL;
+
+ rb->close(tapefp);
+ }*/
+}
+
+static void restart_playing(void)
+{
+ int res;
+ struct tape_options tapeopt;
+
+ if(tapetype < 0) {
+ tapetype = TAP_TZX;
+ res = open_tapefile(tapename, tapetype);
+ if(!res) {
+ tapetype = TAP_TAP;
+ res = open_tapefile(tapename, tapetype);
+ }
+ }
+ else res = open_tapefile(tapename, tapetype);
+
+ if(!res) {
+ put_msg(seg_desc);
+ return;
+ }
+
+ INITTAPEOPT(tapeopt);
+#ifndef DEBUG_Z80
+ tapeopt.blanknoise = 1;
+#endif
+ set_tapefile_options(&tapeopt);
+
+ if(currseg) {
+ res = goto_segment(currseg);
+ if(!res) {
+ put_msg(seg_desc);
+ return;
+ }
+ }
+
+ playing = 1;
+ segtype = SEG_END;
+}
+
+
+void pause_play(void)
+{
+ if(playing) {
+ pause_playing();
+ put_msg(" * Tape paused * ");
+ goto_segment(currseg);
+ }
+ else unpause_playing();
+}
+
+
+void start_play_file_type(char *name, int seg, int type)
+{
+ int filetype = FT_TAPEFILE;
+
+ rb->strncpy(tapename, name, MAXFILENAME-10);
+ tapename[MAXFILENAME-10] = '\0';
+
+ currseg = seg;
+ tapetype = type;
+
+ spcf_find_file_type(tapename, &filetype, &tapetype);
+ if(currseg < 0) currseg = 0;
+
+ ingroup = 0;
+ restart_playing();
+}
+
+void start_play(void)
+{
+ char *name;
+ int t;
+ int seg;
+
+ if(playing || paused || recording) {
+ put_msg(" * Stop the tape first! * ");
+ return;
+ }
+
+ put_msg("Enter tape file path:");
+ name = spif_get_tape_fileinfo(&seg, &t);
+ if(name == NULL) return;
+
+ start_play_file_type(name, seg, -1);
+}
+
+
+void stop_play(void)
+{
+
+ if(playing || paused) {
+ put_msg(" * Stopped playing * ");
+
+ if(playing) stop_playing();
+ if(paused) paused = 0;
+ }
+ else if(recording) {
+ /* sprintf(msgbuf, " * Stopped recording tape `%s' * ", tapename);
+ put_msg(msgbuf);*/
+ stop_recording();
+ }
+}
+
+void start_rec(void)
+{
+#if 0
+ char *name;
+
+ if(playing || paused || recording) return;
+
+ put_msg("Enter tape file to record (default: '.tap'):");
+
+ name = spif_get_filename();
+ if(name == NULL) return;
+
+ strncpy(tapename, name, MAXFILENAME-10);
+ tapename[MAXFILENAME-10] = '\0';
+
+ if(!check_ext(tapename, "tap")) add_extension(tapename, "tap");
+
+ tapefp = fopen(tapename, "ab");
+ if(tapefp == NULL) {
+ sprintf(msgbuf, "Could not open tape file `%s', %s",
+ tapename, strerror(errno));
+ put_msg(msgbuf);
+ return;
+ }
+
+ recording = 1;
+ rec_segment = 0;
+ rec_state = RC_NONE;
+
+ sprintf(msgbuf,
+ "Recordind tape file `%s'. To stop press Ctrl-s", tapename);
+ put_msg(msgbuf);
+#endif
+}
+
+#include "spkey_p.h"
+
+#define CF 0x01
+#define ZF 0x40
+
+void qload(void)
+{
+ byte type, parity;
+ dbyte length, dest, dtmp;
+ int verify, success, firstbyte;
+ int nextdata;
+
+ if(recording) {
+ put_msg("Can't quick load tape, because recording");
+ return;
+ }
+
+ do {
+ if(!playing) {
+ if(paused) unpause_playing();
+ else {
+ spkey_textmode();
+ start_play();
+ spkey_screenmode();
+ }
+ }
+ if(!playing) {
+ put_msg("Not quick loading tape");
+ return;
+ }
+ while(playing && (segtype != SEG_DATA || get_segpos() > 0))
+ get_next_segment();
+
+ } while(!playing);
+
+ dtmp = AFBK;
+ AFBK = AF;
+ AF = dtmp;
+
+ type = RA;
+ verify = !(RF & CF);
+ length = DE;
+ firstbyte = !(RF & ZF);
+ dest = IX;
+
+ parity = 0;
+ success = 0;
+
+ do {
+ nextdata = next_byte();
+ if(nextdata < 0) break;
+
+ parity ^= nextdata;
+
+ if(!length) {
+ if(!parity) success = 1;
+ break;
+ }
+
+ if(firstbyte) {
+ firstbyte = 0;
+ if(nextdata != type) break;
+ }
+ else {
+ if(!verify) {
+ if(dest >= 0x4000) DANM(mem)[dest] = nextdata;
+ }
+ else {
+ if(DANM(mem)[dest] != nextdata) break;
+ }
+ dest++;
+ length--;
+ }
+ } while(1);
+
+ if(success) RF |= (CF | ZF);
+ else RF &= ~(CF | ZF);
+ IX = dest;
+ DE = length;
+
+ PC = SA_LD_RET;
+ DANM(iff1) = DANM(iff2) = 1;
+ DANM(haltstate) = 1;
+
+ sp_init_screen_mark();
+
+ if(spt_auto_stop) pause_playing();
+}
diff --git a/apps/plugins/zxbox/sptape.h b/apps/plugins/zxbox/sptape.h
new file mode 100644
index 0000000000..5d4a8a8eaa
--- /dev/null
+++ b/apps/plugins/zxbox/sptape.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPTAPE_H
+#define SPTAPE_H
+
+extern void play_tape(void);
+extern void rec_tape(void);
+
+extern void stop_play(void);
+extern void pause_play(void);
+
+extern void start_play(void);
+extern void start_play_file_type(char *name, int seg, int type);
+
+extern void start_rec(void);
+extern void qload(void);
+
+#endif /* SPTAPE_H */
diff --git a/apps/plugins/zxbox/sptiming.c b/apps/plugins/zxbox/sptiming.c
new file mode 100644
index 0000000000..e039cf4b2d
--- /dev/null
+++ b/apps/plugins/zxbox/sptiming.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos 2006 Anton Romanov
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "zxconfig.h"
+
+#include "sptiming.h"
+#include "interf.h"
+/* not precise but .... anyway this is used only when not playing
+ * sound ... */
+long shouldbe_tick;
+
+void spti_init(void){
+ spti_reset();
+}
+void spti_sleep(unsigned long usecs){
+/* unsigned long now,need;
+ now = *rb->current_tick;
+ need = now + usecs;
+ rb -> sleep ( need - now );*/
+ rb->sleep ( usecs );
+}
+void spti_reset(void){
+ shouldbe_tick = *rb -> current_tick;
+}
+void spti_wait(void){
+ long rem;
+ long now;
+
+ now = *rb -> current_tick;
+ shouldbe_tick+=SKIPTICKS;
+ rem = shouldbe_tick - now;
+
+ if(rem > 0) {
+ if(rem > SKIPTICKS) rem = SKIPTICKS;
+ spti_sleep((unsigned long) rem);
+ }
+ if(rem == SKIPTICKS || rem < -10 * SKIPTIME) spti_reset();
+}
diff --git a/apps/plugins/zxbox/sptiming.h b/apps/plugins/zxbox/sptiming.h
new file mode 100644
index 0000000000..577ce33836
--- /dev/null
+++ b/apps/plugins/zxbox/sptiming.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef SPTIMING_H
+#define SPTIMING_H
+
+#define SKIPMS 20
+#define SKIPTIME (SKIPMS * 1000)
+#define SKIPTICKS 20*HZ/1000
+
+extern void spti_init(void);
+extern void spti_sleep(unsigned long usecs);
+extern void spti_reset(void);
+extern void spti_wait(void);
+
+#endif /* SPTIMING_H */
diff --git a/apps/plugins/zxbox/spver.h b/apps/plugins/zxbox/spver.h
new file mode 100644
index 0000000000..9c283d0982
--- /dev/null
+++ b/apps/plugins/zxbox/spver.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "config.h"
+
+#define SPECTEMU_VERSION "0.94"
+
+#ifdef Z80C
+#define SPECTEMU_TYPE "c"
+#else
+#define SPECTEMU_TYPE "i"
+#endif
diff --git a/apps/plugins/zxbox/tapef_p.h b/apps/plugins/zxbox/tapef_p.h
new file mode 100644
index 0000000000..c677e09203
--- /dev/null
+++ b/apps/plugins/zxbox/tapef_p.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef TAPEF_P_H
+#define TAPEF_P_H
+
+typedef unsigned char byte;
+typedef unsigned short dbyte;
+typedef unsigned long qbyte;
+
+#define BYTE(arr, i) (arr[i])
+#define DBYTE(arr, i) (arr[i] + (arr[(i)+1] << 8))
+
+struct tapeinfo {
+ int type;
+ int tzxminver, tzxmajver;
+};
+
+struct seginfo {
+ int type;
+ int segtype;
+
+ dbyte pulse;
+ dbyte num;
+ dbyte sync1p;
+ dbyte sync2p;
+ dbyte zerop;
+ dbyte onep;
+
+ dbyte pause;
+
+ byte bused;
+
+ long len;
+ long ptr;
+};
+
+extern struct tapeinfo tf_tpi;
+extern struct seginfo tf_cseg;
+extern long tf_segoffs;
+
+extern byte *tf_get_block(int i);
+
+#endif /* TAPEF_P_H */
diff --git a/apps/plugins/zxbox/tapefile.c b/apps/plugins/zxbox/tapefile.c
new file mode 100644
index 0000000000..19f6aba980
--- /dev/null
+++ b/apps/plugins/zxbox/tapefile.c
@@ -0,0 +1,1047 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* This module deals with the different tape file formats (.TAP and .TZX) */
+/* 'sptape.c' uses the functions provided by this module. */
+
+
+#include "tapefile.h"
+#include "tapef_p.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include "zxconfig.h"
+#include "helpers.h"
+#define max(x, y) ((x) > (y) ? (x) : (y))
+
+#define DESC_LEN 256
+
+char seg_desc[DESC_LEN];
+
+#define TZXMAJPROG 1
+#define TZXMINPROG 2
+
+/*static FILE *tapefp = NULL;*/
+static int tapefd=-1;
+
+static dbyte segi, currsegi;
+static int segbeg;
+
+static int endtype, endnext, endplay;
+static dbyte endpause;
+static int finished;
+
+static long firstseg_offs;
+
+static struct tape_options tapeopt;
+
+long tf_segoffs;
+struct tapeinfo tf_tpi;
+
+static dbyte loopctr, loopbeg;
+static dbyte callctr, callbeg;
+
+#define ST_NORM 0
+#define ST_PSEQ 1
+#define ST_DIRE 2
+#define ST_MISC 3
+
+#define PL_NONE 0
+#define PL_PAUSE 1
+#define PL_LEADER 2
+#define PL_DATA 3
+#define PL_END 4
+#define PL_PSEQ 5
+#define PL_DIRE 6
+
+#define IMP_1MS 3500
+
+static dbyte lead_pause;
+static int playstate = PL_NONE;
+static int currlev;
+
+#define DEF_LEAD_PAUSE 2000
+
+struct seginfo tf_cseg;
+
+struct tzxblock {
+ int type;
+ int lenbytes;
+ int lenmul;
+ int hlen;
+};
+
+#define NUMBLOCKID 0x60
+/* changed NONE because of warinigs */
+/*#define NONE 0*/
+#define NONE 0,0,0,0
+#define COMM 1
+#define STAN 2
+
+
+#define RBUFLEN 1024
+
+static byte rbuf[RBUFLEN];
+
+/* Table containing information on TZX blocks */
+
+static struct tzxblock tzxb[NUMBLOCKID] = {
+ { NONE }, /* ID: 00 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { NONE }, /* ID: 08 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { COMM, 2, 1, 0x04 }, /* ID: 10 */
+ { COMM, 3, 1, 0x12 },
+ { COMM, 0, 1, 0x04 },
+ { COMM, 1, 2, 0x01 },
+ { COMM, 3, 1, 0x0A },
+ { COMM, 3, 1, 0x08 },
+ { NONE },
+ { NONE },
+
+ { NONE }, /* ID: 18 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { COMM, 0, 1, 0x02 }, /* ID: 20 */
+ { COMM, 1, 1, 0x01 },
+ { COMM, 0, 1, 0x00 },
+ { COMM, 0, 1, 0x02 },
+ { COMM, 0, 1, 0x02 },
+ { COMM, 0, 1, 0x00 },
+ { COMM, 2, 2, 0x02 },
+ { COMM, 0, 1, 0x00 },
+
+ { COMM, 2, 1, 0x02 }, /* ID: 28 */
+ { NONE },
+ { STAN, 0, 1, 0x00 },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { COMM, 1, 1, 0x01 }, /* ID: 30 */
+ { COMM, 1, 1, 0x02 },
+ { COMM, 2, 1, 0x02 },
+ { COMM, 1, 3, 0x01 },
+ { COMM, 0, 1, 0x08 },
+ { COMM, 4, 1, 0x14 },
+ { NONE },
+ { NONE },
+
+ { NONE }, /* ID: 38 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { COMM, 3, 1, 0x04 }, /* ID: 40 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { NONE }, /* ID: 48 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { NONE }, /* ID: 50 */
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+
+ { NONE }, /* ID: 58 */
+ { NONE },
+ { COMM, 0, 1, 0x09 },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE },
+ { NONE }
+};
+
+
+#define PTRDIFF(pe, ps) ((int) (((long) (pe) - (long) (ps)) / sizeof(*pe)))
+
+static char tzxheader[] = {'Z','X','T','a','p','e','!',0x1A};
+
+static int readbuf(void *ptr, int size, /*FILE *fp*/ int fd)
+{
+ /*return (int) fread(ptr, 1, (size_t) size, tapefp);*/
+ return (int) rb->read(fd, ptr, (size_t) size);
+}
+
+static void premature(struct seginfo *csp)
+{
+ csp->segtype = SEG_ERROR;
+ rb->snprintf(seg_desc,DESC_LEN, "Premature end of segment");
+}
+
+static int read_tzx_header(byte *hb, struct seginfo *csp)
+{
+ int res;
+ int segid, seght;
+ int lenoffs, lenbytes, lenmul, lenadd;
+ int hlen;
+ long length;
+ byte *hip;
+
+ segid = getc(tapefd);
+ if(segid == EOF) {
+ csp->segtype = SEG_END;
+ rb->snprintf(seg_desc,DESC_LEN, "End of Tape");
+ return 0;
+ }
+
+ hb[0] = (byte) segid;
+
+ if(segid < NUMBLOCKID) seght = tzxb[segid].type;
+ else seght = 0; /* was NONE here*/
+
+ if(seght == COMM) {
+ lenbytes = tzxb[segid].lenbytes;
+ lenmul = tzxb[segid].lenmul;
+ hlen = tzxb[segid].hlen;
+ lenadd = hlen;
+ lenoffs = hlen - lenbytes;
+ }
+ else {
+ lenoffs = 0x00;
+ lenbytes = 4;
+ lenmul = 1;
+ lenadd = 0x00;
+ hlen = 0x04;
+ }
+
+ if(seght == STAN) hlen += tzxb[segid].hlen;
+
+ hip = hb+1;
+ res = readbuf(hip, hlen, tapefd);
+ if(res != hlen) {
+ premature(csp);
+ return 0;
+ }
+ length = 0;
+ for(;lenbytes; lenbytes--)
+ length = (length << 8) + hip[lenoffs + lenbytes - 1];
+
+ length = (length * lenmul) + lenadd - hlen;
+
+ csp->len = length;
+ return 1;
+}
+
+static int read_tap_header(byte *hb, struct seginfo *csp)
+{
+ int res;
+
+ res = readbuf(hb, 2, tapefd);
+ if(res < 2) {
+ if(res == 0) {
+ csp->segtype = SEG_END;
+ rb->snprintf(seg_desc,DESC_LEN, "End of Tape");
+ }
+ else premature(csp);
+ return 0;
+ }
+ csp->len = DBYTE(hb, 0);
+ return 1;
+}
+
+static int read_header(byte *hb, struct seginfo *csp)
+{
+ segbeg = 0;
+ csp->ptr = 0;
+
+ csp->segtype = SEG_OTHER;
+ if(tf_tpi.type == TAP_TAP)
+ return read_tap_header(hb, csp);
+ else if(tf_tpi.type == TAP_TZX)
+ return read_tzx_header(hb, csp);
+
+ return 0;
+}
+
+static void isbeg(void)
+{
+ segbeg = 1;
+ tf_cseg.len = tf_cseg.ptr = 0;
+}
+
+
+static int end_seg(struct seginfo *csp)
+{
+ if(!segbeg) {
+ if(csp->len != csp->ptr) {
+ /*fseek(tapefp, tf_cseg.len - tf_cseg.ptr - 1, SEEK_CUR);*/
+ rb->lseek(tapefd, tf_cseg.len - tf_cseg.ptr - 1, SEEK_CUR);
+
+ if(getc(tapefd) == EOF) {
+ premature(csp);
+ return 0;
+ }
+ }
+ segi++;
+ isbeg();
+ }
+ playstate = PL_NONE;
+ return 1;
+}
+
+
+static int jump_to_segment(int newsegi, struct seginfo *csp)
+{
+ if(newsegi <= segi) {
+ segi = 0;
+ isbeg();
+ /*fseek(tapefp, firstseg_offs, SEEK_SET);*/
+ rb->lseek(tapefd, firstseg_offs, SEEK_SET);
+ }
+ else if(!end_seg(csp)) return 0;
+
+ while(segi != newsegi) {
+ if(!read_header(rbuf, csp)) return 0;
+ if(!end_seg(csp)) return 0;
+ }
+ return 1;
+}
+
+
+static int next_data(void)
+{
+ int res;
+ if(tf_cseg.ptr == tf_cseg.len) return DAT_END;
+
+ res = getc(tapefd);
+ if(res == EOF) {
+ rb->snprintf(seg_desc, DESC_LEN,"Premature end of segment");
+ return DAT_ERR;
+ }
+ tf_cseg.ptr++;
+ return res;
+}
+
+
+static void normal_segment(struct seginfo *csp)
+{
+ rb->snprintf(seg_desc,DESC_LEN, "Data");
+ csp->type = ST_NORM;
+ csp->segtype = SEG_DATA;
+ csp->pulse = 2168; /* 2016 */
+ csp->num = 3220;
+ csp->sync1p = 667;
+ csp->sync2p = 735;
+ csp->zerop = 855; /* 672 */
+ csp->onep = 1710; /* 1568 */
+ csp->bused = 8;
+}
+
+
+static int interpret_tzx_header(byte *hb, struct seginfo *csp)
+{
+ int res;
+ int segid;
+ byte *hip;
+ int offs;
+ dbyte dtmp;
+
+ segid = hb[0];
+ hip = hb+1;
+
+ switch(segid) {
+ case 0x10:
+ normal_segment(csp);
+ csp->pause = DBYTE(hip, 0x00);
+ break;
+
+ case 0x11:
+ rb->snprintf(seg_desc,DESC_LEN, "Turbo Data");
+ csp->type = ST_NORM;
+ csp->segtype = SEG_DATA_TURBO;
+ csp->pulse = DBYTE(hip, 0x00);
+ csp->sync1p = DBYTE(hip, 0x02);
+ csp->sync2p = DBYTE(hip, 0x04);
+ csp->zerop = DBYTE(hip, 0x06);
+ csp->onep = DBYTE(hip, 0x08);
+ csp->num = DBYTE(hip, 0x0A);
+ csp->bused = BYTE(hip, 0x0C);
+ csp->pause = DBYTE(hip, 0x0D);
+ break;
+
+ case 0x12:
+ rb->snprintf(seg_desc,DESC_LEN, "Pure Tone");
+ csp->type = ST_NORM;
+ csp->segtype = SEG_OTHER;
+ csp->pulse = DBYTE(hip, 0x00);
+ csp->num = DBYTE(hip, 0x02);
+ csp->sync1p = 0;
+ csp->sync2p = 0;
+ csp->zerop = 0;
+ csp->onep = 0;
+ csp->bused = 0;
+ csp->pause = 0;
+ break;
+
+ case 0x13:
+ rb->snprintf(seg_desc,DESC_LEN, "Pulse Sequence");
+ csp->type = ST_PSEQ;
+ csp->segtype = SEG_OTHER;
+ csp->pause = 0;
+ break;
+
+ case 0x14:
+ rb->snprintf(seg_desc,DESC_LEN, "Pure Data");
+ csp->type = ST_NORM;
+ csp->segtype = SEG_DATA_PURE;
+ csp->zerop = DBYTE(hip, 0x00);
+ csp->onep = DBYTE(hip, 0x02);
+ csp->bused = BYTE(hip, 0x04);
+ csp->pause = DBYTE(hip, 0x05);
+ csp->pulse = 0;
+ csp->num = 0;
+ csp->sync1p = 0;
+ csp->sync2p = 0;
+ break;
+
+ case 0x15:
+ rb->snprintf(seg_desc,DESC_LEN, "Direct Recording");
+ csp->type = ST_DIRE;
+ csp->segtype = SEG_OTHER;
+ csp->pulse = DBYTE(hip, 0x00);
+ csp->pause = DBYTE(hip, 0x02);
+ csp->bused = BYTE(hip, 0x04);
+ break;
+
+ case 0x20:
+ dtmp = DBYTE(hip, 0x00);
+ if(dtmp == 0) {
+ if(!tapeopt.stoppause) {
+ csp->type = ST_MISC;
+ csp->segtype = SEG_STOP;
+ }
+ else {
+ csp->pause = tapeopt.stoppause * 1000;
+ csp->type = ST_NORM;
+ csp->segtype = SEG_PAUSE;
+ }
+ rb->snprintf(seg_desc,DESC_LEN, "Stop the Tape Mark");
+ }
+ else {
+ csp->pause = dtmp;
+ csp->type = ST_NORM;
+ csp->segtype = SEG_PAUSE;
+ rb->snprintf(seg_desc,DESC_LEN, "Pause for %i.%03is",
+ csp->pause / 1000, csp->pause % 1000);
+ }
+ csp->pulse = 0;
+ csp->num = 0;
+ csp->sync1p = 0;
+ csp->sync2p = 0;
+ csp->zerop = 0;
+ csp->onep = 0;
+ csp->bused = 0;
+ break;
+
+ case 0x21:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_GRP_BEG;
+ res = readbuf(rbuf, csp->len, tapefd);
+ if(res != (int) csp->len) {
+ premature(csp);
+ return 0;
+ }
+ csp->ptr += csp->len;
+ {
+ int blen;
+ rb->snprintf(seg_desc,DESC_LEN, "Begin Group: ");
+ blen = (int) rb->strlen(seg_desc);
+ rb->strncpy(seg_desc+blen, (char *) rbuf, (unsigned) csp->len);
+ seg_desc[csp->len + blen] = '\0';
+ }
+ break;
+
+ case 0x22:
+ rb->snprintf(seg_desc,DESC_LEN, "End Group");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_GRP_END;
+ break;
+
+ case 0x23:
+ offs = (signed short) DBYTE(hip, 0x00);
+ if(offs == 0) {
+ rb->snprintf(seg_desc,DESC_LEN, "Infinite loop");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_STOP;
+ }
+ else {
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ rb->snprintf(seg_desc,DESC_LEN, "Jump to %i", segi+offs);
+ jump_to_segment(segi + offs, csp);
+ }
+ break;
+
+ case 0x24:
+ loopctr = DBYTE(hip, 0x00);
+ rb->snprintf(seg_desc,DESC_LEN, "Loop %i times", loopctr);
+ loopbeg = segi+1;
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ break;
+
+ case 0x25:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ if(loopctr) loopctr--;
+ if(loopctr) {
+ jump_to_segment(loopbeg, csp);
+ rb->snprintf(seg_desc,DESC_LEN, "Loop to: %i", loopbeg);
+ }
+ else rb->snprintf(seg_desc,DESC_LEN, "Loop End");
+ break;
+
+ case 0x26:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ dtmp = DBYTE(hip, 0x00);
+ if(callctr < dtmp) {
+ int offset;
+ callbeg = segi;
+ /*fseek(tapefp, callctr*2, SEEK_CUR);*/
+ rb->lseek(tapefd, callctr*2, SEEK_CUR);
+ csp->ptr += callctr*2;
+ res = readbuf(rbuf, 2, tapefd);
+ if(res != 2) {
+ premature(csp);
+ return 0;
+ }
+ csp->ptr += 2;
+ offset = (signed short) DBYTE(rbuf, 0x00);
+ rb->snprintf(seg_desc,DESC_LEN, "Call to %i", segi+offset);
+ jump_to_segment(segi+offset, csp);
+ callctr++;
+ }
+ else {
+ callctr = 0;
+ rb->snprintf(seg_desc,DESC_LEN, "Call Sequence End");
+ }
+ break;
+
+ case 0x27:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ rb->snprintf(seg_desc,DESC_LEN, "Return");
+ if(callctr > 0) jump_to_segment(callbeg, csp);
+ break;
+
+ case 0x28:
+ rb->snprintf(seg_desc,DESC_LEN, "Selection (Not yet supported)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ break;
+
+ case 0x2A:
+ if(tapeopt.machine == MACHINE_48) {
+ rb->snprintf(seg_desc,DESC_LEN, "Stop the Tape in 48k Mode (Stopped)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_STOP;
+ }
+ else {
+ rb->snprintf(seg_desc,DESC_LEN, "Stop the Tape in 48k Mode (Not Stopped)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ }
+ break;
+
+ case 0x31:
+ case 0x30:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ res = readbuf(rbuf, csp->len, tapefd);
+ if(res != (int) csp->len) {
+ premature(csp);
+ return 0;
+ }
+ csp->ptr += csp->len;
+ rb->strncpy(seg_desc, (char *) rbuf, (unsigned) csp->len);
+ seg_desc[csp->len] = '\0';
+ break;
+
+ case 0x32:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ {
+ int numstr, i;
+
+ i = 0;
+ numstr = next_data();
+ for(;numstr > 0; numstr--) {
+ int tlen, tid, b;
+
+ tid = next_data();
+ tlen = next_data();
+ if(tid < 0 || tlen < 0) return 0;
+
+ for(; tlen; tlen--) {
+ b = next_data();
+ if(b < 0) return 0;
+ seg_desc[i++] = b;
+ }
+ seg_desc[i++] = '\n';
+ }
+ seg_desc[i] = '\0';
+ }
+ break;
+
+ case 0x33:
+ rb->snprintf(seg_desc,DESC_LEN, "Hardware Information (Not yet supported)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ break;
+
+ case 0x34:
+ rb->snprintf(seg_desc, DESC_LEN,"Emulation Information (Not yet supported)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ break;
+
+ case 0x35:
+ rb->snprintf(seg_desc,DESC_LEN, "Custom Information (Not yet supported)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ break;
+
+ case 0x40:
+ rb->snprintf(seg_desc, DESC_LEN,"Snapshot (Not yet supported)");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ break;
+
+ case 0x5A:
+ rb->snprintf(seg_desc, DESC_LEN,"Tapefile Concatenation Point");
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+
+ default:
+ csp->type = ST_MISC;
+ csp->segtype = SEG_SKIP;
+ rb->snprintf(seg_desc,DESC_LEN, "Unknown TZX block (id: %02X, version: %i.%02i)",
+ segid, tf_tpi.tzxmajver, tf_tpi.tzxminver);
+ break;
+ }
+
+ return 1;
+}
+
+static int interpret_header(byte *hb, struct seginfo *csp)
+{
+ if(tf_tpi.type == TAP_TAP) {
+ normal_segment(csp);
+ csp->pause = DEF_LEAD_PAUSE;
+
+ return 1;
+ }
+ else if(tf_tpi.type == TAP_TZX)
+ return interpret_tzx_header(hb, csp);
+
+ return 0;
+}
+
+byte *tf_get_block(int i)
+{
+ seg_desc[0] = '\0';
+
+ if(jump_to_segment(i, &tf_cseg)) {
+ tf_segoffs = ftell(tapefd);
+
+ if(read_header(rbuf, &tf_cseg) &&
+ interpret_header(rbuf, &tf_cseg)) return rbuf;
+ }
+ return NULL;
+}
+
+
+int next_byte(void)
+{
+ playstate = PL_NONE;
+ return next_data();
+}
+
+#define DPULSE(v1,v2) (*impbuf++=(v1), *impbuf++=(v2), timelen-=(v1)+(v2))
+#define PULSE(v) (*impbuf++=(v), currlev = !currlev, timelen-=(v))
+
+int next_imps(unsigned short *impbuf, int buflen, long timelen)
+{
+ static int toput;
+ static int bitrem;
+ static dbyte dirpulse;
+ unsigned short *impbufend, *impbufstart;
+
+ impbufstart = impbuf;
+ impbufend = impbuf + buflen;
+
+ while(impbuf < impbufend - 1 && timelen > 0) {
+ switch(playstate) {
+
+ case PL_PAUSE:
+ if(currlev && lead_pause) {
+ PULSE(IMP_1MS);
+ lead_pause --;
+ }
+ else if(lead_pause > 10) {
+ if(tapeopt.blanknoise && !(rb->rand() % 64))
+ DPULSE(IMP_1MS * 10 - 1000, 1000);
+ else
+ DPULSE(IMP_1MS * 10, 0);
+ lead_pause -= 10;
+ }
+ else if(lead_pause) {
+ DPULSE(IMP_1MS, 0);
+ lead_pause --;
+ }
+ else {
+ if(tf_cseg.num || tf_cseg.sync1p || tf_cseg.sync2p ||
+ tf_cseg.ptr != tf_cseg.len) finished = 0;
+
+ switch (tf_cseg.type) {
+ case ST_NORM: playstate = PL_LEADER; break;
+ case ST_DIRE: playstate = PL_DIRE; dirpulse = 0; break;
+ case ST_PSEQ: playstate = PL_PSEQ; break;
+ default: playstate = PL_NONE;
+ }
+ }
+ break;
+
+ case PL_LEADER:
+ if(tf_cseg.num >= 2) {
+ DPULSE(tf_cseg.pulse, tf_cseg.pulse);
+ tf_cseg.num -= 2;
+ }
+ else
+ if(tf_cseg.num) {
+ PULSE(tf_cseg.pulse);
+ tf_cseg.num --;
+ }
+ else { /* PL_SYNC */
+ if(tf_cseg.sync1p || tf_cseg.sync2p)
+ DPULSE(tf_cseg.sync1p, tf_cseg.sync2p);
+ bitrem = 0;
+ playstate = PL_DATA;
+ }
+ break;
+
+ case PL_DATA:
+ if(!bitrem) {
+ toput = next_data();
+ if(toput < 0) {
+ playstate = PL_END;
+ break;
+ }
+ if(tf_cseg.ptr != tf_cseg.len) {
+ if(timelen > 16 * max(tf_cseg.onep, tf_cseg.zerop) &&
+ impbuf <= impbufend - 16) {
+ int p1, p2, br, tp;
+
+ p1 = tf_cseg.onep;
+ p2 = tf_cseg.zerop;
+ br = 8;
+ tp = toput;
+
+ while(br) {
+ if(tp & 0x80) DPULSE(p1, p1);
+ else DPULSE(p2, p2);
+ br--;
+ tp <<= 1;
+ }
+ bitrem = 0;
+ break;
+ }
+ bitrem = 8;
+ }
+ else {
+ bitrem = tf_cseg.bused;
+ if(!bitrem) break;
+ }
+ }
+ if(toput & 0x80) DPULSE(tf_cseg.onep, tf_cseg.onep);
+ else DPULSE(tf_cseg.zerop, tf_cseg.zerop);
+ bitrem--, toput <<= 1;
+ break;
+
+ case PL_PSEQ:
+ {
+ int b1, b2;
+ dbyte pulse1, pulse2;
+ b1 = next_data();
+ b2 = next_data();
+ if(b1 < 0 || b2 < 0) {
+ playstate = PL_END;
+ break;
+ }
+ pulse1 = b1 + (b2 << 8);
+
+ b1 = next_data();
+ b2 = next_data();
+ if(b1 < 0 || b2 < 0) {
+ PULSE(pulse1);
+ playstate = PL_END;
+ break;
+ }
+ pulse2 = b1 + (b2 << 8);
+ DPULSE(pulse1, pulse2);
+ }
+ break;
+
+ case PL_DIRE:
+ for(;;) {
+ if(!bitrem) {
+ toput = next_data();
+ if(toput < 0) {
+ playstate = PL_END;
+ DPULSE(dirpulse, 0);
+ break;
+ }
+ if(tf_cseg.ptr != tf_cseg.len) bitrem = 8;
+ else {
+ bitrem = tf_cseg.bused;
+ if(!bitrem) break;
+ }
+ }
+ bitrem--;
+ toput <<= 1;
+ if(((toput & 0x0100) ^ (currlev ? 0x0100 : 0x00))) {
+ PULSE(dirpulse);
+ dirpulse = tf_cseg.pulse;
+ break;
+ }
+ dirpulse += tf_cseg.pulse;
+ if(dirpulse >= 0x8000) {
+ DPULSE(dirpulse, 0);
+ dirpulse = 0;
+ break;
+ }
+ }
+ break;
+
+ case PL_END:
+ if(tf_cseg.pause) {
+ PULSE(IMP_1MS);
+ tf_cseg.pause--;
+ if(currlev) PULSE(0);
+ finished = 1;
+ }
+ playstate = PL_NONE;
+ break;
+
+ case PL_NONE:
+ default:
+ return PTRDIFF(impbuf, impbufstart);
+ }
+ }
+
+ return PTRDIFF(impbuf, impbufstart);
+}
+
+
+int next_segment(void)
+{
+ if(endnext) {
+ endnext = 0;
+ tf_cseg.segtype = endtype;
+ tf_cseg.pause = endpause;
+ playstate = endplay;
+ return tf_cseg.segtype;
+ }
+
+ seg_desc[0] = '\0';
+ lead_pause = tf_cseg.pause;
+
+ if(end_seg(&tf_cseg)) {
+ currsegi = segi;
+ if(read_header(rbuf, &tf_cseg)) interpret_header(rbuf, &tf_cseg);
+ }
+
+ if(tf_cseg.segtype >= SEG_DATA) {
+ playstate = PL_PAUSE;
+ if(lead_pause) finished = 1;
+ }
+ else playstate = PL_NONE;
+
+ if(tf_cseg.segtype <= SEG_STOP && !finished) {
+ endnext = 1;
+ endtype = tf_cseg.segtype;
+ endpause = tf_cseg.pause;
+ endplay = playstate;
+ if(lead_pause > 0) lead_pause--;
+
+ tf_cseg.pause = 1;
+ tf_cseg.segtype = SEG_VIRTUAL;
+ playstate = PL_END;
+ }
+
+ return tf_cseg.segtype;
+}
+
+int goto_segment(int at_seg)
+{
+ int res;
+
+ res = jump_to_segment(at_seg, &tf_cseg);
+ tf_cseg.pause = DEF_LEAD_PAUSE;
+
+ return res;
+}
+
+unsigned segment_pos(void)
+{
+ return currsegi;
+}
+
+void close_tapefile(void)
+{
+ if(tapefd != -1) {
+ playstate = PL_NONE;
+ rb->close(tapefd);
+ tapefd = -1;
+ }
+}
+
+int open_tapefile(char *name, int type)
+{
+ int res;
+ int ok;
+
+ seg_desc[0] = '\0';
+ currlev = 0;
+
+ if(type != TAP_TAP && type != TAP_TZX) {
+ rb->snprintf(seg_desc,DESC_LEN, "Illegal tape type");
+ return 0;
+ }
+
+ /*tapefp = fopen(name, "rb");*/
+ tapefd = rb->open(name, O_RDONLY);
+ if(tapefd < 0 ) {
+ /*rb->snprintf(seg_desc,DESC_LEN, "Could not open `%s': %s", name, strerror(errno));*/
+ return 0;
+ }
+
+ tf_tpi.type = type;
+ tf_cseg.pause = DEF_LEAD_PAUSE;
+ INITTAPEOPT(tapeopt);
+
+ currsegi = segi = 0;
+ isbeg();
+
+ firstseg_offs = 0;
+
+ ok = 1;
+
+ if(tf_tpi.type == TAP_TZX) {
+
+ firstseg_offs = 10;
+ res = readbuf(rbuf, 10, tapefd);
+ if(res == 10 && rb->strncasecmp((char *)rbuf, tzxheader, 8) == 0) {
+ tf_tpi.tzxmajver = rbuf[8];
+ tf_tpi.tzxminver = rbuf[9];
+
+ if(tf_tpi.tzxmajver > TZXMAJPROG) {
+ rb->snprintf(seg_desc, DESC_LEN,
+ "Cannot handle TZX file version (%i.%02i)",
+ tf_tpi.tzxmajver, tf_tpi.tzxminver);
+ ok = 0;
+ }
+ }
+ else {
+ rb->snprintf(seg_desc,DESC_LEN, "Illegal TZX file header");
+ ok = 0;
+ }
+ }
+
+ if(!ok) {
+ close_tapefile();
+ return 0;
+ }
+ endnext = 0;
+
+ loopctr = 0;
+ callctr = 0;
+
+ return 1;
+}
+
+int get_level(void)
+{
+ return currlev;
+}
+
+long get_seglen(void)
+{
+ return tf_cseg.len;
+}
+
+long get_segpos(void)
+{
+ return tf_cseg.ptr;
+}
+
+void set_tapefile_options(struct tape_options *to)
+{
+ rb->memcpy(&tapeopt, to, sizeof(tapeopt));
+}
+
diff --git a/apps/plugins/zxbox/tapefile.h b/apps/plugins/zxbox/tapefile.h
new file mode 100644
index 0000000000..e7019f2fa2
--- /dev/null
+++ b/apps/plugins/zxbox/tapefile.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef TAPEFILE_H
+#define TAPEFILE_H
+
+#define DAT_ERR -2
+#define DAT_END -1
+
+#define SEG_ERROR -1
+#define SEG_END 0 /* ^--- End of tape */
+
+#define SEG_STOP 1
+#define SEG_SKIP 2
+#define SEG_GRP_BEG 3
+#define SEG_GRP_END 4
+
+#define SEG_DATA 10
+#define SEG_DATA_TURBO 11
+#define SEG_DATA_PURE 12
+
+#define SEG_PAUSE 20
+#define SEG_OTHER 21
+
+#define SEG_VIRTUAL 30
+
+#define TAP_TAP 0
+#define TAP_TZX 1
+
+#define MACHINE_48 0
+#define MACHINE_128 1
+
+struct tape_options {
+ int blanknoise;
+ int stoppause;
+ int machine;
+};
+
+#define INITTAPEOPT(to) \
+ (to).blanknoise=0, \
+ (to).stoppause=0, \
+ (to).machine=MACHINE_48
+
+extern char seg_desc[];
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int open_tapefile(char *name, int type);
+extern void close_tapefile(void);
+extern int goto_segment(int at_seg);
+extern int next_segment(void);
+extern int next_byte(void);
+extern int next_imps(unsigned short *impbuf, int buflen, long timelen);
+
+extern void set_tapefile_options(struct tape_options *to);
+extern int get_level(void);
+
+extern long get_seglen(void);
+extern long get_segpos(void);
+extern unsigned segment_pos(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TAPEFILE_H */
diff --git a/apps/plugins/zxbox/z80.c b/apps/plugins/zxbox/z80.c
new file mode 100644
index 0000000000..90b41c93d3
--- /dev/null
+++ b/apps/plugins/zxbox/z80.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "z80.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include "zxconfig.h"
+#include "helpers.h"
+Z80 PRNM(proc);
+
+byte PRNM(inports)[PORTNUM];
+byte PRNM(outports)[PORTNUM];
+
+
+#ifdef SPECT_MEM
+#define NUM64KSEGS 3
+#endif
+
+#ifndef NUM64KSEGS
+#define NUM64KSEGS 1
+#endif
+
+static byte *a64kmalloc(int num64ksegs)
+{
+ byte *bigmem;
+
+ bigmem = (byte *) my_malloc((unsigned) (0x10000 * (num64ksegs + 1)));
+ if(bigmem == NULL) {
+ /*fprintf(stderr, "Out of memory!\n");*/
+ /*exit(1);*/
+ }
+
+ return (byte *) (( (long) bigmem & ~((long) 0xFFFF)) + 0x10000);
+}
+
+
+
+void PRNM(init)(void)
+{
+ qbyte i;
+
+ DANM(mem) = a64kmalloc(NUM64KSEGS);
+
+ rb->srand((unsigned int)( rb->get_time()->tm_sec+rb->get_time()->tm_min*60 + rb->get_time()->tm_hour*3600));
+ for(i = 0; i < 0x10000; i++) DANM(mem)[i] = (byte) rb->rand();
+
+ for(i = 0; i < NUMDREGS; i++) {
+ DANM(nr)[i].p = DANM(mem);
+ DANM(nr)[i].d.d = (dbyte) rb->rand();
+ }
+
+ for(i = 0; i < BACKDREGS; i++) {
+ DANM(br)[i].p = DANM(mem);
+ DANM(br)[i].d.d = (dbyte) rb->rand();
+ }
+
+ for(i = 0; i < PORTNUM; i++) PRNM(inports)[i] = PRNM(outports)[i] = 0;
+
+ PRNM(local_init)();
+
+ return;
+}
+
+/* TODO: no interrupt immediately afer EI (not important for spectrum) */
+
+void PRNM(nmi)(void)
+{
+ DANM(iff2) = DANM(iff1);
+ DANM(iff1) = 0;
+
+ DANM(haltstate) = 0;
+ PRNM(pushpc)();
+
+ PC = 0x0066;
+}
+
+/* TODO: IM 0 emulation */
+
+void PRNM(interrupt)(int data)
+{
+ if(DANM(iff1)) {
+
+ DANM(haltstate) = 0;
+ DANM(iff1) = DANM(iff2) = 0;
+
+ switch(DANM(it_mode)) {
+ case 0:
+ PRNM(pushpc)();
+ PC = 0x0038;
+ break;
+ case 1:
+ PRNM(pushpc)();
+ PC = 0x0038;
+ break;
+ case 2:
+ PRNM(pushpc)();
+ PCL = DANM(mem)[(dbyte) (((int) RI << 8) + (data & 0xFF))];
+ PCH = DANM(mem)[(dbyte) (((int) RI << 8) + (data & 0xFF) + 1)];
+ break;
+ }
+ }
+}
+
+
+void PRNM(reset)(void)
+{
+ DANM(haltstate) = 0;
+ DANM(iff1) = DANM(iff2) = 0;
+ DANM(it_mode) = 0;
+ RI = 0;
+ RR = 0;
+ PC = 0;
+}
diff --git a/apps/plugins/zxbox/z80.h b/apps/plugins/zxbox/z80.h
new file mode 100644
index 0000000000..996ea9d294
--- /dev/null
+++ b/apps/plugins/zxbox/z80.h
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef Z80_H
+#define Z80_H
+
+#include "zxconfig.h"
+#include "config.h"
+
+#ifdef ROCKBOX_BIG_ENDIAN
+#define WORDS_BIGENDIAN
+#endif
+
+#ifndef COMPARISON
+#define PRNM(x) z80_ ## x
+#else
+#define PRNM(x) z80x_ ## x
+#endif
+
+#define DANM(x) PRNM(proc).x
+
+#include "z80_type.h"
+
+
+#ifndef WORDS_BIGENDIAN
+union dregp {
+ struct { byte l, h, _b2, _b3; } s;
+ struct { dbyte d, _d1; } d;
+ byte* p;
+};
+#else
+union dregp {
+ struct { byte _b3, _b2, h, l; } s;
+ struct { dbyte _d1, d; } d;
+ byte* p;
+};
+#endif
+
+#define NUMDREGS 9
+#define BACKDREGS 4
+
+#define PORTNUM 256
+
+/* Do NOT change the order! */
+typedef struct {
+ union dregp nr[NUMDREGS];
+ union dregp br[BACKDREGS];
+
+ int haltstate;
+ int it_mode;
+ int iff1, iff2;
+
+ byte *mem;
+
+ int tc;
+ int rl7;
+
+#ifdef SPECT_MEM /* WARNING: Do NOT change the order!!! */
+ int next_scri;
+ int inport_mask;
+ int ula_inport;
+ int ula_outport;
+ int sound_sam;
+ int sound_change;
+ int imp_change;
+#endif
+
+#ifdef Z80C
+ dbyte cbaddr;
+
+#ifdef PROCP
+ byte *incf_tbl;
+ byte *decf_tbl;
+ byte *addf_tbl;
+ byte *subf_tbl;
+ byte *orf_tbl;
+
+ byte *inports;
+ byte *outports;
+#ifdef SPECT_MEM
+ byte *fe_inport_high;
+#endif
+#endif
+#endif
+
+} Z80;
+
+
+extern Z80 PRNM(proc);
+
+extern byte PRNM(inports)[];
+extern byte PRNM(outports)[];
+
+#define ZI_BC 0
+#define ZI_DE 1
+#define ZI_HL 2
+#define ZI_AF 3
+#define ZI_IR 4
+#define ZI_IX 5
+#define ZI_IY 6
+#define ZI_PC 7
+#define ZI_SP 8
+
+
+#define BC (DANM(nr)[ZI_BC].d.d)
+#define DE (DANM(nr)[ZI_DE].d.d)
+#define HL (DANM(nr)[ZI_HL].d.d)
+#define AF (DANM(nr)[ZI_AF].d.d)
+#define IR (DANM(nr)[ZI_IR].d.d)
+#define IX (DANM(nr)[ZI_IX].d.d)
+#define IY (DANM(nr)[ZI_IY].d.d)
+#define PC (DANM(nr)[ZI_PC].d.d)
+#define SP (DANM(nr)[ZI_SP].d.d)
+
+#define BCP (DANM(nr)[ZI_BC].p)
+#define DEP (DANM(nr)[ZI_DE].p)
+#define HLP (DANM(nr)[ZI_HL].p)
+#define PCP (DANM(nr)[ZI_PC].p)
+#define SPP (DANM(nr)[ZI_SP].p)
+#define IXP (DANM(nr)[ZI_IX].p)
+#define IYP (DANM(nr)[ZI_IY].p)
+
+
+#define RB (DANM(nr)[ZI_BC].s.h)
+#define RC (DANM(nr)[ZI_BC].s.l)
+#define RD (DANM(nr)[ZI_DE].s.h)
+#define RE (DANM(nr)[ZI_DE].s.l)
+#define RH (DANM(nr)[ZI_HL].s.h)
+#define RL (DANM(nr)[ZI_HL].s.l)
+#define RA (DANM(nr)[ZI_AF].s.h)
+#define RF (DANM(nr)[ZI_AF].s.l)
+#define RI (DANM(nr)[ZI_IR].s.h)
+#define RR (DANM(nr)[ZI_IR].s.l)
+#define XH (DANM(nr)[ZI_IX].s.h)
+#define XL (DANM(nr)[ZI_IX].s.l)
+#define YH (DANM(nr)[ZI_IY].s.h)
+#define YL (DANM(nr)[ZI_IY].s.l)
+#define PCH (DANM(nr)[ZI_PC].s.h)
+#define PCL (DANM(nr)[ZI_PC].s.l)
+#define SPH (DANM(nr)[ZI_SP].s.h)
+#define SPL (DANM(nr)[ZI_SP].s.l)
+
+#define BCBK (DANM(br)[ZI_BC].d.d)
+#define DEBK (DANM(br)[ZI_DE].d.d)
+#define HLBK (DANM(br)[ZI_HL].d.d)
+#define AFBK (DANM(br)[ZI_AF].d.d)
+
+#define BBK (DANM(br)[ZI_BC].s.h)
+#define CBK (DANM(br)[ZI_BC].s.l)
+#define DBK (DANM(br)[ZI_DE].s.h)
+#define EBK (DANM(br)[ZI_DE].s.l)
+#define HBK (DANM(br)[ZI_HL].s.h)
+#define LBK (DANM(br)[ZI_HL].s.l)
+#define ABK (DANM(br)[ZI_AF].s.h)
+#define FBK (DANM(br)[ZI_AF].s.l)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void PRNM(init)(void);
+extern int PRNM(step)(int ticknum);
+
+extern void PRNM(interrupt)(int data);
+extern void PRNM(nmi)(void);
+extern void PRNM(reset)(void);
+
+extern void PRNM(pushpc)(void);
+extern void PRNM(local_init)(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* Z80_H */
diff --git a/apps/plugins/zxbox/z80_ari.h b/apps/plugins/zxbox/z80_ari.h
new file mode 100644
index 0000000000..4d1e644e78
--- /dev/null
+++ b/apps/plugins/zxbox/z80_ari.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#define ADDSUB(r, op, tbl) \
+{ \
+ register byte res; \
+ register int idx; \
+ register int flag; \
+ res = RA op; \
+ idx = IDXCALC(RA, r, res); \
+ RA = res; \
+ flag = (RF & ~(AALLF)) | \
+ TAB(tbl)[idx]; \
+ if(!res) flag |= ZF; \
+ RF = flag; \
+}
+
+
+#define ADD(r) ADDSUB(r, + r, addf_tbl)
+#define ADC(r) ADDSUB(r, + r + (RF & CF), addf_tbl)
+#define SUB(r) ADDSUB(r, - r, subf_tbl)
+#define SBC(r) ADDSUB(r, - r - (RF & CF), subf_tbl)
+
+#define AND(r) \
+{ \
+ register byte res; \
+ register byte flag; \
+ res = RA & r; \
+ RA = res; \
+ flag = (RF & ~(AALLF)) | \
+ TAB(orf_tbl)[res] | HF; \
+ RF = flag; \
+}
+
+
+#define XOR(r) \
+{ \
+ register byte res; \
+ register byte flag; \
+ res = RA ^ r; \
+ RA = res; \
+ flag = (RF & ~(AALLF)) | \
+ TAB(orf_tbl)[res]; \
+ RF = flag; \
+}
+
+
+#define OR(r) \
+{ \
+ register byte res; \
+ register byte flag; \
+ res = RA | r; \
+ RA = res; \
+ flag = (RF & ~(AALLF)) | \
+ TAB(orf_tbl)[res]; \
+ RF = flag; \
+}
+
+
+#define CP(r) \
+{ \
+ register byte res; \
+ register int idx; \
+ register int flag; \
+ res = RA - r; \
+ idx = IDXCALC(RA, r, res); \
+ flag = (RF & ~(AALLF)) | \
+ TAB(subf_tbl)[idx]; \
+ if(!res) flag |= ZF; \
+ RF = flag; \
+}
diff --git a/apps/plugins/zxbox/z80_def.h b/apps/plugins/zxbox/z80_def.h
new file mode 100644
index 0000000000..15b39cced5
--- /dev/null
+++ b/apps/plugins/zxbox/z80_def.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "z80.h"
+
+#ifdef PROCP
+
+typedef Z80 *z80t;
+
+#define OPDEF(name, num) z80t z80op_ ## name (z80t z80p)
+#define ENDOP() return z80p
+#undef DANM
+#define DANM(x) z80p->x
+
+#define TAB(t) DANM(t)
+#define PORT(t) DANM(t)
+#define SPECP(t) DANM(t)
+
+#else
+
+typedef void z80t;
+
+#define OPDEF(name, num) void z80op_ ## name (z80t)
+#define ENDOP()
+
+#define TAB(t) z80c_ ## t
+#define PORT(t) PRNM(t)
+#define SPECP(t) SPNM(t)
+
+#endif
+
+
+typedef z80t (*op_f)(z80t);
+extern op_f z80c_op_tab[];
+extern op_f z80c_op_tab_cb[];
+extern op_f z80c_op_tab_dd[];
+extern op_f z80c_op_tab_ed[];
+extern op_f z80c_op_tab_fd[];
+
+#define TIME(x) DANM(tc) -= (x)
+
+#define ENTIME(x) { TIME(x); ENDOP(); }
+
+#define READ(addr) (DANM(mem)[addr])
+#define WRITE(addr, val) PUTMEM(addr, DANM(mem) + (dbyte) (addr), val)
+
+#define DREAD(addr) (DANM(mem)[addr] | (DANM(mem)[(dbyte)(addr+1)] << 8))
+#define DWRITE(addr, x) WRITE(addr, (byte) x); \
+ WRITE((dbyte) (addr+1), (byte) (x >> 8))
+
+#define IPCS ((sbyte) *PCP)
+
+
+#define MODMEM(func) \
+{ \
+ register byte bdef; \
+ bdef = *HLP; \
+ func(bdef); \
+ PUTMEM(HL, HLP, bdef); \
+}
+
+#define MODMEMADDR(func, addr) \
+{ \
+ register byte bdef; \
+ bdef = READ(addr); \
+ func(bdef); \
+ WRITE(addr, bdef); \
+}
+
+#define IXDGET(ixy, addr) addr = ((dbyte) (ixy + IPCS)), PC++
+
+#define FETCHD(x) \
+{ \
+ register dbyte ddef; \
+ ddef = PC; \
+ x = DREAD(ddef); \
+ PC = ddef+2; \
+}
+
+#define POP(x) \
+{ \
+ register dbyte ddef; \
+ ddef = SP; \
+ x = DREAD(ddef); \
+ SP = ddef+2; \
+}
+
+#define PUSH(x) \
+{ \
+ register dbyte ddef, dval; \
+ dval = x; \
+ ddef = SP-2; \
+ DWRITE(ddef, dval); \
+ SP = ddef; \
+}
+
+#ifdef SPECT_MEM
+#include "sp_def.h"
+#else
+
+#define PUTMEM(addr, ptr, val) *(ptr) = (val)
+#define IN(porth, portl, dest) dest = PORT(inports)[portl]
+#define OUT(porth, portl, source) PORT(outports)[portl] = (source)
+#define DI_CHECK
+
+#endif
+
+
+#define SF 0x80
+#define ZF 0x40
+#define B5F 0x20
+#define HF 0x10
+#define B3F 0x08
+#define PVF 0x04
+#define NF 0x02
+#define CF 0x01
+
+#define ALLF (SF | ZF | HF | PVF | NF | CF)
+#define BUTCF (SF | ZF | HF | PVF | NF)
+
+#define AALLF 0xff
+#define ABUTCF 0xfe
+
+#define SETFLAGS(mask, val) (RF = (RF & ~(mask)) | (val))
+#define SET_FL(x) (RF |= (x))
+#define CLR_FL(x) (RF &= ~(x))
+
+
+#define TESTZF (RF & ZF)
+#define TESTCF (RF & CF)
+#define TESTSF (RF & SF)
+#define TESTPF (RF & PVF)
+#define TESTHF (RF & HF)
+#define TESTNF (RF & NF)
+
+
+#define IDXCALC(v1, v2, res) \
+ ((res & 0xA8) | ((v1 & 0x88) >> 1) | ((v2 & 0x88) >> 3))
+
+#define DIDXCALC(v1, v2, res) \
+ (((res & 0x8800) >> 8) | ((v1 & 0x8800) >> 9) | ((v2 & 0x8800) >> 11))
+
+
+extern byte z80c_incf_tbl[];
+extern byte z80c_decf_tbl[];
+extern byte z80c_addf_tbl[];
+extern byte z80c_subf_tbl[];
+extern byte z80c_orf_tbl[];
diff --git a/apps/plugins/zxbox/z80_op1.c b/apps/plugins/zxbox/z80_op1.c
new file mode 100644
index 0000000000..d8d1a5d097
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op1.c
@@ -0,0 +1,376 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef NO_OPDEF
+#include "z80_def.h"
+#include "z80_op1.h"
+#endif
+
+OPDEF(nop, 0x00)
+{
+ ENTIME(4);
+}
+
+OPDEF(ex_af_afb, 0x08)
+{
+ register byte *ptmp;
+
+ ptmp = DANM(br)[ZI_AF].p;
+ DANM(br)[ZI_AF].p = DANM(nr)[ZI_AF].p;
+ DANM(nr)[ZI_AF].p = ptmp;
+
+ ENTIME(4);
+}
+
+OPDEF(djnz_e, 0x10)
+{
+ if(!--RB) {
+ PC++;
+ ENTIME(8);
+ }
+ else {
+ PC += IPCS; PC++;
+ ENTIME(13);
+ }
+}
+
+OPDEF(jr_e, 0x18)
+{
+ PC += IPCS; PC++;
+ ENTIME(12);
+}
+
+#define JR_CC_E(ccn, cc, n) \
+OPDEF(jr_ ## ccn ## _e, 0x20+n*8) \
+{ \
+ if(!(cc)) { \
+ PC++; \
+ ENTIME(7); \
+ } \
+ else { \
+ PC += IPCS; PC++; \
+ ENTIME(12); \
+ } \
+}
+
+JR_CC_E(nz, !TESTZF, 0)
+JR_CC_E(z, TESTZF, 1)
+JR_CC_E(nc, !TESTCF, 2)
+JR_CC_E(c, TESTCF, 3)
+
+
+#define LD_RR_NN(rrn, rr, n) \
+OPDEF(ld_ ## rrn ## _nn, 0x01+n*0x10) \
+{ \
+ FETCHD(rr); \
+ ENTIME(10); \
+}
+
+LD_RR_NN(bc, BC, 0)
+LD_RR_NN(de, DE, 1)
+LD_RR_NN(hl, HL, 2)
+LD_RR_NN(sp, SP, 3)
+
+#define DADD(rr1, rr2) \
+ register dbyte dtmp; \
+ register int idx; \
+ dtmp = rr1; \
+ rr1 = dtmp + rr2; \
+ idx = DIDXCALC(dtmp, rr2, rr1); \
+ SETFLAGS(CF | NF | HF, TAB(addf_tbl)[idx] & (CF | HF))
+
+
+#define ADD_RR_RR(rrn1, rr1, rrn2, rr2, n) \
+OPDEF(add_## rrn1 ## _ ## rrn2, 0x09+n*0x10) \
+{ \
+ DADD(rr1, rr2); \
+ ENTIME(11); \
+}
+
+ADD_RR_RR(hl, HL, bc, BC, 0)
+ADD_RR_RR(hl, HL, de, DE, 1)
+ADD_RR_RR(hl, HL, hl, HL, 2)
+ADD_RR_RR(hl, HL, sp, SP, 3)
+
+#define INC_RR(rrn, rr, n) \
+OPDEF(inc_ ## rrn, 0x03+n*0x10) \
+{ \
+ rr++; \
+ ENTIME(6); \
+}
+
+INC_RR(bc, BC, 0)
+INC_RR(de, DE, 1)
+INC_RR(hl, HL, 2)
+INC_RR(sp, SP, 3)
+
+#define DEC_RR(rrn, rr, n) \
+OPDEF(dec_ ## rrn, 0x0B+n*0x10) \
+{ \
+ rr--; \
+ ENTIME(6); \
+}
+
+DEC_RR(bc, BC, 0)
+DEC_RR(de, DE, 1)
+DEC_RR(hl, HL, 2)
+DEC_RR(sp, SP, 3)
+
+OPDEF(ld_ibc_a, 0x02)
+{
+ PUTMEM(BC, BCP, RA);
+ ENTIME(7);
+}
+
+OPDEF(ld_ide_a, 0x12)
+{
+ PUTMEM(DE, DEP, RA);
+ ENTIME(7);
+}
+
+#define LD_INN_RR(rrn, rr) \
+OPDEF(ld_inn_ ## rrn, 0x22) \
+{ \
+ register dbyte dtmp; \
+ FETCHD(dtmp); \
+ DWRITE(dtmp, rr); \
+ ENTIME(16); \
+}
+
+LD_INN_RR(hl, HL)
+
+
+OPDEF(ld_inn_a, 0x32)
+{
+ register dbyte dtmp;
+ FETCHD(dtmp);
+ WRITE(dtmp, RA);
+ ENTIME(13);
+}
+
+OPDEF(ld_a_ibc, 0x0A)
+{
+ RA = *BCP;
+ ENTIME(7);
+}
+
+OPDEF(ld_a_ide, 0x1A)
+{
+ RA = *DEP;
+ ENTIME(7);
+}
+
+
+#define LD_RR_INN(rrn, rr) \
+OPDEF(ld_ ## rrn ## _inn, 0x2A) \
+{ \
+ register dbyte dtmp; \
+ FETCHD(dtmp); \
+ rr = DREAD(dtmp); \
+ ENTIME(16); \
+}
+
+LD_RR_INN(hl, HL)
+
+
+OPDEF(ld_a_inn, 0x3A)
+{
+ register dbyte dtmp;
+ FETCHD(dtmp);
+ RA = READ(dtmp);
+ ENTIME(13);
+}
+
+
+#define INC(r) \
+ r++; \
+ SETFLAGS(SF | ZF | PVF | B3F | B5F, TAB(incf_tbl)[r])
+
+
+
+#define INC_R(rn, r, n) \
+OPDEF(inc_ ## rn, 0x04+n*8) \
+{ \
+ INC(r); \
+ ENTIME(4); \
+}
+
+INC_R(b, RB, 0)
+INC_R(c, RC, 1)
+INC_R(d, RD, 2)
+INC_R(e, RE, 3)
+INC_R(h, RH, 4)
+INC_R(l, RL, 5)
+INC_R(a, RA, 7)
+
+
+OPDEF(inc_ihl, 0x34)
+{
+ MODMEM(INC);
+ ENTIME(11);
+}
+
+
+#define DEC(r) \
+ r--; \
+ SETFLAGS(SF | ZF | PVF | B3F | B5F, TAB(decf_tbl)[r])
+
+
+#define DEC_R(rn, r, n) \
+OPDEF(dec_ ## rn, 0x05+n*8) \
+{ \
+ DEC(r); \
+ ENTIME(4); \
+}
+
+DEC_R(b, RB, 0)
+DEC_R(c, RC, 1)
+DEC_R(d, RD, 2)
+DEC_R(e, RE, 3)
+DEC_R(h, RH, 4)
+DEC_R(l, RL, 5)
+DEC_R(a, RA, 7)
+
+
+OPDEF(dec_ihl, 0x35)
+{
+ MODMEM(DEC);
+ ENTIME(11);
+}
+
+#define LD_R_N(rn, r, n) \
+OPDEF(ld_ ## rn ## _n, 0x06+n*8) \
+{ \
+ r = *PCP; \
+ PC++; \
+ ENTIME(7); \
+}
+
+LD_R_N(b, RB, 0)
+LD_R_N(c, RC, 1)
+LD_R_N(d, RD, 2)
+LD_R_N(e, RE, 3)
+LD_R_N(h, RH, 4)
+LD_R_N(l, RL, 5)
+LD_R_N(a, RA, 7)
+
+
+OPDEF(ld_ihl_n, 0x36)
+{
+ PUTMEM(HL, HLP, *PCP);
+ PC++;
+ ENTIME(10);
+}
+
+OPDEF(rlca, 0x07)
+{
+ register byte btmp;
+ btmp = (RA & 0x80) >> 7;
+ SETFLAGS(HF | NF | CF, btmp);
+ RA = (RA << 1) | btmp;
+ ENTIME(4);
+}
+
+OPDEF(rrca, 0x0F)
+{
+ register byte btmp;
+ btmp = (RA & 0x01);
+ SETFLAGS(HF | NF | CF, btmp);
+ if(btmp) {
+ RA = (RA >> 1) | 0x80;
+ ENTIME(4);
+ }
+ else {
+ RA >>= 1;
+ ENTIME(4);
+ }
+}
+
+
+OPDEF(rla, 0x17)
+{
+ register byte btmp;
+ btmp = RA & 0x80;
+ RA = (RA << 1) | (RF & CF);
+ SETFLAGS(HF | NF | CF, btmp >> 7);
+ ENTIME(4);
+}
+
+OPDEF(rra, 0x1F)
+{
+ register byte btmp;
+ btmp = TESTCF;
+ SETFLAGS(HF | NF | CF, RA & 0x01);
+ if(btmp) {
+ RA = (RA >> 1) | 0x80;
+ ENTIME(4);
+ }
+ else {
+ RA >>= 1;
+ ENTIME(4);
+ }
+}
+
+OPDEF(daa, 0x27)
+{
+ register int flag;
+ flag = RF;
+
+ if(!TESTNF) {
+ if(flag & CF) RA += 0x60;
+ else if(RA > 0x99) RA += 0x60, flag |= CF;
+
+ if(flag & HF) RA += 0x06;
+ else if((RA & 0x0F) > 9) RA += 0x06, flag |= HF;
+ }
+ else {
+ if(flag & CF) RA -= 0x60;
+ else if(RA > 0x99) RA -= 0x60, flag |= CF;
+
+ if(flag & HF) RA -= 0x06;
+ else if((RA & 0x0F) > 9) RA -= 0x06, flag |= HF;
+ }
+ flag = (flag & ~(SF | ZF | PVF | B3F | B5F)) | TAB(orf_tbl)[RA];
+ RF = flag;
+
+ ENTIME(4);
+}
+
+OPDEF(cpl, 0x2F)
+{
+ RA = ~RA;
+ SET_FL(HF | NF);
+ ENTIME(4);
+}
+
+OPDEF(scf, 0x37)
+{
+ SETFLAGS(HF | NF, CF);
+ ENTIME(4);
+}
+
+OPDEF(ccf, 0x3F)
+{
+ RF = (RF ^ CF) & ~(NF);
+/* HF undefined */
+ ENTIME(4);
+}
+
+#include "z80_op1x.c"
diff --git a/apps/plugins/zxbox/z80_op1.h b/apps/plugins/zxbox/z80_op1.h
new file mode 100644
index 0000000000..3d8e3bee2e
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op1.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+extern z80t z80op_nop(z80t);
+extern z80t z80op_ld_bc_nn(z80t);
+extern z80t z80op_ld_ibc_a(z80t);
+extern z80t z80op_inc_bc(z80t);
+extern z80t z80op_inc_b(z80t);
+extern z80t z80op_dec_b(z80t);
+extern z80t z80op_ld_b_n(z80t);
+extern z80t z80op_rlca(z80t);
+extern z80t z80op_ex_af_afb(z80t);
+extern z80t z80op_add_hl_bc(z80t);
+extern z80t z80op_ld_a_ibc(z80t);
+extern z80t z80op_dec_bc(z80t);
+extern z80t z80op_inc_c(z80t);
+extern z80t z80op_dec_c(z80t);
+extern z80t z80op_ld_c_n(z80t);
+extern z80t z80op_rrca(z80t);
+
+extern z80t z80op_djnz_e(z80t);
+extern z80t z80op_ld_de_nn(z80t);
+extern z80t z80op_ld_ide_a(z80t);
+extern z80t z80op_inc_de(z80t);
+extern z80t z80op_inc_d(z80t);
+extern z80t z80op_dec_d(z80t);
+extern z80t z80op_ld_d_n(z80t);
+extern z80t z80op_rla(z80t);
+extern z80t z80op_jr_e(z80t);
+extern z80t z80op_add_hl_de(z80t);
+extern z80t z80op_ld_a_ide(z80t);
+extern z80t z80op_dec_de(z80t);
+extern z80t z80op_inc_e(z80t);
+extern z80t z80op_dec_e(z80t);
+extern z80t z80op_ld_e_n(z80t);
+extern z80t z80op_rra(z80t);
+
+extern z80t z80op_jr_nz_e(z80t);
+extern z80t z80op_ld_hl_nn(z80t);
+extern z80t z80op_ld_inn_hl(z80t);
+extern z80t z80op_inc_hl(z80t);
+extern z80t z80op_inc_h(z80t);
+extern z80t z80op_dec_h(z80t);
+extern z80t z80op_ld_h_n(z80t);
+extern z80t z80op_daa(z80t);
+extern z80t z80op_jr_z_e(z80t);
+extern z80t z80op_add_hl_hl(z80t);
+extern z80t z80op_ld_hl_inn(z80t);
+extern z80t z80op_dec_hl(z80t);
+extern z80t z80op_inc_l(z80t);
+extern z80t z80op_dec_l(z80t);
+extern z80t z80op_ld_l_n(z80t);
+extern z80t z80op_cpl(z80t);
+
+extern z80t z80op_jr_nc_e(z80t);
+extern z80t z80op_ld_sp_nn(z80t);
+extern z80t z80op_ld_inn_a(z80t);
+extern z80t z80op_inc_sp(z80t);
+extern z80t z80op_inc_ihl(z80t);
+extern z80t z80op_dec_ihl(z80t);
+extern z80t z80op_ld_ihl_n(z80t);
+extern z80t z80op_scf(z80t);
+extern z80t z80op_jr_c_e(z80t);
+extern z80t z80op_add_hl_sp(z80t);
+extern z80t z80op_ld_a_inn(z80t);
+extern z80t z80op_dec_sp(z80t);
+extern z80t z80op_inc_a(z80t);
+extern z80t z80op_dec_a(z80t);
+extern z80t z80op_ld_a_n(z80t);
+extern z80t z80op_ccf(z80t);
+
+/* IX */
+
+extern z80t z80op_add_ix_bc(z80t);
+extern z80t z80op_add_ix_de(z80t);
+extern z80t z80op_add_ix_ix(z80t);
+extern z80t z80op_add_ix_sp(z80t);
+extern z80t z80op_ld_ix_nn(z80t);
+extern z80t z80op_ld_inn_ix(z80t);
+extern z80t z80op_ld_ix_inn(z80t);
+extern z80t z80op_inc_ix(z80t);
+extern z80t z80op_dec_ix(z80t);
+extern z80t z80op_inc_ixh(z80t);
+extern z80t z80op_inc_ixl(z80t);
+extern z80t z80op_inc_iixd(z80t);
+extern z80t z80op_dec_ixh(z80t);
+extern z80t z80op_dec_ixl(z80t);
+extern z80t z80op_dec_iixd(z80t);
+extern z80t z80op_ld_ixh_n(z80t);
+extern z80t z80op_ld_ixl_n(z80t);
+extern z80t z80op_ld_iixd_n(z80t);
+
+/* IY */
+
+extern z80t z80op_add_iy_bc(z80t);
+extern z80t z80op_add_iy_de(z80t);
+extern z80t z80op_add_iy_iy(z80t);
+extern z80t z80op_add_iy_sp(z80t);
+extern z80t z80op_ld_iy_nn(z80t);
+extern z80t z80op_ld_inn_iy(z80t);
+extern z80t z80op_ld_iy_inn(z80t);
+extern z80t z80op_inc_iy(z80t);
+extern z80t z80op_dec_iy(z80t);
+extern z80t z80op_inc_iyh(z80t);
+extern z80t z80op_inc_iyl(z80t);
+extern z80t z80op_inc_iiyd(z80t);
+extern z80t z80op_dec_iyh(z80t);
+extern z80t z80op_dec_iyl(z80t);
+extern z80t z80op_dec_iiyd(z80t);
+extern z80t z80op_ld_iyh_n(z80t);
+extern z80t z80op_ld_iyl_n(z80t);
+extern z80t z80op_ld_iiyd_n(z80t);
+
diff --git a/apps/plugins/zxbox/z80_op1x.c b/apps/plugins/zxbox/z80_op1x.c
new file mode 100644
index 0000000000..ca9b001486
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op1x.c
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* IX */
+
+LD_RR_NN(ix, IX, 2)
+
+ADD_RR_RR(ix, IX, bc, BC, 0)
+ADD_RR_RR(ix, IX, de, DE, 1)
+ADD_RR_RR(ix, IX, ix, IX, 2)
+ADD_RR_RR(ix, IX, sp, SP, 3)
+
+INC_RR(ix, IX, 2)
+
+DEC_RR(ix, IX, 2)
+
+LD_INN_RR(ix, IX)
+
+LD_RR_INN(ix, IX)
+
+INC_R(ixh, XH, 4)
+INC_R(ixl, XL, 5)
+
+OPDEF(inc_iixd, 0x34)
+{
+ register dbyte addr;
+ IXDGET(IX, addr);
+ MODMEMADDR(INC, addr);
+ ENTIME(19);
+}
+
+DEC_R(ixh, XH, 4)
+DEC_R(ixl, XL, 5)
+
+OPDEF(dec_iixd, 0x35)
+{
+ register dbyte addr;
+ IXDGET(IX, addr);
+ MODMEMADDR(DEC, addr);
+ ENTIME(19);
+}
+
+
+LD_R_N(ixh, XH, 4)
+LD_R_N(ixl, XL, 5)
+
+OPDEF(ld_iixd_n, 0x36)
+{
+ register dbyte addr;
+ IXDGET(IX, addr);
+ WRITE(addr, READ(PC));
+ PC++;
+ ENTIME(15);
+}
+
+
+/* IY */
+
+LD_RR_NN(iy, IY, 2)
+
+ADD_RR_RR(iy, IY, bc, BC, 0)
+ADD_RR_RR(iy, IY, de, DE, 1)
+ADD_RR_RR(iy, IY, iy, IY, 2)
+ADD_RR_RR(iy, IY, sp, SP, 3)
+
+INC_RR(iy, IY, 2)
+
+DEC_RR(iy, IY, 2)
+
+LD_INN_RR(iy, IY)
+
+LD_RR_INN(iy, IY)
+
+INC_R(iyh, YH, 4)
+INC_R(iyl, YL, 5)
+
+OPDEF(inc_iiyd, 0x34)
+{
+ register dbyte addr;
+ IXDGET(IY, addr);
+ MODMEMADDR(INC, addr);
+ ENTIME(19);
+}
+
+DEC_R(iyh, YH, 4)
+DEC_R(iyl, YL, 5)
+
+OPDEF(dec_iiyd, 0x35)
+{
+ register dbyte addr;
+ IXDGET(IY, addr);
+ MODMEMADDR(DEC, addr);
+ ENTIME(19);
+}
+
+
+LD_R_N(iyh, YH, 4)
+LD_R_N(iyl, YL, 5)
+
+OPDEF(ld_iiyd_n, 0x36)
+{
+ register dbyte addr;
+ IXDGET(IY, addr);
+ WRITE(addr, READ(PC));
+ PC++;
+ ENTIME(15);
+}
+
diff --git a/apps/plugins/zxbox/z80_op2.c b/apps/plugins/zxbox/z80_op2.c
new file mode 100644
index 0000000000..89bb5af50b
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op2.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef NO_OPDEF
+#include "z80_def.h"
+#include "z80_op2.h"
+#endif
+
+OPDEF(halt, 0x76)
+{
+ register int nn;
+
+ DANM(haltstate) = 1;
+ nn = (DANM(tc) - 1) / 4 + 1;
+
+ DANM(tc) -= 4 * nn;
+ RR += nn-1;
+ ENDOP();
+}
+
+#define LD_R_R(rdn, rsn, rd, rs, n1, n2) \
+OPDEF(ld_ ## rdn ## _ ## rsn, 0x40 + n1 * 8 + n2) \
+{ \
+ rd = rs; \
+ ENTIME(4); \
+}
+
+#if 0
+
+#define LD_NOOP(rsd, n) \
+OPDEF(ld_ ## rsd ## _ ## rsd, 0x40 + n * 8 + n) \
+{ \
+ ENTIME(4); \
+}
+
+LD_NOOP(b, 0)
+LD_NOOP(c, 1)
+LD_NOOP(d, 2)
+LD_NOOP(e, 3)
+LD_NOOP(h, 4)
+LD_NOOP(l, 5)
+LD_NOOP(a, 7)
+
+#endif
+
+LD_R_R(b, c, RB, RC, 0, 1)
+LD_R_R(b, d, RB, RD, 0, 2)
+LD_R_R(b, e, RB, RE, 0, 3)
+LD_R_R(b, h, RB, RH, 0, 4)
+LD_R_R(b, l, RB, RL, 0, 5)
+LD_R_R(b, a, RB, RA, 0, 7)
+
+LD_R_R(c, b, RC, RB, 1, 0)
+LD_R_R(c, d, RC, RD, 1, 2)
+LD_R_R(c, e, RC, RE, 1, 3)
+LD_R_R(c, h, RC, RH, 1, 4)
+LD_R_R(c, l, RC, RL, 1, 5)
+LD_R_R(c, a, RC, RA, 1, 7)
+
+LD_R_R(d, b, RD, RB, 2, 0)
+LD_R_R(d, c, RD, RC, 2, 1)
+LD_R_R(d, e, RD, RE, 2, 3)
+LD_R_R(d, h, RD, RH, 2, 4)
+LD_R_R(d, l, RD, RL, 2, 5)
+LD_R_R(d, a, RD, RA, 2, 7)
+
+
+LD_R_R(e, b, RE, RB, 3, 0)
+LD_R_R(e, c, RE, RC, 3, 1)
+LD_R_R(e, d, RE, RD, 3, 2)
+LD_R_R(e, h, RE, RH, 3, 4)
+LD_R_R(e, l, RE, RL, 3, 5)
+LD_R_R(e, a, RE, RA, 3, 7)
+
+LD_R_R(h, b, RH, RB, 4, 0)
+LD_R_R(h, c, RH, RC, 4, 1)
+LD_R_R(h, d, RH, RD, 4, 2)
+LD_R_R(h, e, RH, RE, 4, 3)
+LD_R_R(h, l, RH, RL, 4, 5)
+LD_R_R(h, a, RH, RA, 4, 7)
+
+LD_R_R(l, b, RL, RB, 5, 0)
+LD_R_R(l, c, RL, RC, 5, 1)
+LD_R_R(l, d, RL, RD, 5, 2)
+LD_R_R(l, e, RL, RE, 5, 3)
+LD_R_R(l, h, RL, RH, 5, 4)
+LD_R_R(l, a, RL, RA, 5, 7)
+
+LD_R_R(a, b, RA, RB, 7, 0)
+LD_R_R(a, c, RA, RC, 7, 1)
+LD_R_R(a, d, RA, RD, 7, 2)
+LD_R_R(a, e, RA, RE, 7, 3)
+LD_R_R(a, h, RA, RH, 7, 4)
+LD_R_R(a, l, RA, RL, 7, 5)
+
+
+#define LD_R_IHL(rdn, rd, n) \
+OPDEF(ld_ ## rdn ## _ihl, 0x46+n*8) \
+{ \
+ rd = *HLP; \
+ ENTIME(7); \
+}
+
+#define LD_R_ID(ixyn, ixy, rsn, rs, n) \
+OPDEF(ld_ ## rsn ## _i ## ixyn ## d, 0x46+n*8) \
+{ \
+ register dbyte addr; \
+ IXDGET(ixy, addr); \
+ rs = READ(addr); \
+ ENTIME(15); \
+}
+
+
+LD_R_IHL(b, RB, 0)
+LD_R_IHL(c, RC, 1)
+LD_R_IHL(d, RD, 2)
+LD_R_IHL(e, RE, 3)
+LD_R_IHL(h, RH, 4)
+LD_R_IHL(l, RL, 5)
+LD_R_IHL(a, RA, 7)
+
+#define LD_IHL_R(rsn, rs, n) \
+OPDEF(ld_ihl_ ## rsn, 0x70+n) \
+{ \
+ PUTMEM(HL, HLP, rs); \
+ ENTIME(7); \
+}
+
+#define LD_ID_R(ixyn, ixy, rsn, rs, n) \
+OPDEF(ld_i ## ixyn ## d_ ## rsn, 0x70+n) \
+{ \
+ register dbyte addr; \
+ IXDGET(ixy, addr); \
+ WRITE(addr, rs); \
+ ENTIME(15); \
+}
+
+
+
+LD_IHL_R(b, RB, 0)
+LD_IHL_R(c, RC, 1)
+LD_IHL_R(d, RD, 2)
+LD_IHL_R(e, RE, 3)
+LD_IHL_R(h, RH, 4)
+LD_IHL_R(l, RL, 5)
+LD_IHL_R(a, RA, 7)
+
+#include "z80_op2x.c"
diff --git a/apps/plugins/zxbox/z80_op2.h b/apps/plugins/zxbox/z80_op2.h
new file mode 100644
index 0000000000..1265f42309
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op2.h
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* extern z80t z80op_nop(z80t); */
+extern z80t z80op_ld_b_c(z80t);
+extern z80t z80op_ld_b_d(z80t);
+extern z80t z80op_ld_b_e(z80t);
+extern z80t z80op_ld_b_h(z80t);
+extern z80t z80op_ld_b_l(z80t);
+extern z80t z80op_ld_b_ihl(z80t);
+extern z80t z80op_ld_b_a(z80t);
+extern z80t z80op_ld_c_b(z80t);
+/* extern z80t z80op_nop(z80t); */
+extern z80t z80op_ld_c_d(z80t);
+extern z80t z80op_ld_c_e(z80t);
+extern z80t z80op_ld_c_h(z80t);
+extern z80t z80op_ld_c_l(z80t);
+extern z80t z80op_ld_c_ihl(z80t);
+extern z80t z80op_ld_c_a(z80t);
+
+extern z80t z80op_ld_d_b(z80t);
+extern z80t z80op_ld_d_c(z80t);
+/* extern z80t z80op_nop(z80t); */
+extern z80t z80op_ld_d_e(z80t);
+extern z80t z80op_ld_d_h(z80t);
+extern z80t z80op_ld_d_l(z80t);
+extern z80t z80op_ld_d_ihl(z80t);
+extern z80t z80op_ld_d_a(z80t);
+extern z80t z80op_ld_e_b(z80t);
+extern z80t z80op_ld_e_c(z80t);
+extern z80t z80op_ld_e_d(z80t);
+/* extern z80t z80op_nop(z80t); */
+extern z80t z80op_ld_e_h(z80t);
+extern z80t z80op_ld_e_l(z80t);
+extern z80t z80op_ld_e_ihl(z80t);
+extern z80t z80op_ld_e_a(z80t);
+
+extern z80t z80op_ld_h_b(z80t);
+extern z80t z80op_ld_h_c(z80t);
+extern z80t z80op_ld_h_d(z80t);
+extern z80t z80op_ld_h_e(z80t);
+/* extern z80t z80op_nop(z80t); */
+extern z80t z80op_ld_h_l(z80t);
+extern z80t z80op_ld_h_ihl(z80t);
+extern z80t z80op_ld_h_a(z80t);
+extern z80t z80op_ld_l_b(z80t);
+extern z80t z80op_ld_l_c(z80t);
+extern z80t z80op_ld_l_d(z80t);
+extern z80t z80op_ld_l_e(z80t);
+extern z80t z80op_ld_l_h(z80t);
+/* extern z80t z80op_nop(z80t); */
+extern z80t z80op_ld_l_ihl(z80t);
+extern z80t z80op_ld_l_a(z80t);
+
+extern z80t z80op_ld_ihl_b(z80t);
+extern z80t z80op_ld_ihl_c(z80t);
+extern z80t z80op_ld_ihl_d(z80t);
+extern z80t z80op_ld_ihl_e(z80t);
+extern z80t z80op_ld_ihl_h(z80t);
+extern z80t z80op_ld_ihl_l(z80t);
+extern z80t z80op_halt(z80t);
+extern z80t z80op_ld_ihl_a(z80t);
+extern z80t z80op_ld_a_b(z80t);
+extern z80t z80op_ld_a_c(z80t);
+extern z80t z80op_ld_a_d(z80t);
+extern z80t z80op_ld_a_e(z80t);
+extern z80t z80op_ld_a_h(z80t);
+extern z80t z80op_ld_a_l(z80t);
+extern z80t z80op_ld_a_ihl(z80t);
+/* extern z80t z80op_nop(z80t); */
+
+
+/* IX */
+
+extern z80t z80op_ld_b_ixh(z80t);
+extern z80t z80op_ld_b_ixl(z80t);
+
+extern z80t z80op_ld_c_ixh(z80t);
+extern z80t z80op_ld_c_ixl(z80t);
+
+extern z80t z80op_ld_d_ixh(z80t);
+extern z80t z80op_ld_d_ixl(z80t);
+
+extern z80t z80op_ld_e_ixh(z80t);
+extern z80t z80op_ld_e_ixl(z80t);
+
+extern z80t z80op_ld_ixh_b(z80t);
+extern z80t z80op_ld_ixh_c(z80t);
+extern z80t z80op_ld_ixh_d(z80t);
+extern z80t z80op_ld_ixh_e(z80t);
+/* extern z80t z80op_ld_ixh_ixh(z80t); */
+extern z80t z80op_ld_ixh_ixl(z80t);
+extern z80t z80op_ld_ixh_a(z80t);
+
+
+extern z80t z80op_ld_ixl_b(z80t);
+extern z80t z80op_ld_ixl_c(z80t);
+extern z80t z80op_ld_ixl_d(z80t);
+extern z80t z80op_ld_ixl_e(z80t);
+extern z80t z80op_ld_ixl_ixh(z80t);
+/* extern z80t z80op_ld_ixl_ixl(z80t); */
+extern z80t z80op_ld_ixl_a(z80t);
+
+extern z80t z80op_ld_a_ixh(z80t);
+extern z80t z80op_ld_a_ixl(z80t);
+
+extern z80t z80op_ld_iixd_b(z80t);
+extern z80t z80op_ld_iixd_c(z80t);
+extern z80t z80op_ld_iixd_d(z80t);
+extern z80t z80op_ld_iixd_e(z80t);
+extern z80t z80op_ld_iixd_h(z80t);
+extern z80t z80op_ld_iixd_l(z80t);
+extern z80t z80op_ld_iixd_a(z80t);
+
+extern z80t z80op_ld_b_iixd(z80t);
+extern z80t z80op_ld_c_iixd(z80t);
+extern z80t z80op_ld_d_iixd(z80t);
+extern z80t z80op_ld_e_iixd(z80t);
+extern z80t z80op_ld_h_iixd(z80t);
+extern z80t z80op_ld_l_iixd(z80t);
+extern z80t z80op_ld_a_iixd(z80t);
+
+/* IY */
+
+extern z80t z80op_ld_b_iyh(z80t);
+extern z80t z80op_ld_b_iyl(z80t);
+
+extern z80t z80op_ld_c_iyh(z80t);
+extern z80t z80op_ld_c_iyl(z80t);
+
+extern z80t z80op_ld_d_iyh(z80t);
+extern z80t z80op_ld_d_iyl(z80t);
+
+extern z80t z80op_ld_e_iyh(z80t);
+extern z80t z80op_ld_e_iyl(z80t);
+
+extern z80t z80op_ld_iyh_b(z80t);
+extern z80t z80op_ld_iyh_c(z80t);
+extern z80t z80op_ld_iyh_d(z80t);
+extern z80t z80op_ld_iyh_e(z80t);
+/* extern z80t z80op_ld_iyh_iyh(z80t); */
+extern z80t z80op_ld_iyh_iyl(z80t);
+extern z80t z80op_ld_iyh_a(z80t);
+
+
+extern z80t z80op_ld_iyl_b(z80t);
+extern z80t z80op_ld_iyl_c(z80t);
+extern z80t z80op_ld_iyl_d(z80t);
+extern z80t z80op_ld_iyl_e(z80t);
+extern z80t z80op_ld_iyl_iyh(z80t);
+/* extern z80t z80op_ld_iyl_iyl(z80t); */
+extern z80t z80op_ld_iyl_a(z80t);
+
+extern z80t z80op_ld_a_iyh(z80t);
+extern z80t z80op_ld_a_iyl(z80t);
+
+extern z80t z80op_ld_iiyd_b(z80t);
+extern z80t z80op_ld_iiyd_c(z80t);
+extern z80t z80op_ld_iiyd_d(z80t);
+extern z80t z80op_ld_iiyd_e(z80t);
+extern z80t z80op_ld_iiyd_h(z80t);
+extern z80t z80op_ld_iiyd_l(z80t);
+extern z80t z80op_ld_iiyd_a(z80t);
+
+extern z80t z80op_ld_b_iiyd(z80t);
+extern z80t z80op_ld_c_iiyd(z80t);
+extern z80t z80op_ld_d_iiyd(z80t);
+extern z80t z80op_ld_e_iiyd(z80t);
+extern z80t z80op_ld_h_iiyd(z80t);
+extern z80t z80op_ld_l_iiyd(z80t);
+extern z80t z80op_ld_a_iiyd(z80t);
diff --git a/apps/plugins/zxbox/z80_op2x.c b/apps/plugins/zxbox/z80_op2x.c
new file mode 100644
index 0000000000..40c85a2eda
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op2x.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* IX */
+
+LD_R_R(b, ixh, RB, XH, 0, 4)
+LD_R_R(b, ixl, RB, XL, 0, 5)
+
+LD_R_R(c, ixh, RC, XH, 1, 4)
+LD_R_R(c, ixl, RC, XL, 1, 5)
+
+LD_R_R(d, ixh, RD, XH, 2, 4)
+LD_R_R(d, ixl, RD, XL, 2, 5)
+
+LD_R_R(e, ixh, RE, XH, 3, 4)
+LD_R_R(e, ixl, RE, XL, 3, 5)
+
+LD_R_R(ixh, b, XH, RB, 4, 0)
+LD_R_R(ixh, c, XH, RC, 4, 1)
+LD_R_R(ixh, d, XH, RD, 4, 2)
+LD_R_R(ixh, e, XH, RE, 4, 3)
+LD_R_R(ixh, ixl, XH, XL, 4, 5)
+LD_R_R(ixh, a, XH, RA, 4, 7)
+
+LD_R_R(ixl, b, XL, RB, 5, 0)
+LD_R_R(ixl, c, XL, RC, 5, 1)
+LD_R_R(ixl, d, XL, RD, 5, 2)
+LD_R_R(ixl, e, XL, RE, 5, 3)
+LD_R_R(ixl, ixh, XL, XH, 5, 4)
+LD_R_R(ixl, a, XL, RA, 5, 7)
+
+
+LD_R_R(a, ixh, RA, XH, 7, 4)
+LD_R_R(a, ixl, RA, XL, 7, 5)
+
+LD_ID_R(ix, IX, b, RB, 0)
+LD_ID_R(ix, IX, c, RC, 1)
+LD_ID_R(ix, IX, d, RD, 2)
+LD_ID_R(ix, IX, e, RE, 3)
+LD_ID_R(ix, IX, h, RH, 4)
+LD_ID_R(ix, IX, l, RL, 5)
+LD_ID_R(ix, IX, a, RA, 6)
+
+LD_R_ID(ix, IX, b, RB, 0)
+LD_R_ID(ix, IX, c, RC, 1)
+LD_R_ID(ix, IX, d, RD, 2)
+LD_R_ID(ix, IX, e, RE, 3)
+LD_R_ID(ix, IX, h, RH, 4)
+LD_R_ID(ix, IX, l, RL, 5)
+LD_R_ID(ix, IX, a, RA, 6)
+
+
+/* IY */
+
+LD_R_R(b, iyh, RB, YH, 0, 4)
+LD_R_R(b, iyl, RB, YL, 0, 5)
+
+LD_R_R(c, iyh, RC, YH, 1, 4)
+LD_R_R(c, iyl, RC, YL, 1, 5)
+
+LD_R_R(d, iyh, RD, YH, 2, 4)
+LD_R_R(d, iyl, RD, YL, 2, 5)
+
+LD_R_R(e, iyh, RE, YH, 3, 4)
+LD_R_R(e, iyl, RE, YL, 3, 5)
+
+LD_R_R(iyh, b, YH, RB, 4, 0)
+LD_R_R(iyh, c, YH, RC, 4, 1)
+LD_R_R(iyh, d, YH, RD, 4, 2)
+LD_R_R(iyh, e, YH, RE, 4, 3)
+LD_R_R(iyh, iyl, YH, YL, 4, 5)
+LD_R_R(iyh, a, YH, RA, 4, 7)
+
+LD_R_R(iyl, b, YL, RB, 5, 0)
+LD_R_R(iyl, c, YL, RC, 5, 1)
+LD_R_R(iyl, d, YL, RD, 5, 2)
+LD_R_R(iyl, e, YL, RE, 5, 3)
+LD_R_R(iyl, iyh, YL, YH, 5, 4)
+LD_R_R(iyl, a, YL, RA, 5, 7)
+
+
+LD_R_R(a, iyh, RA, YH, 7, 4)
+LD_R_R(a, iyl, RA, YL, 7, 5)
+
+LD_ID_R(iy, IY, b, RB, 0)
+LD_ID_R(iy, IY, c, RC, 1)
+LD_ID_R(iy, IY, d, RD, 2)
+LD_ID_R(iy, IY, e, RE, 3)
+LD_ID_R(iy, IY, h, RH, 4)
+LD_ID_R(iy, IY, l, RL, 5)
+LD_ID_R(iy, IY, a, RA, 6)
+
+LD_R_ID(iy, IY, b, RB, 0)
+LD_R_ID(iy, IY, c, RC, 1)
+LD_R_ID(iy, IY, d, RD, 2)
+LD_R_ID(iy, IY, e, RE, 3)
+LD_R_ID(iy, IY, h, RH, 4)
+LD_R_ID(iy, IY, l, RL, 5)
+LD_R_ID(iy, IY, a, RA, 6)
diff --git a/apps/plugins/zxbox/z80_op3.c b/apps/plugins/zxbox/z80_op3.c
new file mode 100644
index 0000000000..dd0d43ad02
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op3.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef NO_OPDEF
+#include "z80_def.h"
+#include "z80_op3.h"
+#include "z80_ari.h"
+#endif
+
+#define ARIR(arin, func, an, rn, r, n) \
+OPDEF(arin ## _ ## rn, 0x80+an*8+n) \
+{ \
+ func(r); \
+ ENTIME(4); \
+}
+
+#define ARIIHL(arin, func, an) \
+OPDEF(arin ## _ihl, 0x86+an*8) \
+{ \
+ func(*HLP); \
+ ENTIME(7); \
+}
+
+#define ARIID(arin, func, an, ixyn, ixy) \
+OPDEF(arin ## _i ## ixyn ## d, 0x86+an*8)\
+{ \
+ register dbyte addr; \
+ register byte val; \
+ IXDGET(ixy, addr); \
+ val = READ(addr); \
+ func(val); \
+ ENTIME(15); \
+}
+
+
+#define ADD_A_R(rn, r, n) ARIR(add_a, ADD, 0, rn, r, n)
+#define ADC_A_R(rn, r, n) ARIR(adc_a, ADC, 1, rn, r, n)
+#define SUB_R(rn, r, n) ARIR(sub, SUB, 2, rn, r, n)
+#define SBC_A_R(rn, r, n) ARIR(sbc_a, SBC, 3, rn, r, n)
+#define AND_R(rn, r, n) ARIR(and, AND, 4, rn, r, n)
+#define XOR_R(rn, r, n) ARIR(xor, XOR, 5, rn, r, n)
+#define OR_R(rn, r, n) ARIR(or, OR, 6, rn, r, n)
+#define CP_R(rn, r, n) ARIR(cp, CP, 7, rn, r, n)
+
+ADD_A_R(b, RB, 0)
+ADD_A_R(c, RC, 1)
+ADD_A_R(d, RD, 2)
+ADD_A_R(e, RE, 3)
+ADD_A_R(h, RH, 4)
+ADD_A_R(l, RL, 5)
+ADD_A_R(a, RA, 7)
+
+ADC_A_R(b, RB, 0)
+ADC_A_R(c, RC, 1)
+ADC_A_R(d, RD, 2)
+ADC_A_R(e, RE, 3)
+ADC_A_R(h, RH, 4)
+ADC_A_R(l, RL, 5)
+ADC_A_R(a, RA, 7)
+
+SUB_R(b, RB, 0)
+SUB_R(c, RC, 1)
+SUB_R(d, RD, 2)
+SUB_R(e, RE, 3)
+SUB_R(h, RH, 4)
+SUB_R(l, RL, 5)
+SUB_R(a, RA, 7)
+
+SBC_A_R(b, RB, 0)
+SBC_A_R(c, RC, 1)
+SBC_A_R(d, RD, 2)
+SBC_A_R(e, RE, 3)
+SBC_A_R(h, RH, 4)
+SBC_A_R(l, RL, 5)
+SBC_A_R(a, RA, 7)
+
+AND_R(b, RB, 0)
+AND_R(c, RC, 1)
+AND_R(d, RD, 2)
+AND_R(e, RE, 3)
+AND_R(h, RH, 4)
+AND_R(l, RL, 5)
+AND_R(a, RA, 7)
+
+XOR_R(b, RB, 0)
+XOR_R(c, RC, 1)
+XOR_R(d, RD, 2)
+XOR_R(e, RE, 3)
+XOR_R(h, RH, 4)
+XOR_R(l, RL, 5)
+/* XOR_R(a, RA, 7) */
+
+OPDEF(xor_a, 0xAF)
+{
+ RA = 0;
+ RF = (RF & ~(ALLF)) | (ZF | PVF);
+ ENTIME(4);
+}
+
+OR_R(b, RB, 0)
+OR_R(c, RC, 1)
+OR_R(d, RD, 2)
+OR_R(e, RE, 3)
+OR_R(h, RH, 4)
+OR_R(l, RL, 5)
+OR_R(a, RA, 7)
+
+CP_R(b, RB, 0)
+CP_R(c, RC, 1)
+CP_R(d, RD, 2)
+CP_R(e, RE, 3)
+CP_R(h, RH, 4)
+CP_R(l, RL, 5)
+CP_R(a, RA, 7)
+
+ARIIHL(add_a, ADD, 0)
+ARIIHL(adc_a, ADC, 1)
+ARIIHL(sub, SUB, 2)
+ARIIHL(sbc_a, SBC, 3)
+ARIIHL(and, AND, 4)
+ARIIHL(xor, XOR, 5)
+ARIIHL(or, OR, 6)
+ARIIHL(cp, CP, 7)
+
+#include "z80_op3x.c"
diff --git a/apps/plugins/zxbox/z80_op3.h b/apps/plugins/zxbox/z80_op3.h
new file mode 100644
index 0000000000..481048e3f9
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op3.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+extern z80t z80op_add_a_b(z80t);
+extern z80t z80op_add_a_c(z80t);
+extern z80t z80op_add_a_d(z80t);
+extern z80t z80op_add_a_e(z80t);
+extern z80t z80op_add_a_h(z80t);
+extern z80t z80op_add_a_l(z80t);
+extern z80t z80op_add_a_ihl(z80t);
+extern z80t z80op_add_a_a(z80t);
+extern z80t z80op_adc_a_b(z80t);
+extern z80t z80op_adc_a_c(z80t);
+extern z80t z80op_adc_a_d(z80t);
+extern z80t z80op_adc_a_e(z80t);
+extern z80t z80op_adc_a_h(z80t);
+extern z80t z80op_adc_a_l(z80t);
+extern z80t z80op_adc_a_ihl(z80t);
+extern z80t z80op_adc_a_a(z80t);
+
+extern z80t z80op_sub_b(z80t);
+extern z80t z80op_sub_c(z80t);
+extern z80t z80op_sub_d(z80t);
+extern z80t z80op_sub_e(z80t);
+extern z80t z80op_sub_h(z80t);
+extern z80t z80op_sub_l(z80t);
+extern z80t z80op_sub_ihl(z80t);
+extern z80t z80op_sub_a(z80t);
+extern z80t z80op_sbc_a_b(z80t);
+extern z80t z80op_sbc_a_c(z80t);
+extern z80t z80op_sbc_a_d(z80t);
+extern z80t z80op_sbc_a_e(z80t);
+extern z80t z80op_sbc_a_h(z80t);
+extern z80t z80op_sbc_a_l(z80t);
+extern z80t z80op_sbc_a_ihl(z80t);
+extern z80t z80op_sbc_a_a(z80t);
+
+extern z80t z80op_and_b(z80t);
+extern z80t z80op_and_c(z80t);
+extern z80t z80op_and_d(z80t);
+extern z80t z80op_and_e(z80t);
+extern z80t z80op_and_h(z80t);
+extern z80t z80op_and_l(z80t);
+extern z80t z80op_and_ihl(z80t);
+extern z80t z80op_and_a(z80t);
+extern z80t z80op_xor_b(z80t);
+extern z80t z80op_xor_c(z80t);
+extern z80t z80op_xor_d(z80t);
+extern z80t z80op_xor_e(z80t);
+extern z80t z80op_xor_h(z80t);
+extern z80t z80op_xor_l(z80t);
+extern z80t z80op_xor_ihl(z80t);
+extern z80t z80op_xor_a(z80t);
+
+extern z80t z80op_or_b(z80t);
+extern z80t z80op_or_c(z80t);
+extern z80t z80op_or_d(z80t);
+extern z80t z80op_or_e(z80t);
+extern z80t z80op_or_h(z80t);
+extern z80t z80op_or_l(z80t);
+extern z80t z80op_or_ihl(z80t);
+extern z80t z80op_or_a(z80t);
+extern z80t z80op_cp_b(z80t);
+extern z80t z80op_cp_c(z80t);
+extern z80t z80op_cp_d(z80t);
+extern z80t z80op_cp_e(z80t);
+extern z80t z80op_cp_h(z80t);
+extern z80t z80op_cp_l(z80t);
+extern z80t z80op_cp_ihl(z80t);
+extern z80t z80op_cp_a(z80t);
+
+
+/* IX */
+
+extern z80t z80op_add_a_ixh(z80t);
+extern z80t z80op_add_a_ixl(z80t);
+extern z80t z80op_add_a_iixd(z80t);
+
+extern z80t z80op_adc_a_ixh(z80t);
+extern z80t z80op_adc_a_ixl(z80t);
+extern z80t z80op_adc_a_iixd(z80t);
+
+extern z80t z80op_sub_ixh(z80t);
+extern z80t z80op_sub_ixl(z80t);
+extern z80t z80op_sub_iixd(z80t);
+
+extern z80t z80op_sbc_a_ixh(z80t);
+extern z80t z80op_sbc_a_ixl(z80t);
+extern z80t z80op_sbc_a_iixd(z80t);
+
+extern z80t z80op_and_ixh(z80t);
+extern z80t z80op_and_ixl(z80t);
+extern z80t z80op_and_iixd(z80t);
+
+extern z80t z80op_xor_ixh(z80t);
+extern z80t z80op_xor_ixl(z80t);
+extern z80t z80op_xor_iixd(z80t);
+
+extern z80t z80op_or_ixh(z80t);
+extern z80t z80op_or_ixl(z80t);
+extern z80t z80op_or_iixd(z80t);
+
+extern z80t z80op_cp_ixh(z80t);
+extern z80t z80op_cp_ixl(z80t);
+extern z80t z80op_cp_iixd(z80t);
+
+
+/* IY */
+
+extern z80t z80op_add_a_iyh(z80t);
+extern z80t z80op_add_a_iyl(z80t);
+extern z80t z80op_add_a_iiyd(z80t);
+
+extern z80t z80op_adc_a_iyh(z80t);
+extern z80t z80op_adc_a_iyl(z80t);
+extern z80t z80op_adc_a_iiyd(z80t);
+
+extern z80t z80op_sub_iyh(z80t);
+extern z80t z80op_sub_iyl(z80t);
+extern z80t z80op_sub_iiyd(z80t);
+
+extern z80t z80op_sbc_a_iyh(z80t);
+extern z80t z80op_sbc_a_iyl(z80t);
+extern z80t z80op_sbc_a_iiyd(z80t);
+
+extern z80t z80op_and_iyh(z80t);
+extern z80t z80op_and_iyl(z80t);
+extern z80t z80op_and_iiyd(z80t);
+
+extern z80t z80op_xor_iyh(z80t);
+extern z80t z80op_xor_iyl(z80t);
+extern z80t z80op_xor_iiyd(z80t);
+
+extern z80t z80op_or_iyh(z80t);
+extern z80t z80op_or_iyl(z80t);
+extern z80t z80op_or_iiyd(z80t);
+
+extern z80t z80op_cp_iyh(z80t);
+extern z80t z80op_cp_iyl(z80t);
+extern z80t z80op_cp_iiyd(z80t);
diff --git a/apps/plugins/zxbox/z80_op3x.c b/apps/plugins/zxbox/z80_op3x.c
new file mode 100644
index 0000000000..cafb5dfdad
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op3x.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* IX */
+
+ADD_A_R(ixh, XH, 4)
+ADD_A_R(ixl, XL, 5)
+
+ADC_A_R(ixh, XH, 4)
+ADC_A_R(ixl, XL, 5)
+
+SUB_R(ixh, XH, 4)
+SUB_R(ixl, XL, 5)
+
+SBC_A_R(ixh, XH, 4)
+SBC_A_R(ixl, XL, 5)
+
+AND_R(ixh, XH, 4)
+AND_R(ixl, XL, 5)
+
+XOR_R(ixh, XH, 4)
+XOR_R(ixl, XL, 5)
+
+OR_R(ixh, XH, 4)
+OR_R(ixl, XL, 5)
+
+CP_R(ixh, XH, 4)
+CP_R(ixl, XL, 5)
+
+ARIID(add_a, ADD, 0, ix, IX)
+ARIID(adc_a, ADC, 1, ix, IX)
+ARIID(sub, SUB, 2, ix, IX)
+ARIID(sbc_a, SBC, 3, ix, IX)
+ARIID(and, AND, 4, ix, IX)
+ARIID(xor, XOR, 5, ix, IX)
+ARIID(or, OR, 6, ix, IX)
+ARIID(cp, CP, 7, ix, IX)
+
+/* IY */
+
+ADD_A_R(iyh, YH, 4)
+ADD_A_R(iyl, YL, 5)
+
+ADC_A_R(iyh, YH, 4)
+ADC_A_R(iyl, YL, 5)
+
+SUB_R(iyh, YH, 4)
+SUB_R(iyl, YL, 5)
+
+SBC_A_R(iyh, YH, 4)
+SBC_A_R(iyl, YL, 5)
+
+AND_R(iyh, YH, 4)
+AND_R(iyl, YL, 5)
+
+XOR_R(iyh, YH, 4)
+XOR_R(iyl, YL, 5)
+
+OR_R(iyh, YH, 4)
+OR_R(iyl, YL, 5)
+
+CP_R(iyh, YH, 4)
+CP_R(iyl, YL, 5)
+
+ARIID(add_a, ADD, 0, iy, IY)
+ARIID(adc_a, ADC, 1, iy, IY)
+ARIID(sub, SUB, 2, iy, IY)
+ARIID(sbc_a, SBC, 3, iy, IY)
+ARIID(and, AND, 4, iy, IY)
+ARIID(xor, XOR, 5, iy, IY)
+ARIID(or, OR, 6, iy, IY)
+ARIID(cp, CP, 7, iy, IY)
diff --git a/apps/plugins/zxbox/z80_op4.c b/apps/plugins/zxbox/z80_op4.c
new file mode 100644
index 0000000000..99dba97b6b
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op4.c
@@ -0,0 +1,305 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef NO_OPDEF
+#include "z80_def.h"
+#include "z80_op4.h"
+#include "z80_ari.h"
+#endif
+
+#define RET_CC(ccn, cc, n) \
+OPDEF(ret_ ## ccn, 0xC0+n*8) \
+{ \
+ if(!(cc)) { \
+ ENTIME(5); \
+ } \
+ else { \
+ POP(PC); \
+ ENTIME(11); \
+ } \
+}
+
+RET_CC(nz, !TESTZF, 0)
+RET_CC(z, TESTZF, 1)
+RET_CC(nc, !TESTCF, 2)
+RET_CC(c, TESTCF, 3)
+RET_CC(po, !TESTPF, 4)
+RET_CC(pe, TESTPF, 5)
+RET_CC(p, !TESTSF, 6)
+RET_CC(m, TESTSF, 7)
+
+#define POP_RR(rrn, rr, n) \
+OPDEF(pop_ ## rrn, 0xC1+n*0x10) \
+{ \
+ POP(rr); \
+ ENTIME(10); \
+}
+
+POP_RR(bc, BC, 0)
+POP_RR(de, DE, 1)
+POP_RR(hl, HL, 2)
+POP_RR(af, AF, 3)
+
+OPDEF(ret, 0xC9)
+{
+ POP(PC);
+ ENTIME(10);
+}
+
+OPDEF(exx, 0xD9)
+{
+ register dbyte dtmp;
+
+ dtmp = BCBK, BCBK = BC, BC = dtmp;
+ dtmp = DEBK, DEBK = DE, DE = dtmp;
+ dtmp = HLBK, HLBK = HL, HL = dtmp;
+
+ ENTIME(4);
+}
+
+#define JP_RR(rrn, rr) \
+OPDEF(jp_ ## rrn, 0xE9) \
+{ \
+ PC = rr; \
+ ENTIME(4); \
+}
+
+JP_RR(hl, HL)
+
+#define LD_SP_RR(rrn, rr) \
+OPDEF(ld_sp_ ## rrn, 0xF9) \
+{ \
+ SP = rr; \
+ ENTIME(6); \
+}
+
+LD_SP_RR(hl, HL)
+
+#define JP_CC(ccn, cc, n) \
+OPDEF(jp_ ## ccn ## _nn, 0xC2+n*8) \
+{ \
+ if(!(cc)) { \
+ PC+=2; \
+ ENTIME(10); \
+ } \
+ else { \
+ PC = DREAD(PC); \
+ ENTIME(10); \
+ } \
+}
+
+JP_CC(nz, !TESTZF, 0)
+JP_CC(z, TESTZF, 1)
+JP_CC(nc, !TESTCF, 2)
+JP_CC(c, TESTCF, 3)
+JP_CC(po, !TESTPF, 4)
+JP_CC(pe, TESTPF, 5)
+JP_CC(p, !TESTSF, 6)
+JP_CC(m, TESTSF, 7)
+
+OPDEF(jp_nn, 0xC3)
+{
+ PC = DREAD(PC);
+ ENTIME(10);
+}
+
+
+OPDEF(out_in_a, 0xD3)
+{
+ OUT(RA, *PCP, RA);
+ PC++;
+ ENTIME(11);
+}
+
+OPDEF(in_a_in, 0xDB)
+{
+ IN(RA, *PCP, RA);
+ PC++;
+ ENTIME(11);
+}
+
+#define EX_ISP_RR(rrn, rr) \
+OPDEF(ex_isp_ ## rrn, 0xE3) \
+{ \
+ register dbyte dtmp; \
+ dtmp = DREAD(SP); \
+ DWRITE(SP, rr); \
+ rr = dtmp; \
+ ENTIME(19); \
+}
+
+EX_ISP_RR(hl, HL)
+
+OPDEF(ex_de_hl, 0xEB)
+{
+ register dbyte dtmp;
+ dtmp = DE;
+ DE = HL;
+ HL = dtmp;
+ ENTIME(4);
+}
+
+OPDEF(di, 0xF3)
+{
+ DANM(iff1) = 0;
+ DANM(iff2) = 0;
+ DI_CHECK
+ ENTIME(4);
+}
+
+OPDEF(ei, 0xFB)
+{
+ DANM(iff1) = 1;
+ DANM(iff2) = 1;
+ ENTIME(4);
+}
+
+
+
+#define CALL_CC(ccn, cc, n) \
+OPDEF(call_ ## ccn ## _nn, 0xC4+n*8) \
+{ \
+ if(!(cc)) { \
+ PC+=2; \
+ ENTIME(10); \
+ } \
+ else { \
+ register dbyte dtmp; \
+ dtmp = PC; \
+ PC = DREAD(dtmp); \
+ dtmp += 2; \
+ PUSH(dtmp); \
+ ENTIME(17); \
+ } \
+}
+
+CALL_CC(nz, !TESTZF, 0)
+CALL_CC(z, TESTZF, 1)
+CALL_CC(nc, !TESTCF, 2)
+CALL_CC(c, TESTCF, 3)
+CALL_CC(po, !TESTPF, 4)
+CALL_CC(pe, TESTPF, 5)
+CALL_CC(p, !TESTSF, 6)
+CALL_CC(m, TESTSF, 7)
+
+
+
+#define PUSH_RR(rrn, rr, n) \
+OPDEF(push_ ## rrn, 0xC5+n*0x10) \
+{ \
+ PUSH(rr); \
+ ENTIME(11); \
+}
+
+PUSH_RR(bc, BC, 0)
+PUSH_RR(de, DE, 1)
+PUSH_RR(hl, HL, 2)
+PUSH_RR(af, AF, 3)
+
+
+OPDEF(call_nn, 0xCD)
+{
+ register dbyte dtmp;
+ dtmp = PC;
+ PC = DREAD(dtmp);
+ dtmp += 2;
+ PUSH(dtmp);
+ ENTIME(17);
+}
+
+
+OPDEF(add_a_n, 0xC6)
+{
+ ADD(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+
+OPDEF(adc_a_n, 0xCE)
+{
+ ADC(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+OPDEF(sub_n, 0xD6)
+{
+ SUB(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+
+OPDEF(sbc_a_n, 0xDE)
+{
+ SBC(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+OPDEF(and_n, 0xE6)
+{
+ AND(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+
+OPDEF(xor_n, 0xEE)
+{
+ XOR(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+OPDEF(or_n, 0xF6)
+{
+ OR(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+
+OPDEF(cp_n, 0xFE)
+{
+ CP(*PCP);
+ PC++;
+ ENTIME(7);
+}
+
+#define RST_NN(nnn, n) \
+OPDEF(rst_ ## nnn, 0xC7+n*8) \
+{ \
+ PUSH(PC); \
+ PC = n*8; \
+ ENTIME(11); \
+}
+
+RST_NN(00, 0)
+RST_NN(08, 1)
+RST_NN(10, 2)
+RST_NN(18, 3)
+RST_NN(20, 4)
+RST_NN(28, 5)
+RST_NN(30, 6)
+RST_NN(38, 7)
+
+#include "z80_op4x.c"
diff --git a/apps/plugins/zxbox/z80_op4.h b/apps/plugins/zxbox/z80_op4.h
new file mode 100644
index 0000000000..4e2cf8b073
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op4.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+extern z80t z80op_ret_nz(z80t);
+extern z80t z80op_pop_bc(z80t);
+extern z80t z80op_jp_nz_nn(z80t);
+extern z80t z80op_jp_nn(z80t);
+extern z80t z80op_call_nz_nn(z80t);
+extern z80t z80op_push_bc(z80t);
+extern z80t z80op_add_a_n(z80t);
+extern z80t z80op_rst_00(z80t);
+extern z80t z80op_ret_z(z80t);
+extern z80t z80op_ret(z80t);
+extern z80t z80op_jp_z_nn(z80t);
+extern z80t z80op_special_cb(z80t);
+extern z80t z80op_call_z_nn(z80t);
+extern z80t z80op_call_nn(z80t);
+extern z80t z80op_adc_a_n(z80t);
+extern z80t z80op_rst_08(z80t);
+
+extern z80t z80op_ret_nc(z80t);
+extern z80t z80op_pop_de(z80t);
+extern z80t z80op_jp_nc_nn(z80t);
+extern z80t z80op_out_in_a(z80t);
+extern z80t z80op_call_nc_nn(z80t);
+extern z80t z80op_push_de(z80t);
+extern z80t z80op_sub_n(z80t);
+extern z80t z80op_rst_10(z80t);
+extern z80t z80op_ret_c(z80t);
+extern z80t z80op_exx(z80t);
+extern z80t z80op_jp_c_nn(z80t);
+extern z80t z80op_in_a_in(z80t);
+extern z80t z80op_call_c_nn(z80t);
+extern z80t z80op_special_dd(z80t);
+extern z80t z80op_sbc_a_n(z80t);
+extern z80t z80op_rst_18(z80t);
+
+extern z80t z80op_ret_po(z80t);
+extern z80t z80op_pop_hl(z80t);
+extern z80t z80op_jp_po_nn(z80t);
+extern z80t z80op_ex_isp_hl(z80t);
+extern z80t z80op_call_po_nn(z80t);
+extern z80t z80op_push_hl(z80t);
+extern z80t z80op_and_n(z80t);
+extern z80t z80op_rst_20(z80t);
+extern z80t z80op_ret_pe(z80t);
+extern z80t z80op_jp_hl(z80t);
+extern z80t z80op_jp_pe_nn(z80t);
+extern z80t z80op_ex_de_hl(z80t);
+extern z80t z80op_call_pe_nn(z80t);
+extern z80t z80op_special_ed(z80t);
+extern z80t z80op_xor_n(z80t);
+extern z80t z80op_rst_28(z80t);
+
+extern z80t z80op_ret_p(z80t);
+extern z80t z80op_pop_af(z80t);
+extern z80t z80op_jp_p_nn(z80t);
+extern z80t z80op_di(z80t);
+extern z80t z80op_call_p_nn(z80t);
+extern z80t z80op_push_af(z80t);
+extern z80t z80op_or_n(z80t);
+extern z80t z80op_rst_30(z80t);
+extern z80t z80op_ret_m(z80t);
+extern z80t z80op_ld_sp_hl(z80t);
+extern z80t z80op_jp_m_nn(z80t);
+extern z80t z80op_ei(z80t);
+extern z80t z80op_call_m_nn(z80t);
+extern z80t z80op_special_fd(z80t);
+extern z80t z80op_cp_n(z80t);
+extern z80t z80op_rst_38(z80t);
+
+/* IX */
+
+extern z80t z80op_pop_ix(z80t);
+extern z80t z80op_push_ix(z80t);
+
+extern z80t z80op_jp_ix(z80t);
+extern z80t z80op_ld_sp_ix(z80t);
+extern z80t z80op_ex_isp_ix(z80t);
+
+/* IY */
+
+extern z80t z80op_pop_iy(z80t);
+extern z80t z80op_push_iy(z80t);
+
+extern z80t z80op_jp_iy(z80t);
+extern z80t z80op_ld_sp_iy(z80t);
+extern z80t z80op_ex_isp_iy(z80t);
diff --git a/apps/plugins/zxbox/z80_op4x.c b/apps/plugins/zxbox/z80_op4x.c
new file mode 100644
index 0000000000..2d966163b4
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op4x.c
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/* IX */
+
+POP_RR(ix, IX, 2)
+PUSH_RR(ix, IX, 2)
+
+JP_RR(ix, IX)
+LD_SP_RR(ix, IX)
+EX_ISP_RR(ix, IX)
+
+
+/* IY */
+
+POP_RR(iy, IY, 2)
+PUSH_RR(iy, IY, 2)
+
+JP_RR(iy, IY)
+LD_SP_RR(iy, IY)
+EX_ISP_RR(iy, IY)
diff --git a/apps/plugins/zxbox/z80_op5.c b/apps/plugins/zxbox/z80_op5.c
new file mode 100644
index 0000000000..3edea79e3d
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op5.c
@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef NO_OPDEF
+#include "z80_def.h"
+#include "z80_op5.h"
+#endif
+
+OPDEF(ill_ed, 0x00)
+{
+#ifdef DEBUG_Z80
+ printf("ILL_ED: %04X - %02X\n", (dbyte) (PC-1), DANM(mem)[(dbyte) (PC-1)]);
+#endif
+
+ ENTIME(8);
+}
+
+#define IN_R_IC(rn, r, n) \
+OPDEF(in_ ## rn ## _ic, 0x40+8*n) \
+{ \
+ register byte res, flag; \
+ IN(RB, RC, res); \
+ r = res; \
+ flag = (RF & ~(ABUTCF)) | \
+ TAB(orf_tbl)[res]; \
+ RF = flag; \
+ ENTIME(12); \
+}
+
+IN_R_IC(b, RB, 0)
+IN_R_IC(c, RC, 1)
+IN_R_IC(d, RD, 2)
+IN_R_IC(e, RE, 3)
+IN_R_IC(h, RH, 4)
+IN_R_IC(l, RL, 5)
+IN_R_IC(f, res, 6)
+IN_R_IC(a, RA, 7)
+
+
+#define OUT_IC_R(rn, r, n) \
+OPDEF(out_ic_ ## rn, 0x41+8*n) \
+{ \
+ OUT(RB, RC, r); \
+ ENTIME(12); \
+}
+
+OUT_IC_R(b, RB, 0)
+OUT_IC_R(c, RC, 1)
+OUT_IC_R(d, RD, 2)
+OUT_IC_R(e, RE, 3)
+OUT_IC_R(h, RH, 4)
+OUT_IC_R(l, RL, 5)
+OUT_IC_R(0, 0, 6)
+OUT_IC_R(a, RA, 7)
+
+
+
+#define SBC_HL_RR(rrn, rr, n) \
+OPDEF(sbc_hl_ ## rrn, 0x42+0x10*n) \
+{ \
+ register dbyte res; \
+ register int idx, flag; \
+ flag = RF; \
+ res = HL - rr - (flag & CF); \
+ idx = DIDXCALC(HL, rr, res); \
+ HL = res; \
+ flag = (RF & ~(ALLF)) | \
+ (TAB(subf_tbl)[idx] & ALLF); \
+ if(!res) flag |= ZF; \
+ RF = flag; \
+ ENTIME(15); \
+}
+
+SBC_HL_RR(bc, BC, 0)
+SBC_HL_RR(de, DE, 1)
+SBC_HL_RR(hl, HL, 2)
+SBC_HL_RR(sp, SP, 3)
+
+#define ADC_HL_RR(rrn, rr, n) \
+OPDEF(adc_hl_ ## rrn, 0x4A+0x10*n) \
+{ \
+ register dbyte res; \
+ register int idx, flag; \
+ flag = RF; \
+ res = HL + rr + (flag & CF); \
+ idx = DIDXCALC(HL, rr, res); \
+ HL = res; \
+ flag = (RF & ~(ALLF)) | \
+ (TAB(addf_tbl)[idx] & ALLF); \
+ if(!res) flag |= ZF; \
+ RF = flag; \
+ ENTIME(15); \
+}
+
+ADC_HL_RR(bc, BC, 0)
+ADC_HL_RR(de, DE, 1)
+ADC_HL_RR(hl, HL, 2)
+ADC_HL_RR(sp, SP, 3)
+
+
+
+#define LD_INN_RR(rrn, pf, rr, n) \
+OPDEF(ld_inn_ ## rrn ## pf, 0x43+0x10*n) \
+{ \
+ register dbyte dtmp; \
+ FETCHD(dtmp); \
+ DWRITE(dtmp, rr); \
+ ENTIME(20); \
+}
+
+
+LD_INN_RR(bc, , BC, 0)
+LD_INN_RR(de, , DE, 1)
+LD_INN_RR(hl, _ed, HL, 2)
+LD_INN_RR(sp, , SP, 3)
+
+
+#define LD_RR_INN(rrn, pf, rr, n) \
+OPDEF(ld_## rrn ## _inn ## pf, 0x4B+0x10*n) \
+{ \
+ register dbyte dtmp; \
+ FETCHD(dtmp); \
+ rr = DREAD(dtmp); \
+ ENTIME(20); \
+}
+
+
+LD_RR_INN(bc, , BC, 0)
+LD_RR_INN(de, , DE, 1)
+LD_RR_INN(hl, _ed, HL, 2)
+LD_RR_INN(sp, , SP, 3)
+
+OPDEF(neg, 0x44 0x4C 0x54 0x5C 0x64 0x6C 0x74 0x7C)
+{
+ register byte res;
+ register int idx;
+ register int flag;
+
+ res = 0 - RA;
+ idx = IDXCALC(0, RA, res);
+ RA = res;
+ flag = (RF & ~(AALLF)) | TAB(subf_tbl)[idx];
+ if(!res) flag |= ZF;
+ RF = flag;
+ ENTIME(8);
+}
+
+OPDEF(retn, 0x45 0x55 0x5D 0x65 0x6D 0x75 0x7D)
+{
+ DANM(iff1) = DANM(iff2);
+ POP(PC);
+ ENTIME(14);
+}
+
+
+OPDEF(reti, 0x4D)
+{
+ POP(PC);
+ ENTIME(14);
+}
+
+OPDEF(im_0, 0x46 0x4E 0x56 0x5E)
+{
+ DANM(it_mode) = 0;
+ ENTIME(8);
+}
+
+
+OPDEF(im_1, 0x56 0x76)
+{
+ DANM(it_mode) = 1;
+ ENTIME(8);
+}
+
+
+OPDEF(im_2, 0x5E 0x7E)
+{
+ DANM(it_mode) = 2;
+ ENTIME(8);
+}
+
+OPDEF(ld_i_a, 0x47)
+{
+ RI = RA;
+ ENTIME(9);
+}
+
+OPDEF(ld_r_a, 0x4F)
+{
+ DANM(rl7) = RA & 0x80;
+ RR = RA;
+ ENTIME(9);
+}
+
+OPDEF(ld_a_i, 0x57)
+{
+ register int flag;
+
+ RA = RI;
+ flag = (RF & ~(BUTCF)) | (RA & SF);
+ if(!RA) flag |= ZF;
+ if(DANM(iff2)) flag |= PVF;
+ RF = flag;
+
+ ENTIME(9);
+}
+
+OPDEF(ld_a_r, 0x5F)
+{
+ register int flag;
+
+ RA = (RR & 0x7F) | DANM(rl7);
+ flag = (RF & ~(BUTCF)) | (RA & SF);
+ if(!RA) flag |= ZF;
+ if(DANM(iff2)) flag |= PVF;
+ RF = flag;
+
+ ENTIME(9);
+}
+
+OPDEF(rrd, 0x67)
+{
+ register dbyte dtmp;
+
+ dtmp = *HLP | (RA << 8);
+ RA = (RA & 0xF0) | (dtmp & 0x0F);
+ SETFLAGS(ABUTCF, TAB(orf_tbl)[RA]);
+ dtmp >>= 4;
+ PUTMEM(HL, HLP, (byte) dtmp);
+
+ ENTIME(18);
+}
+
+OPDEF(rld, 0x6F)
+{
+ register dbyte dtmp;
+
+ dtmp = (*HLP << 4) | (RA & 0x0F);
+ RA = (RA & 0xF0) | ((dtmp >> 8) & 0x0F);
+ SETFLAGS(ABUTCF, TAB(orf_tbl)[RA]);
+ PUTMEM(HL, HLP, (byte) dtmp);
+
+ ENTIME(18);
+}
+
+#define NOREPEAT() \
+ if(BC) RF |= PVF; \
+ ENTIME(16)
+
+#define LDREPEAT() \
+ if(BC) { \
+ RF |= PVF; \
+ PC-=2; \
+ ENTIME(21); \
+ } \
+ else { \
+ ENTIME(16); \
+ }
+
+
+#define LDID(dir) \
+ register byte res; \
+ res = *HLP; \
+ PUTMEM(DE, DEP, res); \
+ DE dir, HL dir; \
+ RF = RF & ~(HF | PVF | NF); \
+ BC--
+
+OPDEF(ldi, 0xA0)
+{
+ LDID(++);
+ NOREPEAT();
+}
+
+OPDEF(ldd, 0xA8)
+{
+ LDID(--);
+ NOREPEAT();
+}
+
+OPDEF(ldir, 0xB0)
+{
+ LDID(++);
+ LDREPEAT();
+}
+
+
+OPDEF(lddr, 0xB8)
+{
+ LDID(--);
+ LDREPEAT();
+}
+
+#define CPREPEAT() \
+ if(res && BC) { \
+ RF |= PVF; \
+ PC-=2; \
+ ENTIME(21); \
+ } \
+ else { \
+ ENTIME(16); \
+ }
+
+#define CPID(dir) \
+ register byte res; \
+ register int idx; \
+ res = RA - *HLP; \
+ idx = IDXCALC(RA, *HLP, res); \
+ RF = (RF & ~BUTCF) | \
+ (TAB(subf_tbl)[idx] & \
+ (SF | HF | NF | B3F | B5F)); \
+ if(!res) RF |= ZF; \
+ HL dir; \
+ BC--
+
+
+OPDEF(cpi, 0xA1)
+{
+ CPID(++);
+ NOREPEAT();
+}
+
+
+OPDEF(cpd, 0xA9)
+{
+ CPID(--);
+ NOREPEAT();
+}
+
+
+OPDEF(cpir, 0xB1)
+{
+ CPID(++);
+ CPREPEAT();
+}
+
+OPDEF(cpdr, 0xB9)
+{
+ CPID(--);
+ CPREPEAT();
+}
+
+#define IOREPEAT() \
+ if(RB) { \
+ PC-=2; \
+ ENTIME(21); \
+ } \
+ else { \
+ ENTIME(16); \
+ }
+
+
+#define INID(dir) \
+ register byte res; \
+ register int idx; \
+ res = RB - 1; \
+ idx = IDXCALC(RB, 1, res); \
+ RF = (RF & ~BUTCF) | \
+ (TAB(subf_tbl)[idx] & \
+ (SF | HF | PVF | NF | B3F | B5F)); \
+ if(!res) RF |= ZF; \
+ RB = res; \
+ IN(RB, RC, res); \
+ PUTMEM(HL, HLP, res); \
+ HL dir
+
+
+OPDEF(ini, 0xA2)
+{
+ INID(++);
+ ENTIME(16);
+}
+
+OPDEF(ind, 0xAA)
+{
+ INID(--);
+ ENTIME(16);
+}
+
+OPDEF(inir, 0xB2)
+{
+ INID(++);
+ IOREPEAT();
+}
+
+OPDEF(indr, 0xBA)
+{
+ INID(--);
+ IOREPEAT();
+}
+
+
+
+#define OUTID(dir) \
+ register byte res; \
+ register int idx; \
+ res = RB - 1; \
+ idx = IDXCALC(RB, 1, res); \
+ RF = (RF & ~BUTCF) | \
+ (TAB(subf_tbl)[idx] & \
+ (SF | HF | PVF | NF )); \
+ if(!res) RF |= ZF; \
+ RB = res; \
+ OUT(RB, RC, *HLP); \
+ HL dir
+
+
+
+OPDEF(outi, 0xA3)
+{
+ OUTID(++);
+ ENTIME(16);
+}
+
+OPDEF(outd, 0xAB)
+{
+ OUTID(--);
+ ENTIME(16);
+}
+
+
+OPDEF(otir, 0xB3)
+{
+ OUTID(++);
+ IOREPEAT();
+}
+
+OPDEF(otdr, 0xBB)
+{
+ OUTID(--);
+ IOREPEAT();
+}
diff --git a/apps/plugins/zxbox/z80_op5.h b/apps/plugins/zxbox/z80_op5.h
new file mode 100644
index 0000000000..251954cf69
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op5.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+extern z80t z80op_ill_ed(z80t);
+
+extern z80t z80op_in_b_ic(z80t);
+extern z80t z80op_out_ic_b(z80t);
+extern z80t z80op_sbc_hl_bc(z80t);
+extern z80t z80op_ld_inn_bc(z80t);
+extern z80t z80op_neg(z80t);
+extern z80t z80op_retn(z80t);
+extern z80t z80op_im_0(z80t);
+extern z80t z80op_ld_i_a(z80t);
+extern z80t z80op_in_c_ic(z80t);
+extern z80t z80op_out_ic_c(z80t);
+extern z80t z80op_adc_hl_bc(z80t);
+extern z80t z80op_ld_bc_inn(z80t);
+/* extern z80t z80op_neg(z80t); */
+extern z80t z80op_reti(z80t);
+/*extern z80t z80op_im_0(z80t); */
+extern z80t z80op_ld_r_a(z80t);
+
+extern z80t z80op_in_d_ic(z80t);
+extern z80t z80op_out_ic_d(z80t);
+extern z80t z80op_sbc_hl_de(z80t);
+extern z80t z80op_ld_inn_de(z80t);
+/* extern z80t z80op_neg(z80t); */
+/* extern z80t z80op_retn(z80t); */
+extern z80t z80op_im_1(z80t);
+extern z80t z80op_ld_a_i(z80t);
+extern z80t z80op_in_e_ic(z80t);
+extern z80t z80op_out_ic_e(z80t);
+extern z80t z80op_adc_hl_de(z80t);
+extern z80t z80op_ld_de_inn(z80t);
+/* extern z80t z80op_neg(z80t); */
+/* extern z80t z80op_retn(z80t); */
+extern z80t z80op_im_2(z80t);
+extern z80t z80op_ld_a_r(z80t);
+
+extern z80t z80op_in_h_ic(z80t);
+extern z80t z80op_out_ic_h(z80t);
+extern z80t z80op_sbc_hl_hl(z80t);
+extern z80t z80op_ld_inn_hl_ed(z80t);
+/* extern z80t z80op_neg(z80t); */
+/* extern z80t z80op_retn(z80t); */
+/* extern z80t z80op_im_0(z80t); */
+extern z80t z80op_rrd(z80t);
+extern z80t z80op_in_l_ic(z80t);
+extern z80t z80op_out_ic_l(z80t);
+extern z80t z80op_adc_hl_hl(z80t);
+extern z80t z80op_ld_hl_inn_ed(z80t);
+/* extern z80t z80op_neg(z80t); */
+/* extern z80t z80op_retn(z80t); */
+/* extern z80t z80op_im_0(z80t); */
+extern z80t z80op_rld(z80t);
+
+extern z80t z80op_in_f_ic(z80t);
+extern z80t z80op_out_ic_0(z80t);
+extern z80t z80op_sbc_hl_sp(z80t);
+extern z80t z80op_ld_inn_sp(z80t);
+/* extern z80t z80op_neg(z80t); */
+/* extern z80t z80op_retn(z80t); */
+/* extern z80t z80op_im_1(z80t); */
+/* extern z80t z80op_ill_ed(z80t); */
+extern z80t z80op_in_a_ic(z80t);
+extern z80t z80op_out_ic_a(z80t);
+extern z80t z80op_adc_hl_sp(z80t);
+extern z80t z80op_ld_sp_inn(z80t);
+/* extern z80t z80op_neg(z80t); */
+/* extern z80t z80op_retn(z80t); */
+/* extern z80t z80op_im_2(z80t); */
+/* extern z80t z80op_ill_ed(z80t); */
+
+extern z80t z80op_ldi(z80t);
+extern z80t z80op_cpi(z80t);
+extern z80t z80op_ini(z80t);
+extern z80t z80op_outi(z80t);
+
+extern z80t z80op_ldd(z80t);
+extern z80t z80op_cpd(z80t);
+extern z80t z80op_ind(z80t);
+extern z80t z80op_outd(z80t);
+
+extern z80t z80op_ldir(z80t);
+extern z80t z80op_cpir(z80t);
+extern z80t z80op_inir(z80t);
+extern z80t z80op_otir(z80t);
+
+extern z80t z80op_lddr(z80t);
+extern z80t z80op_cpdr(z80t);
+extern z80t z80op_indr(z80t);
+extern z80t z80op_otdr(z80t);
diff --git a/apps/plugins/zxbox/z80_op6.c b/apps/plugins/zxbox/z80_op6.c
new file mode 100644
index 0000000000..7bab122263
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op6.c
@@ -0,0 +1,437 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef NO_OPDEF
+#include "z80_def.h"
+#include "z80_op6.h"
+#endif
+
+#define GHL DANM(cbaddr)
+
+#define B7(r) (((r) & 0x80) >> 7)
+#define B0(r) ((r) & 0x01)
+
+#define SHIFTROTL(r, mod) \
+{ \
+ register int carry; \
+ carry = B7(r); \
+ r = mod; \
+ RF = (RF & ~(AALLF)) | carry | \
+ TAB(orf_tbl)[(byte) r]; \
+}
+
+
+#define SHIFTROTR(r, mod) \
+{ \
+ register int carry; \
+ carry = B0(r); \
+ r = mod; \
+ RF = (RF & ~(AALLF)) | carry | \
+ TAB(orf_tbl)[(byte) r]; \
+}
+
+
+#define RLC(r) SHIFTROTL(r, (r << 1) | carry)
+#define RRC(r) SHIFTROTR(r, (r >> 1) | (carry << 7))
+#define RLN(r) SHIFTROTL(r, (r << 1) | (RF & CF))
+#define RRN(r) SHIFTROTR(r, (r >> 1) | ((RF & CF) << 7))
+#define SLA(r) SHIFTROTL(r, r << 1)
+#define SRA(r) SHIFTROTR(r, (byte) ((sbyte) r >> 1))
+#define SLL(r) SHIFTROTL(r, (r << 1) | 0x01)
+#define SRL(r) SHIFTROTR(r, r >> 1)
+
+
+#define SHRR(shrn, func, an, rn, r, n) \
+OPDEF(shrn ## _ ## rn, 0x00+an*8+n) \
+{ \
+ func(r); \
+ ENTIME(8); \
+}
+
+#define SHRIHL(shrn, func, an) \
+OPDEF(shrn ## _ihl, 0x06+an*8) \
+{ \
+ register byte btmp; \
+ btmp = READ(GHL); \
+ func(btmp); \
+ WRITE(GHL, btmp); \
+ ENTIME(15); \
+}
+
+#define RLC_R(rn, r, n) SHRR(rlc, RLC, 0, rn, r, n)
+#define RRC_R(rn, r, n) SHRR(rrc, RRC, 1, rn, r, n)
+#define RL_R(rn, r, n) SHRR(rl, RLN, 2, rn, r, n)
+#define RR_R(rn, r, n) SHRR(rr, RRN, 3, rn, r, n)
+#define SLA_R(rn, r, n) SHRR(sla, SLA, 4, rn, r, n)
+#define SRA_R(rn, r, n) SHRR(sra, SRA, 5, rn, r, n)
+#define SLL_R(rn, r, n) SHRR(sll, SLL, 6, rn, r, n)
+#define SRL_R(rn, r, n) SHRR(srl, SRL, 7, rn, r, n)
+
+RLC_R(b, RB, 0)
+RLC_R(c, RC, 1)
+RLC_R(d, RD, 2)
+RLC_R(e, RE, 3)
+RLC_R(h, RH, 4)
+RLC_R(l, RL, 5)
+RLC_R(a, RA, 7)
+
+RRC_R(b, RB, 0)
+RRC_R(c, RC, 1)
+RRC_R(d, RD, 2)
+RRC_R(e, RE, 3)
+RRC_R(h, RH, 4)
+RRC_R(l, RL, 5)
+RRC_R(a, RA, 7)
+
+RL_R(b, RB, 0)
+RL_R(c, RC, 1)
+RL_R(d, RD, 2)
+RL_R(e, RE, 3)
+RL_R(h, RH, 4)
+RL_R(l, RL, 5)
+RL_R(a, RA, 7)
+
+RR_R(b, RB, 0)
+RR_R(c, RC, 1)
+RR_R(d, RD, 2)
+RR_R(e, RE, 3)
+RR_R(h, RH, 4)
+RR_R(l, RL, 5)
+RR_R(a, RA, 7)
+
+SLA_R(b, RB, 0)
+SLA_R(c, RC, 1)
+SLA_R(d, RD, 2)
+SLA_R(e, RE, 3)
+SLA_R(h, RH, 4)
+SLA_R(l, RL, 5)
+SLA_R(a, RA, 7)
+
+SRA_R(b, RB, 0)
+SRA_R(c, RC, 1)
+SRA_R(d, RD, 2)
+SRA_R(e, RE, 3)
+SRA_R(h, RH, 4)
+SRA_R(l, RL, 5)
+SRA_R(a, RA, 7)
+
+SLL_R(b, RB, 0)
+SLL_R(c, RC, 1)
+SLL_R(d, RD, 2)
+SLL_R(e, RE, 3)
+SLL_R(h, RH, 4)
+SLL_R(l, RL, 5)
+SLL_R(a, RA, 7)
+
+SRL_R(b, RB, 0)
+SRL_R(c, RC, 1)
+SRL_R(d, RD, 2)
+SRL_R(e, RE, 3)
+SRL_R(h, RH, 4)
+SRL_R(l, RL, 5)
+SRL_R(a, RA, 7)
+
+SHRIHL(rlc, RLC, 0)
+SHRIHL(rrc, RRC, 1)
+SHRIHL(rl, RLN, 2)
+SHRIHL(rr, RRN, 3)
+SHRIHL(sla, SLA, 4)
+SHRIHL(sra, SRA, 5)
+SHRIHL(sll, SLL, 6)
+SHRIHL(srl, SRL, 7)
+
+#define BIT(r, n) \
+ RF = (RF & ~(SF | ZF | NF)) | (r & SF) | (((~r >> n) & 0x01) << 6)
+
+#define BIT_N_R(bn, rn, r, n) \
+OPDEF(bit_ ## bn ## _ ## rn, 0x40+bn*8+n) \
+{ \
+ BIT(r, bn); \
+ ENTIME(8); \
+}
+
+#define BIT_N_IHL(bn) \
+OPDEF(bit_ ## bn ## _ihl, 0x46+bn*8) \
+{ \
+ register byte btmp; \
+ btmp = READ(GHL); \
+ BIT(btmp, bn); \
+ ENTIME(12); \
+}
+
+BIT_N_R(0, b, RB, 0)
+BIT_N_R(0, c, RC, 1)
+BIT_N_R(0, d, RD, 2)
+BIT_N_R(0, e, RE, 3)
+BIT_N_R(0, h, RH, 4)
+BIT_N_R(0, l, RL, 5)
+BIT_N_R(0, a, RA, 7)
+
+BIT_N_R(1, b, RB, 0)
+BIT_N_R(1, c, RC, 1)
+BIT_N_R(1, d, RD, 2)
+BIT_N_R(1, e, RE, 3)
+BIT_N_R(1, h, RH, 4)
+BIT_N_R(1, l, RL, 5)
+BIT_N_R(1, a, RA, 7)
+
+BIT_N_R(2, b, RB, 0)
+BIT_N_R(2, c, RC, 1)
+BIT_N_R(2, d, RD, 2)
+BIT_N_R(2, e, RE, 3)
+BIT_N_R(2, h, RH, 4)
+BIT_N_R(2, l, RL, 5)
+BIT_N_R(2, a, RA, 7)
+
+BIT_N_R(3, b, RB, 0)
+BIT_N_R(3, c, RC, 1)
+BIT_N_R(3, d, RD, 2)
+BIT_N_R(3, e, RE, 3)
+BIT_N_R(3, h, RH, 4)
+BIT_N_R(3, l, RL, 5)
+BIT_N_R(3, a, RA, 7)
+
+BIT_N_R(4, b, RB, 0)
+BIT_N_R(4, c, RC, 1)
+BIT_N_R(4, d, RD, 2)
+BIT_N_R(4, e, RE, 3)
+BIT_N_R(4, h, RH, 4)
+BIT_N_R(4, l, RL, 5)
+BIT_N_R(4, a, RA, 7)
+
+BIT_N_R(5, b, RB, 0)
+BIT_N_R(5, c, RC, 1)
+BIT_N_R(5, d, RD, 2)
+BIT_N_R(5, e, RE, 3)
+BIT_N_R(5, h, RH, 4)
+BIT_N_R(5, l, RL, 5)
+BIT_N_R(5, a, RA, 7)
+
+BIT_N_R(6, b, RB, 0)
+BIT_N_R(6, c, RC, 1)
+BIT_N_R(6, d, RD, 2)
+BIT_N_R(6, e, RE, 3)
+BIT_N_R(6, h, RH, 4)
+BIT_N_R(6, l, RL, 5)
+BIT_N_R(6, a, RA, 7)
+
+BIT_N_R(7, b, RB, 0)
+BIT_N_R(7, c, RC, 1)
+BIT_N_R(7, d, RD, 2)
+BIT_N_R(7, e, RE, 3)
+BIT_N_R(7, h, RH, 4)
+BIT_N_R(7, l, RL, 5)
+BIT_N_R(7, a, RA, 7)
+
+BIT_N_IHL(0)
+BIT_N_IHL(1)
+BIT_N_IHL(2)
+BIT_N_IHL(3)
+BIT_N_IHL(4)
+BIT_N_IHL(5)
+BIT_N_IHL(6)
+BIT_N_IHL(7)
+
+#define RES(r, n) r &= ~(1 << n)
+
+#define RES_N_R(bn, rn, r, n) \
+OPDEF(res_ ## bn ## _ ## rn, 0x80+bn*8+n) \
+{ \
+ RES(r, bn); \
+ ENTIME(8); \
+}
+
+#define RES_N_IHL(bn) \
+OPDEF(res_ ## bn ## _ihl, 0x86+bn*8) \
+{ \
+ register byte btmp; \
+ btmp = READ(GHL); \
+ RES(btmp, bn); \
+ WRITE(GHL, btmp); \
+ ENTIME(15); \
+}
+
+
+RES_N_R(0, b, RB, 0)
+RES_N_R(0, c, RC, 1)
+RES_N_R(0, d, RD, 2)
+RES_N_R(0, e, RE, 3)
+RES_N_R(0, h, RH, 4)
+RES_N_R(0, l, RL, 5)
+RES_N_R(0, a, RA, 7)
+
+RES_N_R(1, b, RB, 0)
+RES_N_R(1, c, RC, 1)
+RES_N_R(1, d, RD, 2)
+RES_N_R(1, e, RE, 3)
+RES_N_R(1, h, RH, 4)
+RES_N_R(1, l, RL, 5)
+RES_N_R(1, a, RA, 7)
+
+RES_N_R(2, b, RB, 0)
+RES_N_R(2, c, RC, 1)
+RES_N_R(2, d, RD, 2)
+RES_N_R(2, e, RE, 3)
+RES_N_R(2, h, RH, 4)
+RES_N_R(2, l, RL, 5)
+RES_N_R(2, a, RA, 7)
+
+RES_N_R(3, b, RB, 0)
+RES_N_R(3, c, RC, 1)
+RES_N_R(3, d, RD, 2)
+RES_N_R(3, e, RE, 3)
+RES_N_R(3, h, RH, 4)
+RES_N_R(3, l, RL, 5)
+RES_N_R(3, a, RA, 7)
+
+RES_N_R(4, b, RB, 0)
+RES_N_R(4, c, RC, 1)
+RES_N_R(4, d, RD, 2)
+RES_N_R(4, e, RE, 3)
+RES_N_R(4, h, RH, 4)
+RES_N_R(4, l, RL, 5)
+RES_N_R(4, a, RA, 7)
+
+RES_N_R(5, b, RB, 0)
+RES_N_R(5, c, RC, 1)
+RES_N_R(5, d, RD, 2)
+RES_N_R(5, e, RE, 3)
+RES_N_R(5, h, RH, 4)
+RES_N_R(5, l, RL, 5)
+RES_N_R(5, a, RA, 7)
+
+RES_N_R(6, b, RB, 0)
+RES_N_R(6, c, RC, 1)
+RES_N_R(6, d, RD, 2)
+RES_N_R(6, e, RE, 3)
+RES_N_R(6, h, RH, 4)
+RES_N_R(6, l, RL, 5)
+RES_N_R(6, a, RA, 7)
+
+RES_N_R(7, b, RB, 0)
+RES_N_R(7, c, RC, 1)
+RES_N_R(7, d, RD, 2)
+RES_N_R(7, e, RE, 3)
+RES_N_R(7, h, RH, 4)
+RES_N_R(7, l, RL, 5)
+RES_N_R(7, a, RA, 7)
+
+RES_N_IHL(0)
+RES_N_IHL(1)
+RES_N_IHL(2)
+RES_N_IHL(3)
+RES_N_IHL(4)
+RES_N_IHL(5)
+RES_N_IHL(6)
+RES_N_IHL(7)
+
+
+#define SET(r, n) r |= (1 << n)
+
+#define SET_N_R(bn, rn, r, n) \
+OPDEF(set_ ## bn ## _ ## rn, 0xC0+bn*8+n) \
+{ \
+ SET(r, bn); \
+ ENTIME(8); \
+}
+
+#define SET_N_IHL(bn) \
+OPDEF(set_ ## bn ## _ihl, 0x86+bn*8) \
+{ \
+ register byte btmp; \
+ btmp = READ(GHL); \
+ SET(btmp, bn); \
+ WRITE(GHL, btmp); \
+ ENTIME(15); \
+}
+
+
+SET_N_R(0, b, RB, 0)
+SET_N_R(0, c, RC, 1)
+SET_N_R(0, d, RD, 2)
+SET_N_R(0, e, RE, 3)
+SET_N_R(0, h, RH, 4)
+SET_N_R(0, l, RL, 5)
+SET_N_R(0, a, RA, 7)
+
+SET_N_R(1, b, RB, 0)
+SET_N_R(1, c, RC, 1)
+SET_N_R(1, d, RD, 2)
+SET_N_R(1, e, RE, 3)
+SET_N_R(1, h, RH, 4)
+SET_N_R(1, l, RL, 5)
+SET_N_R(1, a, RA, 7)
+
+SET_N_R(2, b, RB, 0)
+SET_N_R(2, c, RC, 1)
+SET_N_R(2, d, RD, 2)
+SET_N_R(2, e, RE, 3)
+SET_N_R(2, h, RH, 4)
+SET_N_R(2, l, RL, 5)
+SET_N_R(2, a, RA, 7)
+
+SET_N_R(3, b, RB, 0)
+SET_N_R(3, c, RC, 1)
+SET_N_R(3, d, RD, 2)
+SET_N_R(3, e, RE, 3)
+SET_N_R(3, h, RH, 4)
+SET_N_R(3, l, RL, 5)
+SET_N_R(3, a, RA, 7)
+
+SET_N_R(4, b, RB, 0)
+SET_N_R(4, c, RC, 1)
+SET_N_R(4, d, RD, 2)
+SET_N_R(4, e, RE, 3)
+SET_N_R(4, h, RH, 4)
+SET_N_R(4, l, RL, 5)
+SET_N_R(4, a, RA, 7)
+
+SET_N_R(5, b, RB, 0)
+SET_N_R(5, c, RC, 1)
+SET_N_R(5, d, RD, 2)
+SET_N_R(5, e, RE, 3)
+SET_N_R(5, h, RH, 4)
+SET_N_R(5, l, RL, 5)
+SET_N_R(5, a, RA, 7)
+
+SET_N_R(6, b, RB, 0)
+SET_N_R(6, c, RC, 1)
+SET_N_R(6, d, RD, 2)
+SET_N_R(6, e, RE, 3)
+SET_N_R(6, h, RH, 4)
+SET_N_R(6, l, RL, 5)
+SET_N_R(6, a, RA, 7)
+
+SET_N_R(7, b, RB, 0)
+SET_N_R(7, c, RC, 1)
+SET_N_R(7, d, RD, 2)
+SET_N_R(7, e, RE, 3)
+SET_N_R(7, h, RH, 4)
+SET_N_R(7, l, RL, 5)
+SET_N_R(7, a, RA, 7)
+
+SET_N_IHL(0)
+SET_N_IHL(1)
+SET_N_IHL(2)
+SET_N_IHL(3)
+SET_N_IHL(4)
+SET_N_IHL(5)
+SET_N_IHL(6)
+SET_N_IHL(7)
diff --git a/apps/plugins/zxbox/z80_op6.h b/apps/plugins/zxbox/z80_op6.h
new file mode 100644
index 0000000000..09eac4af43
--- /dev/null
+++ b/apps/plugins/zxbox/z80_op6.h
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+extern z80t z80op_rlc_b(z80t);
+extern z80t z80op_rlc_c(z80t);
+extern z80t z80op_rlc_d(z80t);
+extern z80t z80op_rlc_e(z80t);
+extern z80t z80op_rlc_h(z80t);
+extern z80t z80op_rlc_l(z80t);
+extern z80t z80op_rlc_ihl(z80t);
+extern z80t z80op_rlc_a(z80t);
+extern z80t z80op_rrc_b(z80t);
+extern z80t z80op_rrc_c(z80t);
+extern z80t z80op_rrc_d(z80t);
+extern z80t z80op_rrc_e(z80t);
+extern z80t z80op_rrc_h(z80t);
+extern z80t z80op_rrc_l(z80t);
+extern z80t z80op_rrc_ihl(z80t);
+extern z80t z80op_rrc_a(z80t);
+
+extern z80t z80op_rl_b(z80t);
+extern z80t z80op_rl_c(z80t);
+extern z80t z80op_rl_d(z80t);
+extern z80t z80op_rl_e(z80t);
+extern z80t z80op_rl_h(z80t);
+extern z80t z80op_rl_l(z80t);
+extern z80t z80op_rl_ihl(z80t);
+extern z80t z80op_rl_a(z80t);
+extern z80t z80op_rr_b(z80t);
+extern z80t z80op_rr_c(z80t);
+extern z80t z80op_rr_d(z80t);
+extern z80t z80op_rr_e(z80t);
+extern z80t z80op_rr_h(z80t);
+extern z80t z80op_rr_l(z80t);
+extern z80t z80op_rr_ihl(z80t);
+extern z80t z80op_rr_a(z80t);
+
+extern z80t z80op_sla_b(z80t);
+extern z80t z80op_sla_c(z80t);
+extern z80t z80op_sla_d(z80t);
+extern z80t z80op_sla_e(z80t);
+extern z80t z80op_sla_h(z80t);
+extern z80t z80op_sla_l(z80t);
+extern z80t z80op_sla_ihl(z80t);
+extern z80t z80op_sla_a(z80t);
+extern z80t z80op_sra_b(z80t);
+extern z80t z80op_sra_c(z80t);
+extern z80t z80op_sra_d(z80t);
+extern z80t z80op_sra_e(z80t);
+extern z80t z80op_sra_h(z80t);
+extern z80t z80op_sra_l(z80t);
+extern z80t z80op_sra_ihl(z80t);
+extern z80t z80op_sra_a(z80t);
+
+extern z80t z80op_sll_b(z80t);
+extern z80t z80op_sll_c(z80t);
+extern z80t z80op_sll_d(z80t);
+extern z80t z80op_sll_e(z80t);
+extern z80t z80op_sll_h(z80t);
+extern z80t z80op_sll_l(z80t);
+extern z80t z80op_sll_ihl(z80t);
+extern z80t z80op_sll_a(z80t);
+extern z80t z80op_srl_b(z80t);
+extern z80t z80op_srl_c(z80t);
+extern z80t z80op_srl_d(z80t);
+extern z80t z80op_srl_e(z80t);
+extern z80t z80op_srl_h(z80t);
+extern z80t z80op_srl_l(z80t);
+extern z80t z80op_srl_ihl(z80t);
+extern z80t z80op_srl_a(z80t);
+
+extern z80t z80op_bit_0_b(z80t);
+extern z80t z80op_bit_0_c(z80t);
+extern z80t z80op_bit_0_d(z80t);
+extern z80t z80op_bit_0_e(z80t);
+extern z80t z80op_bit_0_h(z80t);
+extern z80t z80op_bit_0_l(z80t);
+extern z80t z80op_bit_0_ihl(z80t);
+extern z80t z80op_bit_0_a(z80t);
+extern z80t z80op_bit_1_b(z80t);
+extern z80t z80op_bit_1_c(z80t);
+extern z80t z80op_bit_1_d(z80t);
+extern z80t z80op_bit_1_e(z80t);
+extern z80t z80op_bit_1_h(z80t);
+extern z80t z80op_bit_1_l(z80t);
+extern z80t z80op_bit_1_ihl(z80t);
+extern z80t z80op_bit_1_a(z80t);
+
+extern z80t z80op_bit_2_b(z80t);
+extern z80t z80op_bit_2_c(z80t);
+extern z80t z80op_bit_2_d(z80t);
+extern z80t z80op_bit_2_e(z80t);
+extern z80t z80op_bit_2_h(z80t);
+extern z80t z80op_bit_2_l(z80t);
+extern z80t z80op_bit_2_ihl(z80t);
+extern z80t z80op_bit_2_a(z80t);
+extern z80t z80op_bit_3_b(z80t);
+extern z80t z80op_bit_3_c(z80t);
+extern z80t z80op_bit_3_d(z80t);
+extern z80t z80op_bit_3_e(z80t);
+extern z80t z80op_bit_3_h(z80t);
+extern z80t z80op_bit_3_l(z80t);
+extern z80t z80op_bit_3_ihl(z80t);
+extern z80t z80op_bit_3_a(z80t);
+
+extern z80t z80op_bit_4_b(z80t);
+extern z80t z80op_bit_4_c(z80t);
+extern z80t z80op_bit_4_d(z80t);
+extern z80t z80op_bit_4_e(z80t);
+extern z80t z80op_bit_4_h(z80t);
+extern z80t z80op_bit_4_l(z80t);
+extern z80t z80op_bit_4_ihl(z80t);
+extern z80t z80op_bit_4_a(z80t);
+extern z80t z80op_bit_5_b(z80t);
+extern z80t z80op_bit_5_c(z80t);
+extern z80t z80op_bit_5_d(z80t);
+extern z80t z80op_bit_5_e(z80t);
+extern z80t z80op_bit_5_h(z80t);
+extern z80t z80op_bit_5_l(z80t);
+extern z80t z80op_bit_5_ihl(z80t);
+extern z80t z80op_bit_5_a(z80t);
+
+extern z80t z80op_bit_6_b(z80t);
+extern z80t z80op_bit_6_c(z80t);
+extern z80t z80op_bit_6_d(z80t);
+extern z80t z80op_bit_6_e(z80t);
+extern z80t z80op_bit_6_h(z80t);
+extern z80t z80op_bit_6_l(z80t);
+extern z80t z80op_bit_6_ihl(z80t);
+extern z80t z80op_bit_6_a(z80t);
+extern z80t z80op_bit_7_b(z80t);
+extern z80t z80op_bit_7_c(z80t);
+extern z80t z80op_bit_7_d(z80t);
+extern z80t z80op_bit_7_e(z80t);
+extern z80t z80op_bit_7_h(z80t);
+extern z80t z80op_bit_7_l(z80t);
+extern z80t z80op_bit_7_ihl(z80t);
+extern z80t z80op_bit_7_a(z80t);
+
+extern z80t z80op_res_0_b(z80t);
+extern z80t z80op_res_0_c(z80t);
+extern z80t z80op_res_0_d(z80t);
+extern z80t z80op_res_0_e(z80t);
+extern z80t z80op_res_0_h(z80t);
+extern z80t z80op_res_0_l(z80t);
+extern z80t z80op_res_0_ihl(z80t);
+extern z80t z80op_res_0_a(z80t);
+extern z80t z80op_res_1_b(z80t);
+extern z80t z80op_res_1_c(z80t);
+extern z80t z80op_res_1_d(z80t);
+extern z80t z80op_res_1_e(z80t);
+extern z80t z80op_res_1_h(z80t);
+extern z80t z80op_res_1_l(z80t);
+extern z80t z80op_res_1_ihl(z80t);
+extern z80t z80op_res_1_a(z80t);
+
+extern z80t z80op_res_2_b(z80t);
+extern z80t z80op_res_2_c(z80t);
+extern z80t z80op_res_2_d(z80t);
+extern z80t z80op_res_2_e(z80t);
+extern z80t z80op_res_2_h(z80t);
+extern z80t z80op_res_2_l(z80t);
+extern z80t z80op_res_2_ihl(z80t);
+extern z80t z80op_res_2_a(z80t);
+extern z80t z80op_res_3_b(z80t);
+extern z80t z80op_res_3_c(z80t);
+extern z80t z80op_res_3_d(z80t);
+extern z80t z80op_res_3_e(z80t);
+extern z80t z80op_res_3_h(z80t);
+extern z80t z80op_res_3_l(z80t);
+extern z80t z80op_res_3_ihl(z80t);
+extern z80t z80op_res_3_a(z80t);
+
+extern z80t z80op_res_4_b(z80t);
+extern z80t z80op_res_4_c(z80t);
+extern z80t z80op_res_4_d(z80t);
+extern z80t z80op_res_4_e(z80t);
+extern z80t z80op_res_4_h(z80t);
+extern z80t z80op_res_4_l(z80t);
+extern z80t z80op_res_4_ihl(z80t);
+extern z80t z80op_res_4_a(z80t);
+extern z80t z80op_res_5_b(z80t);
+extern z80t z80op_res_5_c(z80t);
+extern z80t z80op_res_5_d(z80t);
+extern z80t z80op_res_5_e(z80t);
+extern z80t z80op_res_5_h(z80t);
+extern z80t z80op_res_5_l(z80t);
+extern z80t z80op_res_5_ihl(z80t);
+extern z80t z80op_res_5_a(z80t);
+
+extern z80t z80op_res_6_b(z80t);
+extern z80t z80op_res_6_c(z80t);
+extern z80t z80op_res_6_d(z80t);
+extern z80t z80op_res_6_e(z80t);
+extern z80t z80op_res_6_h(z80t);
+extern z80t z80op_res_6_l(z80t);
+extern z80t z80op_res_6_ihl(z80t);
+extern z80t z80op_res_6_a(z80t);
+extern z80t z80op_res_7_b(z80t);
+extern z80t z80op_res_7_c(z80t);
+extern z80t z80op_res_7_d(z80t);
+extern z80t z80op_res_7_e(z80t);
+extern z80t z80op_res_7_h(z80t);
+extern z80t z80op_res_7_l(z80t);
+extern z80t z80op_res_7_ihl(z80t);
+extern z80t z80op_res_7_a(z80t);
+
+extern z80t z80op_set_0_b(z80t);
+extern z80t z80op_set_0_c(z80t);
+extern z80t z80op_set_0_d(z80t);
+extern z80t z80op_set_0_e(z80t);
+extern z80t z80op_set_0_h(z80t);
+extern z80t z80op_set_0_l(z80t);
+extern z80t z80op_set_0_ihl(z80t);
+extern z80t z80op_set_0_a(z80t);
+extern z80t z80op_set_1_b(z80t);
+extern z80t z80op_set_1_c(z80t);
+extern z80t z80op_set_1_d(z80t);
+extern z80t z80op_set_1_e(z80t);
+extern z80t z80op_set_1_h(z80t);
+extern z80t z80op_set_1_l(z80t);
+extern z80t z80op_set_1_ihl(z80t);
+extern z80t z80op_set_1_a(z80t);
+
+extern z80t z80op_set_2_b(z80t);
+extern z80t z80op_set_2_c(z80t);
+extern z80t z80op_set_2_d(z80t);
+extern z80t z80op_set_2_e(z80t);
+extern z80t z80op_set_2_h(z80t);
+extern z80t z80op_set_2_l(z80t);
+extern z80t z80op_set_2_ihl(z80t);
+extern z80t z80op_set_2_a(z80t);
+extern z80t z80op_set_3_b(z80t);
+extern z80t z80op_set_3_c(z80t);
+extern z80t z80op_set_3_d(z80t);
+extern z80t z80op_set_3_e(z80t);
+extern z80t z80op_set_3_h(z80t);
+extern z80t z80op_set_3_l(z80t);
+extern z80t z80op_set_3_ihl(z80t);
+extern z80t z80op_set_3_a(z80t);
+
+extern z80t z80op_set_4_b(z80t);
+extern z80t z80op_set_4_c(z80t);
+extern z80t z80op_set_4_d(z80t);
+extern z80t z80op_set_4_e(z80t);
+extern z80t z80op_set_4_h(z80t);
+extern z80t z80op_set_4_l(z80t);
+extern z80t z80op_set_4_ihl(z80t);
+extern z80t z80op_set_4_a(z80t);
+extern z80t z80op_set_5_b(z80t);
+extern z80t z80op_set_5_c(z80t);
+extern z80t z80op_set_5_d(z80t);
+extern z80t z80op_set_5_e(z80t);
+extern z80t z80op_set_5_h(z80t);
+extern z80t z80op_set_5_l(z80t);
+extern z80t z80op_set_5_ihl(z80t);
+extern z80t z80op_set_5_a(z80t);
+
+extern z80t z80op_set_6_b(z80t);
+extern z80t z80op_set_6_c(z80t);
+extern z80t z80op_set_6_d(z80t);
+extern z80t z80op_set_6_e(z80t);
+extern z80t z80op_set_6_h(z80t);
+extern z80t z80op_set_6_l(z80t);
+extern z80t z80op_set_6_ihl(z80t);
+extern z80t z80op_set_6_a(z80t);
+extern z80t z80op_set_7_b(z80t);
+extern z80t z80op_set_7_c(z80t);
+extern z80t z80op_set_7_d(z80t);
+extern z80t z80op_set_7_e(z80t);
+extern z80t z80op_set_7_h(z80t);
+extern z80t z80op_set_7_l(z80t);
+extern z80t z80op_set_7_ihl(z80t);
+extern z80t z80op_set_7_a(z80t);
diff --git a/apps/plugins/zxbox/z80_step.c b/apps/plugins/zxbox/z80_step.c
new file mode 100644
index 0000000000..803079c970
--- /dev/null
+++ b/apps/plugins/zxbox/z80_step.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "z80_def.h"
+
+byte z80c_incf_tbl[256];
+byte z80c_decf_tbl[256];
+byte z80c_addf_tbl[256];
+byte z80c_subf_tbl[256];
+byte z80c_orf_tbl[256];
+
+
+void PRNM(pushpc)(void)
+{
+#ifdef PROCP
+ Z80 *z80p;
+ z80p = &PRNM(proc);
+#endif
+
+ SP--;
+ PUTMEM(SP, SPP, PCH);
+ SP--;
+ PUTMEM(SP, SPP, PCL);
+}
+
+static int parity(int b)
+{
+ int i;
+ int par;
+
+ par = 0;
+ for(i = 8; i; i--) par ^= (b & 1), b >>= 1;
+ return par;
+}
+
+void PRNM(local_init)(void)
+{
+ int i;
+
+#ifdef PROCP
+ Z80 *z80p;
+ z80p = &PRNM(proc);
+#endif
+
+ for(i = 0; i < 0x100; i++) {
+ z80c_incf_tbl[i] = z80c_decf_tbl[i] = z80c_orf_tbl[i] = 0;
+
+ z80c_orf_tbl[i] |= i & (SF | B3F | B5F);
+ z80c_incf_tbl[i] |= i & (SF | B3F | B5F);
+ z80c_decf_tbl[i] |= i & (SF | B3F | B5F);
+
+ if(!parity(i)) z80c_orf_tbl[i] |= PVF;
+ }
+
+ z80c_incf_tbl[0] |= ZF;
+ z80c_decf_tbl[0] |= ZF;
+ z80c_orf_tbl[0] |= ZF;
+
+ z80c_incf_tbl[0x80] |= PVF;
+ z80c_decf_tbl[0x7F] |= PVF;
+
+ for(i = 0; i < 0x100; i++) {
+ int cr, c1, c2;
+ int hr, h1, h2;
+ int b5r;
+
+ cr = i & 0x80;
+ c1 = i & 0x40;
+ b5r = i & 0x20;
+ c2 = i & 0x10;
+
+ hr = i & 0x08;
+ h1 = i & 0x04;
+ h2 = i & 0x01;
+
+ z80c_addf_tbl[i] = 0;
+ z80c_subf_tbl[i] = 0;
+ if(cr) {
+ z80c_addf_tbl[i] |= SF;
+ z80c_subf_tbl[i] |= SF;
+ }
+ if(b5r) {
+ z80c_addf_tbl[i] |= B5F;
+ z80c_subf_tbl[i] |= B5F;
+ }
+ if(hr) {
+ z80c_addf_tbl[i] |= B3F;
+ z80c_subf_tbl[i] |= B3F;
+ }
+
+ if((c1 && c2) || (!cr && (c1 || c2))) z80c_addf_tbl[i] |= CF;
+ if((h1 && h2) || (!hr && (h1 || h2))) z80c_addf_tbl[i] |= HF;
+
+ if((!c1 && !c2 && cr) || (c1 && c2 && !cr)) z80c_addf_tbl[i] |= PVF;
+
+
+ if((c2 && cr) || (!c1 && (c2 || cr))) z80c_subf_tbl[i] |= CF;
+ if((h2 && hr) || (!h1 && (h2 || hr))) z80c_subf_tbl[i] |= HF;
+
+ if((!c2 && !cr && c1) || (c2 && cr && !c1)) z80c_subf_tbl[i] |= PVF;
+
+
+ z80c_subf_tbl[i] |= NF;
+ }
+
+
+#ifdef PROCP
+ TAB(incf_tbl) = z80c_incf_tbl;
+ TAB(decf_tbl) = z80c_decf_tbl;
+ TAB(addf_tbl) = z80c_addf_tbl;
+ TAB(subf_tbl) = z80c_subf_tbl;
+ TAB(orf_tbl) = z80c_orf_tbl;
+
+ PORT(inports) = PRNM(inports);
+ PORT(outports) = PRNM(outports);
+#ifdef SPECT_MEM
+ SPECP(fe_inport_high) = SPNM(fe_inport_high);
+#endif
+#endif
+}
+
+
+int PRNM(step)(int tc)
+{
+#ifdef PROCP
+ Z80 *z80p;
+ z80p = &PRNM(proc);
+#endif
+
+ DANM(tc) = tc;
+ DANM(rl7) = RR & 0x80;
+
+ if(DANM(haltstate)) {
+ register int nn;
+ nn = (DANM(tc) - 1) / 4 + 1;
+
+ DANM(tc) -= 4 * nn;
+ RR += nn;
+ }
+ else do {
+ register int nextop;
+
+#ifdef DEBUG_Z80
+ debug_z80();
+#endif
+ nextop = *PCP;
+ PC++;
+
+#ifdef PROCP
+ z80p = (*z80c_op_tab[nextop])(z80p);
+#else
+ (*z80c_op_tab[nextop])();
+#endif
+ RR++;
+ } while(DANM(tc) > 0);
+
+ RR = (RR & 0x7F) | DANM(rl7);
+ return DANM(tc);
+}
diff --git a/apps/plugins/zxbox/z80_type.h b/apps/plugins/zxbox/z80_type.h
new file mode 100644
index 0000000000..4fdddbe827
--- /dev/null
+++ b/apps/plugins/zxbox/z80_type.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef Z80_TYPE_H
+#define Z80_TYPE_H
+
+typedef unsigned char byte;
+typedef signed char sbyte;
+typedef unsigned short dbyte;
+typedef unsigned int qbyte;
+
+typedef signed char gchar;
+typedef signed short gshort;
+typedef signed int gint;
+
+#endif /* Z80_TYPE_H */
diff --git a/apps/plugins/zxbox/z80optab.c b/apps/plugins/zxbox/z80optab.c
new file mode 100644
index 0000000000..da973277a2
--- /dev/null
+++ b/apps/plugins/zxbox/z80optab.c
@@ -0,0 +1,1470 @@
+/*
+ * Copyright (C) 1996-1998 Szeredi Miklos
+ * Email: mszeredi@inf.bme.hu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version. See the file COPYING.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "z80_def.h"
+#include "z80optab.h"
+
+#ifdef PROCP
+#define NEXTTAB(tab) \
+{ \
+ register byte nextop; \
+ nextop = *PCP; \
+ PC++; \
+ return (*z80c_op_tab_ ## tab [nextop])(z80p); \
+}
+#else
+#define NEXTTAB(tab) \
+{ \
+ register byte nextop; \
+ nextop = *PCP; \
+ PC++; \
+ (*z80c_op_tab_ ## tab [nextop])(); \
+}
+#endif
+
+
+OPDEF(special_cb, 0xCB)
+{
+ RR++;
+ DANM(cbaddr) = HL;
+ NEXTTAB(cb);
+}
+
+OPDEF(special_dd, 0xDD)
+{
+ RR++;
+ DANM(tc) -= 4;
+ NEXTTAB(dd);
+}
+
+
+OPDEF(special_ed, 0xED)
+{
+ RR++;
+ NEXTTAB(ed);
+}
+
+OPDEF(special_fd, 0xFD)
+{
+ RR++;
+ DANM(tc) -= 4;
+ NEXTTAB(fd);
+}
+
+OPDEF(special_xx, 0xDD 0xFD)
+{
+ RR--;
+ PC--;
+ ENDOP();
+}
+
+OPDEF(special_dd_cb, 0xCB)
+{
+ DANM(tc) -= 4;
+ IXDGET(IX, DANM(cbaddr));
+#ifdef DEBUG_Z80
+ if((*PCP & 0x07) != 6)
+ printf("DD_CB unimplemented!\n");
+#endif
+ NEXTTAB(cb);
+}
+
+OPDEF(special_fd_cb, 0xCB)
+{
+ DANM(tc) -= 4;
+ IXDGET(IY, DANM(cbaddr));
+#ifdef DEBUG_Z80
+ if((*PCP & 0x07) != 6)
+ printf("FD_CB unimplemented!\n");
+#endif
+ NEXTTAB(cb);
+}
+
+op_f z80c_op_tab[] = {
+ z80op_nop,
+ z80op_ld_bc_nn,
+ z80op_ld_ibc_a,
+ z80op_inc_bc,
+ z80op_inc_b,
+ z80op_dec_b,
+ z80op_ld_b_n,
+ z80op_rlca,
+ z80op_ex_af_afb,
+ z80op_add_hl_bc,
+ z80op_ld_a_ibc,
+ z80op_dec_bc,
+ z80op_inc_c,
+ z80op_dec_c,
+ z80op_ld_c_n,
+ z80op_rrca,
+
+ z80op_djnz_e,
+ z80op_ld_de_nn,
+ z80op_ld_ide_a,
+ z80op_inc_de,
+ z80op_inc_d,
+ z80op_dec_d,
+ z80op_ld_d_n,
+ z80op_rla,
+ z80op_jr_e,
+ z80op_add_hl_de,
+ z80op_ld_a_ide,
+ z80op_dec_de,
+ z80op_inc_e,
+ z80op_dec_e,
+ z80op_ld_e_n,
+ z80op_rra,
+
+ z80op_jr_nz_e,
+ z80op_ld_hl_nn,
+ z80op_ld_inn_hl,
+ z80op_inc_hl,
+ z80op_inc_h,
+ z80op_dec_h,
+ z80op_ld_h_n,
+ z80op_daa,
+ z80op_jr_z_e,
+ z80op_add_hl_hl,
+ z80op_ld_hl_inn,
+ z80op_dec_hl,
+ z80op_inc_l,
+ z80op_dec_l,
+ z80op_ld_l_n,
+ z80op_cpl,
+
+ z80op_jr_nc_e,
+ z80op_ld_sp_nn,
+ z80op_ld_inn_a,
+ z80op_inc_sp,
+ z80op_inc_ihl,
+ z80op_dec_ihl,
+ z80op_ld_ihl_n,
+ z80op_scf,
+ z80op_jr_c_e,
+ z80op_add_hl_sp,
+ z80op_ld_a_inn,
+ z80op_dec_sp,
+ z80op_inc_a,
+ z80op_dec_a,
+ z80op_ld_a_n,
+ z80op_ccf,
+
+ z80op_nop,
+ z80op_ld_b_c,
+ z80op_ld_b_d,
+ z80op_ld_b_e,
+ z80op_ld_b_h,
+ z80op_ld_b_l,
+ z80op_ld_b_ihl,
+ z80op_ld_b_a,
+ z80op_ld_c_b,
+ z80op_nop,
+ z80op_ld_c_d,
+ z80op_ld_c_e,
+ z80op_ld_c_h,
+ z80op_ld_c_l,
+ z80op_ld_c_ihl,
+ z80op_ld_c_a,
+
+ z80op_ld_d_b,
+ z80op_ld_d_c,
+ z80op_nop,
+ z80op_ld_d_e,
+ z80op_ld_d_h,
+ z80op_ld_d_l,
+ z80op_ld_d_ihl,
+ z80op_ld_d_a,
+ z80op_ld_e_b,
+ z80op_ld_e_c,
+ z80op_ld_e_d,
+ z80op_nop,
+ z80op_ld_e_h,
+ z80op_ld_e_l,
+ z80op_ld_e_ihl,
+ z80op_ld_e_a,
+
+ z80op_ld_h_b,
+ z80op_ld_h_c,
+ z80op_ld_h_d,
+ z80op_ld_h_e,
+ z80op_nop,
+ z80op_ld_h_l,
+ z80op_ld_h_ihl,
+ z80op_ld_h_a,
+ z80op_ld_l_b,
+ z80op_ld_l_c,
+ z80op_ld_l_d,
+ z80op_ld_l_e,
+ z80op_ld_l_h,
+ z80op_nop,
+ z80op_ld_l_ihl,
+ z80op_ld_l_a,
+
+ z80op_ld_ihl_b,
+ z80op_ld_ihl_c,
+ z80op_ld_ihl_d,
+ z80op_ld_ihl_e,
+ z80op_ld_ihl_h,
+ z80op_ld_ihl_l,
+ z80op_halt,
+ z80op_ld_ihl_a,
+ z80op_ld_a_b,
+ z80op_ld_a_c,
+ z80op_ld_a_d,
+ z80op_ld_a_e,
+ z80op_ld_a_h,
+ z80op_ld_a_l,
+ z80op_ld_a_ihl,
+ z80op_nop,
+
+ z80op_add_a_b,
+ z80op_add_a_c,
+ z80op_add_a_d,
+ z80op_add_a_e,
+ z80op_add_a_h,
+ z80op_add_a_l,
+ z80op_add_a_ihl,
+ z80op_add_a_a,
+ z80op_adc_a_b,
+ z80op_adc_a_c,
+ z80op_adc_a_d,
+ z80op_adc_a_e,
+ z80op_adc_a_h,
+ z80op_adc_a_l,
+ z80op_adc_a_ihl,
+ z80op_adc_a_a,
+
+ z80op_sub_b,
+ z80op_sub_c,
+ z80op_sub_d,
+ z80op_sub_e,
+ z80op_sub_h,
+ z80op_sub_l,
+ z80op_sub_ihl,
+ z80op_sub_a,
+ z80op_sbc_a_b,
+ z80op_sbc_a_c,
+ z80op_sbc_a_d,
+ z80op_sbc_a_e,
+ z80op_sbc_a_h,
+ z80op_sbc_a_l,
+ z80op_sbc_a_ihl,
+ z80op_sbc_a_a,
+
+ z80op_and_b,
+ z80op_and_c,
+ z80op_and_d,
+ z80op_and_e,
+ z80op_and_h,
+ z80op_and_l,
+ z80op_and_ihl,
+ z80op_and_a,
+ z80op_xor_b,
+ z80op_xor_c,
+ z80op_xor_d,
+ z80op_xor_e,
+ z80op_xor_h,
+ z80op_xor_l,
+ z80op_xor_ihl,
+ z80op_xor_a,
+
+ z80op_or_b,
+ z80op_or_c,
+ z80op_or_d,
+ z80op_or_e,
+ z80op_or_h,
+ z80op_or_l,
+ z80op_or_ihl,
+ z80op_or_a,
+ z80op_cp_b,
+ z80op_cp_c,
+ z80op_cp_d,
+ z80op_cp_e,
+ z80op_cp_h,
+ z80op_cp_l,
+ z80op_cp_ihl,
+ z80op_cp_a,
+
+ z80op_ret_nz,
+ z80op_pop_bc,
+ z80op_jp_nz_nn,
+ z80op_jp_nn,
+ z80op_call_nz_nn,
+ z80op_push_bc,
+ z80op_add_a_n,
+ z80op_rst_00,
+ z80op_ret_z,
+ z80op_ret,
+ z80op_jp_z_nn,
+ z80op_special_cb,
+ z80op_call_z_nn,
+ z80op_call_nn,
+ z80op_adc_a_n,
+ z80op_rst_08,
+
+ z80op_ret_nc,
+ z80op_pop_de,
+ z80op_jp_nc_nn,
+ z80op_out_in_a,
+ z80op_call_nc_nn,
+ z80op_push_de,
+ z80op_sub_n,
+ z80op_rst_10,
+ z80op_ret_c,
+ z80op_exx,
+ z80op_jp_c_nn,
+ z80op_in_a_in,
+ z80op_call_c_nn,
+ z80op_special_dd,
+ z80op_sbc_a_n,
+ z80op_rst_18,
+
+ z80op_ret_po,
+ z80op_pop_hl,
+ z80op_jp_po_nn,
+ z80op_ex_isp_hl,
+ z80op_call_po_nn,
+ z80op_push_hl,
+ z80op_and_n,
+ z80op_rst_20,
+ z80op_ret_pe,
+ z80op_jp_hl,
+ z80op_jp_pe_nn,
+ z80op_ex_de_hl,
+ z80op_call_pe_nn,
+ z80op_special_ed,
+ z80op_xor_n,
+ z80op_rst_28,
+
+ z80op_ret_p,
+ z80op_pop_af,
+ z80op_jp_p_nn,
+ z80op_di,
+ z80op_call_p_nn,
+ z80op_push_af,
+ z80op_or_n,
+ z80op_rst_30,
+ z80op_ret_m,
+ z80op_ld_sp_hl,
+ z80op_jp_m_nn,
+ z80op_ei,
+ z80op_call_m_nn,
+ z80op_special_fd,
+ z80op_cp_n,
+ z80op_rst_38
+};
+
+
+op_f z80c_op_tab_ed[] = {
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,
+ z80op_ill_ed,