summaryrefslogtreecommitdiff
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
parent1350d57751f30f1700912e6abaa1d845af973f75 (diff)
downloadrockbox-05a7f14f8dbf46fa64c035127ff1e04cfffb841b.tar.gz
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
-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
19sudoku 19sudoku
20#endif 20#endif
21 21
22/* For all 2bpp and colour targets */
23#if (LCD_DEPTH >= 2)
24zxbox
25#endif
26
22/* For all the colour targets and iriver H1x0 */ 27/* For all the colour targets and iriver H1x0 */
23#if defined(HAVE_LCD_COLOR) || defined(IRIVER_H100_SERIES) 28#if defined(HAVE_LCD_COLOR) || defined(IRIVER_H100_SERIES)
24pacbox 29pacbox
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
23bmp,rocks/rockpaint, 01 10 01 10 01 10 23bmp,rocks/rockpaint, 01 10 01 10 01 10
24m2v,viewers/mpegplayer,5D 7F 5D 7F 5D 7F 24m2v,viewers/mpegplayer,5D 7F 5D 7F 5D 7F
25iriver,viewers/iriver_flash,2A 7F 41 41 7F 2A 25iriver,viewers/iriver_flash,2A 7F 41 41 7F 2A
26tap,viewers/zxbox,66 52 4A 66 52 4A
27sna,viewers/zxbox,66 52 4A 66 52 4A
28tzx,viewers/zxbox,66 52 4A 66 52 4A
29z80,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 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Overlay loader stub plugin for zxbox on Archos
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18#include "plugin.h"
19
20#if MEM <= 8 && !defined(SIMULATOR)
21
22#include "overlay.h"
23
24PLUGIN_HEADER
25
26/* this is the plugin entry point */
27enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
28{
29 return run_overlay(api, parameter, "/.rockbox/viewers/zxbox.ovl", "ZXBox");
30}
31#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 @@
1 GNU GENERAL PUBLIC LICENSE
2 Version 2, June 1991
3
4 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5 675 Mass Ave, Cambridge, MA 02139, USA
6 Everyone is permitted to copy and distribute verbatim copies
7 of this license document, but changing it is not allowed.
8
9 Preamble
10
11 The licenses for most software are designed to take away your
12freedom to share and change it. By contrast, the GNU General Public
13License is intended to guarantee your freedom to share and change free
14software--to make sure the software is free for all its users. This
15General Public License applies to most of the Free Software
16Foundation's software and to any other program whose authors commit to
17using it. (Some other Free Software Foundation software is covered by
18the GNU Library General Public License instead.) You can apply it to
19your programs, too.
20
21 When we speak of free software, we are referring to freedom, not
22price. Our General Public Licenses are designed to make sure that you
23have the freedom to distribute copies of free software (and charge for
24this service if you wish), that you receive source code or can get it
25if you want it, that you can change the software or use pieces of it
26in new free programs; and that you know you can do these things.
27
28 To protect your rights, we need to make restrictions that forbid
29anyone to deny you these rights or to ask you to surrender the rights.
30These restrictions translate to certain responsibilities for you if you
31distribute copies of the software, or if you modify it.
32
33 For example, if you distribute copies of such a program, whether
34gratis or for a fee, you must give the recipients all the rights that
35you have. You must make sure that they, too, receive or can get the
36source code. And you must show them these terms so they know their
37rights.
38
39 We protect your rights with two steps: (1) copyright the software, and
40(2) offer you this license which gives you legal permission to copy,
41distribute and/or modify the software.
42
43 Also, for each author's protection and ours, we want to make certain
44that everyone understands that there is no warranty for this free
45software. If the software is modified by someone else and passed on, we
46want its recipients to know that what they have is not the original, so
47that any problems introduced by others will not reflect on the original
48authors' reputations.
49
50 Finally, any free program is threatened constantly by software
51patents. We wish to avoid the danger that redistributors of a free
52program will individually obtain patent licenses, in effect making the
53program proprietary. To prevent this, we have made it clear that any
54patent must be licensed for everyone's free use or not licensed at all.
55
56 The precise terms and conditions for copying, distribution and
57modification follow.
58
59 GNU GENERAL PUBLIC LICENSE
60 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
62 0. This License applies to any program or other work which contains
63a notice placed by the copyright holder saying it may be distributed
64under the terms of this General Public License. The "Program", below,
65refers to any such program or work, and a "work based on the Program"
66means either the Program or any derivative work under copyright law:
67that is to say, a work containing the Program or a portion of it,
68either verbatim or with modifications and/or translated into another
69language. (Hereinafter, translation is included without limitation in
70the term "modification".) Each licensee is addressed as "you".
71
72Activities other than copying, distribution and modification are not
73covered by this License; they are outside its scope. The act of
74running the Program is not restricted, and the output from the Program
75is covered only if its contents constitute a work based on the
76Program (independent of having been made by running the Program).
77Whether that is true depends on what the Program does.
78
79 1. You may copy and distribute verbatim copies of the Program's
80source code as you receive it, in any medium, provided that you
81conspicuously and appropriately publish on each copy an appropriate
82copyright notice and disclaimer of warranty; keep intact all the
83notices that refer to this License and to the absence of any warranty;
84and give any other recipients of the Program a copy of this License
85along with the Program.
86
87You may charge a fee for the physical act of transferring a copy, and
88you may at your option offer warranty protection in exchange for a fee.
89
90 2. You may modify your copy or copies of the Program or any portion
91of it, thus forming a work based on the Program, and copy and
92distribute such modifications or work under the terms of Section 1
93above, provided that you also meet all of these conditions:
94
95 a) You must cause the modified files to carry prominent notices
96 stating that you changed the files and the date of any change.
97
98 b) You must cause any work that you distribute or publish, that in
99 whole or in part contains or is derived from the Program or any
100 part thereof, to be licensed as a whole at no charge to all third
101 parties under the terms of this License.
102
103 c) If the modified program normally reads commands interactively
104 when run, you must cause it, when started running for such
105 interactive use in the most ordinary way, to print or display an
106 announcement including an appropriate copyright notice and a
107 notice that there is no warranty (or else, saying that you provide
108 a warranty) and that users may redistribute the program under
109 these conditions, and telling the user how to view a copy of this
110 License. (Exception: if the Program itself is interactive but
111 does not normally print such an announcement, your work based on
112 the Program is not required to print an announcement.)
113
114These requirements apply to the modified work as a whole. If
115identifiable sections of that work are not derived from the Program,
116and can be reasonably considered independent and separate works in
117themselves, then this License, and its terms, do not apply to those
118sections when you distribute them as separate works. But when you
119distribute the same sections as part of a whole which is a work based
120on the Program, the distribution of the whole must be on the terms of
121this License, whose permissions for other licensees extend to the
122entire whole, and thus to each and every part regardless of who wrote it.
123
124Thus, it is not the intent of this section to claim rights or contest
125your rights to work written entirely by you; rather, the intent is to
126exercise the right to control the distribution of derivative or
127collective works based on the Program.
128
129In addition, mere aggregation of another work not based on the Program
130with the Program (or with a work based on the Program) on a volume of
131a storage or distribution medium does not bring the other work under
132the scope of this License.
133
134 3. You may copy and distribute the Program (or a work based on it,
135under Section 2) in object code or executable form under the terms of
136Sections 1 and 2 above provided that you also do one of the following:
137
138 a) Accompany it with the complete corresponding machine-readable
139 source code, which must be distributed under the terms of Sections
140 1 and 2 above on a medium customarily used for software interchange; or,
141
142 b) Accompany it with a written offer, valid for at least three
143 years, to give any third party, for a charge no more than your
144 cost of physically performing source distribution, a complete
145 machine-readable copy of the corresponding source code, to be
146 distributed under the terms of Sections 1 and 2 above on a medium
147 customarily used for software interchange; or,
148
149 c) Accompany it with the information you received as to the offer
150 to distribute corresponding source code. (This alternative is
151 allowed only for noncommercial distribution and only if you
152 received the program in object code or executable form with such
153 an offer, in accord with Subsection b above.)
154
155The source code for a work means the preferred form of the work for
156making modifications to it. For an executable work, complete source
157code means all the source code for all modules it contains, plus any
158associated interface definition files, plus the scripts used to
159control compilation and installation of the executable. However, as a
160special exception, the source code distributed need not include
161anything that is normally distributed (in either source or binary
162form) with the major components (compiler, kernel, and so on) of the
163operating system on which the executable runs, unless that component
164itself accompanies the executable.
165
166If distribution of executable or object code is made by offering
167access to copy from a designated place, then offering equivalent
168access to copy the source code from the same place counts as
169distribution of the source code, even though third parties are not
170compelled to copy the source along with the object code.
171
172 4. You may not copy, modify, sublicense, or distribute the Program
173except as expressly provided under this License. Any attempt
174otherwise to copy, modify, sublicense or distribute the Program is
175void, and will automatically terminate your rights under this License.
176However, parties who have received copies, or rights, from you under
177this License will not have their licenses terminated so long as such
178parties remain in full compliance.
179
180 5. You are not required to accept this License, since you have not
181signed it. However, nothing else grants you permission to modify or
182distribute the Program or its derivative works. These actions are
183prohibited by law if you do not accept this License. Therefore, by
184modifying or distributing the Program (or any work based on the
185Program), you indicate your acceptance of this License to do so, and
186all its terms and conditions for copying, distributing or modifying
187the Program or works based on it.
188
189 6. Each time you redistribute the Program (or any work based on the
190Program), the recipient automatically receives a license from the
191original licensor to copy, distribute or modify the Program subject to
192these terms and conditions. You may not impose any further
193restrictions on the recipients' exercise of the rights granted herein.
194You are not responsible for enforcing compliance by third parties to
195this License.
196
197 7. If, as a consequence of a court judgment or allegation of patent
198infringement or for any other reason (not limited to patent issues),
199conditions are imposed on you (whether by court order, agreement or
200otherwise) that contradict the conditions of this License, they do not
201excuse you from the conditions of this License. If you cannot
202distribute so as to satisfy simultaneously your obligations under this
203License and any other pertinent obligations, then as a consequence you
204may not distribute the Program at all. For example, if a patent
205license would not permit royalty-free redistribution of the Program by
206all those who receive copies directly or indirectly through you, then
207the only way you could satisfy both it and this License would be to
208refrain entirely from distribution of the Program.
209
210If any portion of this section is held invalid or unenforceable under
211any particular circumstance, the balance of the section is intended to
212apply and the section as a whole is intended to apply in other
213circumstances.
214
215It is not the purpose of this section to induce you to infringe any
216patents or other property right claims or to contest validity of any
217such claims; this section has the sole purpose of protecting the
218integrity of the free software distribution system, which is
219implemented by public license practices. Many people have made
220generous contributions to the wide range of software distributed
221through that system in reliance on consistent application of that
222system; it is up to the author/donor to decide if he or she is willing
223to distribute software through any other system and a licensee cannot
224impose that choice.
225
226This section is intended to make thoroughly clear what is believed to
227be a consequence of the rest of this License.
228
229 8. If the distribution and/or use of the Program is restricted in
230certain countries either by patents or by copyrighted interfaces, the
231original copyright holder who places the Program under this License
232may add an explicit geographical distribution limitation excluding
233those countries, so that distribution is permitted only in or among
234countries not thus excluded. In such case, this License incorporates
235the limitation as if written in the body of this License.
236
237 9. The Free Software Foundation may publish revised and/or new versions
238of the General Public License from time to time. Such new versions will
239be similar in spirit to the present version, but may differ in detail to
240address new problems or concerns.
241
242Each version is given a distinguishing version number. If the Program
243specifies a version number of this License which applies to it and "any
244later version", you have the option of following the terms and conditions
245either of that version or of any later version published by the Free
246Software Foundation. If the Program does not specify a version number of
247this License, you may choose any version ever published by the Free Software
248Foundation.
249
250 10. If you wish to incorporate parts of the Program into other free
251programs whose distribution conditions are different, write to the author
252to ask for permission. For software which is copyrighted by the Free
253Software Foundation, write to the Free Software Foundation; we sometimes
254make exceptions for this. Our decision will be guided by the two goals
255of preserving the free status of all derivatives of our free software and
256of promoting the sharing and reuse of software generally.
257
258 NO WARRANTY
259
260 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268REPAIR OR CORRECTION.
269
270 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278POSSIBILITY OF SUCH DAMAGES.
279
280 END OF TERMS AND CONDITIONS
281
282 How to Apply These Terms to Your New Programs
283
284 If you develop a new program, and you want it to be of the greatest
285possible use to the public, the best way to achieve this is to make it
286free software which everyone can redistribute and change under these terms.
287
288 To do so, attach the following notices to the program. It is safest
289to attach them to the start of each source file to most effectively
290convey the exclusion of warranty; and each file should have at least
291the "copyright" line and a pointer to where the full notice is found.
292
293 <one line to give the program's name and a brief idea of what it does.>
294 Copyright (C) 19yy <name of author>
295
296 This program is free software; you can redistribute it and/or modify
297 it under the terms of the GNU General Public License as published by
298 the Free Software Foundation; either version 2 of the License, or
299 (at your option) any later version.
300
301 This program is distributed in the hope that it will be useful,
302 but WITHOUT ANY WARRANTY; without even the implied warranty of
303 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 GNU General Public License for more details.
305
306 You should have received a copy of the GNU General Public License
307 along with this program; if not, write to the Free Software
308 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
309
310Also add information on how to contact you by electronic and paper mail.
311
312If the program is interactive, make it output a short notice like this
313when it starts in an interactive mode:
314
315 Gnomovision version 69, Copyright (C) 19yy name of author
316 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 This is free software, and you are welcome to redistribute it
318 under certain conditions; type `show c' for details.
319
320The hypothetical commands `show w' and `show c' should show the appropriate
321parts of the General Public License. Of course, the commands you use may
322be called something other than `show w' and `show c'; they could even be
323mouse-clicks or menu items--whatever suits your program.
324
325You should also get your employer (if you work as a programmer) or your
326school, if any, to sign a "copyright disclaimer" for the program, if
327necessary. Here is a sample; alter the names:
328
329 Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
332 <signature of Ty Coon>, 1 April 1989
333 Ty Coon, President of Vice
334
335This General Public License does not permit incorporating your program into
336proprietary programs. If your program is a subroutine library, you may
337consider it more useful to permit linking proprietary applications with the
338library. If this is what you want to do, use the GNU Library General
339Public 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 @@
104.09.2006 code cleanup; now using IRAM correctly (i hope)
2
331.08.2006 far better sound, volume option is working now
4
529.08.2006 predefined keymaps, menu reworking, volume settings
6
728.08.2006 more options : frame-skipping, sound on/off, toggle 'fast' mode
828.08.2006 output actual speed of emulation in percent rather than number of rendered frames
928.08.2006 timing implementation (no >100 % speed in sims)
10
11
1215.08.2006 output FPS on screen when in buffered and into logf when in unbuffered mode (grayscale)
13
14
1515.08.2006 buffered mode when in grayscale mode
16
1711.08.2006 support for grayscale lib
18
1905/2006 - edited by Anton Romanov for
20RockBox - http://www.rockbox.org
21with the help of Dave Chapman and Szeredi Miklos
22
23
2498/05/18 Version 0.94 released
25===============================
26
2798/05/18 Updated the man page (a more complete man-page is still needed!)
2898/05/15 Some bugs fixed
29
3098/05/14 Version 0.93.4 released
31--------------------------------
32
3398/05/14 Small additions:
34 - Keyboard matrix is emulated (only 1 level, I hope this is enough)
35 - "color refreshing" (maybe some other aplications could do it!)
36 - Keyboard configuration is now fully implemented
37
3898/05/11 Added DOS timer support with Allegro library
39
4098/05/08 Version 0.93.3 released
41---------------------------------
42
4398/05/08 Created README.Z80 to describe how to use Z80 emulation
4498/05/06 Small new features + bugfixes
45 - Function keys for commonly used functions
46 - Keyboard config: (extended, spectrum, compat) and (shifted, raw)
47 are now working. No custom keyboard or joystick yet
48 - Small modifications to make z80 emulation separate
49
5098/04/30 Version 0.93.2 released
51---------------------------------
52
5398/04/30 I've removed the BROKEN_VGAKEYBOARD part from vgakey.c.
54 I hope nobody's using SVGALIB version smaller than 1.2.11.
55
5698/04/29 Some small new features: (see example.cfg for a complete list)
57 - different icon when the emulator is paused
58 - optional private colormap
59 - configurable colours (grayscale looks better on
60 monochrome displays)
61 - filetype can be given on the command line (tapefiles too)
62 - optional immediate loading of tapes (-load-immed)
63
6498/04/27 Added configurability to spectemu:
65 - global config file (($prefix)/share/spectemu/spectemu.cfg)
66 - user's config file (~/.spectemurc)
67 - X resource database
68 - command line
69
7098/04/23 Mode 320x240 is used in vgaspect (if available)
71
7298/04/22 Version 0.93.1 released
73---------------------------------
74
7598/04/21 Handle "extra" ascii keys: []{}|\~
7698/04/19 Added Spectrum keyboard picture, which shows pressed keys, and
77 keys can be pressed with mouse.
7898/04/16 Rewrite keyboard handling:
79 - Fixes keyboard bug in X (key remained pressed)
80 - Better configurability: spectrum key definitions are in spkey.c
81 instead of xkey.c and vgakey.c
82
8398/04/07 Added readline support by Christian Sievers <sievers@cip.rz.tu-bs.de>
84
8598/03/24 Version 0.92 released
86===============================
87
8898/03/23 Last minute bugfixes
89
9098/03/20 Version 0.92p3 released
9198/03/20 Eliminated all sorts of minor bugs
9298/03/19 Implement LOOP/CALL/RETURN blocks in TZX handling
9398/03/17 Fixed (hopefully all) bugs in TZX handling:
94 - There must be a 1ms pause at end of tape.
95 - Pausing after data blocks fixed.
96 - Made tape I/O timing ultra precise (e.g. see Flashpoint)
97
9898/03/14 Fixed small bug in quick load
9998/03/13 Sound of tape is now fixed (not perfect, but good enough)
100 Created simple man page
101
10298/03/11 Version 0.92pre2 released
10398/03/10 Fixed quick load of tapefiles
10498/03/10 Fixed resize bugs
105
10698/03/09 Version 0.92pre1 released
10798/03/08 C-version now handles bits 3 and 5 of the Flag register
108 (I hope I didn't break anything with this).
10998/03/08 Wrote 'tapeout' utility to save tapefiles to real tape (via
110 soundcard).
111
11298/03/06 Implemented emulator pause.
11398/03/06 Added ability to display spectrum keyboard layout on text
114 console (Radovan.Garabik@fmph.uniba.sk).
115
11698/03/05 Rewrite of snapshot handeling:
117 - All versions of Z80 snapshots can now be loaded.
118 - Loading and saving of SNA snapshot format is supported.
119 - Quick loading and saving of temporary snapshot.
120
12198/03/03 Rewrite of tapefile handeling:
122 - Support for most TZX blocks (recognise length of all v1.11
123 blocks)
124 - SPT tapefiles are no longer supported
125 - Added quick loading of tapefiles
126 - Timing in tape emulation is very exact now, but this makes
127 tape sound ugly (this will be fixed).
128
12998/01/28 Version 0.91a released
13098/01/26 Added detection for underlines in asm names to configure
131
13298/01/12 Version 0.91 released
133===============================
134
13598/01/08 Changes to configure to detect X libraries better
136
13797/11/29 Use XSetWMProperties instead of XmbSetWMProperties
13897/11/26 Created icon for xspect
13997/11/20 IO and memory timing are improved (ULA / CPU clash)
140
14197/11/18 Fixed 0xfe port problems
14297/11/17 Input from unused ports (others than 0xFE) result in 0xFF, not 0x00
143
14497/11/12 8000 sample/sec sound on SUN
14597/11/12 Fixed screen bugs
146
14797/11/11 Window resizing in X (thanks to Egmont)
14897/11/11 Fixed FocusIn/FocusOut bug (twm, olwm, ...)
14997/11/11 Small changes and bugfixes
150
15197/11/09 Sound on SUN (sample rate 16000, but 8000 is coming for older
152 SUNs.
153
15497/10/26 'Interrupted system call' is not an error on sound device
15597/10/26 Fixed screen scramble bug in console background running
156
15797/10/20 Version 0.90pre1 released
158
15997/10/20 Tested on the following Machines/Operating systems/Compilers:
160 o Intel/Linux/gcc (assembly)
161 o Sparc/Solaris/gcc (C)
162 o Alpha/OSF1/cc (C)
163 o Sequent(i486)/Dynix-Ptx/gcc (assembly)
164
16597/10/20 Automatic configuration with 'configure' script
16697/10/20 Bugfixes and cleanups
16797/10/20 Experimental DOS support with DJGPP (timer missing)
16897/10/20 Added emulation in C
16997/05/22 Background running for svgalib added (Needs svgalib >= 1.2.11)
170
17197/04/17 Version 0.84 released
172===============================
173
17497/04/17 Added SLL to the emulated instructions
175
17697/04/12 The following changes were inspired by Egmont Koblinger:
177 - Resize bug fixed
178 - Implemented tape file pause
179 - Implemented saving to tape file
180 - Snapshot loading from command line
181 - Other small changes
182
18397/04/03 Bug fix in tape handling (thanks to Egmont Koblinger)
18497/03/26 Speeded up border drawing in X
18597/03/26 Added .TAP support
186
18797/03/10 Version 0.81 released
188===============================
189
19097/03/10 Bug fixes and minor changes (thanks to Tamas Meszaros)
191
19297/01/21 Version 0.8: First public release
193===========================================
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 @@
1# __________ __ ___.
2# Open \______ \ ____ ____ | | _\_ |__ _______ ___
3# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
4# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
5# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
6# \/ \/ \/ \/ \/
7#
8
9INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \
10 -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR) -I. $(TARGET_INC)
11CFLAGS = $(INCLUDES) $(GCCOPTS) -O2 $(TARGET) $(EXTRA_DEFINES) \
12 -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN
13
14
15ifdef APPEXTRA
16 INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA)))
17endif
18
19LINKFILE := $(OBJDIR)/link.lds
20DEPFILE = $(OBJDIR)/dep-zxbox
21
22# This sets up 'SRC' based on the files mentioned in SOURCES
23include $(TOOLSDIR)/makesrc.inc
24
25SOURCES = $(SRC)
26OBJS2 := $(SRC:%.c=$(OBJDIR)/%.o)
27OBJS = $(patsubst %.S, $(OBJDIR)/%.o, $(OBJS2))
28DIRS = .
29
30ifndef SIMVER
31ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
32 LDS := archos.lds
33 OUTPUT = $(OUTDIR)/zxbox.ovl
34else ## iRiver/iPod/... targets
35 LDS := ../plugin.lds
36 OUTPUT = $(OUTDIR)/zxbox.rock
37endif
38else ## simulators
39 OUTPUT = $(OUTDIR)/zxbox.rock
40endif
41
42all: $(OUTPUT)
43
44ifndef SIMVER
45$(OBJDIR)/zxbox.elf: $(OBJS) $(LINKFILE)
46 @echo "LD "`basename $@`
47 @$(CC) $(GCCOPTS) -O -nostdlib -o $@ $(OBJS) -L$(BUILDDIR) -lplugin -lgcc \
48 -T$(LINKFILE) -Wl,-Map,$(OBJDIR)/zxbox.map
49
50$(OUTPUT): $(OBJDIR)/zxbox.elf
51 @echo "OBJCOPY "`basename $@`
52 @$(OC) -O binary $< $@
53else
54
55ifeq ($(SIMVER), sdl)
56###################################################
57# This is the SDL simulator version
58
59$(OUTPUT): $(OBJS)
60 @echo "LD $<"
61 @$(CC) $(CFLAGS) -shared $(OBJS) -L$(BUILDDIR) -lplugin -o $@
62ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
63# 'x' must be kept or you'll have "Win32 error 5"
64# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
65# #define ERROR_ACCESS_DENIED 5L
66else
67 @chmod -x $@
68endif
69
70endif
71endif # end of simulator section
72
73
74include $(TOOLSDIR)/make.inc
75
76# MEMORYSIZE should be passed on to this makefile with the chosen memory size
77# given in number of MB
78$(LINKFILE): $(LDS)
79 @echo "build "`basename $@`
80 @cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) \
81 $(DEFINES) -E -P - >$@
82
83clean:
84 @echo "cleaning zxbox"
85 @rm -rf $(OBJDIR)/zxbox
86 @rm -f $(OBJDIR)/zxbox.* $(DEPFILE)
87
88-include $(DEPFILE)
89
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 @@
1
2 * * * * * * * * * * * * * * *
3 * *
4 * S P E C T E M U *
5 * *
6 * Version 0.94 *
7 * *
8 * * * * * * * * * * * * * * *
9
10
11This package contains a 48k ZX-Spectrum emulator for Linux and other
12UNIX operating systems, with full Z80 instruction set, comprehensive
13screen, sound and tape emulation, and snapshot file saving and
14loading. It can run on a Linux console, or in an X11 window.
15
16The program is free software and is copyrighted under the GNU General
17Public License. It comes with absolutely no warranty. See the file
18COPYING for details.
19
20Written by Miklos Szeredi
21Email: mszeredi@inf.bme.hu
22
23It can be downloaded by FTP from:
24 tsx-11.mit.edu:/pub/linux/ALPHA/spectemu/spectemu-0.94.tar.gz
25or
26 sunsite.unc.edu:/pub/Linux/system/emulators/zx/spectemu-0.94.tar.gz
27
28For news and updates have a look at the Spectemu Page:
29 http://www.inf.bme.hu/~mszeredi/spectemu/
30
31
32You can also join a mailing list (at the Spectemu Page), to receive a
33notice when new versions of spectemu are available.
34
35
36Table of contents
37=================
38
39 1. Requirements
40
41 2. Recommended
42
43 3. Features
44
45 4. Drawbacks
46
47 5. Compiling and installation
48
49 6. Using the emulator
50
51 6.1 Command line arguments and configuration files (NEW)
52
53 6.2 Using the Spectrum keyboard
54
55 6.3 Keys that control the emulator
56
57 6.4 Effects of changing frame frequency and sound buffer size
58
59 7. Where can I get ZX Spectrum games for this emulator
60
61 8. Tape files
62
63 8.1 Loading a tape file
64
65 8.2 Quick loading of tape files
66
67 8.3 Saving to a tape file
68
69 8.4 Saving a tape file to real tape
70
71 8.5 Making a tape file from a real tape
72
73 9. Bug reports
74
75 10. Credits
76
77
781. Requirements
79===============
80
81Linux or other UNIX OS.
82Color X11 server (depths 8, 16 and 32 bits are supported)
83 and/or
84SVGALIB console graphics library on Linux.
85
862. Recommended
87==============
88
89A sound-card on Linux for wonderful spectrum 1-bit sound. And well, a
90fast enough processor... (Especially for the X11 version.)
91
923. Features
93===========
94
95 - Very fast because of assembly code in emulation (only on Intel
96 processors).
97
98 - Emulation also in C, which is slower, but supports any processor.
99
100 - X support (with MITSHM if available, optionally double size window)
101
102 - Linux console graphics (with SVGALIB)
103
104 - Sound support (through Linux kernel sound-card driver,
105 or SUN sound drivers)
106
107 - Snapshot saving and loading (.Z80 and .SNA format)
108
109 - Tape emulation: loading from tape files (.TAP and .TZX format)
110
111 - Optional quick loading of tapes.
112
113 - Saving to tape files.
114
115 - Separate utility to save tape files to real tape
116
117 - Configurable with config files and from command line
118
1194. Drawbacks
120============
121
122 - Poor user interface
123
124See the file TODO for a list of things which still need to be done (Maybe
125by YOU)
126
1275. Compiling and installation
128=============================
129
130To install the precompiled Linux executables just run 'make install'
131as root.
132
133To recompile the programs on other platforms first type
134
135 ./configure
136
137This tries to determine the system type and parameters. Probably you
138won't have to give any options to configure, but here is the list of
139the most important options:
140
141 --help Print a full list of options
142
143 --prefix=PREFIX Install files under PREFIX (default is /usr/local)
144 Executables go under PREFIX/bin, ...
145
146 --without-readline Do not use the readline library (default is to
147 use it if it's available on your system)
148
149 --without-i386asm Do not use the Intel assembly code (default is
150 to use it, if your system is Intel based)
151
152You may want to have a look at the produced `Makefile' and `config.h'.
153Then just type
154
155 make clean
156 make
157
158Then to install the program, login as root, and run
159
160 make install
161
162(If you want to compile on another machine be sure to `make realclean'
163before re-configuring and re-making the program!)
164
165At the moment, there are two executable programs for running the emulator:
166
167 xspect the X11 version
168 vgaspect the Linux console version
169
170'vgaspect' uses the SVGALIB library. If you do not have this installed
171on your system 'vgaspect' cannot be started. You _MUST_ have SVGALIB
172version 1.2.10 or greater installed, and it is STRONGLY recommended,
173that you get version 1.2.11 or later!
174
175SVGALIB is available at:
176sunsite.unc.edu:/pub/Linux/libs/graphics/
177
178If you have SVGALIB version 1.2.11 or later, the emulator can run in
179background when you switch virtual consoles.
180
1816. Using the emulator
182=====================
183
184After starting 'xspect' or 'vgaspect' you should get the '(C) 1982 Sinclair
185Research Ltd' message, and after pressing a key, the flashing cursor. If
186not, then all I can say, is hard luck to you (if you are ambitious, compile
187the programs with debug information, and try to figure out what is causing
188the problem). Do not start the emulator processes in the background, the
189terminal is needed when loading or saving files.
190
191To load a snapshot immediately after the start of the emulator, you
192can enter the name of the snapshot file on the command line. (Also see
193section 6.1)
194
195E.g.
196
197xspect snap/chuckie2
198
199In X you can resize the window. Window size can only be a multiple of
200the smallest window size (320x256). Smaller window means faster
201emulation, so if emulation doesn't run at full speed, try making the
202window smaller.
203
2046.1 Command line arguments and configuration files
205--------------------------------------------------
206
207You can give options to Spectemu in three different ways:
208
209 1) In a configuration file (either ~/.spectemurc, or
210 /usr/local/share/spectemu/spectemu.cfg)
211
212 2) With the X Resource Database (.Xdefaults), this applies only to 'xspect'
213
214 3) On the command line
215
216Most of the options are common to all three methods, only the syntax
217differs slightly. Here are examples of the different syntax:
218
219Config File:
220 scale = 1
221 private-map = true
222 sound = false
223 color-type = grayscale
224
225.Xdefaults:
226 xspect.scale: 1
227 xspect.privateMap: true
228 xspect.sound: false
229 xspect.colorType: grayscale
230
231Command line:
232 xspect -scale 1 -private-map -no-sound -color-type grayscale
233
234List of common options:
235~~~~~~~~~~~~~~~~~~~~~~~
236
237 NAME RANGE DEFAULT DESCRIPTION
238 ---- ----- ------- -----------
239
240 frame-skip 1... 2 The smaller this is, the more
241 often the screen is updatated
242
243 scale 1..4 2 Window size of 'xspect'
244
245 private-map yes/no no Use private colormap in 'xspect'
246
247 mit-shm yes/no yes Use MIT-SHM extension in X server
248 if available
249
250 vga-mode 320x200 320x240 Resolution to use in 'vgaspect',
251 320x240 320x200 is faster (but not so nice)
252
253 sound yes/no yes Spectrum sound, if availble
254
255 sound-delay 1... 4 The amount of frames (1/50 seconds)
256 to delay sound. See section 6.4
257
258 sound-device filename (system The name of the sound device
259 dependent)
260
261 sound-sample-rate 4000... ~15625 Sample rate of sound device
262
263 sound-autoclose yes/no yes Whether to close sound device when
264 unused (so other programs can use it)
265
266 sound-dsp-setfrag yes/no yes Set this to 'no' if you use PCSND
267 sound driver
268
269 keyboard-type extended extended Specifies the mapping of the keys,
270 spectrum from the PC keyboard to the spectrum
271 compat keys. See section 6.2
272 custom
273
274 cursor-type shifted shifted How to use the arrow keys on the
275 raw PC keyboard. See section 6.2
276 joystick
277
278 allow-ascii yes/no yes Interpret other keys on the PC
279 keyboard. See section 6.2
280
281 true-shift <modif>* alt Modifier to get shifted symbol
282 as on the PC.
283
284 func_shift <modif>* control Modifier to get control functions.
285
286 color-type normal normal What type of colors to use. Gray-
287 grayscale scale looks better on monochrome
288 custom displays.
289
290 pause-on-iconify yes/no no Whether to pause emulator, when it
291 is iconified ('xspect' only)
292
293 vga-pause-bg yes/no no Whether to pasue emulator, when you
294 switch to a different console
295
296 quick-load yes/no no Use built in (quick) loader for
297 tapefiles.
298
299 auto-stop yes/no no Pause tape after each segment when
300 quick loading.
301
302 load-immed yes/no no Load tapefile immediately (as if
303 you typed LOAD "" / ENTER)
304
305 pause yes/no no Pause the emulator on startup
306
307
308* <modif> can be one of: none, shift, lock, control, alt,
309 mod2, mod3, mod4, mod5
310
311Extra command line parameters:
312~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
313
314On the command line you may also use the following options:
315
316 -help Prints usage information, and a list of available
317 options
318
319 -version Prints out the version
320
321
322Also on the command line, a snapshot file and/or a tapefile can be
323specified. Spectemu figures out the type of file from the extension.
324You can omit the extension, e.g. you have a snapshot file 'snap.z80'
325and you start spectemu with 'xspect snap', then it will add the '.z80'
326extension.
327
328You can specify what type is the file by preceding it with one of
329'-z80', '-sna', '-tap' or '-tzx' options. This is useful for cases,
330when the filename does not have an extension (e.g. automatic starting
331with the midnight commander).
332
333Extra config file options:
334~~~~~~~~~~~~~~~~~~~~~~~~~~
335
336Color configuration
337'''''''''''''''''''
338You can configure the custom colors in the config files (and the X
339Resource Database) with:
340
341 color[0..15] = R G B
342
343e.g.
344
345 color-type = custom
346
347 color0 = 10 20 30
348 color7 = 40 50 60
349
350changes the 0-th (black) and the 7-th (white) colors.
351
352Keyboard configuration
353''''''''''''''''''''''
354You can set custom key bindings in the config file:
355
356 Key_<keysym_name> = K ...
357 ...
358
359Or in the X resource database:
360
361 xspect.keys: <keysym_name> = K ...; ...
362
363
364The <keysym_name> can be set to any keysym (defined in 'spkey_p.h').
365The K arguments are the spectrum keys to be assigned to the given PC
366key. K can be any letter, number (a..z, 0..9) or the following:
367
368 none, space, enter, capsshift, symbolshift,
369 kempston_up, kempston_down, kempston_left, kempston_right, kempston_fire
370
371e.g.
372
373 keyboard-type = custom
374 true-shift = none
375
376 Key_Insert = capsshift 9
377 Key_Tab = capsshift symbolshift
378 Key_Shift_R = kempston_fire
379 Key_Alt_L = symbolshift
380 Key_Alt_R = symbolshift
381
382or as it would appear in a .Xdefaults file:
383
384 xspect.keyboardType: custom
385 xspect.trueShift: none
386
387 xspect.keys: Insert = capsshift 9; \
388 Tab = capsshift symbolshift; \
389 Shift_R = kempston_fire; \
390 Alt_L = symbolshift; Alt_R = symbolshift
391
3926.2 Using the Spectrum keyboard
393-------------------------------
394
395Those of you that have at some time used a Spectrum know, that the keyboard
396of this little computer is something very strange, with a LOT of keywords
397and symbols on and around each key. If you have not seen this keyboard (or
398have somehow managed to forget some bit of information that is on it) we
399produced quite a good copy of it, found in the 'spectkey.gif' file.
400
401If you are using 'xspect' than pressing 'Ctrl-k' brings up the picture
402of the spectrum keyboard. You can press keys with the mouse (even more
403than one if you like), and it also shows which keys are pressed. (You
404can see what the emulator does when, for example you press 'BackSpace'
405or a '[' key on the PC keyboard).
406
407The default mapping of the spectrum's keyboard to the PC's is the
408following:
409
410The numbers, the letters, Enter and Space are the same. The left Shift on
411the PC corresponds to the CAPS SHIFT key of the Spectrum, and the right
412Shift corresponds to the SYMBOL SHIFT. This is quite simple and with these
413keys you can get all the functionality of the original Spectrum (assuming
414of course, you know how).
415
416But...
417
418To make life a bit easier, you can also use the Backspace, the arrow
419keys, and the following symbols as on a PC keyboard: ,./;'-=<>?:"_+[]{}\|~
420(unless you turn the 'allow-ascii' option off)
421
422To get a symbol which is written above the numbers on the PC, and not
423the function or symbol that is on the Spectrum, press Alt (actually
424the value of the 'true-shift' option) instead of Shift.
425
426You can slightly modify the mapping with the 'keyboard-type' and
427'cursor-type' options. Every mapping includes the basic keys (letters,
428numbers, Space and Enter). Here are the mappings special to each
429keyboard type and cursor type:
430
431 PC Key Spectrum Key
432 ------ ------------
433
434(Keyboard Types)
435
436extended: (default)
437 Left Shift -> Caps Shift
438 Right Shift -> Symbol Shift
439 Back Space -> Caps Shift + '0'
440 Escape -> Caps Shift + '1'
441
442spectrum: (spectrum-like layout, useful for some games, e.g. Jumping Jack)
443 < same as extended, plus: >
444 Comma (,) -> Symbol Shift
445 Period (.) -> Space
446 Semicolon (;) -> Enter
447
448compat: (similar to other emulators' layouts, e.g. Z80, X128, XZX ...)
449 Shift (both) -> Caps Shift
450 Alt -> Symbol Shift
451 Back Space -> Caps Shift + '0'
452 Escape -> Caps Shift + '1'
453
454custom:
455 Use key bindings specified in the config file (see section 6.1)
456
457(Cursor Types)
458
459shifted: (default)
460 Left Arrow -> Caps Shift + '5'
461 Down Arrow -> Caps Shift + '6'
462 Up Arrow -> Caps Shift + '7'
463 Right Arrow -> Caps Shift + '8'
464
465raw:
466 Left Arrow -> '5'
467 Down Arrow -> '6'
468 Up Arrow -> '7'
469 Right Arrow -> '8'
470
471
472joystick:
473 Left Arrow -> Kempston Left
474 Down Arrow -> Kempston Down
475 Up Arrow -> Kempston Up
476 Right Arrow -> Kempston Right
477 Keypad Ins -> Kempston Fire
478 Keypad Del -> Kempston Fire
479 Keypad Home -> Kempston Up + Left
480 Keypad PgUp -> Kempston Up + Right
481 Keypad End -> Kempston Down + Left
482 Keypad PgDn -> Kempston Down + Right
483
484
4856.3 Keys that control the emulator
486----------------------------------
487
488All control keys are produced by pressing the Ctrl key and another key.
489
490 Ctrl-c, F10 Quit the emulator immediately
491
492 Ctrl-l, F3 Load a snapshot file; you must type the path and
493 filename on the terminal where you started the emulator,
494 e.g. 'snap/chuckie2'. The type and extension of the
495 file is determined automatically (.z80 or .sna).
496
497 Ctrl-t, F2 Save the current state of the emulator in a snapshot file.
498 Format depends on the extension (.z80 or .sna). If no
499 extension is given, .z80 is appended.
500
501 Ctrl-w, Ctrl-F2 Save a snapshot to a temporary file
502
503 Ctrl-e, Ctrl-F3 Restore last temporary snapshot saved with 'Ctrl-w'
504
505 Ctrl-q, F5 Reset the Spectrum
506
507 Ctrl-f Fast mode
508
509 Ctrl-n Normal speed mode
510
511 Ctrl-b Pause/Unpause emulator (you can do operations like loading
512 a snapshot file, etc... in paused mode too)
513
514 Ctrl-m Toggle sound on/off
515
516 Ctrl-h, F1 Print help
517
518 Ctrl-k Display (undisplay) keyboard of spectrum. See section 6.2.
519
520 Ctrl-p, F4 Play tape. Tape file must be entered on the terminal.
521 Optionally the starting segment can be entered;
522 e.g. 'tape/tape1.tap' or 'tape/tape1.tzx 13'
523
524 Ctrl-s, F7 Stop tape
525
526 Ctrl-y Toggle quick loading
527
528 Ctrl-o, F6 Pause and unpause during tapefile playing (restarts the
529 current segment).
530
531 Ctrl-r Record to tape file. See section 8.3.
532
533 Ctrl-\, F9 Refresh screen, reset keyboard state and
534 refresh colors.
535
536 Ctrl-j Toggle private colormap mode (only X)
537
538 Ctrl-comma Decrease window size (only X)
539
540 Ctrl-dot Increase window size (only X)
541
542 Ctrl-equals Skip more screen frames
543
544 Ctrl-minus Skip less screen frames
545
546 Ctrl-] Increase sound buffer size
547
548 Ctrl-[ Decrease sound buffer size
549
550
5516.4 Effects of changing frame frequency and sound buffer size
552-------------------------------------------------------------
553
554ONLY READ THIS IF YOU ARE NOT TOTALLY SATISFIED WITH THE EMULATOR'S
555PERFORMANCE
556
557This should be totally automatic, so I'm now programming you to do what
558the emulator should. (Luckily you are much easier to program)
559
560Frame skipping determines, after how many frames the emulator displays one
561on the screen. There are 50 frames in one second, and normally every other
562frame is displayed (25 per second). If the emulator is too slow under X,
563increasing frame skipping can have a good effect on performance, but at the
564cost of poorer quality. But the interesting thing is, that increasing frame
565skipping may cause a worsening of both performance and of picture quality
566(I will not explain it here why).
567
568Decreasing frame skipping has the opposite effect of the above.
569
570If the emulator uses sound, but sound is not continuous, then experiment
571with increasing sound buffer size, and increasing frame skipping. If you
572are lucky you can make things a bit better. Increasing sound buffer size
573has also the negative effect of delaying more the sound effects.
574
5757. Where can I get ZX Spectrum games for this emulator
576======================================================
577
578On the Spectemu homepage (http://www.inf.bme.hu/~mszeredi/spectemu/)
579you can find a list of sites worth checking. Here are some:
580
581http://www.void.demon.nl/spectrum.html
582http://www.nvg.unit.no/sinclair/planet/
583
584The fact is, that there were a lot of Spectrum games around on audio tapes,
585and some of them are really good. There were always cracked and copyable
586versions around, and nobody was interested in copyrights. Unfortunately the
587big FTP archives do not allow non free software on their servers, so I
588can't include any games in this distribution.
589
590(Because Spectrums have died out, and perhaps some of the software
591companies do not exist any more, probably some games could be distributed
592freely. But I will not check on those things.)
593
594I've included a program named 'spconv', written by Henk de Groot
595(hegr@ensae.ericsson.se) which can convert between snapshot file formats.
596
597Alternatively if you have some old spectrum tapes laying around, and you
598are very brave, you can check out section 8.5.
599
6008. Tape files
601=============
602
6038.1 Loading a tape file
604-----------------------
605
606The emulator now supports G.A. Lunter's .TAP and Tomaz Kac's .TZX tape
607files. To load a file, enter
608
609LOAD ""
610
611to the spectrum (by pressing keys j""), then press 'Ctrl-p'.
612On the terminal enter the name of the tape file to load, e.g.
613
614tape/cnamemat
615
616The emulator will now load from the tape file 'tape/cnamemat.tzx' or
617'tape/cnamemat.tap' whichever exists. Playing automatically stops at
618the end of the tape file. To stop loading before this press Ctrl-s.
619
620The default extensions are '.tap' / '.tzx' or '.TAP' / '.TZX' depending
621on whether the entered tape file is upper or lower case.
622
623While loading try pressing Ctrl-f, which can speed things up. After loading
624the file press press Ctrl-n to restore normal speed.
625
6268.2 Quick loading of tape files
627-------------------------------
628
629Quick loading means bypassing of the tape loading routine in the
630spectrum ROM, and loading of tape blocks directly into the memory.
631Some programs use their own tape loading routines, and in that case
632the tape blocks are always "slow loaded" (see above section).
633
634Quick loading is optional and can be toggled with the 'Ctrl-y' key.
635
636When quick loading is on, after entering 'LOAD ""' you are immediately
637prompted for a tapefile. If the tapefile can't be loaded, the quick
638loading of the first header block is cancelled, but you can still load
639the rest of tape by pressing 'Ctrl-p' and entering the tapefile name.
640
641Even in quick load mode, the playing of tapes is not automatically
642paused, when the program doesn't load more blocks, so with '.tap'
643files containing multipart games, you have to pause the tape at the
644end of each part with 'Ctrl-o' ('.tzx' tapefiles can contain a
645"Stop the Tape" mark, to automatically pause playing).
646
6478.3 Saving to a tape file
648-------------------------
649
650If you want to save something to a tape file using the spectrum's "SAVE"
651command, do the following:
652
6531) Enter 'SAVE "file"' on the spectrum
6542) press Ctrl-r to start the recording
6553) on the terminal enter the name of the tapefile to use
6564) press a key on the spectrum
6575) wait for the recording to stop
6586) press Ctrl-s to stop recording
659
660If the specified tape file already exists, the newly saved segments are
661appended to the old tapefile.
662
663
6648.4 Saving a tape file to real tape
665-----------------------------------
666
667The utility 'tapeout' enables you to save tape files (.tap and .tzx)
668to real tape via the soundcard. At the moment it only works on Linux,
669because it uses the OSS sound driver. (You can compile it for non
670linux systems, by adding -DNO_SOUNDCARD to CFLAGS in Makefile. Then
671instead of writing to the sound device, the program writes to a
672headerless wav file (bits: 8, sample rate: what you've given).)
673
674You can compile 'tapeout' by entering
675
676 make tapeout
677
678in the main directory of spectemu. The command line parameters are:
679
680 tapeout sample_rate tapefile [start_block [output_file]]
681
682The default value for start_block is 0, for output_file it is "/dev/dsp"
683(or if compiled -DNO_SOUNDCARD it is "tape.out").
684
685You can stop recording to the tape by pressing Ctrl-C.
686
6878.5 Making a tape file from a real tape
688---------------------------------------
689
690WARNING, ONLY TRY THIS IF YOU REALLY-REALLY WANT TO!
691
692Well it's not so bad as that, I've digitized a lot Spectrum tapes with
693ease, but I have the advantage of having played with tapes a lot on the
694real Spectrum, and of being able to modify the code which does the
695digitization.
696
697First of all you must have a sound-card to do this. If you've got it, then
698you have a small chance of succeeding.
699
700First get the cassette player which you used to play Spectrum tapes. Then
701plug it in your sound-card's 'line-in' or 'mic' inputs. Then somehow set the
702sound driver so that it reads things form the input in which you plugged
703your cassette (I use 'xmmix' the 'Motif Audio Mixer' to do this). And if
704you've managed to get this far, go to the directory where you want to store
705the tape files (remember, there will be a lot of little files: one for each
706little segment!), and enter the following command:
707
708 recs - 32000 | filt | spload tapefile
709
710 or
711
712 recs - 32000 | spload tapefile
713
714(The first type worked better for me)
715
716Where 'recs', 'filt' and 'spload' are programs found in the utils
717directory, and 'tapefile' is the name of the tape file without the '.spt'
718extension.
719
720'.spt' tape files only exist because of historical reasons (the tape
721digitizing program preceeded the emulator, and also at that time I didn't
722know of the '.TAP' format), and now it isn't suppurted by the emulator
723any more. So you must convert '.spt' files to '.tap' with the utility
724spt2tap (in the utils directory) to use it with the emulator.
725
726(The contents of the utils directory can be remade by changing to that
727directory and entering the command: 'make realclean; make')
728
729Now you can put your favorite Spectrum cassette in the cassette player, and
730press the Play button.
731
732'spload' will write a lot of information on the terminal, of which you
733might try to make some sense. Also you can do a 'tail -f tapefile.spt' in
734another terminal, to see what is happening. Again if nothing happens, then
735you are on your own (and most probably at first nothing will happen).
736
737And remember that this digitizer is not better than the real Spectrum, so
738if you cannot load a program with a Spectrum, you'll most probably will not
739be able to load it with 'spload'.
740
741Good Luck!
742
7439. Bug reports
744==============
745
746Please send bug reports to:
747
748mszeredi@inf.bme.hu
749
750If you make any changes to the source, please mail me the 'diff -u' of the
751file(s) changed, and also why were the changes needed.
752
753Please also tell me if you would like to maintain, or to continue
754developing spectemu.
755
75610. Credits
757===========
758
759Szeredi Tamas, for testing the emulator, and for helping with the
760'spectkey.gif'.
761
762Egmont Koblinger for helping to write some parts of the emulator, and for
763a lot of useful suggestions.
764
765Dani Nagy and Zsazsa for helping to test the emulator.
766
767G.A. Lunter for a very good description of the Spectrum, the undocumented
768features of Z80, and the '.z80' snapshot file format.
769
770And 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 @@
1Spectemu is now basically usable under DOS.
2
3Still missing:
4
51) Sound
62) Decent GUI
7
8How to compile:
9---------------
10
11- You will need DJGPP version 2, libkb, and the allegro game library.
12 You can get these at:
13
14To get DJGPP, read:
15 ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/00README.TXT
16
17Libkb is at:
18 ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2tk/libkb100.zip
19
20Allegro is at:
21 ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2tk/allegro/alleg30.zip
22
23
24- Not all files are needed (no long named files are needed, you can
25 try to get rid of them, but they cause no harm)
26
27- copy 'Makefile.dos' to 'Makefile', and 'config.dos' to 'config.h'
28
29- type 'make'
30
31It should compile without warnings. To start it, enter 'vgaspect'.
32
33See 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 @@
1This file describes how to use the Z80 processor emulation as a
2standalone module (without the ZX Spectrum emulation).
3
4===========================================================================
5You will need the following files:
6
7For the 'intel x86' assembly version:
8-------------------------------------
9
10z80.c z80.h z80_type.h i386step.S i386def.S i386op1.S i386op1x.S
11i386op2.S i386op2x.S i386op3.S i386op3x.S i386op4.S i386op5.S i386op6.S
12sp_to_s.c
13
14For the 'C' version:
15--------------------
16
17z80.c z80.h z80_type.h z80_step.c z80_def.h z80_ari.h z80optab.c z80optab.h
18z80_op1.c z80_op1x.c z80_op1.h z80_op2.c z80_op2x.c z80_op2.h
19z80_op3.c z80_op3x.c z80_op3.h z80_op4.c z80_op4x.c z80_op4.h
20z80_op5.c z80_op5.h z80_op6.c z80_op6.h
21
22===========================================================================
23Makefile rules:
24
25For the 'intel x86' assembly version:
26-------------------------------------
27
28CC = gcc
29AR = ar
30CPPFLAGS =
31CFLAGS = -Wall -O3
32CPP = $(CC) -E
33
34z80_i386_objs = z80.o i386emul.o
35
36libz80.a: $(z80_i386_objs)
37 $(AR) cr libz80.a $(z80_i386_objs)
38
39i386emul.o: i386emul.s
40 $(CC) -c $(CFLAGS) i386emul.s
41
42i386emul.s: i386emul.sp sp_to_s
43 ./sp_to_s < i386emul.sp > i386emul.s
44
45i386emul.sp: i386step.S
46 $(CPP) $(CPPFLAGS) i386step.S > i386emul.sp
47
48sp_to_s: sp_to_s.o
49 $(CC) -o sp_to_s $(LDFLAGS) sp_to_s.o
50
51.SUFFIXES:
52.SUFFIXES: .c .o
53
54.c.o:
55 $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
56
57
58For 'C' version:
59----------------
60
61CC = gcc
62AR = ar
63CPPFLAGS = -DZ80C
64CFLAGS = -Wall -O3 -fomit-frame-pointer -funroll-loops
65
66z80_c_objs = z80.o z80_step.o z80optab.o z80_op1.o z80_op2.o z80_op3.o \
67 z80_op4.o z80_op5.o z80_op6.o
68
69libz80.a: $(z80_c_objs)
70 $(AR) cr libz80.a $(z80_c_objs)
71
72.SUFFIXES:
73.SUFFIXES: .c .o
74
75.c.o:
76 $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
77
78===========================================================================
79The following functions are defined by libz80.a:
80
81void z80_init()
82---------------
83
84This function initializes the processor emulation. This must be called
85only once at the beginning of the program.
86
87int z80_step(int ticknum)
88-------------------------
89
90This function executes z80 instructions for 'ticknum' number of clock
91cycles. It returns the remaining number of ticks.
92
93NOTE: the remaining number of ticks is always zero or negative,
94meaning that exactly, or more than the given 'ticknum' clock cycles
95were executed. This is because WHOLE instructions are executed at a
96time.
97
98NOTE: HALT, LDDR, etc... do not count as one instruction, but as a
99series of instructions (e.g. HALT is a series of NOPs).
100
101void z80_reset()
102----------------
103
104This function resets the Z80 processor. This has the same effect as
105applying a pulse to the RESET input of the processor.
106
107NOTE: z80_init() does not reset the Z80, z80_reset() should be called
108after it.
109
110void z80_interrupt(int data)
111-----------------------------
112
113Causes a Maskable Interrupt. Interrupt mode 1 and 2 are emulated
114correctly, in interrupt mode 2 'data' is used in the address
115calculation. In interrupt mode 0, it is assumed (as on the ZX
116Spectrum) that 0xFF is on the data bus, and always RST 38 is
117generated.
118
119NOTE: It is not emulated, that in the instruction after EI no
120interrupt can be generated.
121
122void z80_nmi()
123--------------
124
125Causes a Non Maskable Interrupt.
126
127===========================================================================
128Accessing the memory, the I/O ports and the Z80 processor's state
129(i.e. registers, etc...)
130
131To use the functions above and the variables below, include the
132"z80.h" include file.
133
134Memory
135------
136
137The memory is stored in the z80_proc.mem[] byte array, which has a
138size of 65536. By default it is all RAM. To make parts of it read
139only, you have to redefine the appropriate macros in i386step.S and/or
140z80_def.h. (These macros are sorounded by #ifdef SPECT_MEM, #else,
141#endif statements.)
142
143The memory is initialised to random data. You must fill it in before
144starting the emulation, but AFTER the call to z80_init().
145
146I/O
147---
148
149The input port values are stored in z80_inports[] array, which has a
150size of 256. The IN instruction will use the appropriate element of
151this array. This array is initialised to all zeroes.
152
153The output port values can be queried from the z80_outports[] array,
154which has also a size of 256. The OUT instruction will store the value
155in the element addressed by the instruction.
156
157If you need more complex behaviour of the I/O, you must redefine the
158appropriate macros in i386step.S and z80_def.h.
159
160Processor state
161---------------
162
163You can access the processor's state with the following variables and
164macros defined in "z80.h".
165
166Registers:
167
168Double registers:
169 normal: BC, DE, HL, AF, IR, IX, IY, PC, SP,
170 aux: BCBK, DEBK, HLBK, AFBK
171
172Single registers:
173 RB, RC, RD, RE, RH, RL, RA, RF, RI, RR, XH, XL, YH, YL, PCH, PCL, SPH, SPL
174
175Misc state:
176 z80_proc.haltstate (1: processor is in halt mode, 0: processor is runnig)
177 z80_proc.it_mode (interrupt mode 0, 1 or 2)
178 z80_proc.iff1 (interrupt flip-flop 1)
179 z80_proc.iff2 (interrupt flip-flop 2)
180
181You need not access the other parts of z80_proc, they are meaningless
182outside 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 @@
1compr.c
2helpers.c
3interf.c
4keynames.c
5loadim.c
6misc.c
7rom_imag.c
8snapshot.c
9spconf.c
10spect.c
11spectkey.c
12spkey.c
13spmain.c
14spperif.c
15spscr.c
16spsound.c
17sptape.c
18sptiming.c
19tapefile.c
20z80.c
21z80_op1.c
22z80_op2.c
23z80_op3.c
24z80_op4.c
25z80_op5.c
26z80_op6.c
27z80_step.c
28z80optab.c
29zxbox.c
30zxbox_keyb.c
31zxvid_16bpp.c
32zxvid_4bpp.c
33zxvid_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 @@
1
2/* Define this on i386 architectures if the C compiler generates symbols
3 beginning with underscores, eg. on old aout versions of Linux */
4#undef AOUT_FORMAT
5
6/* Define this to enable running in background on the Linux console.
7 Works only with SVGALIB 1.2.11 or newer */
8#undef RUN_IN_BACKGROUND
9
10/* Define this if Xlib has the MITSHM extension */
11#undef HAVE_MITSHM
12
13/* Define this if program can query MITSHM extension */
14#undef HAVE_SHMQUERY
15
16/* Define this if you have the readline library */
17#undef HAVE_READLINE
18
19/* Define this to use the C version of the program insead of the
20 i386 assembly. Define this on non intel machines */
21#undef Z80C
22
23/* Always define this for the spectrum emulator. */
24#undef SPECT_MEM
25
26/* Define if sound driver is available. */
27#undef HAVE_SOUND
28
29/* Define if sound driver is Open Sound System (OSS) */
30#undef OSS_SOUND
31
32/* Define if sound driver is SUN */
33#undef SUN_SOUND
34
35/* Define this to use the inline intel assembly sections */
36#undef I386_ASM
37
38/* Define this to use an alternative way of passing the z80 processor
39 data to the z80 instruction emulation functions. May make emulation
40 faster on some machines, but not on intel, and sparc. */
41#undef PROCP
42
43@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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* akey.h
22 *
23 * Header of the AKEY module
24 *
25 * Keyboard handeling routines and key identification labels
26 *
27 * Created: 92/12/01 Szeredi Miklos
28 */
29
30
31#ifndef _AKEY_H
32#define _AKEY_H
33
34
35#define NOKEY -1
36#define UNKNOWNKEY -2
37#define ERRKEY -3
38#define MOUSEKEY -256
39
40#define UPKEY (256 + 1)
41#define DOWNKEY (256 + 2)
42#define RIGHTKEY (256 + 3)
43#define LEFTKEY (256 + 4)
44#define INSKEY (256 + 5)
45#define DELKEY (256 + 6)
46#define HOMEKEY (256 + 7)
47#define ENDKEY (256 + 8)
48#define PUKEY (256 + 9)
49#define PDKEY (256 + 10)
50#define BSKEY (256 + 16)
51
52#define FKEYOFFS (256 + 128)
53#define FKEYFIRST (FKEYOFFS + 1)
54#define FKEYLAST (FKEYOFFS + 12)
55#define FKEY(num) (FKEYOFFS + num)
56
57#define ALTKEY (1 << 11)
58#define CTRKEY (1 << 10)
59#define SHKEY (1 << 9)
60
61#define BKTABKEY (TABKEY | SHKEY)
62
63#define CTL(ch) ((ch) - 96)
64#define META(ch) ((ch) | ALTKEY)
65
66#define TABKEY 9
67#define LFKEY 13
68#define CRKEY 10
69#define ENTERKEY LFKEY
70#define ESCKEY 27
71
72#define lastakey() __lastakey
73#define waitakey() ((void)readakey())
74#define setakey(key) ((void)(__lastakey = (key)))
75#define setakeydo(todo) (__atodo = (todo))
76
77
78typedef int keytype;
79typedef void (*__atodotype)(void);
80#ifdef __cplusplus
81extern "C" {
82#endif
83
84extern __atodotype __atodo;
85
86extern keytype __lastakey;
87
88 extern keytype getakey(void);
89/* extern void setakey(keytype); */ /* MACRO */
90 extern keytype readakey(void);
91/* extern keytype lastakey(void); */ /* MACRO */
92/* extern void waitakey(void); */ /* MACRO */
93 extern int pressedakey(void);
94 extern void clearakeybuff(void);
95/* extern void setakeydo(dofn __atodotype); */ /* MACRO */
96 extern void ungetakey(void);
97 extern int insertakey(keytype key);
98 extern void setasmalldelay(int delay);
99
100 extern int initakey(void);
101 extern void closeakey(void);
102
103#ifdef __cplusplus
104}
105#endif
106
107
108#endif /* _AKEY_H */
109
110/* End of akey.h */
111
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 @@
1#include "config.h"
2
3/* linker script for chessbox as an overlay,
4 * only used/ necessary for SH-based archos targets */
5
6OUTPUT_FORMAT(elf32-sh)
7
8#define DRAMORIG 0x09000000
9#define PLUGIN_LENGTH PLUGIN_BUFFER_SIZE
10
11#define OVERLAY_LENGTH 0x80000
12#define OVERLAY_ORIGIN (DRAMORIG + (MEMORYSIZE * 0x100000) - PLUGIN_LENGTH - OVERLAY_LENGTH)
13
14MEMORY
15{
16 OVERLAY_RAM : ORIGIN = OVERLAY_ORIGIN, LENGTH = OVERLAY_LENGTH
17}
18
19SECTIONS
20{
21 .header : {
22 _plugin_start_addr = .;
23 *(.header)
24 } > OVERLAY_RAM
25
26 .text : {
27 *(.text)
28 *(.text.*)
29 } > OVERLAY_RAM
30
31 .rodata : {
32 *(.rodata)
33 *(.rodata.*)
34 } > OVERLAY_RAM
35
36 .data : {
37 *(.data)
38 } > OVERLAY_RAM
39
40 .bss : {
41 *(.bss)
42 *(.bss.*)
43 *(COMMON)
44 . = ALIGN(0x4);
45 _plugin_end_addr = .;
46 } > OVERLAY_RAM
47}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/*
22 *
23 * ax.c
24 *
25 *
26 *
27 * Created: 94/11/11 Szeredi Miklos
28 *
29 * Version: 0.1 94/11/11
30 * 0.2 95/06/12
31 *
32 */
33
34/* #define DEBUG_EVENTS */
35
36#include "ax.h"
37#include <X11/Xutil.h>
38#include <X11/Xresource.h>
39
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <unistd.h>
44
45#include <sys/time.h>
46#include <sys/types.h>
47#include <signal.h>
48
49
50#ifndef TRUE
51#define TRUE 1
52#endif
53#ifndef FALSE
54#define FALSE 0
55#endif
56typedef int boolean;
57#define max(x, y) ((x) < (y) ? (y) : (x))
58#define min(x, y) ((x) < (y) ? (x) : (y))
59#define minmax(a, l, u) ((a) < (l) ? (l) : ((a) > (u) ? (u) : (a)))
60
61#define MAX_PROG_NAME_LEN 128
62#define MAX_CLASS_NAME_LEN MAX_PROG_NAME_LEN
63#define MAX_PRES_LEN 256
64#define MAX_FILENAME_LEN 1024
65
66static const char *empty_str = "";
67
68typedef void (*eventproc_t)(XEvent *, void *);
69
70typedef struct _event_proc_struct {
71 eventproc_t event_proc;
72 unsigned long event_mask;
73 Display *disp;
74 void *ptr;
75 Window event_win;
76 boolean done_proc;
77 struct _event_proc_struct *next_proc;
78} event_proc_struct;
79
80typedef struct {
81 const char *event_name;
82 boolean win_given;
83 event_proc_struct *next_proc;
84} event_struct;
85
86typedef struct _disp_struct{
87 Display *disp;
88 XFontStruct *font;
89 struct _disp_struct *next_disp;
90} disp_struct;
91
92
93#define EVENT_NUM LASTEvent
94
95static event_struct event_info[EVENT_NUM];
96
97static disp_struct disp_start = {NULL, NULL, NULL};
98
99static boolean disp_chain_modified;
100
101static char prog_name[MAX_PROG_NAME_LEN + 1];
102static char class_name[MAX_CLASS_NAME_LEN + 1];
103
104static XrmDatabase rDB = NULL; /* Has to be global otherwise Xlib hangs */
105
106static int opTableEntries = 19;
107static aX_options opTable[] = {
108 {"-display", ".display", XrmoptionSepArg, NULL},
109 {"-geometry", ".geometry", XrmoptionSepArg, NULL},
110 {"-bg", ".background", XrmoptionSepArg, NULL},
111 {"-background", ".background", XrmoptionSepArg, NULL},
112 {"-bd", ".borderColor", XrmoptionSepArg, NULL},
113 {"-bordercolor", ".borderColor", XrmoptionSepArg, NULL},
114 {"-bw", ".borderWidth", XrmoptionSepArg, NULL},
115 {"-borderwidth", ".borderWidth", XrmoptionSepArg, NULL},
116 {"-fg", ".foreground", XrmoptionSepArg, NULL},
117 {"-foreground", ".foreground", XrmoptionSepArg, NULL},
118 {"-fn", ".font", XrmoptionSepArg, NULL},
119 {"-font", ".font", XrmoptionSepArg, NULL},
120 {"-name", ".name", XrmoptionSepArg, NULL},
121 {"-rv", ".reverseVideo", XrmoptionNoArg, "on"},
122 {"-reverse", ".reverseVideo", XrmoptionNoArg, "on"},
123 {"+rv", ".reverseVideo", XrmoptionNoArg, "off"},
124 {"-bg", ".background", XrmoptionSepArg, NULL},
125 {"-title", ".title", XrmoptionSepArg, NULL},
126 {"-xrm", NULL, XrmoptionResArg, NULL}
127};
128
129static char *addstr(const char str1[], const char str2[], char str12[],
130 unsigned int str12len)
131{
132 unsigned int i, j, k;
133
134 str12[str12len-1] = '\0';
135
136 for(i=0, j=0, k=0; i + 1 < str12len; ) {
137 if(str1[j]) str12[i] = str1[j++];
138 else str12[i] = str2[k++];
139 if(! str12[i++]) break;
140 }
141 return str12;
142}
143
144
145static char *pname(const char *resource) {
146 static char pnameres[MAX_PRES_LEN];
147
148 return addstr(prog_name, resource, pnameres, MAX_PRES_LEN);
149}
150
151static char *pclass(const char *resource) {
152 static char pclassres[MAX_PRES_LEN];
153
154 return addstr(class_name, resource, pclassres, MAX_PRES_LEN);
155}
156
157
158static void fill_event_info(void)
159{
160 int i;
161
162 for(i = 0; i < EVENT_NUM; i++) {
163 event_info[i].event_name = empty_str;
164 event_info[i].win_given = TRUE;
165 event_info[i].next_proc = NULL;
166 }
167
168 event_info[MappingNotify].win_given = FALSE;
169
170 event_info[ButtonPress].event_name = "ButtonPress";
171 event_info[ButtonRelease].event_name = "ButtonRelease";
172 event_info[CirculateNotify].event_name = "CirculateNotify";
173 event_info[CirculateRequest].event_name = "CirculateRequest";
174 event_info[ClientMessage].event_name = "ClientMessage";
175 event_info[ColormapNotify].event_name = "ColormapNotify";
176 event_info[ConfigureNotify].event_name = "ConfigureNotify";
177 event_info[ConfigureRequest].event_name = "ConfigureRequest";
178 event_info[CreateNotify].event_name = "CreateNotify";
179 event_info[DestroyNotify].event_name = "DestroyNotify";
180 event_info[EnterNotify].event_name = "EnterNotify";
181 event_info[LeaveNotify].event_name = "LeaveNotify";
182 event_info[Expose].event_name = "Expose";
183 event_info[FocusIn].event_name = "FocusIn";
184 event_info[FocusOut].event_name = "FocusOut";
185 event_info[GraphicsExpose].event_name = "GraphicsExpose";
186 event_info[NoExpose].event_name = "NoExpose";
187 event_info[GravityNotify].event_name = "GravityNotify";
188 event_info[KeymapNotify].event_name = "KeymapNotify";
189 event_info[KeyPress].event_name = "KeyPress";
190 event_info[KeyRelease].event_name = "KeyRelease";
191 event_info[MapNotify].event_name = "MapNotify";
192 event_info[UnmapNotify].event_name = "UnmapNotify";
193 event_info[MappingNotify].event_name = "MappingNotify";
194 event_info[MapRequest].event_name = "MapRequest";
195 event_info[MotionNotify].event_name = "MotionNotify";
196 event_info[PropertyNotify].event_name = "PropertyNotify";
197 event_info[ReparentNotify].event_name = "ReparentNotify";
198 event_info[ResizeRequest].event_name = "ResizeRequest";
199 event_info[SelectionClear].event_name = "SelectionClear";
200 event_info[SelectionNotify].event_name = "SelectionNotify";
201 event_info[SelectionRequest].event_name = "SelectionRequest";
202 event_info[VisibilityNotify].event_name = "VisibilityNotify";
203
204}
205
206static void get_def_res(aX_default_resources *defres)
207{
208 XrmValue value;
209 char *str_type;
210 int flags;
211 XColor color_def;
212 unsigned long tmp_pixel;
213 Colormap def_map;
214 int font_spec;
215
216
217 defres->window_name = prog_name;
218 defres->icon_name = prog_name;
219
220
221 defres->scr = DefaultScreen(defres->disp);
222 defres->scr_ptr = ScreenOfDisplay(defres->disp, defres->scr);
223 def_map = DefaultColormapOfScreen(defres->scr_ptr);
224
225
226 if(XrmGetResource(rDB, pname(".title"), pclass(".Title"),
227 &str_type, &value))
228 defres->window_name = (char *) value.addr;
229
230 defres->sflags = PSize;
231 if(XrmGetResource(rDB, pname(".geometry"), pclass(".Geometry"),
232 &str_type, &value)) {
233 flags = XParseGeometry((char *) value.addr, &(defres->x), &(defres->y),
234 &(defres->width), &(defres->height));
235 if((XValue | YValue) & flags) defres->sflags |= USPosition;
236 if((WidthValue | HeightValue) & flags)
237 defres->sflags = (defres->sflags & ~PSize) | USSize;
238 }
239
240 defres->background = defres->background ?
241 WhitePixel(defres->disp, defres->scr) :
242 BlackPixel(defres->disp, defres->scr);
243
244 if(XrmGetResource(rDB, pname(".background"), pclass(".Background"),
245 &str_type, &value)) {
246 if(XParseColor(defres->disp, def_map, value.addr, &color_def)) {
247 if(XAllocColor(defres->disp, def_map, &color_def))
248 defres->background = color_def.pixel;
249 }
250 else fprintf(stderr, "%s: aX: warning: Invalid color specification %s\n",
251 prog_name, value.addr);
252 }
253
254 defres->foreground = defres->foreground ?
255 WhitePixel(defres->disp, defres->scr) :
256 BlackPixel(defres->disp, defres->scr);
257
258 if(XrmGetResource(rDB, pname(".foreground"), pclass(".Foreground"),
259 &str_type, &value)) {
260 if(XParseColor(defres->disp, def_map, value.addr, &color_def)) {
261 if(XAllocColor(defres->disp, def_map, &color_def))
262 defres->foreground = color_def.pixel;
263 }
264 else fprintf(stderr, "%s: aX: warning: Invalid color specification %s\n",
265 prog_name, value.addr);
266 }
267
268 if(XrmGetResource(rDB, pname(".borderWidth"), pclass(".BorderWidth"),
269 &str_type, &value)) {
270 defres->border_width = atoi(value.addr);
271 }
272
273 defres->border_color = defres->foreground;
274 if(XrmGetResource(rDB, pname(".borderColor"), pclass(".BorderColor"),
275 &str_type, &value)) {
276 if(XParseColor(defres->disp, def_map, value.addr, &color_def)) {
277 if(XAllocColor(defres->disp, def_map, &color_def))
278 defres->border_color = color_def.pixel;
279 }
280 else fprintf(stderr, "%s: aX: warning: Invalid color specification %s\n",
281 prog_name, value.addr);
282 }
283
284 font_spec = 0;
285 if(XrmGetResource(rDB, pname(".font"), pclass(".Font"),
286 &str_type, &value)) {
287 defres->font_name = value.addr;
288 if(defres->font_name != NULL) font_spec = 1;
289
290 }
291
292 if(XrmGetResource(rDB, pname(".fallbackFont"), pclass(".Font"),
293 &str_type, &value))
294 defres->fallback_font_name = value.addr;
295
296 if(defres->font_name == NULL ||
297 (defres->font = XLoadQueryFont(defres->disp, defres->font_name))
298 == NULL) {
299
300 if(font_spec)
301 fprintf(stderr, "%s: aX: warning: cannot open %s font, ",
302 prog_name, defres->font_name);
303
304 defres->font_name = defres->fallback_font_name;
305
306 if(font_spec && defres->font_name != NULL)
307 fprintf(stderr, "trying %s...\n",defres->font_name);
308
309 if(defres->font_name == NULL ||
310 (defres->font =
311 XLoadQueryFont(defres->disp, defres->fallback_font_name)) == NULL) {
312
313 if(defres->font_name != NULL) {
314
315 fprintf(stderr, "%s: aX: warning: cannot open %s font, ",
316 prog_name, defres->font_name);
317 }
318
319 defres->font_name = "fixed";
320
321 fprintf(stderr, "trying %s...\n",defres->font_name);
322
323 if((defres->font = XLoadQueryFont(defres->disp, defres->font_name))
324 == NULL) {
325
326 fprintf(stderr, "%s: aX: warning: cannot open %s font\n",
327 prog_name, defres->font_name);
328
329 exit(-1);
330 }
331 }
332 else defres->font_name = defres->fallback_font_name;
333 }
334
335 if(XrmGetResource(rDB, pname(".reverseVideo"), pclass(".ReverseVideo"),
336 &str_type, &value))
337 if(strcmp(value.addr, "on") == 0) {
338 tmp_pixel = defres->foreground;
339 defres->foreground = defres->background;
340 defres->background = tmp_pixel;
341 }
342
343}
344
345
346static void add_disp(aX_default_resources *defres)
347{
348 disp_struct *last;
349
350 for(last = &disp_start; last->next_disp != NULL; last = last->next_disp);
351
352 if((last->next_disp = malloc(sizeof(disp_struct))) == NULL) {
353 fprintf(stderr, "%s: aX: Not enough memory.\n", prog_name);
354 exit(-1);
355 };
356
357 last = last->next_disp;
358
359 last->disp = defres->disp;
360 last->font = defres->font;
361 last->next_disp = NULL;
362
363
364 disp_chain_modified = TRUE;
365}
366
367void aX_open_disp(aX_options *useropt, int useroptlen,
368 int *argcp, char *argv[],
369 aX_default_resources *defres)
370{
371
372 XrmValue value;
373 char *str_type;
374 char *disp_res;
375 char *environment;
376 char *display_name = NULL;
377 char filename[MAX_FILENAME_LEN];
378 int i;
379 XrmDatabase commandlineDB = NULL, usercommandlineDB = NULL;
380 XrmDatabase homeDB, serverDB, applicationDB;
381
382/*
383 if(disp_start.next_disp != NULL) {
384 fprintf(stderr, "aX_open_disp: Cannot open first display twice.\n");
385 exit(-1);
386 }
387*/
388
389 XrmInitialize();
390
391 class_name[0] = '\0';
392 class_name[MAX_CLASS_NAME_LEN] = '\0';
393 if(defres->class_name != NULL)
394 strncpy(class_name, defres->class_name, MAX_CLASS_NAME_LEN);
395
396
397 fill_event_info();
398
399 for(i = 1; i < *argcp; i++)
400 if(strcmp(argv[i], "-name") == 0 && ++i < *argcp){
401 defres->prog_name = argv[i];
402 break;
403 }
404
405
406 prog_name[0] = '\0';
407 prog_name[MAX_PROG_NAME_LEN] = '\0';
408 if(defres->prog_name != NULL)
409 strncpy(prog_name, defres->prog_name, MAX_PROG_NAME_LEN);
410 else
411 strncpy(prog_name, argv[0], MAX_PROG_NAME_LEN);
412
413 defres->prog_name = prog_name;
414
415 XrmParseCommand(&commandlineDB, (XrmOptionDescRec *) opTable,
416 opTableEntries, prog_name, argcp, argv);
417
418 if(useropt != NULL)
419 XrmParseCommand(&usercommandlineDB, (XrmOptionDescRec *) useropt,
420 useroptlen, prog_name, argcp, argv);
421 else usercommandlineDB = NULL;
422
423/*
424 if(*argcp != 1) {
425 fprintf(stderr,
426 "%s: aX_open_disp: Unrecognised options in command line!\n",
427 prog_name);
428 exit(-1);
429 }
430*/
431
432 if(XrmGetResource(commandlineDB, pname(".display"), pclass(".Display"),
433 &str_type, &value)) display_name = (char *) value.addr;
434
435 if((defres->disp = XOpenDisplay(display_name)) == NULL) {
436 fprintf(stderr, "%s: aX_open_disp: cannot connect to X server %s\n",
437 prog_name, XDisplayName(display_name));
438 exit(-1);
439 }
440
441 applicationDB = XrmGetFileDatabase(
442 addstr("/usr/lib/X11/app-defaults/",
443 class_name,
444 filename,
445 MAX_FILENAME_LEN));
446/*
447 if(defres->disp->xdefaults)
448 serverDB = XrmGetStringDatabase(defres->disp->xdefaults);
449 else serverDB = NULL;
450*/
451
452
453 disp_res = XResourceManagerString(defres->disp);
454
455 if(disp_res) serverDB = XrmGetStringDatabase(disp_res);
456 else serverDB = NULL;
457
458
459 if((environment = getenv("XENVIRONMENT")) != NULL)
460 homeDB = XrmGetFileDatabase(environment);
461 else homeDB = NULL;
462
463
464 XrmMergeDatabases(applicationDB, &rDB);
465 XrmMergeDatabases(serverDB, &rDB);
466 XrmMergeDatabases(homeDB, &rDB);
467 XrmMergeDatabases(commandlineDB, &rDB);
468 XrmMergeDatabases(usercommandlineDB, &rDB);
469
470 get_def_res(defres);
471
472 add_disp(defres);
473
474}
475
476
477void aX_open_second_disp(char *display_name,
478 aX_default_resources *defres)
479{
480 char *disp_res;
481
482 XrmDatabase serverDB;
483
484
485 if((defres->disp = XOpenDisplay(display_name)) == NULL) {
486 fprintf(stderr,
487 "%s: aX_open_second_disp: cannot connect to X server %s\n",
488 prog_name, XDisplayName(display_name));
489 exit(-1);
490 }
491
492
493 disp_res = XResourceManagerString(defres->disp);
494
495 if(disp_res) serverDB = XrmGetStringDatabase(disp_res);
496 else serverDB = NULL;
497
498
499 XrmMergeDatabases(serverDB, &rDB);
500
501 get_def_res(defres);
502
503 add_disp(defres);
504}
505
506/*
507
508void smallwait(boolean event_prev)
509{
510 event_prev = event_prev;
511 sleep(1);
512}
513
514*/
515
516
517static void sigalrm_handler(int i)
518{
519 i = i;
520 signal(SIGALRM, SIG_IGN);
521}
522
523
524static void smallwait(boolean event_prev)
525{
526 struct itimerval value;
527
528 signal(SIGALRM, sigalrm_handler);
529
530 event_prev = event_prev;
531
532 value.it_interval.tv_sec = 0L;
533 value.it_interval.tv_usec = 0L;
534 value.it_value.tv_sec = 0L;
535 value.it_value.tv_usec = 100000L;
536 setitimer(ITIMER_REAL, &value, NULL);
537
538 pause();
539}
540
541/* This aX_wait_all_muck needs to be cleared out! */
542
543void aX_wait_event(int eventtype)
544{
545 XEvent ev;
546 event_proc_struct **curr;
547 int i;
548 disp_struct *dsp, *dsp1;
549
550 boolean event_prev;
551
552
553start:;
554
555 if(disp_start.next_disp == NULL) {
556 fprintf(stderr, "%s: aX_wait_event: No connection to any display\n",
557 prog_name);
558 exit(-1);
559 }
560
561 dsp = disp_start.next_disp;
562
563
564 do {
565 event_prev = TRUE;
566
567 dsp1 = dsp;
568 if((disp_start.next_disp)->next_disp != NULL ||
569 eventtype == AX_LOOK_EVENTS)
570 while(XPending(dsp->disp) == 0) {
571 dsp = dsp->next_disp;
572 if(dsp == NULL) dsp = disp_start.next_disp;
573
574 if(dsp == dsp1) {
575 if(eventtype == AX_LOOK_EVENTS) return;
576
577 smallwait(event_prev);
578 event_prev = FALSE;
579 dsp = dsp1 = disp_start.next_disp;
580 }
581 }
582
583 XNextEvent(dsp->disp, &ev);
584#ifdef DEBUG_EVENTS
585 fprintf(stderr,"Event: %s (%i) in win: %li)\n",
586 event_info[ev.type].event_name,
587 ev.type,
588 ev.xany.window);
589#endif
590
591
592 if(dsp->disp != ev.xany.display)
593 fprintf(stderr, "Ha! Event read from wrong display! Stupid XLib!!!\n");
594
595 curr = &(event_info[ev.type].next_proc);
596 i = 0;
597 while(*curr != NULL) {
598 if((*curr)->disp == dsp->disp &&
599 (!event_info[ev.type].win_given ||
600 ev.xany.window == (*curr)->event_win) &&
601 !(*curr)->done_proc) {
602 i++;
603 (*curr)->done_proc = TRUE;
604 disp_chain_modified = FALSE;
605
606 if((*curr)->event_proc != NULL) {
607 (*((*curr)->event_proc))(&ev, (*curr)->ptr);
608 }
609
610 if(disp_chain_modified) goto start;
611 curr = &(event_info[ev.type].next_proc);
612 }
613 else curr = &((*curr)->next_proc);
614 }
615 curr = &(event_info[ev.type].next_proc);
616 while(*curr != NULL) {
617 (*curr)->done_proc = FALSE;
618 curr = &((*curr)->next_proc);
619 }
620
621 if(i == 0)
622 fprintf(stderr, "%s: aX_wait_event: warning: "
623 "Unexpected event: %s (%i) in win: %li)\n",
624 prog_name,
625 event_info[ev.type].event_name,
626 ev.type,
627 ev.xany.window);
628
629 } while(eventtype != ev.type && eventtype != AX_ANY_EVENT);
630}
631
632
633void aX_look_events(void)
634{
635 aX_wait_event(AX_LOOK_EVENTS);
636}
637
638char *aX_get_prog_res(const char *resname, const char* resclass)
639{
640 XrmValue value;
641 char *str_type;
642
643 if(XrmGetResource(rDB, pname(resname), pclass(resclass),
644 &str_type, &value))
645 return (char *)value.addr;
646 else return NULL;
647}
648
649char *aX_get_resource(const char *resname, const char* resclass)
650{
651 XrmValue value;
652 char *str_type;
653
654 if(XrmGetResource(rDB, resname, resclass,
655 &str_type, &value))
656 return (char *)value.addr;
657 else return NULL;
658}
659
660static long get_win_mask(Display *disp, Window win)
661{
662 int evt;
663 event_proc_struct *ep;
664 long winmask;
665
666 for(evt = 0, winmask = 0; evt < EVENT_NUM; evt++) {
667 ep = event_info[evt].next_proc;
668 while(ep != NULL) {
669 if(ep->event_win == win && ep->disp == disp) winmask |= ep->event_mask;
670 ep = ep->next_proc;
671 }
672 }
673 return winmask;
674}
675
676
677
678void aX_add_event_proc(Display *disp,
679 Window win,
680 int eventtype,
681 void (*eventproc)(XEvent *, void *),
682 unsigned long eventmask,
683 void *ptr)
684{
685 event_proc_struct **epp;
686 long winmask;
687
688 epp = &(event_info[eventtype].next_proc);
689 while(*epp != NULL) epp = &((*epp)->next_proc);
690
691 if((*epp = (event_proc_struct *)
692 malloc((size_t) sizeof(event_proc_struct))) == NULL) {
693 fprintf(stderr,
694 "%s: aX_add_event_proc_disp: Not enough memory.\n", prog_name);
695 exit(-1);
696 }
697
698 (*epp)->event_proc = eventproc;
699 (*epp)->ptr = ptr;
700 (*epp)->event_mask = eventmask;
701 (*epp)->disp = disp;
702 (*epp)->event_win = win;
703 (*epp)->done_proc = FALSE;
704 (*epp)->next_proc = NULL;
705
706 if(win) {
707 winmask = get_win_mask(disp, win);
708 XSelectInput(disp, win, winmask);
709 }
710}
711
712void aX_remove_event_proc(Display *disp,
713 Window win,
714 int eventtype,
715 void (*eventproc)(XEvent *, void *))
716{
717 event_proc_struct **epp;
718 event_proc_struct *tmp;
719 long winmask;
720
721 epp = &(event_info[eventtype].next_proc);
722 while(*epp != NULL) {
723 if((*epp)->disp == disp &&
724 (*epp)->event_win == win &&
725 (*epp)->event_proc == eventproc) {
726 tmp = (*epp)->next_proc;
727 free(*epp);
728 *epp = tmp;
729 if(win) {
730 winmask = get_win_mask(disp, win);
731 XSelectInput(disp, win, winmask);
732 }
733 return;
734 }
735 else epp = &((*epp)->next_proc);
736 }
737 fprintf(stderr, "%s: aX_remove_event_proc_disp: warning: "
738 "Could not remove event proc (event: %s (%i), window: %lX)\n",
739 prog_name, event_info[eventtype].event_name, eventtype, win);
740
741}
742
743void aX_close_one_disp(Display *disp)
744{
745/* int evt;
746 event_proc_struct **curr; */
747 disp_struct *dsp, *dsp_tmp;
748
749/*
750 for(evt = 0; evt < EVENT_NUM; evt++) {
751 curr = &(event_info[evt].next_proc);
752 while(*curr != NULL) {
753 if(disp == (*curr)->disp) {
754 aX_remove_event_proc_disp((*curr)->disp, (*curr)->event_win,
755 evt, (*curr)->event_proc);
756 curr = &(event_info[evt].next_proc);
757 }
758 else curr = &((*curr)->next_proc);
759 }
760 }
761
762*/
763
764 for(dsp = &disp_start; dsp->next_disp->disp != disp; dsp = dsp->next_disp)
765 if(dsp->next_disp == NULL) {
766 fprintf(stderr,
767 "%s: aX_close_one_disp: warning: Trying to close unopened display.\n",
768 prog_name);
769 return;
770 }
771
772 XUnloadFont(dsp->next_disp->disp, dsp->next_disp->font->fid);
773 XCloseDisplay(dsp->next_disp->disp);
774
775 dsp_tmp = dsp->next_disp;
776 dsp->next_disp = dsp->next_disp->next_disp;
777 free(dsp_tmp);
778
779 disp_chain_modified = TRUE;
780
781}
782
783void aX_close_disp(void)
784{
785
786 while(disp_start.next_disp != NULL)
787 aX_close_one_disp(disp_start.next_disp->disp);
788
789}
790
791
792unsigned long aX_get_color(Display *disp, int scr, unsigned long def_col,
793 const char *color_name)
794{
795 XColor color_def;
796 Colormap def_map;
797 Screen *scr_ptr;
798
799
800 if(color_name == NULL) return def_col;
801
802 scr_ptr = ScreenOfDisplay(disp, scr);
803 def_map = DefaultColormapOfScreen(scr_ptr);
804
805 if(XParseColor(disp, def_map, color_name, &color_def)) {
806 if(XAllocColor(disp, def_map, &color_def))
807 return color_def.pixel;
808 }
809 else fprintf(stderr,
810 "%s: aX_get_color: warning: Invalid color specification %s\n",
811 prog_name, color_name);
812
813 return def_col;
814
815}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* ax.h
22 *
23 * Header of the AX module
24 *
25 *
26 * Created: 94/11/11 Szeredi Miklos
27 */
28
29
30#ifndef _AX_H
31#define _AX_H
32
33#include <X11/Xlib.h>
34#include <X11/Xresource.h>
35
36/*typedef XrmOptionDescRec aX_options; */
37
38typedef struct {
39 const char *option; /* Option abbreviation in argv */
40 const char *specifier; /* Resource specifier */
41 XrmOptionKind argKind; /* Which style of option it is */
42 const char *value; /* Value to provide if XrmoptionNoArg */
43} aX_options;
44
45
46#define AX_NO_EVENT LASTEvent
47#define AX_ANY_EVENT 0
48#define AX_LOOK_EVENTS -1
49
50typedef struct{
51 Display *disp;
52 int scr;
53 Screen *scr_ptr;
54 unsigned int width;
55 unsigned int height;
56 int x;
57 int y;
58 unsigned int border_width;
59 unsigned long foreground;
60 unsigned long background;
61 unsigned long border_color;
62 const char *font_name;
63 const char *fallback_font_name;
64 XFontStruct *font;
65 long sflags;
66 const char *prog_name;
67 const char *class_name;
68 char *window_name;
69 char *icon_name;
70 } aX_default_resources;
71
72
73#ifdef __cplusplus
74extern "C" {
75#endif
76
77
78extern void aX_open_disp(aX_options *useropt, int useroptlen,
79 int *argcp, char *argv[],
80 aX_default_resources *defres);
81extern void aX_open_second_disp(char *display_name,
82 aX_default_resources *defres);
83extern void aX_wait_event(int eventtype);
84extern void aX_look_events(void);
85extern char *aX_get_prog_res(const char *resname, const char* resclass);
86extern char *aX_get_resource(const char *resname, const char* resclass);
87
88extern void aX_add_event_proc(Display *disp,
89 Window win,
90 int eventtype,
91 void (*eventproc)(XEvent *, void *),
92 unsigned long eventmask,
93 void *ptr);
94
95extern void aX_remove_event_proc(Display *disp,
96 Window win,
97 int eventtype,
98 void (*eventproc)(XEvent *, void *));
99
100extern void aX_close_one_disp(Display *disp);
101extern void aX_close_disp(void);
102extern unsigned long aX_get_color(Display *disp, int scr,
103 unsigned long def_col, const char *color_name);
104
105
106#ifdef __cplusplus
107}
108#endif
109
110
111#endif /* _AX_H */
112
113/* End of ax.h */
114
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "compr.h"
22
23void compr(void)
24{
25 int j, c, lc, lled, rep, num;
26
27 rep = 0;
28
29 c = compr_read_byte();
30 lc = 0;
31 num = 0;
32
33 while(c >= 0) {
34 if(lc == 0xED) lled = 1;
35 else lled = 0;
36
37 lc = c;
38 c = compr_read_byte();
39 if(c == lc && num != 255 && (!lled || rep)) {
40 if(!rep) {
41 num = 1;
42 rep = 1;
43 }
44 num++;
45 }
46 else {
47 if(rep) {
48 if(num < 5 && lc != 0xED) for(j = 0; j < num; j++) compr_put_byte(lc);
49 else{
50 compr_put_byte(0xED);
51 compr_put_byte(0xED);
52 compr_put_byte(num);
53 compr_put_byte(lc);
54 num = 0;
55 }
56 rep = 0;
57 }
58 else compr_put_byte(lc);
59 }
60 }
61
62 compr_put_byte(0x00);
63 compr_put_byte(0xED);
64 compr_put_byte(0xED);
65 compr_put_byte(0x00);
66}
67
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef COMPR_H
22#define COMPR_H
23
24extern void compr(void);
25extern int compr_read_byte(void);
26extern void compr_put_byte(int i);
27
28#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 @@
1#include "zxconfig.h"
2
3int my_getc(int fd){
4 unsigned char c;
5 if ( rb->read(fd, &c, 1) )
6 return c;
7 else
8 return EOF;
9}
10
11off_t my_ftell(int fd){
12 return rb->lseek(fd, 0, SEEK_CUR);
13}
14
15int my_putc(char c , int fd){
16 return rb->write(fd,&c,1);
17}
18
19void *my_malloc(size_t size)
20{
21 static char *offset = NULL;
22 static int totalSize = 0;
23 char *ret;
24
25 int remainder = size % 4;
26
27 size = size + 4-remainder;
28
29 if (offset == NULL)
30 {
31 offset = rb->plugin_get_audio_buffer(&totalSize);
32 }
33
34 if (size + 4 > abs(totalSize) )
35 {
36 /* printf("\nMALLOC BARF");
37 printf("\nMALLOC BARF");
38 printf("\nMALLOC BARF");
39 printf("\nMALLOC BARF");
40 printf("\nMALLOC BARF");
41 printf("\nMALLOC BARF");
42 printf("\nMALLOC BARF");*/
43 /* We've made our point. */
44
45 return NULL;
46 }
47
48 ret = offset + 4;
49 *((unsigned int *)offset) = size;
50
51 offset += size + 4;
52 totalSize -= size + 4;
53 return ret;
54
55}
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 @@
1#ifndef HELPERS_H
2#define HELPERS_H
3
4extern int my_getc(int);
5extern int my_putc(char,int);
6extern off_t my_ftell(int);
7extern void *my_malloc(size_t size);
8
9
10#define getc my_getc
11#define malloc my_malloc
12#define ftell my_ftell
13#define putc my_putc
14
15#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "zxconfig.h"
22#include "interf.h"
23
24#include <stdio.h>
25#include <ctype.h>
26
27#define MAXMSGLEN 2048
28
29char filenamebuf[MAXFILENAME];
30char msgbuf[MAXMSGLEN];
31
32char *spif_get_filename(void)
33{
34 char *name=NULL;
35/* char *name, *s;
36
37 s = get_filename_line();
38 for(; *s && isspace((int) *s); s++);
39 name = s;
40 for(; *s && isgraph((int) *s); s++);
41 *s = '\0';
42
43 if(name == s) {
44 printf("Canceled!\n");
45 return NULL;
46 }
47*/
48 return name;
49}
50
51char *spif_get_tape_fileinfo(int *startp, int *nump)
52{
53 *startp=*nump=0;
54 char *name=NULL;
55 /* char *name, *s;
56 int res;
57
58 s = get_filename_line();
59 for(; *s && isspace((int) *s); s++);
60 name = s;
61 for(; *s && isgraph((int) *s); s++);
62
63 if(name != s) res = 1;
64 else res = 0;
65
66 if(*s) {
67 *s = '\0';
68 s++;
69 if(*s) {
70 int r1;
71
72 r1 = sscanf(s, "%d %d", startp, nump);
73 if(r1 > 0) res += r1;
74 }
75 }
76
77 if(res < 1) {
78 printf("Canceled!\n");
79 return NULL;
80 }
81
82 if(res < 2) *startp = -1;
83 if(res < 3) *nump = -1;
84*/
85 return name;
86}
87
88void put_msg(const char *msg)
89{
90#ifndef USE_GRAY
91 rb->splash (HZ/10,true , msg );
92#else
93 LOGF(msg);
94 (void)msg;
95#endif
96}
97
98
99void put_tmp_msg(const char *msg)
100{
101#ifndef USE_GRAY
102 rb->splash (HZ/10,true , msg );
103#else
104 LOGF(msg);
105 (void)msg;
106#endif
107}
108
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef INTERF_H
22#define INTERF_H
23
24#define MAXFILENAME 1024
25
26extern char filenamebuf[];
27extern char msgbuf[];
28extern char *spif_get_filename(void);
29extern void put_msg(const char *msg);
30extern void put_tmp_msg(const char *msg);
31
32#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 @@
1#ifndef KEYMAPS_H
2#define KEYMAPS_H
3
4#if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
5 (CONFIG_KEYPAD == IPOD_3G_PAD)
6
7#define ZX_UP BUTTON_MENU
8#define ZX_DOWN BUTTON_PLAY
9#define ZX_SELECT BUTTON_SELECT
10#define ZX_LEFT BUTTON_LEFT
11#define ZX_RIGHT BUTTON_RIGHT
12
13#elif CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
14
15#define ZX_UP BUTTON_UP
16#define ZX_DOWN BUTTON_DOWN
17#define ZX_LEFT BUTTON_LEFT
18#define ZX_RIGHT BUTTON_RIGHT
19#define ZX_SELECT BUTTON_SELECT
20#define ZX_MENU BUTTON_MODE
21
22#elif CONFIG_KEYPAD == GIGABEAT_PAD
23
24#define ZX_UP BUTTON_UP
25#define ZX_DOWN BUTTON_DOWN
26#define ZX_LEFT BUTTON_LEFT
27#define ZX_RIGHT BUTTON_RIGHT
28#define ZX_SELECT BUTTON_SELECT
29#define ZX_MENU BUTTON_MENU
30
31#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
32
33#define ZX_RIGHT BUTTON_RIGHT
34#define ZX_LEFT BUTTON_LEFT
35#define ZX_UP BUTTON_UP
36#define ZX_DOWN BUTTON_DOWN
37#define ZX_SELECT BUTTON_SELECT
38#define ZX_MENU BUTTON_PLAY
39
40#elif CONFIG_KEYPAD == RECORDER_PAD
41#define ZX_SELECT BUTTON_PLAY
42#define ZX_MENU BUTTON_OFF
43#define ZX_LEFT BUTTON_LEFT
44#define ZX_RIGHT BUTTON_RIGHT
45#define ZX_UP BUTTON_UP
46#define ZX_DOWN BUTTON_DOWN
47
48#elif CONFIG_KEYPAD == ONDIO_PAD
49#define ZX_SELECT BUTTON_MENU
50#define ZX_MENU BUTTON_OFF
51#define ZX_LEFT BUTTON_LEFT
52#define ZX_RIGHT BUTTON_RIGHT
53#define ZX_UP BUTTON_UP
54#define ZX_DOWN BUTTON_DOWN
55
56#elif CONFIG_KEYPAD == GMINI100_PAD
57#define ZX_SELECT BUTTON_PLAY
58#define ZX_MENU BUTTON_OFF
59#define ZX_LEFT BUTTON_LEFT
60#define ZX_RIGHT BUTTON_RIGHT
61#define ZX_UP BUTTON_UP
62#define ZX_DOWN BUTTON_DOWN
63
64#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
65#define ZX_SELECT BUTTON_SELECT
66#define ZX_MENU BUTTON_PLAY
67#define ZX_LEFT BUTTON_LEFT
68#define ZX_RIGHT BUTTON_RIGHT
69#define ZX_UP BUTTON_UP
70#define ZX_DOWN BUTTON_DOWN
71
72#elif CONFIG_KEYPAD == IRIVER_H10_PAD
73#define ZX_SELECT BUTTON_REW
74#define ZX_MENU BUTTON_FF
75#define ZX_LEFT BUTTON_LEFT
76#define ZX_RIGHT BUTTON_RIGHT
77#define ZX_UP BUTTON_SCROLL_UP
78#define ZX_DOWN BUTTON_SCROLL_DOWN
79
80#endif
81
82#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include <stdio.h>
22
23const char *spcf_keynames_ascii[95] = {
24 "space",
25 "exclam",
26 "quotedbl",
27 "numbersign",
28 "dollar",
29 "percent",
30 "ampersand",
31 "apostrophe",
32 "parenleft",
33 "parenright",
34 "asterisk",
35 "plus",
36 "comma",
37 "minus",
38 "period",
39 "slash",
40 "0",
41 "1",
42 "2",
43 "3",
44 "4",
45 "5",
46 "6",
47 "7",
48 "8",
49 "9",
50 "colon",
51 "semicolon",
52 "less",
53 "equal",
54 "greater",
55 "question",
56 "at",
57 "A",
58 "B",
59 "C",
60 "D",
61 "E",
62 "F",
63 "G",
64 "H",
65 "I",
66 "J",
67 "K",
68 "L",
69 "M",
70 "N",
71 "O",
72 "P",
73 "Q",
74 "R",
75 "S",
76 "T",
77 "U",
78 "V",
79 "W",
80 "X",
81 "Y",
82 "Z",
83 "bracketleft",
84 "backslash",
85 "bracketright",
86 "asciicircum",
87 "underscore",
88 "grave",
89 "a",
90 "b",
91 "c",
92 "d",
93 "e",
94 "f",
95 "g",
96 "h",
97 "i",
98 "j",
99 "k",
100 "l",
101 "m",
102 "n",
103 "o",
104 "p",
105 "q",
106 "r",
107 "s",
108 "t",
109 "u",
110 "v",
111 "w",
112 "x",
113 "y",
114 "z",
115 "braceleft",
116 "bar",
117 "braceright",
118 "asciitilde"
119};
120
121const char *spcf_keynames_misc[256] = {
122 NULL, NULL, NULL, NULL,
123 NULL, NULL, NULL, NULL,
124 "BackSpace", "Tab", "Linefeed", "Clear",
125 NULL, "Return", NULL, NULL,
126
127 NULL, NULL, NULL, "Pause",
128 "Scroll_Lock", "Sys_Req", NULL, NULL,
129 NULL, NULL, NULL, "Escape",
130 NULL, NULL, NULL, NULL,
131
132 "Multi_key", NULL, NULL, NULL,
133 NULL, NULL, NULL, NULL,
134 NULL, NULL, NULL, NULL,
135 NULL, NULL, NULL, NULL,
136
137 NULL, NULL, NULL, NULL,
138 NULL, NULL, NULL, NULL,
139 NULL, NULL, NULL, NULL,
140 NULL, NULL, NULL, NULL,
141
142 NULL, NULL, NULL, NULL,
143 NULL, NULL, NULL, NULL,
144 NULL, NULL, NULL, NULL,
145 NULL, NULL, NULL, NULL,
146
147 "Home", "Left", "Up", "Right",
148 "Down", "Page_Up", "Page_Down", "End",
149 "Begin", NULL, NULL, NULL,
150 NULL, NULL, NULL, NULL,
151
152 "Select", "Print", "Execute", "Insert",
153 NULL, "Undo", "Redo", "Menu",
154 "Find", "Cancel", "Help", "Break",
155 NULL, NULL, NULL, NULL,
156
157 NULL, NULL, NULL, NULL,
158 NULL, NULL, NULL, NULL,
159 NULL, NULL, NULL, NULL,
160 NULL, NULL, "Mode_switch", "Num_Lock",
161
162 "KP_Space", NULL, NULL, NULL,
163 NULL, NULL, NULL, NULL,
164 "KP_Tab", NULL, NULL, NULL,
165 NULL, "KP_Enter", NULL, NULL,
166
167 NULL, "KP_F1", "KP_F2", "KP_F3",
168 "KP_F4", "KP_Home", "KP_Left", "KP_Up",
169 "KP_Right", "KP_Down", "KP_Page_Up", "KP_Page_Down",
170 "KP_End", "KP_Begin", "KP_Insert", "KP_Delete",
171
172 NULL, NULL, NULL, NULL,
173 NULL, NULL, NULL, NULL,
174 NULL, NULL, "KP_Multiply", "KP_Add",
175 "KP_Separator", "KP_Subtract", "KP_Decimal", "KP_Divide",
176
177 "KP_0", "KP_1", "KP_2", "KP_3",
178 "KP_4", "KP_5", "KP_6", "KP_7",
179 "KP_8", "KP_9", NULL, NULL,
180 NULL, "KP_Equal", "F1", "F2",
181
182 "F3", "F4", "F5", "F6",
183 "F7", "F8", "F9", "F10",
184 "F11", "F12", "F13", "F14",
185 "F15", "F16", "F17", "F18",
186
187 "F19", "F20", "F21", "F22",
188 "F23", "F24", "F25", "F26",
189 "F27", "F28", "F29", "F30",
190 "F31", "F32", "F33", "F34",
191
192 "F35", "Shift_L", "Shift_R", "Control_L",
193 "Control_R", "Caps_Lock", "Shift_Lock", "Meta_L",
194 "Meta_R", "Alt_L", "Alt_R", "Super_L",
195 "Super_R", "Hyper_L", "Hyper_R", NULL,
196
197 NULL, NULL, NULL, NULL,
198 NULL, NULL, NULL, NULL,
199 NULL, NULL, NULL, NULL,
200 NULL, NULL, NULL, "Delete"
201};
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 @@
1/* loadim.c */
2
3/*
4 This file was generated by ./bin_to_c from binary image
5 file `loadim.z80'
6 */
7
8unsigned char loadim[] = {
9 0x00, 0x40, 0x11, 0x00, 0xCB, 0x5C, 0x59, 0x05, 0x4C, 0xFF,
10 0x3F, 0x57, 0x2E, 0x11, 0x00, 0x21, 0x17, 0x9B, 0x36, 0xBC,
11 0x7E, 0x00, 0x01, 0x3A, 0x5C, 0xE2, 0x5C, 0x01, 0x01, 0x61,
12 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
13 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
14 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
15 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
16 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
17 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
18 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
19 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00,
20 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED,
21 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0x18, 0x00,
22 0xED, 0xED, 0xFF, 0x38, 0xED, 0xED, 0xFF, 0x38, 0xED, 0xED,
23 0xFF, 0x38, 0x38, 0x38, 0x38, 0xED, 0xED, 0xFF, 0x00, 0x00,
24 0xFF, 0x00, 0x00, 0x00, 0x0D, 0x05, 0x23, 0x0D, 0x0D, 0x23,
25 0x05, 0xED, 0xED, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0B,
26 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0xED, 0xED,
27 0x1A, 0x00, 0x3C, 0x40, 0x00, 0xFF, 0x8C, 0x01, 0x54, 0xFF,
28 0xED, 0xED, 0x05, 0x00, 0xFF, 0xFE, 0xFF, 0x01, 0x38, 0x00,
29 0x00, 0xCB, 0x5C, 0x00, 0x00, 0xB6, 0x5C, 0xB6, 0x5C, 0xCB,
30 0x5C, 0xD0, 0x5C, 0xCA, 0x5C, 0xCC, 0x5C, 0xCF, 0x5C, 0xCF,
31 0x5C, 0x00, 0x00, 0xD1, 0x5C, 0xF3, 0x5C, 0xF3, 0x5C, 0x1B,
32 0x92, 0x5C, 0x10, 0x02, 0xED, 0xED, 0x08, 0x00, 0x01, 0x1A,
33 0x00, 0x00, 0x93, 0x00, 0x00, 0x58, 0xFF, 0x00, 0x00, 0x21,
34 0x00, 0x5B, 0x21, 0x17, 0x00, 0x40, 0xE0, 0x50, 0x21, 0x18,
35 0x21, 0x17, 0x01, 0x38, 0x00, 0x38, 0xED, 0xED, 0x22, 0x00,
36 0x57, 0xFF, 0xFF, 0xFF, 0xF4, 0x09, 0xA8, 0x10, 0x4B, 0xF4,
37 0x09, 0xC4, 0x15, 0x53, 0x81, 0x0F, 0xC4, 0x15, 0x52, 0xF4,
38 0x09, 0xC4, 0x15, 0x50, 0x80, 0x80, 0xEF, 0x22, 0x22, 0x0D,
39 0x80, 0x00, 0xFF, 0xED, 0xED, 0x09, 0x20, 0x00, 0x00, 0x00,
40 0x80, 0xED, 0xED, 0x12, 0x00, 0x80, 0x0D, 0xCE, 0x5C, 0xED,
41 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
42 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
43 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
44 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
45 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
46 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
47 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
48 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
49 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
50 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
51 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
52 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
53 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
54 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
55 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
56 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
57 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
58 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
59 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
60 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
61 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
62 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
63 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
64 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
65 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
66 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
67 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
68 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
69 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
70 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
71 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
72 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
73 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
74 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
75 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
76 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
77 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
78 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
79 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
80 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
81 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
82 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
83 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
84 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
85 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
86 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
87 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
88 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
89 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
90 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
91 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
92 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
93 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
94 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
95 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
96 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
97 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
98 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
99 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
100 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
101 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
102 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
103 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF,
104 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED,
105 0xED, 0xFF, 0x00, 0xED, 0xED, 0xFF, 0x00, 0xED, 0xED, 0xC4,
106 0x00, 0xF3, 0x0D, 0xCE, 0x0B, 0xE3, 0x50, 0xCE, 0x0B, 0xE4,
107 0x50, 0x1D, 0x17, 0xDC, 0x0A, 0xCE, 0x0B, 0xE7, 0x50, 0x1A,
108 0x17, 0xDC, 0x0A, 0xD7, 0x18, 0x38, 0x00, 0x38, 0x00, 0x0D,
109 0x19, 0xCF, 0x5C, 0xA9, 0x18, 0x06, 0x03, 0x07, 0x5C, 0xB1,
110 0x33, 0xB1, 0x33, 0xD6, 0x5C, 0xD0, 0x5C, 0x13, 0x01, 0x5D,
111 0x16, 0xA5, 0x16, 0x71, 0x07, 0xE2, 0x5C, 0xCB, 0x5C, 0x76,
112 0x1B, 0x03, 0x13, 0x00, 0x3E, 0x00, 0x3C, 0x42, 0x42, 0x7E,
113 0x42, 0x42, 0x00, 0x00, 0x7C, 0x42, 0x7C, 0x42, 0x42, 0x7C,
114 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00,
115 0x78, 0x44, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x7E, 0x40,
116 0x7C, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x7E, 0x40, 0x7C, 0x40,
117 0x40, 0x40, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x4E, 0x42, 0x3C,
118 0x00, 0x00, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00,
119 0x3E, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x02, 0x02,
120 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x44, 0x48, 0x70, 0x48,
121 0x44, 0x42, 0x00, 0x00, 0xED, 0xED, 0x05, 0x40, 0x7E, 0x00,
122 0x00, 0x42, 0x66, 0x5A, 0x42, 0x42, 0x42, 0x00, 0x00, 0x42,
123 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00, 0x00, 0x3C, 0x42, 0x42,
124 0x42, 0x42, 0x3C, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x40,
125 0x40, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x52, 0x4A, 0x3C, 0x00,
126 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x44, 0x42, 0x00, 0x00, 0x3C,
127 0x40, 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0xFE, 0xED, 0xED,
128 0x05, 0x10, 0x00, 0x00, 0xED, 0xED, 0x05, 0x42, 0x3C, 0x00,
129 0x00, 0xED, 0xED, 0x00
130};
131
132const unsigned long loadim_size = 1204;
133
134/* 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "misc.h"
22#include "zxconfig.h"
23#include <stdio.h>
24#include <string.h>
25#include <stdlib.h>
26#include <ctype.h>
27#include "helpers.h"
28/*#include <errno.h>*/
29#include "zxconfig.h"
30#define DIR_SEP_CHAR '/'
31
32char *get_base_name(char *fname)
33{
34 char *p;
35
36 p = fname;
37 for(; *p; p++);
38 for(; p >= fname && *p != DIR_SEP_CHAR; p--);
39 return ++p;
40}
41
42
43int check_ext(const char *filename, const char *ext)
44{
45 int flen, elen;
46 int i;
47
48 flen = (int) rb->strlen(filename);
49 elen = (int) rb->strlen(ext);
50
51 if(flen <= elen + 1) return 0;
52
53 if(filename[flen-elen-1] != '.') return 0;
54 for(i = 0; i < elen; i++) if(filename[flen-elen+i] != toupper(ext[i])) break;
55 if(i == elen) return 1;
56 for(i = 0; i < elen; i++) if(filename[flen-elen+i] != tolower(ext[i])) break;
57 if(i == elen) return 1;
58 return 0;
59}
60
61void add_extension(char *filename, const char *ext)
62{
63 int i;
64 int upper;
65
66 i = (int) rb->strlen(filename);
67 if(filename[i] > 64 && filename[i] < 96) upper = 1;
68 else upper = 0;
69
70 filename[i++] = '.';
71 if(upper)
72 for(; *ext; i++, ext++) filename[i] = toupper(*ext);
73 else
74 for(; *ext; i++, ext++) filename[i] = tolower(*ext);
75}
76
77int file_exist(const char *filename)
78{
79 /*FILE *fp;*/
80 int fd;
81
82 fd = rb->open(filename, O_RDONLY);
83 if(fd != NULL) {
84 rb->close(fd);
85 return 1;
86 }
87 else return 0;
88/* if(errno == ENOENT) return 0;
89 return 1;*/
90}
91
92int try_extension(char *filename, const char *ext)
93{
94 int tend;
95
96 tend = (int) rb->strlen(filename);
97 add_extension(filename, ext);
98 if(file_exist(filename)) return 1;
99
100 filename[tend] = '\0';
101 return 0;
102}
103
104void *malloc_err(size_t size)
105{
106 char *p;
107
108 p = (char *) my_malloc(size);
109 if(p == NULL) {
110 // fprintf(stderr, "Out of memory!\n");
111 /*exit(1);*/
112 }
113 return (void *) p;
114}
115
116char *make_string(char *ostr, const char *nstr)
117{
118 if(ostr != NULL) /*free(ostr)*/ostr=0;
119 ostr = malloc_err(rb->strlen(nstr) + 1);
120 rb->strcpy(ostr, nstr);
121 return ostr;
122}
123
124void free_string(char *ostr)
125{
126 if(ostr != NULL) /*free(ostr)*/ostr=0;
127}
128
129int mis_strcasecmp(const char *s1, const char *s2)
130{
131 int c1, c2;
132
133 for(;; s1++, s2++) {
134 c1 = tolower(*s1);
135 c2 = tolower(*s2);
136
137 if(!c1 || c1 != c2) break;
138 }
139 return c1-c2;
140}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef MISC_H
22#define MISC_H
23
24#include <sys/types.h>
25
26extern char *get_base_name(char *fname);
27extern int check_ext(const char *filename, const char *ext);
28extern void add_extension(char *filename, const char *ext);
29extern int file_exist(const char *filename);
30extern int try_extension(char *filename, const char *ext);
31extern char *spif_get_tape_fileinfo(int *startp, int *nump);
32extern void *malloc_err(size_t size);
33extern char *make_string(char *ostr, const char *nstr);
34extern void free_string(char *ostr);
35
36extern int mis_strcasecmp(const char *s1, const char *s2);
37
38#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 @@
1/* rom_imag.c */
2
3/*
4 This file was generated by ./bin_to_c from binary image
5 file `rom'
6 */
7
8unsigned char rom_imag[] = {
9 0xF3, 0xAF, 0x11, 0xFF, 0xFF, 0xC3, 0xCB, 0x11, 0x2A, 0x5D,
10 0x5C, 0x22, 0x5F, 0x5C, 0x18, 0x43, 0xC3, 0xF2, 0x15, 0xFF,
11 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x5D, 0x5C, 0x7E, 0xCD, 0x7D,
12 0x00, 0xD0, 0xCD, 0x74, 0x00, 0x18, 0xF7, 0xFF, 0xFF, 0xFF,
13 0xC3, 0x5B, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2A,
14 0x61, 0x5C, 0xE5, 0xC3, 0x9E, 0x16, 0xF5, 0xE5, 0x2A, 0x78,
15 0x5C, 0x23, 0x22, 0x78, 0x5C, 0x7C, 0xB5, 0x20, 0x03, 0xFD,
16 0x34, 0x40, 0xC5, 0xD5, 0xCD, 0xBF, 0x02, 0xD1, 0xC1, 0xE1,
17 0xF1, 0xFB, 0xC9, 0xE1, 0x6E, 0xFD, 0x75, 0x00, 0xED, 0x7B,
18 0x3D, 0x5C, 0xC3, 0xC5, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
19 0xFF, 0xFF, 0xF5, 0xE5, 0x2A, 0xB0, 0x5C, 0x7C, 0xB5, 0x20,
20 0x01, 0xE9, 0xE1, 0xF1, 0xED, 0x45, 0x2A, 0x5D, 0x5C, 0x23,
21 0x22, 0x5D, 0x5C, 0x7E, 0xC9, 0xFE, 0x21, 0xD0, 0xFE, 0x0D,
22 0xC8, 0xFE, 0x10, 0xD8, 0xFE, 0x18, 0x3F, 0xD8, 0x23, 0xFE,
23 0x16, 0x38, 0x01, 0x23, 0x37, 0x22, 0x5D, 0x5C, 0xC9, 0xBF,
24 0x52, 0x4E, 0xC4, 0x49, 0x4E, 0x4B, 0x45, 0x59, 0xA4, 0x50,
25 0xC9, 0x46, 0xCE, 0x50, 0x4F, 0x49, 0x4E, 0xD4, 0x53, 0x43,
26 0x52, 0x45, 0x45, 0x4E, 0xA4, 0x41, 0x54, 0x54, 0xD2, 0x41,
27 0xD4, 0x54, 0x41, 0xC2, 0x56, 0x41, 0x4C, 0xA4, 0x43, 0x4F,
28 0x44, 0xC5, 0x56, 0x41, 0xCC, 0x4C, 0x45, 0xCE, 0x53, 0x49,
29 0xCE, 0x43, 0x4F, 0xD3, 0x54, 0x41, 0xCE, 0x41, 0x53, 0xCE,
30 0x41, 0x43, 0xD3, 0x41, 0x54, 0xCE, 0x4C, 0xCE, 0x45, 0x58,
31 0xD0, 0x49, 0x4E, 0xD4, 0x53, 0x51, 0xD2, 0x53, 0x47, 0xCE,
32 0x41, 0x42, 0xD3, 0x50, 0x45, 0x45, 0xCB, 0x49, 0xCE, 0x55,
33 0x53, 0xD2, 0x53, 0x54, 0x52, 0xA4, 0x43, 0x48, 0x52, 0xA4,
34 0x4E, 0x4F, 0xD4, 0x42, 0x49, 0xCE, 0x4F, 0xD2, 0x41, 0x4E,
35 0xC4, 0x3C, 0xBD, 0x3E, 0xBD, 0x3C, 0xBE, 0x4C, 0x49, 0x4E,
36 0xC5, 0x54, 0x48, 0x45, 0xCE, 0x54, 0xCF, 0x53, 0x54, 0x45,
37 0xD0, 0x44, 0x45, 0x46, 0x20, 0x46, 0xCE, 0x43, 0x41, 0xD4,
38 0x46, 0x4F, 0x52, 0x4D, 0x41, 0xD4, 0x4D, 0x4F, 0x56, 0xC5,
39 0x45, 0x52, 0x41, 0x53, 0xC5, 0x4F, 0x50, 0x45, 0x4E, 0x20,
40 0xA3, 0x43, 0x4C, 0x4F, 0x53, 0x45, 0x20, 0xA3, 0x4D, 0x45,
41 0x52, 0x47, 0xC5, 0x56, 0x45, 0x52, 0x49, 0x46, 0xD9, 0x42,
42 0x45, 0x45, 0xD0, 0x43, 0x49, 0x52, 0x43, 0x4C, 0xC5, 0x49,
43 0x4E, 0xCB, 0x50, 0x41, 0x50, 0x45, 0xD2, 0x46, 0x4C, 0x41,
44 0x53, 0xC8, 0x42, 0x52, 0x49, 0x47, 0x48, 0xD4, 0x49, 0x4E,
45 0x56, 0x45, 0x52, 0x53, 0xC5, 0x4F, 0x56, 0x45, 0xD2, 0x4F,
46 0x55, 0xD4, 0x4C, 0x50, 0x52, 0x49, 0x4E, 0xD4, 0x4C, 0x4C,
47 0x49, 0x53, 0xD4, 0x53, 0x54, 0x4F, 0xD0, 0x52, 0x45, 0x41,
48 0xC4, 0x44, 0x41, 0x54, 0xC1, 0x52, 0x45, 0x53, 0x54, 0x4F,
49 0x52, 0xC5, 0x4E, 0x45, 0xD7, 0x42, 0x4F, 0x52, 0x44, 0x45,
50 0xD2, 0x43, 0x4F, 0x4E, 0x54, 0x49, 0x4E, 0x55, 0xC5, 0x44,
51 0x49, 0xCD, 0x52, 0x45, 0xCD, 0x46, 0x4F, 0xD2, 0x47, 0x4F,
52 0x20, 0x54, 0xCF, 0x47, 0x4F, 0x20, 0x53, 0x55, 0xC2, 0x49,
53 0x4E, 0x50, 0x55, 0xD4, 0x4C, 0x4F, 0x41, 0xC4, 0x4C, 0x49,
54 0x53, 0xD4, 0x4C, 0x45, 0xD4, 0x50, 0x41, 0x55, 0x53, 0xC5,
55 0x4E, 0x45, 0x58, 0xD4, 0x50, 0x4F, 0x4B, 0xC5, 0x50, 0x52,
56 0x49, 0x4E, 0xD4, 0x50, 0x4C, 0x4F, 0xD4, 0x52, 0x55, 0xCE,
57 0x53, 0x41, 0x56, 0xC5, 0x52, 0x41, 0x4E, 0x44, 0x4F, 0x4D,
58 0x49, 0x5A, 0xC5, 0x49, 0xC6, 0x43, 0x4C, 0xD3, 0x44, 0x52,
59 0x41, 0xD7, 0x43, 0x4C, 0x45, 0x41, 0xD2, 0x52, 0x45, 0x54,
60 0x55, 0x52, 0xCE, 0x43, 0x4F, 0x50, 0xD9, 0x42, 0x48, 0x59,
61 0x36, 0x35, 0x54, 0x47, 0x56, 0x4E, 0x4A, 0x55, 0x37, 0x34,
62 0x52, 0x46, 0x43, 0x4D, 0x4B, 0x49, 0x38, 0x33, 0x45, 0x44,
63 0x58, 0x0E, 0x4C, 0x4F, 0x39, 0x32, 0x57, 0x53, 0x5A, 0x20,
64 0x0D, 0x50, 0x30, 0x31, 0x51, 0x41, 0xE3, 0xC4, 0xE0, 0xE4,
65 0xB4, 0xBC, 0xBD, 0xBB, 0xAF, 0xB0, 0xB1, 0xC0, 0xA7, 0xA6,
66 0xBE, 0xAD, 0xB2, 0xBA, 0xE5, 0xA5, 0xC2, 0xE1, 0xB3, 0xB9,
67 0xC1, 0xB8, 0x7E, 0xDC, 0xDA, 0x5C, 0xB7, 0x7B, 0x7D, 0xD8,
68 0xBF, 0xAE, 0xAA, 0xAB, 0xDD, 0xDE, 0xDF, 0x7F, 0xB5, 0xD6,
69 0x7C, 0xD5, 0x5D, 0xDB, 0xB6, 0xD9, 0x5B, 0xD7, 0x0C, 0x07,
70 0x06, 0x04, 0x05, 0x08, 0x0A, 0x0B, 0x09, 0x0F, 0xE2, 0x2A,
71 0x3F, 0xCD, 0xC8, 0xCC, 0xCB, 0x5E, 0xAC, 0x2D, 0x2B, 0x3D,
72 0x2E, 0x2C, 0x3B, 0x22, 0xC7, 0x3C, 0xC3, 0x3E, 0xC5, 0x2F,
73 0xC9, 0x60, 0xC6, 0x3A, 0xD0, 0xCE, 0xA8, 0xCA, 0xD3, 0xD4,
74 0xD1, 0xD2, 0xA9, 0xCF, 0x2E, 0x2F, 0x11, 0xFF, 0xFF, 0x01,
75 0xFE, 0xFE, 0xED, 0x78, 0x2F, 0xE6, 0x1F, 0x28, 0x0E, 0x67,
76 0x7D, 0x14, 0xC0, 0xD6, 0x08, 0xCB, 0x3C, 0x30, 0xFA, 0x53,
77 0x5F, 0x20, 0xF4, 0x2D, 0xCB, 0x00, 0x38, 0xE6, 0x7A, 0x3C,
78 0xC8, 0xFE, 0x28, 0xC8, 0xFE, 0x19, 0xC8, 0x7B, 0x5A, 0x57,
79 0xFE, 0x18, 0xC9, 0xCD, 0x8E, 0x02, 0xC0, 0x21, 0x00, 0x5C,
80 0xCB, 0x7E, 0x20, 0x07, 0x23, 0x35, 0x2B, 0x20, 0x02, 0x36,
81 0xFF, 0x7D, 0x21, 0x04, 0x5C, 0xBD, 0x20, 0xEE, 0xCD, 0x1E,
82 0x03, 0xD0, 0x21, 0x00, 0x5C, 0xBE, 0x28, 0x2E, 0xEB, 0x21,
83 0x04, 0x5C, 0xBE, 0x28, 0x27, 0xCB, 0x7E, 0x20, 0x04, 0xEB,
84 0xCB, 0x7E, 0xC8, 0x5F, 0x77, 0x23, 0x36, 0x05, 0x23, 0x3A,
85 0x09, 0x5C, 0x77, 0x23, 0xFD, 0x4E, 0x07, 0xFD, 0x56, 0x01,
86 0xE5, 0xCD, 0x33, 0x03, 0xE1, 0x77, 0x32, 0x08, 0x5C, 0xFD,
87 0xCB, 0x01, 0xEE, 0xC9, 0x23, 0x36, 0x05, 0x23, 0x35, 0xC0,
88 0x3A, 0x0A, 0x5C, 0x77, 0x23, 0x7E, 0x18, 0xEA, 0x42, 0x16,
89 0x00, 0x7B, 0xFE, 0x27, 0xD0, 0xFE, 0x18, 0x20, 0x03, 0xCB,
90 0x78, 0xC0, 0x21, 0x05, 0x02, 0x19, 0x7E, 0x37, 0xC9, 0x7B,
91 0xFE, 0x3A, 0x38, 0x2F, 0x0D, 0xFA, 0x4F, 0x03, 0x28, 0x03,
92 0xC6, 0x4F, 0xC9, 0x21, 0xEB, 0x01, 0x04, 0x28, 0x03, 0x21,
93 0x05, 0x02, 0x16, 0x00, 0x19, 0x7E, 0xC9, 0x21, 0x29, 0x02,
94 0xCB, 0x40, 0x28, 0xF4, 0xCB, 0x5A, 0x28, 0x0A, 0xFD, 0xCB,
95 0x30, 0x5E, 0xC0, 0x04, 0xC0, 0xC6, 0x20, 0xC9, 0xC6, 0xA5,
96 0xC9, 0xFE, 0x30, 0xD8, 0x0D, 0xFA, 0x9D, 0x03, 0x20, 0x19,
97 0x21, 0x54, 0x02, 0xCB, 0x68, 0x28, 0xD3, 0xFE, 0x38, 0x30,
98 0x07, 0xD6, 0x20, 0x04, 0xC8, 0xC6, 0x08, 0xC9, 0xD6, 0x36,
99 0x04, 0xC8, 0xC6, 0xFE, 0xC9, 0x21, 0x30, 0x02, 0xFE, 0x39,
100 0x28, 0xBA, 0xFE, 0x30, 0x28, 0xB6, 0xE6, 0x07, 0xC6, 0x80,
101 0x04, 0xC8, 0xEE, 0x0F, 0xC9, 0x04, 0xC8, 0xCB, 0x68, 0x21,
102 0x30, 0x02, 0x20, 0xA4, 0xD6, 0x10, 0xFE, 0x22, 0x28, 0x06,
103 0xFE, 0x20, 0xC0, 0x3E, 0x5F, 0xC9, 0x3E, 0x40, 0xC9, 0xF3,
104 0x7D, 0xCB, 0x3D, 0xCB, 0x3D, 0x2F, 0xE6, 0x03, 0x4F, 0x06,
105 0x00, 0xDD, 0x21, 0xD1, 0x03, 0xDD, 0x09, 0x3A, 0x48, 0x5C,
106 0xE6, 0x38, 0x0F, 0x0F, 0x0F, 0xF6, 0x08, 0x00, 0x00, 0x00,
107 0x04, 0x0C, 0x0D, 0x20, 0xFD, 0x0E, 0x3F, 0x05, 0xC2, 0xD6,
108 0x03, 0xEE, 0x10, 0xD3, 0xFE, 0x44, 0x4F, 0xCB, 0x67, 0x20,
109 0x09, 0x7A, 0xB3, 0x28, 0x09, 0x79, 0x4D, 0x1B, 0xDD, 0xE9,
110 0x4D, 0x0C, 0xDD, 0xE9, 0xFB, 0xC9, 0xEF, 0x31, 0x27, 0xC0,
111 0x03, 0x34, 0xEC, 0x6C, 0x98, 0x1F, 0xF5, 0x04, 0xA1, 0x0F,
112 0x38, 0x21, 0x92, 0x5C, 0x7E, 0xA7, 0x20, 0x5E, 0x23, 0x4E,
113 0x23, 0x46, 0x78, 0x17, 0x9F, 0xB9, 0x20, 0x54, 0x23, 0xBE,
114 0x20, 0x50, 0x78, 0xC6, 0x3C, 0xF2, 0x25, 0x04, 0xE2, 0x6C,
115 0x04, 0x06, 0xFA, 0x04, 0xD6, 0x0C, 0x30, 0xFB, 0xC6, 0x0C,
116 0xC5, 0x21, 0x6E, 0x04, 0xCD, 0x06, 0x34, 0xCD, 0xB4, 0x33,
117 0xEF, 0x04, 0x38, 0xF1, 0x86, 0x77, 0xEF, 0xC0, 0x02, 0x31,
118 0x38, 0xCD, 0x94, 0x1E, 0xFE, 0x0B, 0x30, 0x22, 0xEF, 0xE0,
119 0x04, 0xE0, 0x34, 0x80, 0x43, 0x55, 0x9F, 0x80, 0x01, 0x05,
120 0x34, 0x35, 0x71, 0x03, 0x38, 0xCD, 0x99, 0x1E, 0xC5, 0xCD,
121 0x99, 0x1E, 0xE1, 0x50, 0x59, 0x7A, 0xB3, 0xC8, 0x1B, 0xC3,
122 0xB5, 0x03, 0xCF, 0x0A, 0x89, 0x02, 0xD0, 0x12, 0x86, 0x89,
123 0x0A, 0x97, 0x60, 0x75, 0x89, 0x12, 0xD5, 0x17, 0x1F, 0x89,
124 0x1B, 0x90, 0x41, 0x02, 0x89, 0x24, 0xD0, 0x53, 0xCA, 0x89,
125 0x2E, 0x9D, 0x36, 0xB1, 0x89, 0x38, 0xFF, 0x49, 0x3E, 0x89,
126 0x43, 0xFF, 0x6A, 0x73, 0x89, 0x4F, 0xA7, 0x00, 0x54, 0x89,
127 0x5C, 0x00, 0x00, 0x00, 0x89, 0x69, 0x14, 0xF6, 0x24, 0x89,
128 0x76, 0xF1, 0x10, 0x05, 0xCD, 0xFB, 0x24, 0x3A, 0x3B, 0x5C,
129 0x87, 0xFA, 0x8A, 0x1C, 0xE1, 0xD0, 0xE5, 0xCD, 0xF1, 0x2B,
130 0x62, 0x6B, 0x0D, 0xF8, 0x09, 0xCB, 0xFE, 0xC9, 0x21, 0x3F,
131 0x05, 0xE5, 0x21, 0x80, 0x1F, 0xCB, 0x7F, 0x28, 0x03, 0x21,
132 0x98, 0x0C, 0x08, 0x13, 0xDD, 0x2B, 0xF3, 0x3E, 0x02, 0x47,
133 0x10, 0xFE, 0xD3, 0xFE, 0xEE, 0x0F, 0x06, 0xA4, 0x2D, 0x20,
134 0xF5, 0x05, 0x25, 0xF2, 0xD8, 0x04, 0x06, 0x2F, 0x10, 0xFE,
135 0xD3, 0xFE, 0x3E, 0x0D, 0x06, 0x37, 0x10, 0xFE, 0xD3, 0xFE,
136 0x01, 0x0E, 0x3B, 0x08, 0x6F, 0xC3, 0x07, 0x05, 0x7A, 0xB3,
137 0x28, 0x0C, 0xDD, 0x6E, 0x00, 0x7C, 0xAD, 0x67, 0x3E, 0x01,
138 0x37, 0xC3, 0x25, 0x05, 0x6C, 0x18, 0xF4, 0x79, 0xCB, 0x78,
139 0x10, 0xFE, 0x30, 0x04, 0x06, 0x42, 0x10, 0xFE, 0xD3, 0xFE,
140 0x06, 0x3E, 0x20, 0xEF, 0x05, 0xAF, 0x3C, 0xCB, 0x15, 0xC2,
141 0x14, 0x05, 0x1B, 0xDD, 0x23, 0x06, 0x31, 0x3E, 0x7F, 0xDB,
142 0xFE, 0x1F, 0xD0, 0x7A, 0x3C, 0xC2, 0xFE, 0x04, 0x06, 0x3B,
143 0x10, 0xFE, 0xC9, 0xF5, 0x3A, 0x48, 0x5C, 0xE6, 0x38, 0x0F,
144 0x0F, 0x0F, 0xD3, 0xFE, 0x3E, 0x7F, 0xDB, 0xFE, 0x1F, 0xFB,
145 0x38, 0x02, 0xCF, 0x0C, 0xF1, 0xC9, 0x14, 0x08, 0x15, 0xF3,
146 0x3E, 0x0F, 0xD3, 0xFE, 0x21, 0x3F, 0x05, 0xE5, 0xDB, 0xFE,
147 0x1F, 0xE6, 0x20, 0xF6, 0x02, 0x4F, 0xBF, 0xC0, 0xCD, 0xE7,
148 0x05, 0x30, 0xFA, 0x21, 0x15, 0x04, 0x10, 0xFE, 0x2B, 0x7C,
149 0xB5, 0x20, 0xF9, 0xCD, 0xE3, 0x05, 0x30, 0xEB, 0x06, 0x9C,
150 0xCD, 0xE3, 0x05, 0x30, 0xE4, 0x3E, 0xC6, 0xB8, 0x30, 0xE0,
151 0x24, 0x20, 0xF1, 0x06, 0xC9, 0xCD, 0xE7, 0x05, 0x30, 0xD5,
152 0x78, 0xFE, 0xD4, 0x30, 0xF4, 0xCD, 0xE7, 0x05, 0xD0, 0x79,
153 0xEE, 0x03, 0x4F, 0x26, 0x00, 0x06, 0xB0, 0x18, 0x1F, 0x08,
154 0x20, 0x07, 0x30, 0x0F, 0xDD, 0x75, 0x00, 0x18, 0x0F, 0xCB,
155 0x11, 0xAD, 0xC0, 0x79, 0x1F, 0x4F, 0x13, 0x18, 0x07, 0xDD,
156 0x7E, 0x00, 0xAD, 0xC0, 0xDD, 0x23, 0x1B, 0x08, 0x06, 0xB2,
157 0x2E, 0x01, 0xCD, 0xE3, 0x05, 0xD0, 0x3E, 0xCB, 0xB8, 0xCB,
158 0x15, 0x06, 0xB0, 0xD2, 0xCA, 0x05, 0x7C, 0xAD, 0x67, 0x7A,
159 0xB3, 0x20, 0xCA, 0x7C, 0xFE, 0x01, 0xC9, 0xCD, 0xE7, 0x05,
160 0xD0, 0x3E, 0x16, 0x3D, 0x20, 0xFD, 0xA7, 0x04, 0xC8, 0x3E,
161 0x7F, 0xDB, 0xFE, 0x1F, 0xD0, 0xA9, 0xE6, 0x20, 0x28, 0xF3,
162 0x79, 0x2F, 0x4F, 0xE6, 0x07, 0xF6, 0x08, 0xD3, 0xFE, 0x37,
163 0xC9, 0xF1, 0x3A, 0x74, 0x5C, 0xD6, 0xE0, 0x32, 0x74, 0x5C,
164 0xCD, 0x8C, 0x1C, 0xCD, 0x30, 0x25, 0x28, 0x3C, 0x01, 0x11,
165 0x00, 0x3A, 0x74, 0x5C, 0xA7, 0x28, 0x02, 0x0E, 0x22, 0xF7,
166 0xD5, 0xDD, 0xE1, 0x06, 0x0B, 0x3E, 0x20, 0x12, 0x13, 0x10,
167 0xFC, 0xDD, 0x36, 0x01, 0xFF, 0xCD, 0xF1, 0x2B, 0x21, 0xF6,
168 0xFF, 0x0B, 0x09, 0x03, 0x30, 0x0F, 0x3A, 0x74, 0x5C, 0xA7,
169 0x20, 0x02, 0xCF, 0x0E, 0x78, 0xB1, 0x28, 0x0A, 0x01, 0x0A,
170 0x00, 0xDD, 0xE5, 0xE1, 0x23, 0xEB, 0xED, 0xB0, 0xDF, 0xFE,
171 0xE4, 0x20, 0x49, 0x3A, 0x74, 0x5C, 0xFE, 0x03, 0xCA, 0x8A,
172 0x1C, 0xE7, 0xCD, 0xB2, 0x28, 0xCB, 0xF9, 0x30, 0x0B, 0x21,
173 0x00, 0x00, 0x3A, 0x74, 0x5C, 0x3D, 0x28, 0x15, 0xCF, 0x01,
174 0xC2, 0x8A, 0x1C, 0xCD, 0x30, 0x25, 0x28, 0x18, 0x23, 0x7E,
175 0xDD, 0x77, 0x0B, 0x23, 0x7E, 0xDD, 0x77, 0x0C, 0x23, 0xDD,
176 0x71, 0x0E, 0x3E, 0x01, 0xCB, 0x71, 0x28, 0x01, 0x3C, 0xDD,
177 0x77, 0x00, 0xEB, 0xE7, 0xFE, 0x29, 0x20, 0xDA, 0xE7, 0xCD,
178 0xEE, 0x1B, 0xEB, 0xC3, 0x5A, 0x07, 0xFE, 0xAA, 0x20, 0x1F,
179 0x3A, 0x74, 0x5C, 0xFE, 0x03, 0xCA, 0x8A, 0x1C, 0xE7, 0xCD,
180 0xEE, 0x1B, 0xDD, 0x36, 0x0B, 0x00, 0xDD, 0x36, 0x0C, 0x1B,
181 0x21, 0x00, 0x40, 0xDD, 0x75, 0x0D, 0xDD, 0x74, 0x0E, 0x18,
182 0x4D, 0xFE, 0xAF, 0x20, 0x4F, 0x3A, 0x74, 0x5C, 0xFE, 0x03,
183 0xCA, 0x8A, 0x1C, 0xE7, 0xCD, 0x48, 0x20, 0x20, 0x0C, 0x3A,
184 0x74, 0x5C, 0xA7, 0xCA, 0x8A, 0x1C, 0xCD, 0xE6, 0x1C, 0x18,
185 0x0F, 0xCD, 0x82, 0x1C, 0xDF, 0xFE, 0x2C, 0x28, 0x0C, 0x3A,
186 0x74, 0x5C, 0xA7, 0xCA, 0x8A, 0x1C, 0xCD, 0xE6, 0x1C, 0x18,
187 0x04, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0xCD, 0x99,
188 0x1E, 0xDD, 0x71, 0x0B, 0xDD, 0x70, 0x0C, 0xCD, 0x99, 0x1E,
189 0xDD, 0x71, 0x0D, 0xDD, 0x70, 0x0E, 0x60, 0x69, 0xDD, 0x36,
190 0x00, 0x03, 0x18, 0x44, 0xFE, 0xCA, 0x28, 0x09, 0xCD, 0xEE,
191 0x1B, 0xDD, 0x36, 0x0E, 0x80, 0x18, 0x17, 0x3A, 0x74, 0x5C,
192 0xA7, 0xC2, 0x8A, 0x1C, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE,
193 0x1B, 0xCD, 0x99, 0x1E, 0xDD, 0x71, 0x0D, 0xDD, 0x70, 0x0E,
194 0xDD, 0x36, 0x00, 0x00, 0x2A, 0x59, 0x5C, 0xED, 0x5B, 0x53,
195 0x5C, 0x37, 0xED, 0x52, 0xDD, 0x75, 0x0B, 0xDD, 0x74, 0x0C,
196 0x2A, 0x4B, 0x5C, 0xED, 0x52, 0xDD, 0x75, 0x0F, 0xDD, 0x74,
197 0x10, 0xEB, 0x3A, 0x74, 0x5C, 0xA7, 0xCA, 0x70, 0x09, 0xE5,
198 0x01, 0x11, 0x00, 0xDD, 0x09, 0xDD, 0xE5, 0x11, 0x11, 0x00,
199 0xAF, 0x37, 0xCD, 0x56, 0x05, 0xDD, 0xE1, 0x30, 0xF2, 0x3E,
200 0xFE, 0xCD, 0x01, 0x16, 0xFD, 0x36, 0x52, 0x03, 0x0E, 0x80,
201 0xDD, 0x7E, 0x00, 0xDD, 0xBE, 0xEF, 0x20, 0x02, 0x0E, 0xF6,
202 0xFE, 0x04, 0x30, 0xD9, 0x11, 0xC0, 0x09, 0xC5, 0xCD, 0x0A,
203 0x0C, 0xC1, 0xDD, 0xE5, 0xD1, 0x21, 0xF0, 0xFF, 0x19, 0x06,
204 0x0A, 0x7E, 0x3C, 0x20, 0x03, 0x79, 0x80, 0x4F, 0x13, 0x1A,
205 0xBE, 0x23, 0x20, 0x01, 0x0C, 0xD7, 0x10, 0xF6, 0xCB, 0x79,
206 0x20, 0xB3, 0x3E, 0x0D, 0xD7, 0xE1, 0xDD, 0x7E, 0x00, 0xFE,
207 0x03, 0x28, 0x0C, 0x3A, 0x74, 0x5C, 0x3D, 0xCA, 0x08, 0x08,
208 0xFE, 0x02, 0xCA, 0xB6, 0x08, 0xE5, 0xDD, 0x6E, 0xFA, 0xDD,
209 0x66, 0xFB, 0xDD, 0x5E, 0x0B, 0xDD, 0x56, 0x0C, 0x7C, 0xB5,
210 0x28, 0x0D, 0xED, 0x52, 0x38, 0x26, 0x28, 0x07, 0xDD, 0x7E,
211 0x00, 0xFE, 0x03, 0x20, 0x1D, 0xE1, 0x7C, 0xB5, 0x20, 0x06,
212 0xDD, 0x6E, 0x0D, 0xDD, 0x66, 0x0E, 0xE5, 0xDD, 0xE1, 0x3A,
213 0x74, 0x5C, 0xFE, 0x02, 0x37, 0x20, 0x01, 0xA7, 0x3E, 0xFF,
214 0xCD, 0x56, 0x05, 0xD8, 0xCF, 0x1A, 0xDD, 0x5E, 0x0B, 0xDD,
215 0x56, 0x0C, 0xE5, 0x7C, 0xB5, 0x20, 0x06, 0x13, 0x13, 0x13,
216 0xEB, 0x18, 0x0C, 0xDD, 0x6E, 0xFA, 0xDD, 0x66, 0xFB, 0xEB,
217 0x37, 0xED, 0x52, 0x38, 0x09, 0x11, 0x05, 0x00, 0x19, 0x44,
218 0x4D, 0xCD, 0x05, 0x1F, 0xE1, 0xDD, 0x7E, 0x00, 0xA7, 0x28,
219 0x3E, 0x7C, 0xB5, 0x28, 0x13, 0x2B, 0x46, 0x2B, 0x4E, 0x2B,
220 0x03, 0x03, 0x03, 0xDD, 0x22, 0x5F, 0x5C, 0xCD, 0xE8, 0x19,
221 0xDD, 0x2A, 0x5F, 0x5C, 0x2A, 0x59, 0x5C, 0x2B, 0xDD, 0x4E,
222 0x0B, 0xDD, 0x46, 0x0C, 0xC5, 0x03, 0x03, 0x03, 0xDD, 0x7E,
223 0xFD, 0xF5, 0xCD, 0x55, 0x16, 0x23, 0xF1, 0x77, 0xD1, 0x23,
224 0x73, 0x23, 0x72, 0x23, 0xE5, 0xDD, 0xE1, 0x37, 0x3E, 0xFF,
225 0xC3, 0x02, 0x08, 0xEB, 0x2A, 0x59, 0x5C, 0x2B, 0xDD, 0x22,
226 0x5F, 0x5C, 0xDD, 0x4E, 0x0B, 0xDD, 0x46, 0x0C, 0xC5, 0xCD,
227 0xE5, 0x19, 0xC1, 0xE5, 0xC5, 0xCD, 0x55, 0x16, 0xDD, 0x2A,
228 0x5F, 0x5C, 0x23, 0xDD, 0x4E, 0x0F, 0xDD, 0x46, 0x10, 0x09,
229 0x22, 0x4B, 0x5C, 0xDD, 0x66, 0x0E, 0x7C, 0xE6, 0xC0, 0x20,
230 0x0A, 0xDD, 0x6E, 0x0D, 0x22, 0x42, 0x5C, 0xFD, 0x36, 0x0A,
231 0x00, 0xD1, 0xDD, 0xE1, 0x37, 0x3E, 0xFF, 0xC3, 0x02, 0x08,
232 0xDD, 0x4E, 0x0B, 0xDD, 0x46, 0x0C, 0xC5, 0x03, 0xF7, 0x36,
233 0x80, 0xEB, 0xD1, 0xE5, 0xE5, 0xDD, 0xE1, 0x37, 0x3E, 0xFF,
234 0xCD, 0x02, 0x08, 0xE1, 0xED, 0x5B, 0x53, 0x5C, 0x7E, 0xE6,
235 0xC0, 0x20, 0x19, 0x1A, 0x13, 0xBE, 0x23, 0x20, 0x02, 0x1A,
236 0xBE, 0x1B, 0x2B, 0x30, 0x08, 0xE5, 0xEB, 0xCD, 0xB8, 0x19,
237 0xE1, 0x18, 0xEC, 0xCD, 0x2C, 0x09, 0x18, 0xE2, 0x7E, 0x4F,
238 0xFE, 0x80, 0xC8, 0xE5, 0x2A, 0x4B, 0x5C, 0x7E, 0xFE, 0x80,
239 0x28, 0x25, 0xB9, 0x28, 0x08, 0xC5, 0xCD, 0xB8, 0x19, 0xC1,
240 0xEB, 0x18, 0xF0, 0xE6, 0xE0, 0xFE, 0xA0, 0x20, 0x12, 0xD1,
241 0xD5, 0xE5, 0x23, 0x13, 0x1A, 0xBE, 0x20, 0x06, 0x17, 0x30,
242 0xF7, 0xE1, 0x18, 0x03, 0xE1, 0x18, 0xE0, 0x3E, 0xFF, 0xD1,
243 0xEB, 0x3C, 0x37, 0xCD, 0x2C, 0x09, 0x18, 0xC4, 0x20, 0x10,
244 0x08, 0x22, 0x5F, 0x5C, 0xEB, 0xCD, 0xB8, 0x19, 0xCD, 0xE8,
245 0x19, 0xEB, 0x2A, 0x5F, 0x5C, 0x08, 0x08, 0xD5, 0xCD, 0xB8,
246 0x19, 0x22, 0x5F, 0x5C, 0x2A, 0x53, 0x5C, 0xE3, 0xC5, 0x08,
247 0x38, 0x07, 0x2B, 0xCD, 0x55, 0x16, 0x23, 0x18, 0x03, 0xCD,
248 0x55, 0x16, 0x23, 0xC1, 0xD1, 0xED, 0x53, 0x53, 0x5C, 0xED,
249 0x5B, 0x5F, 0x5C, 0xC5, 0xD5, 0xEB, 0xED, 0xB0, 0xE1, 0xC1,
250 0xD5, 0xCD, 0xE8, 0x19, 0xD1, 0xC9, 0xE5, 0x3E, 0xFD, 0xCD,
251 0x01, 0x16, 0xAF, 0x11, 0xA1, 0x09, 0xCD, 0x0A, 0x0C, 0xFD,
252 0xCB, 0x02, 0xEE, 0xCD, 0xD4, 0x15, 0xDD, 0xE5, 0x11, 0x11,
253 0x00, 0xAF, 0xCD, 0xC2, 0x04, 0xDD, 0xE1, 0x06, 0x32, 0x76,
254 0x10, 0xFD, 0xDD, 0x5E, 0x0B, 0xDD, 0x56, 0x0C, 0x3E, 0xFF,
255 0xDD, 0xE1, 0xC3, 0xC2, 0x04, 0x80, 0x53, 0x74, 0x61, 0x72,
256 0x74, 0x20, 0x74, 0x61, 0x70, 0x65, 0x2C, 0x20, 0x74, 0x68,
257 0x65, 0x6E, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61,
258 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79, 0xAE, 0x0D, 0x50, 0x72,
259 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x3A, 0xA0, 0x0D, 0x4E, 0x75,
260 0x6D, 0x62, 0x65, 0x72, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79,
261 0x3A, 0xA0, 0x0D, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
262 0x65, 0x72, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3A, 0xA0,
263 0x0D, 0x42, 0x79, 0x74, 0x65, 0x73, 0x3A, 0xA0, 0xCD, 0x03,
264 0x0B, 0xFE, 0x20, 0xD2, 0xD9, 0x0A, 0xFE, 0x06, 0x38, 0x69,
265 0xFE, 0x18, 0x30, 0x65, 0x21, 0x0B, 0x0A, 0x5F, 0x16, 0x00,
266 0x19, 0x5E, 0x19, 0xE5, 0xC3, 0x03, 0x0B, 0x4E, 0x57, 0x10,
267 0x29, 0x54, 0x53, 0x52, 0x37, 0x50, 0x4F, 0x5F, 0x5E, 0x5D,
268 0x5C, 0x5B, 0x5A, 0x54, 0x53, 0x0C, 0x3E, 0x22, 0xB9, 0x20,
269 0x11, 0xFD, 0xCB, 0x01, 0x4E, 0x20, 0x09, 0x04, 0x0E, 0x02,
270 0x3E, 0x18, 0xB8, 0x20, 0x03, 0x05, 0x0E, 0x21, 0xC3, 0xD9,
271 0x0D, 0x3A, 0x91, 0x5C, 0xF5, 0xFD, 0x36, 0x57, 0x01, 0x3E,
272 0x20, 0xCD, 0x65, 0x0B, 0xF1, 0x32, 0x91, 0x5C, 0xC9, 0xFD,
273 0xCB, 0x01, 0x4E, 0xC2, 0xCD, 0x0E, 0x0E, 0x21, 0xCD, 0x55,
274 0x0C, 0x05, 0xC3, 0xD9, 0x0D, 0xCD, 0x03, 0x0B, 0x79, 0x3D,
275 0x3D, 0xE6, 0x10, 0x18, 0x5A, 0x3E, 0x3F, 0x18, 0x6C, 0x11,
276 0x87, 0x0A, 0x32, 0x0F, 0x5C, 0x18, 0x0B, 0x11, 0x6D, 0x0A,
277 0x18, 0x03, 0x11, 0x87, 0x0A, 0x32, 0x0E, 0x5C, 0x2A, 0x51,
278 0x5C, 0x73, 0x23, 0x72, 0xC9, 0x11, 0xF4, 0x09, 0xCD, 0x80,
279 0x0A, 0x2A, 0x0E, 0x5C, 0x57, 0x7D, 0xFE, 0x16, 0xDA, 0x11,
280 0x22, 0x20, 0x29, 0x44, 0x4A, 0x3E, 0x1F, 0x91, 0x38, 0x0C,
281 0xC6, 0x02, 0x4F, 0xFD, 0xCB, 0x01, 0x4E, 0x20, 0x16, 0x3E,
282 0x16, 0x90, 0xDA, 0x9F, 0x1E, 0x3C, 0x47, 0x04, 0xFD, 0xCB,
283 0x02, 0x46, 0xC2, 0x55, 0x0C, 0xFD, 0xBE, 0x31, 0xDA, 0x86,
284 0x0C, 0xC3, 0xD9, 0x0D, 0x7C, 0xCD, 0x03, 0x0B, 0x81, 0x3D,
285 0xE6, 0x1F, 0xC8, 0x57, 0xFD, 0xCB, 0x01, 0xC6, 0x3E, 0x20,
286 0xCD, 0x3B, 0x0C, 0x15, 0x20, 0xF8, 0xC9, 0xCD, 0x24, 0x0B,
287 0xFD, 0xCB, 0x01, 0x4E, 0x20, 0x1A, 0xFD, 0xCB, 0x02, 0x46,
288 0x20, 0x08, 0xED, 0x43, 0x88, 0x5C, 0x22, 0x84, 0x5C, 0xC9,
289 0xED, 0x43, 0x8A, 0x5C, 0xED, 0x43, 0x82, 0x5C, 0x22, 0x86,
290 0x5C, 0xC9, 0xFD, 0x71, 0x45, 0x22, 0x80, 0x5C, 0xC9, 0xFD,
291 0xCB, 0x01, 0x4E, 0x20, 0x14, 0xED, 0x4B, 0x88, 0x5C, 0x2A,
292 0x84, 0x5C, 0xFD, 0xCB, 0x02, 0x46, 0xC8, 0xED, 0x4B, 0x8A,
293 0x5C, 0x2A, 0x86, 0x5C, 0xC9, 0xFD, 0x4E, 0x45, 0x2A, 0x80,
294 0x5C, 0xC9, 0xFE, 0x80, 0x38, 0x3D, 0xFE, 0x90, 0x30, 0x26,
295 0x47, 0xCD, 0x38, 0x0B, 0xCD, 0x03, 0x0B, 0x11, 0x92, 0x5C,
296 0x18, 0x47, 0x21, 0x92, 0x5C, 0xCD, 0x3E, 0x0B, 0xCB, 0x18,
297 0x9F, 0xE6, 0x0F, 0x4F, 0xCB, 0x18, 0x9F, 0xE6, 0xF0, 0xB1,
298 0x0E, 0x04, 0x77, 0x23, 0x0D, 0x20, 0xFB, 0xC9, 0xD6, 0xA5,
299 0x30, 0x09, 0xC6, 0x15, 0xC5, 0xED, 0x4B, 0x7B, 0x5C, 0x18,
300 0x0B, 0xCD, 0x10, 0x0C, 0xC3, 0x03, 0x0B, 0xC5, 0xED, 0x4B,
301 0x36, 0x5C, 0xEB, 0x21, 0x3B, 0x5C, 0xCB, 0x86, 0xFE, 0x20,
302 0x20, 0x02, 0xCB, 0xC6, 0x26, 0x00, 0x6F, 0x29, 0x29, 0x29,
303 0x09, 0xC1, 0xEB, 0x79, 0x3D, 0x3E, 0x21, 0x20, 0x0E, 0x05,
304 0x4F, 0xFD, 0xCB, 0x01, 0x4E, 0x28, 0x06, 0xD5, 0xCD, 0xCD,
305 0x0E, 0xD1, 0x79, 0xB9, 0xD5, 0xCC, 0x55, 0x0C, 0xD1, 0xC5,
306 0xE5, 0x3A, 0x91, 0x5C, 0x06, 0xFF, 0x1F, 0x38, 0x01, 0x04,
307 0x1F, 0x1F, 0x9F, 0x4F, 0x3E, 0x08, 0xA7, 0xFD, 0xCB, 0x01,
308 0x4E, 0x28, 0x05, 0xFD, 0xCB, 0x30, 0xCE, 0x37, 0xEB, 0x08,
309 0x1A, 0xA0, 0xAE, 0xA9, 0x12, 0x08, 0x38, 0x13, 0x14, 0x23,
310 0x3D, 0x20, 0xF2, 0xEB, 0x25, 0xFD, 0xCB, 0x01, 0x4E, 0xCC,
311 0xDB, 0x0B, 0xE1, 0xC1, 0x0D, 0x23, 0xC9, 0x08, 0x3E, 0x20,
312 0x83, 0x5F, 0x08, 0x18, 0xE6, 0x7C, 0x0F, 0x0F, 0x0F, 0xE6,
313 0x03, 0xF6, 0x58, 0x67, 0xED, 0x5B, 0x8F, 0x5C, 0x7E, 0xAB,
314 0xA2, 0xAB, 0xFD, 0xCB, 0x57, 0x76, 0x28, 0x08, 0xE6, 0xC7,
315 0xCB, 0x57, 0x20, 0x02, 0xEE, 0x38, 0xFD, 0xCB, 0x57, 0x66,
316 0x28, 0x08, 0xE6, 0xF8, 0xCB, 0x6F, 0x20, 0x02, 0xEE, 0x07,
317 0x77, 0xC9, 0xE5, 0x26, 0x00, 0xE3, 0x18, 0x04, 0x11, 0x95,
318 0x00, 0xF5, 0xCD, 0x41, 0x0C, 0x38, 0x09, 0x3E, 0x20, 0xFD,
319 0xCB, 0x01, 0x46, 0xCC, 0x3B, 0x0C, 0x1A, 0xE6, 0x7F, 0xCD,
320 0x3B, 0x0C, 0x1A, 0x13, 0x87, 0x30, 0xF5, 0xD1, 0xFE, 0x48,
321 0x28, 0x03, 0xFE, 0x82, 0xD8, 0x7A, 0xFE, 0x03, 0xD8, 0x3E,
322 0x20, 0xD5, 0xD9, 0xD7, 0xD9, 0xD1, 0xC9, 0xF5, 0xEB, 0x3C,
323 0xCB, 0x7E, 0x23, 0x28, 0xFB, 0x3D, 0x20, 0xF8, 0xEB, 0xF1,
324 0xFE, 0x20, 0xD8, 0x1A, 0xD6, 0x41, 0xC9, 0xFD, 0xCB, 0x01,
325 0x4E, 0xC0, 0x11, 0xD9, 0x0D, 0xD5, 0x78, 0xFD, 0xCB, 0x02,
326 0x46, 0xC2, 0x02, 0x0D, 0xFD, 0xBE, 0x31, 0x38, 0x1B, 0xC0,
327 0xFD, 0xCB, 0x02, 0x66, 0x28, 0x16, 0xFD, 0x5E, 0x2D, 0x1D,
328 0x28, 0x5A, 0x3E, 0x00, 0xCD, 0x01, 0x16, 0xED, 0x7B, 0x3F,
329 0x5C, 0xFD, 0xCB, 0x02, 0xA6, 0xC9, 0xCF, 0x04, 0xFD, 0x35,
330 0x52, 0x20, 0x45, 0x3E, 0x18, 0x90, 0x32, 0x8C, 0x5C, 0x2A,
331 0x8F, 0x5C, 0xE5, 0x3A, 0x91, 0x5C, 0xF5, 0x3E, 0xFD, 0xCD,
332 0x01, 0x16, 0xAF, 0x11, 0xF8, 0x0C, 0xCD, 0x0A, 0x0C, 0xFD,
333 0xCB, 0x02, 0xEE, 0x21, 0x3B, 0x5C, 0xCB, 0xDE, 0xCB, 0xAE,
334 0xD9, 0xCD, 0xD4, 0x15, 0xD9, 0xFE, 0x20, 0x28, 0x45, 0xFE,
335 0xE2, 0x28, 0x41, 0xF6, 0x20, 0xFE, 0x6E, 0x28, 0x3B, 0x3E,
336 0xFE, 0xCD, 0x01, 0x16, 0xF1, 0x32, 0x91, 0x5C, 0xE1, 0x22,
337 0x8F, 0x5C, 0xCD, 0xFE, 0x0D, 0xFD, 0x46, 0x31, 0x04, 0x0E,
338 0x21, 0xC5, 0xCD, 0x9B, 0x0E, 0x7C, 0x0F, 0x0F, 0x0F, 0xE6,
339 0x03, 0xF6, 0x58, 0x67, 0x11, 0xE0, 0x5A, 0x1A, 0x4E, 0x06,
340 0x20, 0xEB, 0x12, 0x71, 0x13, 0x23, 0x10, 0xFA, 0xC1, 0xC9,
341 0x80, 0x73, 0x63, 0x72, 0x6F, 0x6C, 0x6C, 0xBF, 0xCF, 0x0C,
342 0xFE, 0x02, 0x38, 0x80, 0xFD, 0x86, 0x31, 0xD6, 0x19, 0xD0,
343 0xED, 0x44, 0xC5, 0x47, 0x2A, 0x8F, 0x5C, 0xE5, 0x2A, 0x91,
344 0x5C, 0xE5, 0xCD, 0x4D, 0x0D, 0x78, 0xF5, 0x21, 0x6B, 0x5C,
345 0x46, 0x78, 0x3C, 0x77, 0x21, 0x89, 0x5C, 0xBE, 0x38, 0x03,
346 0x34, 0x06, 0x18, 0xCD, 0x00, 0x0E, 0xF1, 0x3D, 0x20, 0xE8,
347 0xE1, 0xFD, 0x75, 0x57, 0xE1, 0x22, 0x8F, 0x5C, 0xED, 0x4B,
348 0x88, 0x5C, 0xFD, 0xCB, 0x02, 0x86, 0xCD, 0xD9, 0x0D, 0xFD,
349 0xCB, 0x02, 0xC6, 0xC1, 0xC9, 0xAF, 0x2A, 0x8D, 0x5C, 0xFD,
350 0xCB, 0x02, 0x46, 0x28, 0x04, 0x67, 0xFD, 0x6E, 0x0E, 0x22,
351 0x8F, 0x5C, 0x21, 0x91, 0x5C, 0x20, 0x02, 0x7E, 0x0F, 0xAE,
352 0xE6, 0x55, 0xAE, 0x77, 0xC9, 0xCD, 0xAF, 0x0D, 0x21, 0x3C,
353 0x5C, 0xCB, 0xAE, 0xCB, 0xC6, 0xCD, 0x4D, 0x0D, 0xFD, 0x46,
354 0x31, 0xCD, 0x44, 0x0E, 0x21, 0xC0, 0x5A, 0x3A, 0x8D, 0x5C,
355 0x05, 0x18, 0x07, 0x0E, 0x20, 0x2B, 0x77, 0x0D, 0x20, 0xFB,
356 0x10, 0xF7, 0xFD, 0x36, 0x31, 0x02, 0x3E, 0xFD, 0xCD, 0x01,
357 0x16, 0x2A, 0x51, 0x5C, 0x11, 0xF4, 0x09, 0xA7, 0x73, 0x23,
358 0x72, 0x23, 0x11, 0xA8, 0x10, 0x3F, 0x38, 0xF6, 0x01, 0x21,
359 0x17, 0x18, 0x2A, 0x21, 0x00, 0x00, 0x22, 0x7D, 0x5C, 0xFD,
360 0xCB, 0x30, 0x86, 0xCD, 0x94, 0x0D, 0x3E, 0xFE, 0xCD, 0x01,
361 0x16, 0xCD, 0x4D, 0x0D, 0x06, 0x18, 0xCD, 0x44, 0x0E, 0x2A,
362 0x51, 0x5C, 0x11, 0xF4, 0x09, 0x73, 0x23, 0x72, 0xFD, 0x36,
363 0x52, 0x01, 0x01, 0x21, 0x18, 0x21, 0x00, 0x5B, 0xFD, 0xCB,
364 0x01, 0x4E, 0x20, 0x12, 0x78, 0xFD, 0xCB, 0x02, 0x46, 0x28,
365 0x05, 0xFD, 0x86, 0x31, 0xD6, 0x18, 0xC5, 0x47, 0xCD, 0x9B,
366 0x0E, 0xC1, 0x3E, 0x21, 0x91, 0x5F, 0x16, 0x00, 0x19, 0xC3,
367 0xDC, 0x0A, 0x06, 0x17, 0xCD, 0x9B, 0x0E, 0x0E, 0x08, 0xC5,
368 0xE5, 0x78, 0xE6, 0x07, 0x78, 0x20, 0x0C, 0xEB, 0x21, 0xE0,
369 0xF8, 0x19, 0xEB, 0x01, 0x20, 0x00, 0x3D, 0xED, 0xB0, 0xEB,
370 0x21, 0xE0, 0xFF, 0x19, 0xEB, 0x47, 0xE6, 0x07, 0x0F, 0x0F,
371 0x0F, 0x4F, 0x78, 0x06, 0x00, 0xED, 0xB0, 0x06, 0x07, 0x09,
372 0xE6, 0xF8, 0x20, 0xDB, 0xE1, 0x24, 0xC1, 0x0D, 0x20, 0xCD,
373 0xCD, 0x88, 0x0E, 0x21, 0xE0, 0xFF, 0x19, 0xEB, 0xED, 0xB0,
374 0x06, 0x01, 0xC5, 0xCD, 0x9B, 0x0E, 0x0E, 0x08, 0xC5, 0xE5,
375 0x78, 0xE6, 0x07, 0x0F, 0x0F, 0x0F, 0x4F, 0x78, 0x06, 0x00,
376 0x0D, 0x54, 0x5D, 0x36, 0x00, 0x13, 0xED, 0xB0, 0x11, 0x01,
377 0x07, 0x19, 0x3D, 0xE6, 0xF8, 0x47, 0x20, 0xE5, 0xE1, 0x24,
378 0xC1, 0x0D, 0x20, 0xDC, 0xCD, 0x88, 0x0E, 0x62, 0x6B, 0x13,
379 0x3A, 0x8D, 0x5C, 0xFD, 0xCB, 0x02, 0x46, 0x28, 0x03, 0x3A,
380 0x48, 0x5C, 0x77, 0x0B, 0xED, 0xB0, 0xC1, 0x0E, 0x21, 0xC9,
381 0x7C, 0x0F, 0x0F, 0x0F, 0x3D, 0xF6, 0x50, 0x67, 0xEB, 0x61,
382 0x68, 0x29, 0x29, 0x29, 0x29, 0x29, 0x44, 0x4D, 0xC9, 0x3E,
383 0x18, 0x90, 0x57, 0x0F, 0x0F, 0x0F, 0xE6, 0xE0, 0x6F, 0x7A,
384 0xE6, 0x18, 0xF6, 0x40, 0x67, 0xC9, 0xF3, 0x06, 0xB0, 0x21,
385 0x00, 0x40, 0xE5, 0xC5, 0xCD, 0xF4, 0x0E, 0xC1, 0xE1, 0x24,
386 0x7C, 0xE6, 0x07, 0x20, 0x0A, 0x7D, 0xC6, 0x20, 0x6F, 0x3F,
387 0x9F, 0xE6, 0xF8, 0x84, 0x67, 0x10, 0xE7, 0x18, 0x0D, 0xF3,
388 0x21, 0x00, 0x5B, 0x06, 0x08, 0xC5, 0xCD, 0xF4, 0x0E, 0xC1,
389 0x10, 0xF9, 0x3E, 0x04, 0xD3, 0xFB, 0xFB, 0x21, 0x00, 0x5B,
390 0xFD, 0x75, 0x46, 0xAF, 0x47, 0x77, 0x23, 0x10, 0xFC, 0xFD,
391 0xCB, 0x30, 0x8E, 0x0E, 0x21, 0xC3, 0xD9, 0x0D, 0x78, 0xFE,
392 0x03, 0x9F, 0xE6, 0x02, 0xD3, 0xFB, 0x57, 0xCD, 0x54, 0x1F,
393 0x38, 0x0A, 0x3E, 0x04, 0xD3, 0xFB, 0xFB, 0xCD, 0xDF, 0x0E,
394 0xCF, 0x0C, 0xDB, 0xFB, 0x87, 0xF8, 0x30, 0xEB, 0x0E, 0x20,
395 0x5E, 0x23, 0x06, 0x08, 0xCB, 0x12, 0xCB, 0x13, 0xCB, 0x1A,
396 0xDB, 0xFB, 0x1F, 0x30, 0xFB, 0x7A, 0xD3, 0xFB, 0x10, 0xF0,
397 0x0D, 0x20, 0xE9, 0xC9, 0x2A, 0x3D, 0x5C, 0xE5, 0x21, 0x7F,
398 0x10, 0xE5, 0xED, 0x73, 0x3D, 0x5C, 0xCD, 0xD4, 0x15, 0xF5,
399 0x16, 0x00, 0xFD, 0x5E, 0xFF, 0x21, 0xC8, 0x00, 0xCD, 0xB5,
400 0x03, 0xF1, 0x21, 0x38, 0x0F, 0xE5, 0xFE, 0x18, 0x30, 0x31,
401 0xFE, 0x07, 0x38, 0x2D, 0xFE, 0x10, 0x38, 0x3A, 0x01, 0x02,
402 0x00, 0x57, 0xFE, 0x16, 0x38, 0x0C, 0x03, 0xFD, 0xCB, 0x37,
403 0x7E, 0xCA, 0x1E, 0x10, 0xCD, 0xD4, 0x15, 0x5F, 0xCD, 0xD4,
404 0x15, 0xD5, 0x2A, 0x5B, 0x5C, 0xFD, 0xCB, 0x07, 0x86, 0xCD,
405 0x55, 0x16, 0xC1, 0x23, 0x70, 0x23, 0x71, 0x18, 0x0A, 0xFD,
406 0xCB, 0x07, 0x86, 0x2A, 0x5B, 0x5C, 0xCD, 0x52, 0x16, 0x12,
407 0x13, 0xED, 0x53, 0x5B, 0x5C, 0xC9, 0x5F, 0x16, 0x00, 0x21,
408 0x99, 0x0F, 0x19, 0x5E, 0x19, 0xE5, 0x2A, 0x5B, 0x5C, 0xC9,
409 0x09, 0x66, 0x6A, 0x50, 0xB5, 0x70, 0x7E, 0xCF, 0xD4, 0x2A,
410 0x49, 0x5C, 0xFD, 0xCB, 0x37, 0x6E, 0xC2, 0x97, 0x10, 0xCD,
411 0x6E, 0x19, 0xCD, 0x95, 0x16, 0x7A, 0xB3, 0xCA, 0x97, 0x10,
412 0xE5, 0x23, 0x4E, 0x23, 0x46, 0x21, 0x0A, 0x00, 0x09, 0x44,
413 0x4D, 0xCD, 0x05, 0x1F, 0xCD, 0x97, 0x10, 0x2A, 0x51, 0x5C,
414 0xE3, 0xE5, 0x3E, 0xFF, 0xCD, 0x01, 0x16, 0xE1, 0x2B, 0xFD,
415 0x35, 0x0F, 0xCD, 0x55, 0x18, 0xFD, 0x34, 0x0F, 0x2A, 0x59,
416 0x5C, 0x23, 0x23, 0x23, 0x23, 0x22, 0x5B, 0x5C, 0xE1, 0xCD,
417 0x15, 0x16, 0xC9, 0xFD, 0xCB, 0x37, 0x6E, 0x20, 0x08, 0x21,
418 0x49, 0x5C, 0xCD, 0x0F, 0x19, 0x18, 0x6D, 0xFD, 0x36, 0x00,
419 0x10, 0x18, 0x1D, 0xCD, 0x31, 0x10, 0x18, 0x05, 0x7E, 0xFE,
420 0x0D, 0xC8, 0x23, 0x22, 0x5B, 0x5C, 0xC9, 0xCD, 0x31, 0x10,
421 0x01, 0x01, 0x00, 0xC3, 0xE8, 0x19, 0xCD, 0xD4, 0x15, 0xCD,
422 0xD4, 0x15, 0xE1, 0xE1, 0xE1, 0x22, 0x3D, 0x5C, 0xFD, 0xCB,
423 0x00, 0x7E, 0xC0, 0xF9, 0xC9, 0x37, 0xCD, 0x95, 0x11, 0xED,
424 0x52, 0x19, 0x23, 0xC1, 0xD8, 0xC5, 0x44, 0x4D, 0x62, 0x6B,
425 0x23, 0x1A, 0xE6, 0xF0, 0xFE, 0x10, 0x20, 0x09, 0x23, 0x1A,
426 0xD6, 0x17, 0xCE, 0x00, 0x20, 0x01, 0x23, 0xA7, 0xED, 0x42,
427 0x09, 0xEB, 0x38, 0xE6, 0xC9, 0xFD, 0xCB, 0x37, 0x6E, 0xC0,
428 0x2A, 0x49, 0x5C, 0xCD, 0x6E, 0x19, 0xEB, 0xCD, 0x95, 0x16,
429 0x21, 0x4A, 0x5C, 0xCD, 0x1C, 0x19, 0xCD, 0x95, 0x17, 0x3E,
430 0x00, 0xC3, 0x01, 0x16, 0xFD, 0xCB, 0x37, 0x7E, 0x28, 0xA8,
431 0xC3, 0x81, 0x0F, 0xFD, 0xCB, 0x30, 0x66, 0x28, 0xA1, 0xFD,
432 0x36, 0x00, 0xFF, 0x16, 0x00, 0xFD, 0x5E, 0xFE, 0x21, 0x90,
433 0x1A, 0xCD, 0xB5, 0x03, 0xC3, 0x30, 0x0F, 0xE5, 0xCD, 0x90,
434 0x11, 0x2B, 0xCD, 0xE5, 0x19, 0x22, 0x5B, 0x5C, 0xFD, 0x36,
435 0x07, 0x00, 0xE1, 0xC9, 0xFD, 0xCB, 0x02, 0x5E, 0xC4, 0x1D,
436 0x11, 0xA7, 0xFD, 0xCB, 0x01, 0x6E, 0xC8, 0x3A, 0x08, 0x5C,
437 0xFD, 0xCB, 0x01, 0xAE, 0xF5, 0xFD, 0xCB, 0x02, 0x6E, 0xC4,
438 0x6E, 0x0D, 0xF1, 0xFE, 0x20, 0x30, 0x52, 0xFE, 0x10, 0x30,
439 0x2D, 0xFE, 0x06, 0x30, 0x0A, 0x47, 0xE6, 0x01, 0x4F, 0x78,
440 0x1F, 0xC6, 0x12, 0x18, 0x2A, 0x20, 0x09, 0x21, 0x6A, 0x5C,
441 0x3E, 0x08, 0xAE, 0x77, 0x18, 0x0E, 0xFE, 0x0E, 0xD8, 0xD6,
442 0x0D, 0x21, 0x41, 0x5C, 0xBE, 0x77, 0x20, 0x02, 0x36, 0x00,
443 0xFD, 0xCB, 0x02, 0xDE, 0xBF, 0xC9, 0x47, 0xE6, 0x07, 0x4F,
444 0x3E, 0x10, 0xCB, 0x58, 0x20, 0x01, 0x3C, 0xFD, 0x71, 0xD3,
445 0x11, 0x0D, 0x11, 0x18, 0x06, 0x3A, 0x0D, 0x5C, 0x11, 0xA8,
446 0x10, 0x2A, 0x4F, 0x5C, 0x23, 0x23, 0x73, 0x23, 0x72, 0x37,
447 0xC9, 0xCD, 0x4D, 0x0D, 0xFD, 0xCB, 0x02, 0x9E, 0xFD, 0xCB,
448 0x02, 0xAE, 0x2A, 0x8A, 0x5C, 0xE5, 0x2A, 0x3D, 0x5C, 0xE5,
449 0x21, 0x67, 0x11, 0xE5, 0xED, 0x73, 0x3D, 0x5C, 0x2A, 0x82,
450 0x5C, 0xE5, 0x37, 0xCD, 0x95, 0x11, 0xEB, 0xCD, 0x7D, 0x18,
451 0xEB, 0xCD, 0xE1, 0x18, 0x2A, 0x8A, 0x5C, 0xE3, 0xEB, 0xCD,
452 0x4D, 0x0D, 0x3A, 0x8B, 0x5C, 0x92, 0x38, 0x26, 0x20, 0x06,
453 0x7B, 0xFD, 0x96, 0x50, 0x30, 0x1E, 0x3E, 0x20, 0xD5, 0xCD,
454 0xF4, 0x09, 0xD1, 0x18, 0xE9, 0x16, 0x00, 0xFD, 0x5E, 0xFE,
455 0x21, 0x90, 0x1A, 0xCD, 0xB5, 0x03, 0xFD, 0x36, 0x00, 0xFF,
456 0xED, 0x5B, 0x8A, 0x5C, 0x18, 0x02, 0xD1, 0xE1, 0xE1, 0x22,
457 0x3D, 0x5C, 0xC1, 0xD5, 0xCD, 0xD9, 0x0D, 0xE1, 0x22, 0x82,
458 0x5C, 0xFD, 0x36, 0x26, 0x00, 0xC9, 0x2A, 0x61, 0x5C, 0x2B,
459 0xA7, 0xED, 0x5B, 0x59, 0x5C, 0xFD, 0xCB, 0x37, 0x6E, 0xC8,
460 0xED, 0x5B, 0x61, 0x5C, 0xD8, 0x2A, 0x63, 0x5C, 0xC9, 0x7E,
461 0xFE, 0x0E, 0x01, 0x06, 0x00, 0xCC, 0xE8, 0x19, 0x7E, 0x23,
462 0xFE, 0x0D, 0x20, 0xF1, 0xC9, 0xF3, 0x3E, 0xFF, 0xED, 0x5B,
463 0xB2, 0x5C, 0xD9, 0xED, 0x4B, 0xB4, 0x5C, 0xED, 0x5B, 0x38,
464 0x5C, 0x2A, 0x7B, 0x5C, 0xD9, 0x47, 0x3E, 0x07, 0xD3, 0xFE,
465 0x3E, 0x3F, 0xED, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466 0x62, 0x6B, 0x36, 0x02, 0x2B, 0xBC, 0x20, 0xFA, 0xA7, 0xED,
467 0x52, 0x19, 0x23, 0x30, 0x06, 0x35, 0x28, 0x03, 0x35, 0x28,
468 0xF3, 0x2B, 0xD9, 0xED, 0x43, 0xB4, 0x5C, 0xED, 0x53, 0x38,
469 0x5C, 0x22, 0x7B, 0x5C, 0xD9, 0x04, 0x28, 0x19, 0x22, 0xB4,
470 0x5C, 0x11, 0xAF, 0x3E, 0x01, 0xA8, 0x00, 0xEB, 0xED, 0xB8,
471 0xEB, 0x23, 0x22, 0x7B, 0x5C, 0x2B, 0x01, 0x40, 0x00, 0xED,
472 0x43, 0x38, 0x5C, 0x22, 0xB2, 0x5C, 0x21, 0x00, 0x3C, 0x22,
473 0x36, 0x5C, 0x2A, 0xB2, 0x5C, 0x36, 0x3E, 0x2B, 0xF9, 0x2B,
474 0x2B, 0x22, 0x3D, 0x5C, 0xED, 0x56, 0xFD, 0x21, 0x3A, 0x5C,
475 0xFB, 0x21, 0xB6, 0x5C, 0x22, 0x4F, 0x5C, 0x11, 0xAF, 0x15,
476 0x01, 0x15, 0x00, 0xEB, 0xED, 0xB0, 0xEB, 0x2B, 0x22, 0x57,
477 0x5C, 0x23, 0x22, 0x53, 0x5C, 0x22, 0x4B, 0x5C, 0x36, 0x80,
478 0x23, 0x22, 0x59, 0x5C, 0x36, 0x0D, 0x23, 0x36, 0x80, 0x23,
479 0x22, 0x61, 0x5C, 0x22, 0x63, 0x5C, 0x22, 0x65, 0x5C, 0x3E,
480 0x38, 0x32, 0x8D, 0x5C, 0x32, 0x8F, 0x5C, 0x32, 0x48, 0x5C,
481 0x21, 0x23, 0x05, 0x22, 0x09, 0x5C, 0xFD, 0x35, 0xC6, 0xFD,
482 0x35, 0xCA, 0x21, 0xC6, 0x15, 0x11, 0x10, 0x5C, 0x01, 0x0E,
483 0x00, 0xED, 0xB0, 0xFD, 0xCB, 0x01, 0xCE, 0xCD, 0xDF, 0x0E,
484 0xFD, 0x36, 0x31, 0x02, 0xCD, 0x6B, 0x0D, 0xAF, 0x11, 0x38,
485 0x15, 0xCD, 0x0A, 0x0C, 0xFD, 0xCB, 0x02, 0xEE, 0x18, 0x07,
486 0xFD, 0x36, 0x31, 0x02, 0xCD, 0x95, 0x17, 0xCD, 0xB0, 0x16,
487 0x3E, 0x00, 0xCD, 0x01, 0x16, 0xCD, 0x2C, 0x0F, 0xCD, 0x17,
488 0x1B, 0xFD, 0xCB, 0x00, 0x7E, 0x20, 0x12, 0xFD, 0xCB, 0x30,
489 0x66, 0x28, 0x40, 0x2A, 0x59, 0x5C, 0xCD, 0xA7, 0x11, 0xFD,
490 0x36, 0x00, 0xFF, 0x18, 0xDD, 0x2A, 0x59, 0x5C, 0x22, 0x5D,
491 0x5C, 0xCD, 0xFB, 0x19, 0x78, 0xB1, 0xC2, 0x5D, 0x15, 0xDF,
492 0xFE, 0x0D, 0x28, 0xC0, 0xFD, 0xCB, 0x30, 0x46, 0xC4, 0xAF,
493 0x0D, 0xCD, 0x6E, 0x0D, 0x3E, 0x19, 0xFD, 0x96, 0x4F, 0x32,
494 0x8C, 0x5C, 0xFD, 0xCB, 0x01, 0xFE, 0xFD, 0x36, 0x00, 0xFF,
495 0xFD, 0x36, 0x0A, 0x01, 0xCD, 0x8A, 0x1B, 0x76, 0xFD, 0xCB,
496 0x01, 0xAE, 0xFD, 0xCB, 0x30, 0x4E, 0xC4, 0xCD, 0x0E, 0x3A,
497 0x3A, 0x5C, 0x3C, 0xF5, 0x21, 0x00, 0x00, 0xFD, 0x74, 0x37,
498 0xFD, 0x74, 0x26, 0x22, 0x0B, 0x5C, 0x21, 0x01, 0x00, 0x22,
499 0x16, 0x5C, 0xCD, 0xB0, 0x16, 0xFD, 0xCB, 0x37, 0xAE, 0xCD,
500 0x6E, 0x0D, 0xFD, 0xCB, 0x02, 0xEE, 0xF1, 0x47, 0xFE, 0x0A,
501 0x38, 0x02, 0xC6, 0x07, 0xCD, 0xEF, 0x15, 0x3E, 0x20, 0xD7,
502 0x78, 0x11, 0x91, 0x13, 0xCD, 0x0A, 0x0C, 0xAF, 0x11, 0x36,
503 0x15, 0xCD, 0x0A, 0x0C, 0xED, 0x4B, 0x45, 0x5C, 0xCD, 0x1B,
504 0x1A, 0x3E, 0x3A, 0xD7, 0xFD, 0x4E, 0x0D, 0x06, 0x00, 0xCD,
505 0x1B, 0x1A, 0xCD, 0x97, 0x10, 0x3A, 0x3A, 0x5C, 0x3C, 0x28,
506 0x1B, 0xFE, 0x09, 0x28, 0x04, 0xFE, 0x15, 0x20, 0x03, 0xFD,
507 0x34, 0x0D, 0x01, 0x03, 0x00, 0x11, 0x70, 0x5C, 0x21, 0x44,
508 0x5C, 0xCB, 0x7E, 0x28, 0x01, 0x09, 0xED, 0xB8, 0xFD, 0x36,
509 0x0A, 0xFF, 0xFD, 0xCB, 0x01, 0x9E, 0xC3, 0xAC, 0x12, 0x80,
510 0x4F, 0xCB, 0x4E, 0x45, 0x58, 0x54, 0x20, 0x77, 0x69, 0x74,
511 0x68, 0x6F, 0x75, 0x74, 0x20, 0x46, 0x4F, 0xD2, 0x56, 0x61,
512 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x6E, 0x6F, 0x74,
513 0x20, 0x66, 0x6F, 0x75, 0x6E, 0xE4, 0x53, 0x75, 0x62, 0x73,
514 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x77, 0x72, 0x6F, 0x6E,
515 0xE7, 0x4F, 0x75, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x65,
516 0x6D, 0x6F, 0x72, 0xF9, 0x4F, 0x75, 0x74, 0x20, 0x6F, 0x66,
517 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0xEE, 0x4E, 0x75, 0x6D,
518 0x62, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x6F, 0x20, 0x62, 0x69,
519 0xE7, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4E, 0x20, 0x77, 0x69,
520 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x47, 0x4F, 0x53, 0x55,
521 0xC2, 0x45, 0x6E, 0x64, 0x20, 0x6F, 0x66, 0x20, 0x66, 0x69,
522 0x6C, 0xE5, 0x53, 0x54, 0x4F, 0x50, 0x20, 0x73, 0x74, 0x61,
523 0x74, 0x65, 0x6D, 0x65, 0x6E, 0xF4, 0x49, 0x6E, 0x76, 0x61,
524 0x6C, 0x69, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
525 0x6E, 0xF4, 0x49, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20,
526 0x6F, 0x75, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x72, 0x61, 0x6E,
527 0x67, 0xE5, 0x4E, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x65,
528 0x20, 0x69, 0x6E, 0x20, 0x42, 0x41, 0x53, 0x49, 0xC3, 0x42,
529 0x52, 0x45, 0x41, 0x4B, 0x20, 0x2D, 0x20, 0x43, 0x4F, 0x4E,
530 0x54, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0xF3, 0x4F,
531 0x75, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x44, 0x41, 0x54, 0xC1,
532 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x66, 0x69,
533 0x6C, 0x65, 0x20, 0x6E, 0x61, 0x6D, 0xE5, 0x4E, 0x6F, 0x20,
534 0x72, 0x6F, 0x6F, 0x6D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6C,
535 0x69, 0x6E, 0xE5, 0x53, 0x54, 0x4F, 0x50, 0x20, 0x69, 0x6E,
536 0x20, 0x49, 0x4E, 0x50, 0x55, 0xD4, 0x46, 0x4F, 0x52, 0x20,
537 0x77, 0x69, 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x4E, 0x45,
538 0x58, 0xD4, 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20,
539 0x49, 0x2F, 0x4F, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0xE5,
540 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x63, 0x6F,
541 0x6C, 0x6F, 0x75, 0xF2, 0x42, 0x52, 0x45, 0x41, 0x4B, 0x20,
542 0x69, 0x6E, 0x74, 0x6F, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72,
543 0x61, 0xED, 0x52, 0x41, 0x4D, 0x54, 0x4F, 0x50, 0x20, 0x6E,
544 0x6F, 0x20, 0x67, 0x6F, 0x6F, 0xE4, 0x53, 0x74, 0x61, 0x74,
545 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x73, 0xF4,
546 0x49, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x73, 0x74,
547 0x72, 0x65, 0x61, 0xED, 0x46, 0x4E, 0x20, 0x77, 0x69, 0x74,
548 0x68, 0x6F, 0x75, 0x74, 0x20, 0x44, 0x45, 0xC6, 0x50, 0x61,
549 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x72,
550 0x72, 0x6F, 0xF2, 0x54, 0x61, 0x70, 0x65, 0x20, 0x6C, 0x6F,
551 0x61, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x72, 0x72, 0x6F,
552 0xF2, 0x2C, 0xA0, 0x7F, 0x20, 0x31, 0x39, 0x38, 0x32, 0x20,
553 0x53, 0x69, 0x6E, 0x63, 0x6C, 0x61, 0x69, 0x72, 0x20, 0x52,
554 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x4C, 0x74,
555 0xE4, 0x3E, 0x10, 0x01, 0x00, 0x00, 0xC3, 0x13, 0x13, 0xED,
556 0x43, 0x49, 0x5C, 0x2A, 0x5D, 0x5C, 0xEB, 0x21, 0x55, 0x15,
557 0xE5, 0x2A, 0x61, 0x5C, 0x37, 0xED, 0x52, 0xE5, 0x60, 0x69,
558 0xCD, 0x6E, 0x19, 0x20, 0x06, 0xCD, 0xB8, 0x19, 0xCD, 0xE8,
559 0x19, 0xC1, 0x79, 0x3D, 0xB0, 0x28, 0x28, 0xC5, 0x03, 0x03,
560 0x03, 0x03, 0x2B, 0xED, 0x5B, 0x53, 0x5C, 0xD5, 0xCD, 0x55,
561 0x16, 0xE1, 0x22, 0x53, 0x5C, 0xC1, 0xC5, 0x13, 0x2A, 0x61,
562 0x5C, 0x2B, 0x2B, 0xED, 0xB8, 0x2A, 0x49, 0x5C, 0xEB, 0xC1,
563 0x70, 0x2B, 0x71, 0x2B, 0x73, 0x2B, 0x72, 0xF1, 0xC3, 0xA2,
564 0x12, 0xF4, 0x09, 0xA8, 0x10, 0x4B, 0xF4, 0x09, 0xC4, 0x15,
565 0x53, 0x81, 0x0F, 0xC4, 0x15, 0x52, 0xF4, 0x09, 0xC4, 0x15,
566 0x50, 0x80, 0xCF, 0x12, 0x01, 0x00, 0x06, 0x00, 0x0B, 0x00,
567 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x00, 0xFD, 0xCB,
568 0x02, 0x6E, 0x20, 0x04, 0xFD, 0xCB, 0x02, 0xDE, 0xCD, 0xE6,
569 0x15, 0xD8, 0x28, 0xFA, 0xCF, 0x07, 0xD9, 0xE5, 0x2A, 0x51,
570 0x5C, 0x23, 0x23, 0x18, 0x08, 0x1E, 0x30, 0x83, 0xD9, 0xE5,
571 0x2A, 0x51, 0x5C, 0x5E, 0x23, 0x56, 0xEB, 0xCD, 0x2C, 0x16,
572 0xE1, 0xD9, 0xC9, 0x87, 0xC6, 0x16, 0x6F, 0x26, 0x5C, 0x5E,
573 0x23, 0x56, 0x7A, 0xB3, 0x20, 0x02, 0xCF, 0x17, 0x1B, 0x2A,
574 0x4F, 0x5C, 0x19, 0x22, 0x51, 0x5C, 0xFD, 0xCB, 0x30, 0xA6,
575 0x23, 0x23, 0x23, 0x23, 0x4E, 0x21, 0x2D, 0x16, 0xCD, 0xDC,
576 0x16, 0xD0, 0x16, 0x00, 0x5E, 0x19, 0xE9, 0x4B, 0x06, 0x53,
577 0x12, 0x50, 0x1B, 0x00, 0xFD, 0xCB, 0x02, 0xC6, 0xFD, 0xCB,
578 0x01, 0xAE, 0xFD, 0xCB, 0x30, 0xE6, 0x18, 0x04, 0xFD, 0xCB,
579 0x02, 0x86, 0xFD, 0xCB, 0x01, 0x8E, 0xC3, 0x4D, 0x0D, 0xFD,
580 0xCB, 0x01, 0xCE, 0xC9, 0x01, 0x01, 0x00, 0xE5, 0xCD, 0x05,
581 0x1F, 0xE1, 0xCD, 0x64, 0x16, 0x2A, 0x65, 0x5C, 0xEB, 0xED,
582 0xB8, 0xC9, 0xF5, 0xE5, 0x21, 0x4B, 0x5C, 0x3E, 0x0E, 0x5E,
583 0x23, 0x56, 0xE3, 0xA7, 0xED, 0x52, 0x19, 0xE3, 0x30, 0x09,
584 0xD5, 0xEB, 0x09, 0xEB, 0x72, 0x2B, 0x73, 0x23, 0xD1, 0x23,
585 0x3D, 0x20, 0xE8, 0xEB, 0xD1, 0xF1, 0xA7, 0xED, 0x52, 0x44,
586 0x4D, 0x03, 0x19, 0xEB, 0xC9, 0x00, 0x00, 0xEB, 0x11, 0x8F,
587 0x16, 0x7E, 0xE6, 0xC0, 0x20, 0xF7, 0x56, 0x23, 0x5E, 0xC9,
588 0x2A, 0x63, 0x5C, 0x2B, 0xCD, 0x55, 0x16, 0x23, 0x23, 0xC1,
589 0xED, 0x43, 0x61, 0x5C, 0xC1, 0xEB, 0x23, 0xC9, 0x2A, 0x59,
590 0x5C, 0x36, 0x0D, 0x22, 0x5B, 0x5C, 0x23, 0x36, 0x80, 0x23,
591 0x22, 0x61, 0x5C, 0x2A, 0x61, 0x5C, 0x22, 0x63, 0x5C, 0x2A,
592 0x63, 0x5C, 0x22, 0x65, 0x5C, 0xE5, 0x21, 0x92, 0x5C, 0x22,
593 0x68, 0x5C, 0xE1, 0xC9, 0xED, 0x5B, 0x59, 0x5C, 0xC3, 0xE5,
594 0x19, 0x23, 0x7E, 0xA7, 0xC8, 0xB9, 0x23, 0x20, 0xF8, 0x37,
595 0xC9, 0xCD, 0x1E, 0x17, 0xCD, 0x01, 0x17, 0x01, 0x00, 0x00,
596 0x11, 0xE2, 0xA3, 0xEB, 0x19, 0x38, 0x07, 0x01, 0xD4, 0x15,
597 0x09, 0x4E, 0x23, 0x46, 0xEB, 0x71, 0x23, 0x70, 0xC9, 0xE5,
598 0x2A, 0x4F, 0x5C, 0x09, 0x23, 0x23, 0x23, 0x4E, 0xEB, 0x21,
599 0x16, 0x17, 0xCD, 0xDC, 0x16, 0x4E, 0x06, 0x00, 0x09, 0xE9,
600 0x4B, 0x05, 0x53, 0x03, 0x50, 0x01, 0xE1, 0xC9, 0xCD, 0x94,
601 0x1E, 0xFE, 0x10, 0x38, 0x02, 0xCF, 0x17, 0xC6, 0x03, 0x07,
602 0x21, 0x10, 0x5C, 0x4F, 0x06, 0x00, 0x09, 0x4E, 0x23, 0x46,
603 0x2B, 0xC9, 0xEF, 0x01, 0x38, 0xCD, 0x1E, 0x17, 0x78, 0xB1,
604 0x28, 0x16, 0xEB, 0x2A, 0x4F, 0x5C, 0x09, 0x23, 0x23, 0x23,
605 0x7E, 0xEB, 0xFE, 0x4B, 0x28, 0x08, 0xFE, 0x53, 0x28, 0x04,
606 0xFE, 0x50, 0x20, 0xCF, 0xCD, 0x5D, 0x17, 0x73, 0x23, 0x72,
607 0xC9, 0xE5, 0xCD, 0xF1, 0x2B, 0x78, 0xB1, 0x20, 0x02, 0xCF,
608 0x0E, 0xC5, 0x1A, 0xE6, 0xDF, 0x4F, 0x21, 0x7A, 0x17, 0xCD,
609 0xDC, 0x16, 0x30, 0xF1, 0x4E, 0x06, 0x00, 0x09, 0xC1, 0xE9,
610 0x4B, 0x06, 0x53, 0x08, 0x50, 0x0A, 0x00, 0x1E, 0x01, 0x18,
611 0x06, 0x1E, 0x06, 0x18, 0x02, 0x1E, 0x10, 0x0B, 0x78, 0xB1,
612 0x20, 0xD5, 0x57, 0xE1, 0xC9, 0x18, 0x90, 0xED, 0x73, 0x3F,
613 0x5C, 0xFD, 0x36, 0x02, 0x10, 0xCD, 0xAF, 0x0D, 0xFD, 0xCB,
614 0x02, 0xC6, 0xFD, 0x46, 0x31, 0xCD, 0x44, 0x0E, 0xFD, 0xCB,
615 0x02, 0x86, 0xFD, 0xCB, 0x30, 0xC6, 0x2A, 0x49, 0x5C, 0xED,
616 0x5B, 0x6C, 0x5C, 0xA7, 0xED, 0x52, 0x19, 0x38, 0x22, 0xD5,
617 0xCD, 0x6E, 0x19, 0x11, 0xC0, 0x02, 0xEB, 0xED, 0x52, 0xE3,
618 0xCD, 0x6E, 0x19, 0xC1, 0xC5, 0xCD, 0xB8, 0x19, 0xC1, 0x09,
619 0x38, 0x0E, 0xEB, 0x56, 0x23, 0x5E, 0x2B, 0xED, 0x53, 0x6C,
620 0x5C, 0x18, 0xED, 0x22, 0x6C, 0x5C, 0x2A, 0x6C, 0x5C, 0xCD,
621 0x6E, 0x19, 0x28, 0x01, 0xEB, 0xCD, 0x33, 0x18, 0xFD, 0xCB,
622 0x02, 0xA6, 0xC9, 0x3E, 0x03, 0x18, 0x02, 0x3E, 0x02, 0xFD,
623 0x36, 0x02, 0x00, 0xCD, 0x30, 0x25, 0xC4, 0x01, 0x16, 0xDF,
624 0xCD, 0x70, 0x20, 0x38, 0x14, 0xDF, 0xFE, 0x3B, 0x28, 0x04,
625 0xFE, 0x2C, 0x20, 0x06, 0xE7, 0xCD, 0x82, 0x1C, 0x18, 0x08,
626 0xCD, 0xE6, 0x1C, 0x18, 0x03, 0xCD, 0xDE, 0x1C, 0xCD, 0xEE,
627 0x1B, 0xCD, 0x99, 0x1E, 0x78, 0xE6, 0x3F, 0x67, 0x69, 0x22,
628 0x49, 0x5C, 0xCD, 0x6E, 0x19, 0x1E, 0x01, 0xCD, 0x55, 0x18,
629 0xD7, 0xFD, 0xCB, 0x02, 0x66, 0x28, 0xF6, 0x3A, 0x6B, 0x5C,
630 0xFD, 0x96, 0x4F, 0x20, 0xEE, 0xAB, 0xC8, 0xE5, 0xD5, 0x21,
631 0x6C, 0x5C, 0xCD, 0x0F, 0x19, 0xD1, 0xE1, 0x18, 0xE0, 0xED,
632 0x4B, 0x49, 0x5C, 0xCD, 0x80, 0x19, 0x16, 0x3E, 0x28, 0x05,
633 0x11, 0x00, 0x00, 0xCB, 0x13, 0xFD, 0x73, 0x2D, 0x7E, 0xFE,
634 0x40, 0xC1, 0xD0, 0xC5, 0xCD, 0x28, 0x1A, 0x23, 0x23, 0x23,
635 0xFD, 0xCB, 0x01, 0x86, 0x7A, 0xA7, 0x28, 0x05, 0xD7, 0xFD,
636 0xCB, 0x01, 0xC6, 0xD5, 0xEB, 0xFD, 0xCB, 0x30, 0x96, 0x21,
637 0x3B, 0x5C, 0xCB, 0x96, 0xFD, 0xCB, 0x37, 0x6E, 0x28, 0x02,
638 0xCB, 0xD6, 0x2A, 0x5F, 0x5C, 0xA7, 0xED, 0x52, 0x20, 0x05,
639 0x3E, 0x3F, 0xCD, 0xC1, 0x18, 0xCD, 0xE1, 0x18, 0xEB, 0x7E,
640 0xCD, 0xB6, 0x18, 0x23, 0xFE, 0x0D, 0x28, 0x06, 0xEB, 0xCD,
641 0x37, 0x19, 0x18, 0xE0, 0xD1, 0xC9, 0xFE, 0x0E, 0xC0, 0x23,
642 0x23, 0x23, 0x23, 0x23, 0x23, 0x7E, 0xC9, 0xD9, 0x2A, 0x8F,
643 0x5C, 0xE5, 0xCB, 0xBC, 0xCB, 0xFD, 0x22, 0x8F, 0x5C, 0x21,
644 0x91, 0x5C, 0x56, 0xD5, 0x36, 0x00, 0xCD, 0xF4, 0x09, 0xE1,
645 0xFD, 0x74, 0x57, 0xE1, 0x22, 0x8F, 0x5C, 0xD9, 0xC9, 0x2A,
646 0x5B, 0x5C, 0xA7, 0xED, 0x52, 0xC0, 0x3A, 0x41, 0x5C, 0xCB,
647 0x07, 0x28, 0x04, 0xC6, 0x43, 0x18, 0x16, 0x21, 0x3B, 0x5C,
648 0xCB, 0x9E, 0x3E, 0x4B, 0xCB, 0x56, 0x28, 0x0B, 0xCB, 0xDE,
649 0x3C, 0xFD, 0xCB, 0x30, 0x5E, 0x28, 0x02, 0x3E, 0x43, 0xD5,
650 0xCD, 0xC1, 0x18, 0xD1, 0xC9, 0x5E, 0x23, 0x56, 0xE5, 0xEB,
651 0x23, 0xCD, 0x6E, 0x19, 0xCD, 0x95, 0x16, 0xE1, 0xFD, 0xCB,
652 0x37, 0x6E, 0xC0, 0x72, 0x2B, 0x73, 0xC9, 0x7B, 0xA7, 0xF8,
653 0x18, 0x0D, 0xAF, 0x09, 0x3C, 0x38, 0xFC, 0xED, 0x42, 0x3D,
654 0x28, 0xF1, 0xC3, 0xEF, 0x15, 0xCD, 0x1B, 0x2D, 0x30, 0x30,
655 0xFE, 0x21, 0x38, 0x2C, 0xFD, 0xCB, 0x01, 0x96, 0xFE, 0xCB,
656 0x28, 0x24, 0xFE, 0x3A, 0x20, 0x0E, 0xFD, 0xCB, 0x37, 0x6E,
657 0x20, 0x16, 0xFD, 0xCB, 0x30, 0x56, 0x28, 0x14, 0x18, 0x0E,
658 0xFE, 0x22, 0x20, 0x0A, 0xF5, 0x3A, 0x6A, 0x5C, 0xEE, 0x04,
659 0x32, 0x6A, 0x5C, 0xF1, 0xFD, 0xCB, 0x01, 0xD6, 0xD7, 0xC9,
660 0xE5, 0x2A, 0x53, 0x5C, 0x54, 0x5D, 0xC1, 0xCD, 0x80, 0x19,
661 0xD0, 0xC5, 0xCD, 0xB8, 0x19, 0xEB, 0x18, 0xF4, 0x7E, 0xB8,
662 0xC0, 0x23, 0x7E, 0x2B, 0xB9, 0xC9, 0x23, 0x23, 0x23, 0x22,
663 0x5D, 0x5C, 0x0E, 0x00, 0x15, 0xC8, 0xE7, 0xBB, 0x20, 0x04,
664 0xA7, 0xC9, 0x23, 0x7E, 0xCD, 0xB6, 0x18, 0x22, 0x5D, 0x5C,
665 0xFE, 0x22, 0x20, 0x01, 0x0D, 0xFE, 0x3A, 0x28, 0x04, 0xFE,
666 0xCB, 0x20, 0x04, 0xCB, 0x41, 0x28, 0xDF, 0xFE, 0x0D, 0x20,
667 0xE3, 0x15, 0x37, 0xC9, 0xE5, 0x7E, 0xFE, 0x40, 0x38, 0x17,
668 0xCB, 0x6F, 0x28, 0x14, 0x87, 0xFA, 0xC7, 0x19, 0x3F, 0x01,
669 0x05, 0x00, 0x30, 0x02, 0x0E, 0x12, 0x17, 0x23, 0x7E, 0x30,
670 0xFB, 0x18, 0x06, 0x23, 0x23, 0x4E, 0x23, 0x46, 0x23, 0x09,
671 0xD1, 0xA7, 0xED, 0x52, 0x44, 0x4D, 0x19, 0xEB, 0xC9, 0xCD,
672 0xDD, 0x19, 0xC5, 0x78, 0x2F, 0x47, 0x79, 0x2F, 0x4F, 0x03,
673 0xCD, 0x64, 0x16, 0xEB, 0xE1, 0x19, 0xD5, 0xED, 0xB0, 0xE1,
674 0xC9, 0x2A, 0x59, 0x5C, 0x2B, 0x22, 0x5D, 0x5C, 0xE7, 0x21,
675 0x92, 0x5C, 0x22, 0x65, 0x5C, 0xCD, 0x3B, 0x2D, 0xCD, 0xA2,
676 0x2D, 0x38, 0x04, 0x21, 0xF0, 0xD8, 0x09, 0xDA, 0x8A, 0x1C,
677 0xC3, 0xC5, 0x16, 0xD5, 0xE5, 0xAF, 0xCB, 0x78, 0x20, 0x20,
678 0x60, 0x69, 0x1E, 0xFF, 0x18, 0x08, 0xD5, 0x56, 0x23, 0x5E,
679 0xE5, 0xEB, 0x1E, 0x20, 0x01, 0x18, 0xFC, 0xCD, 0x2A, 0x19,
680 0x01, 0x9C, 0xFF, 0xCD, 0x2A, 0x19, 0x0E, 0xF6, 0xCD, 0x2A,
681 0x19, 0x7D, 0xCD, 0xEF, 0x15, 0xE1, 0xD1, 0xC9, 0xB1, 0xCB,
682 0xBC, 0xBF, 0xC4, 0xAF, 0xB4, 0x93, 0x91, 0x92, 0x95, 0x98,
683 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x7F, 0x81, 0x2E, 0x6C,
684 0x6E, 0x70, 0x48, 0x94, 0x56, 0x3F, 0x41, 0x2B, 0x17, 0x1F,
685 0x37, 0x77, 0x44, 0x0F, 0x59, 0x2B, 0x43, 0x2D, 0x51, 0x3A,
686 0x6D, 0x42, 0x0D, 0x49, 0x5C, 0x44, 0x15, 0x5D, 0x01, 0x3D,
687 0x02, 0x06, 0x00, 0x67, 0x1E, 0x06, 0xCB, 0x05, 0xF0, 0x1C,
688 0x06, 0x00, 0xED, 0x1E, 0x00, 0xEE, 0x1C, 0x00, 0x23, 0x1F,
689 0x04, 0x3D, 0x06, 0xCC, 0x06, 0x05, 0x03, 0x1D, 0x04, 0x00,
690 0xAB, 0x1D, 0x05, 0xCD, 0x1F, 0x05, 0x89, 0x20, 0x05, 0x02,
691 0x2C, 0x05, 0xB2, 0x1B, 0x00, 0xB7, 0x11, 0x03, 0xA1, 0x1E,
692 0x05, 0xF9, 0x17, 0x08, 0x00, 0x80, 0x1E, 0x03, 0x4F, 0x1E,
693 0x00, 0x5F, 0x1E, 0x03, 0xAC, 0x1E, 0x00, 0x6B, 0x0D, 0x09,
694 0x00, 0xDC, 0x22, 0x06, 0x00, 0x3A, 0x1F, 0x05, 0xED, 0x1D,
695 0x05, 0x27, 0x1E, 0x03, 0x42, 0x1E, 0x09, 0x05, 0x82, 0x23,
696 0x00, 0xAC, 0x0E, 0x05, 0xC9, 0x1F, 0x05, 0xF5, 0x17, 0x0B,
697 0x0B, 0x0B, 0x0B, 0x08, 0x00, 0xF8, 0x03, 0x09, 0x05, 0x20,
698 0x23, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x00, 0x7A,
699 0x1E, 0x06, 0x00, 0x94, 0x22, 0x05, 0x60, 0x1F, 0x06, 0x2C,
700 0x0A, 0x00, 0x36, 0x17, 0x06, 0x00, 0xE5, 0x16, 0x0A, 0x00,
701 0x93, 0x17, 0x0A, 0x2C, 0x0A, 0x00, 0x93, 0x17, 0x0A, 0x00,
702 0x93, 0x17, 0x00, 0x93, 0x17, 0xFD, 0xCB, 0x01, 0xBE, 0xCD,
703 0xFB, 0x19, 0xAF, 0x32, 0x47, 0x5C, 0x3D, 0x32, 0x3A, 0x5C,
704 0x18, 0x01, 0xE7, 0xCD, 0xBF, 0x16, 0xFD, 0x34, 0x0D, 0xFA,
705 0x8A, 0x1C, 0xDF, 0x06, 0x00, 0xFE, 0x0D, 0x28, 0x7A, 0xFE,
706 0x3A, 0x28, 0xEB, 0x21, 0x76, 0x1B, 0xE5, 0x4F, 0xE7, 0x79,
707 0xD6, 0xCE, 0xDA, 0x8A, 0x1C, 0x4F, 0x21, 0x48, 0x1A, 0x09,
708 0x4E, 0x09, 0x18, 0x03, 0x2A, 0x74, 0x5C, 0x7E, 0x23, 0x22,
709 0x74, 0x5C, 0x01, 0x52, 0x1B, 0xC5, 0x4F, 0xFE, 0x20, 0x30,
710 0x0C, 0x21, 0x01, 0x1C, 0x06, 0x00, 0x09, 0x4E, 0x09, 0xE5,
711 0xDF, 0x05, 0xC9, 0xDF, 0xB9, 0xC2, 0x8A, 0x1C, 0xE7, 0xC9,
712 0xCD, 0x54, 0x1F, 0x38, 0x02, 0xCF, 0x14, 0xFD, 0xCB, 0x0A,
713 0x7E, 0x20, 0x71, 0x2A, 0x42, 0x5C, 0xCB, 0x7C, 0x28, 0x14,
714 0x21, 0xFE, 0xFF, 0x22, 0x45, 0x5C, 0x2A, 0x61, 0x5C, 0x2B,
715 0xED, 0x5B, 0x59, 0x5C, 0x1B, 0x3A, 0x44, 0x5C, 0x18, 0x33,
716 0xCD, 0x6E, 0x19, 0x3A, 0x44, 0x5C, 0x28, 0x19, 0xA7, 0x20,
717 0x43, 0x47, 0x7E, 0xE6, 0xC0, 0x78, 0x28, 0x0F, 0xCF, 0xFF,
718 0xC1, 0xCD, 0x30, 0x25, 0xC8, 0x2A, 0x55, 0x5C, 0x3E, 0xC0,
719 0xA6, 0xC0, 0xAF, 0xFE, 0x01, 0xCE, 0x00, 0x56, 0x23, 0x5E,
720 0xED, 0x53, 0x45, 0x5C, 0x23, 0x5E, 0x23, 0x56, 0xEB, 0x19,
721 0x23, 0x22, 0x55, 0x5C, 0xEB, 0x22, 0x5D, 0x5C, 0x57, 0x1E,
722 0x00, 0xFD, 0x36, 0x0A, 0xFF, 0x15, 0xFD, 0x72, 0x0D, 0xCA,
723 0x28, 0x1B, 0x14, 0xCD, 0x8B, 0x19, 0x28, 0x08, 0xCF, 0x16,
724 0xCD, 0x30, 0x25, 0xC0, 0xC1, 0xC1, 0xDF, 0xFE, 0x0D, 0x28,
725 0xBA, 0xFE, 0x3A, 0xCA, 0x28, 0x1B, 0xC3, 0x8A, 0x1C, 0x0F,
726 0x1D, 0x4B, 0x09, 0x67, 0x0B, 0x7B, 0x8E, 0x71, 0xB4, 0x81,
727 0xCF, 0xCD, 0xDE, 0x1C, 0xBF, 0xC1, 0xCC, 0xEE, 0x1B, 0xEB,
728 0x2A, 0x74, 0x5C, 0x4E, 0x23, 0x46, 0xEB, 0xC5, 0xC9, 0xCD,
729 0xB2, 0x28, 0xFD, 0x36, 0x37, 0x00, 0x30, 0x08, 0xFD, 0xCB,
730 0x37, 0xCE, 0x20, 0x18, 0xCF, 0x01, 0xCC, 0x96, 0x29, 0xFD,
731 0xCB, 0x01, 0x76, 0x20, 0x0D, 0xAF, 0xCD, 0x30, 0x25, 0xC4,
732 0xF1, 0x2B, 0x21, 0x71, 0x5C, 0xB6, 0x77, 0xEB, 0xED, 0x43,
733 0x72, 0x5C, 0x22, 0x4D, 0x5C, 0xC9, 0xC1, 0xCD, 0x56, 0x1C,
734 0xCD, 0xEE, 0x1B, 0xC9, 0x3A, 0x3B, 0x5C, 0xF5, 0xCD, 0xFB,
735 0x24, 0xF1, 0xFD, 0x56, 0x01, 0xAA, 0xE6, 0x40, 0x20, 0x24,
736 0xCB, 0x7A, 0xC2, 0xFF, 0x2A, 0xC9, 0xCD, 0xB2, 0x28, 0xF5,
737 0x79, 0xF6, 0x9F, 0x3C, 0x20, 0x14, 0xF1, 0x18, 0xA9, 0xE7,
738 0xCD, 0x82, 0x1C, 0xFE, 0x2C, 0x20, 0x09, 0xE7, 0xCD, 0xFB,
739 0x24, 0xFD, 0xCB, 0x01, 0x76, 0xC0, 0xCF, 0x0B, 0xCD, 0xFB,
740 0x24, 0xFD, 0xCB, 0x01, 0x76, 0xC8, 0x18, 0xF4, 0xFD, 0xCB,
741 0x01, 0x7E, 0xFD, 0xCB, 0x02, 0x86, 0xC4, 0x4D, 0x0D, 0xF1,
742 0x3A, 0x74, 0x5C, 0xD6, 0x13, 0xCD, 0xFC, 0x21, 0xCD, 0xEE,
743 0x1B, 0x2A, 0x8F, 0x5C, 0x22, 0x8D, 0x5C, 0x21, 0x91, 0x5C,
744 0x7E, 0x07, 0xAE, 0xE6, 0xAA, 0xAE, 0x77, 0xC9, 0xCD, 0x30,
745 0x25, 0x28, 0x13, 0xFD, 0xCB, 0x02, 0x86, 0xCD, 0x4D, 0x0D,
746 0x21, 0x90, 0x5C, 0x7E, 0xF6, 0xF8, 0x77, 0xFD, 0xCB, 0x57,
747 0xB6, 0xDF, 0xCD, 0xE2, 0x21, 0x18, 0x9F, 0xC3, 0x05, 0x06,
748 0xFE, 0x0D, 0x28, 0x04, 0xFE, 0x3A, 0x20, 0x9C, 0xCD, 0x30,
749 0x25, 0xC8, 0xEF, 0xA0, 0x38, 0xC9, 0xCF, 0x08, 0xC1, 0xCD,
750 0x30, 0x25, 0x28, 0x0A, 0xEF, 0x02, 0x38, 0xEB, 0xCD, 0xE9,
751 0x34, 0xDA, 0xB3, 0x1B, 0xC3, 0x29, 0x1B, 0xFE, 0xCD, 0x20,
752 0x09, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0x18, 0x06,
753 0xCD, 0xEE, 0x1B, 0xEF, 0xA1, 0x38, 0xEF, 0xC0, 0x02, 0x01,
754 0xE0, 0x01, 0x38, 0xCD, 0xFF, 0x2A, 0x22, 0x68, 0x5C, 0x2B,
755 0x7E, 0xCB, 0xFE, 0x01, 0x06, 0x00, 0x09, 0x07, 0x38, 0x06,
756 0x0E, 0x0D, 0xCD, 0x55, 0x16, 0x23, 0xE5, 0xEF, 0x02, 0x02,
757 0x38, 0xE1, 0xEB, 0x0E, 0x0A, 0xED, 0xB0, 0x2A, 0x45, 0x5C,
758 0xEB, 0x73, 0x23, 0x72, 0xFD, 0x56, 0x0D, 0x14, 0x23, 0x72,
759 0xCD, 0xDA, 0x1D, 0xD0, 0xFD, 0x46, 0x38, 0x2A, 0x45, 0x5C,
760 0x22, 0x42, 0x5C, 0x3A, 0x47, 0x5C, 0xED, 0x44, 0x57, 0x2A,
761 0x5D, 0x5C, 0x1E, 0xF3, 0xC5, 0xED, 0x4B, 0x55, 0x5C, 0xCD,
762 0x86, 0x1D, 0xED, 0x43, 0x55, 0x5C, 0xC1, 0x38, 0x11, 0xE7,
763 0xF6, 0x20, 0xB8, 0x28, 0x03, 0xE7, 0x18, 0xE8, 0xE7, 0x3E,
764 0x01, 0x92, 0x32, 0x44, 0x5C, 0xC9, 0xCF, 0x11, 0x7E, 0xFE,
765 0x3A, 0x28, 0x18, 0x23, 0x7E, 0xE6, 0xC0, 0x37, 0xC0, 0x46,
766 0x23, 0x4E, 0xED, 0x43, 0x42, 0x5C, 0x23, 0x4E, 0x23, 0x46,
767 0xE5, 0x09, 0x44, 0x4D, 0xE1, 0x16, 0x00, 0xC5, 0xCD, 0x8B,
768 0x19, 0xC1, 0xD0, 0x18, 0xE0, 0xFD, 0xCB, 0x37, 0x4E, 0xC2,
769 0x2E, 0x1C, 0x2A, 0x4D, 0x5C, 0xCB, 0x7E, 0x28, 0x1F, 0x23,
770 0x22, 0x68, 0x5C, 0xEF, 0xE0, 0xE2, 0x0F, 0xC0, 0x02, 0x38,
771 0xCD, 0xDA, 0x1D, 0xD8, 0x2A, 0x68, 0x5C, 0x11, 0x0F, 0x00,
772 0x19, 0x5E, 0x23, 0x56, 0x23, 0x66, 0xEB, 0xC3, 0x73, 0x1E,
773 0xCF, 0x00, 0xEF, 0xE1, 0xE0, 0xE2, 0x36, 0x00, 0x02, 0x01,
774 0x03, 0x37, 0x00, 0x04, 0x38, 0xA7, 0xC9, 0x38, 0x37, 0xC9,
775 0xE7, 0xCD, 0x1F, 0x1C, 0xCD, 0x30, 0x25, 0x28, 0x29, 0xDF,
776 0x22, 0x5F, 0x5C, 0x2A, 0x57, 0x5C, 0x7E, 0xFE, 0x2C, 0x28,
777 0x09, 0x1E, 0xE4, 0xCD, 0x86, 0x1D, 0x30, 0x02, 0xCF, 0x0D,
778 0xCD, 0x77, 0x00, 0xCD, 0x56, 0x1C, 0xDF, 0x22, 0x57, 0x5C,
779 0x2A, 0x5F, 0x5C, 0xFD, 0x36, 0x26, 0x00, 0xCD, 0x78, 0x00,
780 0xDF, 0xFE, 0x2C, 0x28, 0xC9, 0xCD, 0xEE, 0x1B, 0xC9, 0xCD,
781 0x30, 0x25, 0x20, 0x0B, 0xCD, 0xFB, 0x24, 0xFE, 0x2C, 0xC4,
782 0xEE, 0x1B, 0xE7, 0x18, 0xF5, 0x3E, 0xE4, 0x47, 0xED, 0xB9,
783 0x11, 0x00, 0x02, 0xC3, 0x8B, 0x19, 0xCD, 0x99, 0x1E, 0x60,
784 0x69, 0xCD, 0x6E, 0x19, 0x2B, 0x22, 0x57, 0x5C, 0xC9, 0xCD,
785 0x99, 0x1E, 0x78, 0xB1, 0x20, 0x04, 0xED, 0x4B, 0x78, 0x5C,
786 0xED, 0x43, 0x76, 0x5C, 0xC9, 0x2A, 0x6E, 0x5C, 0xFD, 0x56,
787 0x36, 0x18, 0x0C, 0xCD, 0x99, 0x1E, 0x60, 0x69, 0x16, 0x00,
788 0x7C, 0xFE, 0xF0, 0x30, 0x2C, 0x22, 0x42, 0x5C, 0xFD, 0x72,
789 0x0A, 0xC9, 0xCD, 0x85, 0x1E, 0xED, 0x79, 0xC9, 0xCD, 0x85,
790 0x1E, 0x02, 0xC9, 0xCD, 0xD5, 0x2D, 0x38, 0x15, 0x28, 0x02,
791 0xED, 0x44, 0xF5, 0xCD, 0x99, 0x1E, 0xF1, 0xC9, 0xCD, 0xD5,
792 0x2D, 0x18, 0x03, 0xCD, 0xA2, 0x2D, 0x38, 0x01, 0xC8, 0xCF,
793 0x0A, 0xCD, 0x67, 0x1E, 0x01, 0x00, 0x00, 0xCD, 0x45, 0x1E,
794 0x18, 0x03, 0xCD, 0x99, 0x1E, 0x78, 0xB1, 0x20, 0x04, 0xED,
795 0x4B, 0xB2, 0x5C, 0xC5, 0xED, 0x5B, 0x4B, 0x5C, 0x2A, 0x59,
796 0x5C, 0x2B, 0xCD, 0xE5, 0x19, 0xCD, 0x6B, 0x0D, 0x2A, 0x65,
797 0x5C, 0x11, 0x32, 0x00, 0x19, 0xD1, 0xED, 0x52, 0x30, 0x08,
798 0x2A, 0xB4, 0x5C, 0xA7, 0xED, 0x52, 0x30, 0x02, 0xCF, 0x15,
799 0xEB, 0x22, 0xB2, 0x5C, 0xD1, 0xC1, 0x36, 0x3E, 0x2B, 0xF9,
800 0xC5, 0xED, 0x73, 0x3D, 0x5C, 0xEB, 0xE9, 0xD1, 0xFD, 0x66,
801 0x0D, 0x24, 0xE3, 0x33, 0xED, 0x4B, 0x45, 0x5C, 0xC5, 0xE5,
802 0xED, 0x73, 0x3D, 0x5C, 0xD5, 0xCD, 0x67, 0x1E, 0x01, 0x14,
803 0x00, 0x2A, 0x65, 0x5C, 0x09, 0x38, 0x0A, 0xEB, 0x21, 0x50,
804 0x00, 0x19, 0x38, 0x03, 0xED, 0x72, 0xD8, 0x2E, 0x03, 0xC3,
805 0x55, 0x00, 0x01, 0x00, 0x00, 0xCD, 0x05, 0x1F, 0x44, 0x4D,
806 0xC9, 0xC1, 0xE1, 0xD1, 0x7A, 0xFE, 0x3E, 0x28, 0x0B, 0x3B,
807 0xE3, 0xEB, 0xED, 0x73, 0x3D, 0x5C, 0xC5, 0xC3, 0x73, 0x1E,
808 0xD5, 0xE5, 0xCF, 0x06, 0xCD, 0x99, 0x1E, 0x76, 0x0B, 0x78,
809 0xB1, 0x28, 0x0C, 0x78, 0xA1, 0x3C, 0x20, 0x01, 0x03, 0xFD,
810 0xCB, 0x01, 0x6E, 0x28, 0xEE, 0xFD, 0xCB, 0x01, 0xAE, 0xC9,
811 0x3E, 0x7F, 0xDB, 0xFE, 0x1F, 0xD8, 0x3E, 0xFE, 0xDB, 0xFE,
812 0x1F, 0xC9, 0xCD, 0x30, 0x25, 0x28, 0x05, 0x3E, 0xCE, 0xC3,
813 0x39, 0x1E, 0xFD, 0xCB, 0x01, 0xF6, 0xCD, 0x8D, 0x2C, 0x30,
814 0x16, 0xE7, 0xFE, 0x24, 0x20, 0x05, 0xFD, 0xCB, 0x01, 0xB6,
815 0xE7, 0xFE, 0x28, 0x20, 0x3C, 0xE7, 0xFE, 0x29, 0x28, 0x20,
816 0xCD, 0x8D, 0x2C, 0xD2, 0x8A, 0x1C, 0xEB, 0xE7, 0xFE, 0x24,
817 0x20, 0x02, 0xEB, 0xE7, 0xEB, 0x01, 0x06, 0x00, 0xCD, 0x55,
818 0x16, 0x23, 0x23, 0x36, 0x0E, 0xFE, 0x2C, 0x20, 0x03, 0xE7,
819 0x18, 0xE0, 0xFE, 0x29, 0x20, 0x13, 0xE7, 0xFE, 0x3D, 0x20,
820 0x0E, 0xE7, 0x3A, 0x3B, 0x5C, 0xF5, 0xCD, 0xFB, 0x24, 0xF1,
821 0xFD, 0xAE, 0x01, 0xE6, 0x40, 0xC2, 0x8A, 0x1C, 0xCD, 0xEE,
822 0x1B, 0xCD, 0x30, 0x25, 0xE1, 0xC8, 0xE9, 0x3E, 0x03, 0x18,
823 0x02, 0x3E, 0x02, 0xCD, 0x30, 0x25, 0xC4, 0x01, 0x16, 0xCD,
824 0x4D, 0x0D, 0xCD, 0xDF, 0x1F, 0xCD, 0xEE, 0x1B, 0xC9, 0xDF,
825 0xCD, 0x45, 0x20, 0x28, 0x0D, 0xCD, 0x4E, 0x20, 0x28, 0xFB,
826 0xCD, 0xFC, 0x1F, 0xCD, 0x4E, 0x20, 0x28, 0xF3, 0xFE, 0x29,
827 0xC8, 0xCD, 0xC3, 0x1F, 0x3E, 0x0D, 0xD7, 0xC9, 0xDF, 0xFE,
828 0xAC, 0x20, 0x0D, 0xCD, 0x79, 0x1C, 0xCD, 0xC3, 0x1F, 0xCD,
829 0x07, 0x23, 0x3E, 0x16, 0x18, 0x10, 0xFE, 0xAD, 0x20, 0x12,
830 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xC3, 0x1F, 0xCD, 0x99, 0x1E,
831 0x3E, 0x17, 0xD7, 0x79, 0xD7, 0x78, 0xD7, 0xC9, 0xCD, 0xF2,
832 0x21, 0xD0, 0xCD, 0x70, 0x20, 0xD0, 0xCD, 0xFB, 0x24, 0xCD,
833 0xC3, 0x1F, 0xFD, 0xCB, 0x01, 0x76, 0xCC, 0xF1, 0x2B, 0xC2,
834 0xE3, 0x2D, 0x78, 0xB1, 0x0B, 0xC8, 0x1A, 0x13, 0xD7, 0x18,
835 0xF7, 0xFE, 0x29, 0xC8, 0xFE, 0x0D, 0xC8, 0xFE, 0x3A, 0xC9,
836 0xDF, 0xFE, 0x3B, 0x28, 0x14, 0xFE, 0x2C, 0x20, 0x0A, 0xCD,
837 0x30, 0x25, 0x28, 0x0B, 0x3E, 0x06, 0xD7, 0x18, 0x06, 0xFE,
838 0x27, 0xC0, 0xCD, 0xF5, 0x1F, 0xE7, 0xCD, 0x45, 0x20, 0x20,
839 0x01, 0xC1, 0xBF, 0xC9, 0xFE, 0x23, 0x37, 0xC0, 0xE7, 0xCD,
840 0x82, 0x1C, 0xA7, 0xCD, 0xC3, 0x1F, 0xCD, 0x94, 0x1E, 0xFE,
841 0x10, 0xD2, 0x0E, 0x16, 0xCD, 0x01, 0x16, 0xA7, 0xC9, 0xCD,
842 0x30, 0x25, 0x28, 0x08, 0x3E, 0x01, 0xCD, 0x01, 0x16, 0xCD,
843 0x6E, 0x0D, 0xFD, 0x36, 0x02, 0x01, 0xCD, 0xC1, 0x20, 0xCD,
844 0xEE, 0x1B, 0xED, 0x4B, 0x88, 0x5C, 0x3A, 0x6B, 0x5C, 0xB8,
845 0x38, 0x03, 0x0E, 0x21, 0x47, 0xED, 0x43, 0x88, 0x5C, 0x3E,
846 0x19, 0x90, 0x32, 0x8C, 0x5C, 0xFD, 0xCB, 0x02, 0x86, 0xCD,
847 0xD9, 0x0D, 0xC3, 0x6E, 0x0D, 0xCD, 0x4E, 0x20, 0x28, 0xFB,
848 0xFE, 0x28, 0x20, 0x0E, 0xE7, 0xCD, 0xDF, 0x1F, 0xDF, 0xFE,
849 0x29, 0xC2, 0x8A, 0x1C, 0xE7, 0xC3, 0xB2, 0x21, 0xFE, 0xCA,
850 0x20, 0x11, 0xE7, 0xCD, 0x1F, 0x1C, 0xFD, 0xCB, 0x37, 0xFE,
851 0xFD, 0xCB, 0x01, 0x76, 0xC2, 0x8A, 0x1C, 0x18, 0x0D, 0xCD,
852 0x8D, 0x2C, 0xD2, 0xAF, 0x21, 0xCD, 0x1F, 0x1C, 0xFD, 0xCB,
853 0x37, 0xBE, 0xCD, 0x30, 0x25, 0xCA, 0xB2, 0x21, 0xCD, 0xBF,
854 0x16, 0x21, 0x71, 0x5C, 0xCB, 0xB6, 0xCB, 0xEE, 0x01, 0x01,
855 0x00, 0xCB, 0x7E, 0x20, 0x0B, 0x3A, 0x3B, 0x5C, 0xE6, 0x40,
856 0x20, 0x02, 0x0E, 0x03, 0xB6, 0x77, 0xF7, 0x36, 0x0D, 0x79,
857 0x0F, 0x0F, 0x30, 0x05, 0x3E, 0x22, 0x12, 0x2B, 0x77, 0x22,
858 0x5B, 0x5C, 0xFD, 0xCB, 0x37, 0x7E, 0x20, 0x2C, 0x2A, 0x5D,
859 0x5C, 0xE5, 0x2A, 0x3D, 0x5C, 0xE5, 0x21, 0x3A, 0x21, 0xE5,
860 0xFD, 0xCB, 0x30, 0x66, 0x28, 0x04, 0xED, 0x73, 0x3D, 0x5C,
861 0x2A, 0x61, 0x5C, 0xCD, 0xA7, 0x11, 0xFD, 0x36, 0x00, 0xFF,
862 0xCD, 0x2C, 0x0F, 0xFD, 0xCB, 0x01, 0xBE, 0xCD, 0xB9, 0x21,
863 0x18, 0x03, 0xCD, 0x2C, 0x0F, 0xFD, 0x36, 0x22, 0x00, 0xCD,
864 0xD6, 0x21, 0x20, 0x0A, 0xCD, 0x1D, 0x11, 0xED, 0x4B, 0x82,
865 0x5C, 0xCD, 0xD9, 0x0D, 0x21, 0x71, 0x5C, 0xCB, 0xAE, 0xCB,
866 0x7E, 0xCB, 0xBE, 0x20, 0x1C, 0xE1, 0xE1, 0x22, 0x3D, 0x5C,
867 0xE1, 0x22, 0x5F, 0x5C, 0xFD, 0xCB, 0x01, 0xFE, 0xCD, 0xB9,
868 0x21, 0x2A, 0x5F, 0x5C, 0xFD, 0x36, 0x26, 0x00, 0x22, 0x5D,
869 0x5C, 0x18, 0x17, 0x2A, 0x63, 0x5C, 0xED, 0x5B, 0x61, 0x5C,
870 0x37, 0xED, 0x52, 0x44, 0x4D, 0xCD, 0xB2, 0x2A, 0xCD, 0xFF,
871 0x2A, 0x18, 0x03, 0xCD, 0xFC, 0x1F, 0xCD, 0x4E, 0x20, 0xCA,
872 0xC1, 0x20, 0xC9, 0x2A, 0x61, 0x5C, 0x22, 0x5D, 0x5C, 0xDF,
873 0xFE, 0xE2, 0x28, 0x0C, 0x3A, 0x71, 0x5C, 0xCD, 0x59, 0x1C,
874 0xDF, 0xFE, 0x0D, 0xC8, 0xCF, 0x0B, 0xCD, 0x30, 0x25, 0xC8,
875 0xCF, 0x10, 0x2A, 0x51, 0x5C, 0x23, 0x23, 0x23, 0x23, 0x7E,
876 0xFE, 0x4B, 0xC9, 0xE7, 0xCD, 0xF2, 0x21, 0xD8, 0xDF, 0xFE,
877 0x2C, 0x28, 0xF6, 0xFE, 0x3B, 0x28, 0xF2, 0xC3, 0x8A, 0x1C,
878 0xFE, 0xD9, 0xD8, 0xFE, 0xDF, 0x3F, 0xD8, 0xF5, 0xE7, 0xF1,
879 0xD6, 0xC9, 0xF5, 0xCD, 0x82, 0x1C, 0xF1, 0xA7, 0xCD, 0xC3,
880 0x1F, 0xF5, 0xCD, 0x94, 0x1E, 0x57, 0xF1, 0xD7, 0x7A, 0xD7,
881 0xC9, 0xD6, 0x11, 0xCE, 0x00, 0x28, 0x1D, 0xD6, 0x02, 0xCE,
882 0x00, 0x28, 0x56, 0xFE, 0x01, 0x7A, 0x06, 0x01, 0x20, 0x04,
883 0x07, 0x07, 0x06, 0x04, 0x4F, 0x7A, 0xFE, 0x02, 0x30, 0x16,
884 0x79, 0x21, 0x91, 0x5C, 0x18, 0x38, 0x7A, 0x06, 0x07, 0x38,
885 0x05, 0x07, 0x07, 0x07, 0x06, 0x38, 0x4F, 0x7A, 0xFE, 0x0A,
886 0x38, 0x02, 0xCF, 0x13, 0x21, 0x8F, 0x5C, 0xFE, 0x08, 0x38,
887 0x0B, 0x7E, 0x28, 0x07, 0xB0, 0x2F, 0xE6, 0x24, 0x28, 0x01,
888 0x78, 0x4F, 0x79, 0xCD, 0x6C, 0x22, 0x3E, 0x07, 0xBA, 0x9F,
889 0xCD, 0x6C, 0x22, 0x07, 0x07, 0xE6, 0x50, 0x47, 0x3E, 0x08,
890 0xBA, 0x9F, 0xAE, 0xA0, 0xAE, 0x77, 0x23, 0x78, 0xC9, 0x9F,
891 0x7A, 0x0F, 0x06, 0x80, 0x20, 0x03, 0x0F, 0x06, 0x40, 0x4F,
892 0x7A, 0xFE, 0x08, 0x28, 0x04, 0xFE, 0x02, 0x30, 0xBD, 0x79,
893 0x21, 0x8F, 0x5C, 0xCD, 0x6C, 0x22, 0x79, 0x0F, 0x0F, 0x0F,
894 0x18, 0xD8, 0xCD, 0x94, 0x1E, 0xFE, 0x08, 0x30, 0xA9, 0xD3,
895 0xFE, 0x07, 0x07, 0x07, 0xCB, 0x6F, 0x20, 0x02, 0xEE, 0x07,
896 0x32, 0x48, 0x5C, 0xC9, 0x3E, 0xAF, 0x90, 0xDA, 0xF9, 0x24,
897 0x47, 0xA7, 0x1F, 0x37, 0x1F, 0xA7, 0x1F, 0xA8, 0xE6, 0xF8,
898 0xA8, 0x67, 0x79, 0x07, 0x07, 0x07, 0xA8, 0xE6, 0xC7, 0xA8,
899 0x07, 0x07, 0x6F, 0x79, 0xE6, 0x07, 0xC9, 0xCD, 0x07, 0x23,
900 0xCD, 0xAA, 0x22, 0x47, 0x04, 0x7E, 0x07, 0x10, 0xFD, 0xE6,
901 0x01, 0xC3, 0x28, 0x2D, 0xCD, 0x07, 0x23, 0xCD, 0xE5, 0x22,
902 0xC3, 0x4D, 0x0D, 0xED, 0x43, 0x7D, 0x5C, 0xCD, 0xAA, 0x22,
903 0x47, 0x04, 0x3E, 0xFE, 0x0F, 0x10, 0xFD, 0x47, 0x7E, 0xFD,
904 0x4E, 0x57, 0xCB, 0x41, 0x20, 0x01, 0xA0, 0xCB, 0x51, 0x20,
905 0x02, 0xA8, 0x2F, 0x77, 0xC3, 0xDB, 0x0B, 0xCD, 0x14, 0x23,
906 0x47, 0xC5, 0xCD, 0x14, 0x23, 0x59, 0xC1, 0x51, 0x4F, 0xC9,
907 0xCD, 0xD5, 0x2D, 0xDA, 0xF9, 0x24, 0x0E, 0x01, 0xC8, 0x0E,
908 0xFF, 0xC9, 0xDF, 0xFE, 0x2C, 0xC2, 0x8A, 0x1C, 0xE7, 0xCD,
909 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0xEF, 0x2A, 0x3D, 0x38, 0x7E,
910 0xFE, 0x81, 0x30, 0x05, 0xEF, 0x02, 0x38, 0x18, 0xA1, 0xEF,
911 0xA3, 0x38, 0x36, 0x83, 0xEF, 0xC5, 0x02, 0x38, 0xCD, 0x7D,
912 0x24, 0xC5, 0xEF, 0x31, 0xE1, 0x04, 0x38, 0x7E, 0xFE, 0x80,
913 0x30, 0x08, 0xEF, 0x02, 0x02, 0x38, 0xC1, 0xC3, 0xDC, 0x22,
914 0xEF, 0xC2, 0x01, 0xC0, 0x02, 0x03, 0x01, 0xE0, 0x0F, 0xC0,
915 0x01, 0x31, 0xE0, 0x01, 0x31, 0xE0, 0xA0, 0xC1, 0x02, 0x38,
916 0xFD, 0x34, 0x62, 0xCD, 0x94, 0x1E, 0x6F, 0xE5, 0xCD, 0x94,
917 0x1E, 0xE1, 0x67, 0x22, 0x7D, 0x5C, 0xC1, 0xC3, 0x20, 0x24,
918 0xDF, 0xFE, 0x2C, 0x28, 0x06, 0xCD, 0xEE, 0x1B, 0xC3, 0x77,
919 0x24, 0xE7, 0xCD, 0x82, 0x1C, 0xCD, 0xEE, 0x1B, 0xEF, 0xC5,
920 0xA2, 0x04, 0x1F, 0x31, 0x30, 0x30, 0x00, 0x06, 0x02, 0x38,
921 0xC3, 0x77, 0x24, 0xC0, 0x02, 0xC1, 0x02, 0x31, 0x2A, 0xE1,
922 0x01, 0xE1, 0x2A, 0x0F, 0xE0, 0x05, 0x2A, 0xE0, 0x01, 0x3D,
923 0x38, 0x7E, 0xFE, 0x81, 0x30, 0x07, 0xEF, 0x02, 0x02, 0x38,
924 0xC3, 0x77, 0x24, 0xCD, 0x7D, 0x24, 0xC5, 0xEF, 0x02, 0xE1,
925 0x01, 0x05, 0xC1, 0x02, 0x01, 0x31, 0xE1, 0x04, 0xC2, 0x02,
926 0x01, 0x31, 0xE1, 0x04, 0xE2, 0xE5, 0xE0, 0x03, 0xA2, 0x04,
927 0x31, 0x1F, 0xC5, 0x02, 0x20, 0xC0, 0x02, 0xC2, 0x02, 0xC1,
928 0xE5, 0x04, 0xE0, 0xE2, 0x04, 0x0F, 0xE1, 0x01, 0xC1, 0x02,
929 0xE0, 0x04, 0xE2, 0xE5, 0x04, 0x03, 0xC2, 0x2A, 0xE1, 0x2A,
930 0x0F, 0x02, 0x38, 0x1A, 0xFE, 0x81, 0xC1, 0xDA, 0x77, 0x24,
931 0xC5, 0xEF, 0x01, 0x38, 0x3A, 0x7D, 0x5C, 0xCD, 0x28, 0x2D,
932 0xEF, 0xC0, 0x0F, 0x01, 0x38, 0x3A, 0x7E, 0x5C, 0xCD, 0x28,
933 0x2D, 0xEF, 0xC5, 0x0F, 0xE0, 0xE5, 0x38, 0xC1, 0x05, 0x28,
934 0x3C, 0x18, 0x14, 0xEF, 0xE1, 0x31, 0xE3, 0x04, 0xE2, 0xE4,
935 0x04, 0x03, 0xC1, 0x02, 0xE4, 0x04, 0xE2, 0xE3, 0x04, 0x0F,
936 0xC2, 0x02, 0x38, 0xC5, 0xEF, 0xC0, 0x02, 0xE1, 0x0F, 0x31,
937 0x38, 0x3A, 0x7D, 0x5C, 0xCD, 0x28, 0x2D, 0xEF, 0x03, 0xE0,
938 0xE2, 0x0F, 0xC0, 0x01, 0xE0, 0x38, 0x3A, 0x7E, 0x5C, 0xCD,
939 0x28, 0x2D, 0xEF, 0x03, 0x38, 0xCD, 0xB7, 0x24, 0xC1, 0x10,
940 0xC6, 0xEF, 0x02, 0x02, 0x01, 0x38, 0x3A, 0x7D, 0x5C, 0xCD,
941 0x28, 0x2D, 0xEF, 0x03, 0x01, 0x38, 0x3A, 0x7E, 0x5C, 0xCD,
942 0x28, 0x2D, 0xEF, 0x03, 0x38, 0xCD, 0xB7, 0x24, 0xC3, 0x4D,
943 0x0D, 0xEF, 0x31, 0x28, 0x34, 0x32, 0x00, 0x01, 0x05, 0xE5,
944 0x01, 0x05, 0x2A, 0x38, 0xCD, 0xD5, 0x2D, 0x38, 0x06, 0xE6,
945 0xFC, 0xC6, 0x04, 0x30, 0x02, 0x3E, 0xFC, 0xF5, 0xCD, 0x28,
946 0x2D, 0xEF, 0xE5, 0x01, 0x05, 0x31, 0x1F, 0xC4, 0x02, 0x31,
947 0xA2, 0x04, 0x1F, 0xC1, 0x01, 0xC0, 0x02, 0x31, 0x04, 0x31,
948 0x0F, 0xA1, 0x03, 0x1B, 0xC3, 0x02, 0x38, 0xC1, 0xC9, 0xCD,
949 0x07, 0x23, 0x79, 0xB8, 0x30, 0x06, 0x69, 0xD5, 0xAF, 0x5F,
950 0x18, 0x07, 0xB1, 0xC8, 0x68, 0x41, 0xD5, 0x16, 0x00, 0x60,
951 0x78, 0x1F, 0x85, 0x38, 0x03, 0xBC, 0x38, 0x07, 0x94, 0x4F,
952 0xD9, 0xC1, 0xC5, 0x18, 0x04, 0x4F, 0xD5, 0xD9, 0xC1, 0x2A,
953 0x7D, 0x5C, 0x78, 0x84, 0x47, 0x79, 0x3C, 0x85, 0x38, 0x0D,
954 0x28, 0x0D, 0x3D, 0x4F, 0xCD, 0xE5, 0x22, 0xD9, 0x79, 0x10,
955 0xD9, 0xD1, 0xC9, 0x28, 0xF3, 0xCF, 0x0A, 0xDF, 0x06, 0x00,
956 0xC5, 0x4F, 0x21, 0x96, 0x25, 0xCD, 0xDC, 0x16, 0x79, 0xD2,
957 0x84, 0x26, 0x06, 0x00, 0x4E, 0x09, 0xE9, 0xCD, 0x74, 0x00,
958 0x03, 0xFE, 0x0D, 0xCA, 0x8A, 0x1C, 0xFE, 0x22, 0x20, 0xF3,
959 0xCD, 0x74, 0x00, 0xFE, 0x22, 0xC9, 0xE7, 0xFE, 0x28, 0x20,
960 0x06, 0xCD, 0x79, 0x1C, 0xDF, 0xFE, 0x29, 0xC2, 0x8A, 0x1C,
961 0xFD, 0xCB, 0x01, 0x7E, 0xC9, 0xCD, 0x07, 0x23, 0x2A, 0x36,
962 0x5C, 0x11, 0x00, 0x01, 0x19, 0x79, 0x0F, 0x0F, 0x0F, 0xE6,
963 0xE0, 0xA8, 0x5F, 0x79, 0xE6, 0x18, 0xEE, 0x40, 0x57, 0x06,
964 0x60, 0xC5, 0xD5, 0xE5, 0x1A, 0xAE, 0x28, 0x04, 0x3C, 0x20,
965 0x1A, 0x3D, 0x4F, 0x06, 0x07, 0x14, 0x23, 0x1A, 0xAE, 0xA9,
966 0x20, 0x0F, 0x10, 0xF7, 0xC1, 0xC1, 0xC1, 0x3E, 0x80, 0x90,
967 0x01, 0x01, 0x00, 0xF7, 0x12, 0x18, 0x0A, 0xE1, 0x11, 0x08,
968 0x00, 0x19, 0xD1, 0xC1, 0x10, 0xD3, 0x48, 0xC3, 0xB2, 0x2A,
969 0xCD, 0x07, 0x23, 0x79, 0x0F, 0x0F, 0x0F, 0x4F, 0xE6, 0xE0,
970 0xA8, 0x6F, 0x79, 0xE6, 0x03, 0xEE, 0x58, 0x67, 0x7E, 0xC3,
971 0x28, 0x2D, 0x22, 0x1C, 0x28, 0x4F, 0x2E, 0xF2, 0x2B, 0x12,
972 0xA8, 0x56, 0xA5, 0x57, 0xA7, 0x84, 0xA6, 0x8F, 0xC4, 0xE6,
973 0xAA, 0xBF, 0xAB, 0xC7, 0xA9, 0xCE, 0x00, 0xE7, 0xC3, 0xFF,
974 0x24, 0xDF, 0x23, 0xE5, 0x01, 0x00, 0x00, 0xCD, 0x0F, 0x25,
975 0x20, 0x1B, 0xCD, 0x0F, 0x25, 0x28, 0xFB, 0xCD, 0x30, 0x25,
976 0x28, 0x11, 0xF7, 0xE1, 0xD5, 0x7E, 0x23, 0x12, 0x13, 0xFE,
977 0x22, 0x20, 0xF8, 0x7E, 0x23, 0xFE, 0x22, 0x28, 0xF2, 0x0B,
978 0xD1, 0x21, 0x3B, 0x5C, 0xCB, 0xB6, 0xCB, 0x7E, 0xC4, 0xB2,
979 0x2A, 0xC3, 0x12, 0x27, 0xE7, 0xCD, 0xFB, 0x24, 0xFE, 0x29,
980 0xC2, 0x8A, 0x1C, 0xE7, 0xC3, 0x12, 0x27, 0xC3, 0xBD, 0x27,
981 0xCD, 0x30, 0x25, 0x28, 0x28, 0xED, 0x4B, 0x76, 0x5C, 0xCD,
982 0x2B, 0x2D, 0xEF, 0xA1, 0x0F, 0x34, 0x37, 0x16, 0x04, 0x34,
983 0x80, 0x41, 0x00, 0x00, 0x80, 0x32, 0x02, 0xA1, 0x03, 0x31,
984 0x38, 0xCD, 0xA2, 0x2D, 0xED, 0x43, 0x76, 0x5C, 0x7E, 0xA7,
985 0x28, 0x03, 0xD6, 0x10, 0x77, 0x18, 0x09, 0xCD, 0x30, 0x25,
986 0x28, 0x04, 0xEF, 0xA3, 0x38, 0x34, 0xE7, 0xC3, 0xC3, 0x26,
987 0x01, 0x5A, 0x10, 0xE7, 0xFE, 0x23, 0xCA, 0x0D, 0x27, 0x21,
988 0x3B, 0x5C, 0xCB, 0xB6, 0xCB, 0x7E, 0x28, 0x1F, 0xCD, 0x8E,
989 0x02, 0x0E, 0x00, 0x20, 0x13, 0xCD, 0x1E, 0x03, 0x30, 0x0E,
990 0x15, 0x5F, 0xCD, 0x33, 0x03, 0xF5, 0x01, 0x01, 0x00, 0xF7,
991 0xF1, 0x12, 0x0E, 0x01, 0x06, 0x00, 0xCD, 0xB2, 0x2A, 0xC3,
992 0x12, 0x27, 0xCD, 0x22, 0x25, 0xC4, 0x35, 0x25, 0xE7, 0xC3,
993 0xDB, 0x25, 0xCD, 0x22, 0x25, 0xC4, 0x80, 0x25, 0xE7, 0x18,
994 0x48, 0xCD, 0x22, 0x25, 0xC4, 0xCB, 0x22, 0xE7, 0x18, 0x3F,
995 0xCD, 0x88, 0x2C, 0x30, 0x56, 0xFE, 0x41, 0x30, 0x3C, 0xCD,
996 0x30, 0x25, 0x20, 0x23, 0xCD, 0x9B, 0x2C, 0xDF, 0x01, 0x06,
997 0x00, 0xCD, 0x55, 0x16, 0x23, 0x36, 0x0E, 0x23, 0xEB, 0x2A,
998 0x65, 0x5C, 0x0E, 0x05, 0xA7, 0xED, 0x42, 0x22, 0x65, 0x5C,
999 0xED, 0xB0, 0xEB, 0x2B, 0xCD, 0x77, 0x00, 0x18, 0x0E, 0xDF,
1000 0x23, 0x7E, 0xFE, 0x0E, 0x20, 0xFA, 0x23, 0xCD, 0xB4, 0x33,
1001 0x22, 0x5D, 0x5C, 0xFD, 0xCB, 0x01, 0xF6, 0x18, 0x14, 0xCD,
1002 0xB2, 0x28, 0xDA, 0x2E, 0x1C, 0xCC, 0x96, 0x29, 0x3A, 0x3B,
1003 0x5C, 0xFE, 0xC0, 0x38, 0x04, 0x23, 0xCD, 0xB4, 0x33, 0x18,
1004 0x33, 0x01, 0xDB, 0x09, 0xFE, 0x2D, 0x28, 0x27, 0x01, 0x18,
1005 0x10, 0xFE, 0xAE, 0x28, 0x20, 0xD6, 0xAF, 0xDA, 0x8A, 0x1C,
1006 0x01, 0xF0, 0x04, 0xFE, 0x14, 0x28, 0x14, 0xD2, 0x8A, 0x1C,
1007 0x06, 0x10, 0xC6, 0xDC, 0x4F, 0xFE, 0xDF, 0x30, 0x02, 0xCB,
1008 0xB1, 0xFE, 0xEE, 0x38, 0x02, 0xCB, 0xB9, 0xC5, 0xE7, 0xC3,
1009 0xFF, 0x24, 0xDF, 0xFE, 0x28, 0x20, 0x0C, 0xFD, 0xCB, 0x01,
1010 0x76, 0x20, 0x17, 0xCD, 0x52, 0x2A, 0xE7, 0x18, 0xF0, 0x06,
1011 0x00, 0x4F, 0x21, 0x95, 0x27, 0xCD, 0xDC, 0x16, 0x30, 0x06,
1012 0x4E, 0x21, 0xED, 0x26, 0x09, 0x46, 0xD1, 0x7A, 0xB8, 0x38,
1013 0x3A, 0xA7, 0xCA, 0x18, 0x00, 0xC5, 0x21, 0x3B, 0x5C, 0x7B,
1014 0xFE, 0xED, 0x20, 0x06, 0xCB, 0x76, 0x20, 0x02, 0x1E, 0x99,
1015 0xD5, 0xCD, 0x30, 0x25, 0x28, 0x09, 0x7B, 0xE6, 0x3F, 0x47,
1016 0xEF, 0x3B, 0x38, 0x18, 0x09, 0x7B, 0xFD, 0xAE, 0x01, 0xE6,
1017 0x40, 0xC2, 0x8A, 0x1C, 0xD1, 0x21, 0x3B, 0x5C, 0xCB, 0xF6,
1018 0xCB, 0x7B, 0x20, 0x02, 0xCB, 0xB6, 0xC1, 0x18, 0xC1, 0xD5,
1019 0x79, 0xFD, 0xCB, 0x01, 0x76, 0x20, 0x15, 0xE6, 0x3F, 0xC6,
1020 0x08, 0x4F, 0xFE, 0x10, 0x20, 0x04, 0xCB, 0xF1, 0x18, 0x08,
1021 0x38, 0xD7, 0xFE, 0x17, 0x28, 0x02, 0xCB, 0xF9, 0xC5, 0xE7,
1022 0xC3, 0xFF, 0x24, 0x2B, 0xCF, 0x2D, 0xC3, 0x2A, 0xC4, 0x2F,
1023 0xC5, 0x5E, 0xC6, 0x3D, 0xCE, 0x3E, 0xCC, 0x3C, 0xCD, 0xC7,
1024 0xC9, 0xC8, 0xCA, 0xC9, 0xCB, 0xC5, 0xC7, 0xC6, 0xC8, 0x00,
1025 0x06, 0x08, 0x08, 0x0A, 0x02, 0x03, 0x05, 0x05, 0x05, 0x05,
1026 0x05, 0x05, 0x06, 0xCD, 0x30, 0x25, 0x20, 0x35, 0xE7, 0xCD,
1027 0x8D, 0x2C, 0xD2, 0x8A, 0x1C, 0xE7, 0xFE, 0x24, 0xF5, 0x20,
1028 0x01, 0xE7, 0xFE, 0x28, 0x20, 0x12, 0xE7, 0xFE, 0x29, 0x28,
1029 0x10, 0xCD, 0xFB, 0x24, 0xDF, 0xFE, 0x2C, 0x20, 0x03, 0xE7,
1030 0x18, 0xF5, 0xFE, 0x29, 0xC2, 0x8A, 0x1C, 0xE7, 0x21, 0x3B,
1031 0x5C, 0xCB, 0xB6, 0xF1, 0x28, 0x02, 0xCB, 0xF6, 0xC3, 0x12,
1032 0x27, 0xE7, 0xE6, 0xDF, 0x47, 0xE7, 0xD6, 0x24, 0x4F, 0x20,
1033 0x01, 0xE7, 0xE7, 0xE5, 0x2A, 0x53, 0x5C, 0x2B, 0x11, 0xCE,
1034 0x00, 0xC5, 0xCD, 0x86, 0x1D, 0xC1, 0x30, 0x02, 0xCF, 0x18,
1035 0xE5, 0xCD, 0xAB, 0x28, 0xE6, 0xDF, 0xB8, 0x20, 0x08, 0xCD,
1036 0xAB, 0x28, 0xD6, 0x24, 0xB9, 0x28, 0x0C, 0xE1, 0x2B, 0x11,
1037 0x00, 0x02, 0xC5, 0xCD, 0x8B, 0x19, 0xC1, 0x18, 0xD7, 0xA7,
1038 0xCC, 0xAB, 0x28, 0xD1, 0xD1, 0xED, 0x53, 0x5D, 0x5C, 0xCD,
1039 0xAB, 0x28, 0xE5, 0xFE, 0x29, 0x28, 0x42, 0x23, 0x7E, 0xFE,
1040 0x0E, 0x16, 0x40, 0x28, 0x07, 0x2B, 0xCD, 0xAB, 0x28, 0x23,
1041 0x16, 0x00, 0x23, 0xE5, 0xD5, 0xCD, 0xFB, 0x24, 0xF1, 0xFD,
1042 0xAE, 0x01, 0xE6, 0x40, 0x20, 0x2B, 0xE1, 0xEB, 0x2A, 0x65,
1043 0x5C, 0x01, 0x05, 0x00, 0xED, 0x42, 0x22, 0x65, 0x5C, 0xED,
1044 0xB0, 0xEB, 0x2B, 0xCD, 0xAB, 0x28, 0xFE, 0x29, 0x28, 0x0D,
1045 0xE5, 0xDF, 0xFE, 0x2C, 0x20, 0x0D, 0xE7, 0xE1, 0xCD, 0xAB,
1046 0x28, 0x18, 0xBE, 0xE5, 0xDF, 0xFE, 0x29, 0x28, 0x02, 0xCF,
1047 0x19, 0xD1, 0xEB, 0x22, 0x5D, 0x5C, 0x2A, 0x0B, 0x5C, 0xE3,
1048 0x22, 0x0B, 0x5C, 0xD5, 0xE7, 0xE7, 0xCD, 0xFB, 0x24, 0xE1,
1049 0x22, 0x5D, 0x5C, 0xE1, 0x22, 0x0B, 0x5C, 0xE7, 0xC3, 0x12,
1050 0x27, 0x23, 0x7E, 0xFE, 0x21, 0x38, 0xFA, 0xC9, 0xFD, 0xCB,
1051 0x01, 0xF6, 0xDF, 0xCD, 0x8D, 0x2C, 0xD2, 0x8A, 0x1C, 0xE5,
1052 0xE6, 0x1F, 0x4F, 0xE7, 0xE5, 0xFE, 0x28, 0x28, 0x28, 0xCB,
1053 0xF1, 0xFE, 0x24, 0x28, 0x11, 0xCB, 0xE9, 0xCD, 0x88, 0x2C,
1054 0x30, 0x0F, 0xCD, 0x88, 0x2C, 0x30, 0x16, 0xCB, 0xB1, 0xE7,
1055 0x18, 0xF6, 0xE7, 0xFD, 0xCB, 0x01, 0xB6, 0x3A, 0x0C, 0x5C,
1056 0xA7, 0x28, 0x06, 0xCD, 0x30, 0x25, 0xC2, 0x51, 0x29, 0x41,
1057 0xCD, 0x30, 0x25, 0x20, 0x08, 0x79, 0xE6, 0xE0, 0xCB, 0xFF,
1058 0x4F, 0x18, 0x37, 0x2A, 0x4B, 0x5C, 0x7E, 0xE6, 0x7F, 0x28,
1059 0x2D, 0xB9, 0x20, 0x22, 0x17, 0x87, 0xF2, 0x3F, 0x29, 0x38,
1060 0x30, 0xD1, 0xD5, 0xE5, 0x23, 0x1A, 0x13, 0xFE, 0x20, 0x28,
1061 0xFA, 0xF6, 0x20, 0xBE, 0x28, 0xF4, 0xF6, 0x80, 0xBE, 0x20,
1062 0x06, 0x1A, 0xCD, 0x88, 0x2C, 0x30, 0x15, 0xE1, 0xC5, 0xCD,
1063 0xB8, 0x19, 0xEB, 0xC1, 0x18, 0xCE, 0xCB, 0xF8, 0xD1, 0xDF,
1064 0xFE, 0x28, 0x28, 0x09, 0xCB, 0xE8, 0x18, 0x0D, 0xD1, 0xD1,
1065 0xD1, 0xE5, 0xDF, 0xCD, 0x88, 0x2C, 0x30, 0x03, 0xE7, 0x18,
1066 0xF8, 0xE1, 0xCB, 0x10, 0xCB, 0x70, 0xC9, 0x2A, 0x0B, 0x5C,
1067 0x7E, 0xFE, 0x29, 0xCA, 0xEF, 0x28, 0x7E, 0xF6, 0x60, 0x47,
1068 0x23, 0x7E, 0xFE, 0x0E, 0x28, 0x07, 0x2B, 0xCD, 0xAB, 0x28,
1069 0x23, 0xCB, 0xA8, 0x78, 0xB9, 0x28, 0x12, 0x23, 0x23, 0x23,
1070 0x23, 0x23, 0xCD, 0xAB, 0x28, 0xFE, 0x29, 0xCA, 0xEF, 0x28,
1071 0xCD, 0xAB, 0x28, 0x18, 0xD9, 0xCB, 0x69, 0x20, 0x0C, 0x23,
1072 0xED, 0x5B, 0x65, 0x5C, 0xCD, 0xC0, 0x33, 0xEB, 0x22, 0x65,
1073 0x5C, 0xD1, 0xD1, 0xAF, 0x3C, 0xC9, 0xAF, 0x47, 0xCB, 0x79,
1074 0x20, 0x4B, 0xCB, 0x7E, 0x20, 0x0E, 0x3C, 0x23, 0x4E, 0x23,
1075 0x46, 0x23, 0xEB, 0xCD, 0xB2, 0x2A, 0xDF, 0xC3, 0x49, 0x2A,
1076 0x23, 0x23, 0x23, 0x46, 0xCB, 0x71, 0x28, 0x0A, 0x05, 0x28,
1077 0xE8, 0xEB, 0xDF, 0xFE, 0x28, 0x20, 0x61, 0xEB, 0xEB, 0x18,
1078 0x24, 0xE5, 0xDF, 0xE1, 0xFE, 0x2C, 0x28, 0x20, 0xCB, 0x79,
1079 0x28, 0x52, 0xCB, 0x71, 0x20, 0x06, 0xFE, 0x29, 0x20, 0x3C,
1080 0xE7, 0xC9, 0xFE, 0x29, 0x28, 0x6C, 0xFE, 0xCC, 0x20, 0x32,
1081 0xDF, 0x2B, 0x22, 0x5D, 0x5C, 0x18, 0x5E, 0x21, 0x00, 0x00,
1082 0xE5, 0xE7, 0xE1, 0x79, 0xFE, 0xC0, 0x20, 0x09, 0xDF, 0xFE,
1083 0x29, 0x28, 0x51, 0xFE, 0xCC, 0x28, 0xE5, 0xC5, 0xE5, 0xCD,
1084 0xEE, 0x2A, 0xE3, 0xEB, 0xCD, 0xCC, 0x2A, 0x38, 0x19, 0x0B,
1085 0xCD, 0xF4, 0x2A, 0x09, 0xD1, 0xC1, 0x10, 0xB3, 0xCB, 0x79,
1086 0x20, 0x66, 0xE5, 0xCB, 0x71, 0x20, 0x13, 0x42, 0x4B, 0xDF,
1087 0xFE, 0x29, 0x28, 0x02, 0xCF, 0x02, 0xE7, 0xE1, 0x11, 0x05,
1088 0x00, 0xCD, 0xF4, 0x2A, 0x09, 0xC9, 0xCD, 0xEE, 0x2A, 0xE3,
1089 0xCD, 0xF4, 0x2A, 0xC1, 0x09, 0x23, 0x42, 0x4B, 0xEB, 0xCD,
1090 0xB1, 0x2A, 0xDF, 0xFE, 0x29, 0x28, 0x07, 0xFE, 0x2C, 0x20,
1091 0xDB, 0xCD, 0x52, 0x2A, 0xE7, 0xFE, 0x28, 0x28, 0xF8, 0xFD,
1092 0xCB, 0x01, 0xB6, 0xC9, 0xCD, 0x30, 0x25, 0xC4, 0xF1, 0x2B,
1093 0xE7, 0xFE, 0x29, 0x28, 0x50, 0xD5, 0xAF, 0xF5, 0xC5, 0x11,
1094 0x01, 0x00, 0xDF, 0xE1, 0xFE, 0xCC, 0x28, 0x17, 0xF1, 0xCD,
1095 0xCD, 0x2A, 0xF5, 0x50, 0x59, 0xE5, 0xDF, 0xE1, 0xFE, 0xCC,
1096 0x28, 0x09, 0xFE, 0x29, 0xC2, 0x8A, 0x1C, 0x62, 0x6B, 0x18,
1097 0x13, 0xE5, 0xE7, 0xE1, 0xFE, 0x29, 0x28, 0x0C, 0xF1, 0xCD,
1098 0xCD, 0x2A, 0xF5, 0xDF, 0x60, 0x69, 0xFE, 0x29, 0x20, 0xE6,
1099 0xF1, 0xE3, 0x19, 0x2B, 0xE3, 0xA7, 0xED, 0x52, 0x01, 0x00,
1100 0x00, 0x38, 0x07, 0x23, 0xA7, 0xFA, 0x20, 0x2A, 0x44, 0x4D,
1101 0xD1, 0xFD, 0xCB, 0x01, 0xB6, 0xCD, 0x30, 0x25, 0xC8, 0xAF,
1102 0xFD, 0xCB, 0x01, 0xB6, 0xC5, 0xCD, 0xA9, 0x33, 0xC1, 0x2A,
1103 0x65, 0x5C, 0x77, 0x23, 0x73, 0x23, 0x72, 0x23, 0x71, 0x23,
1104 0x70, 0x23, 0x22, 0x65, 0x5C, 0xC9, 0xAF, 0xD5, 0xE5, 0xF5,
1105 0xCD, 0x82, 0x1C, 0xF1, 0xCD, 0x30, 0x25, 0x28, 0x12, 0xF5,
1106 0xCD, 0x99, 0x1E, 0xD1, 0x78, 0xB1, 0x37, 0x28, 0x05, 0xE1,
1107 0xE5, 0xA7, 0xED, 0x42, 0x7A, 0xDE, 0x00, 0xE1, 0xD1, 0xC9,
1108 0xEB, 0x23, 0x5E, 0x23, 0x56, 0xC9, 0xCD, 0x30, 0x25, 0xC8,
1109 0xCD, 0xA9, 0x30, 0xDA, 0x15, 0x1F, 0xC9, 0x2A, 0x4D, 0x5C,
1110 0xFD, 0xCB, 0x37, 0x4E, 0x28, 0x5E, 0x01, 0x05, 0x00, 0x03,
1111 0x23, 0x7E, 0xFE, 0x20, 0x28, 0xFA, 0x30, 0x0B, 0xFE, 0x10,
1112 0x38, 0x11, 0xFE, 0x16, 0x30, 0x0D, 0x23, 0x18, 0xED, 0xCD,
1113 0x88, 0x2C, 0x38, 0xE7, 0xFE, 0x24, 0xCA, 0xC0, 0x2B, 0x79,
1114 0x2A, 0x59, 0x5C, 0x2B, 0xCD, 0x55, 0x16, 0x23, 0x23, 0xEB,
1115 0xD5, 0x2A, 0x4D, 0x5C, 0x1B, 0xD6, 0x06, 0x47, 0x28, 0x11,
1116 0x23, 0x7E, 0xFE, 0x21, 0x38, 0xFA, 0xF6, 0x20, 0x13, 0x12,
1117 0x10, 0xF4, 0xF6, 0x80, 0x12, 0x3E, 0xC0, 0x2A, 0x4D, 0x5C,
1118 0xAE, 0xF6, 0x20, 0xE1, 0xCD, 0xEA, 0x2B, 0xE5, 0xEF, 0x02,
1119 0x38, 0xE1, 0x01, 0x05, 0x00, 0xA7, 0xED, 0x42, 0x18, 0x40,
1120 0xFD, 0xCB, 0x01, 0x76, 0x28, 0x06, 0x11, 0x06, 0x00, 0x19,
1121 0x18, 0xE7, 0x2A, 0x4D, 0x5C, 0xED, 0x4B, 0x72, 0x5C, 0xFD,
1122 0xCB, 0x37, 0x46, 0x20, 0x30, 0x78, 0xB1, 0xC8, 0xE5, 0xF7,
1123 0xD5, 0xC5, 0x54, 0x5D, 0x23, 0x36, 0x20, 0xED, 0xB8, 0xE5,
1124 0xCD, 0xF1, 0x2B, 0xE1, 0xE3, 0xA7, 0xED, 0x42, 0x09, 0x30,
1125 0x02, 0x44, 0x4D, 0xE3, 0xEB, 0x78, 0xB1, 0x28, 0x02, 0xED,
1126 0xB0, 0xC1, 0xD1, 0xE1, 0xEB, 0x78, 0xB1, 0xC8, 0xD5, 0xED,
1127 0xB0, 0xE1, 0xC9, 0x2B, 0x2B, 0x2B, 0x7E, 0xE5, 0xC5, 0xCD,
1128 0xC6, 0x2B, 0xC1, 0xE1, 0x03, 0x03, 0x03, 0xC3, 0xE8, 0x19,
1129 0x3E, 0xDF, 0x2A, 0x4D, 0x5C, 0xA6, 0xF5, 0xCD, 0xF1, 0x2B,
1130 0xEB, 0x09, 0xC5, 0x2B, 0x22, 0x4D, 0x5C, 0x03, 0x03, 0x03,
1131 0x2A, 0x59, 0x5C, 0x2B, 0xCD, 0x55, 0x16, 0x2A, 0x4D, 0x5C,
1132 0xC1, 0xC5, 0x03, 0xED, 0xB8, 0xEB, 0x23, 0xC1, 0x70, 0x2B,
1133 0x71, 0xF1, 0x2B, 0x77, 0x2A, 0x59, 0x5C, 0x2B, 0xC9, 0x2A,
1134 0x65, 0x5C, 0x2B, 0x46, 0x2B, 0x4E, 0x2B, 0x56, 0x2B, 0x5E,
1135 0x2B, 0x7E, 0x22, 0x65, 0x5C, 0xC9, 0xCD, 0xB2, 0x28, 0xC2,
1136 0x8A, 0x1C, 0xCD, 0x30, 0x25, 0x20, 0x08, 0xCB, 0xB1, 0xCD,
1137 0x96, 0x29, 0xCD, 0xEE, 0x1B, 0x38, 0x08, 0xC5, 0xCD, 0xB8,
1138 0x19, 0xCD, 0xE8, 0x19, 0xC1, 0xCB, 0xF9, 0x06, 0x00, 0xC5,
1139 0x21, 0x01, 0x00, 0xCB, 0x71, 0x20, 0x02, 0x2E, 0x05, 0xEB,
1140 0xE7, 0x26, 0xFF, 0xCD, 0xCC, 0x2A, 0xDA, 0x20, 0x2A, 0xE1,
1141 0xC5, 0x24, 0xE5, 0x60, 0x69, 0xCD, 0xF4, 0x2A, 0xEB, 0xDF,
1142 0xFE, 0x2C, 0x28, 0xE8, 0xFE, 0x29, 0x20, 0xBB, 0xE7, 0xC1,
1143 0x79, 0x68, 0x26, 0x00, 0x23, 0x23, 0x29, 0x19, 0xDA, 0x15,
1144 0x1F, 0xD5, 0xC5, 0xE5, 0x44, 0x4D, 0x2A, 0x59, 0x5C, 0x2B,
1145 0xCD, 0x55, 0x16, 0x23, 0x77, 0xC1, 0x0B, 0x0B, 0x0B, 0x23,
1146 0x71, 0x23, 0x70, 0xC1, 0x78, 0x23, 0x77, 0x62, 0x6B, 0x1B,
1147 0x36, 0x00, 0xCB, 0x71, 0x28, 0x02, 0x36, 0x20, 0xC1, 0xED,
1148 0xB8, 0xC1, 0x70, 0x2B, 0x71, 0x2B, 0x3D, 0x20, 0xF8, 0xC9,
1149 0xCD, 0x1B, 0x2D, 0x3F, 0xD8, 0xFE, 0x41, 0x3F, 0xD0, 0xFE,
1150 0x5B, 0xD8, 0xFE, 0x61, 0x3F, 0xD0, 0xFE, 0x7B, 0xC9, 0xFE,
1151 0xC4, 0x20, 0x19, 0x11, 0x00, 0x00, 0xE7, 0xD6, 0x31, 0xCE,
1152 0x00, 0x20, 0x0A, 0xEB, 0x3F, 0xED, 0x6A, 0xDA, 0xAD, 0x31,
1153 0xEB, 0x18, 0xEF, 0x42, 0x4B, 0xC3, 0x2B, 0x2D, 0xFE, 0x2E,
1154 0x28, 0x0F, 0xCD, 0x3B, 0x2D, 0xFE, 0x2E, 0x20, 0x28, 0xE7,
1155 0xCD, 0x1B, 0x2D, 0x38, 0x22, 0x18, 0x0A, 0xE7, 0xCD, 0x1B,
1156 0x2D, 0xDA, 0x8A, 0x1C, 0xEF, 0xA0, 0x38, 0xEF, 0xA1, 0xC0,
1157 0x02, 0x38, 0xDF, 0xCD, 0x22, 0x2D, 0x38, 0x0B, 0xEF, 0xE0,
1158 0xA4, 0x05, 0xC0, 0x04, 0x0F, 0x38, 0xE7, 0x18, 0xEF, 0xFE,
1159 0x45, 0x28, 0x03, 0xFE, 0x65, 0xC0, 0x06, 0xFF, 0xE7, 0xFE,
1160 0x2B, 0x28, 0x05, 0xFE, 0x2D, 0x20, 0x02, 0x04, 0xE7, 0xCD,
1161 0x1B, 0x2D, 0x38, 0xCB, 0xC5, 0xCD, 0x3B, 0x2D, 0xCD, 0xD5,
1162 0x2D, 0xC1, 0xDA, 0xAD, 0x31, 0xA7, 0xFA, 0xAD, 0x31, 0x04,
1163 0x28, 0x02, 0xED, 0x44, 0xC3, 0x4F, 0x2D, 0xFE, 0x30, 0xD8,
1164 0xFE, 0x3A, 0x3F, 0xC9, 0xCD, 0x1B, 0x2D, 0xD8, 0xD6, 0x30,
1165 0x4F, 0x06, 0x00, 0xFD, 0x21, 0x3A, 0x5C, 0xAF, 0x5F, 0x51,
1166 0x48, 0x47, 0xCD, 0xB6, 0x2A, 0xEF, 0x38, 0xA7, 0xC9, 0xF5,
1167 0xEF, 0xA0, 0x38, 0xF1, 0xCD, 0x22, 0x2D, 0xD8, 0xEF, 0x01,
1168 0xA4, 0x04, 0x0F, 0x38, 0xCD, 0x74, 0x00, 0x18, 0xF1, 0x07,
1169 0x0F, 0x30, 0x02, 0x2F, 0x3C, 0xF5, 0x21, 0x92, 0x5C, 0xCD,
1170 0x0B, 0x35, 0xEF, 0xA4, 0x38, 0xF1, 0xCB, 0x3F, 0x30, 0x0D,
1171 0xF5, 0xEF, 0xC1, 0xE0, 0x00, 0x04, 0x04, 0x33, 0x02, 0x05,
1172 0xE1, 0x38, 0xF1, 0x28, 0x08, 0xF5, 0xEF, 0x31, 0x04, 0x38,
1173 0xF1, 0x18, 0xE5, 0xEF, 0x02, 0x38, 0xC9, 0x23, 0x4E, 0x23,
1174 0x7E, 0xA9, 0x91, 0x5F, 0x23, 0x7E, 0x89, 0xA9, 0x57, 0xC9,
1175 0x0E, 0x00, 0xE5, 0x36, 0x00, 0x23, 0x71, 0x23, 0x7B, 0xA9,
1176 0x91, 0x77, 0x23, 0x7A, 0x89, 0xA9, 0x77, 0x23, 0x36, 0x00,
1177 0xE1, 0xC9, 0xEF, 0x38, 0x7E, 0xA7, 0x28, 0x05, 0xEF, 0xA2,
1178 0x0F, 0x27, 0x38, 0xEF, 0x02, 0x38, 0xE5, 0xD5, 0xEB, 0x46,
1179 0xCD, 0x7F, 0x2D, 0xAF, 0x90, 0xCB, 0x79, 0x42, 0x4B, 0x7B,
1180 0xD1, 0xE1, 0xC9, 0x57, 0x17, 0x9F, 0x5F, 0x4F, 0xAF, 0x47,
1181 0xCD, 0xB6, 0x2A, 0xEF, 0x34, 0xEF, 0x1A, 0x20, 0x9A, 0x85,
1182 0x04, 0x27, 0x38, 0xCD, 0xA2, 0x2D, 0xD8, 0xF5, 0x05, 0x04,
1183 0x28, 0x03, 0xF1, 0x37, 0xC9, 0xF1, 0xC9, 0xEF, 0x31, 0x36,
1184 0x00, 0x0B, 0x31, 0x37, 0x00, 0x0D, 0x02, 0x38, 0x3E, 0x30,
1185 0xD7, 0xC9, 0x2A, 0x38, 0x3E, 0x2D, 0xD7, 0xEF, 0xA0, 0xC3,
1186 0xC4, 0xC5, 0x02, 0x38, 0xD9, 0xE5, 0xD9, 0xEF, 0x31, 0x27,
1187 0xC2, 0x03, 0xE2, 0x01, 0xC2, 0x02, 0x38, 0x7E, 0xA7, 0x20,
1188 0x47, 0xCD, 0x7F, 0x2D, 0x06, 0x10, 0x7A, 0xA7, 0x20, 0x06,
1189 0xB3, 0x28, 0x09, 0x53, 0x06, 0x08, 0xD5, 0xD9, 0xD1, 0xD9,
1190 0x18, 0x57, 0xEF, 0xE2, 0x38, 0x7E, 0xD6, 0x7E, 0xCD, 0xC1,
1191 0x2D, 0x57, 0x3A, 0xAC, 0x5C, 0x92, 0x32, 0xAC, 0x5C, 0x7A,
1192 0xCD, 0x4F, 0x2D, 0xEF, 0x31, 0x27, 0xC1, 0x03, 0xE1, 0x38,
1193 0xCD, 0xD5, 0x2D, 0xE5, 0x32, 0xA1, 0x5C, 0x3D, 0x17, 0x9F,
1194 0x3C, 0x21, 0xAB, 0x5C, 0x77, 0x23, 0x86, 0x77, 0xE1, 0xC3,
1195 0xCF, 0x2E, 0xD6, 0x80, 0xFE, 0x1C, 0x38, 0x13, 0xCD, 0xC1,
1196 0x2D, 0xD6, 0x07, 0x47, 0x21, 0xAC, 0x5C, 0x86, 0x77, 0x78,
1197 0xED, 0x44, 0xCD, 0x4F, 0x2D, 0x18, 0x92, 0xEB, 0xCD, 0xBA,
1198 0x2F, 0xD9, 0xCB, 0xFA, 0x7D, 0xD9, 0xD6, 0x80, 0x47, 0xCB,
1199 0x23, 0xCB, 0x12, 0xD9, 0xCB, 0x13, 0xCB, 0x12, 0xD9, 0x21,
1200 0xAA, 0x5C, 0x0E, 0x05, 0x7E, 0x8F, 0x27, 0x77, 0x2B, 0x0D,
1201 0x20, 0xF8, 0x10, 0xE7, 0xAF, 0x21, 0xA6, 0x5C, 0x11, 0xA1,
1202 0x5C, 0x06, 0x09, 0xED, 0x6F, 0x0E, 0xFF, 0xED, 0x6F, 0x20,
1203 0x04, 0x0D, 0x0C, 0x20, 0x0A, 0x12, 0x13, 0xFD, 0x34, 0x71,
1204 0xFD, 0x34, 0x72, 0x0E, 0x00, 0xCB, 0x40, 0x28, 0x01, 0x23,
1205 0x10, 0xE7, 0x3A, 0xAB, 0x5C, 0xD6, 0x09, 0x38, 0x0A, 0xFD,
1206 0x35, 0x71, 0x3E, 0x04, 0xFD, 0xBE, 0x6F, 0x18, 0x41, 0xEF,
1207 0x02, 0xE2, 0x38, 0xEB, 0xCD, 0xBA, 0x2F, 0xD9, 0x3E, 0x80,
1208 0x95, 0x2E, 0x00, 0xCB, 0xFA, 0xD9, 0xCD, 0xDD, 0x2F, 0xFD,
1209 0x7E, 0x71, 0xFE, 0x08, 0x38, 0x06, 0xD9, 0xCB, 0x12, 0xD9,
1210 0x18, 0x20, 0x01, 0x00, 0x02, 0x7B, 0xCD, 0x8B, 0x2F, 0x5F,
1211 0x7A, 0xCD, 0x8B, 0x2F, 0x57, 0xC5, 0xD9, 0xC1, 0x10, 0xF1,
1212 0x21, 0xA1, 0x5C, 0x79, 0xFD, 0x4E, 0x71, 0x09, 0x77, 0xFD,
1213 0x34, 0x71, 0x18, 0xD3, 0xF5, 0x21, 0xA1, 0x5C, 0xFD, 0x4E,
1214 0x71, 0x06, 0x00, 0x09, 0x41, 0xF1, 0x2B, 0x7E, 0xCE, 0x00,
1215 0x77, 0xA7, 0x28, 0x05, 0xFE, 0x0A, 0x3F, 0x30, 0x08, 0x10,
1216 0xF1, 0x36, 0x01, 0x04, 0xFD, 0x34, 0x72, 0xFD, 0x70, 0x71,
1217 0xEF, 0x02, 0x38, 0xD9, 0xE1, 0xD9, 0xED, 0x4B, 0xAB, 0x5C,
1218 0x21, 0xA1, 0x5C, 0x78, 0xFE, 0x09, 0x38, 0x04, 0xFE, 0xFC,
1219 0x38, 0x26, 0xA7, 0xCC, 0xEF, 0x15, 0xAF, 0x90, 0xFA, 0x52,
1220 0x2F, 0x47, 0x18, 0x0C, 0x79, 0xA7, 0x28, 0x03, 0x7E, 0x23,
1221 0x0D, 0xCD, 0xEF, 0x15, 0x10, 0xF4, 0x79, 0xA7, 0xC8, 0x04,
1222 0x3E, 0x2E, 0xD7, 0x3E, 0x30, 0x10, 0xFB, 0x41, 0x18, 0xE6,
1223 0x50, 0x15, 0x06, 0x01, 0xCD, 0x4A, 0x2F, 0x3E, 0x45, 0xD7,
1224 0x4A, 0x79, 0xA7, 0xF2, 0x83, 0x2F, 0xED, 0x44, 0x4F, 0x3E,
1225 0x2D, 0x18, 0x02, 0x3E, 0x2B, 0xD7, 0x06, 0x00, 0xC3, 0x1B,
1226 0x1A, 0xD5, 0x6F, 0x26, 0x00, 0x5D, 0x54, 0x29, 0x29, 0x19,
1227 0x29, 0x59, 0x19, 0x4C, 0x7D, 0xD1, 0xC9, 0x7E, 0x36, 0x00,
1228 0xA7, 0xC8, 0x23, 0xCB, 0x7E, 0xCB, 0xFE, 0x2B, 0xC8, 0xC5,
1229 0x01, 0x05, 0x00, 0x09, 0x41, 0x4F, 0x37, 0x2B, 0x7E, 0x2F,
1230 0xCE, 0x00, 0x77, 0x10, 0xF8, 0x79, 0xC1, 0xC9, 0xE5, 0xF5,
1231 0x4E, 0x23, 0x46, 0x77, 0x23, 0x79, 0x4E, 0xC5, 0x23, 0x4E,
1232 0x23, 0x46, 0xEB, 0x57, 0x5E, 0xD5, 0x23, 0x56, 0x23, 0x5E,
1233 0xD5, 0xD9, 0xD1, 0xE1, 0xC1, 0xD9, 0x23, 0x56, 0x23, 0x5E,
1234 0xF1, 0xE1, 0xC9, 0xA7, 0xC8, 0xFE, 0x21, 0x30, 0x16, 0xC5,
1235 0x47, 0xD9, 0xCB, 0x2D, 0xCB, 0x1A, 0xCB, 0x1B, 0xD9, 0xCB,
1236 0x1A, 0xCB, 0x1B, 0x10, 0xF2, 0xC1, 0xD0, 0xCD, 0x04, 0x30,
1237 0xC0, 0xD9, 0xAF, 0x2E, 0x00, 0x57, 0x5D, 0xD9, 0x11, 0x00,
1238 0x00, 0xC9, 0x1C, 0xC0, 0x14, 0xC0, 0xD9, 0x1C, 0x20, 0x01,
1239 0x14, 0xD9, 0xC9, 0xEB, 0xCD, 0x6E, 0x34, 0xEB, 0x1A, 0xB6,
1240 0x20, 0x26, 0xD5, 0x23, 0xE5, 0x23, 0x5E, 0x23, 0x56, 0x23,
1241 0x23, 0x23, 0x7E, 0x23, 0x4E, 0x23, 0x46, 0xE1, 0xEB, 0x09,
1242 0xEB, 0x8E, 0x0F, 0xCE, 0x00, 0x20, 0x0B, 0x9F, 0x77, 0x23,
1243 0x73, 0x23, 0x72, 0x2B, 0x2B, 0x2B, 0xD1, 0xC9, 0x2B, 0xD1,
1244 0xCD, 0x93, 0x32, 0xD9, 0xE5, 0xD9, 0xD5, 0xE5, 0xCD, 0x9B,
1245 0x2F, 0x47, 0xEB, 0xCD, 0x9B, 0x2F, 0x4F, 0xB8, 0x30, 0x03,
1246 0x78, 0x41, 0xEB, 0xF5, 0x90, 0xCD, 0xBA, 0x2F, 0xCD, 0xDD,
1247 0x2F, 0xF1, 0xE1, 0x77, 0xE5, 0x68, 0x61, 0x19, 0xD9, 0xEB,
1248 0xED, 0x4A, 0xEB, 0x7C, 0x8D, 0x6F, 0x1F, 0xAD, 0xD9, 0xEB,
1249 0xE1, 0x1F, 0x30, 0x08, 0x3E, 0x01, 0xCD, 0xDD, 0x2F, 0x34,
1250 0x28, 0x23, 0xD9, 0x7D, 0xE6, 0x80, 0xD9, 0x23, 0x77, 0x2B,
1251 0x28, 0x1F, 0x7B, 0xED, 0x44, 0x3F, 0x5F, 0x7A, 0x2F, 0xCE,
1252 0x00, 0x57, 0xD9, 0x7B, 0x2F, 0xCE, 0x00, 0x5F, 0x7A, 0x2F,
1253 0xCE, 0x00, 0x30, 0x07, 0x1F, 0xD9, 0x34, 0xCA, 0xAD, 0x31,
1254 0xD9, 0x57, 0xD9, 0xAF, 0xC3, 0x55, 0x31, 0xC5, 0x06, 0x10,
1255 0x7C, 0x4D, 0x21, 0x00, 0x00, 0x29, 0x38, 0x0A, 0xCB, 0x11,
1256 0x17, 0x30, 0x03, 0x19, 0x38, 0x02, 0x10, 0xF3, 0xC1, 0xC9,
1257 0xCD, 0xE9, 0x34, 0xD8, 0x23, 0xAE, 0xCB, 0xFE, 0x2B, 0xC9,
1258 0x1A, 0xB6, 0x20, 0x22, 0xD5, 0xE5, 0xD5, 0xCD, 0x7F, 0x2D,
1259 0xEB, 0xE3, 0x41, 0xCD, 0x7F, 0x2D, 0x78, 0xA9, 0x4F, 0xE1,
1260 0xCD, 0xA9, 0x30, 0xEB, 0xE1, 0x38, 0x0A, 0x7A, 0xB3, 0x20,
1261 0x01, 0x4F, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0xD1, 0xCD, 0x93,
1262 0x32, 0xAF, 0xCD, 0xC0, 0x30, 0xD8, 0xD9, 0xE5, 0xD9, 0xD5,
1263 0xEB, 0xCD, 0xC0, 0x30, 0xEB, 0x38, 0x5A, 0xE5, 0xCD, 0xBA,
1264 0x2F, 0x78, 0xA7, 0xED, 0x62, 0xD9, 0xE5, 0xED, 0x62, 0xD9,
1265 0x06, 0x21, 0x18, 0x11, 0x30, 0x05, 0x19, 0xD9, 0xED, 0x5A,
1266 0xD9, 0xD9, 0xCB, 0x1C, 0xCB, 0x1D, 0xD9, 0xCB, 0x1C, 0xCB,
1267 0x1D, 0xD9, 0xCB, 0x18, 0xCB, 0x19, 0xD9, 0xCB, 0x19, 0x1F,
1268 0x10, 0xE4, 0xEB, 0xD9, 0xEB, 0xD9, 0xC1, 0xE1, 0x78, 0x81,
1269 0x20, 0x01, 0xA7, 0x3D, 0x3F, 0x17, 0x3F, 0x1F, 0xF2, 0x46,
1270 0x31, 0x30, 0x68, 0xA7, 0x3C, 0x20, 0x08, 0x38, 0x06, 0xD9,
1271 0xCB, 0x7A, 0xD9, 0x20, 0x5C, 0x77, 0xD9, 0x78, 0xD9, 0x30,
1272 0x15, 0x7E, 0xA7, 0x3E, 0x80, 0x28, 0x01, 0xAF, 0xD9, 0xA2,
1273 0xCD, 0xFB, 0x2F, 0x07, 0x77, 0x38, 0x2E, 0x23, 0x77, 0x2B,
1274 0x18, 0x29, 0x06, 0x20, 0xD9, 0xCB, 0x7A, 0xD9, 0x20, 0x12,
1275 0x07, 0xCB, 0x13, 0xCB, 0x12, 0xD9, 0xCB, 0x13, 0xCB, 0x12,
1276 0xD9, 0x35, 0x28, 0xD7, 0x10, 0xEA, 0x18, 0xD7, 0x17, 0x30,
1277 0x0C, 0xCD, 0x04, 0x30, 0x20, 0x07, 0xD9, 0x16, 0x80, 0xD9,
1278 0x34, 0x28, 0x18, 0xE5, 0x23, 0xD9, 0xD5, 0xD9, 0xC1, 0x78,
1279 0x17, 0xCB, 0x16, 0x1F, 0x77, 0x23, 0x71, 0x23, 0x72, 0x23,
1280 0x73, 0xE1, 0xD1, 0xD9, 0xE1, 0xD9, 0xC9, 0xCF, 0x05, 0xCD,
1281 0x93, 0x32, 0xEB, 0xAF, 0xCD, 0xC0, 0x30, 0x38, 0xF4, 0xEB,
1282 0xCD, 0xC0, 0x30, 0xD8, 0xD9, 0xE5, 0xD9, 0xD5, 0xE5, 0xCD,
1283 0xBA, 0x2F, 0xD9, 0xE5, 0x60, 0x69, 0xD9, 0x61, 0x68, 0xAF,
1284 0x06, 0xDF, 0x18, 0x10, 0x17, 0xCB, 0x11, 0xD9, 0xCB, 0x11,
1285 0xCB, 0x10, 0xD9, 0x29, 0xD9, 0xED, 0x6A, 0xD9, 0x38, 0x10,
1286 0xED, 0x52, 0xD9, 0xED, 0x52, 0xD9, 0x30, 0x0F, 0x19, 0xD9,
1287 0xED, 0x5A, 0xD9, 0xA7, 0x18, 0x08, 0xA7, 0xED, 0x52, 0xD9,
1288 0xED, 0x52, 0xD9, 0x37, 0x04, 0xFA, 0xD2, 0x31, 0xF5, 0x28,
1289 0xE1, 0x5F, 0x51, 0xD9, 0x59, 0x50, 0xF1, 0xCB, 0x18, 0xF1,
1290 0xCB, 0x18, 0xD9, 0xC1, 0xE1, 0x78, 0x91, 0xC3, 0x3D, 0x31,
1291 0x7E, 0xA7, 0xC8, 0xFE, 0x81, 0x30, 0x06, 0x36, 0x00, 0x3E,
1292 0x20, 0x18, 0x51, 0xFE, 0x91, 0x20, 0x1A, 0x23, 0x23, 0x23,
1293 0x3E, 0x80, 0xA6, 0x2B, 0xB6, 0x2B, 0x20, 0x03, 0x3E, 0x80,
1294 0xAE, 0x2B, 0x20, 0x36, 0x77, 0x23, 0x36, 0xFF, 0x2B, 0x3E,
1295 0x18, 0x18, 0x33, 0x30, 0x2C, 0xD5, 0x2F, 0xC6, 0x91, 0x23,
1296 0x56, 0x23, 0x5E, 0x2B, 0x2B, 0x0E, 0x00, 0xCB, 0x7A, 0x28,
1297 0x01, 0x0D, 0xCB, 0xFA, 0x06, 0x08, 0x90, 0x80, 0x38, 0x04,
1298 0x5A, 0x16, 0x00, 0x90, 0x28, 0x07, 0x47, 0xCB, 0x3A, 0xCB,
1299 0x1B, 0x10, 0xFA, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0x7E, 0xD6,
1300 0xA0, 0xF0, 0xED, 0x44, 0xD5, 0xEB, 0x2B, 0x47, 0xCB, 0x38,
1301 0xCB, 0x38, 0xCB, 0x38, 0x28, 0x05, 0x36, 0x00, 0x2B, 0x10,
1302 0xFB, 0xE6, 0x07, 0x28, 0x09, 0x47, 0x3E, 0xFF, 0xCB, 0x27,
1303 0x10, 0xFC, 0xA6, 0x77, 0xEB, 0xD1, 0xC9, 0xCD, 0x96, 0x32,
1304 0xEB, 0x7E, 0xA7, 0xC0, 0xD5, 0xCD, 0x7F, 0x2D, 0xAF, 0x23,
1305 0x77, 0x2B, 0x77, 0x06, 0x91, 0x7A, 0xA7, 0x20, 0x08, 0xB3,
1306 0x42, 0x28, 0x10, 0x53, 0x58, 0x06, 0x89, 0xEB, 0x05, 0x29,
1307 0x30, 0xFC, 0xCB, 0x09, 0xCB, 0x1C, 0xCB, 0x1D, 0xEB, 0x2B,
1308 0x73, 0x2B, 0x72, 0x2B, 0x70, 0xD1, 0xC9, 0x00, 0xB0, 0x00,
1309 0x40, 0xB0, 0x00, 0x01, 0x30, 0x00, 0xF1, 0x49, 0x0F, 0xDA,
1310 0xA2, 0x40, 0xB0, 0x00, 0x0A, 0x8F, 0x36, 0x3C, 0x34, 0xA1,
1311 0x33, 0x0F, 0x30, 0xCA, 0x30, 0xAF, 0x31, 0x51, 0x38, 0x1B,
1312 0x35, 0x24, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B,
1313 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x14, 0x30, 0x2D, 0x35, 0x3B,
1314 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B,
1315 0x35, 0x9C, 0x35, 0xDE, 0x35, 0xBC, 0x34, 0x45, 0x36, 0x6E,
1316 0x34, 0x69, 0x36, 0xDE, 0x35, 0x74, 0x36, 0xB5, 0x37, 0xAA,
1317 0x37, 0xDA, 0x37, 0x33, 0x38, 0x43, 0x38, 0xE2, 0x37, 0x13,
1318 0x37, 0xC4, 0x36, 0xAF, 0x36, 0x4A, 0x38, 0x92, 0x34, 0x6A,
1319 0x34, 0xAC, 0x34, 0xA5, 0x34, 0xB3, 0x34, 0x1F, 0x36, 0xC9,
1320 0x35, 0x01, 0x35, 0xC0, 0x33, 0xA0, 0x36, 0x86, 0x36, 0xC6,
1321 0x33, 0x7A, 0x36, 0x06, 0x35, 0xF9, 0x34, 0x9B, 0x36, 0x83,
1322 0x37, 0x14, 0x32, 0xA2, 0x33, 0x4F, 0x2D, 0x97, 0x32, 0x49,
1323 0x34, 0x1B, 0x34, 0x2D, 0x34, 0x0F, 0x34, 0xCD, 0xBF, 0x35,
1324 0x78, 0x32, 0x67, 0x5C, 0xD9, 0xE3, 0xD9, 0xED, 0x53, 0x65,
1325 0x5C, 0xD9, 0x7E, 0x23, 0xE5, 0xA7, 0xF2, 0x80, 0x33, 0x57,
1326 0xE6, 0x60, 0x0F, 0x0F, 0x0F, 0x0F, 0xC6, 0x7C, 0x6F, 0x7A,
1327 0xE6, 0x1F, 0x18, 0x0E, 0xFE, 0x18, 0x30, 0x08, 0xD9, 0x01,
1328 0xFB, 0xFF, 0x54, 0x5D, 0x09, 0xD9, 0x07, 0x6F, 0x11, 0xD7,
1329 0x32, 0x26, 0x00, 0x19, 0x5E, 0x23, 0x56, 0x21, 0x65, 0x33,
1330 0xE3, 0xD5, 0xD9, 0xED, 0x4B, 0x66, 0x5C, 0xC9, 0xF1, 0x3A,
1331 0x67, 0x5C, 0xD9, 0x18, 0xC3, 0xD5, 0xE5, 0x01, 0x05, 0x00,
1332 0xCD, 0x05, 0x1F, 0xE1, 0xD1, 0xC9, 0xED, 0x5B, 0x65, 0x5C,
1333 0xCD, 0xC0, 0x33, 0xED, 0x53, 0x65, 0x5C, 0xC9, 0xCD, 0xA9,
1334 0x33, 0xED, 0xB0, 0xC9, 0x62, 0x6B, 0xCD, 0xA9, 0x33, 0xD9,
1335 0xE5, 0xD9, 0xE3, 0xC5, 0x7E, 0xE6, 0xC0, 0x07, 0x07, 0x4F,
1336 0x0C, 0x7E, 0xE6, 0x3F, 0x20, 0x02, 0x23, 0x7E, 0xC6, 0x50,
1337 0x12, 0x3E, 0x05, 0x91, 0x23, 0x13, 0x06, 0x00, 0xED, 0xB0,
1338 0xC1, 0xE3, 0xD9, 0xE1, 0xD9, 0x47, 0xAF, 0x05, 0xC8, 0x12,
1339 0x13, 0x18, 0xFA, 0xA7, 0xC8, 0xF5, 0xD5, 0x11, 0x00, 0x00,
1340 0xCD, 0xC8, 0x33, 0xD1, 0xF1, 0x3D, 0x18, 0xF2, 0x4F, 0x07,
1341 0x07, 0x81, 0x4F, 0x06, 0x00, 0x09, 0xC9, 0xD5, 0x2A, 0x68,
1342 0x5C, 0xCD, 0x06, 0x34, 0xCD, 0xC0, 0x33, 0xE1, 0xC9, 0x62,
1343 0x6B, 0xD9, 0xE5, 0x21, 0xC5, 0x32, 0xD9, 0xCD, 0xF7, 0x33,
1344 0xCD, 0xC8, 0x33, 0xD9, 0xE1, 0xD9, 0xC9, 0xE5, 0xEB, 0x2A,
1345 0x68, 0x5C, 0xCD, 0x06, 0x34, 0xEB, 0xCD, 0xC0, 0x33, 0xEB,
1346 0xE1, 0xC9, 0x06, 0x05, 0x1A, 0x4E, 0xEB, 0x12, 0x71, 0x23,
1347 0x13, 0x10, 0xF7, 0xEB, 0xC9, 0x47, 0xCD, 0x5E, 0x33, 0x31,
1348 0x0F, 0xC0, 0x02, 0xA0, 0xC2, 0x31, 0xE0, 0x04, 0xE2, 0xC1,
1349 0x03, 0x38, 0xCD, 0xC6, 0x33, 0xCD, 0x62, 0x33, 0x0F, 0x01,
1350 0xC2, 0x02, 0x35, 0xEE, 0xE1, 0x03, 0x38, 0xC9, 0x06, 0xFF,
1351 0x18, 0x06, 0xCD, 0xE9, 0x34, 0xD8, 0x06, 0x00, 0x7E, 0xA7,
1352 0x28, 0x0B, 0x23, 0x78, 0xE6, 0x80, 0xB6, 0x17, 0x3F, 0x1F,
1353 0x77, 0x2B, 0xC9, 0xD5, 0xE5, 0xCD, 0x7F, 0x2D, 0xE1, 0x78,
1354 0xB1, 0x2F, 0x4F, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0xCD, 0xE9,
1355 0x34, 0xD8, 0xD5, 0x11, 0x01, 0x00, 0x23, 0xCB, 0x16, 0x2B,
1356 0x9F, 0x4F, 0xCD, 0x8E, 0x2D, 0xD1, 0xC9, 0xCD, 0x99, 0x1E,
1357 0xED, 0x78, 0x18, 0x04, 0xCD, 0x99, 0x1E, 0x0A, 0xC3, 0x28,
1358 0x2D, 0xCD, 0x99, 0x1E, 0x21, 0x2B, 0x2D, 0xE5, 0xC5, 0xC9,
1359 0xCD, 0xF1, 0x2B, 0x0B, 0x78, 0xB1, 0x20, 0x23, 0x1A, 0xCD,
1360 0x8D, 0x2C, 0x38, 0x09, 0xD6, 0x90, 0x38, 0x19, 0xFE, 0x15,
1361 0x30, 0x15, 0x3C, 0x3D, 0x87, 0x87, 0x87, 0xFE, 0xA8, 0x30,
1362 0x0C, 0xED, 0x4B, 0x7B, 0x5C, 0x81, 0x4F, 0x30, 0x01, 0x04,
1363 0xC3, 0x2B, 0x2D, 0xCF, 0x09, 0xE5, 0xC5, 0x47, 0x7E, 0x23,
1364 0xB6, 0x23, 0xB6, 0x23, 0xB6, 0x78, 0xC1, 0xE1, 0xC0, 0x37,
1365 0xC9, 0xCD, 0xE9, 0x34, 0xD8, 0x3E, 0xFF, 0x18, 0x06, 0xCD,
1366 0xE9, 0x34, 0x18, 0x05, 0xAF, 0x23, 0xAE, 0x2B, 0x07, 0xE5,
1367 0x3E, 0x00, 0x77, 0x23, 0x77, 0x23, 0x17, 0x77, 0x1F, 0x23,
1368 0x77, 0x23, 0x77, 0xE1, 0xC9, 0xEB, 0xCD, 0xE9, 0x34, 0xEB,
1369 0xD8, 0x37, 0x18, 0xE7, 0xEB, 0xCD, 0xE9, 0x34, 0xEB, 0xD0,
1370 0xA7, 0x18, 0xDE, 0xEB, 0xCD, 0xE9, 0x34, 0xEB, 0xD0, 0xD5,
1371 0x1B, 0xAF, 0x12, 0x1B, 0x12, 0xD1, 0xC9, 0x78, 0xD6, 0x08,
1372 0xCB, 0x57, 0x20, 0x01, 0x3D, 0x0F, 0x30, 0x08, 0xF5, 0xE5,
1373 0xCD, 0x3C, 0x34, 0xD1, 0xEB, 0xF1, 0xCB, 0x57, 0x20, 0x07,
1374 0x0F, 0xF5, 0xCD, 0x0F, 0x30, 0x18, 0x33, 0x0F, 0xF5, 0xCD,
1375 0xF1, 0x2B, 0xD5, 0xC5, 0xCD, 0xF1, 0x2B, 0xE1, 0x7C, 0xB5,
1376 0xE3, 0x78, 0x20, 0x0B, 0xB1, 0xC1, 0x28, 0x04, 0xF1, 0x3F,
1377 0x18, 0x16, 0xF1, 0x18, 0x13, 0xB1, 0x28, 0x0D, 0x1A, 0x96,
1378 0x38, 0x09, 0x20, 0xED, 0x0B, 0x13, 0x23, 0xE3, 0x2B, 0x18,
1379 0xDF, 0xC1, 0xF1, 0xA7, 0xF5, 0xEF, 0xA0, 0x38, 0xF1, 0xF5,
1380 0xDC, 0x01, 0x35, 0xF1, 0xF5, 0xD4, 0xF9, 0x34, 0xF1, 0x0F,
1381 0xD4, 0x01, 0x35, 0xC9, 0xCD, 0xF1, 0x2B, 0xD5, 0xC5, 0xCD,
1382 0xF1, 0x2B, 0xE1, 0xE5, 0xD5, 0xC5, 0x09, 0x44, 0x4D, 0xF7,
1383 0xCD, 0xB2, 0x2A, 0xC1, 0xE1, 0x78, 0xB1, 0x28, 0x02, 0xED,
1384 0xB0, 0xC1, 0xE1, 0x78, 0xB1, 0x28, 0x02, 0xED, 0xB0, 0x2A,
1385 0x65, 0x5C, 0x11, 0xFB, 0xFF, 0xE5, 0x19, 0xD1, 0xC9, 0xCD,
1386 0xD5, 0x2D, 0x38, 0x0E, 0x20, 0x0C, 0xF5, 0x01, 0x01, 0x00,
1387 0xF7, 0xF1, 0x12, 0xCD, 0xB2, 0x2A, 0xEB, 0xC9, 0xCF, 0x0A,
1388 0x2A, 0x5D, 0x5C, 0xE5, 0x78, 0xC6, 0xE3, 0x9F, 0xF5, 0xCD,
1389 0xF1, 0x2B, 0xD5, 0x03, 0xF7, 0xE1, 0xED, 0x53, 0x5D, 0x5C,
1390 0xD5, 0xED, 0xB0, 0xEB, 0x2B, 0x36, 0x0D, 0xFD, 0xCB, 0x01,
1391 0xBE, 0xCD, 0xFB, 0x24, 0xDF, 0xFE, 0x0D, 0x20, 0x07, 0xE1,
1392 0xF1, 0xFD, 0xAE, 0x01, 0xE6, 0x40, 0xC2, 0x8A, 0x1C, 0x22,
1393 0x5D, 0x5C, 0xFD, 0xCB, 0x01, 0xFE, 0xCD, 0xFB, 0x24, 0xE1,
1394 0x22, 0x5D, 0x5C, 0x18, 0xA0, 0x01, 0x01, 0x00, 0xF7, 0x22,
1395 0x5B, 0x5C, 0xE5, 0x2A, 0x51, 0x5C, 0xE5, 0x3E, 0xFF, 0xCD,
1396 0x01, 0x16, 0xCD, 0xE3, 0x2D, 0xE1, 0xCD, 0x15, 0x16, 0xD1,
1397 0x2A, 0x5B, 0x5C, 0xA7, 0xED, 0x52, 0x44, 0x4D, 0xCD, 0xB2,
1398 0x2A, 0xEB, 0xC9, 0xCD, 0x94, 0x1E, 0xFE, 0x10, 0xD2, 0x9F,
1399 0x1E, 0x2A, 0x51, 0x5C, 0xE5, 0xCD, 0x01, 0x16, 0xCD, 0xE6,
1400 0x15, 0x01, 0x00, 0x00, 0x30, 0x03, 0x0C, 0xF7, 0x12, 0xCD,
1401 0xB2, 0x2A, 0xE1, 0xCD, 0x15, 0x16, 0xC3, 0xBF, 0x35, 0xCD,
1402 0xF1, 0x2B, 0x78, 0xB1, 0x28, 0x01, 0x1A, 0xC3, 0x28, 0x2D,
1403 0xCD, 0xF1, 0x2B, 0xC3, 0x2B, 0x2D, 0xD9, 0xE5, 0x21, 0x67,
1404 0x5C, 0x35, 0xE1, 0x20, 0x04, 0x23, 0xD9, 0xC9, 0xD9, 0x5E,
1405 0x7B, 0x17, 0x9F, 0x57, 0x19, 0xD9, 0xC9, 0x13, 0x13, 0x1A,
1406 0x1B, 0x1B, 0xA7, 0x20, 0xEF, 0xD9, 0x23, 0xD9, 0xC9, 0xF1,
1407 0xD9, 0xE3, 0xD9, 0xC9, 0xEF, 0xC0, 0x02, 0x31, 0xE0, 0x05,
1408 0x27, 0xE0, 0x01, 0xC0, 0x04, 0x03, 0xE0, 0x38, 0xC9, 0xEF,
1409 0x31, 0x36, 0x00, 0x04, 0x3A, 0x38, 0xC9, 0x31, 0x3A, 0xC0,
1410 0x03, 0xE0, 0x01, 0x30, 0x00, 0x03, 0xA1, 0x03, 0x38, 0xC9,
1411 0xEF, 0x3D, 0x34, 0xF1, 0x38, 0xAA, 0x3B, 0x29, 0x04, 0x31,
1412 0x27, 0xC3, 0x03, 0x31, 0x0F, 0xA1, 0x03, 0x88, 0x13, 0x36,
1413 0x58, 0x65, 0x66, 0x9D, 0x78, 0x65, 0x40, 0xA2, 0x60, 0x32,
1414 0xC9, 0xE7, 0x21, 0xF7, 0xAF, 0x24, 0xEB, 0x2F, 0xB0, 0xB0,
1415 0x14, 0xEE, 0x7E, 0xBB, 0x94, 0x58, 0xF1, 0x3A, 0x7E, 0xF8,
1416 0xCF, 0xE3, 0x38, 0xCD, 0xD5, 0x2D, 0x20, 0x07, 0x38, 0x03,
1417 0x86, 0x30, 0x09, 0xCF, 0x05, 0x38, 0x07, 0x96, 0x30, 0x04,
1418 0xED, 0x44, 0x77, 0xC9, 0xEF, 0x02, 0xA0, 0x38, 0xC9, 0xEF,
1419 0x3D, 0x31, 0x37, 0x00, 0x04, 0x38, 0xCF, 0x09, 0xA0, 0x02,
1420 0x38, 0x7E, 0x36, 0x80, 0xCD, 0x28, 0x2D, 0xEF, 0x34, 0x38,
1421 0x00, 0x03, 0x01, 0x31, 0x34, 0xF0, 0x4C, 0xCC, 0xCC, 0xCD,
1422 0x03, 0x37, 0x00, 0x08, 0x01, 0xA1, 0x03, 0x01, 0x38, 0x34,
1423 0xEF, 0x01, 0x34, 0xF0, 0x31, 0x72, 0x17, 0xF8, 0x04, 0x01,
1424 0xA2, 0x03, 0xA2, 0x03, 0x31, 0x34, 0x32, 0x20, 0x04, 0xA2,
1425 0x03, 0x8C, 0x11, 0xAC, 0x14, 0x09, 0x56, 0xDA, 0xA5, 0x59,
1426 0x30, 0xC5, 0x5C, 0x90, 0xAA, 0x9E, 0x70, 0x6F, 0x61, 0xA1,
1427 0xCB, 0xDA, 0x96, 0xA4, 0x31, 0x9F, 0xB4, 0xE7, 0xA0, 0xFE,
1428 0x5C, 0xFC, 0xEA, 0x1B, 0x43, 0xCA, 0x36, 0xED, 0xA7, 0x9C,
1429 0x7E, 0x5E, 0xF0, 0x6E, 0x23, 0x80, 0x93, 0x04, 0x0F, 0x38,
1430 0xC9, 0xEF, 0x3D, 0x34, 0xEE, 0x22, 0xF9, 0x83, 0x6E, 0x04,
1431 0x31, 0xA2, 0x0F, 0x27, 0x03, 0x31, 0x0F, 0x31, 0x0F, 0x31,
1432 0x2A, 0xA1, 0x03, 0x31, 0x37, 0xC0, 0x00, 0x04, 0x02, 0x38,
1433 0xC9, 0xA1, 0x03, 0x01, 0x36, 0x00, 0x02, 0x1B, 0x38, 0xC9,
1434 0xEF, 0x39, 0x2A, 0xA1, 0x03, 0xE0, 0x00, 0x06, 0x1B, 0x33,
1435 0x03, 0xEF, 0x39, 0x31, 0x31, 0x04, 0x31, 0x0F, 0xA1, 0x03,
1436 0x86, 0x14, 0xE6, 0x5C, 0x1F, 0x0B, 0xA3, 0x8F, 0x38, 0xEE,
1437 0xE9, 0x15, 0x63, 0xBB, 0x23, 0xEE, 0x92, 0x0D, 0xCD, 0xED,
1438 0xF1, 0x23, 0x5D, 0x1B, 0xEA, 0x04, 0x38, 0xC9, 0xEF, 0x31,
1439 0x1F, 0x01, 0x20, 0x05, 0x38, 0xC9, 0xCD, 0x97, 0x32, 0x7E,
1440 0xFE, 0x81, 0x38, 0x0E, 0xEF, 0xA1, 0x1B, 0x01, 0x05, 0x31,
1441 0x36, 0xA3, 0x01, 0x00, 0x06, 0x1B, 0x33, 0x03, 0xEF, 0xA0,
1442 0x01, 0x31, 0x31, 0x04, 0x31, 0x0F, 0xA1, 0x03, 0x8C, 0x10,
1443 0xB2, 0x13, 0x0E, 0x55, 0xE4, 0x8D, 0x58, 0x39, 0xBC, 0x5B,
1444 0x98, 0xFD, 0x9E, 0x00, 0x36, 0x75, 0xA0, 0xDB, 0xE8, 0xB4,
1445 0x63, 0x42, 0xC4, 0xE6, 0xB5, 0x09, 0x36, 0xBE, 0xE9, 0x36,
1446 0x73, 0x1B, 0x5D, 0xEC, 0xD8, 0xDE, 0x63, 0xBE, 0xF0, 0x61,
1447 0xA1, 0xB3, 0x0C, 0x04, 0x0F, 0x38, 0xC9, 0xEF, 0x31, 0x31,
1448 0x04, 0xA1, 0x03, 0x1B, 0x28, 0xA1, 0x0F, 0x05, 0x24, 0x31,
1449 0x0F, 0x38, 0xC9, 0xEF, 0x22, 0xA3, 0x03, 0x1B, 0x38, 0xC9,
1450 0xEF, 0x31, 0x30, 0x00, 0x1E, 0xA2, 0x38, 0xEF, 0x01, 0x31,
1451 0x30, 0x00, 0x07, 0x25, 0x04, 0x38, 0xC3, 0xC4, 0x36, 0x02,
1452 0x31, 0x30, 0x00, 0x09, 0xA0, 0x01, 0x37, 0x00, 0x06, 0xA1,
1453 0x01, 0x05, 0x02, 0xA1, 0x38, 0xC9, 0xFF, 0xFF, 0xFF, 0xFF,
1454 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1455 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1456 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1457 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1458 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1459 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1460 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1461 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1462 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1463 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1464 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1465 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1466 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1467 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1468 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1469 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1470 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1471 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1472 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1473 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1474 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1475 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1476 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1477 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1478 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1479 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1480 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1481 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1482 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1483 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1484 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1485 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1486 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1487 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1488 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1489 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1490 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1491 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1492 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1493 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1494 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1495 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1496 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1497 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1498 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1499 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1500 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1501 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1502 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1503 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1504 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1505 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1506 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1507 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1508 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1509 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1510 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1511 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1512 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1513 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1514 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1515 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1516 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1517 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1518 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1519 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1520 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1521 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1522 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1523 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1524 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1525 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1526 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1527 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1528 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1529 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1530 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1531 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1532 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1533 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1534 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1535 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1536 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1537 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1538 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1539 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1540 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1541 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1542 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1543 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1544 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1545 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1546 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1547 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1548 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1549 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1550 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1551 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1552 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1553 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1554 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1555 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1556 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1557 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1558 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1559 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1560 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1561 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1562 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1563 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1564 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1565 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1566 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1567 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1568 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1569 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1570 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
1571 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00,
1572 0x10, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
1573 0x00, 0x24, 0x7E, 0x24, 0x24, 0x7E, 0x24, 0x00, 0x00, 0x08,
1574 0x3E, 0x28, 0x3E, 0x0A, 0x3E, 0x08, 0x00, 0x62, 0x64, 0x08,
1575 0x10, 0x26, 0x46, 0x00, 0x00, 0x10, 0x28, 0x10, 0x2A, 0x44,
1576 0x3A, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1577 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x00, 0x00, 0x20,
1578 0x10, 0x10, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x14, 0x08,
1579 0x3E, 0x08, 0x14, 0x00, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x08,
1580 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10,
1581 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
1582 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x02, 0x04,
1583 0x08, 0x10, 0x20, 0x00, 0x00, 0x3C, 0x46, 0x4A, 0x52, 0x62,
1584 0x3C, 0x00, 0x00, 0x18, 0x28, 0x08, 0x08, 0x08, 0x3E, 0x00,
1585 0x00, 0x3C, 0x42, 0x02, 0x3C, 0x40, 0x7E, 0x00, 0x00, 0x3C,
1586 0x42, 0x0C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x08, 0x18, 0x28,
1587 0x48, 0x7E, 0x08, 0x00, 0x00, 0x7E, 0x40, 0x7C, 0x02, 0x42,
1588 0x3C, 0x00, 0x00, 0x3C, 0x40, 0x7C, 0x42, 0x42, 0x3C, 0x00,
1589 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x00, 0x3C,
1590 0x42, 0x3C, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x3C, 0x42, 0x42,
1591 0x3E, 0x02, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1592 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x20,
1593 0x00, 0x00, 0x04, 0x08, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00,
1594 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08,
1595 0x04, 0x08, 0x10, 0x00, 0x00, 0x3C, 0x42, 0x04, 0x08, 0x00,
1596 0x08, 0x00, 0x00, 0x3C, 0x4A, 0x56, 0x5E, 0x40, 0x3C, 0x00,
1597 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x00, 0x00, 0x7C,
1598 0x42, 0x7C, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x3C, 0x42, 0x40,
1599 0x40, 0x42, 0x3C, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x44,
1600 0x78, 0x00, 0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x7E, 0x00,
1601 0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x00, 0x3C,
1602 0x42, 0x40, 0x4E, 0x42, 0x3C, 0x00, 0x00, 0x42, 0x42, 0x7E,
1603 0x42, 0x42, 0x42, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08,
1604 0x3E, 0x00, 0x00, 0x02, 0x02, 0x02, 0x42, 0x42, 0x3C, 0x00,
1605 0x00, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x40,
1606 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x42, 0x66, 0x5A,
1607 0x42, 0x42, 0x42, 0x00, 0x00, 0x42, 0x62, 0x52, 0x4A, 0x46,
1608 0x42, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00,
1609 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x00, 0x00, 0x3C,
1610 0x42, 0x42, 0x52, 0x4A, 0x3C, 0x00, 0x00, 0x7C, 0x42, 0x42,
1611 0x7C, 0x44, 0x42, 0x00, 0x00, 0x3C, 0x40, 0x3C, 0x02, 0x42,
1612 0x3C, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
1613 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x42,
1614 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00, 0x42, 0x42, 0x42,
1615 0x42, 0x5A, 0x24, 0x00, 0x00, 0x42, 0x24, 0x18, 0x18, 0x24,
1616 0x42, 0x00, 0x00, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x00,
1617 0x00, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x0E,
1618 0x08, 0x08, 0x08, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20,
1619 0x10, 0x08, 0x04, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10,
1620 0x70, 0x00, 0x00, 0x10, 0x38, 0x54, 0x10, 0x10, 0x10, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x1C,
1622 0x22, 0x78, 0x20, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x38, 0x04,
1623 0x3C, 0x44, 0x3C, 0x00, 0x00, 0x20, 0x20, 0x3C, 0x22, 0x22,
1624 0x3C, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x00,
1625 0x00, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3C, 0x00, 0x00, 0x00,
1626 0x38, 0x44, 0x78, 0x40, 0x3C, 0x00, 0x00, 0x0C, 0x10, 0x18,
1627 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C,
1628 0x04, 0x38, 0x00, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x00,
1629 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00, 0x00, 0x04,
1630 0x00, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00, 0x20, 0x28, 0x30,
1631 0x30, 0x28, 0x24, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10,
1632 0x0C, 0x00, 0x00, 0x00, 0x68, 0x54, 0x54, 0x54, 0x54, 0x00,
1633 0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00,
1634 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x78, 0x44,
1635 0x44, 0x78, 0x40, 0x40, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C,
1636 0x04, 0x06, 0x00, 0x00, 0x1C, 0x20, 0x20, 0x20, 0x20, 0x00,
1637 0x00, 0x00, 0x38, 0x40, 0x38, 0x04, 0x78, 0x00, 0x00, 0x10,
1638 0x38, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x44,
1639 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28,
1640 0x10, 0x00, 0x00, 0x00, 0x44, 0x54, 0x54, 0x54, 0x28, 0x00,
1641 0x00, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00,
1642 0x44, 0x44, 0x44, 0x3C, 0x04, 0x38, 0x00, 0x00, 0x7C, 0x08,
1643 0x10, 0x20, 0x7C, 0x00, 0x00, 0x0E, 0x08, 0x30, 0x08, 0x08,
1644 0x0E, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
1645 0x00, 0x70, 0x10, 0x0C, 0x10, 0x10, 0x70, 0x00, 0x00, 0x14,
1646 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA1,
1647 0xA1, 0x99, 0x42, 0x3C
1648};
1649
1650const unsigned long rom_imag_size = 16384;
1651
1652/* 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "misc.h"
22#include "helpers.h"
23#include "spperif.h"
24#include "z80.h"
25
26#include "snapshot.h"
27#include "compr.h"
28#include "interf.h"
29
30#include "spconf.h"
31
32#include "interf.h"
33
34#include <stdio.h>
35#include <stdlib.h>
36/*#include <errno.h>*/
37/*#include "string.h"*/
38#include <sys/types.h>
39
40#define COMPRESS_SAVE 1
41
42static char quick_snap_file[MAXFILENAME];
43static int qsnap_created = 0;
44typedef struct {
45 int isfile;
46 /*FILE *fp;*/
47 int fd;
48
49 unsigned len;
50 byte *at;
51} SNFILE;
52
53
54#define sngetc(snfp) ((snfp)->isfile ? getc((snfp)->fd) : snmgetc(snfp))
55
56static int snmgetc(SNFILE *snfp)
57{
58 if(!snfp->len) return EOF;
59 snfp->len--;
60 return *snfp->at++;
61}
62
63static int snread(void *ptr, int size, SNFILE *snfp)
64{
65 int i;
66 byte *dest;
67
68 if(snfp->isfile) /*return (int) fread(ptr, 1, (size_t) size, snfp->fp);*/
69 return (int) rb->read( snfp->fd,ptr, (size_t) size);
70
71 dest = (byte *) ptr;
72 for(i = 0; snfp->len && size; i++, snfp->len--, size--)
73 *dest++ = *snfp->at++;
74
75 return i;
76}
77
78
79
80/* These structures are taken from 'spconv' by Henk de Groot */
81
82struct sna_s {
83 byte i;
84 byte lbk;
85 byte hbk;
86 byte ebk;
87 byte dbk;
88 byte cbk;
89 byte bbk;
90 byte fbk;
91 byte abk;
92 byte l;
93 byte h;
94 byte e;
95 byte d;
96 byte c;
97 byte b;
98 byte iyl;
99 byte iyh;
100 byte ixl;
101 byte ixh;
102 byte iff2;
103 byte r;
104 byte f;
105 byte a;
106 byte spl;
107 byte sph;
108 byte im;
109 byte border;
110};
111
112#define sna_size 27 /* sizeof(struct sna_s)=27 */
113
114
115struct z80_1_s {
116 byte a; /*00*/
117 byte f; /*01*/
118 byte c; /*02*/
119 byte b; /*03*/
120 byte l; /*04*/
121 byte h; /*05*/
122 byte pcl; /*06*/
123 byte pch; /*07*/
124 byte spl; /*08*/
125 byte sph; /*09*/
126 byte i; /*0A*/
127 byte r; /*0B*/
128 byte data; /*0C*/
129 byte e; /*0D*/
130 byte d; /*0E*/
131 byte cbk; /*0F*/
132 byte bbk; /*10*/
133 byte ebk; /*11*/
134 byte dbk; /*12*/
135 byte lbk; /*13*/
136 byte hbk; /*14*/
137 byte abk; /*15*/
138 byte fbk; /*16*/
139 byte iyl; /*17*/
140 byte iyh; /*18*/
141 byte ixl; /*19*/
142 byte ixh; /*1A*/
143 byte iff1; /*1B*/
144 byte iff2; /*1C*/
145 byte im; /*1D*/
146};
147
148#define z80_145_size 0x1e /* length of z80 V1.45 header */
149
150
151struct z80_2_s {
152/* Extended 2.01 and 3.0 header, flagged with PC=0 */
153 byte h2_len_l; /*1E*/
154 byte h2_len_h; /*1F*/
155 byte n_pcl; /*20*/
156 byte n_pch; /*21*/
157 byte hardware; /*22*/
158 byte samram; /*23*/
159 byte if1_paged; /*24*/
160 byte r_ldir_emu; /*25*/
161 byte last_out; /*26*/
162 byte sound_reg[16]; /*27*/
163
164/* Continues with extended 3.0 header, but this part is not used anyway */
165};
166
167#define z80_201_ext_size 23 /* length of extended z80 V2.01 header */
168#define z80_300_ext_size 54 /* length of extended z80 V3.0 header */
169
170
171struct z80_page_s {
172 byte blklen_l; /*00*/
173 byte blklen_h; /*01*/
174 byte page_num; /*02*/
175};
176
177#define z80_pg_size 3 /* sizeof(struct z80_page_s)=3 */
178
179
180/*static FILE *savfp;*/
181static int savfd;
182static int memptr;
183
184int compr_read_byte(void)
185{
186 if(memptr < 0x10000) return z80_proc.mem[memptr++];
187 else return -1;
188}
189
190void compr_put_byte(int i)
191{
192 putc(i, savfd);
193}
194
195
196#define STORE_NORMAL_REGS(head) \
197 head.f = RF; /* F reg */ \
198 head.a = RA; /* A reg */ \
199 head.b = RB; /* B reg */ \
200 head.c = RC; /* C reg */ \
201 head.d = RD; /* D reg */ \
202 head.e = RE; /* E reg */ \
203 head.h = RH; /* H reg */ \
204 head.l = RL; /* L reg */ \
205 head.fbk = FBK; /* F' reg */ \
206 head.abk = ABK; /* A' reg */ \
207 head.bbk = BBK; /* B' reg */ \
208 head.cbk = CBK; /* C' reg */ \
209 head.dbk = DBK; /* D' reg */ \
210 head.ebk = EBK; /* E' reg */ \
211 head.hbk = HBK; /* H' reg */ \
212 head.lbk = LBK; /* L' reg */ \
213 head.iyh = YH; /* IY reg */ \
214 head.iyl = YL; \
215 head.ixh = XH; /* IX reg */ \
216 head.ixl = XL
217
218
219#define LOAD_NORMAL_REGS(head) \
220 RF = head.f; /* F reg */ \
221 RA = head.a; /* A reg */ \
222 RB = head.b; /* B reg */ \
223 RC = head.c; /* C reg */ \
224 RD = head.d; /* D reg */ \
225 RE = head.e; /* E reg */ \
226 RH = head.h; /* H reg */ \
227 RL = head.l; /* L reg */ \
228 FBK = head.fbk; /* F' reg */ \
229 ABK = head.abk; /* A' reg */ \
230 BBK = head.bbk; /* B' reg */ \
231 CBK = head.cbk; /* C' reg */ \
232 DBK = head.dbk; /* D' reg */ \
233 EBK = head.ebk; /* E' reg */ \
234 HBK = head.hbk; /* H' reg */ \
235 LBK = head.lbk; /* L' reg */ \
236 YH = head.iyh; /* IY reg */ \
237 YL = head.iyl; \
238 XH = head.ixh; /* IX reg */ \
239 XL = head.ixl
240
241
242static void snsh_z80_save(int fd)
243{
244 struct z80_1_s z80;
245
246 int to_comp = COMPRESS_SAVE;
247
248 STORE_NORMAL_REGS(z80);
249
250 z80.i = RI; /* I reg */
251 z80.r = RR; /* R reg */
252
253 z80.sph = SPH; /* SP reg */
254 z80.spl = SPL;
255 z80.pch = PCH; /* PC reg */
256 z80.pcl = PCL;
257
258 z80.iff1 = z80_proc.iff1; /* iff1 */
259 z80.iff2 = z80_proc.iff2; /* iff2 */
260
261 z80.im = (z80_proc.it_mode & 0x03) | 0x60;
262/*
263 Bit 0-1: Interrupt mode (0, 1 or 2)
264 Bit 2 : 1=Issue 2 emulation
265 Bit 3 : 1=Double interrupt frequency
266 Bit 4-5: 1=High video synchronisation
267 3=Low video synchronisation
268 0,2=Normal
269 Bit 6-7: 0=Cursor/Protek/AGF joystick
270 1=Kempston joystick
271 2=Sinclair 1 joystick
272 3=Sinclair 2 joystick
273*/
274
275 z80.data = ((RR >> 7) & 0x01) |
276 ((z80_proc.ula_outport & 0x07) << 1) |
277 (to_comp ? 0x20 : 0);
278/*
279 Bit 0 : Bit 7 of the R-register
280 Bit 1-3: Border colour
281 Bit 4 : 1=Basic SamRom switched in
282 Bit 5 : 1=Block of data is compressed
283 Bit 6-7: No meaning
284*/
285
286
287 /*fwrite(&z80, z80_145_size, 1, fp);*/
288 rb->write(fd,&z80,z80_145_size);
289
290 if(!to_comp)
291 /*fwrite(z80_proc.mem + 0x4000, 0xC000, 1, fp);*/
292 rb->write(fd,z80_proc.mem + 0x4000,0xC000);
293 else {
294 memptr = 0x4000;
295 savfd = fd;
296 compr();
297 }
298}
299
300
301
302static void snsh_sna_save(int fd)
303{
304 struct sna_s sna;
305 byte saves1, saves2;
306
307 STORE_NORMAL_REGS(sna);
308
309 sna.i = RI; /* I reg */
310 sna.r = RR; /* R reg */
311
312 sna.border = z80_proc.ula_outport & 0x07;
313
314 SP -= 2;
315
316 sna.sph = SPH; /* SP reg */
317 sna.spl = SPL;
318
319 saves1 = z80_proc.mem[SP];
320 saves2 = z80_proc.mem[(dbyte)(SP+1)];
321 if(SP >= 0x4000) {
322 z80_proc.mem[SP] = PCL;
323 if(SP < 0xFFFF) z80_proc.mem[SP+1] = PCH;
324 }
325
326 sna.iff2 = z80_proc.iff2 ? 0xff : 0x00; /* iff2 */
327
328 sna.im = z80_proc.it_mode & 0x03;
329
330 /*fwrite(&sna, sna_size, 1, fp);
331 fwrite(z80_proc.mem + 0x4000, 0xC000, 1, fp);*/
332 rb->write(fd,&sna, sna_size);
333 rb->write(fd,z80_proc.mem + 0x4000, 0xC000);
334
335 if(SP > 0x4000) {
336 z80_proc.mem[SP] = saves1;
337 if(SP < 0xFFFF) z80_proc.mem[SP+1] = saves2;
338 }
339
340 SP += 2;
341}
342
343#define GET_DATA(c) { \
344 if(!datalen) break; \
345 c = sngetc(fp); \
346 if(c == EOF) break; \
347 if(datalen > 0) datalen--; \
348}
349
350
351static void read_compressed_data(SNFILE *fp, byte *start, unsigned size,
352 long datalen)
353{
354 int j;
355 int times, last_ed, ch;
356 byte *p, *end;
357
358 p = start;
359 end = start+size;
360 last_ed = 0;
361 while(p < end) {
362 GET_DATA(ch);
363 if(ch != 0xED) {
364 last_ed = 0;
365 *p++ = ch;
366 }
367 else {
368 if(last_ed) {
369 last_ed = 0;
370 p--;
371 GET_DATA(times);
372 if(times == 0) break;
373
374 GET_DATA(ch);
375 if(p + times > end) {
376 put_msg("Warning: Repeat parameter too large in snapshot");
377 times = (int) ((long) end - (long) p);
378 }
379 for(j = 0; j < times; j++) *p++ = ch;
380 }
381 else {
382 last_ed = 1;
383 *p++ = 0xED;
384 }
385 }
386 }
387
388 if(datalen < 0) {
389 if(sngetc(fp) != 0 || sngetc(fp) != 0xED ||
390 sngetc(fp) != 0xED || sngetc(fp) != 0)
391 put_msg("Warning: Illegal ending of snapshot");
392 }
393
394 if(datalen > 0) {
395 while(datalen) {
396 if(sngetc(fp) == EOF) break;
397 datalen--;
398 }
399 put_msg("Warning: Page too long in snapshot");
400 }
401
402 if(p < end) put_msg("Warning: Page too short in snapshot");
403}
404
405static int read_header(void *p, int size, SNFILE *fp)
406{
407 int res;
408
409 res = snread(p, size, fp);
410 if(res != size) {
411 put_msg("Error, End Of File in snapshot header");
412 return 0;
413 }
414 return 1;
415}
416
417static int read_z80_page(SNFILE *fp)
418{
419 struct z80_page_s page;
420 unsigned datalen;
421 unsigned pos = 0;
422 int validpage;
423
424 int res;
425
426 res = snread(&page, z80_pg_size, fp);
427 if(res == 0) return 0;
428 if(res != z80_pg_size) {
429 put_msg("Error, End Of File in page header");
430 return 0;
431 }
432
433 datalen = (page.blklen_h << 8) | page.blklen_l;
434
435 validpage = 1;
436 switch(page.page_num) {
437 case 4:
438 pos = 0x8000;
439 break;
440
441 case 5:
442 pos = 0xC000;
443 break;
444
445 case 8:
446 pos = 0x4000;
447 break;
448
449 default:
450 validpage = 0;
451 while(datalen) {
452 if(sngetc(fp) == EOF) {
453 put_msg("Warning: Page too short in snapshot");
454 break;
455 }
456 datalen--;
457 }
458 }
459
460 if(validpage) read_compressed_data(fp, z80_proc.mem+pos, 0x4000,
461 (long) datalen);
462 return 1;
463}
464
465
466static void snsh_z80_load(SNFILE *fp)
467{
468 struct z80_1_s z80;
469
470 if(!read_header(&z80, z80_145_size, fp)) return;
471 if(z80.pch == 0 && z80.pcl == 0) {
472 struct z80_2_s z80_2;
473 int ext_size, rem;
474 if(!read_header(&z80_2, 2, fp)) return;
475 ext_size = z80_2.h2_len_l | (z80_2.h2_len_h << 8);
476 if(ext_size < z80_201_ext_size) {
477 put_msg("Error in Z80 header");
478 return;
479 }
480 if(!read_header(&z80_2.n_pcl, z80_201_ext_size, fp)) return;
481 rem = ext_size - z80_201_ext_size;
482 for(; rem; rem--) sngetc(fp);
483
484 if(z80_2.hardware >= 3 && (ext_size == z80_201_ext_size ||
485 z80_2.hardware >= 4)) {
486 put_msg("Can't load non 48k snapshot");
487 return;
488 }
489 if(z80_2.if1_paged) {
490 put_msg("Can't load snapshot: IF1 roma paged in");
491 return;
492 }
493
494 PCH = z80_2.n_pch;
495 PCL = z80_2.n_pcl;
496
497 while(read_z80_page(fp));
498 }
499 else {
500 if(z80.data == 0xFF) z80.data = 1;
501 if(z80.data & 0x20)
502 read_compressed_data(fp, z80_proc.mem + 0x4000, 0xC000, -1);
503 else {
504 if(snread(z80_proc.mem + 0x4000, 0xC000, fp) != 0xC000)
505 put_msg("Warning: Snapshot file too short (z80)");
506 else if(sngetc(fp) != EOF)
507 put_msg("Warning: Snapshot file too long");
508 }
509
510 PCH = z80.pch;
511 PCL = z80.pcl;
512 }
513
514
515 LOAD_NORMAL_REGS(z80);
516
517 RI = z80.i; /* I reg */
518 RR = (z80.r & 0x7F) | ((z80.data & 0x01) << 7); /* R reg */
519
520 SPH = z80.sph; /* SP reg */
521 SPL = z80.spl;
522
523 z80_proc.ula_outport = (z80_proc.ula_outport & ~(0x07)) |
524 ((z80.data >> 1) & 0x07);
525
526/*
527 Bit 0 : Bit 7 of the R-register
528 Bit 1-3: Border colour
529 Bit 4 : 1=Basic SamRom switched in
530 Bit 5 : 1=Block of data is compressed
531 Bit 6-7: No meaning
532*/
533
534 z80_proc.iff1 = z80.iff1 ? 1 : 0;
535 z80_proc.iff2 = z80.iff2 ? 1 : 0;
536
537 z80_proc.it_mode = z80.im & 0x03;
538
539/*
540 Bit 0-1: Interrupt mode (0, 1 or 2)
541 Bit 2 : 1=Issue 2 emulation
542 Bit 3 : 1=Double interrupt frequency
543 Bit 4-5: 1=High video synchronisation
544 3=Low video synchronisation
545 0,2=Normal
546 Bit 6-7: 0=Cursor/Protek/AGF joystick
547 1=Kempston joystick
548 2=Sinclair 1 joystick
549 3=Sinclair 2 joystick
550*/
551
552 z80_proc.haltstate = 0;
553
554 sp_init_screen_mark();
555}
556
557static void snsh_sna_load(SNFILE *fp)
558{
559 struct sna_s sna;
560
561 if(!read_header(&sna, sna_size, fp)) return;
562
563 if(snread(z80_proc.mem+0x4000, 0xC000, fp) != 0xC000)
564 put_msg("Warning: Snapshot file too short (sna)");
565 else if(sngetc(fp) != EOF)
566 put_msg("Warning: Snapshot file too long");
567
568 LOAD_NORMAL_REGS(sna);
569
570 RI = sna.i; /* I reg */
571 RR = sna.r; /* R reg */
572
573 z80_proc.ula_outport = (z80_proc.ula_outport & ~(0x07)) |
574 (sna.border & 0x07);
575
576 SPH = sna.sph; /* SP reg */
577 SPL = sna.spl;
578
579 PCL = z80_proc.mem[SP];
580 if(SP >= 0x4000) z80_proc.mem[SP] = 0;
581 SP++;
582 PCH = z80_proc.mem[SP];
583 if(SP >= 0x4000) z80_proc.mem[SP] = 0;
584 SP++;
585
586 z80_proc.iff1 = z80_proc.iff2 = sna.iff2 ? 1 : 0;
587 z80_proc.it_mode = sna.im & 0x03;
588
589 z80_proc.haltstate = 0;
590
591 sp_init_screen_mark();
592}
593/*
594static void cleanup_qsnap(void)
595{
596 if(qsnap_created) rb->remove(quick_snap_file);
597}
598*/
599static void save_snapshot_file_type(char *name, int type)
600{
601 /*FILE *snsh;*/
602 int snsh;
603 snsh = rb->open(name, O_WRONLY);
604 if(snsh < 0) {
605 snsh = rb->creat(name, O_WRONLY);
606/* sprintf(msgbuf, "Could not open snapshot file `%s', %s",
607 name, strerror(errno));*/
608 if(snsh < 0) {
609 put_msg("Could not create snapshot file");
610 return;
611 }
612 }
613
614 if(type == SN_SNA) snsh_sna_save(snsh);
615 else if(type == SN_Z80) snsh_z80_save(snsh);
616
617 rb->close(snsh);
618}
619
620void save_snapshot_file(char *name)
621{
622 int type;
623
624 rb->strncpy(filenamebuf, name, MAXFILENAME-10);
625 filenamebuf[MAXFILENAME-10] = '\0';
626
627 type = SN_Z80;
628 if(check_ext(filenamebuf, "z80")) type = SN_Z80;
629 else if(check_ext(filenamebuf, "sna")) type = SN_SNA;
630 else {
631 add_extension(filenamebuf, "z80");
632 type = SN_Z80;
633 }
634
635 save_snapshot_file_type(filenamebuf, type);
636
637/* sprintf(msgbuf, "Saved snapshot to file %s", filenamebuf);
638 put_msg(msgbuf);*/
639}
640
641void save_quick_snapshot(void)
642{
643/* if(!qsnap_created) {
644 if(tmpnam(quick_snap_file) == NULL) {
645 put_msg("Could not create temporary file for quick snapshot");
646 return;
647 }
648 qsnap_created = 1;
649 atexit(cleanup_qsnap);
650 }
651 save_snapshot_file_type(quick_snap_file, SN_Z80);*/
652}
653
654void save_snapshot(void)
655{
656 char name[MAXFILENAME];
657 name[0]='/';
658 name[1]='\0';
659 put_msg("Enter name of snapshot file to save:");
660 if (!rb->kbd_input((char*)&name, sizeof name))
661 save_snapshot_file(&name[0]);
662}
663
664
665void load_snapshot_file_type(char *name, int type)
666{
667 int filetype = FT_SNAPSHOT;
668 /*FILE *snsh;*/
669 int snsh;
670 SNFILE snfil;
671
672 rb->strncpy(filenamebuf, name, MAXFILENAME-10);
673 filenamebuf[MAXFILENAME-10] = '\0';
674
675 spcf_find_file_type(filenamebuf, &filetype, &type);
676 if(type < 0) type = SN_Z80;
677
678 snsh = rb->open(filenamebuf, O_RDONLY);
679 if(snsh < 0) {
680#ifndef USE_GRAY
681 rb->splash(HZ,true, "Could not open snapshot file `%s'",filenamebuf);
682#endif
683 return;
684 }
685
686 snfil.isfile = 1;
687 snfil.fd = snsh;
688
689 if(type == SN_SNA) snsh_sna_load(&snfil);
690 else if(type == SN_Z80) snsh_z80_load(&snfil);
691
692 rb->close(snsh);
693}
694
695void snsh_z80_load_intern(byte *p, unsigned len)
696{
697 SNFILE snfil;
698
699 snfil.isfile = 0;
700 snfil.at = p;
701 snfil.len = len;
702
703 snsh_z80_load(&snfil);
704}
705
706void load_quick_snapshot(void)
707{
708 if(!qsnap_created) {
709 put_msg("No quick snapshot saved yet");
710 return;
711 }
712 load_snapshot_file_type(quick_snap_file, SN_Z80);
713}
714
715
716void load_snapshot(void)
717{
718 char *name;
719
720 put_msg("Enter name of snapshot file to load:");
721
722 name = spif_get_filename();
723 if(name == NULL) return;
724
725 load_snapshot_file_type(name, -1);
726}
727
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SNAPSHOT_H
22#define SNAPSHOT_H
23
24#define SN_SNA 0
25#define SN_Z80 1
26
27extern void save_snapshot_file(char *snsh_name);
28extern void load_snapshot_file_type(char *snsh_name, int type);
29extern void snsh_z80_load_intern(unsigned char *p, unsigned len);
30
31extern void save_snapshot(void);
32extern void load_snapshot(void);
33
34extern void save_quick_snapshot(void);
35extern void load_quick_snapshot(void);
36
37#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "spperif.h"
22
23#define MARK_SCR(addr) SPNM(scr_mark)[(addr) >> 5] |= 1 << ((addr) & 0x1F)
24
25#define PUTMEM(addr, ptr, val) \
26{ \
27 register byte addrhi; \
28 addrhi = (dbyte) (addr) >> 8; \
29 if(addrhi >= 0x5B) *(ptr) = (val); \
30 else if(addrhi & 0x40) { \
31 *(ptr) = (val); \
32 MARK_SCR((dbyte) (addr)); \
33 if(DANM(next_scri) >= 0 && DANM(tc) > 86) \
34 DANM(tc) -= 2; \
35 } \
36}
37
38#define SOUNDPORT 0x10
39
40/* TODO: attribute or pixel byte is present on unused ports? */
41
42
43#define IN(porth, portl, dest) \
44{ \
45 if(!((portl) & DANM(inport_mask))) { \
46 dest = PORT(inports)[portl]; \
47 } \
48 else if(!((portl) & 1)) { \
49 if(DANM(imp_change) > DANM(tc)) { \
50 DANM(imp_change) = 0; \
51 DANM(ula_inport) ^= 0x40; \
52 } \
53 dest = SPECP(fe_inport_high)[porth] & DANM(ula_inport); \
54 DANM(tc) -= 1; \
55 } \
56 else { \
57 register int scri; \
58 scri = DANM(next_scri); \
59 dest = (scri < 0 || DANM(tc) <= 96) \
60 ? 0xFF : DANM(mem)[(scri<<5)+((224-DANM(tc))>>2)]; \
61 } \
62}
63
64
65#define OUT(porth, portl, source) \
66{ \
67 if(!((portl) & 1)) { \
68 if((DANM(ula_outport) ^ (source)) & SOUNDPORT) { \
69 DANM(sound_change) = 1; \
70 if((source) & SOUNDPORT) DANM(sound_sam) += DANM(tc); \
71 else DANM(sound_sam) -= DANM(tc); \
72 } \
73 DANM(ula_outport) = (source); \
74 DANM(tc) -= 1; \
75 } \
76 PORT(outports)[portl] = (source); \
77}
78
79#define DI_CHECK \
80 if(PC == LOAD_DI+1 && SPNM(quick_load)) \
81 SPNM(load_trapped) = 1, \
82 DANM(haltstate) = 1, \
83 DANM(tc) = 0;
84
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20#include "misc.h"
21#include "spconf_p.h"
22#include "spver.h"
23#include "interf.h"
24#include "spscr_p.h"
25#include "spkey.h"
26
27#include "snapshot.h" /* for SN_Z80 and SN_SNA */
28#include "tapefile.h" /* for TAP_TAP and TAP_TZX */
29#include "zxconfig.h"
30#include "stdio.h"
31#include "string.h"
32/*#include <errno.h>*/
33#include "sys/types.h"
34#include "helpers.h"
35#include "ctype.h"
36
37
38extern const char *spcf_keynames_ascii[];
39extern const char *spcf_keynames_misc[];
40
41char *spcf_init_snapshot = NULL;
42int spcf_init_snapshot_type;
43char *spcf_init_tapefile = NULL;
44int spcf_init_tapefile_type;
45#ifndef USE_GRAY
46#define exit(i) rb->splash(HZ*1,true,"Exit: %d",i)
47#else
48#define exit(i) i=i
49#endif
50#define MAXLINELEN 512
51/*static int linectr;
52static FILE *conffp;
53static int conffd;
54static const char *conffile;
55*/
56
57static int file_type = -1;
58static int file_subtype;
59
60struct ext_type {
61 const char *ext;
62 int type;
63 int subtype;
64};
65
66static struct ext_type extensions[] = {
67 {"z80", FT_SNAPSHOT, SN_Z80},
68 {"sna", FT_SNAPSHOT, SN_SNA},
69 {"tzx", FT_TAPEFILE, TAP_TZX},
70 {"tap", FT_TAPEFILE, TAP_TAP},
71
72 {NULL, 0, 0}
73};
74
75int spcf_find_file_type(char *filename, int *ftp, int *ftsubp)
76{
77 int i;
78 int found;
79
80 if(*ftp >= 0 && *ftsubp >= 0) return 1;
81
82 found = 0;
83
84 for(i = 0; extensions[i].ext != NULL; i++)
85 if((*ftp < 0 || *ftp == extensions[i].type) &&
86 (*ftsubp < 0 || *ftsubp == extensions[i].subtype) &&
87 check_ext(filename, extensions[i].ext)) {
88 found = 1;
89 *ftp = extensions[i].type;
90 *ftsubp = extensions[i].subtype;
91 break;
92 }
93
94 if(!found) for(i = 0; extensions[i].ext != NULL; i++)
95 if((*ftp < 0 || *ftp == extensions[i].type) &&
96 (*ftsubp < 0 || *ftsubp == extensions[i].subtype) &&
97 try_extension(filename, extensions[i].ext)) {
98 found = 1;
99 *ftp = extensions[i].type;
100 *ftsubp = extensions[i].subtype;
101 break;
102 }
103
104 return found;
105}
106
107static int find_extension(const char *ext)
108{
109 int i;
110 for(i = 0; extensions[i].ext != NULL; i++)
111 if(rb->strcasecmp(extensions[i].ext, ext) == 0) return i;
112
113 return -1;
114}
115
116
117/* now actually a snapshot/tape loader*/
118void spcf_read_command_line(void* parameter)
119{
120 int ix;
121
122 ix = find_extension( parameter - 3 + rb->strlen (parameter) );
123
124 file_type = extensions[ix].type;
125 file_subtype = extensions[ix].subtype;
126 rb->strncpy(filenamebuf, parameter, MAXFILENAME - 10);
127 filenamebuf[MAXFILENAME-10] = '\0';
128 if(file_type < 0) file_subtype = -1;
129 if(!spcf_find_file_type(filenamebuf, &file_type, &file_subtype))
130 return;
131
132 if(file_type == FT_SNAPSHOT) {
133 spcf_init_snapshot = make_string(spcf_init_snapshot, filenamebuf);
134 spcf_init_snapshot_type = file_subtype;
135 }
136 else if(file_type == FT_TAPEFILE) {
137 spcf_init_tapefile = make_string(spcf_init_tapefile, filenamebuf);
138 spcf_init_tapefile_type = file_subtype;
139 }
140}
141
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPCONF_H
22#define SPCONF_H
23
24#define FT_SNAPSHOT 0
25#define FT_TAPEFILE 1
26
27extern char *spcf_init_snapshot;
28extern int spcf_init_snapshot_type;
29extern char *spcf_init_tapefile;
30extern int spcf_init_tapefile_type;
31
32
33/*extern int spcf_read_conf_file(const char *filename);*/
34extern void spcf_read_command_line(void* parameter);
35extern void spcf_read_xresources(void);
36extern int spcf_find_file_type(char *filename, int *ftp, int *ftsubp);
37
38
39#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPCONF_P_H
22#define SPCONF_P_H
23
24#include "spconf.h"
25
26struct sp_options {
27 const char *option;
28
29 int argtype;
30 void *argvalp;
31 const char **enums;
32 int disp;
33};
34
35extern struct sp_options spcf_options[];
36
37#define SA_BOOL 1
38#define SA_INT 2
39#define SA_STR 3
40#define SA_ENUM 4
41
42
43extern int showframe;
44extern int scrmul;
45extern int privatemap;
46extern int use_shm;
47
48extern int small_screen;
49
50extern int sound_on;
51extern int bufframes;
52extern const char *sound_dev_name;
53extern int sound_sample_rate;
54extern int sound_to_autoclose;
55extern int sound_dsp_setfrag;
56
57extern int keyboard_type;
58extern int cursor_type;
59extern int color_type;
60extern int pause_on_iconify;
61extern int vga_pause_bg;
62extern int sp_quick_load;
63extern int sp_paused;
64extern int load_immed;
65extern int spt_auto_stop;
66extern int spkb_allow_ascii;
67extern int spkb_trueshift;
68extern int spkb_funcshift;
69
70extern void spcf_set_val(int ix, const char *val, const char *name,
71 int ctr, int fatal);
72
73extern void spcf_set_color(int ix, const char *val, const char *name,
74 int ctr, int fatal);
75extern void spcf_set_key(int ix, const char *val, const char *name,
76 int ctr, int fatal);
77extern int spcf_match_keydef(const char *attr, const char *beg);
78extern int spcf_parse_conf_line(char *line, char **attrp, char **valp);
79
80
81#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "z80.h"
22#include "spperif.h"
23#include "spscr.h"
24
25#define SOUNDPORT 0x10
26
27int SPNM(halfframe)(int firsttick, int numlines)
28{
29
30 int tc, linesleft;
31 int feport, scline, border;
32 byte *scrptr;
33 qbyte cmark = 0;
34
35 scrptr = (byte *) SPNM(image);
36
37 tc = firsttick - CHKTICK;
38
39 for(linesleft = numlines; linesleft; linesleft--) {
40 DANM(next_scri) = SPNM(scri)[SPNM(scline)];
41 tc += CHKTICK;
42
43 tc = PRNM(step)(tc);
44
45 scline = SPNM(scline);
46
47 /* store sound */
48 SPNM(sound_buf)[scline] = DANM(sound_sam);
49 feport = DANM(ula_outport);
50
51 if(feport & SOUNDPORT) DANM(sound_sam) = 240;
52 else DANM(sound_sam) = 16;
53
54 /* change EAR bit, store MIC bit*/
55
56 SPNM(fe_outport_time)[scline] = feport;
57 if(DANM(imp_change)) DANM(ula_inport) ^= 0x40;
58 DANM(imp_change) = SPNM(tape_impinfo)[scline];
59
60 /* Check if updating screen */
61
62 if(SPNM(updating)) {
63 border = SPNM(lastborder);
64 if((feport & 0x07) != border) {
65 SPNM(border_update) = 2;
66 SPNM(lastborder) = feport & 0x07;
67 }
68 scrptr = update_screen_line(scrptr, SPNM(coli)[scline], DANM(next_scri),
69 border, &cmark);
70
71 }
72 SPNM(scline)++;
73 }
74 return tc;
75}
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 @@
1/* spectkey.c */
2
3/*
4 This file was generated by ./bin_to_c from binary image
5 file `spectkey.srl'
6 */
7
8unsigned char spectkey[] = {
9 0xFF, 0x72, 0x07, 0xFF, 0x72, 0x07, 0xFF, 0x72, 0x07, 0xFE,
10 0x72, 0x07, 0x7F, 0xE7, 0x20, 0x77, 0xFE, 0x72, 0x07, 0x7F,
11 0xD7, 0x20, 0xA7, 0xFD, 0x72, 0x0A, 0x7F, 0xD7, 0x20, 0xA7,
12 0xFC, 0x72, 0x0B, 0x7F, 0xC7, 0x20, 0xB7, 0xFC, 0x72, 0x0B,
13 0x7F, 0xB7, 0x20, 0xC7, 0xFB, 0x72, 0x0C, 0x7F, 0xB7, 0x20,
14 0xC7, 0xFA, 0x72, 0x0D, 0x7F, 0xA7, 0x20, 0xD7, 0xFA, 0x72,
15 0x0D, 0x7F, 0x97, 0x20, 0xE0, 0x7F, 0x97, 0x20, 0xE0, 0x7F,
16 0x97, 0x20, 0xE0, 0x7F, 0x97, 0x20, 0xE0, 0x7F, 0x87, 0x20,
17 0xE1, 0x7F, 0x87, 0x20, 0xE1, 0x7F, 0x87, 0x20, 0xE1, 0x7F,
18 0x87, 0x20, 0xE1, 0x7F, 0x77, 0x20, 0xE2, 0x7F, 0x77, 0x20,
19 0xE2, 0x7F, 0x77, 0x20, 0xE2, 0x7F, 0x67, 0x20, 0xE3, 0x7F,
20 0x67, 0x20, 0xE3, 0x7F, 0x67, 0x20, 0xE3, 0x7F, 0x67, 0x20,
21 0xE3, 0x7F, 0x57, 0x20, 0xE4, 0x7F, 0x57, 0x20, 0xE4, 0x7F,
22 0x57, 0x20, 0xE4, 0x7F, 0x57, 0x20, 0xE3, 0x78, 0xF4, 0x72,
23 0x0E, 0x47, 0x8F, 0x47, 0x20, 0xE4, 0x78, 0xF4, 0x72, 0x0E,
24 0x37, 0x88, 0xF3, 0x72, 0x0E, 0x47, 0x88, 0xF3, 0x72, 0x0E,
25 0x47, 0x88, 0xF3, 0x72, 0x0E, 0x47, 0x88, 0xF3, 0x72, 0x0E,
26 0x37, 0xA8, 0xF2, 0x72, 0x0E, 0x47, 0xA8, 0xF2, 0x72, 0x0E,
27 0x47, 0xA8, 0xF2, 0x72, 0x0E, 0x47, 0xA8, 0xF2, 0x72, 0x0E,
28 0x37, 0xB8, 0xF1, 0x72, 0x0E, 0x47, 0xB8, 0xF1, 0x72, 0x0E,
29 0x47, 0xB8, 0xF1, 0x72, 0x0E, 0x37, 0xC8, 0xF0, 0x72, 0x0E,
30 0x47, 0xC8, 0xF0, 0x72, 0x0E, 0x47, 0xC8, 0xF0, 0x72, 0x0E,
31 0x47, 0xC8, 0xF0, 0x72, 0x0E, 0x37, 0xD8, 0xFF, 0x62, 0x0E,
32 0x47, 0xD8, 0xFF, 0x62, 0x0E, 0x47, 0xD8, 0xFF, 0x62, 0x0E,
33 0x47, 0xD8, 0xFE, 0x62, 0x0E, 0x47, 0xE0, 0x8F, 0xE6, 0x20,
34 0xE4, 0x7E, 0x08, 0xFE, 0x62, 0x0E, 0x47, 0xE0, 0x8F, 0xE6,
35 0x20, 0xE3, 0x7E, 0x18, 0xFD, 0x62, 0x0E, 0x47, 0xE1, 0x8F,
36 0xD6, 0x20, 0xE4, 0x7E, 0x18, 0xF3, 0x12, 0x0F, 0x32, 0x09,
37 0xF7, 0x30, 0x0E, 0x47, 0xE1, 0x8F, 0x31, 0x20, 0xF3, 0x20,
38 0x9F, 0x73, 0x00, 0xE3, 0x7E, 0x28, 0xF3, 0x12, 0x0A, 0x9B,
39 0x09, 0x90, 0xE0, 0x90, 0xB9, 0xA0, 0x99, 0x0A, 0x90, 0xA9,
40 0xF6, 0x30, 0x0E, 0x47, 0xE2, 0x8F, 0x31, 0x20, 0xA9, 0x0A,
41 0x90, 0x90, 0xD9, 0x09, 0x09, 0x90, 0xA9, 0x09, 0x09, 0x90,
42 0xB9, 0xF6, 0x30, 0x0E, 0x47, 0xE2, 0x8F, 0x52, 0x00, 0xB1,
43 0x00, 0x1C, 0x01, 0xA0, 0x10, 0xC1, 0xFF, 0x10, 0x0B, 0x70,
44 0x0C, 0x70, 0xA7, 0xF7, 0x20, 0x03, 0xA0, 0x3A, 0x03, 0xB0,
45 0xA3, 0x00, 0xC3, 0x03, 0xA0, 0x30, 0xC3, 0xA0, 0x3E, 0xB0,
46 0xA2, 0x00, 0xB2, 0x00, 0xC2, 0x0C, 0x20, 0x2A, 0x02, 0xFC,
47 0x10, 0x0A, 0x60, 0x06, 0xA0, 0x6A, 0x06, 0xA0, 0x6A, 0x06,
48 0xFF, 0x10, 0x08, 0xA0, 0x80, 0xC8, 0x08, 0xC0, 0x8D, 0x0A,
49 0x80, 0x08, 0xA0, 0x8E, 0xF0, 0x9A, 0x09, 0x09, 0xA0, 0x90,
50 0xA9, 0x0C, 0x90, 0xC9, 0xF8, 0x80, 0x0A, 0x90, 0xA9, 0x09,
51 0x0C, 0x90, 0xA9, 0x09, 0x0C, 0x90, 0x90, 0xC9, 0xF6, 0x30,
52 0x0E, 0x37, 0xE3, 0x8F, 0x52, 0x00, 0x1A, 0x01, 0x01, 0xC0,
53 0x1A, 0x01, 0x01, 0xF3, 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07,
54 0x00, 0x7F, 0x62, 0x00, 0x33, 0x03, 0x30, 0x03, 0x03, 0x00,
55 0x3A, 0x03, 0x03, 0xC0, 0x33, 0x00, 0x3A, 0x03, 0xB0, 0x30,
56 0x3E, 0x90, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xC0,
57 0x22, 0x00, 0x2F, 0xB1, 0x00, 0x6A, 0x06, 0x06, 0xA0, 0x60,
58 0x06, 0x06, 0x00, 0x66, 0x00, 0x6F, 0xF1, 0x00, 0x8A, 0x08,
59 0x08, 0xC0, 0x8C, 0x08, 0xC0, 0x8A, 0x08, 0x08, 0xA0, 0x8E,
60 0xF0, 0x9A, 0x09, 0x09, 0xA0, 0x90, 0x09, 0xB0, 0x9A, 0x09,
61 0xFC, 0x80, 0x0A, 0x9B, 0x09, 0x90, 0xC9, 0x0A, 0x90, 0x90,
62 0xC9, 0x00, 0xD9, 0xF5, 0x30, 0x0E, 0x47, 0xE3, 0x8F, 0x52,
63 0x00, 0x1A, 0x01, 0x01, 0xC0, 0x1A, 0x01, 0x01, 0xF3, 0x20,
64 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x7F, 0x52, 0x00, 0x30,
65 0x30, 0x30, 0x3A, 0x03, 0x03, 0xC0, 0x3C, 0x03, 0x03, 0x03,
66 0xA0, 0x3A, 0x03, 0xA0, 0x3E, 0x80, 0x2C, 0x02, 0xA0, 0x20,
67 0x2C, 0x02, 0xC0, 0x20, 0x20, 0x2F, 0xB1, 0x00, 0x6C, 0x06,
68 0xA0, 0x60, 0x6A, 0x06, 0x06, 0x06, 0x06, 0xFF, 0x10, 0x08,
69 0xA0, 0x80, 0x8C, 0x08, 0xC0, 0x8C, 0x08, 0xA0, 0x80, 0x8A,
70 0x08, 0xEF, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x00, 0x9B, 0x09,
71 0xA0, 0x9F, 0xC8, 0x00, 0xA9, 0x0A, 0x90, 0x90, 0xC9, 0xC0,
72 0x90, 0xC9, 0x09, 0x0C, 0x9F, 0x53, 0x00, 0xE4, 0x7E, 0x38,
73 0xF5, 0x20, 0x0B, 0x10, 0x01, 0xC0, 0x1A, 0x01, 0x0A, 0x1F,
74 0x12, 0x00, 0xB7, 0x00, 0xA7, 0xA0, 0x7A, 0x07, 0xF5, 0x20,
75 0x03, 0x03, 0x03, 0x03, 0xA0, 0x30, 0x30, 0xA3, 0x0A, 0x3A,
76 0x03, 0x03, 0x03, 0xA0, 0x3A, 0x03, 0xA0, 0x3E, 0x80, 0x20,
77 0xA2, 0x0B, 0x20, 0x0A, 0x2A, 0x0A, 0x2A, 0x02, 0x02, 0x02,
78 0xFB, 0x10, 0x06, 0xD0, 0xA6, 0x00, 0x6A, 0x06, 0x06, 0x06,
79 0x06, 0xF0, 0x20, 0x0A, 0x80, 0x0A, 0x8A, 0x08, 0xC0, 0x8C,
80 0x08, 0xA0, 0x80, 0x8A, 0x08, 0xEF, 0x09, 0xA0, 0x90, 0xC9,
81 0x00, 0x9B, 0x09, 0xA0, 0xA9, 0xFA, 0x80, 0x0A, 0x90, 0xA9,
82 0x09, 0x0C, 0x90, 0xA9, 0x09, 0x0A, 0x90, 0x90, 0x99, 0x0B,
83 0x9F, 0x53, 0x00, 0xE4, 0x7E, 0x38, 0xF5, 0x20, 0x01, 0xA0,
84 0x10, 0x1C, 0x01, 0xA0, 0x10, 0x1F, 0x32, 0x00, 0x70, 0x7A,
85 0x07, 0xC0, 0x7A, 0x07, 0xF5, 0x20, 0x03, 0xA0, 0x30, 0xC3,
86 0x03, 0xA0, 0x30, 0x3C, 0x03, 0x00, 0x33, 0xA0, 0x3A, 0x0C,
87 0x3E, 0x80, 0x2A, 0x02, 0x02, 0x02, 0xA0, 0x2C, 0x02, 0xC0,
88 0x20, 0x02, 0x2F, 0xB1, 0x00, 0x6E, 0x00, 0x6A, 0x0C, 0x60,
89 0x60, 0x06, 0x6F, 0x12, 0x00, 0x8A, 0x08, 0xC0, 0x8C, 0x08,
90 0xC0, 0x8A, 0x08, 0x08, 0x08, 0x08, 0xEF, 0x09, 0x09, 0x09,
91 0x09, 0xA0, 0x90, 0x09, 0xB0, 0x9A, 0x09, 0xFC, 0x80, 0x0A,
92 0x9B, 0x09, 0x9C, 0x09, 0x0A, 0x90, 0x99, 0xA0, 0x99, 0x0A,
93 0x90, 0xA9, 0xF5, 0x30, 0x0E, 0x37, 0xE4, 0x8F, 0x52, 0x00,
94 0x1A, 0x01, 0x01, 0xC0, 0x1A, 0x01, 0x01, 0xF3, 0x20, 0x07,
95 0x00, 0x70, 0x07, 0xC0, 0x70, 0x07, 0xF6, 0x20, 0x03, 0xA0,
96 0x30, 0x3A, 0x03, 0x03, 0xA0, 0x30, 0x3C, 0x03, 0xA0, 0x3A,
97 0x03, 0xA0, 0x3A, 0x03, 0xE8, 0x02, 0xA0, 0x20, 0x20, 0x02,
98 0x00, 0x2C, 0x02, 0xC0, 0x2A, 0x02, 0xFB, 0x10, 0x06, 0xA0,
99 0x6A, 0x06, 0xA0, 0x6A, 0x06, 0x06, 0xA0, 0x6F, 0x12, 0x00,
100 0x8A, 0x08, 0xC0, 0x8C, 0x08, 0xC0, 0x8A, 0x08, 0x08, 0x08,
101 0x08, 0xEF, 0x09, 0x09, 0x09, 0x09, 0xA0, 0x90, 0x09, 0xB0,
102 0x9A, 0x09, 0xFC, 0x80, 0x0F, 0x32, 0x09, 0xF4, 0x30, 0x0E,
103 0x47, 0xE4, 0x8F, 0x52, 0x00, 0xB1, 0x00, 0xC1, 0x00, 0xA1,
104 0x00, 0xC1, 0xFF, 0x10, 0x07, 0xA0, 0x70, 0xC7, 0x0A, 0x7F,
105 0x72, 0x00, 0x3A, 0x03, 0x03, 0xA0, 0x30, 0x0B, 0x30, 0xC3,
106 0x03, 0xA0, 0x3A, 0x03, 0xA0, 0x3A, 0x03, 0xE9, 0x0B, 0x20,
107 0x2A, 0x02, 0x0C, 0x20, 0xC2, 0x02, 0xA0, 0x2F, 0xC1, 0x00,
108 0xA6, 0xB0, 0x6A, 0x06, 0xA0, 0x60, 0x6A, 0x06, 0xF1, 0x20,
109 0x08, 0xA0, 0xC8, 0x0C, 0x80, 0xC8, 0x00, 0xA8, 0xA0, 0x80,
110 0x8F, 0x81, 0x00, 0x90, 0x90, 0x09, 0xA0, 0x90, 0xA9, 0xA0,
111 0x9A, 0x0C, 0x9F, 0x88, 0x00, 0xF3, 0x20, 0x9F, 0x43, 0x00,
112 0xE4, 0x7E, 0x48, 0xFA, 0x62, 0x0E, 0x47, 0xE4, 0x8F, 0xA6,
113 0x20, 0xE3, 0x7E, 0x58, 0xF9, 0x62, 0x0E, 0x47, 0xE5, 0x8F,
114 0x96, 0x20, 0xE4, 0x7E, 0x58, 0xF9, 0x62, 0x0E, 0x37, 0xE6,
115 0x8F, 0x52, 0x00, 0xC9, 0x0A, 0x9A, 0x0A, 0x90, 0xC9, 0xFF,
116 0x10, 0x0A, 0x9B, 0x09, 0xA0, 0xB9, 0xA0, 0xB9, 0xA0, 0x9D,
117 0x0A, 0x9A, 0x0A, 0x90, 0x09, 0xA0, 0x9D, 0x0C, 0x90, 0xB9,
118 0x00, 0x9A, 0x09, 0x0C, 0x9A, 0x09, 0xA0, 0x90, 0xA9, 0x0A,
119 0x9A, 0x0C, 0x90, 0x0A, 0x9E, 0x00, 0xA9, 0x09, 0xA0, 0x90,
120 0x9A, 0x09, 0xB0, 0x9A, 0x09, 0x0A, 0x90, 0xA9, 0xA0, 0xC9,
121 0x00, 0xA9, 0xEB, 0x09, 0x9F, 0x23, 0x00, 0xB9, 0xF4, 0x30,
122 0x09, 0x9F, 0x73, 0x00, 0x99, 0xFE, 0x20, 0x0A, 0x90, 0x0B,
123 0x9B, 0x09, 0xA0, 0xB9, 0x00, 0x9A, 0x09, 0x0A, 0x90, 0x0A,
124 0x9A, 0x0B, 0x9E, 0x30, 0xA9, 0xA0, 0xC9, 0x09, 0xC0, 0xC9,
125 0x0C, 0x90, 0xC9, 0xF1, 0x30, 0x0E, 0x47, 0xE6, 0x8F, 0x52,
126 0x00, 0x9C, 0x09, 0x00, 0x9A, 0x09, 0xB0, 0x9F, 0x02, 0x00,
127 0x9A, 0x09, 0x00, 0x90, 0x90, 0x09, 0xA0, 0x90, 0x9E, 0x00,
128 0x9C, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0x00, 0x9E, 0x20,
129 0x9A, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0xE0, 0x09, 0xA0,
130 0x90, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xA0, 0x9E,
131 0x00, 0x90, 0x09, 0x90, 0x09, 0x09, 0xA0, 0x9B, 0x09, 0xA0,
132 0x90, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xA0, 0x9E,
133 0x80, 0x99, 0x09, 0xF2, 0x30, 0x09, 0x00, 0x9F, 0x23, 0x00,
134 0x99, 0x00, 0x99, 0xF5, 0x30, 0x09, 0x09, 0x9F, 0xB2, 0x00,
135 0x9A, 0x09, 0x09, 0xA0, 0x90, 0x09, 0x09, 0x00, 0x9A, 0x09,
136 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9A, 0x09, 0x09, 0xE7, 0x09,
137 0x00, 0x90, 0x09, 0xC0, 0x9C, 0x09, 0xE0, 0x09, 0xA0, 0x9F,
138 0x53, 0x00, 0xE4, 0x7E, 0x68, 0xF5, 0x20, 0x09, 0xC0, 0x9A,
139 0x09, 0x00, 0x9B, 0x09, 0xF0, 0x20, 0x09, 0xC0, 0x9A, 0x09,
140 0x09, 0xA0, 0x90, 0x9E, 0x00, 0x9C, 0x09, 0xA0, 0x90, 0x9C,
141 0x09, 0x09, 0xE3, 0x09, 0xA0, 0x9A, 0x09, 0x09, 0xA0, 0x90,
142 0x9E, 0x00, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0, 0x90, 0x9C,
143 0x09, 0xA0, 0x9E, 0x00, 0x90, 0x09, 0x09, 0x09, 0x09, 0xA0,
144 0x9B, 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9A, 0x09, 0x09, 0xC0,
145 0x9A, 0x09, 0xE6, 0x09, 0x9A, 0x0E, 0x09, 0xFC, 0x20, 0x09,
146 0x00, 0x9F, 0x03, 0x00, 0x99, 0xD0, 0x99, 0xFD, 0x20, 0x0E,
147 0x09, 0xA0, 0x99, 0xF9, 0x20, 0x09, 0xC0, 0x9A, 0x09, 0x09,
148 0xA0, 0x90, 0x9A, 0x09, 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9C,
149 0x09, 0xE7, 0x09, 0xA0, 0x90, 0x9C, 0x09, 0xC0, 0x9E, 0x00,
150 0x9A, 0x09, 0xF5, 0x30, 0x0E, 0x47, 0xE5, 0x82, 0xF5, 0x20,
151 0x0A, 0x9A, 0x09, 0xA0, 0x90, 0x09, 0xB0, 0x9F, 0x02, 0x00,
152 0x9C, 0x09, 0xA0, 0x90, 0xB9, 0xA0, 0xA9, 0xB0, 0x9C, 0x09,
153 0xA0, 0x90, 0x9C, 0x09, 0x9E, 0x40, 0x9A, 0x0B, 0x90, 0x09,
154 0xA0, 0x90, 0xA9, 0xC0, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0,
155 0x90, 0xA9, 0xA0, 0x9A, 0x09, 0xE0, 0x09, 0x00, 0x90, 0x90,
156 0x90, 0x9A, 0x09, 0xB0, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0,
157 0x90, 0xA9, 0xA0, 0x9A, 0x09, 0xE4, 0x09, 0x9E, 0x40, 0x9F,
158 0x92, 0x00, 0xB9, 0x00, 0xB9, 0xFD, 0x20, 0x0B, 0x90, 0x0B,
159 0x9F, 0xD2, 0x00, 0x9E, 0x40, 0x99, 0xF7, 0x20, 0x09, 0x0A,
160 0x90, 0xB9, 0x00, 0x9A, 0x09, 0x0B, 0x90, 0x0C, 0x90, 0x09,
161 0x00, 0x9D, 0x0A, 0x9E, 0x40, 0x9A, 0x09, 0x0A, 0x9A, 0x09,
162 0xC0, 0xA9, 0xC0, 0x9A, 0x0A, 0x9F, 0x33, 0x00, 0xE3, 0x7E,
163 0x68, 0x2F, 0x52, 0x00, 0x9C, 0x09, 0xA0, 0x90, 0x09, 0xB0,
164 0x9F, 0x02, 0x00, 0x9C, 0x0C, 0x90, 0x9E, 0x20, 0x9A, 0x09,
165 0xC0, 0x9A, 0x09, 0x09, 0xC0, 0x90, 0x9E, 0x30, 0x9A, 0x09,
166 0x09, 0xA0, 0x9A, 0x09, 0x09, 0xE1, 0x09, 0x09, 0xA0, 0x90,
167 0x09, 0xA0, 0x90, 0x9C, 0x09, 0xA0, 0x9E, 0x00, 0x90, 0x09,
168 0x00, 0x99, 0x00, 0x90, 0x9D, 0x09, 0x09, 0xA0, 0x90, 0x09,
169 0xA0, 0x90, 0x9C, 0x09, 0xA0, 0x9E, 0x60, 0x99, 0xA0, 0xE0,
170 0x9F, 0x92, 0x00, 0x99, 0xD0, 0x99, 0xF0, 0x30, 0x09, 0x00,
171 0x9F, 0x03, 0x00, 0xE0, 0x9A, 0x09, 0x9F, 0x92, 0x00, 0x9A,
172 0x09, 0x09, 0x09, 0xA0, 0xC9, 0x09, 0xC0, 0x9A, 0x09, 0x00,
173 0x90, 0x09, 0xE2, 0x09, 0xE3, 0x09, 0xA0, 0x90, 0x9C, 0x09,
174 0xC0, 0x9E, 0x00, 0x9A, 0x09, 0xF4, 0x30, 0x0E, 0x47, 0xE6,
175 0x82, 0xF5, 0x20, 0x09, 0xC0, 0x90, 0x09, 0xA0, 0x9B, 0x09,
176 0xF0, 0x20, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0xE2, 0x09,
177 0xA0, 0x9C, 0x09, 0xA0, 0x90, 0x9A, 0x09, 0x09, 0x00, 0x9E,
178 0x20, 0x9A, 0x09, 0x00, 0x90, 0x09, 0xA0, 0x90, 0x9E, 0x10,
179 0x90, 0x9A, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xA0,
180 0x9E, 0x00, 0x90, 0x09, 0xA0, 0x90, 0x09, 0x09, 0x00, 0x99,
181 0x00, 0x90, 0x9A, 0x09, 0x00, 0x90, 0x09, 0x00, 0x9C, 0x09,
182 0xA0, 0x9E, 0x80, 0x99, 0x09, 0xF1, 0x30, 0x09, 0x90, 0x09,
183 0x9F, 0x23, 0x00, 0x90, 0x09, 0xF6, 0x30, 0x09, 0x09, 0x9F,
184 0xB2, 0x00, 0x9A, 0x09, 0x09, 0x00, 0x90, 0x09, 0xA0, 0x90,
185 0x9C, 0x09, 0xA0, 0x90, 0x09, 0x00, 0x9A, 0x09, 0xC0, 0x9E,
186 0x30, 0x90, 0x09, 0x00, 0x9C, 0x09, 0xC0, 0x9E, 0x00, 0x9A,
187 0x09, 0xF4, 0x30, 0x0E, 0x47, 0xE6, 0x82, 0xF5, 0x20, 0x0C,
188 0x90, 0xA9, 0xA0, 0xA9, 0xA0, 0x9F, 0x12, 0x00, 0xA9, 0x00,
189 0x9A, 0x09, 0x09, 0xC0, 0xB9, 0xB0, 0xC9, 0x00, 0xA9, 0xA0,
190 0xA9, 0x00, 0x9A, 0x09, 0xE1, 0x09, 0xA0, 0x9A, 0x09, 0x00,
191 0xA9, 0x00, 0xC9, 0xC0, 0x9A, 0x0A, 0x90, 0xA9, 0xA0, 0xC9,
192 0x00, 0xA9, 0xE0, 0x0A, 0x90, 0x9A, 0x09, 0xA0, 0x9A, 0x09,
193 0x9A, 0x09, 0xA0, 0xA9, 0x0A, 0x9A, 0x0C, 0x90, 0x0A, 0x9E,
194 0xB0, 0x99, 0xF3, 0x30, 0x09, 0x9F, 0x43, 0x00, 0xB9, 0xF6,
195 0x30, 0x09, 0x9F, 0xE2, 0x00, 0xB9, 0x09, 0xA0, 0x90, 0x9A,
196 0x09, 0x09, 0xC0, 0x9A, 0x09, 0x0A, 0x90, 0x0A, 0x90, 0x0B,
197 0x9E, 0x40, 0xA9, 0xA0, 0xC9, 0x0C, 0x90, 0xC9, 0xA0, 0x9A,
198 0x0C, 0x9F, 0x03, 0x00, 0xE4, 0x7E, 0x58, 0x22, 0xF7, 0x62,
199 0x0E, 0x37, 0xE6, 0x82, 0x2F, 0x66, 0x20, 0xE4, 0x7E, 0x68,
200 0x22, 0xF6, 0x62, 0x0E, 0x47, 0xE5, 0x8A, 0x2F, 0x52, 0x00,
201 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20,
202 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0,
203 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20,
204 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5F, 0xC2,
205 0x00, 0xE3, 0x7E, 0x68, 0xA2, 0xF5, 0x20, 0x0F, 0x62, 0x05,
206 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
207 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
208 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
209 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
210 0x54, 0xFA, 0x20, 0x0E, 0x47, 0xE6, 0x8A, 0x2F, 0x52, 0x00,
211 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
212 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
213 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
214 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
215 0x0F, 0x62, 0x05, 0x4F, 0xA2, 0x00, 0xE4, 0x7E, 0x68, 0xA2,
216 0xF5, 0x20, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F,
217 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xE1,
218 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9,
219 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05,
220 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54,
221 0xE9, 0x0F, 0x81, 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x62,
222 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xFA, 0x20, 0x0E, 0x47,
223 0xE5, 0x8B, 0x2F, 0x52, 0x00, 0xF8, 0x10, 0x5B, 0x9A, 0x59,
224 0xD5, 0x4E, 0x90, 0xF8, 0x10, 0x59, 0xA5, 0xB9, 0xD5, 0x4E,
225 0x90, 0xF8, 0x10, 0x59, 0xD5, 0x9D, 0x54, 0xE9, 0x0F, 0x81,
226 0x05, 0xE1, 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0xB9, 0xA5,
227 0x9D, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x9A, 0x5B, 0x9D, 0x54,
228 0xE9, 0x0F, 0x81, 0x05, 0x9D, 0x59, 0xD5, 0x4E, 0x90, 0xF8,
229 0x10, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
230 0x0F, 0x62, 0x05, 0x4F, 0xA2, 0x00, 0xE3, 0x7E, 0x68, 0xB2,
231 0xF5, 0x20, 0x0E, 0x15, 0x99, 0xE7, 0x5B, 0x9A, 0x59, 0xD5,
232 0x4E, 0x90, 0xD5, 0xC9, 0xE6, 0x59, 0xA5, 0xB9, 0xD5, 0x4E,
233 0x90, 0xD5, 0xC9, 0xE6, 0x59, 0xD5, 0x9D, 0x54, 0xE9, 0x0E,
234 0x25, 0x99, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xC5, 0xD9,
235 0xE6, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xD5, 0xC9, 0xE6,
236 0x59, 0xA5, 0xB9, 0xD5, 0x4E, 0x90, 0xB5, 0xE0, 0x9E, 0x65,
237 0x9D, 0x59, 0xD5, 0x4E, 0x90, 0xC5, 0xC9, 0xE7, 0x5E, 0x19,
238 0xD5, 0x4E, 0x90, 0xC5, 0xC9, 0xFC, 0x10, 0x54, 0xE9, 0x0C,
239 0x5C, 0x9F, 0xC1, 0x05, 0x4F, 0x92, 0x00, 0xE4, 0x7E, 0x68,
240 0xB2, 0xF5, 0x20, 0x0E, 0x05, 0xA9, 0xE7, 0x5B, 0x9A, 0x59,
241 0xD5, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x59, 0xA5,
242 0xB9, 0xD5, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x59,
243 0xD5, 0x9D, 0x54, 0xE9, 0x0E, 0x15, 0xA9, 0xE6, 0x5E, 0x19,
244 0xD5, 0x4E, 0x90, 0xC5, 0x99, 0xEA, 0x5B, 0x9A, 0x59, 0xD5,
245 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x59, 0xA5, 0xB9,
246 0xD5, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE6, 0x59, 0xD5,
247 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0xE1,
248 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05,
249 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xF9,
250 0x20, 0x0E, 0x47, 0xE6, 0x8B, 0x2F, 0x52, 0x00, 0xD5, 0xB9,
251 0xE7, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0x9E, 0x55,
252 0xE1, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E, 0x19,
253 0xD5, 0x4E, 0x90, 0xE0, 0x5B, 0x9E, 0x65, 0xB9, 0xA5, 0x9D,
254 0x54, 0xE9, 0x0C, 0x59, 0x9E, 0xA5, 0xB9, 0xA5, 0x9D, 0x54,
255 0xE9, 0x0C, 0x59, 0x9E, 0xA5, 0xB9, 0xA5, 0x9D, 0x54, 0xE9,
256 0x0E, 0x25, 0x99, 0xE6, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90,
257 0xB5, 0x99, 0xA5, 0x99, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90,
258 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59,
259 0x95, 0x5A, 0x9F, 0xB1, 0x05, 0x4F, 0x92, 0x00, 0xE4, 0x7E,
260 0x58, 0xC2, 0xF5, 0x20, 0x0E, 0x15, 0x99, 0xE7, 0x5E, 0x19,
261 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0x9E, 0x55, 0xE1, 0x9D, 0x54,
262 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E, 0x19, 0xD5, 0x4E, 0x90,
263 0xE0, 0x5B, 0x9E, 0x65, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0C,
264 0x5C, 0x9E, 0x75, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0C, 0x59,
265 0x9E, 0xA5, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x15, 0x99,
266 0xE7, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
267 0x99, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
268 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x95, 0x5A, 0x9F,
269 0xB1, 0x05, 0x4F, 0x92, 0x00, 0xE3, 0x7E, 0x68, 0xC2, 0xF5,
270 0x20, 0x0E, 0x15, 0x99, 0xE7, 0x5E, 0x19, 0xD5, 0x4E, 0x90,
271 0xE3, 0x59, 0x9E, 0x55, 0xE1, 0x9D, 0x54, 0xE9, 0x0E, 0x05,
272 0xB9, 0xE6, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xD5, 0x99, 0x59,
273 0x9E, 0x65, 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x25, 0x99,
274 0xE6, 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xC5, 0xD9, 0xE6,
275 0x5B, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x75,
276 0xB9, 0xA5, 0x9D, 0x54, 0xE9, 0x0C, 0x5C, 0x9E, 0x75, 0xE1,
277 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05,
278 0x4E, 0x90, 0xB5, 0x99, 0x59, 0x59, 0x9F, 0xB1, 0x05, 0x4F,
279 0x82, 0x00, 0xE4, 0x7E, 0x68, 0xC2, 0xF5, 0x20, 0x0E, 0x15,
280 0x99, 0xE7, 0x5E, 0x19, 0xD5, 0x4E, 0x90, 0xE2, 0x59, 0x9E,
281 0x65, 0xE1, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E,
282 0x19, 0xD5, 0x4E, 0x90, 0xD5, 0x99, 0x59, 0x9E, 0x65, 0xE1,
283 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0xE5, 0x5E, 0x19, 0xD5,
284 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE5, 0x5E, 0x19, 0xD5,
285 0x4E, 0x90, 0xE0, 0x59, 0x9E, 0x85, 0xE1, 0x9D, 0x54, 0xE9,
286 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0xE1, 0x9D, 0x54, 0xE9,
287 0x0C, 0x5D, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0x59,
288 0x59, 0x9F, 0xB1, 0x05, 0x4F, 0x82, 0x00, 0xE4, 0x7E, 0x58,
289 0xD2, 0xF5, 0x20, 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9,
290 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0E, 0x35, 0x99,
291 0xFA, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x59, 0x9F, 0xB1,
292 0x05, 0x4E, 0x90, 0xE3, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90,
293 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9, 0x0E, 0x05,
294 0x99, 0xFD, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F,
295 0xB1, 0x05, 0x4E, 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05, 0x4E,
296 0x90, 0xB5, 0xA9, 0x55, 0x99, 0xFB, 0x10, 0x54, 0xF8, 0x20,
297 0x0E, 0x37, 0xE6, 0x8D, 0x2F, 0x52, 0x00, 0xE1, 0x59, 0x9F,
298 0xC1, 0x05, 0x4E, 0x90, 0xE0, 0x59, 0x9F, 0xD1, 0x05, 0x4E,
299 0x90, 0xE3, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5, 0xE0,
300 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xE3, 0x59, 0x9F, 0xA1, 0x05,
301 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9,
302 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
303 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xFB, 0x10,
304 0x54, 0xE9, 0x0B, 0x5A, 0x95, 0x59, 0x9F, 0xB1, 0x05, 0x4F,
305 0x72, 0x00, 0xE4, 0x7E, 0x68, 0xD2, 0xF5, 0x20, 0x0E, 0x15,
306 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F, 0xE1, 0x05,
307 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9,
308 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95,
309 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99,
310 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E,
311 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B,
312 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xB5, 0x99,
313 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xF7, 0x20, 0x0E, 0x47, 0xE6,
314 0x8D, 0x2F, 0x52, 0x00, 0xD5, 0xD9, 0xE4, 0x57, 0xE7, 0x54,
315 0xE9, 0x0C, 0x5E, 0x09, 0xE6, 0x5A, 0x7E, 0x35, 0x4E, 0x90,
316 0xD5, 0xC9, 0xE6, 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0E, 0x25,
317 0x99, 0xE6, 0x57, 0xE6, 0x54, 0xE9, 0x0D, 0x5B, 0x9E, 0x45,
318 0x77, 0x55, 0x7E, 0x55, 0x4E, 0x90, 0xD5, 0xC9, 0xE3, 0x57,
319 0xE9, 0x54, 0xE9, 0x0D, 0x59, 0x9E, 0x55, 0x7E, 0xA5, 0x4E,
320 0x90, 0xC5, 0xC9, 0xE5, 0x57, 0xE8, 0x54, 0xE9, 0x0C, 0x5C,
321 0x9E, 0x65, 0x7E, 0x75, 0x4E, 0x90, 0xC5, 0xC9, 0xFC, 0x10,
322 0x54, 0xF7, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x02, 0xF5, 0x20,
323 0x0F, 0x71, 0x05, 0x7E, 0x75, 0x4E, 0x90, 0xF8, 0x10, 0x57,
324 0xA5, 0x7E, 0x25, 0x4E, 0x90, 0xF8, 0x10, 0x57, 0x57, 0xE4,
325 0x54, 0xE9, 0x0F, 0x71, 0x05, 0xB7, 0xE4, 0x54, 0xE9, 0x0E,
326 0xE5, 0x77, 0x57, 0xE6, 0x54, 0xE9, 0x0E, 0xD5, 0x75, 0x7E,
327 0x85, 0x4E, 0x90, 0xED, 0x57, 0xEA, 0x54, 0xE9, 0x0E, 0xE5,
328 0x7E, 0x95, 0x4E, 0x90, 0xF8, 0x10, 0x57, 0xE6, 0x54, 0xE9,
329 0x0F, 0x62, 0x05, 0x4F, 0x72, 0x00, 0xE3, 0x7E, 0x68, 0xE0,
330 0x2F, 0x52, 0x00, 0xF7, 0x10, 0x57, 0xE7, 0x54, 0xE9, 0x0F,
331 0x81, 0x05, 0x75, 0xA7, 0xE2, 0x54, 0xE9, 0x0F, 0x71, 0x05,
332 0xC7, 0xE3, 0x54, 0xE9, 0x0E, 0xF5, 0x75, 0x7E, 0x65, 0x4E,
333 0x90, 0xF8, 0x10, 0x57, 0xE6, 0x54, 0xE9, 0x0E, 0xE5, 0x7E,
334 0x95, 0x4E, 0x90, 0xEC, 0x57, 0xEB, 0x54, 0xE9, 0x0E, 0xE5,
335 0x7E, 0x95, 0x4E, 0x90, 0xF8, 0x10, 0x57, 0xE6, 0x54, 0xE9,
336 0x0F, 0x62, 0x05, 0x4F, 0x62, 0x00, 0xE4, 0x7E, 0x68, 0xE0,
337 0x2F, 0x52, 0x00, 0xF7, 0x10, 0x57, 0xE7, 0x54, 0xE9, 0x0F,
338 0x81, 0x05, 0x75, 0x75, 0x7E, 0x25, 0x4E, 0x90, 0xF8, 0x10,
339 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0F, 0x71, 0x05, 0xA7, 0xE5,
340 0x54, 0xE9, 0x0F, 0x71, 0x05, 0x7E, 0x75, 0x4E, 0x90, 0xED,
341 0x57, 0x57, 0x57, 0xE6, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
342 0x90, 0xEE, 0x57, 0xE9, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x7E,
343 0x65, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xF6, 0x20, 0x0E, 0x47,
344 0xE5, 0x8E, 0x12, 0xF5, 0x20, 0x0F, 0x71, 0x05, 0x7E, 0x75,
345 0x4E, 0x90, 0xF8, 0x10, 0x57, 0x5A, 0x7E, 0x25, 0x4E, 0x90,
346 0xF7, 0x10, 0x5C, 0x7E, 0x35, 0x4E, 0x90, 0xF8, 0x10, 0x57,
347 0x57, 0xE4, 0x54, 0xE9, 0x0E, 0xF5, 0x7E, 0x85, 0x4E, 0x90,
348 0xED, 0x57, 0x55, 0x7E, 0x75, 0x4E, 0x90, 0xF6, 0x20, 0x54,
349 0xE9, 0x0E, 0xE5, 0x7E, 0x95, 0x4E, 0x90, 0xF8, 0x10, 0x57,
350 0xE6, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4F, 0x62, 0x00, 0xE4,
351 0x7E, 0x58, 0xE1, 0x2F, 0x52, 0x00, 0xF6, 0x20, 0x54, 0xE9,
352 0x0F, 0x81, 0x05, 0x7E, 0x65, 0x4E, 0x90, 0xF8, 0x10, 0x57,
353 0x57, 0xE4, 0x54, 0xE9, 0x0E, 0xF5, 0xB7, 0xE5, 0x54, 0xE9,
354 0x0E, 0xF5, 0x75, 0x77, 0xE5, 0x54, 0xE9, 0x0E, 0xD5, 0x75,
355 0x57, 0xE7, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xEE,
356 0x57, 0xE9, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x7E, 0x65, 0x4E,
357 0x90, 0xEC, 0x5E, 0x37, 0xE2, 0x54, 0xF6, 0x20, 0x0E, 0x37,
358 0xE6, 0x8E, 0x12, 0xF5, 0x20, 0x0F, 0x71, 0x05, 0x7E, 0x75,
359 0x4E, 0x90, 0xF9, 0x10, 0x5A, 0x7E, 0x35, 0x4E, 0x90, 0xF8,
360 0x10, 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0F, 0x81, 0x05, 0x7E,
361 0x65, 0x4E, 0x90, 0xEE, 0x57, 0x55, 0x77, 0xE5, 0x54, 0xE9,
362 0x0E, 0xE5, 0x77, 0x57, 0xE6, 0x54, 0xE9, 0x0F, 0x62, 0x05,
363 0x4E, 0x90, 0xEF, 0x57, 0xE8, 0x54, 0xE9, 0x0F, 0x71, 0x05,
364 0x7E, 0x75, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xF5, 0x20, 0x0E,
365 0x47, 0xE6, 0x8E, 0x12, 0xF5, 0x20, 0x0F, 0x62, 0x05, 0x4E,
366 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
367 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
368 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
369 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
370 0xF5, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x22, 0xF5, 0x20, 0x0F,
371 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
372 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
373 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
374 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
375 0xF6, 0x20, 0x54, 0xF5, 0x20, 0x0E, 0x37, 0xE6, 0x8E, 0x22,
376 0xF5, 0x20, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
377 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
378 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
379 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
380 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xF4, 0x20, 0x0E, 0x47,
381 0xE6, 0x8E, 0x22, 0xF6, 0x20, 0x0F, 0x62, 0x04, 0xEA, 0x0F,
382 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
383 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F,
384 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
385 0xEA, 0x0F, 0x62, 0x04, 0xF4, 0x20, 0x0E, 0x47, 0xE6, 0x8E,
386 0x22, 0xFF, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x32, 0xFF, 0x52,
387 0x0E, 0x37, 0xE6, 0x8E, 0x32, 0xF5, 0x20, 0x0A, 0x7A, 0x0C,
388 0x70, 0xC7, 0xB0, 0xC7, 0x07, 0xA0, 0x7F, 0x71, 0x00, 0xC7,
389 0x07, 0xA0, 0x7F, 0xC2, 0x00, 0x7C, 0x0A, 0x70, 0x7A, 0x07,
390 0x0C, 0x7F, 0x32, 0x00, 0xA7, 0x00, 0xB7, 0x00, 0xC7, 0x07,
391 0xA0, 0x7D, 0x07, 0x07, 0xF8, 0x10, 0x0A, 0x70, 0x07, 0xD0,
392 0xA7, 0xA0, 0xB7, 0x0C, 0x7D, 0x07, 0x07, 0xEA, 0x07, 0xA0,
393 0x70, 0x0A, 0x70, 0x07, 0xA0, 0x70, 0xC7, 0xF0, 0x20, 0x0C,
394 0x70, 0xB7, 0xB0, 0x7B, 0x0B, 0x70, 0xC7, 0xFA, 0x10, 0x0B,
395 0x7A, 0x0A, 0x70, 0x0A, 0x70, 0x7A, 0x07, 0x0C, 0x7F, 0xD1,
396 0x00, 0xA7, 0xB0, 0x7A, 0x0C, 0x7F, 0x62, 0x00, 0xC7, 0x00,
397 0xA7, 0x00, 0xB7, 0x00, 0x7A, 0x07, 0xA0, 0x7A, 0x0C, 0x7F,
398 0x72, 0x00, 0xE4, 0x7E, 0x68, 0xE3, 0x2F, 0x52, 0x00, 0x70,
399 0x07, 0x00, 0x7C, 0x07, 0xE1, 0x07, 0xC0, 0x77, 0x00, 0x7F,
400 0x71, 0x00, 0x7C, 0x07, 0x70, 0x07, 0xFC, 0x20, 0x07, 0xD0,
401 0x70, 0x07, 0x70, 0x07, 0x07, 0xF6, 0x20, 0x07, 0xA0, 0x70,
402 0x7A, 0x07, 0x07, 0xC0, 0x77, 0x00, 0x7D, 0x07, 0x07, 0xF7,
403 0x10, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x70, 0x7C, 0x07,
404 0xE3, 0x07, 0x07, 0xEA, 0x07, 0x70, 0x77, 0x07, 0xA0, 0x70,
405 0x7A, 0x07, 0x07, 0xF4, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x00,
406 0x70, 0x70, 0x07, 0xC0, 0x7F, 0xE1, 0x00, 0x7A, 0x07, 0x07,
407 0xA0, 0x70, 0x07, 0x00, 0x77, 0x00, 0x7A, 0x07, 0xFE, 0x10,
408 0x07, 0xA0, 0x70, 0x07, 0x07, 0xB0, 0x7F, 0x82, 0x00, 0x7C,
409 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x07, 0x70, 0x77, 0x00, 0x70,
410 0x7B, 0x07, 0xF9, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x42, 0xF5,
411 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xE1, 0x07, 0xC0, 0x70,
412 0x70, 0x7F, 0x71, 0x00, 0x7C, 0x07, 0x07, 0x07, 0xFC, 0x20,
413 0x07, 0xD0, 0x70, 0x07, 0x07, 0x07, 0x07, 0xF6, 0x20, 0x07,
414 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xC0, 0x70, 0x70, 0x7C, 0x0C,
415 0x7E, 0xF0, 0x7C, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xC0, 0x7E,
416 0x20, 0xC7, 0xE9, 0x07, 0x07, 0x07, 0x07, 0xA0, 0x70, 0x7A,
417 0x07, 0x07, 0xF4, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xA0,
418 0x70, 0x7C, 0x07, 0xFE, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07,
419 0x00, 0x70, 0x07, 0x07, 0x07, 0xA0, 0x7F, 0xE1, 0x00, 0x7C,
420 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x07, 0xC0, 0x7A, 0x07,
421 0x07, 0xA0, 0x70, 0x70, 0x70, 0x70, 0x7A, 0x07, 0xA0, 0x7F,
422 0x92, 0x00, 0xE4, 0x7E, 0x58, 0xE4, 0x2F, 0x52, 0x00, 0x7A,
423 0x07, 0x0A, 0x7A, 0x0A, 0x7D, 0x0A, 0x7A, 0x07, 0x07, 0x07,
424 0xF7, 0x10, 0x0A, 0x7A, 0x07, 0x07, 0x07, 0xFC, 0x20, 0x07,
425 0xD0, 0x70, 0x07, 0x07, 0x07, 0x0A, 0x7F, 0x42, 0x00, 0x7A,
426 0x07, 0x0B, 0x70, 0x0A, 0x7A, 0x07, 0x07, 0x07, 0xD0, 0x70,
427 0x7F, 0x71, 0x00, 0x7C, 0x07, 0xC0, 0x7A, 0x07, 0x00, 0xA7,
428 0x00, 0xA7, 0xE1, 0x07, 0x07, 0xEA, 0x07, 0x07, 0x07, 0x07,
429 0xA0, 0x70, 0x7A, 0x07, 0x0A, 0x7F, 0x22, 0x00, 0xA7, 0xA0,
430 0xB7, 0x00, 0x7A, 0x07, 0x00, 0xA7, 0x00, 0xA7, 0xFC, 0x10,
431 0x0B, 0x70, 0x07, 0xA0, 0x70, 0x07, 0x00, 0x70, 0x70, 0x7A,
432 0x07, 0xFE, 0x10, 0x07, 0xC0, 0x7A, 0x07, 0xA0, 0x7F, 0x82,
433 0x00, 0xA7, 0xA0, 0x7A, 0x07, 0x0B, 0x70, 0x07, 0x07, 0x07,
434 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x0E, 0x47, 0xE6, 0x8E,
435 0x42, 0xF5, 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xE1, 0x07,
436 0xC0, 0x70, 0x07, 0x7F, 0x71, 0x00, 0x7C, 0x07, 0x00, 0x77,
437 0xFC, 0x20, 0x07, 0xD0, 0x70, 0x07, 0x00, 0x77, 0x07, 0xF6,
438 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0, 0x70, 0x07, 0x7C,
439 0x0C, 0x7E, 0xF0, 0x7C, 0x07, 0xC0, 0x7A, 0x07, 0xC0, 0x70,
440 0x7E, 0x20, 0xC7, 0xE9, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x00,
441 0x70, 0x70, 0x07, 0xF4, 0x20, 0x07, 0xC0, 0x70, 0x7A, 0x0C,
442 0x7C, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xC0, 0x7A, 0x07, 0x00,
443 0x70, 0x07, 0x00, 0x77, 0xA0, 0x7F, 0xE1, 0x00, 0x7C, 0x0C,
444 0x7A, 0x07, 0xF8, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0x07,
445 0xA0, 0x7A, 0x07, 0x0C, 0x7A, 0x07, 0xF8, 0x20, 0x0E, 0x47,
446 0xE6, 0x8E, 0x42, 0xF5, 0x20, 0x07, 0x00, 0x70, 0x07, 0xC0,
447 0x7E, 0x10, 0x7C, 0x07, 0xA0, 0x7F, 0x71, 0x00, 0x7C, 0x07,
448 0xA0, 0x7F, 0xC2, 0x00, 0x7D, 0x07, 0x00, 0x7A, 0x07, 0x07,
449 0xF6, 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0, 0x7A, 0x07,
450 0xD0, 0x70, 0x7F, 0x71, 0x00, 0x7A, 0x07, 0x07, 0xC0, 0x7A,
451 0x07, 0xC0, 0x70, 0x7E, 0x30, 0x70, 0x7E, 0xA0, 0x7A, 0x07,
452 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00, 0x7F, 0x42, 0x00, 0x7C,
453 0x07, 0x00, 0x70, 0x07, 0xA0, 0x7C, 0x07, 0x07, 0xFE, 0x10,
454 0x07, 0xC0, 0x7A, 0x07, 0x00, 0x70, 0x07, 0xA0, 0x7A, 0x07,
455 0xFE, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x82,
456 0x00, 0x7C, 0x07, 0xA0, 0x70, 0x70, 0x07, 0x00, 0x7A, 0x07,
457 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x0E, 0x47, 0xE5, 0x8E,
458 0x52, 0xF5, 0x20, 0x0A, 0x7A, 0x0C, 0x70, 0x7E, 0x10, 0x7C,
459 0x07, 0xA0, 0x7F, 0x71, 0x00, 0x7C, 0x07, 0xA0, 0x7F, 0xC2,
460 0x00, 0xC7, 0x0A, 0x70, 0x7A, 0x07, 0x0C, 0x7F, 0x32, 0x00,
461 0xA7, 0x00, 0x7C, 0x0C, 0x70, 0x7A, 0x07, 0xD0, 0x70, 0x7F,
462 0x81, 0x00, 0xA7, 0x00, 0xC7, 0x00, 0xA7, 0x00, 0xB7, 0x00,
463 0xC7, 0xD0, 0x70, 0x7E, 0xA0, 0x7A, 0x07, 0x00, 0xA7, 0xB0,
464 0x7A, 0x0C, 0x7F, 0x02, 0x00, 0xC7, 0x07, 0xA0, 0x70, 0x7A,
465 0x07, 0x0B, 0x70, 0x0C, 0x7F, 0xA1, 0x00, 0x7D, 0x0A, 0x70,
466 0x0A, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0xF1, 0x00, 0xA7, 0x00,
467 0x7A, 0x07, 0xA0, 0x7F, 0x82, 0x00, 0x7D, 0x0A, 0x70, 0x07,
468 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20,
469 0x0E, 0x37, 0xE6, 0x8E, 0x52, 0xFC, 0x52, 0x0E, 0x47, 0xE6,
470 0x8E, 0x52, 0xFC, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xFC,
471 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xFC, 0x52, 0x0E, 0x37,
472 0xE6, 0x8E, 0x62, 0xFB, 0x52, 0x0E, 0x47, 0xE6, 0x8E, 0x52,
473 0x1F, 0xB5, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x21, 0xFB, 0x52,
474 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0x1F, 0xA5, 0x20, 0xE4, 0x7E,
475 0x68, 0xE6, 0x21, 0xFA, 0x52, 0x0E, 0x47, 0xE6, 0x8E, 0x52,
476 0x11, 0xFA, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0x11, 0xFA,
477 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0x11, 0xF9, 0x52, 0x0E,
478 0x47, 0xE6, 0x8E, 0x52, 0xA1, 0xF1, 0x40, 0x0B, 0x20, 0xA2,
479 0x02, 0xA0, 0x2F, 0x92, 0x00, 0xA2, 0xA0, 0xA2, 0xA0, 0xB2,
480 0xF5, 0x20, 0x0C, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xF7, 0x20,
481 0x0A, 0x20, 0x2A, 0x02, 0x0C, 0x2F, 0x82, 0x00, 0xB2, 0x00,
482 0x2A, 0x02, 0x0A, 0x2F, 0x92, 0x00, 0xB2, 0x0C, 0x20, 0xB2,
483 0xE1, 0x02, 0xFF, 0x10, 0x0A, 0x20, 0x02, 0xA0, 0x20, 0xB2,
484 0xE1, 0x02, 0xFF, 0x10, 0x0A, 0x2A, 0x0A, 0x20, 0x0A, 0x2A,
485 0x0C, 0x2F, 0x02, 0x00, 0xB2, 0x00, 0xC2, 0x0C, 0x20, 0x2A,
486 0x02, 0xF0, 0x20, 0x0C, 0x2A, 0x02, 0xA0, 0xB2, 0xFA, 0x10,
487 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xA1, 0xF0, 0x40, 0x02, 0xD0,
488 0x20, 0x02, 0x20, 0x02, 0xF8, 0x20, 0x02, 0xA0, 0x20, 0x2A,
489 0x02, 0x02, 0xFB, 0x20, 0x02, 0xB0, 0x20, 0x20, 0x02, 0x20,
490 0x02, 0xF8, 0x20, 0x02, 0x00, 0x22, 0x00, 0x2A, 0x02, 0xFA,
491 0x20, 0x02, 0xA0, 0x20, 0x22, 0x00, 0x20, 0x20, 0x02, 0xF7,
492 0x20, 0x02, 0xE0, 0x02, 0xA0, 0x2A, 0x02, 0xD0, 0xB2, 0xFC,
493 0x10, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0x02, 0xA0, 0x2D, 0x0B,
494 0x2F, 0xC1, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x20, 0x02,
495 0x00, 0x2F, 0x42, 0x00, 0x2A, 0x02, 0x02, 0xC0, 0x2C, 0x02,
496 0x00, 0x2F, 0x32, 0x00, 0x2B, 0x02, 0x02, 0x00, 0x2A, 0x02,
497 0xF9, 0x10, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xA1, 0xF0, 0x40,
498 0x02, 0xD0, 0x20, 0x02, 0x02, 0x02, 0xF8, 0x20, 0x02, 0xC0,
499 0x2A, 0x02, 0x02, 0xFB, 0x20, 0x02, 0xA0, 0x2A, 0x02, 0x02,
500 0x02, 0x02, 0xF8, 0x20, 0x02, 0x00, 0x20, 0x20, 0x2A, 0x02,
501 0xFA, 0x20, 0x02, 0xA0, 0x20, 0x20, 0x20, 0x20, 0x2A, 0x02,
502 0xF6, 0x20, 0x02, 0xE0, 0x02, 0xA0, 0x2A, 0x02, 0xC0, 0x20,
503 0x2F, 0xE1, 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xC0,
504 0x20, 0x2F, 0xE1, 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02,
505 0x02, 0xF4, 0x20, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xC0, 0x20,
506 0x2F, 0x42, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xF9,
507 0x10, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xA1, 0xF1, 0x40, 0x0A,
508 0x2A, 0x02, 0x00, 0x20, 0x20, 0x2F, 0x82, 0x00, 0x2C, 0x02,
509 0xA0, 0x20, 0x0A, 0x2F, 0x82, 0x00, 0x2A, 0x02, 0xA0, 0x20,
510 0x20, 0x20, 0x2F, 0x82, 0x00, 0x20, 0x02, 0x02, 0x02, 0xA0,
511 0x2F, 0xA2, 0x00, 0xB2, 0x00, 0x20, 0x20, 0x20, 0x2A, 0x02,
512 0xF7, 0x20, 0x0A, 0x2B, 0x02, 0xA0, 0xB2, 0xE0, 0x0A, 0x2F,
513 0xD1, 0x00, 0x2C, 0x0C, 0x20, 0xB2, 0xE0, 0x0A, 0x2F, 0xD1,
514 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0x0A, 0x2F, 0x22,
515 0x00, 0xB2, 0x00, 0xA2, 0xA0, 0xA2, 0xA0, 0x22, 0xF5, 0x20,
516 0x02, 0xA0, 0x2A, 0x02, 0x0B, 0x2F, 0x91, 0x00, 0xE4, 0x7E,
517 0x68, 0xE5, 0x2B, 0x1F, 0x44, 0x00, 0x20, 0x02, 0x00, 0x20,
518 0x02, 0x2F, 0x82, 0x00, 0x2C, 0x02, 0xA0, 0x2C, 0x02, 0xF7,
519 0x20, 0x02, 0xA0, 0xC2, 0x02, 0x00, 0x22, 0xF8, 0x20, 0x02,
520 0x00, 0x20, 0x02, 0x2A, 0x02, 0xFA, 0x20, 0x02, 0x02, 0xA0,
521 0x20, 0x02, 0x20, 0x2A, 0x02, 0xFA, 0x20, 0x02, 0xA0, 0x2A,
522 0x02, 0x02, 0xE2, 0x02, 0x02, 0xFC, 0x10, 0x02, 0xC0, 0x2A,
523 0x02, 0x02, 0x02, 0xE2, 0x02, 0x02, 0xFC, 0x10, 0x02, 0xC0,
524 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2F, 0x42, 0x00, 0x2C, 0x02,
525 0xC0, 0x2C, 0x02, 0x02, 0xF4, 0x20, 0x02, 0xA0, 0xC2, 0x02,
526 0xA0, 0x2F, 0x81, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2B, 0x1F,
527 0x44, 0x00, 0x20, 0x02, 0x00, 0x2A, 0x02, 0xF8, 0x20, 0x02,
528 0xA0, 0x20, 0x2A, 0x02, 0xC0, 0x2F, 0x72, 0x00, 0x2A, 0x02,
529 0xA0, 0x20, 0x2A, 0x02, 0xF8, 0x20, 0x02, 0x00, 0x2A, 0x02,
530 0xA0, 0x2F, 0xA2, 0x00, 0x20, 0x02, 0x00, 0x2A, 0x02, 0x02,
531 0x00, 0x2F, 0xB2, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x02, 0xD0,
532 0xB2, 0xFD, 0x10, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0x02, 0x00,
533 0x2D, 0x0B, 0x2F, 0xD1, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20,
534 0x20, 0x02, 0x00, 0x2F, 0x42, 0x00, 0x2C, 0x02, 0xC0, 0x2C,
535 0x02, 0x00, 0x2F, 0x32, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x2A,
536 0x02, 0xF8, 0x10, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xB1, 0xF0,
537 0x40, 0x0B, 0x20, 0x0A, 0x20, 0x2A, 0x02, 0xF9, 0x20, 0x0A,
538 0x2A, 0x0A, 0x20, 0x0B, 0x2F, 0x82, 0x00, 0x2A, 0x02, 0xA0,
539 0x20, 0x2A, 0x02, 0xF7, 0x20, 0x0A, 0x20, 0x2A, 0x02, 0xA0,
540 0x2F, 0xA2, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0xA2, 0xF8,
541 0x20, 0x0B, 0x2B, 0x02, 0xA0, 0x2A, 0x02, 0xE0, 0x02, 0xFF,
542 0x10, 0x0A, 0x20, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xE0, 0x02,
543 0xFF, 0x10, 0x0A, 0x2A, 0x0A, 0x20, 0x0A, 0x2A, 0x0C, 0x2F,
544 0x02, 0x00, 0x2C, 0x0C, 0x20, 0xC2, 0x02, 0xA0, 0x2F, 0x22,
545 0x00, 0x2A, 0x02, 0xA0, 0x20, 0xB2, 0xF8, 0x10, 0x0E, 0x47,
546 0xE6, 0x8E, 0x52, 0xC1, 0xF7, 0x52, 0x0E, 0x47, 0xE6, 0x8E,
547 0x52, 0xC1, 0xF7, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xC1,
548 0xF7, 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xC1, 0xF0, 0x40,
549 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62,
550 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA,
551 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62,
552 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0x0E,
553 0x47, 0xE6, 0x8E, 0x52, 0xD1, 0xF0, 0x40, 0x0F, 0x62, 0x05,
554 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
555 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
556 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
557 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
558 0x54, 0xE4, 0x7E, 0x68, 0xE5, 0x2D, 0x1F, 0x04, 0x00, 0xF6,
559 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
560 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
561 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
562 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
563 0x62, 0x05, 0x4E, 0x47, 0xE5, 0x8E, 0x62, 0xD1, 0xF0, 0x40,
564 0x0D, 0x5C, 0x9E, 0x45, 0x7E, 0x85, 0x4E, 0x90, 0xC5, 0x99,
565 0xA5, 0x99, 0xE5, 0x57, 0x57, 0xE4, 0x54, 0xE9, 0x0C, 0x5E,
566 0x09, 0xD5, 0x7E, 0xC5, 0x4E, 0x90, 0xB5, 0xD9, 0xE8, 0x57,
567 0xE5, 0x54, 0xE9, 0x0D, 0x5D, 0x9E, 0x35, 0x7E, 0x85, 0x4E,
568 0x90, 0xD5, 0x99, 0x55, 0x99, 0xE1, 0x57, 0xA5, 0x7A, 0x57,
569 0x5A, 0x7C, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65,
570 0xA7, 0x55, 0xB7, 0xC5, 0x4E, 0x90, 0xD5, 0xD9, 0xE5, 0x57,
571 0xA5, 0xC7, 0xC5, 0x4E, 0x90, 0xD5, 0xC9, 0xFB, 0x10, 0x54,
572 0xE9, 0x0C, 0x5D, 0x9F, 0xB1, 0x05, 0x4E, 0x37, 0xE6, 0x8E,
573 0x62, 0xD1, 0xF0, 0x40, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x25,
574 0x7E, 0x95, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE4, 0x57,
575 0xA5, 0x7E, 0x35, 0x4E, 0x90, 0xC5, 0x99, 0xE5, 0x57, 0xEB,
576 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0x7E, 0x65,
577 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x65, 0x7E, 0x75, 0x4E, 0x90,
578 0xD5, 0x99, 0x55, 0x99, 0xE0, 0x57, 0x57, 0x55, 0x77, 0x55,
579 0x75, 0x75, 0x57, 0xB5, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99,
580 0xE5, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0xB5, 0x4E, 0x90, 0xE1,
581 0x59, 0x9E, 0x65, 0x75, 0x7B, 0x57, 0xE0, 0x54, 0xE9, 0x0C,
582 0x59, 0x9A, 0x59, 0x9E, 0x85, 0x77, 0xE2, 0x54, 0xE9, 0x0C,
583 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x37, 0xE6, 0x8E,
584 0x52, 0xE0, 0x1F, 0x04, 0x00, 0xC5, 0x99, 0xA5, 0x99, 0xE1,
585 0x57, 0xA5, 0xC7, 0xE2, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x95,
586 0x99, 0xE3, 0x57, 0xC5, 0x7E, 0x25, 0x4E, 0x90, 0xC5, 0x99,
587 0xE6, 0x57, 0x55, 0xC7, 0xE3, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
588 0x59, 0x9E, 0x55, 0x7E, 0x75, 0x4E, 0x90, 0xE1, 0x59, 0x9E,
589 0x75, 0x7E, 0x65, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xD5,
590 0x7A, 0x57, 0x57, 0x57, 0x57, 0x57, 0xA5, 0x7A, 0x54, 0xE9,
591 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x55, 0x7A, 0x57, 0x57, 0xA5,
592 0x7B, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE5, 0x57, 0xA5, 0x7A,
593 0x57, 0xE0, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x85,
594 0x77, 0xE2, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1,
595 0x05, 0x4E, 0x37, 0xE5, 0x8E, 0x62, 0xE0, 0x1F, 0x04, 0x00,
596 0xC5, 0x99, 0xA5, 0x99, 0xE0, 0x57, 0xEB, 0x54, 0xE9, 0x0C,
597 0x59, 0x95, 0x95, 0x99, 0xE2, 0x57, 0xE0, 0x57, 0xE1, 0x54,
598 0xE9, 0x0C, 0x59, 0x9E, 0x75, 0x7E, 0x95, 0x4E, 0x90, 0xB5,
599 0x99, 0xA5, 0x99, 0xE4, 0x57, 0xE8, 0x54, 0xE9, 0x0E, 0x15,
600 0x99, 0xE8, 0x57, 0xE5, 0x54, 0xE9, 0x0D, 0x59, 0x95, 0x59,
601 0x9D, 0x57, 0xA5, 0x75, 0x75, 0x75, 0x75, 0x7A, 0x57, 0xA5,
602 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE5, 0x57, 0xA5, 0x75,
603 0xB7, 0xC5, 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x55, 0x7A, 0x57,
604 0xA5, 0x7E, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA,
605 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0xA5, 0x75,
606 0x7D, 0x54, 0xE2, 0x7E, 0x68, 0xE6, 0x2E, 0x01, 0xF0, 0x40,
607 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x15, 0x7E, 0xA5, 0x4E, 0x90,
608 0xC5, 0x99, 0x59, 0x59, 0x9E, 0x35, 0x7C, 0x57, 0xE2, 0x54,
609 0xE9, 0x0C, 0x5C, 0x9E, 0x35, 0x7E, 0xA5, 0x4E, 0x90, 0xB5,
610 0xD9, 0xE6, 0x57, 0xE7, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE7,
611 0x57, 0xE6, 0x54, 0xE9, 0x0E, 0x05, 0xB9, 0xE0, 0x5C, 0x75,
612 0x75, 0x57, 0x75, 0x7A, 0x57, 0xA5, 0x4E, 0x90, 0xB5, 0x99,
613 0xA5, 0x99, 0xE5, 0x57, 0xA5, 0x75, 0x75, 0x7D, 0x54, 0xE9,
614 0x0E, 0x15, 0x99, 0xE5, 0x5C, 0x7A, 0x57, 0xE0, 0x54, 0xE9,
615 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5,
616 0xD9, 0xEB, 0x57, 0x57, 0xD5, 0x4E, 0x27, 0xE6, 0x8E, 0x52,
617 0xE1, 0x1F, 0x04, 0x00, 0xC5, 0x99, 0xA5, 0x99, 0xE2, 0x57,
618 0x55, 0xC7, 0xE2, 0x54, 0xE9, 0x0C, 0x5E, 0x09, 0xE4, 0x57,
619 0xA5, 0x7E, 0x35, 0x4E, 0x90, 0xC5, 0x99, 0xE5, 0x57, 0xA5,
620 0xC7, 0xE3, 0x54, 0xE9, 0x0B, 0x59, 0x95, 0x99, 0xE8, 0x57,
621 0xE6, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE6, 0x57, 0xE7, 0x54,
622 0xE9, 0x0E, 0x15, 0x99, 0xE1, 0x57, 0xA5, 0x75, 0x7A, 0x57,
623 0x57, 0x55, 0x7B, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E,
624 0x55, 0x7A, 0x57, 0x57, 0x55, 0x7C, 0x54, 0xE9, 0x0E, 0x15,
625 0x99, 0xE5, 0x57, 0xA5, 0x7A, 0x57, 0xE0, 0x54, 0xE9, 0x0C,
626 0x59, 0x9A, 0x59, 0x9E, 0x85, 0x77, 0xE2, 0x54, 0xE9, 0x0C,
627 0x59, 0x9F, 0xF1, 0x05, 0x4E, 0x27, 0xE6, 0x8E, 0x52, 0xE1,
628 0x1F, 0x04, 0x00, 0xC5, 0x99, 0xA5, 0x99, 0xE3, 0x57, 0xE8,
629 0x54, 0xE9, 0x0C, 0x5E, 0x09, 0xE5, 0x57, 0x57, 0xE4, 0x54,
630 0xE9, 0x0C, 0x59, 0x9E, 0x45, 0x7E, 0xC5, 0x4E, 0x90, 0xB5,
631 0x99, 0x55, 0x99, 0xE8, 0x57, 0xE5, 0x54, 0xE9, 0x0E, 0x15,
632 0x99, 0xE5, 0x57, 0xE8, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xE1,
633 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x5A, 0x7C, 0x54, 0xE9, 0x0B,
634 0x59, 0x9A, 0x59, 0x9E, 0x65, 0xA7, 0x55, 0x7A, 0x57, 0xB5,
635 0x4E, 0x90, 0xE1, 0x59, 0x9E, 0x55, 0x7A, 0x57, 0xA5, 0x7E,
636 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE9, 0x57, 0xE2,
637 0x54, 0xE9, 0x0C, 0x59, 0x9F, 0xF1, 0x05, 0x4E, 0x27, 0xE5,
638 0x8E, 0x62, 0xE1, 0x1F, 0x04, 0x00, 0xC5, 0xB9, 0x59, 0x9F,
639 0xA1, 0x05, 0x4E, 0x90, 0xD5, 0xC9, 0xFB, 0x10, 0x54, 0xE9,
640 0x0C, 0x59, 0x9F, 0xF1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0x55,
641 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xFC, 0x10,
642 0x54, 0xE9, 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0B,
643 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xE1, 0x59,
644 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE8,
645 0x57, 0xE3, 0x54, 0xE9, 0x0C, 0x59, 0x9F, 0xF1, 0x05, 0x4E,
646 0x17, 0xE6, 0x8E, 0x62, 0xE1, 0x1F, 0x04, 0x00, 0xC5, 0x99,
647 0x5B, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x59, 0x9F,
648 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9,
649 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xE1,
650 0x59, 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xE1, 0x59, 0x9F, 0xC1,
651 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54,
652 0xE9, 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0C, 0x59,
653 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF,
654 0x10, 0x54, 0xE1, 0x7E, 0x68, 0xE5, 0x2E, 0x21, 0xF0, 0x40,
655 0x0D, 0x5C, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x59,
656 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0xE0, 0x9F, 0xA1, 0x05,
657 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9,
658 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0E, 0x15, 0x99,
659 0xFC, 0x10, 0x54, 0xE9, 0x0C, 0x5C, 0x9F, 0xC1, 0x05, 0x4E,
660 0x90, 0xD5, 0xD9, 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x5C, 0x9F,
661 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE1,
662 0x7E, 0x68, 0xE5, 0x2E, 0x21, 0xF0, 0x40, 0x0E, 0x35, 0x99,
663 0xFA, 0x10, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
664 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
665 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
666 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
667 0x0F, 0x62, 0x05, 0x4E, 0x17, 0xE5, 0x8E, 0x62, 0xE2, 0x1F,
668 0x04, 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
669 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
670 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
671 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
672 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x07, 0xE6, 0x8E, 0x62,
673 0xE2, 0x1F, 0x04, 0x00, 0xE3, 0x5B, 0x95, 0x59, 0xD5, 0xA9,
674 0x55, 0xC9, 0xC5, 0x4E, 0x90, 0xE2, 0x5A, 0x9A, 0x5B, 0x9B,
675 0x59, 0xA5, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x5B, 0x95,
676 0x5C, 0x95, 0x9A, 0x59, 0xC5, 0x4E, 0x90, 0xE9, 0x5B, 0x95,
677 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5, 0x4E, 0x90, 0xE4, 0x5B,
678 0x9B, 0x59, 0xA5, 0x9A, 0x59, 0x5A, 0x9D, 0x54, 0xE9, 0x05,
679 0x5B, 0x95, 0x5C, 0x95, 0xC9, 0x59, 0xA5, 0x95, 0xB9, 0x55,
680 0x9A, 0x59, 0x54, 0xE9, 0x0F, 0x91, 0x05, 0xA9, 0x5C, 0x9B,
681 0x54, 0xE9, 0x0E, 0x05, 0xA9, 0x59, 0xA5, 0x95, 0xB9, 0x55,
682 0x9A, 0x59, 0x5C, 0x9B, 0x54, 0xE9, 0x0E, 0x35, 0xB9, 0xA5,
683 0xA9, 0x55, 0x9A, 0x59, 0x5C, 0x9C, 0x54, 0xE9, 0x0E, 0x25,
684 0xB9, 0x55, 0xB9, 0x55, 0xA9, 0x59, 0xA5, 0x95, 0xC9, 0x55,
685 0x4E, 0x07, 0xE6, 0x8E, 0x52, 0xE3, 0x1F, 0x04, 0x00, 0xE3,
686 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54,
687 0xE9, 0x0E, 0x25, 0x95, 0x59, 0x55, 0x9A, 0x59, 0x55, 0x95,
688 0x95, 0x59, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x95, 0x9A, 0x59,
689 0x59, 0xC5, 0x99, 0x59, 0x9C, 0x54, 0xE9, 0x0E, 0x95, 0x9A,
690 0x59, 0x59, 0xA5, 0x95, 0x99, 0x55, 0x9C, 0x54, 0xE9, 0x0E,
691 0x45, 0x9A, 0x59, 0x55, 0x95, 0x95, 0x59, 0x95, 0x59, 0x59,
692 0x55, 0x9C, 0x54, 0xE9, 0x05, 0x59, 0xA5, 0x95, 0x9E, 0x05,
693 0x9A, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x95, 0x59, 0x54,
694 0xE9, 0x0F, 0xA1, 0x05, 0x95, 0x59, 0xE1, 0x54, 0xE9, 0x0E,
695 0x15, 0x95, 0x59, 0x95, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59,
696 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x9A, 0x59, 0x59, 0xA5,
697 0x95, 0x95, 0x59, 0x55, 0x9E, 0x25, 0x4E, 0x90, 0xE2, 0x59,
698 0xA5, 0x95, 0x9A, 0x59, 0x55, 0x95, 0x59, 0x95, 0x59, 0xA5,
699 0x9B, 0x54, 0xE0, 0x7E, 0x58, 0xE6, 0x2E, 0x31, 0xF0, 0x40,
700 0x0E, 0x35, 0x9A, 0x59, 0x59, 0xC5, 0x9A, 0x59, 0xA5, 0x9E,
701 0x05, 0x4E, 0x90, 0xE2, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59,
702 0xA5, 0x95, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x59, 0xA5,
703 0x95, 0x9C, 0x59, 0x59, 0x59, 0xC5, 0x4E, 0x90, 0xE9, 0x59,
704 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x59, 0x59, 0xC5, 0x4E, 0x90,
705 0xE4, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x59, 0x59, 0x59,
706 0xA5, 0x9B, 0x54, 0xE9, 0x05, 0x59, 0xA5, 0x95, 0x9E, 0x05,
707 0x9A, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0x59, 0x59, 0x54,
708 0xE9, 0x0F, 0xA1, 0x05, 0x95, 0x59, 0xE1, 0x54, 0xE9, 0x0E,
709 0x15, 0x95, 0x59, 0x59, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59,
710 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x35, 0x9A, 0x59, 0x59, 0xA5,
711 0x95, 0x95, 0x9A, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x25, 0x9A,
712 0x59, 0x59, 0xA5, 0x95, 0x59, 0x55, 0x95, 0x95, 0x9A, 0x59,
713 0xB5, 0x4D, 0x7E, 0x68, 0xE6, 0x2E, 0x31, 0xF0, 0x40, 0x0E,
714 0x35, 0xB9, 0x55, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54,
715 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x5B, 0x95, 0x59, 0xA5, 0x95,
716 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x5B, 0x95, 0x5A, 0x9A,
717 0x59, 0x59, 0x59, 0xC5, 0x4E, 0x90, 0xE9, 0x5B, 0x95, 0x59,
718 0xA5, 0x95, 0x95, 0x95, 0x9C, 0x54, 0xE9, 0x0E, 0x45, 0xB9,
719 0x55, 0x9A, 0x59, 0x59, 0x59, 0x59, 0x59, 0xA5, 0x9B, 0x54,
720 0xE9, 0x05, 0x5B, 0x95, 0x5A, 0x9C, 0x59, 0xA5, 0x9A, 0x59,
721 0x5B, 0x95, 0x59, 0x59, 0x59, 0x54, 0xE9, 0x0F, 0xA1, 0x05,
722 0x95, 0x5A, 0x9D, 0x54, 0xE9, 0x0E, 0x15, 0x95, 0x59, 0x59,
723 0x59, 0x5B, 0x95, 0x59, 0xA5, 0x9A, 0x59, 0xD5, 0x4E, 0x90,
724 0xE3, 0x5B, 0x95, 0x59, 0xA5, 0x95, 0x99, 0xB5, 0xA9, 0xE0,
725 0x54, 0xE9, 0x0E, 0x25, 0xB9, 0x55, 0xB9, 0xA5, 0x95, 0x59,
726 0x59, 0x59, 0xA5, 0x9B, 0x54, 0xD7, 0xE6, 0x8E, 0x52, 0xE4,
727 0x1F, 0x04, 0x00, 0xE3, 0x59, 0xC5, 0x9C, 0x59, 0xA5, 0x9A,
728 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x59, 0x59,
729 0xA5, 0xC9, 0x59, 0x59, 0x59, 0xD5, 0x4E, 0x90, 0xE9, 0x59,
730 0x59, 0xA5, 0x9C, 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x95,
731 0x95, 0x9A, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x9C, 0x54, 0xE9,
732 0x0E, 0x45, 0x95, 0x9A, 0x5C, 0x95, 0x95, 0x59, 0x95, 0x9A,
733 0x59, 0xB5, 0x4E, 0x90, 0x55, 0x95, 0x9A, 0x59, 0xE0, 0x59,
734 0xA5, 0x9A, 0x59, 0x59, 0x59, 0xA5, 0x95, 0x59, 0x95, 0x4E,
735 0x90, 0xFA, 0x10, 0x59, 0x55, 0x9E, 0x15, 0x4E, 0x90, 0xE1,
736 0x59, 0x55, 0x95, 0x59, 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59,
737 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0x59,
738 0xA5, 0x9E, 0x25, 0x4E, 0x90, 0xE2, 0x59, 0xC5, 0x95, 0x9B,
739 0x59, 0x55, 0x95, 0x59, 0x9A, 0x59, 0xB5, 0x4D, 0x7E, 0x68,
740 0xE5, 0x2E, 0x41, 0xF0, 0x40, 0x0E, 0x35, 0x9C, 0x59, 0xC5,
741 0x9A, 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90, 0xE2, 0x59, 0x55,
742 0x95, 0x59, 0x55, 0x95, 0x59, 0xA5, 0x95, 0x95, 0x95, 0x9D,
743 0x54, 0xE9, 0x0E, 0x95, 0x95, 0x59, 0x55, 0x9C, 0x59, 0xA5,
744 0x9C, 0x54, 0xE9, 0x0E, 0x95, 0x95, 0x59, 0x55, 0x9A, 0x59,
745 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x45, 0x95, 0x59, 0x55,
746 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x95, 0x59, 0xC5, 0x4E, 0x90,
747 0x55, 0x95, 0x59, 0x55, 0x9E, 0x05, 0x9A, 0x59, 0xA5, 0x95,
748 0x95, 0x59, 0x55, 0x9A, 0x59, 0x54, 0xE9, 0x0F, 0xA1, 0x05,
749 0x95, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x15, 0x95, 0x59, 0xA5,
750 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE3,
751 0x59, 0xC5, 0x9A, 0x59, 0x59, 0x55, 0x95, 0x59, 0xE2, 0x54,
752 0xE9, 0x0E, 0x25, 0x9C, 0x59, 0x55, 0x9A, 0x59, 0x55, 0x9A,
753 0x59, 0xA5, 0x9B, 0x54, 0xD7, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
754 0x04, 0x00, 0xE3, 0x59, 0xC5, 0xC9, 0x55, 0xA9, 0xB5, 0x9E,
755 0x05, 0x4E, 0x90, 0xE2, 0x5A, 0x9A, 0x59, 0xA5, 0x95, 0x9A,
756 0x59, 0x55, 0x95, 0x9E, 0x05, 0x4E, 0x90, 0xE9, 0x59, 0xA5,
757 0x95, 0xC9, 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x95, 0x9A,
758 0x59, 0x55, 0xA9, 0x55, 0x9A, 0x59, 0xC5, 0x4E, 0x90, 0xE4,
759 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0xA9, 0xD5,
760 0x4E, 0x90, 0x55, 0x9A, 0x59, 0x5C, 0x9A, 0x59, 0xB5, 0xA9,
761 0x55, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x4E, 0x90, 0xF9, 0x10,
762 0x5A, 0x95, 0x9E, 0x15, 0x4E, 0x90, 0xE0, 0x5A, 0x95, 0x9A,
763 0x59, 0x59, 0xD5, 0xA9, 0xB5, 0x9D, 0x54, 0xE9, 0x0E, 0x35,
764 0x9D, 0x5A, 0x95, 0x59, 0xA5, 0x95, 0xC9, 0xC5, 0x4E, 0x90,
765 0xE2, 0x59, 0xC5, 0x9A, 0x59, 0x5A, 0x95, 0x9A, 0x59, 0xA5,
766 0x9B, 0x54, 0xC7, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x04, 0x00,
767 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
768 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
769 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
770 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
771 0x0F, 0x62, 0x05, 0x4C, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0,
772 0x40, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
773 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
774 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
775 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
776 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xC7, 0xE5, 0x8E, 0x62, 0xE4,
777 0x1F, 0x24, 0x00, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E,
778 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6,
779 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E,
780 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6, 0x20, 0x4E, 0xA0, 0xF6,
781 0x20, 0x4C, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E,
782 0x37, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x05, 0x20, 0xE4, 0x7E,
783 0x68, 0xE5, 0x2E, 0x51, 0xF3, 0x40, 0x07, 0xB0, 0xB7, 0x07,
784 0xA0, 0x7F, 0x82, 0x00, 0x7B, 0x0A, 0x7A, 0x0B, 0x7F, 0x82,
785 0x00, 0x7A, 0x0C, 0x70, 0x7A, 0x07, 0xF6, 0x20, 0x07, 0xA0,
786 0x70, 0xC7, 0x0B, 0x70, 0x0A, 0x70, 0xC7, 0x07, 0xA0, 0x7E,
787 0xF0, 0x7A, 0x07, 0x0C, 0x70, 0xB7, 0xA0, 0xA7, 0x00, 0xC7,
788 0xFA, 0x10, 0x0A, 0x7F, 0x43, 0x00, 0xA7, 0xF5, 0x30, 0x0A,
789 0x70, 0x7A, 0x07, 0xFE, 0x20, 0x0A, 0x70, 0x07, 0xA0, 0x70,
790 0xC7, 0xF9, 0x20, 0x0B, 0x7F, 0x91, 0x00, 0xE4, 0x7E, 0x58,
791 0xE6, 0x2E, 0x41, 0xF3, 0x40, 0x07, 0x07, 0x00, 0x7C, 0x07,
792 0x70, 0x07, 0xF7, 0x20, 0x07, 0x07, 0x00, 0x7A, 0x07, 0x07,
793 0xFB, 0x20, 0x07, 0x07, 0xB0, 0x7A, 0x07, 0x70, 0x07, 0xF6,
794 0x20, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x70, 0x07, 0x00,
795 0x7C, 0x07, 0xA0, 0x7E, 0xF0, 0x77, 0x07, 0x70, 0x7C, 0x07,
796 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xF8, 0x30,
797 0x07, 0xF6, 0x30, 0x07, 0x00, 0x77, 0x00, 0x7F, 0xD2, 0x00,
798 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xFA, 0x20, 0x07, 0xB0,
799 0x7F, 0x81, 0x00, 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41, 0xF2,
800 0x40, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0x07, 0x07, 0xF6, 0x20,
801 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xFA, 0x20, 0x07, 0xA0, 0x7A,
802 0x07, 0xA0, 0x70, 0x70, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x07,
803 0xC0, 0x7A, 0x07, 0x00, 0x70, 0x07, 0xC0, 0x7A, 0x07, 0xEF,
804 0x07, 0x07, 0x07, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xC0, 0x7F,
805 0xE1, 0x00, 0x7F, 0x83, 0x00, 0x7F, 0x63, 0x00, 0x70, 0x07,
806 0x07, 0x07, 0xFD, 0x20, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0,
807 0x7F, 0x92, 0x00, 0x70, 0x07, 0x70, 0x07, 0xEF, 0x0E, 0x47,
808 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x24, 0x00, 0x7A, 0x07, 0x00,
809 0xA7, 0x00, 0x70, 0x70, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x07,
810 0xD0, 0xA7, 0xF7, 0x20, 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x70,
811 0x70, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x0A, 0x7A, 0x0B, 0x7A,
812 0x07, 0x00, 0xA7, 0xB0, 0xA7, 0xF7, 0x10, 0x07, 0x07, 0x07,
813 0x0A, 0x7A, 0x0B, 0x70, 0x07, 0x0A, 0x70, 0xA7, 0xFC, 0x10,
814 0x07, 0xF8, 0x30, 0x07, 0xF6, 0x30, 0x07, 0x00, 0x70, 0x70,
815 0x7F, 0xD2, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF9,
816 0x20, 0x07, 0x07, 0xB0, 0x7E, 0xF0, 0xE4, 0x7E, 0x68, 0xE5,
817 0x2E, 0x41, 0xF3, 0x40, 0x0C, 0x7C, 0x07, 0x07, 0x00, 0x77,
818 0xF6, 0x20, 0x0C, 0x70, 0x7E, 0x20, 0x7F, 0x62, 0x00, 0xC7,
819 0xA0, 0x7A, 0x07, 0x00, 0x77, 0xF7, 0x20, 0x07, 0x07, 0x00,
820 0x7C, 0x07, 0x07, 0xB0, 0x70, 0x07, 0xE0, 0x07, 0xF8, 0x10,
821 0x07, 0xA0, 0x70, 0x7C, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0x07,
822 0xFE, 0x10, 0x07, 0xF8, 0x30, 0x07, 0xF6, 0x30, 0x07, 0x00,
823 0x70, 0x07, 0x7F, 0xD2, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A,
824 0x07, 0xF9, 0x20, 0x07, 0x07, 0xB0, 0x7E, 0xF0, 0xE4, 0x7E,
825 0x58, 0xE6, 0x2E, 0x41, 0xF3, 0x40, 0x07, 0xA0, 0x7C, 0x07,
826 0x07, 0xA0, 0x7F, 0x62, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7C,
827 0x07, 0xF6, 0x20, 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x7A, 0x07,
828 0xF7, 0x20, 0x07, 0x07, 0x00, 0x7C, 0x07, 0x00, 0x7A, 0x07,
829 0x00, 0x7E, 0x00, 0x7F, 0x81, 0x00, 0x7A, 0x07, 0x07, 0xC0,
830 0x70, 0x07, 0x00, 0x7A, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xF8,
831 0x30, 0x07, 0xF6, 0x30, 0x07, 0x00, 0x7A, 0x07, 0xFD, 0x20,
832 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x92, 0x00, 0x70,
833 0x07, 0x70, 0x07, 0xEF, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4,
834 0x1F, 0x34, 0x00, 0x7A, 0x07, 0x0B, 0x70, 0x07, 0xA0, 0x7F,
835 0x62, 0x00, 0x7A, 0x07, 0x00, 0xA7, 0x00, 0xB7, 0xF7, 0x20,
836 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x20, 0x07,
837 0xA0, 0xC7, 0x07, 0xA0, 0x70, 0xA7, 0x07, 0xE0, 0x07, 0xF8,
838 0x10, 0x07, 0xA0, 0x70, 0xC7, 0x07, 0xA0, 0x70, 0x0B, 0x70,
839 0xC7, 0xFA, 0x10, 0x0A, 0x7F, 0x43, 0x00, 0xA7, 0xF5, 0x30,
840 0x0A, 0x70, 0x7A, 0x07, 0xFE, 0x20, 0x0A, 0x7A, 0x0A, 0x7B,
841 0x07, 0xFA, 0x20, 0x07, 0xB0, 0x7E, 0xF0, 0xE4, 0x7E, 0x68,
842 0xE5, 0x2E, 0x51, 0xF5, 0x32, 0x0B, 0x7F, 0x71, 0x00, 0xE4,
843 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5,
844 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x68, 0xE5,
845 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47, 0xE6, 0x8E, 0x52, 0xE5,
846 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
847 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20,
848 0xE4, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47,
849 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58,
850 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62,
851 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x68, 0xE5, 0x2E, 0x51,
852 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x35,
853 0x00, 0xB2, 0x00, 0xC2, 0xA0, 0x2A, 0x0A, 0x2F, 0x22, 0x00,
854 0xB2, 0x00, 0xC2, 0x00, 0xB2, 0x0C, 0x20, 0x0A, 0x20, 0x0B,
855 0x20, 0x0C, 0x2E, 0x70, 0xA2, 0xC0, 0x2A, 0x0C, 0x2A, 0x02,
856 0xF3, 0x20, 0x0B, 0x20, 0x0A, 0x20, 0x02, 0xA0, 0x2F, 0x82,
857 0x00, 0x2A, 0x0B, 0x2A, 0x0B, 0x2F, 0x72, 0x00, 0xB2, 0x00,
858 0xA2, 0x00, 0xB2, 0xF7, 0x20, 0x02, 0xA0, 0x2A, 0x02, 0xA0,
859 0x2F, 0xA2, 0x00, 0x2C, 0x0C, 0x20, 0x2A, 0x02, 0xF6, 0x20,
860 0x02, 0xA0, 0x20, 0x0B, 0x20, 0xB2, 0xF6, 0x30, 0x0E, 0x37,
861 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x35, 0x00, 0x2A, 0x02, 0x02,
862 0xD0, 0x20, 0x20, 0x02, 0x00, 0x2F, 0x12, 0x00, 0x2A, 0x02,
863 0x02, 0xC0, 0x2E, 0x00, 0x2A, 0x02, 0xA0, 0x20, 0x2A, 0x02,
864 0x02, 0xEB, 0x02, 0x00, 0x2A, 0x02, 0x02, 0xB0, 0x2B, 0x02,
865 0x02, 0xF1, 0x20, 0x02, 0xC0, 0x2A, 0x02, 0x02, 0x20, 0x02,
866 0xF7, 0x20, 0x02, 0x02, 0x00, 0x2A, 0x02, 0x02, 0xFA, 0x20,
867 0x02, 0xC0, 0x2A, 0x02, 0x02, 0xA0, 0x2F, 0x62, 0x00, 0x2A,
868 0x02, 0x00, 0x20, 0x20, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2C,
869 0x02, 0x20, 0x02, 0xF6, 0x20, 0x02, 0xA0, 0x20, 0x2C, 0x02,
870 0xA0, 0x2F, 0x43, 0x00, 0xE4, 0x7E, 0x68, 0xE5, 0x2E, 0x51,
871 0xF3, 0x50, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xA0, 0x20, 0x2A,
872 0x02, 0xF0, 0x20, 0x02, 0xA0, 0x20, 0x2C, 0x02, 0xE0, 0x02,
873 0xA0, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2E, 0xB0, 0x2A, 0x02,
874 0x02, 0xA0, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xF0, 0x20, 0x02,
875 0xC0, 0x2C, 0x02, 0x02, 0x02, 0xF6, 0x20, 0x02, 0xA0, 0x20,
876 0x2A, 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2A, 0x02, 0x02,
877 0xA0, 0x2F, 0x62, 0x00, 0x2A, 0x02, 0x02, 0xA0, 0x20, 0x2F,
878 0xA2, 0x00, 0x2C, 0x02, 0xC0, 0x20, 0x20, 0x2F, 0x62, 0x00,
879 0x2A, 0x02, 0x02, 0xC0, 0x2A, 0x02, 0xF4, 0x30, 0x0E, 0x47,
880 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x45, 0x00, 0xB2, 0x00, 0xA2,
881 0xA0, 0x2A, 0x02, 0x02, 0xA0, 0x2F, 0x02, 0x00, 0xB2, 0x00,
882 0xA2, 0xB0, 0xA2, 0xB0, 0x2A, 0x02, 0xA0, 0x20, 0xB2, 0x00,
883 0xA2, 0xE9, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xA0, 0x2A, 0x02,
884 0xA0, 0x2F, 0x12, 0x00, 0xA2, 0x00, 0x20, 0xA2, 0x02, 0x02,
885 0x02, 0xF6, 0x20, 0x02, 0xA0, 0x20, 0xB2, 0xA0, 0xA2, 0xF8,
886 0x20, 0x0A, 0x20, 0x02, 0xA0, 0x20, 0xB2, 0xF7, 0x20, 0x02,
887 0xA0, 0x20, 0x2A, 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0xA2,
888 0xA0, 0x20, 0x20, 0x2F, 0x62, 0x00, 0x2A, 0x02, 0x00, 0xA2,
889 0x00, 0xB2, 0xF5, 0x30, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
890 0x1F, 0x45, 0x00, 0x20, 0x2A, 0x02, 0xC0, 0xC2, 0x02, 0xA0,
891 0x2F, 0x02, 0x00, 0x20, 0x2A, 0x02, 0xE2, 0x02, 0xA0, 0x2A,
892 0x02, 0xA0, 0x20, 0x20, 0x2A, 0x02, 0xEB, 0x02, 0xA0, 0x20,
893 0xC2, 0xA0, 0x2A, 0x0C, 0x2F, 0x42, 0x00, 0x20, 0x2A, 0x02,
894 0x02, 0x00, 0x22, 0xF6, 0x20, 0x0C, 0x20, 0x2A, 0x02, 0xC0,
895 0x2F, 0xA2, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x92,
896 0x00, 0x20, 0x20, 0x0C, 0x20, 0x2F, 0xA2, 0x00, 0x2C, 0x02,
897 0xC0, 0x20, 0x02, 0x2F, 0x62, 0x00, 0x2A, 0x02, 0xC0, 0x20,
898 0x20, 0x2F, 0x63, 0x00, 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41,
899 0xF4, 0x50, 0x02, 0x00, 0x20, 0x02, 0xC0, 0x2A, 0x02, 0x02,
900 0x00, 0x2F, 0x12, 0x00, 0x20, 0x02, 0x00, 0x2E, 0x20, 0x2A,
901 0x02, 0xA0, 0x2A, 0x02, 0x02, 0x00, 0x20, 0x02, 0xEB, 0x02,
902 0x00, 0x20, 0x02, 0xA0, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xF4,
903 0x20, 0x02, 0x02, 0xA0, 0x20, 0x2A, 0x02, 0xF6, 0x20, 0x02,
904 0xA0, 0x20, 0x2A, 0x02, 0xC0, 0x2F, 0xA2, 0x00, 0x20, 0x20,
905 0x02, 0x00, 0x20, 0x02, 0xF8, 0x20, 0x02, 0x02, 0x00, 0x2A,
906 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2C, 0x02, 0xA0, 0x2F,
907 0x62, 0x00, 0x2A, 0x02, 0xC0, 0x20, 0x20, 0x02, 0xF4, 0x30,
908 0x0E, 0x47, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x45, 0x00, 0x2A,
909 0x02, 0x0C, 0x20, 0x2A, 0x02, 0x0A, 0x2F, 0x22, 0x00, 0x2A,
910 0x02, 0x0C, 0x20, 0xB2, 0xB0, 0x2B, 0x0A, 0x20, 0x02, 0xA0,
911 0x20, 0xC2, 0xE7, 0x0A, 0x2A, 0x02, 0xA0, 0x2A, 0x02, 0xA0,
912 0x2A, 0x02, 0xF0, 0x20, 0x0B, 0x2A, 0x0B, 0x20, 0x2A, 0x02,
913 0xF6, 0x20, 0x02, 0xA0, 0x20, 0xB2, 0x00, 0xB2, 0xF7, 0x20,
914 0x0B, 0x2A, 0x02, 0x20, 0x20, 0x2A, 0x02, 0xF8, 0x20, 0x02,
915 0xA0, 0x2A, 0x02, 0x0C, 0x2F, 0x62, 0x00, 0xC2, 0x0C, 0x20,
916 0x2A, 0x02, 0xF7, 0x20, 0x0A, 0x20, 0x0B, 0x20, 0x02, 0xA0,
917 0x2F, 0x33, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
918 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
919 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41, 0xF0, 0x52, 0x0E, 0x47,
920 0xE5, 0x8E, 0x62, 0xE5, 0x1F, 0x55, 0x00, 0xF6, 0x20, 0x5E,
921 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6,
922 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E,
923 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0xA0, 0xF6,
924 0x20, 0x5E, 0xA0, 0xF6, 0x20, 0x5E, 0x32, 0xE4, 0x1F, 0x65,
925 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
926 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
927 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
928 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
929 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x22, 0xE4, 0x1F, 0x65, 0x00,
930 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
931 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
932 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
933 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
934 0x0F, 0x62, 0x05, 0x4E, 0x12, 0xE5, 0x1F, 0x65, 0x00, 0xD5,
935 0xA9, 0xC5, 0xB7, 0x5C, 0x75, 0x5A, 0x75, 0x5B, 0x7A, 0x54,
936 0xE9, 0x0C, 0x5C, 0x9E, 0x15, 0x7A, 0x57, 0x55, 0xA7, 0x55,
937 0xC7, 0xA5, 0x4E, 0x90, 0xB5, 0xC9, 0xD5, 0xB7, 0x5C, 0x75,
938 0xC7, 0x5B, 0x75, 0x54, 0xE9, 0x0B, 0x5E, 0x09, 0xE1, 0x5C,
939 0x75, 0x5A, 0x7E, 0x25, 0x4E, 0x90, 0xE0, 0x5B, 0x9A, 0x5C,
940 0x75, 0x7A, 0x57, 0x5C, 0x75, 0x7A, 0x57, 0x54, 0xE9, 0x0C,
941 0x59, 0x9A, 0x59, 0x9E, 0x45, 0x7E, 0x75, 0x4E, 0x90, 0xE2,
942 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99,
943 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E,
944 0x90, 0xF6, 0x20, 0x54, 0xE1, 0x2E, 0x41, 0xF7, 0x50, 0x0C,
945 0x59, 0x95, 0x99, 0xA5, 0x7E, 0x05, 0x7A, 0x57, 0xA5, 0x75,
946 0x7A, 0x57, 0x55, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE0,
947 0x57, 0x75, 0x57, 0x57, 0xA5, 0x7A, 0x57, 0xC5, 0x4E, 0x90,
948 0xB5, 0x99, 0x55, 0x99, 0xB5, 0x7E, 0x05, 0x7A, 0x57, 0xC5,
949 0x7A, 0x57, 0x54, 0xE9, 0x0B, 0x59, 0x9E, 0x85, 0x7A, 0x57,
950 0xA5, 0x7E, 0x15, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xB5,
951 0x7A, 0x57, 0xA5, 0x75, 0x7C, 0x57, 0x75, 0x57, 0x54, 0xE9,
952 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x35, 0xA7, 0xE6, 0x54, 0xE9,
953 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A,
954 0x59, 0x9E, 0x55, 0x7E, 0x65, 0x4E, 0x90, 0xD5, 0x99, 0xFE,
955 0x10, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x12, 0xE4, 0x1F,
956 0x75, 0x00, 0xC5, 0x99, 0x59, 0x9A, 0x57, 0xE0, 0x57, 0xA5,
957 0x7A, 0x57, 0x57, 0xA5, 0x75, 0x54, 0xE9, 0x0B, 0x59, 0x9E,
958 0x55, 0x75, 0x75, 0x75, 0x7A, 0x57, 0xA5, 0x7C, 0x54, 0xE9,
959 0x0B, 0x59, 0x9A, 0x59, 0x9A, 0x57, 0xE0, 0x57, 0xA5, 0x7C,
960 0x57, 0xA5, 0x75, 0x4E, 0x90, 0xB5, 0x99, 0xE8, 0x57, 0xA5,
961 0x7A, 0x57, 0xE1, 0x54, 0xE9, 0x0C, 0x59, 0x9E, 0x25, 0x7A,
962 0x57, 0xA5, 0x75, 0x7C, 0x57, 0x57, 0x57, 0x54, 0xE9, 0x0C,
963 0x59, 0x9A, 0x59, 0x9E, 0x25, 0x75, 0x75, 0x7E, 0x55, 0x4E,
964 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0x99,
965 0x55, 0x99, 0xE6, 0x57, 0xE6, 0x54, 0xE9, 0x0D, 0x59, 0x9E,
966 0x65, 0xC7, 0xE5, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x12,
967 0xE4, 0x1F, 0x75, 0x00, 0xB5, 0x99, 0xA5, 0x99, 0xA5, 0xA7,
968 0xB5, 0x7A, 0x57, 0xA5, 0x75, 0xB7, 0xA5, 0x4E, 0x90, 0xB5,
969 0x99, 0xE5, 0x57, 0x57, 0x57, 0x57, 0xA5, 0x7A, 0x57, 0xC5,
970 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xB5, 0xA7, 0xB5, 0x7A,
971 0x5A, 0x7A, 0x5B, 0x75, 0x54, 0xE9, 0x0B, 0x59, 0x9E, 0x85,
972 0x7A, 0x57, 0xA5, 0x7E, 0x15, 0x4E, 0x90, 0xC5, 0x99, 0xE2,
973 0x57, 0xA5, 0xC7, 0x5A, 0x7A, 0x57, 0x57, 0x57, 0x54, 0xE9,
974 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x45, 0x7E, 0x75, 0x4E, 0x90,
975 0xE2, 0x59, 0x9E, 0x25, 0xC7, 0xE6, 0x54, 0xE9, 0x0C, 0x59,
976 0x95, 0x99, 0xE5, 0x5C, 0x7E, 0x45, 0x4E, 0x90, 0xD5, 0x99,
977 0xFE, 0x10, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x02, 0xE5,
978 0x1F, 0x75, 0x00, 0xB5, 0x99, 0xA5, 0x99, 0xD5, 0x7A, 0x57,
979 0xA5, 0x7A, 0x57, 0x57, 0xD5, 0x4E, 0x90, 0xC5, 0xA9, 0xE3,
980 0x57, 0x55, 0x77, 0x57, 0xA5, 0x7A, 0x57, 0xC5, 0x4E, 0x90,
981 0xB5, 0x99, 0xA5, 0x99, 0xE0, 0x57, 0xA5, 0x7A, 0x57, 0xC5,
982 0x7C, 0x54, 0xE9, 0x0B, 0x5C, 0x9E, 0x55, 0x7A, 0x57, 0xA5,
983 0x7E, 0x15, 0x4E, 0x90, 0xC5, 0x99, 0xE2, 0x57, 0xA5, 0x7A,
984 0x57, 0x57, 0xC5, 0x75, 0x57, 0x75, 0x4E, 0x90, 0xC5, 0xE0,
985 0x9E, 0x45, 0x7E, 0x75, 0x4E, 0x90, 0xE2, 0x59, 0x9F, 0xB1,
986 0x05, 0x4E, 0x90, 0xC5, 0xB9, 0xE8, 0x57, 0xE6, 0x54, 0xE9,
987 0x0D, 0x59, 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
988 0xE0, 0x2E, 0x41, 0xF8, 0x50, 0x0B, 0x59, 0x9A, 0x59, 0x9D,
989 0x57, 0xA5, 0x7A, 0x57, 0xA5, 0x75, 0x7D, 0x54, 0xE9, 0x0E,
990 0x05, 0xA9, 0xE1, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0xA5, 0x7C,
991 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x05, 0x7A, 0x57,
992 0xA5, 0x7C, 0x57, 0xC5, 0x4E, 0x90, 0xB5, 0x99, 0xE8, 0x57,
993 0xA5, 0x7A, 0x57, 0xE1, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x5A,
994 0x9B, 0x57, 0xA5, 0x7A, 0x57, 0x57, 0xC5, 0x7A, 0x57, 0x54,
995 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9E, 0x45, 0x7E, 0x75, 0x4E,
996 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5, 0xB9,
997 0xE8, 0x57, 0xE6, 0x54, 0xE9, 0x0D, 0x59, 0x9E, 0x65, 0xC7,
998 0xE5, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x02, 0xE4, 0x1F,
999 0x85, 0x00, 0xB5, 0xE0, 0x95, 0x5B, 0x7B, 0x57, 0xB5, 0xA7,
1000 0x55, 0x7D, 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xE0, 0x57, 0xA5,
1001 0x75, 0x5A, 0x7B, 0x57, 0xC5, 0x4E, 0x90, 0xB5, 0x99, 0xA5,
1002 0x99, 0xA5, 0xB7, 0xB5, 0x7A, 0x5C, 0x75, 0x7C, 0x54, 0xE9,
1003 0x0B, 0x59, 0x9E, 0x85, 0x7B, 0x5A, 0x7E, 0x25, 0x4E, 0x90,
1004 0xC5, 0x99, 0xA5, 0x99, 0xB5, 0x7A, 0x57, 0xA5, 0x75, 0xC7,
1005 0x57, 0xA5, 0x75, 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE4,
1006 0x57, 0xE7, 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54,
1007 0xE9, 0x0C, 0x59, 0x95, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0D,
1008 0x59, 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0xC9, 0x59, 0xA5,
1009 0x95, 0xC9, 0x5C, 0x95, 0xB9, 0xC5, 0x4E, 0x02, 0xE4, 0x1F,
1010 0x85, 0x00, 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9,
1011 0x0E, 0x25, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
1012 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xF0, 0x20,
1013 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E,
1014 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xE4, 0x57, 0xE7, 0x54, 0xE9,
1015 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5,
1016 0x99, 0x55, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F,
1017 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0x9C, 0x59, 0x95, 0x59, 0xA5,
1018 0x9A, 0x59, 0xC5, 0x9A, 0x59, 0xB5, 0x4D, 0x2E, 0x41, 0xF9,
1019 0x50, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90,
1020 0xB5, 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0B, 0x59,
1021 0x95, 0x59, 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xF0,
1022 0x20, 0x54, 0xE9, 0x0D, 0x59, 0x95, 0x59, 0x9F, 0xA1, 0x05,
1023 0x4E, 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9,
1024 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xC5,
1025 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9F,
1026 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0x9C, 0x59, 0x59, 0x59, 0xA5,
1027 0x9A, 0x59, 0xC5, 0x9A, 0x59, 0xB5, 0x4D, 0x2E, 0x41, 0xF9,
1028 0x50, 0x0B, 0x59, 0x9A, 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90,
1029 0xC5, 0xC9, 0xFC, 0x10, 0x54, 0xE9, 0x0B, 0x5C, 0x9F, 0xD1,
1030 0x05, 0x4E, 0x90, 0xB5, 0x99, 0xF0, 0x20, 0x54, 0xE9, 0x0E,
1031 0x05, 0xC9, 0xFA, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59,
1032 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xC5, 0xC9, 0xFC, 0x10, 0x54,
1033 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1, 0x05, 0x4E, 0x90,
1034 0xD5, 0xD9, 0xFA, 0x10, 0x54, 0xE9, 0x0C, 0x5A, 0x9A, 0x59,
1035 0x59, 0x59, 0xA5, 0x9A, 0x5A, 0x9A, 0x5B, 0x9C, 0x54, 0xD2,
1036 0xE4, 0x1F, 0x95, 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
1037 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
1038 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
1039 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
1040 0xF6, 0x20, 0x54, 0xE9, 0x0C, 0x59, 0xC5, 0x95, 0x59, 0x9A,
1041 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xD5, 0x4C, 0x2E, 0x51, 0xF9,
1042 0x50, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
1043 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
1044 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
1045 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
1046 0x4E, 0x90, 0xC5, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xA5, 0x9C,
1047 0x59, 0x55, 0x9C, 0x54, 0xC2, 0xE4, 0x1F, 0xA5, 0x00, 0xE7,
1048 0x59, 0xA5, 0x95, 0xC9, 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90,
1049 0xE5, 0x5B, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0x5C, 0x9B, 0x54,
1050 0xE9, 0x0E, 0x95, 0xA9, 0xA5, 0xA9, 0x59, 0xA5, 0x9E, 0x05,
1051 0x4E, 0x90, 0xE8, 0x5C, 0x95, 0x5A, 0x95, 0x5B, 0x9E, 0x05,
1052 0x4E, 0x90, 0xE5, 0x5A, 0x9A, 0x5A, 0x95, 0x5C, 0x95, 0x5A,
1053 0x9C, 0x54, 0xE9, 0x0C, 0x5A, 0x9A, 0x5A, 0x9A, 0x5B, 0x95,
1054 0x9A, 0x59, 0x5B, 0x9D, 0x54, 0xE9, 0x0E, 0x45, 0x9D, 0x5A,
1055 0x9B, 0x59, 0xA5, 0xA9, 0xD5, 0x4E, 0x90, 0xE3, 0x59, 0xC5,
1056 0xA9, 0x55, 0xB9, 0x5C, 0x9E, 0x05, 0x4E, 0x90, 0xE7, 0x59,
1057 0xC5, 0xC9, 0x5C, 0x9E, 0x05, 0x4E, 0x90, 0xC5, 0xC9, 0x59,
1058 0xA5, 0x9A, 0x59, 0xA5, 0xC9, 0x59, 0xA5, 0x9B, 0x54, 0xC2,
1059 0xE4, 0x1F, 0xA5, 0x00, 0xE7, 0x59, 0x95, 0x59, 0x59, 0xC5,
1060 0x9A, 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x45, 0x9D, 0x59, 0x59,
1061 0x55, 0x9A, 0x59, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x95, 0x95,
1062 0x59, 0xA5, 0x95, 0x59, 0x95, 0x99, 0xE0, 0x54, 0xE9, 0x0E,
1063 0x85, 0x9C, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xD5, 0x4E, 0x90,
1064 0xE4, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xA5,
1065 0x9B, 0x54, 0xE9, 0x0B, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59,
1066 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x45,
1067 0x9C, 0x59, 0xA5, 0x95, 0x59, 0x59, 0x55, 0x95, 0x59, 0xC5,
1068 0x4E, 0x90, 0xE3, 0x59, 0xD5, 0x95, 0x59, 0xE0, 0x59, 0xE2,
1069 0x54, 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xE0, 0x59, 0xE2, 0x54,
1070 0xE9, 0x0F, 0x62, 0x05, 0x4C, 0x2E, 0x41, 0xFA, 0x50, 0x0E,
1071 0x75, 0x95, 0x95, 0x95, 0x9C, 0x59, 0xA5, 0x9E, 0x05, 0x4E,
1072 0x90, 0xE4, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9E,
1073 0x15, 0x4E, 0x90, 0xE9, 0x59, 0xA5, 0x95, 0x59, 0x55, 0x95,
1074 0x95, 0x9E, 0x05, 0x4E, 0x90, 0xE8, 0x59, 0xC5, 0x9A, 0x59,
1075 0x59, 0xA5, 0x9D, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
1076 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xB5, 0x4E, 0x90, 0xB5, 0x9C,
1077 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5,
1078 0x4E, 0x90, 0xE4, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95,
1079 0x9A, 0x59, 0xB5, 0x4E, 0x90, 0xE3, 0x59, 0xD5, 0x95, 0x59,
1080 0xE0, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xE0,
1081 0x59, 0xE2, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4B, 0x2E, 0x51,
1082 0xFA, 0x50, 0x0E, 0x75, 0x95, 0x95, 0x95, 0xA9, 0xA5, 0x9A,
1083 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x55, 0xA9, 0x55, 0x9A, 0x59,
1084 0x59, 0xA5, 0x95, 0xA9, 0xD5, 0x4E, 0x90, 0xE9, 0x59, 0xA5,
1085 0x95, 0x59, 0x55, 0x95, 0x95, 0x9E, 0x05, 0x4E, 0x90, 0xE8,
1086 0x5A, 0x9A, 0x59, 0xA5, 0x95, 0xB9, 0xE0, 0x54, 0xE9, 0x0E,
1087 0x45, 0x95, 0xA9, 0x59, 0xA5, 0x9A, 0x59, 0xA5, 0x9A, 0x59,
1088 0xB5, 0x4E, 0x90, 0xB5, 0x95, 0xA9, 0x59, 0xA5, 0x95, 0x5A,
1089 0x95, 0x59, 0xA5, 0x95, 0xB9, 0xD5, 0x4E, 0x90, 0xE4, 0x59,
1090 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xB5, 0x4E,
1091 0x90, 0xE3, 0x59, 0xD5, 0x9A, 0x5A, 0x9B, 0x59, 0xE2, 0x54,
1092 0xE9, 0x0E, 0x75, 0x9C, 0x5A, 0x9C, 0x59, 0xE2, 0x54, 0xE9,
1093 0x0F, 0x62, 0x05, 0x4B, 0x2E, 0x41, 0xFB, 0x50, 0x0E, 0x75,
1094 0x95, 0x59, 0x95, 0x9C, 0x59, 0x59, 0x59, 0xE0, 0x54, 0xE9,
1095 0x0E, 0x85, 0x95, 0xC9, 0x55, 0x95, 0x95, 0x59, 0xE1, 0x54,
1096 0xE9, 0x0E, 0x95, 0x9A, 0x59, 0x55, 0x95, 0x59, 0xA5, 0x9E,
1097 0x05, 0x4E, 0x90, 0xE8, 0x59, 0xC5, 0x9A, 0x59, 0x59, 0x59,
1098 0xE1, 0x54, 0xE9, 0x0E, 0x45, 0x9A, 0x59, 0x59, 0xA5, 0x9A,
1099 0x59, 0xA5, 0x9A, 0x59, 0xB5, 0x4E, 0x90, 0xB5, 0x9A, 0x59,
1100 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5,
1101 0x4E, 0x90, 0xE4, 0x59, 0xC5, 0x9A, 0x59, 0x5C, 0x95, 0x9A,
1102 0x59, 0xB5, 0x4E, 0x90, 0xE3, 0x59, 0xD5, 0x9D, 0x59, 0xA5,
1103 0x9E, 0x25, 0x4E, 0x90, 0xE7, 0x59, 0xC5, 0x9E, 0x05, 0x9E,
1104 0x25, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xB2, 0xE4, 0x1F, 0xB5,
1105 0x00, 0xE7, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0x59, 0x59, 0xE0,
1106 0x54, 0xE9, 0x0E, 0x85, 0x95, 0x9A, 0x59, 0x55, 0x95, 0x95,
1107 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x95, 0x95, 0x59, 0xA5, 0x95,
1108 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90, 0xE8, 0x59, 0xC5, 0x9A,
1109 0x59, 0x59, 0x55, 0x9E, 0x05, 0x4E, 0x90, 0xE4, 0x59, 0xA5,
1110 0x95, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xA5, 0x9B, 0x54, 0xE9,
1111 0x0B, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0xC5, 0x95, 0x9A, 0x59,
1112 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
1113 0x95, 0x9A, 0x59, 0x59, 0x55, 0x9C, 0x54, 0xE9, 0x0E, 0x35,
1114 0x9D, 0x59, 0xD5, 0x9A, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x75,
1115 0x9C, 0x59, 0xE0, 0x59, 0xE2, 0x54, 0xE9, 0x0F, 0x62, 0x05,
1116 0x4B, 0x2E, 0x41, 0xFB, 0x50, 0x0E, 0x75, 0x9A, 0x59, 0x5C,
1117 0x95, 0x59, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x45, 0xB9, 0x55,
1118 0x9A, 0x59, 0xA5, 0x9A, 0x5C, 0x9B, 0x54, 0xE9, 0x0E, 0x95,
1119 0xA9, 0xA5, 0xA9, 0x59, 0xA5, 0x9E, 0x05, 0x4E, 0x90, 0xE8,
1120 0x59, 0xD5, 0xA9, 0x55, 0x9A, 0x59, 0xD5, 0x4E, 0x90, 0xE5,
1121 0x5B, 0x95, 0x5A, 0x9B, 0x59, 0xB5, 0xA9, 0xC5, 0x4E, 0x90,
1122 0xC5, 0xB9, 0x55, 0xA9, 0x55, 0xB9, 0xA5, 0xA9, 0x55, 0xB9,
1123 0xD5, 0x4E, 0x90, 0xE4, 0x5C, 0x95, 0x5A, 0x95, 0x59, 0xA5,
1124 0x95, 0xA9, 0xD5, 0x4E, 0x90, 0xE3, 0x5C, 0x95, 0xA9, 0x5B,
1125 0x9B, 0x59, 0xE2, 0x54, 0xE9, 0x0E, 0x75, 0xC9, 0x5C, 0x9A,
1126 0x59, 0xE2, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4A, 0x2E, 0x41,
1127 0xFC, 0x50, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
1128 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
1129 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
1130 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
1131 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xA2, 0xE4, 0x1F, 0xC5,
1132 0x00, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
1133 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
1134 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
1135 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
1136 0xE9, 0x0F, 0x62, 0x05, 0x4A, 0x2E, 0x41, 0xFD, 0x50, 0x0F,
1137 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
1138 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F,
1139 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04,
1140 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0x22, 0xE5,
1141 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
1142 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x49, 0x00,
1143 0x7F, 0x63, 0x00, 0x7F, 0x93, 0x00, 0x7F, 0x33, 0x00, 0x7F,
1144 0x73, 0x00, 0xA7, 0x00, 0xA7, 0x0B, 0x7A, 0x0A, 0x70, 0x07,
1145 0xC0, 0xC7, 0xEF, 0x07, 0xA0, 0x7A, 0x07, 0xA0, 0x7E, 0x40,
1146 0x7F, 0xF1, 0x00, 0xB7, 0x00, 0xA7, 0x00, 0xB7, 0x00, 0xC7,
1147 0x0C, 0x70, 0x7A, 0x07, 0xE0, 0x07, 0xE7, 0x07, 0xA0, 0xC7,
1148 0x0C, 0x70, 0xB7, 0xF6, 0x20, 0x0E, 0x37, 0xE6, 0x8E, 0x62,
1149 0xE4, 0x1F, 0xE5, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x73, 0x00,
1150 0x7F, 0x73, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53, 0x00, 0x7A,
1151 0x07, 0x00, 0x70, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xC0,
1152 0x7F, 0xA1, 0x00, 0x7A, 0x07, 0x00, 0x70, 0x70, 0x07, 0xE3,
1153 0x0B, 0x7F, 0xC1, 0x00, 0x7C, 0x07, 0xA0, 0x70, 0x7A, 0x07,
1154 0x07, 0xC0, 0x7C, 0x07, 0x70, 0x07, 0xD0, 0xB7, 0xE4, 0x07,
1155 0x07, 0xB0, 0x7C, 0x07, 0xA0, 0x7A, 0x07, 0xF4, 0x20, 0x0E,
1156 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE5, 0x00, 0x70, 0x70,
1157 0x7F, 0x23, 0x00, 0x7F, 0x73, 0x00, 0x7F, 0x73, 0x00, 0x7F,
1158 0x53, 0x00, 0x7F, 0x53, 0x00, 0x7D, 0x07, 0x00, 0x7A, 0x07,
1159 0x07, 0xC0, 0x7C, 0x07, 0xFA, 0x10, 0x07, 0xA0, 0x70, 0x7A,
1160 0x07, 0x07, 0xE2, 0x07, 0x07, 0xFE, 0x10, 0x07, 0xC0, 0x7C,
1161 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0, 0x70, 0x70, 0x7C, 0x07,
1162 0x07, 0xE5, 0x07, 0xA0, 0x7A, 0x07, 0xC0, 0x7A, 0x07, 0xA0,
1163 0x7F, 0x42, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
1164 0x60, 0x07, 0xF3, 0x30, 0x07, 0xF8, 0x30, 0x07, 0xF5, 0x30,
1165 0x07, 0xF7, 0x30, 0x07, 0xF4, 0x30, 0x07, 0xD0, 0x70, 0x0B,
1166 0x70, 0x07, 0xC0, 0x7C, 0x0A, 0x7F, 0x81, 0x00, 0x7A, 0x07,
1167 0x07, 0xA0, 0x70, 0x7E, 0x30, 0xA7, 0xFE, 0x10, 0x0A, 0x70,
1168 0x07, 0xC0, 0xB7, 0x00, 0xA7, 0xA0, 0xA7, 0xA0, 0x70, 0x70,
1169 0x7D, 0x0A, 0x7E, 0x40, 0x7A, 0x07, 0xA0, 0x7C, 0x07, 0xA0,
1170 0xB7, 0xF5, 0x20, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
1171 0x59, 0x00, 0x7F, 0x93, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53,
1172 0x00, 0x7F, 0x53, 0x00, 0x7D, 0x07, 0x00, 0x70, 0x7A, 0x07,
1173 0xC0, 0x7C, 0x07, 0xFB, 0x10, 0x07, 0x07, 0x00, 0xC7, 0x07,
1174 0xE4, 0x07, 0x07, 0xF0, 0x20, 0x07, 0x07, 0xC0, 0x70, 0x7A,
1175 0x07, 0xC0, 0x7C, 0x07, 0x00, 0x77, 0xE0, 0x07, 0x07, 0xE3,
1176 0x0C, 0x7A, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xF6, 0x20, 0x0E,
1177 0x37, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x59, 0x00, 0x7F, 0x93,
1178 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x53, 0x00,
1179 0x7A, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0xA0, 0x70,
1180 0x7C, 0x07, 0xFB, 0x10, 0x07, 0x07, 0x00, 0x7A, 0x07, 0x07,
1181 0xE2, 0x0B, 0x7F, 0x12, 0x00, 0x70, 0x7A, 0x07, 0x07, 0x00,
1182 0x70, 0x07, 0xC0, 0x7C, 0x07, 0xA0, 0x7C, 0x0B, 0x7E, 0x40,
1183 0x7A, 0x07, 0xA0, 0x7C, 0x07, 0xA0, 0x70, 0x07, 0xF4, 0x20,
1184 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x69, 0x00, 0x7F,
1185 0xA3, 0x00, 0x7F, 0x53, 0x00, 0x7F, 0x33, 0x00, 0x7F, 0x73,
1186 0x00, 0xA7, 0x00, 0xA7, 0x07, 0xA0, 0x70, 0x0A, 0x70, 0x0C,
1187 0x70, 0xC7, 0xF8, 0x10, 0x07, 0xA0, 0x7A, 0x07, 0x0C, 0x7E,
1188 0x00, 0x7F, 0xE1, 0x00, 0xB7, 0xA0, 0xA7, 0x00, 0x7A, 0x07,
1189 0x0C, 0x70, 0xC7, 0x07, 0xA0, 0x7E, 0x00, 0x7E, 0x50, 0x7A,
1190 0x07, 0xA0, 0x7C, 0x07, 0xA0, 0x7A, 0x07, 0xF3, 0x20, 0x0E,
1191 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3, 0x7E,
1192 0x68, 0xE6, 0x2E, 0x41, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E,
1193 0x62, 0xE5, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E,
1194 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
1195 0x15, 0x20, 0xE3, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52,
1196 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4,
1197 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5,
1198 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x68, 0xE5,
1199 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
1200 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
1201 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0xD7, 0x00,
1202 0x2C, 0x02, 0xA0, 0x2F, 0xC2, 0x00, 0xC2, 0x02, 0xA0, 0x20,
1203 0xB2, 0xF7, 0x20, 0x02, 0xC0, 0xB2, 0x00, 0xB2, 0x00, 0xA2,
1204 0x02, 0xA0, 0x20, 0xC2, 0xEF, 0x02, 0xC0, 0x2C, 0x0A, 0x20,
1205 0x0B, 0x20, 0xC2, 0xFC, 0x10, 0x0B, 0x20, 0x0A, 0x20, 0x2A,
1206 0x02, 0xF8, 0x20, 0x0A, 0x20, 0x2A, 0x02, 0x02, 0xA0, 0x20,
1207 0xC2, 0x02, 0xA0, 0x2E, 0x00, 0x2E, 0xD0, 0xB2, 0x00, 0xA2,
1208 0xF0, 0x80, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE7,
1209 0x00, 0x2C, 0x02, 0x20, 0x02, 0xFC, 0x20, 0x02, 0xC0, 0x2A,
1210 0x02, 0x02, 0xA0, 0x2F, 0x62, 0x00, 0x2C, 0x02, 0xA0, 0x20,
1211 0x2A, 0x02, 0x00, 0x20, 0x02, 0x20, 0x02, 0xA0, 0x2F, 0x81,
1212 0x00, 0x2C, 0x02, 0xD0, 0x20, 0x02, 0xE0, 0x02, 0xFE, 0x10,
1213 0x02, 0xA0, 0x20, 0x02, 0x00, 0x22, 0x00, 0x2F, 0x92, 0x00,
1214 0x20, 0x02, 0x20, 0x02, 0x02, 0x00, 0x20, 0x02, 0xC0, 0x2A,
1215 0x02, 0xD0, 0xB2, 0xEB, 0x02, 0xA0, 0x20, 0x02, 0xF1, 0x80,
1216 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE7, 0x00, 0x2C,
1217 0x02, 0x02, 0x02, 0xFC, 0x20, 0x02, 0xD0, 0x20, 0x20, 0x02,
1218 0xA0, 0x2F, 0x62, 0x00, 0x2C, 0x02, 0xA0, 0x20, 0x2A, 0x02,
1219 0x00, 0x20, 0x02, 0x02, 0x02, 0xA0, 0x2F, 0x81, 0x00, 0x2C,
1220 0x02, 0xD0, 0x20, 0x02, 0xE0, 0x02, 0xFE, 0x10, 0x02, 0xA0,
1221 0x20, 0x02, 0x00, 0x20, 0x20, 0x2F, 0x92, 0x00, 0x20, 0x02,
1222 0x02, 0x02, 0x02, 0x02, 0xA0, 0x2C, 0x02, 0xA0, 0x2C, 0x02,
1223 0x02, 0xED, 0x02, 0xA0, 0x20, 0x02, 0xF1, 0x80, 0x0E, 0x47,
1224 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0xE7, 0x00, 0x2C, 0x02, 0x02,
1225 0x02, 0xFC, 0x20, 0x0A, 0x2C, 0x02, 0xA0, 0xB2, 0xF7, 0x20,
1226 0x02, 0xC0, 0xB2, 0x00, 0xB2, 0xA0, 0x20, 0x02, 0x02, 0x02,
1227 0xA0, 0x2F, 0x81, 0x00, 0x2C, 0x02, 0xD0, 0x2A, 0x0A, 0x2B,
1228 0x02, 0xFE, 0x10, 0x0B, 0x2A, 0x02, 0x00, 0x20, 0x20, 0x2F,
1229 0x92, 0x00, 0x20, 0x02, 0x02, 0x02, 0x02, 0x2B, 0x0A, 0x2B,
1230 0x0A, 0x2E, 0x00, 0xA2, 0xEC, 0x0B, 0x2A, 0x02, 0xF1, 0x80,
1231 0x0E, 0x37, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0xE7, 0x00, 0x2C,
1232 0x02, 0x00, 0x22, 0xFC, 0x20, 0x02, 0xD0, 0x20, 0x20, 0x02,
1233 0xFA, 0x20, 0x02, 0xC0, 0x2C, 0x02, 0x02, 0xB0, 0x20, 0x02,
1234 0x00, 0x22, 0xA0, 0x2F, 0x81, 0x00, 0x2C, 0x02, 0xD0, 0x2D,
1235 0x02, 0xA0, 0x2F, 0xE1, 0x00, 0x2A, 0x02, 0x00, 0x20, 0x02,
1236 0x00, 0x22, 0xF9, 0x20, 0x02, 0x00, 0x20, 0x02, 0x20, 0x20,
1237 0x2A, 0x02, 0xE0, 0x02, 0xE2, 0x02, 0x02, 0xEB, 0x02, 0xD0,
1238 0x2F, 0x08, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x51, 0xFE,
1239 0x70, 0x02, 0xC0, 0x2A, 0x02, 0xFC, 0x20, 0x02, 0xC0, 0x2A,
1240 0x02, 0x02, 0xFA, 0x20, 0x02, 0xC0, 0x2C, 0x02, 0x00, 0x2A,
1241 0x02, 0x00, 0x2A, 0x02, 0xA0, 0x2F, 0x81, 0x00, 0x2C, 0x02,
1242 0xD0, 0x2D, 0x02, 0xA0, 0x2F, 0xE1, 0x00, 0x2A, 0x02, 0x00,
1243 0x20, 0x02, 0xA0, 0x2F, 0x92, 0x00, 0x20, 0x02, 0xA0, 0x20,
1244 0x20, 0x02, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0xB2, 0xEC, 0x02,
1245 0xD0, 0x2F, 0x08, 0x00, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41,
1246 0xFF, 0x70, 0x0C, 0x20, 0x2A, 0x02, 0xFC, 0x20, 0x0C, 0x20,
1247 0x2A, 0x02, 0x02, 0xFA, 0x20, 0x0C, 0x20, 0x2C, 0x02, 0xA0,
1248 0x20, 0xA2, 0x02, 0xA0, 0x2A, 0x02, 0xF8, 0x10, 0x0C, 0x20,
1249 0xC2, 0x0A, 0x20, 0xB2, 0xB0, 0x2F, 0xE1, 0x00, 0xB2, 0x00,
1250 0xA2, 0x02, 0xA0, 0x2F, 0x82, 0x00, 0xA2, 0x02, 0xA0, 0x20,
1251 0x2A, 0x02, 0x0C, 0x2A, 0x02, 0xE2, 0x02, 0xED, 0x02, 0xC0,
1252 0xA2, 0xFF, 0x70, 0x0E, 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F,
1253 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x51, 0xF0, 0x52,
1254 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4,
1255 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xFE, 0x30, 0x0F, 0x13, 0x05,
1256 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F,
1257 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05,
1258 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F, 0x62, 0x05, 0xEA, 0x0F,
1259 0x62, 0x05, 0xEA, 0x0F, 0x24, 0x05, 0xD1, 0xFE, 0x30, 0x0F,
1260 0x13, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
1261 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
1262 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
1263 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
1264 0xF2, 0x40, 0x54, 0xC1, 0xFE, 0x30, 0x0F, 0x13, 0x05, 0x4E,
1265 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
1266 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6,
1267 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
1268 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xEC, 0x5B, 0x95,
1269 0x5B, 0x95, 0x5C, 0x9A, 0x59, 0xA5, 0x9A, 0x59, 0xEB, 0x54,
1270 0xB1, 0xFF, 0x30, 0x0E, 0x25, 0xC9, 0xB5, 0xA9, 0xB5, 0xD9,
1271 0xA5, 0xC9, 0xE3, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90,
1272 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x71, 0x05, 0xA7, 0xE5, 0x54,
1273 0xE9, 0x0F, 0x91, 0x05, 0x7E, 0x55, 0x4E, 0x90, 0xF6, 0x20,
1274 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
1275 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xEC, 0x59, 0xA5, 0x95,
1276 0x9A, 0x59, 0x59, 0xD5, 0x95, 0x95, 0x59, 0x55, 0x9E, 0xC5,
1277 0x4B, 0x1F, 0xF3, 0x00, 0xE1, 0x59, 0x9A, 0x59, 0x95, 0x59,
1278 0x95, 0x99, 0xA5, 0x99, 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x9E,
1279 0x25, 0x4E, 0x90, 0xC5, 0xE0, 0x9E, 0x25, 0x77, 0xE8, 0x54,
1280 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x25, 0xA7, 0xE8, 0x54,
1281 0xE9, 0x0E, 0x05, 0xB9, 0xE4, 0x57, 0xA5, 0x7E, 0x45, 0x4E,
1282 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE6, 0x57, 0xE6, 0x54, 0xE9,
1283 0x0B, 0x5D, 0x9E, 0x85, 0x7E, 0x55, 0x4E, 0x90, 0xD5, 0x99,
1284 0xA5, 0x99, 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59,
1285 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0E,
1286 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xA5, 0x95,
1287 0x95, 0x9E, 0xD5, 0x4B, 0x1F, 0xF3, 0x00, 0xE1, 0x59, 0x9D,
1288 0x59, 0x9A, 0x59, 0x95, 0x59, 0x9A, 0x59, 0x95, 0x99, 0xE7,
1289 0x54, 0xE9, 0x0E, 0x25, 0x99, 0xE3, 0x57, 0x7E, 0x85, 0x4E,
1290 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE1, 0x57, 0xA5, 0x7E, 0x75,
1291 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xE7, 0x57, 0xE4, 0x54,
1292 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x65, 0x7E, 0x65, 0x4E,
1293 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE5, 0x57, 0x57, 0x57, 0xE3,
1294 0x54, 0xE9, 0x0D, 0x5A, 0x95, 0x59, 0x9F, 0x91, 0x05, 0x4E,
1295 0x90, 0xC5, 0x99, 0xA5, 0x99, 0xFA, 0x10, 0x54, 0xE9, 0x0A,
1296 0x5B, 0x75, 0x7A, 0x57, 0x57, 0xA5, 0x75, 0xB7, 0xA5, 0xA7,
1297 0x55, 0x7C, 0x54, 0xE9, 0x0E, 0xC5, 0xB9, 0x55, 0xB9, 0x55,
1298 0xA9, 0xA5, 0x9A, 0x59, 0x59, 0x9E, 0xE5, 0x4B, 0x1F, 0xF3,
1299 0x00, 0xE1, 0x59, 0x9D, 0x59, 0x9A, 0x59, 0x95, 0x5D, 0x9A,
1300 0x5C, 0x9E, 0x35, 0x4E, 0x90, 0xE2, 0x59, 0x9F, 0xB1, 0x05,
1301 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x9E, 0x35, 0x7E, 0xA5, 0x4E,
1302 0x90, 0xC5, 0x99, 0xEB, 0x57, 0xE5, 0x54, 0xE9, 0x0B, 0x59,
1303 0x9A, 0x59, 0x9E, 0x55, 0x7E, 0x75, 0x4E, 0x90, 0xB5, 0x99,
1304 0xA5, 0x99, 0xE6, 0x5A, 0x7E, 0x45, 0x4E, 0x90, 0xD5, 0xA9,
1305 0x55, 0x99, 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x5A, 0x95, 0xA9,
1306 0xFA, 0x10, 0x54, 0xE9, 0x05, 0x57, 0xC5, 0x7A, 0x57, 0x57,
1307 0x75, 0x77, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x57, 0xC5, 0x4E,
1308 0x90, 0xEC, 0x59, 0xA5, 0x95, 0x95, 0x9A, 0x59, 0xC5, 0xC9,
1309 0x59, 0x59, 0xED, 0x54, 0xA1, 0xF0, 0x40, 0x0E, 0x15, 0x99,
1310 0xD5, 0xE0, 0x95, 0x59, 0x9E, 0x45, 0x99, 0xE2, 0x54, 0xE9,
1311 0x0E, 0x15, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95,
1312 0x99, 0xE2, 0x5A, 0x7E, 0x95, 0x4E, 0x90, 0xC5, 0x99, 0xEA,
1313 0x57, 0xE6, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9E, 0x45,
1314 0x7E, 0x85, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xE5, 0x57,
1315 0x57, 0x57, 0xE3, 0x54, 0xE9, 0x0D, 0x5B, 0x95, 0x99, 0xE2,
1316 0x57, 0x7E, 0x75, 0x4E, 0x90, 0xC5, 0xA9, 0x5A, 0x9E, 0x55,
1317 0x77, 0xE5, 0x54, 0xE9, 0x05, 0x57, 0xC5, 0x7A, 0x57, 0x57,
1318 0x57, 0x57, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x57, 0xC5, 0x4E,
1319 0x90, 0xEC, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x55, 0x9C, 0x59,
1320 0xA5, 0x95, 0x95, 0x59, 0xEC, 0x54, 0xA1, 0xF0, 0x40, 0x0E,
1321 0x15, 0x99, 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x95, 0x59, 0x9D,
1322 0x59, 0x9A, 0x59, 0x9E, 0x25, 0x4E, 0x90, 0xE1, 0x59, 0x9E,
1323 0x45, 0x77, 0xE8, 0x54, 0xE9, 0x0D, 0x5A, 0x9E, 0x45, 0x7E,
1324 0xA5, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9, 0x0C,
1325 0x59, 0x95, 0x99, 0xE5, 0x57, 0xE8, 0x54, 0xE9, 0x0B, 0x5D,
1326 0x9E, 0x85, 0x7E, 0x55, 0x4E, 0x90, 0xD5, 0x99, 0x59, 0x59,
1327 0x9E, 0x35, 0x7E, 0x75, 0x4E, 0x90, 0xC5, 0xE0, 0x9E, 0x55,
1328 0x77, 0xE5, 0x54, 0xE9, 0x0A, 0x5A, 0x7A, 0x5A, 0x75, 0x57,
1329 0x57, 0x57, 0x5B, 0x75, 0x57, 0xA5, 0x75, 0x7C, 0x54, 0xE9,
1330 0x0E, 0xC5, 0xB9, 0x55, 0x9A, 0x59, 0x5C, 0x95, 0x9A, 0x59,
1331 0x59, 0xA5, 0x9E, 0xB5, 0x4A, 0x1F, 0x04, 0x00, 0xE2, 0x5C,
1332 0x95, 0x59, 0x9A, 0x59, 0x95, 0x59, 0x9E, 0x05, 0xC9, 0xE3,
1333 0x54, 0xE9, 0x0E, 0x05, 0x99, 0xE5, 0x57, 0x7E, 0x85, 0x4E,
1334 0x90, 0xD5, 0xA9, 0xE3, 0x57, 0xEB, 0x54, 0xE9, 0x0C, 0x59,
1335 0x9E, 0xA5, 0x7E, 0x65, 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x9E,
1336 0x45, 0x7E, 0x95, 0x4E, 0x90, 0xB5, 0x99, 0xA5, 0x99, 0xFB,
1337 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x95, 0xB9, 0xE2, 0x57, 0xE8,
1338 0x54, 0xE9, 0x0C, 0x5E, 0x09, 0xFA, 0x10, 0x54, 0xE9, 0x0D,
1339 0x57, 0xA5, 0x7A, 0x57, 0xA5, 0x75, 0x7A, 0x57, 0x57, 0xA5,
1340 0x75, 0x7C, 0x54, 0xE9, 0x0F, 0x24, 0x05, 0x41, 0x1F, 0x14,
1341 0x00, 0xF1, 0x30, 0x54, 0xE9, 0x0E, 0x05, 0x99, 0xFD, 0x10,
1342 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x99, 0xE2, 0x5C, 0x7E, 0x75,
1343 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9, 0x0C, 0x59,
1344 0x95, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59,
1345 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0xA9, 0xF9,
1346 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x95, 0x99, 0xFA, 0x10,
1347 0x54, 0xE9, 0x0D, 0x57, 0xA5, 0x7A, 0x57, 0xA5, 0x75, 0x7A,
1348 0x57, 0x57, 0xA5, 0x75, 0x7C, 0x54, 0xE9, 0x0F, 0x24, 0x05,
1349 0x41, 0x1F, 0x14, 0x00, 0xF1, 0x30, 0x54, 0xE9, 0x0D, 0x59,
1350 0x9F, 0xE1, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x9F, 0xC1,
1351 0x05, 0x4E, 0x90, 0xC5, 0x99, 0xFF, 0x10, 0x54, 0xE9, 0x0C,
1352 0x59, 0x95, 0x99, 0xFC, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
1353 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0xA9,
1354 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x95, 0x95, 0x99, 0xFA,
1355 0x10, 0x54, 0xE9, 0x05, 0x5B, 0x7B, 0x57, 0xA5, 0x7A, 0x57,
1356 0x5B, 0x7A, 0x5A, 0x75, 0x5C, 0x75, 0x4E, 0x90, 0xE8, 0x5C,
1357 0x95, 0x5D, 0x9B, 0x5A, 0x9C, 0x5B, 0x95, 0x5E, 0x09, 0xE6,
1358 0x54, 0x11, 0xF1, 0x40, 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xD5,
1359 0x99, 0xFE, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A, 0x59, 0x9F,
1360 0xB1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0x55, 0x99, 0xFA, 0x10,
1361 0x54, 0xE9, 0x0D, 0x5A, 0x9F, 0xD1, 0x05, 0x4E, 0x90, 0xB5,
1362 0x99, 0xA5, 0x99, 0xFB, 0x10, 0x54, 0xE9, 0x0D, 0x59, 0x9A,
1363 0x59, 0x9F, 0x91, 0x05, 0x4E, 0x90, 0xC5, 0x99, 0x59, 0x59,
1364 0x9F, 0xA1, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0E,
1365 0x75, 0xE0, 0x95, 0xE0, 0x9A, 0x5A, 0x9B, 0x5D, 0x95, 0xE0,
1366 0x9E, 0x65, 0x41, 0x1F, 0x14, 0x00, 0xD5, 0xC9, 0x55, 0x99,
1367 0xA5, 0x99, 0x5D, 0x95, 0xE0, 0x95, 0xD9, 0xE0, 0x54, 0xE9,
1368 0x0C, 0x5E, 0x09, 0xFA, 0x10, 0x54, 0xE9, 0x0B, 0x59, 0x9A,
1369 0x59, 0x9F, 0xB1, 0x05, 0x4E, 0x90, 0xE0, 0x5B, 0x9F, 0xB1,
1370 0x05, 0x4E, 0x90, 0xD5, 0xA9, 0xFD, 0x10, 0x54, 0xE9, 0x0B,
1371 0x5D, 0x9F, 0xC1, 0x05, 0x4E, 0x90, 0xD5, 0x99, 0xA5, 0x99,
1372 0xF9, 0x10, 0x54, 0xE9, 0x0C, 0x59, 0x9A, 0x59, 0x9F, 0xA1,
1373 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0E, 0x75, 0x99,
1374 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x95, 0x59, 0x95, 0x99, 0x55,
1375 0xA9, 0x55, 0x99, 0x59, 0x9E, 0xB5, 0x41, 0xF2, 0x40, 0x0C,
1376 0x59, 0x9A, 0x59, 0x95, 0x99, 0xA5, 0x99, 0xA5, 0x99, 0xA5,
1377 0x99, 0xE1, 0x59, 0x9E, 0x25, 0x4E, 0x90, 0xF6, 0x20, 0x54,
1378 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
1379 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
1380 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
1381 0x05, 0x4E, 0x90, 0xE7, 0x59, 0x9D, 0x59, 0x9A, 0x59, 0x95,
1382 0x59, 0x95, 0x99, 0x55, 0x99, 0xD5, 0x99, 0xEB, 0x54, 0x1F,
1383 0x24, 0x00, 0xC5, 0x99, 0xD5, 0x99, 0xA5, 0x99, 0xA5, 0x99,
1384 0xA5, 0x99, 0xE1, 0x59, 0x9E, 0x25, 0x4E, 0x90, 0xE5, 0x5A,
1385 0x9A, 0x5A, 0x95, 0x5B, 0x95, 0x59, 0xA5, 0x9B, 0x54, 0xE9,
1386 0x0C, 0x5A, 0x95, 0x59, 0xC5, 0xC9, 0xA5, 0x9A, 0x5B, 0x9D,
1387 0x54, 0xE9, 0x0E, 0x35, 0xA9, 0xA5, 0xA9, 0x55, 0x9A, 0x59,
1388 0x5C, 0x9D, 0x54, 0xE9, 0x0E, 0x85, 0xA9, 0x55, 0x9D, 0x5B,
1389 0x9E, 0x05, 0x4E, 0x90, 0x5B, 0x9A, 0x5A, 0x95, 0x5B, 0x95,
1390 0x5A, 0x9A, 0x5C, 0x95, 0xB9, 0xA5, 0x4E, 0x90, 0xE3, 0x59,
1391 0xA5, 0x95, 0xC9, 0x59, 0xA5, 0x95, 0xC9, 0xC5, 0x4E, 0x90,
1392 0xD5, 0xB9, 0xB5, 0x9A, 0x59, 0xA5, 0x95, 0x5B, 0x95, 0xC9,
1393 0xA5, 0x4E, 0x90, 0xD5, 0xB7, 0x57, 0xA5, 0x75, 0xA7, 0x5C,
1394 0x75, 0xC7, 0xD5, 0x4E, 0x90, 0xE7, 0x5B, 0x9B, 0x59, 0x9A,
1395 0x59, 0x95, 0x99, 0xA5, 0x99, 0x59, 0x9D, 0x5C, 0x9E, 0x85,
1396 0x41, 0xF2, 0x40, 0x0D, 0x5C, 0x95, 0x5E, 0x09, 0xA5, 0x99,
1397 0xA5, 0xC9, 0xC5, 0x99, 0xE2, 0x54, 0xE9, 0x0E, 0x45, 0x9A,
1398 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x9B, 0x54,
1399 0xE9, 0x0B, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xD5, 0x95, 0x95,
1400 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x59,
1401 0xA5, 0x95, 0x99, 0x55, 0x9A, 0x59, 0xE1, 0x54, 0xE9, 0x0E,
1402 0x75, 0x9A, 0x59, 0x59, 0xC5, 0x9E, 0x45, 0x4E, 0x90, 0x59,
1403 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x55,
1404 0x9C, 0x59, 0xA5, 0x95, 0x54, 0xE9, 0x0E, 0x35, 0x99, 0x55,
1405 0x95, 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54, 0xE9, 0x0D,
1406 0x59, 0xA5, 0x95, 0x59, 0x59, 0x55, 0x9A, 0x59, 0x59, 0xC5,
1407 0x9E, 0x05, 0x4E, 0x90, 0xC5, 0x7C, 0x57, 0xA5, 0x75, 0x57,
1408 0x55, 0x7E, 0x05, 0x7E, 0x15, 0x4E, 0x90, 0xE8, 0x5C, 0x95,
1409 0x5E, 0x09, 0x59, 0x9A, 0x59, 0x95, 0x99, 0xD5, 0xC9, 0xE8,
1410 0x54, 0xF3, 0x40, 0x0E, 0x35, 0x99, 0x59, 0x9A, 0x59, 0x9A,
1411 0x59, 0x9A, 0x59, 0x9E, 0x15, 0x99, 0xE2, 0x54, 0xE9, 0x0E,
1412 0x45, 0x9C, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x9B,
1413 0x54, 0xE9, 0x0B, 0x59, 0xC5, 0x9C, 0x59, 0xC5, 0x9A, 0x59,
1414 0x59, 0xA5, 0x9C, 0x54, 0xE9, 0x0E, 0x25, 0x9C, 0x59, 0xA5,
1415 0x95, 0x95, 0x95, 0x9A, 0x59, 0xE1, 0x54, 0xE9, 0x0E, 0x75,
1416 0x9C, 0x59, 0xC5, 0x9E, 0x45, 0x4E, 0x90, 0x59, 0xA5, 0x95,
1417 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9A, 0x59, 0x59, 0xC5, 0x9A,
1418 0x59, 0x55, 0x4E, 0x90, 0xE3, 0x59, 0x59, 0x59, 0x59, 0xD5,
1419 0x95, 0x9B, 0x59, 0xE0, 0x54, 0xE9, 0x0D, 0x59, 0xA5, 0x95,
1420 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xE0, 0x54, 0xE9,
1421 0x0C, 0x57, 0xC5, 0x7A, 0x57, 0x55, 0x75, 0x57, 0xE0, 0x57,
1422 0xE1, 0x54, 0xE9, 0x0E, 0xA5, 0xB9, 0x5D, 0x95, 0x5E, 0x09,
1423 0x59, 0x9D, 0x59, 0x9E, 0xB5, 0x4F, 0x34, 0x00, 0xC5, 0x99,
1424 0xA5, 0x99, 0x59, 0x9A, 0x59, 0x9A, 0x59, 0x9A, 0x59, 0x9E,
1425 0x15, 0x99, 0xE2, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
1426 0x95, 0xB9, 0xA5, 0xA9, 0xC5, 0x4E, 0x90, 0xB5, 0x9C, 0x59,
1427 0xC5, 0xA9, 0xA5, 0x9A, 0x59, 0x5B, 0x9D, 0x54, 0xE9, 0x0E,
1428 0x25, 0x9C, 0x59, 0xA5, 0x95, 0x95, 0x95, 0x9A, 0x59, 0xE1,
1429 0x54, 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xD5, 0xA9, 0xE1, 0x54,
1430 0xE9, 0x05, 0xB9, 0x55, 0x9A, 0x59, 0x5B, 0x95, 0x59, 0xA5,
1431 0x95, 0xA9, 0xA5, 0xB9, 0xA5, 0x4E, 0x90, 0xE3, 0x59, 0x59,
1432 0x59, 0x5A, 0x9C, 0x59, 0xC5, 0x9E, 0x05, 0x4E, 0x90, 0xD5,
1433 0xB9, 0x55, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x5A, 0x95, 0x5A,
1434 0x9C, 0x54, 0xE9, 0x0D, 0x5A, 0x75, 0x5C, 0x75, 0x57, 0x55,
1435 0xA7, 0xC5, 0x7E, 0x15, 0x4E, 0x90, 0xEC, 0x59, 0x95, 0x99,
1436 0xD5, 0xE0, 0x95, 0x99, 0xD5, 0x99, 0xEB, 0x54, 0xF3, 0x40,
1437 0x0D, 0x5C, 0x95, 0x59, 0x9A, 0x59, 0x95, 0xD9, 0x59, 0x9E,
1438 0x15, 0x99, 0xE2, 0x54, 0xE9, 0x0E, 0x45, 0x9C, 0x59, 0xA5,
1439 0x95, 0x9E, 0x05, 0x9D, 0x54, 0xE9, 0x0B, 0x59, 0xC5, 0x9C,
1440 0x59, 0xC5, 0xC9, 0x59, 0x59, 0xE0, 0x54, 0xE9, 0x0E, 0x25,
1441 0x9C, 0x59, 0xA5, 0x95, 0x95, 0x59, 0x9A, 0x59, 0xE1, 0x54,
1442 0xE9, 0x0E, 0x75, 0x9C, 0x59, 0xE2, 0x59, 0xE0, 0x54, 0xE9,
1443 0x05, 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x95, 0x9A, 0x59, 0xA5,
1444 0x95, 0x9C, 0x59, 0x59, 0xB5, 0x4E, 0x90, 0xE3, 0x59, 0x55,
1445 0x99, 0x59, 0xD5, 0x95, 0x9B, 0x59, 0xE0, 0x54, 0xE9, 0x0D,
1446 0x59, 0xC5, 0xC9, 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xE0, 0x54,
1447 0xE9, 0x0E, 0x25, 0x75, 0x7A, 0x57, 0x55, 0x75, 0x57, 0xE0,
1448 0x57, 0xE1, 0x54, 0xE9, 0x0E, 0x75, 0x99, 0xA5, 0x99, 0x59,
1449 0x9D, 0x59, 0x9A, 0x59, 0x95, 0xA9, 0x55, 0x99, 0x59, 0x9E,
1450 0xB5, 0x4F, 0x34, 0x00, 0xF1, 0x30, 0x54, 0xE9, 0x0E, 0x45,
1451 0x9A, 0x59, 0x59, 0xA5, 0x95, 0x9E, 0x05, 0x9D, 0x54, 0xE9,
1452 0x0B, 0x59, 0xA5, 0x95, 0x9C, 0x59, 0xC5, 0x9A, 0x59, 0x59,
1453 0x55, 0x9D, 0x54, 0xE9, 0x0E, 0x25, 0x9A, 0x59, 0x59, 0xA5,
1454 0x95, 0x9A, 0x59, 0xA5, 0x9E, 0x15, 0x4E, 0x90, 0xE7, 0x59,
1455 0xA5, 0x95, 0x9E, 0x25, 0x9E, 0x05, 0x4E, 0x90, 0x59, 0xA5,
1456 0x95, 0x9A, 0x59, 0x59, 0x55, 0x95, 0x59, 0x55, 0x95, 0x59,
1457 0xC5, 0x95, 0x59, 0xA5, 0x4E, 0x90, 0xE3, 0x59, 0xA5, 0x95,
1458 0x9C, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54, 0xE9, 0x0D, 0x59,
1459 0xC5, 0x9A, 0x59, 0x59, 0xA5, 0x9C, 0x59, 0x59, 0xE0, 0x54,
1460 0xE9, 0x0E, 0x25, 0x75, 0x7A, 0x57, 0x55, 0x75, 0x57, 0xE0,
1461 0x57, 0xE1, 0x54, 0xE9, 0x0E, 0x75, 0xE0, 0x95, 0x99, 0xD5,
1462 0x99, 0xA5, 0x99, 0x55, 0xD9, 0x5E, 0x09, 0xE6, 0x54, 0xF3,
1463 0x40, 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xE5, 0x5A, 0x9A, 0x5A,
1464 0x95, 0x59, 0xE0, 0x59, 0xD5, 0x4E, 0x90, 0xC5, 0xA9, 0x55,
1465 0xC9, 0x5C, 0x95, 0x9A, 0x59, 0x59, 0xA5, 0x9C, 0x54, 0xE9,
1466 0x0E, 0x35, 0xA9, 0xA5, 0xA9, 0x55, 0x9A, 0x59, 0xA5, 0x9E,
1467 0x15, 0x4E, 0x90, 0xE8, 0x5A, 0x95, 0x5C, 0x95, 0xB9, 0xE1,
1468 0x54, 0xE9, 0x05, 0xB9, 0xA5, 0xA9, 0x55, 0x9A, 0x59, 0x5A,
1469 0x9A, 0x5C, 0x95, 0x9A, 0x59, 0x55, 0x4E, 0x90, 0xE3, 0x59,
1470 0xA5, 0x95, 0xC9, 0x59, 0xA5, 0x9A, 0x59, 0xE0, 0x54, 0xE9,
1471 0x0D, 0x59, 0xC5, 0x9A, 0x59, 0x55, 0xA9, 0x55, 0xB9, 0x55,
1472 0xC9, 0xA5, 0x4E, 0x90, 0xC5, 0xB7, 0x55, 0x7A, 0x57, 0x5A,
1473 0x75, 0x7E, 0x05, 0x7E, 0x15, 0x4E, 0x90, 0xE8, 0x5C, 0x95,
1474 0x59, 0x9D, 0x59, 0x9A, 0x59, 0x9A, 0x5B, 0x95, 0x5E, 0x09,
1475 0xE6, 0x54, 0xF3, 0x40, 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xF6,
1476 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20,
1477 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54,
1478 0xE9, 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9,
1479 0x0F, 0x62, 0x05, 0x4E, 0x90, 0xF2, 0x40, 0x54, 0xF3, 0x40,
1480 0x0F, 0x13, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F,
1481 0x62, 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62,
1482 0x05, 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05,
1483 0x4E, 0x90, 0xF6, 0x20, 0x54, 0xE9, 0x0F, 0x62, 0x05, 0x4E,
1484 0x90, 0xF2, 0x40, 0x54, 0xF4, 0x40, 0x0F, 0x13, 0x04, 0xEA,
1485 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62,
1486 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA,
1487 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62, 0x04, 0xEA, 0x0F, 0x62,
1488 0x04, 0xEA, 0x0F, 0x24, 0x04, 0xFF, 0x42, 0x0E, 0x47, 0xE5,
1489 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3, 0x7E, 0x68, 0xE5,
1490 0x2E, 0x51, 0xF7, 0x80, 0x0B, 0x70, 0x0C, 0x70, 0xC7, 0x0B,
1491 0x7F, 0x12, 0x00, 0xA7, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xF8,
1492 0x20, 0x0B, 0x7B, 0x07, 0xA0, 0xB7, 0x00, 0xC7, 0x0B, 0x7F,
1493 0xB1, 0x00, 0xC7, 0x07, 0xE0, 0x07, 0xB0, 0xB7, 0x07, 0xA0,
1494 0x7F, 0xA1, 0x00, 0xB7, 0x00, 0xB7, 0x00, 0xA7, 0x00, 0xA7,
1495 0x00, 0x7A, 0x07, 0x0C, 0x7F, 0x71, 0x00, 0xA7, 0x00, 0x7A,
1496 0x07, 0x0C, 0x70, 0xB7, 0xF1, 0x20, 0x0A, 0x70, 0x7A, 0x07,
1497 0x07, 0xA0, 0x70, 0xC7, 0x0B, 0x7A, 0x0B, 0x70, 0xC7, 0xF8,
1498 0x50, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x88, 0x00,
1499 0x7A, 0x07, 0x07, 0xC0, 0x7C, 0x07, 0xA0, 0x7F, 0x12, 0x00,
1500 0x70, 0x07, 0x70, 0x07, 0x07, 0x00, 0x7F, 0x92, 0x00, 0x7A,
1501 0x07, 0x00, 0x70, 0x70, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0,
1502 0x7F, 0xA1, 0x00, 0x7C, 0x07, 0xD0, 0x70, 0x70, 0x07, 0xC0,
1503 0x7A, 0x07, 0xFA, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x00,
1504 0x70, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x81, 0x00,
1505 0x7A, 0x07, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xA0, 0x7F, 0x12,
1506 0x00, 0x70, 0x07, 0x70, 0x07, 0x07, 0xA0, 0x70, 0x7C, 0x07,
1507 0xA0, 0x70, 0x7C, 0x07, 0xFC, 0x50, 0x0E, 0x47, 0xE5, 0x8E,
1508 0x62, 0xE4, 0x1F, 0x88, 0x00, 0x7A, 0x07, 0x07, 0xC0, 0x7C,
1509 0x07, 0xA0, 0x7F, 0x12, 0x00, 0x70, 0x07, 0x07, 0x07, 0x07,
1510 0x07, 0xFA, 0x20, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x07, 0xA0,
1511 0x70, 0x7C, 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0x7C, 0x07, 0xC0,
1512 0x7A, 0x07, 0x07, 0xC0, 0x7A, 0x07, 0xFA, 0x10, 0x07, 0xA0,
1513 0x70, 0x7A, 0x07, 0x00, 0x70, 0x07, 0xC0, 0x7A, 0x07, 0xA0,
1514 0x7F, 0x81, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x70, 0x7C, 0x07,
1515 0xA0, 0x7F, 0x12, 0x00, 0x70, 0x07, 0x07, 0x07, 0x07, 0xA0,
1516 0x70, 0x7C, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xFC, 0x50, 0x0E,
1517 0x37, 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x88, 0x00, 0xB7, 0x00,
1518 0xA7, 0xA0, 0xA7, 0xA0, 0xB7, 0xF2, 0x20, 0x07, 0x00, 0x70,
1519 0x70, 0x70, 0x77, 0xFB, 0x20, 0x0B, 0x70, 0x07, 0xA0, 0x70,
1520 0xB7, 0x00, 0xA7, 0xA0, 0xB7, 0xFB, 0x10, 0x0A, 0x7A, 0x07,
1521 0xC0, 0x7A, 0x07, 0x00, 0xA7, 0x00, 0xC7, 0xFA, 0x10, 0x0B,
1522 0x70, 0x0B, 0x7A, 0x07, 0x00, 0x70, 0xA7, 0x0C, 0x7A, 0x07,
1523 0xF8, 0x10, 0x07, 0xA0, 0x70, 0x7A, 0x07, 0x0A, 0x7A, 0x0B,
1524 0x7F, 0x22, 0x00, 0x70, 0x07, 0x07, 0x07, 0x07, 0xA0, 0x70,
1525 0xA7, 0xA0, 0xB7, 0xA0, 0xA7, 0x00, 0xA7, 0xF9, 0x50, 0x0E,
1526 0x47, 0xE6, 0x8E, 0x52, 0xE5, 0x1F, 0x88, 0x00, 0x7A, 0x07,
1527 0x07, 0xC0, 0x7C, 0x07, 0xF5, 0x20, 0x07, 0x00, 0x70, 0x07,
1528 0x70, 0x70, 0x7F, 0xA2, 0x00, 0x7C, 0x0C, 0x70, 0x7C, 0x07,
1529 0xC0, 0x70, 0x7F, 0xC1, 0x00, 0x7C, 0x07, 0xC0, 0xC7, 0xC0,
1530 0x70, 0x7A, 0x07, 0xFA, 0x10, 0x07, 0xA0, 0x70, 0x70, 0x7B,
1531 0x07, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF8, 0x10,
1532 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00, 0x7C, 0x07, 0x07, 0xF3,
1533 0x20, 0x07, 0x00, 0x70, 0x07, 0x70, 0x07, 0x07, 0x00, 0x7C,
1534 0x07, 0x07, 0xE0, 0x07, 0x07, 0xFB, 0x50, 0x0E, 0x47, 0xE5,
1535 0x8E, 0x62, 0xE4, 0x1F, 0x98, 0x00, 0x7A, 0x07, 0x07, 0xC0,
1536 0x7C, 0x07, 0xF5, 0x20, 0x07, 0x00, 0x7A, 0x07, 0x07, 0x00,
1537 0x7F, 0x92, 0x00, 0x7C, 0x07, 0xA0, 0x70, 0x7C, 0x07, 0xC0,
1538 0x70, 0x07, 0xFB, 0x10, 0x07, 0xC0, 0x7C, 0x07, 0xA0, 0x7C,
1539 0x07, 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0x7A, 0x07, 0x07, 0x00,
1540 0x7A, 0x07, 0x00, 0x7A, 0x07, 0x07, 0xA0, 0x7A, 0x07, 0xF8,
1541 0x10, 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00, 0x7C, 0x07, 0x00,
1542 0x7F, 0x22, 0x00, 0x70, 0x07, 0xA0, 0x70, 0x07, 0x07, 0x00,
1543 0x7C, 0x07, 0x00, 0x7D, 0x07, 0x07, 0xFB, 0x50, 0x0E, 0x47,
1544 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x98, 0x00, 0xB7, 0x00, 0xC7,
1545 0x0C, 0x70, 0x7F, 0x42, 0x00, 0xA7, 0x07, 0xA0, 0x70, 0x7A,
1546 0x07, 0xF8, 0x20, 0x07, 0xC0, 0x7A, 0x07, 0x07, 0xC0, 0xC7,
1547 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0x7C, 0x0C, 0x70, 0x7A, 0x07,
1548 0x0B, 0x70, 0x07, 0xA0, 0x7F, 0xA1, 0x00, 0xB7, 0x00, 0x7A,
1549 0x07, 0x0A, 0x70, 0x0B, 0x70, 0x7A, 0x07, 0xA0, 0x7F, 0x91,
1550 0x00, 0xA7, 0xB0, 0x7A, 0x0C, 0x70, 0x7A, 0x07, 0xF0, 0x20,
1551 0x0A, 0x70, 0x7A, 0x07, 0xA0, 0x7A, 0x0C, 0x70, 0x7A, 0x07,
1552 0x0B, 0x70, 0x0C, 0x7F, 0x75, 0x00, 0xE3, 0x7E, 0x68, 0xE6,
1553 0x2E, 0x41, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
1554 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
1555 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
1556 0xE3, 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47,
1557 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58,
1558 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE6, 0x8E, 0x62,
1559 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x51,
1560 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15,
1561 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E,
1562 0x37, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E,
1563 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E,
1564 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E,
1565 0x41, 0xF0, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
1566 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52,
1567 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3,
1568 0x7E, 0x68, 0xE5, 0x2E, 0x51, 0xF0, 0x52, 0x0E, 0x47, 0xE5,
1569 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6,
1570 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
1571 0x1F, 0x15, 0x20, 0xE3, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
1572 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
1573 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37,
1574 0xE6, 0x8E, 0x62, 0xE4, 0x1F, 0x05, 0x20, 0xE4, 0x7E, 0x58,
1575 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62,
1576 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41,
1577 0xF1, 0x52, 0x0E, 0x37, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15,
1578 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E,
1579 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E,
1580 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE5, 0x8E,
1581 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E,
1582 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F,
1583 0x15, 0x20, 0xE3, 0x7E, 0x68, 0xE6, 0x2E, 0x41, 0xF0, 0x52,
1584 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4,
1585 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5,
1586 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE3, 0x7E, 0x58, 0xE6,
1587 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4,
1588 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1,
1589 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20,
1590 0xE3, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x47,
1591 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58,
1592 0xE6, 0x2E, 0x41, 0xF1, 0x52, 0x0E, 0x37, 0xE5, 0x8E, 0x62,
1593 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41,
1594 0xF1, 0x52, 0x0E, 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15,
1595 0x20, 0xE4, 0x7E, 0x58, 0xE6, 0x2E, 0x41, 0xF0, 0x52, 0x0E,
1596 0x47, 0xE5, 0x8E, 0x62, 0xE4, 0x1F, 0x15, 0x20, 0xE4, 0x7E,
1597 0x58, 0xE6, 0x2E, 0x41, 0xF1, 0x30, 0x0A
1598};
1599
1600const unsigned long spectkey_size = 15887;
1601
1602/* 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* #define DEBUG_KEYS */
22#include "misc.h"
23
24#include "spkey.h"
25#include "spkey_p.h"
26
27#include "spperif.h"
28#include "z80.h"
29
30#include "sptape.h"
31#include "snapshot.h"
32#include "spsound.h"
33#include "spscr.h"
34
35#include "interf.h"
36
37#include <stdlib.h>
38#include <stdio.h>
39#include <ctype.h>
40
41int keyboard_type = 0;
42
43/* for kempston support via SK_KP_Up and so on.... */
44int cursor_type = 2;
45
46
47int spkb_allow_ascii = 1;
48int spkb_trueshift = -1;
49int spkb_funcshift = -1;
50
51static unsigned trueshift;
52static unsigned funcshift;
53
54struct spkeydef {
55 int type;
56 spkeyboard kb;
57};
58
59struct spbasekey {
60 int index;
61 spkeyboard kb;
62 spkeyboard misc;
63};
64
65struct spnamedkey {
66 const char *name;
67 spkeyboard kb;
68 spkeyboard misc;
69};
70
71extern int endofsingle;
72extern int sp_nosync;
73extern int showframe;
74extern int privatemap;
75
76spkeyboard spkey_state;
77spkeyboard spmisc_state;
78
79static spkeyboard oldstate = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
80
81struct keystate spkb_kbstate[NR_SPKEYS];
82struct onekey spkb_last;
83
84int spkb_state_changed;
85
86#define SKE {0, 0, 0, 0, 0, 0, 0, 0}
87
88#define SKP(x) (1 << x)
89
90#define SKN0(x) {SKP(x), 0, 0, 0, 0, 0, 0, 0}
91#define SKN1(x) {0, SKP(x), 0, 0, 0, 0, 0, 0}
92#define SKN2(x) {0, 0, SKP(x), 0, 0, 0, 0, 0}
93#define SKN3(x) {0, 0, 0, SKP(x), 0, 0, 0, 0}
94#define SKN4(x) {0, 0, 0, 0, SKP(x), 0, 0, 0}
95#define SKN5(x) {0, 0, 0, 0, 0, SKP(x), 0, 0}
96#define SKN6(x) {0, 0, 0, 0, 0, 0, SKP(x), 0}
97#define SKN7(x) {0, 0, 0, 0, 0, 0, 0, SKP(x)}
98
99#define SKCS0(x) {SKP(0) | SKP(x), 0, 0, 0, 0, 0, 0, 0}
100#define SKCS1(x) {SKP(0), SKP(x), 0, 0, 0, 0, 0, 0}
101#define SKCS2(x) {SKP(0), 0, SKP(x), 0, 0, 0, 0, 0}
102#define SKCS3(x) {SKP(0), 0, 0, SKP(x), 0, 0, 0, 0}
103#define SKCS4(x) {SKP(0), 0, 0, 0, SKP(x), 0, 0, 0}
104#define SKCS5(x) {SKP(0), 0, 0, 0, 0, SKP(x), 0, 0}
105#define SKCS6(x) {SKP(0), 0, 0, 0, 0, 0, SKP(x), 0}
106#define SKCS7(x) {SKP(0), 0, 0, 0, 0, 0, 0, SKP(x)}
107
108
109#define SKSS0(x) {SKP(x), 0, 0, 0, 0, 0, 0, SKP(1)}
110#define SKSS1(x) {0, SKP(x), 0, 0, 0, 0, 0, SKP(1)}
111#define SKSS2(x) {0, 0, SKP(x), 0, 0, 0, 0, SKP(1)}
112#define SKSS3(x) {0, 0, 0, SKP(x), 0, 0, 0, SKP(1)}
113#define SKSS4(x) {0, 0, 0, 0, SKP(x), 0, 0, SKP(1)}
114#define SKSS5(x) {0, 0, 0, 0, 0, SKP(x), 0, SKP(1)}
115#define SKSS6(x) {0, 0, 0, 0, 0, 0, SKP(x), SKP(1)}
116#define SKSS7(x) {0, 0, 0, 0, 0, 0, 0, SKP(x) | SKP(1)}
117
118
119#define KEMP(x) {x, 0, 0, 0, 0, 0, 0, 0}
120
121#define KEMPR 0x01
122#define KEMPL 0x02
123#define KEMPD 0x04
124#define KEMPU 0x08
125#define KEMPF 0x10
126
127#define KEMP_PORT 0x1F
128
129
130#define T_MAIN 0
131#define T_CMPX 1
132#define T_EXTR 2
133
134#define SPK_SPACE SKN7(0)
135
136#define SPK_0 SKN4(0)
137#define SPK_1 SKN3(0)
138#define SPK_2 SKN3(1)
139#define SPK_3 SKN3(2)
140#define SPK_4 SKN3(3)
141#define SPK_5 SKN3(4)
142#define SPK_6 SKN4(4)
143#define SPK_7 SKN4(3)
144#define SPK_8 SKN4(2)
145#define SPK_9 SKN4(1)
146
147#define SPK_A SKN1(0)
148#define SPK_B SKN7(4)
149#define SPK_C SKN0(3)
150#define SPK_D SKN1(2)
151#define SPK_E SKN2(2)
152#define SPK_F SKN1(3)
153#define SPK_G SKN1(4)
154#define SPK_H SKN6(4)
155#define SPK_I SKN5(2)
156#define SPK_J SKN6(3)
157#define SPK_K SKN6(2)
158#define SPK_L SKN6(1)
159#define SPK_M SKN7(2)
160#define SPK_N SKN7(3)
161#define SPK_O SKN5(1)
162#define SPK_P SKN5(0)
163#define SPK_Q SKN2(0)
164#define SPK_R SKN2(3)
165#define SPK_S SKN1(1)
166#define SPK_T SKN2(4)
167#define SPK_U SKN5(3)
168#define SPK_V SKN0(4)
169#define SPK_W SKN2(1)
170#define SPK_X SKN0(2)
171#define SPK_Y SKN5(4)
172#define SPK_Z SKN0(1)
173
174#define SPK_ENTER SKN6(0)
175#define SPK_CAPSSHIFT SKN0(0)
176#define SPK_SYMBOLSHIFT SKN7(1)
177
178#define SPK_BS SKCS4(0)
179#define SPK_UP SKCS4(3)
180#define SPK_DOWN SKCS4(4)
181#define SPK_LEFT SKCS3(4)
182#define SPK_RIGHT SKCS4(2)
183#define SPK_CAPSLOCK SKCS3(1)
184#define SPK_EXTRA SKCS7(1)
185#define SPK_EDIT SKCS3(0)
186
187static spkeyboard spk_extra = SPK_EXTRA;
188
189static struct spkeydef spkey_ascii[] = {
190 {T_MAIN, SPK_SPACE}, /* space */
191 {T_CMPX, SKSS3(0)}, /* ! */
192 {T_CMPX, SKSS5(0)}, /* " */
193 {T_CMPX, SKSS3(2)}, /* # */
194 {T_CMPX, SKSS3(3)}, /* $ */
195 {T_CMPX, SKSS3(4)}, /* % */
196 {T_CMPX, SKSS4(4)}, /* & */
197 {T_CMPX, SKSS4(3)}, /* ' */
198 {T_CMPX, SKSS4(2)}, /* ( */
199 {T_CMPX, SKSS4(1)}, /* ) */
200 {T_CMPX, SKSS7(4)}, /* * */
201 {T_CMPX, SKSS6(2)}, /* + */
202 {T_CMPX, SKSS7(3)}, /* , */
203 {T_CMPX, SKSS6(3)}, /* - */
204 {T_CMPX, SKSS7(2)}, /* . */
205 {T_CMPX, SKSS0(4)}, /* / */
206
207 {T_MAIN, SPK_0}, /* 0 */
208 {T_MAIN, SPK_1}, /* 1 */
209 {T_MAIN, SPK_2}, /* 2 */
210 {T_MAIN, SPK_3}, /* 3 */
211 {T_MAIN, SPK_4}, /* 4 */
212 {T_MAIN, SPK_5}, /* 5 */
213 {T_MAIN, SPK_6}, /* 6 */
214 {T_MAIN, SPK_7}, /* 7 */
215 {T_MAIN, SPK_8}, /* 8 */
216 {T_MAIN, SPK_9}, /* 9 */
217
218 {T_CMPX, SKSS0(1)}, /* : */
219 {T_CMPX, SKSS5(1)}, /* ; */
220 {T_CMPX, SKSS2(3)}, /* < */
221 {T_CMPX, SKSS6(1)}, /* = */
222 {T_CMPX, SKSS2(4)}, /* > */
223 {T_CMPX, SKSS0(3)}, /* ? */
224 {T_CMPX, SKSS3(1)}, /* @ */
225
226 {T_CMPX, SKCS1(0)}, /* A */
227 {T_CMPX, SKCS7(4)}, /* B */
228 {T_CMPX, SKCS0(3)}, /* C */
229 {T_CMPX, SKCS1(2)}, /* D */
230 {T_CMPX, SKCS2(2)}, /* E */
231 {T_CMPX, SKCS1(3)}, /* F */
232 {T_CMPX, SKCS1(4)}, /* G */
233 {T_CMPX, SKCS6(4)}, /* H */
234 {T_CMPX, SKCS5(2)}, /* I */
235 {T_CMPX, SKCS6(3)}, /* J */
236 {T_CMPX, SKCS6(2)}, /* K */
237 {T_CMPX, SKCS6(1)}, /* L */
238 {T_CMPX, SKCS7(2)}, /* M */
239 {T_CMPX, SKCS7(3)}, /* N */
240 {T_CMPX, SKCS5(1)}, /* O */
241 {T_CMPX, SKCS5(0)}, /* P */
242 {T_CMPX, SKCS2(0)}, /* Q */
243 {T_CMPX, SKCS2(3)}, /* R */
244 {T_CMPX, SKCS1(1)}, /* S */
245 {T_CMPX, SKCS2(4)}, /* T */
246 {T_CMPX, SKCS5(3)}, /* U */
247 {T_CMPX, SKCS0(4)}, /* V */
248 {T_CMPX, SKCS2(1)}, /* W */
249 {T_CMPX, SKCS0(2)}, /* X */
250 {T_CMPX, SKCS5(4)}, /* Y */
251 {T_CMPX, SKCS0(1)}, /* Z */
252
253 {T_EXTR, SKCS5(4)}, /* [ */
254 {T_EXTR, SKCS1(2)}, /* backslash */
255 {T_EXTR, SKCS5(3)}, /* ] */
256 {T_CMPX, SKSS6(4)}, /* ^ */
257 {T_CMPX, SKSS4(0)}, /* _ */
258 {T_CMPX, SKSS0(2)}, /* ` */
259
260 {T_MAIN, SPK_A}, /* a */
261 {T_MAIN, SPK_B}, /* b */
262 {T_MAIN, SPK_C}, /* c */
263 {T_MAIN, SPK_D}, /* d */
264 {T_MAIN, SPK_E}, /* e */
265 {T_MAIN, SPK_F}, /* f */
266 {T_MAIN, SPK_G}, /* g */
267 {T_MAIN, SPK_H}, /* h */
268 {T_MAIN, SPK_I}, /* i */
269 {T_MAIN, SPK_J}, /* j */
270 {T_MAIN, SPK_K}, /* k */
271 {T_MAIN, SPK_L}, /* l */
272 {T_MAIN, SPK_M}, /* m */
273 {T_MAIN, SPK_N}, /* n */
274 {T_MAIN, SPK_O}, /* o */
275 {T_MAIN, SPK_P}, /* p */
276 {T_MAIN, SPK_Q}, /* q */
277 {T_MAIN, SPK_R}, /* r */
278 {T_MAIN, SPK_S}, /* s */
279 {T_MAIN, SPK_T}, /* t */
280 {T_MAIN, SPK_U}, /* u */
281 {T_MAIN, SPK_V}, /* v */
282 {T_MAIN, SPK_W}, /* w */
283 {T_MAIN, SPK_X}, /* x */
284 {T_MAIN, SPK_Y}, /* y */
285 {T_MAIN, SPK_Z}, /* z */
286
287 {T_EXTR, SKCS1(3)}, /* { */
288 {T_EXTR, SKCS1(1)}, /* | */
289 {T_EXTR, SKCS1(4)}, /* } */
290 {T_EXTR, SKCS1(0)}, /* ~ */
291};
292
293static struct spnamedkey spkey_misc[] = {
294 {"none", SKE, SKE},
295
296 {"space", SPK_SPACE, SKE},
297 {"enter", SPK_ENTER, SKE},
298 {"capsshift", SPK_CAPSSHIFT, SKE},
299 {"symbolshift", SPK_SYMBOLSHIFT, SKE},
300
301 {"kempston_up", SKE, KEMP(KEMPU)},
302 {"kempston_down", SKE, KEMP(KEMPD)},
303 {"kempston_left", SKE, KEMP(KEMPL)},
304 {"kempston_right", SKE, KEMP(KEMPR)},
305 {"kempston_fire", SKE, KEMP(KEMPF)},
306
307 {NULL, SKE, SKE}
308};
309
310#define MAXBASEKEYS 128
311
312static struct spbasekey basekeys[MAXBASEKEYS];
313static int numbasekeys;
314
315static struct spbasekey customkeys[MAXBASEKEYS];
316static int numcustomkeys = 0;
317
318static struct spbasekey normalkeys[] = {
319 {'0', SPK_0, SKE}, /* 0 */
320 {'1', SPK_1, SKE}, /* 1 */
321 {'2', SPK_2, SKE}, /* 2 */
322 {'3', SPK_3, SKE}, /* 3 */
323 {'4', SPK_4, SKE}, /* 4 */
324 {'5', SPK_5, SKE}, /* 5 */
325 {'6', SPK_6, SKE}, /* 6 */
326 {'7', SPK_7, SKE}, /* 7 */
327 {'8', SPK_8, SKE}, /* 8 */
328 {'9', SPK_9, SKE}, /* 9 */
329
330 {'a', SPK_A, SKE}, /* a */
331 {'b', SPK_B, SKE}, /* b */
332 {'c', SPK_C, SKE}, /* c */
333 {'d', SPK_D, SKE}, /* d */
334 {'e', SPK_E, SKE}, /* e */
335 {'f', SPK_F, SKE}, /* f */
336 {'g', SPK_G, SKE}, /* g */
337 {'h', SPK_H, SKE}, /* h */
338 {'i', SPK_I, SKE}, /* i */
339 {'j', SPK_J, SKE}, /* j */
340 {'k', SPK_K, SKE}, /* k */
341 {'l', SPK_L, SKE}, /* l */
342 {'m', SPK_M, SKE}, /* m */
343 {'n', SPK_N, SKE}, /* n */
344 {'o', SPK_O, SKE}, /* o */
345 {'p', SPK_P, SKE}, /* p */
346 {'q', SPK_Q, SKE}, /* q */
347 {'r', SPK_R, SKE}, /* r */
348 {'s', SPK_S, SKE}, /* s */
349 {'t', SPK_T, SKE}, /* t */
350 {'u', SPK_U, SKE}, /* u */
351 {'v', SPK_V, SKE}, /* v */
352 {'w', SPK_W, SKE}, /* w */
353 {'x', SPK_X, SKE}, /* x */
354 {'y', SPK_Y, SKE}, /* y */
355 {'z', SPK_Z, SKE}, /* z */
356
357 {-1, SKE, SKE}
358};
359
360static struct spbasekey extendedkeys[] = {
361 {' ', SPK_SPACE, SKE}, /* space */
362 {TRKS(SK_Return), SPK_ENTER, SKE}, /* enter */
363 {TRKS(SK_KP_Enter), SPK_ENTER, SKE},
364 {TRKS(SK_Shift_L), SPK_CAPSSHIFT, SKE}, /* caps shift */
365 {TRKS(SK_Shift_R), SPK_SYMBOLSHIFT, SKE}, /* symbol shift */
366 {TRKS(SK_BackSpace), SPK_BS, SKE}, /* backspace */
367 {TRKS(SK_Delete), SPK_BS, SKE},
368 {TRKS(SK_KP_Delete), SPK_BS, SKE},
369 {TRKS(SK_Escape), SPK_EDIT, SKE}, /* caps shift + '1' */
370
371 {-1, SKE, SKE}
372};
373
374static struct spbasekey spectrumkeys[] = {
375 {',', SPK_SYMBOLSHIFT, SKE},
376 {'.', SPK_SPACE, SKE},
377 {';', SPK_ENTER, SKE},
378
379 {-1, SKE, SKE}
380};
381
382
383static struct spbasekey compatkeys[] = {
384 {TRKS(SK_Shift_L), SPK_CAPSSHIFT, SKE}, /* caps shift */
385 {TRKS(SK_Shift_R), SPK_CAPSSHIFT, SKE},
386 {TRKS(SK_Alt_L), SPK_SYMBOLSHIFT, SKE}, /* symbol shift */
387 {TRKS(SK_Alt_R), SPK_SYMBOLSHIFT, SKE},
388 {TRKS(SK_Meta_L), SPK_SYMBOLSHIFT, SKE},
389 {TRKS(SK_Meta_R), SPK_SYMBOLSHIFT, SKE},
390#if TRUEKOMPAT
391 {TRKS(SK_Control_L), SPK_EXTRA, SKE}, /* caps shift + symbol shift */
392 {TRKS(SK_Control_R), SPK_EXTRA, SKE},
393#endif
394
395 {-1, SKE, SKE}
396};
397
398static struct spbasekey shiftedcurs[] = {
399 {TRKS(SK_Up), SPK_UP, SKE}, /* up */
400 {TRKS(SK_KP_Up), SPK_UP, SKE},
401 {TRKS(SK_Down), SPK_DOWN, SKE}, /* down */
402 {TRKS(SK_KP_Down), SPK_DOWN, SKE},
403 {TRKS(SK_Left), SPK_LEFT, SKE}, /* left */
404 {TRKS(SK_KP_Left), SPK_LEFT, SKE},
405 {TRKS(SK_Right), SPK_RIGHT, SKE}, /* right */
406 {TRKS(SK_KP_Right), SPK_RIGHT, SKE},
407
408 {-1, SKE, SKE}
409};
410
411static struct spbasekey rawcurs[] = {
412 {TRKS(SK_Up), SPK_7, SKE}, /* up */
413 {TRKS(SK_KP_Up), SPK_7, SKE},
414 {TRKS(SK_Down), SPK_6, SKE}, /* down */
415 {TRKS(SK_KP_Down), SPK_6, SKE},
416 {TRKS(SK_Left), SPK_5, SKE}, /* left */
417 {TRKS(SK_KP_Left), SPK_5, SKE},
418 {TRKS(SK_Right), SPK_8, SKE}, /* right */
419 {TRKS(SK_KP_Right), SPK_8, SKE},
420
421 {-1, SKE, SKE}
422};
423
424static struct spbasekey joycurs[] = {
425 {TRKS(SK_Up), SKE, KEMP(KEMPU)}, /* up */
426 {TRKS(SK_KP_Up), SKE, KEMP(KEMPU)},
427 {TRKS(SK_Down), SKE, KEMP(KEMPD)}, /* down */
428 {TRKS(SK_KP_Down), SKE, KEMP(KEMPD)},
429 {TRKS(SK_Left), SKE, KEMP(KEMPL)}, /* left */
430 {TRKS(SK_KP_Left), SKE, KEMP(KEMPL)},
431 {TRKS(SK_Right), SKE, KEMP(KEMPR)}, /* right */
432 {TRKS(SK_KP_Right), SKE, KEMP(KEMPR)},
433 {TRKS(SK_KP_Insert), SKE, KEMP(KEMPF)}, /* fire */
434 {TRKS(SK_Insert), SKE, KEMP(KEMPF)},
435 {TRKS(SK_KP_Delete), SKE, KEMP(KEMPF)},
436 {TRKS(SK_KP_Home), SKE, KEMP(KEMPU | KEMPL)}, /* up + left*/
437 {TRKS(SK_Home), SKE, KEMP(KEMPU | KEMPL)},
438 {TRKS(SK_KP_Page_Up), SKE, KEMP(KEMPU | KEMPR)}, /* up + right*/
439 {TRKS(SK_Page_Up), SKE, KEMP(KEMPU | KEMPR)},
440 {TRKS(SK_KP_End), SKE, KEMP(KEMPD | KEMPL)}, /* down + left*/
441 {TRKS(SK_End), SKE, KEMP(KEMPD | KEMPL)},
442 {TRKS(SK_KP_Page_Down), SKE, KEMP(KEMPD | KEMPR)}, /* down + right*/
443 {TRKS(SK_Page_Down), SKE, KEMP(KEMPD | KEMPR)},
444
445 {-1, SKE, SKE}
446};
447
448int spkey_new_custom(int key)
449{
450 if(numcustomkeys >= MAXBASEKEYS) return 0;
451
452 customkeys[numcustomkeys].index = key;
453 SP_SETEMPTY(customkeys[numcustomkeys].kb);
454 SP_SETEMPTY(customkeys[numcustomkeys].misc);
455 numcustomkeys++;
456
457 return 1;
458}
459
460int spkey_add_custom(const char *name)
461{
462 int curr;
463
464 curr = numcustomkeys - 1;
465
466 if(!name[1] && isalnum(name[0])) {
467 int ai;
468 ai = tolower(name[0])-32;
469 SP_COMBINE(customkeys[curr].kb, spkey_ascii[ai].kb);
470 return 1;
471 }
472 else {
473 int i;
474
475 for(i = 0; spkey_misc[i].name != NULL; i++) {
476 if(mis_strcasecmp(spkey_misc[i].name, name) == 0) {
477 SP_COMBINE(customkeys[curr].kb, spkey_misc[i].kb);
478 SP_COMBINE(customkeys[curr].misc, spkey_misc[i].misc);
479 return 1;
480 }
481 }
482 }
483 return 0;
484}
485
486static int key_reset(struct keystate *ck)
487{
488 if(ck->state == 2 && sp_int_ctr >= ck->frame) {
489 ck->state = 0;
490 return 1;
491 }
492 else return 0;
493}
494
495
496void process_keys(void)
497{
498 int i;
499 struct keystate *ck;
500 int tsh;
501 int kalone;
502 static int extrai = 0;
503 static qbyte extraendframe;
504
505 if(extrai && !spkb_kbstate[extrai].state) extrai = 0;
506
507 if(!spkb_state_changed && (!extrai || !extraendframe)) return;
508
509 SP_SETEMPTY(spkey_state);
510 SP_SETEMPTY(spmisc_state);
511
512 kalone = 0;
513 ck = spkb_kbstate + spkb_last.index;
514 tsh = spkb_last.modif & trueshift;
515 key_reset(ck);
516
517
518 if(spkb_allow_ascii && ck->state && (!ck->base || tsh)) {
519 unsigned ks;
520 ks = tsh ? spkb_last.shifted : spkb_last.keysym;
521 if(ks >= 32 && ks < 127) {
522 if(spkey_ascii[ks-32].type <= T_CMPX) {
523 SP_COMBINE(spkey_state, spkey_ascii[ks-32].kb);
524 kalone = 1;
525 }
526 else if(spkey_ascii[ks-32].type == T_EXTR) {
527 if(!extrai || sp_int_ctr < extraendframe) {
528 if(!extrai) {
529 extrai = spkb_last.index;
530 extraendframe = sp_int_ctr + 1;
531 }
532 SP_COMBINE(spkey_state, spk_extra);
533 }
534 else {
535 SP_COMBINE(spkey_state, spkey_ascii[ks-32].kb);
536 extraendframe = 0;
537 }
538 kalone = 1;
539 }
540 }
541 }
542
543 if(!kalone) {
544 for(i = 0; i < numbasekeys; i++) {
545 ck = spkb_kbstate + basekeys[i].index;
546 key_reset(ck);
547 if(ck->state) {
548 SP_COMBINE(spkey_state, basekeys[i].kb);
549 SP_COMBINE(spmisc_state, basekeys[i].misc);
550 }
551 }
552 }
553 SP_COMBINE(spkey_state, kb_mkey);
554
555 spkb_refresh();
556 spkb_state_changed = 0;
557}
558
559void clear_keystates(void)
560{
561 int i;
562 for(i = 0; i < NR_SPKEYS; i++) spkb_kbstate[i].state = 0;
563 spkb_last.index = 0;
564 SP_SETEMPTY(spkey_state);
565 SP_SETEMPTY(kb_mkey);
566 SP_SETEMPTY(spmisc_state);
567 spkb_refresh();
568}
569
570static void keycpy(struct spbasekey *to, struct spbasekey *from)
571{
572 to->index = from->index;
573 SP_COPY(to->kb, from->kb);
574 SP_COPY(to->misc, from->misc);
575}
576
577static void copy_key(struct spbasekey *addk)
578{
579 int i;
580 int nindex;
581
582 nindex = addk->index;
583
584 if(SP_NONEMPTY(addk->kb) || SP_NONEMPTY(addk->misc)) {
585 for(i = 0; i < numbasekeys; i++) {
586 if(basekeys[i].index == nindex) { /* Replace */
587 keycpy(&basekeys[i], addk);
588 return;
589 }
590 }
591 if(numbasekeys < MAXBASEKEYS - 1) { /* Add */
592 keycpy(&basekeys[numbasekeys], addk);
593 spkb_kbstate[nindex].base = 1;
594 numbasekeys++;
595 }
596 }
597 else { /* Delete */
598 for(i = 0; i < numbasekeys; i++) {
599 if(basekeys[i].index == nindex) {
600 i++;
601 for(; i < numbasekeys; i++) keycpy(&basekeys[i-1], &basekeys[i]);
602 spkb_kbstate[nindex].base = 0;
603 numbasekeys--;
604 break;
605 }
606 }
607 }
608}
609
610static void copy_basekeys(struct spbasekey *addk)
611{
612 int i;
613
614 for(i = 0; addk[i].index >= 0; i++) copy_key(&addk[i]);
615}
616
617static unsigned transform_shift(int modif)
618{
619 if(!modif) return 0;
620 else return (1 << (modif - 1));
621}
622
623
624void init_basekeys(void)
625{
626 int i;
627 numbasekeys = 0;
628
629 for(i = 0; i < NR_SPKEYS; i++) spkb_kbstate[i].base = 0;
630
631 customkeys[numcustomkeys].index = -1;
632
633 copy_basekeys(normalkeys);
634 copy_basekeys(extendedkeys);
635 copy_basekeys(shiftedcurs);
636
637 switch(keyboard_type) {
638 case 0:
639 break;
640
641 case 1:
642 copy_basekeys(spectrumkeys);
643 break;
644
645 case 2:
646 if(spkb_trueshift == -1) spkb_trueshift = 0;
647#if TRUEKOMPAT
648 if(spkb_funcshift == -1) spkb_funcshift = 0;
649#endif
650
651 copy_basekeys(compatkeys);
652 break;
653
654 case 3:
655 copy_basekeys(customkeys);
656 break;
657 }
658
659 switch(cursor_type) {
660 case 0:
661 break;
662
663 case 1:
664 copy_basekeys(rawcurs);
665 break;
666
667 case 2:
668 copy_basekeys(joycurs);
669 break;
670 }
671
672 if(spkb_trueshift == -1) spkb_trueshift = 4; /* mod1 */
673 if(spkb_funcshift == -1) spkb_funcshift = 3; /* control */
674
675 trueshift = transform_shift(spkb_trueshift);
676 funcshift = transform_shift(spkb_funcshift);
677}
678
679
680void spkb_refresh(void)
681{
682 int port, pb;
683 int i, j, changed;
684 byte *km, *kmo;
685 byte mm;
686 byte pv;
687 spkeyboard statemx;
688
689 km = spkey_state;
690 kmo = oldstate;
691 changed = 0;
692 for(i = 8; i; i--) {
693 if(*km != *kmo) *kmo = *km, changed = 1;
694 km++, kmo++;
695 }
696
697 if(changed) {
698
699 /* Matrix behavior: ONLY 1 level, does anybody need more ? */
700
701 for(i = 0; i < 8; i++) {
702 pv = spkey_state[i];
703 mm = pv;
704 if(pv) {
705 km = spkey_state;
706 for(j = 8; j; j--) {
707 if((*km & pv) & 0x1F) mm |= *km;
708 km++;
709 }
710 }
711 statemx[i] = mm;
712 }
713
714 for(port = 0; port < 256; port++) {
715 km = statemx;
716 pv = 0;
717 pb = port;
718 for(i = 8; i; i--) {
719 if(!(pb & 1)) pv |= *km;
720 pb >>= 1;
721 km++;
722 }
723 sp_fe_inport_high[port] =
724 (sp_fe_inport_high[port] | 0x1F) & ~(pv & 0x1F);
725 }
726 }
727
728 pv = spmisc_state[0];
729
730 if((pv & KEMPR) && (pv & KEMPL)) pv &= ~(KEMPR | KEMPL);
731 if((pv & KEMPU) && (pv & KEMPD)) pv &= ~(KEMPD | KEMPU);
732 z80_inports[KEMP_PORT] = pv;
733}
734
735
736
737
738#if 0
739static void print_help(int lev)
740{
741 lev=lev;
742#if 0
743switch(lev) {
744 case 0:
745 printf(" = ZX Spectrum Emulation (C) Szeredi Miklos 1996-98 = \n"
746 " ----------------------------------------------------------\n"
747 " Left Shift Spectrum - CAPS SHIFT \n"
748 " Right Shift Spectrum - SYMBOL SHIFT \n"
749 " Alt \"True\" Shift \n"
750 " Ctrl Commands \n"
751 " ----------------------------------------------------------\n"
752 " Ctrl-c F10 Quit \n"
753 " Ctrl-h F1 More help \n"
754 " Ctrl-t F2 Save snapshot \n"
755 " Ctrl-l F3 Load snapshot \n"
756 " Ctrl-p F4 Play tape \n"
757 " Ctrl-q F5 Reset \n"
758 " Ctrl-o F6 Pause/unpause tape \n"
759 " Ctrl-s F7 Stop tape \n"
760 " Ctrl-f Fast \n"
761 " Ctrl-n Normal speed \n"
762 " Ctrl-b Pause/Unpause emulator \n"
763 " Ctrl-m Toggle sound \n"
764 " Ctrl-y Toggle quick loading of tapes \n"
765 " Ctrl-\\ F9 Refresh screen / reset keyboard \n"
766 " ==========================================================\n");
767 break;
768
769 case 1:
770 printf(" = ZX Spectrum Emulation (C) Szeredi Miklos 1996-98 = \n"
771 " ----------------------------------------------------------\n"
772 " More help: \n"
773 " ----------------------------------------------------------\n"
774 " Ctrl-h F1 Normal help \n"
775 " Ctrl-k Display (undisplay) keyboard \n"
776 " Ctrl-w Ctrl-F2 Save temporary snapshot \n"
777 " Ctrl-e Ctrl-F3 Load temporary snapshot \n"
778 " Ctrl-r Save to tapefile \n"
779 " Ctrl-, Reduce screen size (X only) \n"
780 " Ctrl-. Increase screen size (X only) \n"
781 " Ctrl-. Toggle private color-map (X only) \n"
782 " Ctrl-= Decrease frame frequency \n"
783 " Ctrl-- Increase frame frequency \n"
784 " Ctrl-] Increase sound buffer size \n"
785 " Ctrl-[ Decrease sound buffer size \n"
786 " ==========================================================\n");
787 break;
788
789 case 2:
790 printf(
791" --------------------------------------------------------------------- \n"
792"|BLUE |RED |MAGENT|GREEN |CYAN |YELLOW|WHITE | | |BLACK | \n"
793"| 1 ! | 2 @ | 3 # | 4 $ | 5 %% | 6 & | 7 ' | 8 ( | 9 ) | 0 _ | \n"
794"|EDIT |CAPS |TRU VD|INV VD| <- | v | ^ | -> |GRAPH |DELETE| \n"
795"|DEF FN|FN |LINE |OPEN# |CLOSE#|MOVE |ERASE |POINT |CAT |FORMAT| \n"
796" ------------------------------------------------------------------------ \n"
797" |SIN |COS |TAN |INT |RND |STR$ |CHR$ |CODE |PEEK |TAB | \n"
798" | Q <= | W <> | E >= | R < | T > | Y AND| U OR | I AT | O ; | P \" | \n"
799" |PLOT |DRAW |REM |RUN |RAND |RETURN|IF |INPUT |POKE |PRINT | \n"
800" |ASN |ACS |ATN |VERIFY|MERGE | [ | ] |IN |OUT |(C) | \n"
801" ------------------------------------------------------------------------ \n"
802" |READ |RESTOR|DATA |SGN |ABS |SQR |VAL |LEN |USR | |\n"
803" |A STOP| S NOT|D STEP| F TO |G THEN| H ^ | J - | K + | L = | |\n"
804" |NEW |SAVE |DIM |FOR |GO TO |GO SUB|LOAD |LIST |LET |ENTER|\n"
805" | ~ | | | \\ | { | } |CIRCLE|VAL$ |SCRN$ |ATTR | |\n"
806" -------------------------------------------------------------------------- \n"
807" | |LN |EXP |LPRINT|LLIST |BIN |INKEY$| PI | | | \n"
808" | CAPS | Z : | X GBP| C ? | V / | B * | N , | M . |SYMBOL| BREAK | \n"
809" | SHIFT |COPY |CLEAR |CONT |CLS |BORDER|NEXT |PAUSE |SHIFT | SPACE | \n"
810" | |BEEP |INK |PAPER |FLASH |BRIGHT|OVER |INVERS| | | \n"
811" ----------------------------------------------------------------------- \n"
812 );
813 break;
814
815 }
816/* if(need_switch_mode) {
817 printf(" Press ENTER to continue! \n");
818 while(getchar() != '\n');
819 }*/
820#endif
821}
822#endif
823#ifdef DEBUG_Z80
824extern int deb_steps;
825#endif
826
827#define CF(x) ((x) + 12)
828
829int spkey_keyfuncs(void)
830{
831 static int help_mode = 0;
832 int lch;
833 int new_help_mode;
834
835 lch = spkb_last.keysym;
836
837 if(!(spkb_last.modif & funcshift) &&
838 (lch < SK_F1 || lch > SK_F12 ||
839 (spkb_last.modif & SKMod1Mask))) return 0;
840
841 if(lch >= 'A' && lch <= 'Z') lch += 32;
842 if((spkb_last.modif & funcshift) && lch >= SK_F1 && lch <= SK_F12)
843 lch = CF(lch);
844
845 new_help_mode = 0;
846
847 switch(lch) {
848 case 'c':
849/* case SK_F10:
850 exit(0);*/
851 case 'p':
852 case SK_F4:
853 spkey_textmode();
854 start_play();
855 spkey_screenmode();
856 break;
857 case 'r':
858 spkey_textmode();
859 start_rec();
860 spkey_screenmode();
861 break;
862 case 'o':
863 case SK_F6:
864 pause_play();
865 break;
866 case 's':
867 case SK_F7:
868 stop_play();
869 break;
870 case 'f':
871 sp_nosync = 1;
872 sp_paused = 0;
873 autoclose_sound();
874 break;
875 case 'n':
876 sp_nosync = 0;
877 sp_paused = 0;
878 break;
879 case 'b':
880 sp_paused = !sp_paused;
881 if(sp_paused) clear_keystates();
882 /*sprintf(msgbuf, "%s emulator", sp_paused ? "Paused" : "Unpaused");
883 put_msg(msgbuf);*/
884/* rb->splash (HZ*2, true,sp_paused ? "Paused" : "Unpaused");*/
885 break;
886 case 'q':
887 case SK_F5:
888 z80_reset();
889 break;
890 case 't':
891 case SK_F2:
892 spkey_textmode();
893 save_snapshot();
894 spkey_screenmode();
895 break;
896 case 'l':
897 case SK_F3:
898 spkey_textmode();
899 load_snapshot();
900 spkey_screenmode();
901 break;
902#ifdef DEBUG_Z80
903 case 'v':
904 deb_steps = 0;
905 break;
906#endif
907 case '=':
908 if(showframe < 10) showframe++;
909/* sprintf(msgbuf, "showframe: %i", showframe);
910 put_msg(msgbuf);*/
911 break;
912 case '-':
913 if(showframe > 1) showframe--;
914/* sprintf(msgbuf, "showframe: %i", showframe);
915 put_msg(msgbuf);*/
916 break;
917 case ']':
918 if(bufframes < 25) bufframes++;
919/* sprintf(msgbuf, "msgbuf, bufframes: %i", bufframes);
920 put_msg(msgbuf);*/
921 setbufsize();
922 break;
923 case '[':
924 if(bufframes > 1) bufframes--;
925/* sprintf(msgbuf, "bufframes: %i", bufframes);
926 put_msg(msgbuf);*/
927 setbufsize();
928 break;
929 case 'm':
930 sound_on = !sound_on;
931/* sprintf(msgbuf, "sound %s", sound_on ? "on" : "off");
932 put_msg(msgbuf);*/
933 break;
934 case 'h':
935 case SK_F1:
936/* case SK_Help:
937 spkey_textmode();
938 print_help(help_mode);
939 spkey_screenmode();
940 new_help_mode = 1 - help_mode;
941 break;*/
942/* case 'k':
943 spkey_textmode();
944 if(!display_keyboard()) print_help(2);
945 spkey_screenmode();
946 break;*/
947 case '\\':
948 case SK_F9:
949 spscr_refresh_colors();
950/* sp_init_screen_mark(); already donde in prev fn. */
951 clear_keystates();
952 break;
953 case '.':
954 resize_spect_scr(scrmul+1);
955 break;
956 case ',':
957 resize_spect_scr(scrmul-1);
958 break;
959 case 'y':
960 sp_quick_load = !sp_quick_load;
961/* sprintf(msgbuf, "Quick load %s", sp_quick_load ? "on" : "off");
962 put_msg(msgbuf);*/
963 break;
964 case 'w':
965 case CF(SK_F2):
966 save_quick_snapshot();
967 break;
968 case 'e':
969 case CF(SK_F3):
970 load_quick_snapshot();
971 break;
972 case 'j':
973 privatemap = !privatemap;
974/* sprintf(msgbuf, "Private colormap %s", privatemap ? "on" : "off");
975 put_msg(msgbuf);*/
976 spscr_refresh_colors();
977 break;
978 }
979
980 help_mode = new_help_mode;
981
982 return 1;
983}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPKEY_H
22#define SPKEY_H
23
24extern void spkb_process_events(int evenframe);
25extern void init_spect_key(void);
26
27extern int spkey_new_custom(int key);
28extern int spkey_add_custom(const char *name);
29
30#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPKEY_P_H
22#define SPKEY_P_H
23
24#include "z80_type.h"
25
26struct keystate {
27 dbyte press;
28 byte state;
29 byte base;
30 qbyte frame;
31};
32
33struct onekey {
34 int index;
35 unsigned keysym;
36 unsigned shifted;
37 unsigned modif;
38};
39
40typedef byte spkeyboard[8];
41
42#define SPIP(spk, h) (((qbyte *) (spk))[h])
43
44#define SP_COMBINE(spk1, spk2) \
45 SPIP(spk1, 0) |= SPIP(spk2, 0), \
46 SPIP(spk1, 1) |= SPIP(spk2, 1)
47
48
49#define SP_SUBSTRACT(spk1, spk2) \
50 SPIP(spk1, 0) &= ~SPIP(spk2, 0), \
51 SPIP(spk1, 1) &= ~SPIP(spk2, 1)
52
53
54#define SP_NONEMPTY(spk) (SPIP(spk, 0) || SPIP(spk, 1))
55
56#define SP_CONTAINS(spk1, spk2) \
57 ((SPIP(spk1, 0) & SPIP(spk2, 0)) || (SPIP(spk1, 1) & SPIP(spk2, 1)))
58
59#define SP_SETEMPTY(spk) \
60 SPIP(spk, 0) = 0, \
61 SPIP(spk, 1) = 0
62
63#define SP_COPY(spk1, spk2) \
64 SPIP(spk1, 0) = SPIP(spk2, 0), \
65 SPIP(spk1, 1) = SPIP(spk2, 1)
66
67
68#define TRKS(ks) ((ks) - 0xFF00 + 0x100)
69#define KS_TO_KEY(ks) \
70 (((ks) >= 0x0000 && (ks) <= 0x00FF) ? (int) (ks) : \
71 (((ks) >= 0xFF00 && (ks) <= 0xFFFF) ? (int) TRKS(ks) : -1))
72
73
74
75/* These are _accidently_ the same as the XK_ counterparts */
76
77#define SK_BackSpace 0xFF08 /* back space, back char */
78#define SK_Tab 0xFF09
79#define SK_Linefeed 0xFF0A /* Linefeed, LF */
80#define SK_Clear 0xFF0B
81#define SK_Return 0xFF0D /* Return, enter */
82#define SK_Pause 0xFF13 /* Pause, hold */
83#define SK_Scroll_Lock 0xFF14
84#define SK_Sys_Req 0xFF15
85#define SK_Escape 0xFF1B
86#define SK_Delete 0xFFFF /* Delete, rubout */
87
88#define SK_Home 0xFF50
89#define SK_Left 0xFF51 /* Move left, left arrow */
90#define SK_Up 0xFF52 /* Move up, up arrow */
91#define SK_Right 0xFF53 /* Move right, right arrow */
92#define SK_Down 0xFF54 /* Move down, down arrow */
93#define SK_Page_Up 0xFF55 /* Prior, previous */
94#define SK_Page_Down 0xFF56 /* Next */
95#define SK_End 0xFF57 /* EOL */
96#define SK_Begin 0xFF58 /* BOL */
97
98#define SK_Select 0xFF60 /* Select, mark */
99#define SK_Print 0xFF61
100#define SK_Execute 0xFF62 /* Execute, run, do */
101#define SK_Insert 0xFF63 /* Insert, insert here */
102#define SK_Undo 0xFF65 /* Undo, oops */
103#define SK_Redo 0xFF66 /* redo, again */
104#define SK_Menu 0xFF67
105#define SK_Find 0xFF68 /* Find, search */
106#define SK_Cancel 0xFF69 /* Cancel, stop, abort, exit */
107#define SK_Help 0xFF6A /* Help */
108#define SK_Break 0xFF6B
109#define SK_Mode_switch 0xFF7E /* Character set switch */
110#define SK_Num_Lock 0xFF7F
111
112#define SK_KP_Space 0xFF80 /* space */
113#define SK_KP_Tab 0xFF89
114#define SK_KP_Enter 0xFF8D /* enter */
115#define SK_KP_F1 0xFF91 /* PF1, KP_A, ... */
116#define SK_KP_F2 0xFF92
117#define SK_KP_F3 0xFF93
118#define SK_KP_F4 0xFF94
119#define SK_KP_Home 0xFF95
120#define SK_KP_Left 0xFF96
121#define SK_KP_Up 0xFF97
122#define SK_KP_Right 0xFF98
123#define SK_KP_Down 0xFF99
124#define SK_KP_Page_Up 0xFF9A
125#define SK_KP_Page_Down 0xFF9B
126#define SK_KP_End 0xFF9C
127#define SK_KP_Begin 0xFF9D
128#define SK_KP_Insert 0xFF9E
129#define SK_KP_Delete 0xFF9F
130#define SK_KP_Equal 0xFFBD /* equals */
131#define SK_KP_Multiply 0xFFAA
132#define SK_KP_Add 0xFFAB
133#define SK_KP_Separator 0xFFAC /* separator, often comma */
134#define SK_KP_Subtract 0xFFAD
135#define SK_KP_Decimal 0xFFAE
136#define SK_KP_Divide 0xFFAF
137
138#define SK_KP_0 0xFFB0
139#define SK_KP_1 0xFFB1
140#define SK_KP_2 0xFFB2
141#define SK_KP_3 0xFFB3
142#define SK_KP_4 0xFFB4
143#define SK_KP_5 0xFFB5
144#define SK_KP_6 0xFFB6
145#define SK_KP_7 0xFFB7
146#define SK_KP_8 0xFFB8
147#define SK_KP_9 0xFFB9
148
149#define SK_F1 0xFFBE
150#define SK_F2 0xFFBF
151#define SK_F3 0xFFC0
152#define SK_F4 0xFFC1
153#define SK_F5 0xFFC2
154#define SK_F6 0xFFC3
155#define SK_F7 0xFFC4
156#define SK_F8 0xFFC5
157#define SK_F9 0xFFC6
158#define SK_F10 0xFFC7
159#define SK_F11 0xFFC8
160#define SK_F12 0xFFC9
161
162#define SK_Shift_L 0xFFE1 /* Left shift */
163#define SK_Shift_R 0xFFE2 /* Right shift */
164#define SK_Control_L 0xFFE3 /* Left control */
165#define SK_Control_R 0xFFE4 /* Right control */
166#define SK_Caps_Lock 0xFFE5 /* Caps lock */
167#define SK_Shift_Lock 0xFFE6 /* Shift lock */
168
169#define SK_Meta_L 0xFFE7 /* Left meta */
170#define SK_Meta_R 0xFFE8 /* Right meta */
171#define SK_Alt_L 0xFFE9 /* Left alt */
172#define SK_Alt_R 0xFFEA /* Right alt */
173#define SK_Super_L 0xFFEB /* Left super */
174#define SK_Super_R 0xFFEC /* Right super */
175#define SK_Hyper_L 0xFFED /* Left hyper */
176#define SK_Hyper_R 0xFFEE /* Right hyper */
177
178/* Modifier masks */
179
180#define SKShiftMask (1<<0)
181#define SKLockMask (1<<1)
182#define SKControlMask (1<<2)
183#define SKMod1Mask (1<<3)
184#define SKMod2Mask (1<<4)
185#define SKMod3Mask (1<<5)
186#define SKMod4Mask (1<<6)
187#define SKMod5Mask (1<<7)
188
189
190#define NR_SPKEYS 512
191
192#define ISFKEY(ks) ((ks) >= SK_F1 && (ks) <= SK_F12)
193
194extern volatile int accept_keys;
195
196extern qbyte sp_int_ctr;
197extern struct keystate spkb_kbstate[];
198extern struct onekey spkb_last;
199
200extern int spkb_state_changed;
201
202extern spkeyboard spkey_state;
203extern spkeyboard kb_mkey;
204
205extern void spkey_textmode(void);
206extern void spkey_screenmode(void);
207
208extern const int need_switch_mode;
209
210extern int spkey_keyfuncs(void);
211extern void spkb_refresh(void);
212extern void clear_keystates(void);
213extern int display_keyboard(void);
214extern void process_keys(void);
215extern void init_basekeys(void);
216
217#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20#include "misc.h"
21#include "zxconfig.h"
22#include "lib/configfile.h"
23
24#include "spperif.h"
25#include "z80.h"
26#include "spmain.h"
27#include "sptiming.h"
28#include "spscr.h"
29#include "spkey_p.h"
30#include "spkey.h"
31#include "sptape.h"
32#include "spsound.h"
33#include "snapshot.h"
34#include "spver.h"
35
36#include "spconf.h"
37
38#include "interf.h"
39
40
41#include <stdio.h>
42#include <string.h>
43#include <stdlib.h>
44#include <errno.h>
45#ifdef USE_GRAY
46#include "../lib/gray.h"
47#endif
48
49#include "zxbox_keyb.h"
50
51int endofsingle;
52
53int sp_nosync = 0;
54
55int showframe = 1;
56int load_immed = 1;
57
58qbyte sp_int_ctr = 0;
59int intkeys[5];
60
61#ifdef USE_DJGPP
62#define DOS
63#endif
64
65#define GLOBALCFG "zxbox.cfg"
66
67/* here goes settings hadling */
68
69/*static struct zxbox_settings settings;*/
70static struct zxbox_settings old_settings;
71
72static char* noyes_options[] = { "No", "Yes" };
73/*static char* kempston_options[] = { "No", "Yes" };
74static char* showfps_options[] = {"No", "Yes"};*/
75
76static struct configdata config[] =
77{
78 {TYPE_ENUM, 0, 2, &settings.invert_colors, "Invert Colors", noyes_options, NULL},
79 {TYPE_ENUM, 0, 2, &settings.kempston, "Map keys to kempston", noyes_options, NULL},
80 {TYPE_ENUM, 0, 2, &settings.showfps, "Show Speed", noyes_options, NULL},
81 {TYPE_ENUM, 0, 2, &settings.sound, "Sound", noyes_options, NULL},
82 {TYPE_INT, 0, 9, &settings.frameskip, "Frameskip", NULL, NULL},
83 {TYPE_INT, 1, 10, &settings.volume, "Volume", NULL, NULL},
84 {TYPE_STRING, 0, 5, NULL,"Key Mapping", NULL, (char*)&settings.keymap},
85};
86int spcf_read_conf_file(const char *filename)
87{
88 settings.volume = 10;
89 settings.showfps=1;
90 settings.keymap[0]='2';
91 settings.keymap[1]='w';
92 settings.keymap[2]='9';
93 settings.keymap[3]='0';
94 settings.keymap[4]='z';
95 settings.kempston = 1 ;
96 settings.invert_colors=0;
97 settings.sound = 0;
98 settings.frameskip = 0;
99
100
101 configfile_init(rb);
102 if (configfile_load(filename, config,
103 sizeof(config)/sizeof(*config),
104 SETTINGS_MIN_VERSION
105 ) < 0)
106 {
107 /* If the loading failed, save a new config file (as the disk is
108 already spinning) */
109 configfile_save(filename, config,
110 sizeof(config)/sizeof(*config),
111 SETTINGS_VERSION);
112 }
113 /* Keep a copy of the saved version of the settings - so we can check if
114 the settings have changed when we quit */
115 old_settings = settings;
116 sound_on = settings.sound;
117 showframe = settings.frameskip+1;
118 int i;
119 for ( i=0 ; i<5 ; i++){
120 if (settings.keymap[i] == 'E')
121 intkeys[i]=SK_KP_Enter;
122 else if ( settings.keymap[i] == 'S' )
123 intkeys[i]=SK_KP_Space;
124 else
125 intkeys[i] = (unsigned) settings.keymap[i];
126 }
127 return 1;
128}
129
130/* and here it stops (settings loading ;) )*/
131
132/* set keys */
133static void set_keys(void){
134 int m;
135 char c;
136 int result;
137 int menu_quit=0;
138 static const struct menu_item items[] = {
139 { "Map Up key", NULL },
140 { "Map Down key", NULL },
141 { "Map Left key", NULL },
142 { "Map Right key", NULL },
143 { "Map Fire/Jump key", NULL },
144 };
145
146 m = rb->menu_init(items, sizeof(items) / sizeof(*items),
147 NULL, NULL, NULL, NULL);
148
149 rb->button_clear_queue();
150
151 while (!menu_quit) {
152 result=rb->menu_show(m);
153
154 switch(result)
155 {
156 case 0:
157 if (!zx_kbd_input((char*) &c))
158 {
159 settings.keymap[0]=c;
160 }
161 break;
162 case 1:
163 if (!zx_kbd_input((char*) &c))
164 {
165 settings.keymap[1]=c;
166 }
167 break;
168 case 2:
169 if (!zx_kbd_input((char*) &c))
170 {
171 settings.keymap[2]=c;
172 }
173 break;
174 case 3:
175 if (!zx_kbd_input((char*) &c))
176 {
177 settings.keymap[3]=c;
178 }
179 break;
180 case 4:
181 if (!zx_kbd_input((char*) &c))
182 {
183 settings.keymap[4]=c;
184 }
185 break;
186 default:
187 menu_quit=1;
188 break;
189 }
190 }
191
192 rb->menu_exit(m);
193}
194
195/* select predefined keymap */
196static void select_keymap(void){
197 int m;
198 int result;
199 int menu_quit=0;
200 static const struct menu_item items[] = {
201 { "2w90z", NULL },
202 { "qaopS", NULL },
203 { "7658S", NULL },
204 };
205
206 m = rb->menu_init(items, sizeof(items) / sizeof(*items),
207 NULL, NULL, NULL, NULL);
208
209 rb->button_clear_queue();
210
211 while (!menu_quit) {
212 result=rb->menu_show(m);
213
214 switch(result)
215 {
216 case 0:
217 rb->memcpy ( (void*)&settings.keymap[0] , (void*)items[0].desc , sizeof(items[0].desc));
218 menu_quit=1;
219 break;
220 case 1:
221 rb->memcpy ( (void*)&settings.keymap[0] , (void*)items[1].desc , sizeof(items[1].desc));
222 menu_quit=1;
223 break;
224 case 2:
225 rb->memcpy ( (void*)&settings.keymap[0] , (void*)items[2].desc , sizeof(items[2].desc));
226 menu_quit=1;
227 break;
228 default:
229 menu_quit=1;
230 break;
231 }
232 }
233
234 rb->menu_exit(m);
235}
236
237/* options menu */
238static void options_menu(void){
239 static const struct opt_items no_yes[2] = {
240 { "No", NULL },
241 { "Yes", NULL },
242 };
243 int m;
244 int result;
245 int menu_quit=0;
246 int new_setting;
247 static const struct menu_item items[] = {
248 { "Map Keys to kempston", NULL },
249 { "Display Speed", NULL },
250 { "Invert Colors", NULL },
251 { "Frameskip", NULL },
252 { "Sound", NULL },
253 { "Volume", NULL },
254 { "Predefined keymap", NULL },
255 { "Custom keymap", NULL },
256 };
257 static struct opt_items frameskip_items[] = {
258 { "0", NULL },
259 { "1", NULL },
260 { "2", NULL },
261 { "3", NULL },
262 { "4", NULL },
263 { "5", NULL },
264 { "6", NULL },
265 { "7", NULL },
266 { "8", NULL },
267 { "9", NULL },
268 };
269
270
271 m = rb->menu_init(items, sizeof(items) / sizeof(*items),
272 NULL, NULL, NULL, NULL);
273
274 rb->button_clear_queue();
275
276 while (!menu_quit) {
277 result=rb->menu_show(m);
278
279 switch(result)
280 {
281 case 0:
282 new_setting=settings.kempston;
283 rb->set_option("Map Keys to kempston",&new_setting,INT,
284 no_yes, 2, NULL);
285 if (new_setting != settings.kempston )
286 settings.kempston=new_setting;
287 break;
288 case 1:
289 new_setting = settings.showfps;
290 rb->set_option("Display Speed",&new_setting,INT,
291 no_yes, 2, NULL);
292 if (new_setting != settings.showfps )
293 settings.showfps=new_setting;
294 break;
295 case 2:
296 new_setting = settings.invert_colors;
297 rb->set_option("Invert Colors",&new_setting,INT,
298 no_yes, 2, NULL);
299 if (new_setting != settings.invert_colors )
300 settings.invert_colors=new_setting;
301 rb->splash(HZ, true , "Restart to see effect");
302 break;
303 case 3:
304 new_setting = settings.frameskip;
305 rb->set_option("Frameskip",&new_setting,INT,
306 frameskip_items, 10, NULL);
307 if (new_setting != settings.frameskip )
308 settings.frameskip=new_setting;
309 break;
310 case 4:
311 new_setting = settings.sound;
312 rb->set_option("Sound",&new_setting,INT,
313 no_yes, 2, NULL);
314 if (new_setting != settings.sound )
315 settings.sound=new_setting;
316#if CODEC == SWCODEC && !defined SIMULATOR
317 rb->pcm_play_stop();
318#endif
319 break;
320 case 5:
321 new_setting = 9 - settings.volume;
322 rb->set_option("Volume",&new_setting,INT,
323 frameskip_items, 10, NULL);
324 new_setting = 9 - new_setting;
325 if (new_setting != settings.volume )
326 settings.volume=new_setting;
327 break;
328 case 6:
329 select_keymap();
330 break;
331 case 7:
332 set_keys();
333 break;
334 default:
335 menu_quit=1;
336 break;
337 }
338 }
339
340 rb->menu_exit(m);
341}
342
343/* menu */
344static bool zxbox_menu(void)
345{
346#if CODEC == SWCODEC && !defined SIMULATOR
347 rb->pcm_play_stop();
348#endif
349 int m;
350 int result;
351 int menu_quit=0;
352 int exit=0;
353 char c;
354 static const struct menu_item items[] = {
355 { "VKeyboard", NULL },
356 { "Play/Pause Tape", NULL },
357 { "Save Snapshot", NULL },
358 { "Toggle \"fast\" mode", NULL },
359 { "Options", NULL },
360 { "Quit", NULL },
361 };
362
363 m = rb->menu_init(items, sizeof(items) / sizeof(*items),
364 NULL, NULL, NULL, NULL);
365
366 rb->button_clear_queue();
367
368 while (!menu_quit) {
369 result=rb->menu_show(m);
370
371 switch(result)
372 {
373 case 0:
374 if (!zx_kbd_input((char*) &c))
375 {
376 press_key(c);
377 }
378 clear_kbd=1;
379 menu_quit=1;
380 break;
381 case 1:
382 pause_play();
383/* SPNM(load_trapped) = 1;
384 DANM(haltstate) = 1;
385 DANM(tc) = 0;*/
386 menu_quit=1;
387 break;
388 case 2:
389 save_snapshot();
390 break;
391 case 3:
392 sp_nosync=!sp_nosync;
393 menu_quit=1;
394 break;
395 case 4:
396 options_menu();
397 break;
398 case 5:
399 menu_quit=1;
400 exit=1;
401 break;
402 default:
403 menu_quit=1;
404 break;
405 }
406 }
407
408 rb->menu_exit(m);
409#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
410 rb->cpu_boost(true);
411#endif
412
413 int i;
414 for ( i=0 ; i<5 ; i++){
415 if (settings.keymap[i] == 'E')
416 intkeys[i]=SK_KP_Enter;
417 else if ( settings.keymap[i] == 'S' )
418 intkeys[i]=SK_KP_Space;
419 else
420 intkeys[i] = (unsigned) settings.keymap[i];
421 }
422#ifdef USE_GRAY
423 gray_show(true);
424#endif
425 return (exit);
426}
427
428
429/* */
430extern unsigned char loadim[];
431extern unsigned long loadim_size;
432
433#define SHOW_OFFS 1
434
435static void update(void)
436{
437 update_screen();
438 sp_border_update >>= 1;
439 sp_imag_vert = sp_imag_horiz = 0;
440}
441
442static void run_singlemode(void)
443{
444 int t = 0;
445 int evenframe, halfsec, updateframe;
446
447 sp_int_ctr = 0;
448 endofsingle = 0;
449 spti_reset();
450
451 while(!endofsingle) {
452 video_frames++;
453 if (clear_kbd){
454 clear_keystates();
455 clear_kbd=0;
456 }
457 if(exit_requested){
458 if (zxbox_menu()){
459 /* Save the user settings if they have changed */
460 if (rb->memcmp(&settings,&old_settings,sizeof(settings))!=0) {
461#ifdef USE_GRAY
462 gray_show(false);
463#endif
464 rb->splash(0,true,"Saving settings...");
465 configfile_save(GLOBALCFG, config,sizeof(config)/sizeof(*config),SETTINGS_VERSION);
466 }
467
468 return;
469 }
470 exit_requested = 0;
471 video_frames=-1;
472 start_time = *rb->current_tick;
473 sound_on = settings.sound;
474 showframe = settings.frameskip+1;
475 spti_reset();
476 }
477 if(sp_paused) {
478 autoclose_sound();
479 while(sp_paused) {
480 spkb_process_events(1);
481 spti_sleep(SKIPTICKS);
482 translate_screen();
483 update();
484 }
485 spti_reset();
486 }
487 halfsec = !(sp_int_ctr % 25);
488 evenframe = !(sp_int_ctr & 1);
489
490 if(screen_visible) updateframe = sp_nosync ? halfsec :
491 !((sp_int_ctr+SHOW_OFFS) % showframe);
492 else updateframe = 0;
493 if(halfsec) {
494 sp_flash_state = ~sp_flash_state;
495 flash_change();
496 }
497 if(evenframe) {
498 play_tape();
499 sp_scline = 0;
500 }
501 spkb_process_events(evenframe);
502 sp_updating = updateframe;
503 t += CHKTICK;
504 t = sp_halfframe(t, evenframe ? EVENHF : ODDHF);
505 if(SPNM(load_trapped)) {
506 SPNM(load_trapped) = 0;
507 DANM(haltstate) = 0;
508 qload();
509 }
510 z80_interrupt(0xFF);
511 sp_int_ctr++;
512 if(!evenframe) rec_tape();
513 if(!sp_nosync) {
514 if(!sound_avail) spti_wait();
515
516 if(updateframe) update();
517 play_sound(evenframe);
518 }
519 else if(updateframe) update();
520 }
521
522}
523
524
525void check_params(void* parameter)
526{
527 spcf_read_conf_file(GLOBALCFG);
528 spcf_read_command_line(parameter);
529}
530
531static void init_load(void *parameter)
532{
533 if(load_immed) snsh_z80_load_intern(loadim, loadim_size);
534
535 check_params (parameter);
536 if(spcf_init_snapshot != NULL) {
537#ifndef USE_GRAY
538 rb->splash(HZ,true, "Loading snapshot '%s'", spcf_init_snapshot);
539#endif
540
541 load_snapshot_file_type(spcf_init_snapshot, spcf_init_snapshot_type);
542 free_string(spcf_init_snapshot);
543 }
544
545 if(spcf_init_tapefile != NULL) {
546 /*sprintf(msgbuf, "Loading tape '%s'", spcf_init_tapefile);
547 put_msg(msgbuf);*/
548 start_play_file_type(spcf_init_tapefile, 0, spcf_init_tapefile_type);
549 if(!load_immed) pause_play();
550 free_string(spcf_init_tapefile);
551 }
552}
553
554void start_spectemu(void *parameter)
555{
556 spti_init();
557 init_load(parameter);
558 init_spect_scr();
559 init_spect_sound();
560 init_spect_key();
561
562 run_singlemode();
563}
564
565
566
567
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPMAIN_H
22#define SPMAIN_H
23
24extern void check_params(void* parameter);
25extern void start_spectemu(void* parameter);
26extern struct zxbox_settings settings;
27struct zxbox_settings {
28 int invert_colors;
29 int kempston;
30 char keymap[5];
31 int showfps;
32 int volume;
33 int sound;
34 int frameskip;
35};
36
37#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "spperif.h"
22#include "z80.h"
23
24extern unsigned char rom_imag[];
25
26int SPNM(quick_load) = 1;
27int SPNM(load_trapped);
28
29qbyte SPNM(scr_mark)[SCRMARK_SIZE];
30byte SPNM(fe_inport_high)[256];
31
32int SPNM(scline);
33
34
35unsigned char SPNM(colors)[16];
36
37int SPNM(flash_state);
38
39qbyte *SPNM(scr_f0_table);
40qbyte *SPNM(scr_f1_table);
41
42byte SPNM(tape_impinfo)[PORT_TIME_NUM];
43byte SPNM(fe_inport_default);
44byte SPNM(fe_outport_time)[PORT_TIME_NUM];
45byte SPNM(sound_buf)[PORT_TIME_NUM];
46signed char SPNM(tape_sound)[TMNUM];
47int SPNM(scri)[PORT_TIME_NUM];
48int SPNM(coli)[PORT_TIME_NUM];
49
50int SPNM(playing_tape) = 0;
51int SPNM(paused) = 0;
52
53char *SPNM(image);
54int SPNM(updating);
55qbyte SPNM(imag_mark)[192];
56qbyte SPNM(imag_horiz);
57qbyte SPNM(imag_vert);
58int SPNM(border_update);
59int SPNM(lastborder);
60
61void SPNM(init_screen_mark)(void)
62{
63 int i;
64
65 for(i = 0x200; i < 0x2D8; i++) SPNM(scr_mark)[i] = ~((qbyte) 0);
66
67 SPNM(border_update) = 1;
68}
69
70void SPNM(init)(void)
71{
72 int i;
73
74 PRNM(init)();
75 PRNM(reset)();
76
77 SPNM(load_trapped) = 0;
78
79 for(i = 0; i < PORTNUM; i++) PRNM(inports)[i] = 0x00;
80
81 DANM(inport_mask) = 0x20;
82/* TODO: Kempston is always present, this is not nice */
83
84 SPNM(fe_inport_default) = 0xBF; /* Issue 3 */
85
86 DANM(ula_outport) = 0xFF;
87
88 for(i = 0; i < 256; i++) SPNM(fe_inport_high)[i] = 0xFF;
89
90 for(i = 0; i < PORT_TIME_NUM; i++) SPNM(tape_impinfo)[i] = 0;
91 DANM(imp_change) = 0;
92 DANM(ula_inport) = SPNM(fe_inport_default);
93
94 SPNM(scline) = 0;
95
96 for(i = 0; i < 0x4000; i++) PRNM(proc).mem[i] = rom_imag[i];
97
98 SPNM(init_screen_mark)();
99}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPPERIF_H
22#define SPPERIF_H
23
24#ifndef COMPARISON
25#define SPNM(x) sp_ ## x
26#else
27#define SPNM(x) spx_ ## x
28#endif
29
30#include "z80_type.h"
31
32#define ST 140000
33#define CHKTICK 224
34
35/* #define TMNUM (ST / CHKTICK) */
36
37#if 0
38# define TMNUM 625
39# define EVENHF 313
40# define ODDHF 312
41#else
42# define TMNUM 624
43# define EVENHF 312
44# define ODDHF 312
45#endif
46
47
48#define LOAD_DI 0x0559
49#define SA_LD_RET 0x053F
50
51extern int SPNM(quick_load);
52extern int SPNM(load_trapped);
53
54#define SCRMARK_SIZE 2048
55extern qbyte SPNM(scr_mark)[];
56extern byte SPNM(fe_inport_high)[];
57extern int SPNM(playing_tape);
58extern int SPNM(paused);
59
60extern int SPNM(scline);
61
62extern unsigned char SPNM(colors)[];
63
64extern int SPNM(flash_state);
65
66extern qbyte *SPNM(scr_f0_table);
67extern qbyte *SPNM(scr_f1_table);
68
69extern int SPNM(scri)[];
70extern int SPNM(coli)[];
71
72#define PORT_TIME_NUM 1024
73extern byte SPNM(tape_impinfo)[];
74extern byte SPNM(fe_inport_default);
75extern byte SPNM(fe_outport_time)[];
76extern signed char SPNM(tape_sound)[];
77extern byte SPNM(sound_buf)[];
78
79
80extern char *SPNM(image);
81extern int SPNM(updating);
82extern qbyte SPNM(imag_mark)[];
83extern qbyte SPNM(imag_horiz);
84extern qbyte SPNM(imag_vert);
85extern int SPNM(border_update);
86extern int SPNM(lastborder);
87
88extern void SPNM(init_screen_mark)(void);
89extern void SPNM(init)(void);
90extern int SPNM(halfframe)(int firsttick, int numlines);
91
92#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "spscr_p.h"
22#include "spscr.h"
23
24#include "spperif.h"
25#include "z80.h"
26
27
28#include <stdlib.h>
29#include <stdio.h>
30
31int color_type = 0;
32
33#define N0 0x04
34#define N1 0x34
35
36#define B0 0x08
37#define B1 0x3F
38
39
40struct rgb *spscr_crgb;
41
42static struct rgb norm_colors[COLORNUM]={
43 {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
44 {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},
45
46 {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
47 {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
48};
49
50static struct rgb gray_colors[COLORNUM]={
51 {0,0,0},{20,20,20},{26,26,26},{32,32,32},
52 {38,38,38},{44,44,44},{50,50,50},{56,56,56},
53
54 {16,16,16},{23,23,23},{30,30,30},{36,36,36},
55 {43,43,43},{50,50,50},{56,56,56},{63,63,63}
56};
57
58struct rgb custom_colors[COLORNUM]={
59 {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
60 {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},
61
62 {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
63 {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
64};
65
66
67#define TABOFFS 2
68
69volatile int screen_visible = 1;
70volatile int accept_keys = 1;
71
72
73byte *update_screen_line(byte *scrp, int coli, int scri, int border,
74 qbyte *cmarkp)
75{
76 qbyte *scrptr;
77 qbyte brd_color;
78 int i;
79 qbyte *tmptr, *mptr;
80 qbyte mark, cmark;
81
82 cmark = *cmarkp;
83 scrptr = (qbyte *) scrp;
84 if(scri >= 0) { /* normal line */
85 if(SPNM(border_update)) {
86 brd_color = SPNM(colors)[border];
87 brd_color |= brd_color << 8;
88 brd_color |= brd_color << 16;
89 for(i = 8; i; i--) *scrptr++ = brd_color;
90 scrptr += 0x40;
91 for(i = 8; i; i--) *scrptr++ = brd_color;
92 scrptr -= 0x48;
93 }
94 else scrptr += 0x08;
95 tmptr = SPNM(scr_mark) + 0x2C0 + (coli >> 3);
96 mark = *tmptr;
97 if(!(coli & 0x07)) {
98 cmark = mark;
99 *tmptr = 0;
100 }
101 else cmark |= mark;
102 mptr = SPNM(scr_mark) + scri;
103
104 mark = *mptr | cmark;
105 if(mark) {
106 byte *spmp, *spcp;
107 qbyte *scr_tab;
108
109 *mptr = 0;
110 SPNM(imag_mark)[coli] |= mark;
111 SPNM(imag_horiz) |= mark;
112 coli >>= 3;
113 SPNM(imag_vert) |= (1 << coli);
114
115 spmp = PRNM(proc).mem + (scri << 5);
116 spcp = PRNM(proc).mem + 0x5800 + (coli << 5);
117
118 if(!SPNM(flash_state)) scr_tab = SPNM(scr_f0_table);
119 else scr_tab = SPNM(scr_f1_table);
120 for(i = 32; i; i--) {
121 register dbyte spcx, spmx;
122 spcx = (*spcp++) << 6;
123 spmx = *spmp++;
124 *scrptr++ = scr_tab[spcx|((spmx & 0xf0) >> 4)];
125 *scrptr++ = scr_tab[spcx|((spmx & 0x0f))];
126 }
127 scrptr +=0x08;
128 }
129 else scrptr += 0x48;
130 }
131 else if(scri == -1) { /* only border */
132 if(SPNM(border_update)) {
133 brd_color = SPNM(colors)[border];
134 brd_color |= brd_color << 8;
135 brd_color |= brd_color << 16;
136 for(i = 0x50; i; i--) *scrptr++ = brd_color;
137 }
138 else scrptr += 0x50;
139 }
140
141 *cmarkp = cmark;
142 return (byte *) scrptr;
143}
144
145void translate_screen(void)
146{
147 int border, scline;
148 byte *scrptr;
149 qbyte cmark = 0;
150
151 scrptr = (byte *) SPNM(image);
152
153 border = DANM(ula_outport) & 0x07;
154 if(border != SPNM(lastborder)) {
155 SPNM(border_update) = 2;
156 SPNM(lastborder) = border;
157 }
158
159 for(scline = 0; scline < (TMNUM / 2); scline++)
160 scrptr = update_screen_line(scrptr, SPNM(coli)[scline], SPNM(scri)[scline],
161 border, &cmark);
162
163}
164
165
166void spscr_init_mask_color(void)
167{
168 int clb;
169 int bwb;
170 int hb;
171 int ix, j;
172 int bc, fc;
173 byte *tab_f0, *tab_f1;
174
175 sp_scr_f0_table = (qbyte *) (PRNM(proc).mem + 0x10000);
176 sp_scr_f1_table = (qbyte *) (PRNM(proc).mem + 0x20000);
177
178 sp_colors[8] = sp_colors[0];
179
180 for(clb = 0; clb < 256; clb++)
181 for(hb = 0; hb < 16; hb++) {
182
183 bc = (clb & 0x38) >> 3;
184 fc = clb & 0x07;
185
186 if(clb & 0x40) {
187 fc |= 0x08;
188 bc |= 0x08;
189 }
190 bwb = hb;
191
192 ix = (clb << 8) + (hb << TABOFFS);
193 tab_f0 = ((byte *) sp_scr_f0_table) + ix + 3;
194 tab_f1 = ((byte *) sp_scr_f1_table) + ix + 3;
195
196 for(j = 4; j; bwb >>= 1, j--) {
197 *tab_f0-- = (byte) sp_colors[(bwb & 0x01) ? fc : bc];
198 *tab_f1-- = (byte) sp_colors[(clb & 0x80) ?
199 ((bwb & 0x01) ? bc : fc) :
200 ((bwb & 0x01) ? fc : bc)];
201 }
202 }
203}
204
205void flash_change(void)
206{
207 int i,j;
208 byte *scp;
209 qbyte *mcp;
210 register unsigned int val;
211
212 mcp = sp_scr_mark + 0x2C0;
213 scp = z80_proc.mem + 0x5800;
214
215 for(i = 24; i; mcp++, i--) {
216 val = 0;
217 for(j = 32; j; scp++, j--) {
218 val >>= 1;
219 if(*scp & 0x80) val |= (1 << 31);
220 }
221 *mcp |= val;
222 }
223}
224
225void spscr_init_line_pointers(int lines)
226{
227 int i;
228 int bs;
229 int y;
230 int scline;
231
232 bs = (lines - 192) / 2;
233
234 for(i = 0; i < PORT_TIME_NUM; i++) {
235
236 sp_scri[i] = -2;
237
238 if(i < ODDHF) scline = i;
239 else scline = i - ODDHF;
240
241 if(scline >= 64-bs && scline < 256+bs) {
242 if(scline >= 64 && scline < 256) {
243 y = scline - 64;
244 sp_coli[i] = y;
245 sp_scri[i] = 0x200 +
246 (y & 0xC0) + ((y & 0x07) << 3) + ((y & 0x38) >> 3);
247 }
248 else sp_scri[i] = -1;
249 }
250 }
251}
252
253void spscr_init_colors(void)
254{
255 spscr_crgb = norm_colors;
256
257 switch(color_type) {
258 case 0:
259 spscr_crgb = norm_colors;
260 break;
261
262 case 1:
263 spscr_crgb = gray_colors;
264 break;
265
266 case 2:
267 spscr_crgb = custom_colors;
268 break;
269 }
270}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPSCR_H
22#define SPSCR_H
23
24#include "z80_type.h"
25
26extern int scrmul;
27extern volatile int screen_visible;
28
29extern void init_spect_scr(void);
30extern void destroy_spect_scr(void);
31extern void resize_spect_scr(int newsize);
32extern void update_screen(void);
33extern void flash_change(void);
34extern void translate_screen(void);
35
36extern byte *update_screen_line(byte *scrp, int coli, int scri, int border,
37 qbyte *cmarkp);
38
39extern void spscr_refresh_colors(void);
40
41#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPSCR_P_H
22#define SPSCR_P_H
23
24#define COLORNUM 16
25
26struct rgb {
27 int r, g, b;
28};
29
30#define SCRSIZE 6912
31#define COLORBEG 6144
32
33extern struct rgb *spscr_crgb;
34extern struct rgb custom_colors[];
35
36extern void spscr_init_mask_color(void);
37extern void spscr_init_line_pointers(int lines);
38extern void spscr_init_colors(void);
39
40#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos 2006 Anton Romanov
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* #define DEBUG_AUDIO */
22
23#include "spsound.h"
24
25#include "zxconfig.h"
26#include "spperif.h"
27#include "z80.h"
28#include "misc.h"
29#include "interf.h"
30#include "spmain.h"
31
32#include <stdio.h>
33
34int bufframes = 1;
35
36int sound_avail = 0;
37int sound_on = 1;
38
39int sound_to_autoclose = 0;
40int doneplay=0;
41
42
43#ifdef HAVE_SOUND
44
45#include "stdlib.h"
46#include "file.h"
47#include "time.h"
48#include "errno.h"
49#include "string.h"
50
51
52
53#define SKIPTIME 5000
54
55static int last_not_played=0;
56
57#define SPS_OPENED 0
58#define SPS_AUTOCLOSED -1
59#define SPS_BUSY -2
60#define SPS_CLOSED -3
61#define SPS_NONEXIST -4
62
63static int sndstate = SPS_CLOSED;
64
65static void close_snd(int normal);
66unsigned short my_buf[TMNUM*2*3*2] IBSS_ATTR;
67
68
69const byte lin8_ulaw[] = {
70 31, 31, 31, 32, 32, 32, 32, 33,
71 33, 33, 33, 34, 34, 34, 34, 35,
72 35, 35, 35, 36, 36, 36, 36, 37,
73 37, 37, 37, 38, 38, 38, 38, 39,
74 39, 39, 39, 40, 40, 40, 40, 41,
75 41, 41, 41, 42, 42, 42, 42, 43,
76 43, 43, 43, 44, 44, 44, 44, 45,
77 45, 45, 45, 46, 46, 46, 46, 47,
78 47, 47, 47, 48, 48, 49, 49, 50,
79 50, 51, 51, 52, 52, 53, 53, 54,
80 54, 55, 55, 56, 56, 57, 57, 58,
81 58, 59, 59, 60, 60, 61, 61, 62,
82 62, 63, 63, 64, 65, 66, 67, 68,
83 69, 70, 71, 72, 73, 74, 75, 76,
84 77, 78, 79, 81, 83, 85, 87, 89,
85 91, 93, 95, 99, 103, 107, 111, 119,
86 255, 247, 239, 235, 231, 227, 223, 221,
87 219, 217, 215, 213, 211, 209, 207, 206,
88 205, 204, 203, 202, 201, 200, 199, 198,
89 197, 196, 195, 194, 193, 192, 191, 191,
90 190, 190, 189, 189, 188, 188, 187, 187,
91 186, 186, 185, 185, 184, 184, 183, 183,
92 182, 182, 181, 181, 180, 180, 179, 179,
93 178, 178, 177, 177, 176, 176, 175, 175,
94 175, 175, 174, 174, 174, 174, 173, 173,
95 173, 173, 172, 172, 172, 172, 171, 171,
96 171, 171, 170, 170, 170, 170, 169, 169,
97 169, 169, 168, 168, 168, 168, 167, 167,
98 167, 167, 166, 166, 166, 166, 165, 165,
99 165, 165, 164, 164, 164, 164, 163, 163,
100 163, 163, 162, 162, 162, 162, 161, 161,
101 161, 161, 160, 160, 160, 160, 159, 159,
102};
103
104static void open_snd(void)
105{
106 sndstate = SPS_OPENED;
107 sound_avail=1;
108 rb->pcm_play_stop();
109 rb->pcm_set_frequency(44100);
110
111}
112
113static void close_snd(int normal)
114{
115 (void)normal;
116 sound_avail = 0;
117 rb->pcm_play_stop();
118 rb->pcm_set_frequency(44100);
119}
120
121
122
123void init_spect_sound(void)
124{
125#if 1 /* TODO: Is this OK? */
126 open_snd();
127#endif
128}
129
130
131//#define VOLREDUCE settings.volume
132//
133#ifndef VOLREDUCE
134#define VOLREDUCE 0
135#endif
136
137#define CONVU8(x) ((byte) (((x) >> VOLREDUCE) + 128))
138
139#ifdef CONVERT_TO_ULAW
140# define CONV(x) lin8_ulaw[(int) CONVU8(x)]
141#else
142# define CONV(x) CONVU8(x)
143#endif
144
145#define HIGH_PASS(hp, sv) (((hp) * 15 + (sv)) >> 4)
146#define TAPESOUND(tsp) ((*tsp) >> 4)
147
148static void process_sound(void)
149{
150 static int soundhp;
151 int i;
152 byte *sb;
153 register int sv;
154
155 sb = sp_sound_buf;
156 if(last_not_played) {
157 soundhp = *sb;
158 last_not_played = 0;
159 }
160
161 if(!sp_playing_tape) {
162 for(i = TMNUM; i; sb++,i--) {
163 sv = *sb;
164 soundhp = HIGH_PASS(soundhp, sv);
165 *sb = CONV(sv - soundhp);
166 }
167 }
168 else {
169 signed char *tsp;
170
171 tsp = sp_tape_sound;
172 for(i = TMNUM; i; sb++,tsp++,i--) {
173 sv = *sb + TAPESOUND(tsp);
174 soundhp = (soundhp * 15 + sv)>>4;
175 *sb = CONV(sv - soundhp);
176 }
177 }
178}
179
180void autoclose_sound(void)
181{
182 /* do we have any reason to autoclose sound? */
183#if 0
184 if(sound_on && sound_to_autoclose && sndstate >= SPS_CLOSED) {
185 close_snd(1);
186 sndstate = SPS_AUTOCLOSED;
187 }
188#endif
189}
190void get_more(unsigned char** start, size_t* size)
191{
192 doneplay = 1;
193 *start = (unsigned char*)(my_buf);
194 *size = TMNUM*4*3*2;
195}
196
197/* sp_sound_buf is Unsigned 8 bit, Rate 8000 Hz, Mono */
198
199void write_buf(void){
200 int i,j;
201
202 /* still not sure what is the best way to do this */
203#if 0
204 my_buf[i] = /*(sp_sound_buf[i]<<8)-0x8000*/sp_sound_buf[i]<<8;
205
206
207 for (i = 0, j = 0; i<TMNUM; i++, j+=6)
208 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;
209#endif
210
211
212 for (i = 0, j = 0; i<TMNUM; i++, j+=12)
213 my_buf[j] = my_buf[j+1] = my_buf[j+2] = my_buf[j+3]\
214 = my_buf[j+4] = my_buf[j+5] = my_buf[j+6]\
215 = my_buf[j+7] = my_buf[j+8] = my_buf[j+9] \
216 = my_buf[j+10] = my_buf[j+11] \
217 = (((byte)sp_sound_buf[i])<<8) >> settings.volume;
218
219 rb->pcm_play_data(&get_more,NULL,0);
220
221#if 0
222 /* can use to save and later analyze what we produce */
223 i = rb->open ( "/sound.raw" , O_WRONLY | O_APPEND | O_CREAT );
224 rb->write ( i , sp_sound_buf , TMNUM );
225 rb->close (i);
226
227
228 i = rb->open ( "/sound2.raw" , O_WRONLY | O_APPEND |O_CREAT);
229 rb->write ( i , (unsigned char *)my_buf , TMNUM*4*3 );
230 rb->close (i);
231#endif
232
233
234 while(!doneplay)
235 rb->yield();
236
237}
238void play_sound(int evenframe)
239{
240 if(evenframe) return;
241 if(!sound_on) {
242 if(sndstate <= SPS_CLOSED) return;
243 if(sndstate < SPS_OPENED) {
244 sndstate = SPS_CLOSED;
245 return;
246 }
247 close_snd(1);
248 return;
249 }
250
251 z80_proc.sound_change = 0;
252
253 process_sound();
254
255 write_buf();
256}
257
258
259void setbufsize(void)
260{
261
262}
263
264
265#else /* HAVE_SOUND */
266
267/* Dummy functions */
268
269void setbufsize(void)
270{
271}
272
273void init_spect_sound(void)
274{
275}
276
277void play_sound(int evenframe)
278{
279 (void)evenframe;
280}
281
282void autoclose_sound(void)
283{
284}
285
286#endif /* NO_SOUND */
287
288
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPSOUND_H
22#define SPSOUND_H
23
24extern int bufframes;
25extern int sound_avail;
26extern void setbufsize(void);
27
28extern void autoclose_sound(void);
29extern void init_spect_sound(void);
30extern void play_sound(int evenframe);
31
32extern int sound_on;
33
34#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20#include "misc.h"
21
22#include "sptape.h"
23#include "tapefile.h"
24
25#include "spperif.h"
26#include "z80.h"
27#include "interf.h"
28#include "spconf.h"
29
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <errno.h>
34#include <sys/types.h>
35
36#define MAXLINELEN 256
37
38int spt_auto_stop = 1;
39
40static int playing = 0;
41static int paused = 0;
42/*static FILE *tapefp;*/
43/*static int *tapefp;*/
44
45static char tapename[MAXFILENAME];
46static int tapetype;
47
48#define EARBIT 0x40
49
50#define IMPBUFLEN 1024
51
52static int ingroup;
53static int segtype;
54
55static int lastdatak;
56
57static int currseg;
58
59static void stop_playing(void)
60{
61 if(playing) close_tapefile();
62 playing = 0;
63}
64
65static void pause_playing(void)
66{
67 if(playing) {
68 paused = 1;
69 playing = 0;
70 }
71}
72
73static void unpause_playing(void)
74{
75 if(paused) {
76 paused = 0;
77 playing = 1;
78 segtype = SEG_END;
79 }
80}
81
82#define MAXDESCLEN 256
83
84static void put_seg_desc(void)
85{
86 if(segtype != SEG_VIRTUAL) {
87 if(segtype > SEG_END) {
88 if(!ingroup) {
89 long len;
90 int i, ml;
91 char *me;
92
93 len = get_seglen();
94
95 me = msgbuf;
96 rb->snprintf(me,MAXDESCLEN, "%4i: ", currseg);
97 me = me+rb->strlen(me);
98 if(segtype >= SEG_DATA && len) {
99 rb->snprintf(me,MAXDESCLEN, "%5li bytes, ", len);
100 me = me+rb->strlen(me);
101 }
102
103 ml = 0;
104 for(i = 0; seg_desc[i]; i++) {
105 if(seg_desc[i] == '\n') {
106 *me = '\0';
107 put_msg(msgbuf);
108
109 me = msgbuf;
110 rb->snprintf(me,MAXDESCLEN, " ");
111 me = me+rb->strlen(me);
112 ml = 0;
113 }
114 else {
115 if(ml < MAXDESCLEN) *me++ = seg_desc[i];
116 ml++;
117 }
118 }
119 *me = '\0';
120 put_msg(msgbuf);
121 }
122 else {
123 rb->snprintf(msgbuf,MAXDESCLEN, "%4i:", currseg);
124 put_tmp_msg(msgbuf);
125 }
126 }
127 else put_msg(seg_desc);
128 }
129#ifdef DEBUG_TAPE
130 else fprintf(stderr, "virtual segment\n");
131#endif
132}
133
134static void get_next_segment(void)
135{
136 int propseg;
137
138 do {
139 propseg = 1;
140
141 segtype = next_segment();
142 currseg = segment_pos();
143
144 put_seg_desc();
145
146 switch(segtype) {
147 case SEG_ERROR:
148 case SEG_END:
149 stop_playing();
150 break;
151
152 case SEG_STOP:
153 pause_playing();
154 put_msg(" * Tape paused; Press Ctrl-o to restart * ");
155 break;
156
157 case SEG_SKIP:
158 propseg = 0;
159 break;
160
161 case SEG_GRP_BEG:
162 ingroup = 1;
163 propseg = 0;
164 break;
165
166 case SEG_GRP_END:
167 ingroup = 0;
168 propseg = 0;
169 break;
170 }
171 } while(!propseg);
172
173 lastdatak = 0;
174}
175
176
177void play_tape(void)
178{
179 static dbyte impbuf[IMPBUFLEN];
180
181 static int clevel;
182 static dbyte *impbufp;
183 static int impbufrem;
184 static long imprem;
185
186 static int cleared_buffers = 1;
187
188 int tsn;
189 dbyte *ibp;
190 byte *tsp;
191 int ibr;
192 long ir;
193 int cl;
194 signed char *op;
195 int ov;
196 int ca;
197
198 tsp = sp_tape_impinfo;
199 op = sp_tape_sound;
200 tsn = TMNUM;
201
202 if(!playing) {
203 if(cleared_buffers) return;
204
205 sp_playing_tape = 0;
206
207 if(!clevel) {
208 ca = CHKTICK;
209 clevel = ~clevel;
210 }
211 else {
212 ca = 0;
213 cleared_buffers = 1;
214 }
215 imprem = CHKTICK * TMNUM;
216 }
217 else if(!sp_playing_tape) {
218 sp_playing_tape = 1;
219 cleared_buffers = 0;
220
221 impbufrem = 0;
222 imprem = 0;
223 clevel = get_level() ? ~(0) : 0;
224 if(clevel) ca = 0;
225 else ca = 1;
226 }
227 else ca = 0;
228
229#ifdef DEBUG_TAPE
230 if(((clevel ? 1 : 0) ^
231 (DANM(ula_inport) & EARBIT ? 1 : 0) ^
232 (DANM(imp_change) ? 1 : 0) ^
233 (ca ? 1 : 0)) == 0)
234 fprintf(stderr, "Levels don't match %i %i\n", imprem, impbufrem);
235#endif
236
237 cl = clevel;
238 ibr = impbufrem;
239 ir = imprem;
240 ibp = impbufp;
241
242 if(cl) ov = CHKTICK/2;
243 else ov = -(CHKTICK/2);
244
245 do {
246 if(ir > 0) {
247 *tsp++ = ca;
248 *op++ = ov;
249 ir -= CHKTICK;
250 tsn--;
251 if(!tsn) goto done;
252
253 if(cl) ov = CHKTICK/2;
254 else ov = -(CHKTICK/2);
255
256 while(ir > 0) {
257 *tsp++ = 0;
258 *op++ = ov;
259 ir -= CHKTICK;
260 tsn--;
261 if(!tsn) goto done;
262 }
263 ca = 0;
264 }
265 if(ibr) {
266 if(!ca) {
267 if(cl) {
268 ov += ir;
269 ca = (CHKTICK/2) - ov + 1;
270 }
271 else {
272 ov -= ir;
273 ca = ov + (CHKTICK/2) + 1;
274 }
275 }
276 else {
277 ca = 0;
278 if(cl) ov += ir;
279 else ov -= ir;
280 }
281 ir += *ibp++;
282 ibr--;
283 cl = ~cl;
284 }
285 else {
286 ibp = impbuf;
287 do {
288 ibr = next_imps(impbuf, IMPBUFLEN, CHKTICK * tsn);
289 if(ibr) break;
290 get_next_segment();
291 if(!playing) {
292 if(!cl) {
293 if(ca) ca = 0;
294 else ca = CHKTICK;
295 cl = ~cl;
296 }
297 ir = tsn*CHKTICK;
298 ov = -(CHKTICK/2);
299 break;
300 }
301 } while(1);
302 }
303
304 } while(1);
305
306 done:
307
308 clevel = cl;
309 impbufrem = ibr;
310 imprem = ir;
311 impbufp = ibp;
312
313 if(segtype >= SEG_DATA) {
314 int datak;
315
316 datak = (int) (get_segpos() / 1000);
317 if(datak > lastdatak) {
318/* if(ingroup) sprintf(msgbuf, "%4i: ", currseg);
319 else sprintf(msgbuf, " ");
320 sprintf(msgbuf+strlen(msgbuf), "%3ik", datak);
321 put_tmp_msg(msgbuf);
322*/
323 lastdatak = datak;
324 }
325 }
326}
327
328/*
329
3302168
3312168 (9-10)
332
333667
334735 (2-4)
335
336855
337855 (3-5)
338
3391710
3401710 (7-9)
341
342945 (4-5)
343
344hosszu: 7..9
345rovid: 2..5
346
347*/
348
349#define MICBIT 0x08
350
351
352#define RC_NONE 0
353#define RC_LEADER 1
354#define RC_SYNC 2
355#define RC_DATA 3
356
357#define MAXLEN TMNUM
358
359#define LEADER_MIN 9
360#define LEADER_MAX 10
361#define SYNC_MIN 2
362#define SYNC_MAX 4
363
364#define BIT0_MIN 3
365#define BIT0_MAX 5
366#define BIT1_MIN 7
367#define BIT1_MAX 9
368
369#define LEADER_MIN_COUNT 512
370/*
371static int rec_segment;
372static int rec_state = RC_NONE;
373static byte *recbuf = NULL;
374static const char *waitchars = "-\\|/";
375*/
376static int recording = 0;
377
378
379
380void rec_tape(void)
381{
382/* static byte lastmic = 0;
383 static int lastlen = 0;
384 static int whole;
385 static int leadercount;
386 static byte data;
387 static byte parity;
388 static int bitnum;
389 static int bytecount;
390 static int recbufsize;
391 static int firsthalf;
392 static int frameswait = 0;
393
394 int tsl;
395 byte *fep;
396 int thishalf;
397
398
399 if(!recording) return;
400
401 for(fep = sp_fe_outport_time, tsl = TMNUM; tsl; fep++, tsl--) {
402 lastlen++;
403 if((*fep & MICBIT) == lastmic) {
404 if(lastlen < MAXLEN) continue;
405 }
406 else lastmic = ~lastmic & MICBIT;
407
408 switch(rec_state) {
409 case RC_NONE:
410 if(lastlen >= LEADER_MIN && lastlen <= LEADER_MAX) {
411 rec_state = RC_LEADER;
412
413 leadercount = 0;
414 break;
415 }
416 if((frameswait++ & 15)) break;
417 frameswait &= 0x3F;
418 sprintf(msgbuf, " %s: WAITING %c",
419 tapename, waitchars[(frameswait >> 4)]);
420 put_tmp_msg(msgbuf);
421 break;
422 case RC_LEADER:
423 if(lastlen >= LEADER_MIN && lastlen <= LEADER_MAX) {
424 leadercount++;
425 if(leadercount == LEADER_MIN_COUNT) {
426 sprintf(msgbuf, " %s: LEADER", tapename);
427 put_tmp_msg(msgbuf);
428 }
429 break;
430 }
431 if(leadercount >= LEADER_MIN_COUNT &&
432 lastlen >= SYNC_MIN && lastlen <= SYNC_MAX) rec_state = RC_SYNC;
433 else rec_state = RC_NONE;
434 break;
435 case RC_SYNC:
436 if(lastlen >= SYNC_MIN && lastlen <= SYNC_MAX) {
437 rec_state = RC_DATA;
438 whole = 0;
439 data = 0;
440 bitnum = 0;
441 bytecount = 0;
442 recbuf = NULL;
443 recbufsize = 0;
444 parity = 0;
445
446 sprintf(msgbuf, " %s: DATA", tapename);
447 put_tmp_msg(msgbuf);
448 }
449 else rec_state = RC_NONE;
450 break;
451 case RC_DATA:
452 thishalf = -1;
453 if(lastlen >= BIT0_MIN && lastlen <= BIT0_MAX) thishalf = 0;
454 else if(lastlen >= BIT1_MIN && lastlen <= BIT1_MAX) thishalf = 1;
455
456 if(thishalf < 0 || (whole && firsthalf != thishalf)) {
457 char filename[11];
458 int filesize;
459 int filetype;
460
461 sprintf(msgbuf, "%s: %03d", tapename, rec_segment);
462 if(bytecount >= 1) {
463 sprintf(msgbuf+strlen(msgbuf),
464 " %02X %5d %3s", recbuf[0], bytecount-2,
465 parity == 0 ? "OK" : "ERR");
466 if(recbuf[0] == 0 && bytecount - 2 >= 17) {
467 filetype = recbuf[1];
468 strncpy(filename, (char*) recbuf+2, 10);
469 filename[10] = '\0';
470 filesize = recbuf[12] + (recbuf[13] << 8);
471
472 sprintf(msgbuf+strlen(msgbuf),
473 " %02X %10s %5i", filetype, filename, filesize);
474 }
475 }
476 put_msg(msgbuf);
477
478 putc(bytecount & 0xFF, tapefp);
479 putc((bytecount >> 8) & 0xFF, tapefp);
480
481 fwrite(recbuf, 1, (size_t) bytecount, tapefp);
482 fflush(tapefp);
483
484 rec_segment++;
485 free(recbuf);
486 recbuf = NULL;
487 rec_state = RC_NONE;
488 break;
489 }
490
491 if(!whole) {
492 whole = 1;
493 firsthalf = thishalf;
494 }
495 else {
496 whole = 0;
497 data |= thishalf;
498 bitnum++;
499
500 if(bitnum == 8) {
501 bitnum = 0;
502 if(recbufsize <= bytecount) {
503 recbufsize += 1024;
504 recbuf = realloc(recbuf, (size_t) recbufsize);
505 if(recbuf == NULL) {
506 //fprintf(stderr, "Out of memory\n");
507 exit(1);
508 }
509 }
510 recbuf[bytecount] = data;
511 parity = parity ^ data;
512 data = 0;
513 bytecount++;
514
515 if(!(bytecount & 1023)) {
516 sprintf(msgbuf, " %s: DATA %i kB",
517 tapename, bytecount >> 10);
518 put_tmp_msg(msgbuf);
519 }
520 }
521 data <<= 1;
522 }
523 break;
524 }
525
526 lastlen = 0;
527 }*/
528}
529
530static void stop_recording(void)
531{
532/* if(recording) {
533 recording = 0;
534 free(recbuf);
535 recbuf = NULL;
536
537 rb->close(tapefp);
538 }*/
539}
540
541static void restart_playing(void)
542{
543 int res;
544 struct tape_options tapeopt;
545
546 if(tapetype < 0) {
547 tapetype = TAP_TZX;
548 res = open_tapefile(tapename, tapetype);
549 if(!res) {
550 tapetype = TAP_TAP;
551 res = open_tapefile(tapename, tapetype);
552 }
553 }
554 else res = open_tapefile(tapename, tapetype);
555
556 if(!res) {
557 put_msg(seg_desc);
558 return;
559 }
560
561 INITTAPEOPT(tapeopt);
562#ifndef DEBUG_Z80
563 tapeopt.blanknoise = 1;
564#endif
565 set_tapefile_options(&tapeopt);
566
567 if(currseg) {
568 res = goto_segment(currseg);
569 if(!res) {
570 put_msg(seg_desc);
571 return;
572 }
573 }
574
575 playing = 1;
576 segtype = SEG_END;
577}
578
579
580void pause_play(void)
581{
582 if(playing) {
583 pause_playing();
584 put_msg(" * Tape paused * ");
585 goto_segment(currseg);
586 }
587 else unpause_playing();
588}
589
590
591void start_play_file_type(char *name, int seg, int type)
592{
593 int filetype = FT_TAPEFILE;
594
595 rb->strncpy(tapename, name, MAXFILENAME-10);
596 tapename[MAXFILENAME-10] = '\0';
597
598 currseg = seg;
599 tapetype = type;
600
601 spcf_find_file_type(tapename, &filetype, &tapetype);
602 if(currseg < 0) currseg = 0;
603
604 ingroup = 0;
605 restart_playing();
606}
607
608void start_play(void)
609{
610 char *name;
611 int t;
612 int seg;
613
614 if(playing || paused || recording) {
615 put_msg(" * Stop the tape first! * ");
616 return;
617 }
618
619 put_msg("Enter tape file path:");
620 name = spif_get_tape_fileinfo(&seg, &t);
621 if(name == NULL) return;
622
623 start_play_file_type(name, seg, -1);
624}
625
626
627void stop_play(void)
628{
629
630 if(playing || paused) {
631 put_msg(" * Stopped playing * ");
632
633 if(playing) stop_playing();
634 if(paused) paused = 0;
635 }
636 else if(recording) {
637 /* sprintf(msgbuf, " * Stopped recording tape `%s' * ", tapename);
638 put_msg(msgbuf);*/
639 stop_recording();
640 }
641}
642
643void start_rec(void)
644{
645#if 0
646 char *name;
647
648 if(playing || paused || recording) return;
649
650 put_msg("Enter tape file to record (default: '.tap'):");
651
652 name = spif_get_filename();
653 if(name == NULL) return;
654
655 strncpy(tapename, name, MAXFILENAME-10);
656 tapename[MAXFILENAME-10] = '\0';
657
658 if(!check_ext(tapename, "tap")) add_extension(tapename, "tap");
659
660 tapefp = fopen(tapename, "ab");
661 if(tapefp == NULL) {
662 sprintf(msgbuf, "Could not open tape file `%s', %s",
663 tapename, strerror(errno));
664 put_msg(msgbuf);
665 return;
666 }
667
668 recording = 1;
669 rec_segment = 0;
670 rec_state = RC_NONE;
671
672 sprintf(msgbuf,
673 "Recordind tape file `%s'. To stop press Ctrl-s", tapename);
674 put_msg(msgbuf);
675#endif
676}
677
678#include "spkey_p.h"
679
680#define CF 0x01
681#define ZF 0x40
682
683void qload(void)
684{
685 byte type, parity;
686 dbyte length, dest, dtmp;
687 int verify, success, firstbyte;
688 int nextdata;
689
690 if(recording) {
691 put_msg("Can't quick load tape, because recording");
692 return;
693 }
694
695 do {
696 if(!playing) {
697 if(paused) unpause_playing();
698 else {
699 spkey_textmode();
700 start_play();
701 spkey_screenmode();
702 }
703 }
704 if(!playing) {
705 put_msg("Not quick loading tape");
706 return;
707 }
708 while(playing && (segtype != SEG_DATA || get_segpos() > 0))
709 get_next_segment();
710
711 } while(!playing);
712
713 dtmp = AFBK;
714 AFBK = AF;
715 AF = dtmp;
716
717 type = RA;
718 verify = !(RF & CF);
719 length = DE;
720 firstbyte = !(RF & ZF);
721 dest = IX;
722
723 parity = 0;
724 success = 0;
725
726 do {
727 nextdata = next_byte();
728 if(nextdata < 0) break;
729
730 parity ^= nextdata;
731
732 if(!length) {
733 if(!parity) success = 1;
734 break;
735 }
736
737 if(firstbyte) {
738 firstbyte = 0;
739 if(nextdata != type) break;
740 }
741 else {
742 if(!verify) {
743 if(dest >= 0x4000) DANM(mem)[dest] = nextdata;
744 }
745 else {
746 if(DANM(mem)[dest] != nextdata) break;
747 }
748 dest++;
749 length--;
750 }
751 } while(1);
752
753 if(success) RF |= (CF | ZF);
754 else RF &= ~(CF | ZF);
755 IX = dest;
756 DE = length;
757
758 PC = SA_LD_RET;
759 DANM(iff1) = DANM(iff2) = 1;
760 DANM(haltstate) = 1;
761
762 sp_init_screen_mark();
763
764 if(spt_auto_stop) pause_playing();
765}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPTAPE_H
22#define SPTAPE_H
23
24extern void play_tape(void);
25extern void rec_tape(void);
26
27extern void stop_play(void);
28extern void pause_play(void);
29
30extern void start_play(void);
31extern void start_play_file_type(char *name, int seg, int type);
32
33extern void start_rec(void);
34extern void qload(void);
35
36#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos 2006 Anton Romanov
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "zxconfig.h"
22
23#include "sptiming.h"
24#include "interf.h"
25/* not precise but .... anyway this is used only when not playing
26 * sound ... */
27long shouldbe_tick;
28
29void spti_init(void){
30 spti_reset();
31}
32void spti_sleep(unsigned long usecs){
33/* unsigned long now,need;
34 now = *rb->current_tick;
35 need = now + usecs;
36 rb -> sleep ( need - now );*/
37 rb->sleep ( usecs );
38}
39void spti_reset(void){
40 shouldbe_tick = *rb -> current_tick;
41}
42void spti_wait(void){
43 long rem;
44 long now;
45
46 now = *rb -> current_tick;
47 shouldbe_tick+=SKIPTICKS;
48 rem = shouldbe_tick - now;
49
50 if(rem > 0) {
51 if(rem > SKIPTICKS) rem = SKIPTICKS;
52 spti_sleep((unsigned long) rem);
53 }
54 if(rem == SKIPTICKS || rem < -10 * SKIPTIME) spti_reset();
55}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef SPTIMING_H
22#define SPTIMING_H
23
24#define SKIPMS 20
25#define SKIPTIME (SKIPMS * 1000)
26#define SKIPTICKS 20*HZ/1000
27
28extern void spti_init(void);
29extern void spti_sleep(unsigned long usecs);
30extern void spti_reset(void);
31extern void spti_wait(void);
32
33#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "config.h"
22
23#define SPECTEMU_VERSION "0.94"
24
25#ifdef Z80C
26#define SPECTEMU_TYPE "c"
27#else
28#define SPECTEMU_TYPE "i"
29#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef TAPEF_P_H
22#define TAPEF_P_H
23
24typedef unsigned char byte;
25typedef unsigned short dbyte;
26typedef unsigned long qbyte;
27
28#define BYTE(arr, i) (arr[i])
29#define DBYTE(arr, i) (arr[i] + (arr[(i)+1] << 8))
30
31struct tapeinfo {
32 int type;
33 int tzxminver, tzxmajver;
34};
35
36struct seginfo {
37 int type;
38 int segtype;
39
40 dbyte pulse;
41 dbyte num;
42 dbyte sync1p;
43 dbyte sync2p;
44 dbyte zerop;
45 dbyte onep;
46
47 dbyte pause;
48
49 byte bused;
50
51 long len;
52 long ptr;
53};
54
55extern struct tapeinfo tf_tpi;
56extern struct seginfo tf_cseg;
57extern long tf_segoffs;
58
59extern byte *tf_get_block(int i);
60
61#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* This module deals with the different tape file formats (.TAP and .TZX) */
22/* 'sptape.c' uses the functions provided by this module. */
23
24
25#include "tapefile.h"
26#include "tapef_p.h"
27
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <errno.h>
32#include <sys/types.h>
33#include "zxconfig.h"
34#include "helpers.h"
35#define max(x, y) ((x) > (y) ? (x) : (y))
36
37#define DESC_LEN 256
38
39char seg_desc[DESC_LEN];
40
41#define TZXMAJPROG 1
42#define TZXMINPROG 2
43
44/*static FILE *tapefp = NULL;*/
45static int tapefd=-1;
46
47static dbyte segi, currsegi;
48static int segbeg;
49
50static int endtype, endnext, endplay;
51static dbyte endpause;
52static int finished;
53
54static long firstseg_offs;
55
56static struct tape_options tapeopt;
57
58long tf_segoffs;
59struct tapeinfo tf_tpi;
60
61static dbyte loopctr, loopbeg;
62static dbyte callctr, callbeg;
63
64#define ST_NORM 0
65#define ST_PSEQ 1
66#define ST_DIRE 2
67#define ST_MISC 3
68
69#define PL_NONE 0
70#define PL_PAUSE 1
71#define PL_LEADER 2
72#define PL_DATA 3
73#define PL_END 4
74#define PL_PSEQ 5
75#define PL_DIRE 6
76
77#define IMP_1MS 3500
78
79static dbyte lead_pause;
80static int playstate = PL_NONE;
81static int currlev;
82
83#define DEF_LEAD_PAUSE 2000
84
85struct seginfo tf_cseg;
86
87struct tzxblock {
88 int type;
89 int lenbytes;
90 int lenmul;
91 int hlen;
92};
93
94#define NUMBLOCKID 0x60
95/* changed NONE because of warinigs */
96/*#define NONE 0*/
97#define NONE 0,0,0,0
98#define COMM 1
99#define STAN 2
100
101
102#define RBUFLEN 1024
103
104static byte rbuf[RBUFLEN];
105
106/* Table containing information on TZX blocks */
107
108static struct tzxblock tzxb[NUMBLOCKID] = {
109 { NONE }, /* ID: 00 */
110 { NONE },
111 { NONE },
112 { NONE },
113 { NONE },
114 { NONE },
115 { NONE },
116 { NONE },
117
118 { NONE }, /* ID: 08 */
119 { NONE },
120 { NONE },
121 { NONE },
122 { NONE },
123 { NONE },
124 { NONE },
125 { NONE },
126
127 { COMM, 2, 1, 0x04 }, /* ID: 10 */
128 { COMM, 3, 1, 0x12 },
129 { COMM, 0, 1, 0x04 },
130 { COMM, 1, 2, 0x01 },
131 { COMM, 3, 1, 0x0A },
132 { COMM, 3, 1, 0x08 },
133 { NONE },
134 { NONE },
135
136 { NONE }, /* ID: 18 */
137 { NONE },
138 { NONE },
139 { NONE },
140 { NONE },
141 { NONE },
142 { NONE },
143 { NONE },
144
145 { COMM, 0, 1, 0x02 }, /* ID: 20 */
146 { COMM, 1, 1, 0x01 },
147 { COMM, 0, 1, 0x00 },
148 { COMM, 0, 1, 0x02 },
149 { COMM, 0, 1, 0x02 },
150 { COMM, 0, 1, 0x00 },
151 { COMM, 2, 2, 0x02 },
152 { COMM, 0, 1, 0x00 },
153
154 { COMM, 2, 1, 0x02 }, /* ID: 28 */
155 { NONE },
156 { STAN, 0, 1, 0x00 },
157 { NONE },
158 { NONE },
159 { NONE },
160 { NONE },
161 { NONE },
162
163 { COMM, 1, 1, 0x01 }, /* ID: 30 */
164 { COMM, 1, 1, 0x02 },
165 { COMM, 2, 1, 0x02 },
166 { COMM, 1, 3, 0x01 },
167 { COMM, 0, 1, 0x08 },
168 { COMM, 4, 1, 0x14 },
169 { NONE },
170 { NONE },
171
172 { NONE }, /* ID: 38 */
173 { NONE },
174 { NONE },
175 { NONE },
176 { NONE },
177 { NONE },
178 { NONE },
179 { NONE },
180
181 { COMM, 3, 1, 0x04 }, /* ID: 40 */
182 { NONE },
183 { NONE },
184 { NONE },
185 { NONE },
186 { NONE },
187 { NONE },
188 { NONE },
189
190 { NONE }, /* ID: 48 */
191 { NONE },
192 { NONE },
193 { NONE },
194 { NONE },
195 { NONE },
196 { NONE },
197 { NONE },
198
199 { NONE }, /* ID: 50 */
200 { NONE },
201 { NONE },
202 { NONE },
203 { NONE },
204 { NONE },
205 { NONE },
206 { NONE },
207
208 { NONE }, /* ID: 58 */
209 { NONE },
210 { COMM, 0, 1, 0x09 },
211 { NONE },
212 { NONE },
213 { NONE },
214 { NONE },
215 { NONE }
216};
217
218
219#define PTRDIFF(pe, ps) ((int) (((long) (pe) - (long) (ps)) / sizeof(*pe)))
220
221static char tzxheader[] = {'Z','X','T','a','p','e','!',0x1A};
222
223static int readbuf(void *ptr, int size, /*FILE *fp*/ int fd)
224{
225 /*return (int) fread(ptr, 1, (size_t) size, tapefp);*/
226 return (int) rb->read(fd, ptr, (size_t) size);
227}
228
229static void premature(struct seginfo *csp)
230{
231 csp->segtype = SEG_ERROR;
232 rb->snprintf(seg_desc,DESC_LEN, "Premature end of segment");
233}
234
235static int read_tzx_header(byte *hb, struct seginfo *csp)
236{
237 int res;
238 int segid, seght;
239 int lenoffs, lenbytes, lenmul, lenadd;
240 int hlen;
241 long length;
242 byte *hip;
243
244 segid = getc(tapefd);
245 if(segid == EOF) {
246 csp->segtype = SEG_END;
247 rb->snprintf(seg_desc,DESC_LEN, "End of Tape");
248 return 0;
249 }
250
251 hb[0] = (byte) segid;
252
253 if(segid < NUMBLOCKID) seght = tzxb[segid].type;
254 else seght = 0; /* was NONE here*/
255
256 if(seght == COMM) {
257 lenbytes = tzxb[segid].lenbytes;
258 lenmul = tzxb[segid].lenmul;
259 hlen = tzxb[segid].hlen;
260 lenadd = hlen;
261 lenoffs = hlen - lenbytes;
262 }
263 else {
264 lenoffs = 0x00;
265 lenbytes = 4;
266 lenmul = 1;
267 lenadd = 0x00;
268 hlen = 0x04;
269 }
270
271 if(seght == STAN) hlen += tzxb[segid].hlen;
272
273 hip = hb+1;
274 res = readbuf(hip, hlen, tapefd);
275 if(res != hlen) {
276 premature(csp);
277 return 0;
278 }
279 length = 0;
280 for(;lenbytes; lenbytes--)
281 length = (length << 8) + hip[lenoffs + lenbytes - 1];
282
283 length = (length * lenmul) + lenadd - hlen;
284
285 csp->len = length;
286 return 1;
287}
288
289static int read_tap_header(byte *hb, struct seginfo *csp)
290{
291 int res;
292
293 res = readbuf(hb, 2, tapefd);
294 if(res < 2) {
295 if(res == 0) {
296 csp->segtype = SEG_END;
297 rb->snprintf(seg_desc,DESC_LEN, "End of Tape");
298 }
299 else premature(csp);
300 return 0;
301 }
302 csp->len = DBYTE(hb, 0);
303 return 1;
304}
305
306static int read_header(byte *hb, struct seginfo *csp)
307{
308 segbeg = 0;
309 csp->ptr = 0;
310
311 csp->segtype = SEG_OTHER;
312 if(tf_tpi.type == TAP_TAP)
313 return read_tap_header(hb, csp);
314 else if(tf_tpi.type == TAP_TZX)
315 return read_tzx_header(hb, csp);
316
317 return 0;
318}
319
320static void isbeg(void)
321{
322 segbeg = 1;
323 tf_cseg.len = tf_cseg.ptr = 0;
324}
325
326
327static int end_seg(struct seginfo *csp)
328{
329 if(!segbeg) {
330 if(csp->len != csp->ptr) {
331 /*fseek(tapefp, tf_cseg.len - tf_cseg.ptr - 1, SEEK_CUR);*/
332 rb->lseek(tapefd, tf_cseg.len - tf_cseg.ptr - 1, SEEK_CUR);
333
334 if(getc(tapefd) == EOF) {
335 premature(csp);
336 return 0;
337 }
338 }
339 segi++;
340 isbeg();
341 }
342 playstate = PL_NONE;
343 return 1;
344}
345
346
347static int jump_to_segment(int newsegi, struct seginfo *csp)
348{
349 if(newsegi <= segi) {
350 segi = 0;
351 isbeg();
352 /*fseek(tapefp, firstseg_offs, SEEK_SET);*/
353 rb->lseek(tapefd, firstseg_offs, SEEK_SET);
354 }
355 else if(!end_seg(csp)) return 0;
356
357 while(segi != newsegi) {
358 if(!read_header(rbuf, csp)) return 0;
359 if(!end_seg(csp)) return 0;
360 }
361 return 1;
362}
363
364
365static int next_data(void)
366{
367 int res;
368 if(tf_cseg.ptr == tf_cseg.len) return DAT_END;
369
370 res = getc(tapefd);
371 if(res == EOF) {
372 rb->snprintf(seg_desc, DESC_LEN,"Premature end of segment");
373 return DAT_ERR;
374 }
375 tf_cseg.ptr++;
376 return res;
377}
378
379
380static void normal_segment(struct seginfo *csp)
381{
382 rb->snprintf(seg_desc,DESC_LEN, "Data");
383 csp->type = ST_NORM;
384 csp->segtype = SEG_DATA;
385 csp->pulse = 2168; /* 2016 */
386 csp->num = 3220;
387 csp->sync1p = 667;
388 csp->sync2p = 735;
389 csp->zerop = 855; /* 672 */
390 csp->onep = 1710; /* 1568 */
391 csp->bused = 8;
392}
393
394
395static int interpret_tzx_header(byte *hb, struct seginfo *csp)
396{
397 int res;
398 int segid;
399 byte *hip;
400 int offs;
401 dbyte dtmp;
402
403 segid = hb[0];
404 hip = hb+1;
405
406 switch(segid) {
407 case 0x10:
408 normal_segment(csp);
409 csp->pause = DBYTE(hip, 0x00);
410 break;
411
412 case 0x11:
413 rb->snprintf(seg_desc,DESC_LEN, "Turbo Data");
414 csp->type = ST_NORM;
415 csp->segtype = SEG_DATA_TURBO;
416 csp->pulse = DBYTE(hip, 0x00);
417 csp->sync1p = DBYTE(hip, 0x02);
418 csp->sync2p = DBYTE(hip, 0x04);
419 csp->zerop = DBYTE(hip, 0x06);
420 csp->onep = DBYTE(hip, 0x08);
421 csp->num = DBYTE(hip, 0x0A);
422 csp->bused = BYTE(hip, 0x0C);
423 csp->pause = DBYTE(hip, 0x0D);
424 break;
425
426 case 0x12:
427 rb->snprintf(seg_desc,DESC_LEN, "Pure Tone");
428 csp->type = ST_NORM;
429 csp->segtype = SEG_OTHER;
430 csp->pulse = DBYTE(hip, 0x00);
431 csp->num = DBYTE(hip, 0x02);
432 csp->sync1p = 0;
433 csp->sync2p = 0;
434 csp->zerop = 0;
435 csp->onep = 0;
436 csp->bused = 0;
437 csp->pause = 0;
438 break;
439
440 case 0x13:
441 rb->snprintf(seg_desc,DESC_LEN, "Pulse Sequence");
442 csp->type = ST_PSEQ;
443 csp->segtype = SEG_OTHER;
444 csp->pause = 0;
445 break;
446
447 case 0x14:
448 rb->snprintf(seg_desc,DESC_LEN, "Pure Data");
449 csp->type = ST_NORM;
450 csp->segtype = SEG_DATA_PURE;
451 csp->zerop = DBYTE(hip, 0x00);
452 csp->onep = DBYTE(hip, 0x02);
453 csp->bused = BYTE(hip, 0x04);
454 csp->pause = DBYTE(hip, 0x05);
455 csp->pulse = 0;
456 csp->num = 0;
457 csp->sync1p = 0;
458 csp->sync2p = 0;
459 break;
460
461 case 0x15:
462 rb->snprintf(seg_desc,DESC_LEN, "Direct Recording");
463 csp->type = ST_DIRE;
464 csp->segtype = SEG_OTHER;
465 csp->pulse = DBYTE(hip, 0x00);
466 csp->pause = DBYTE(hip, 0x02);
467 csp->bused = BYTE(hip, 0x04);
468 break;
469
470 case 0x20:
471 dtmp = DBYTE(hip, 0x00);
472 if(dtmp == 0) {
473 if(!tapeopt.stoppause) {
474 csp->type = ST_MISC;
475 csp->segtype = SEG_STOP;
476 }
477 else {
478 csp->pause = tapeopt.stoppause * 1000;
479 csp->type = ST_NORM;
480 csp->segtype = SEG_PAUSE;
481 }
482 rb->snprintf(seg_desc,DESC_LEN, "Stop the Tape Mark");
483 }
484 else {
485 csp->pause = dtmp;
486 csp->type = ST_NORM;
487 csp->segtype = SEG_PAUSE;
488 rb->snprintf(seg_desc,DESC_LEN, "Pause for %i.%03is",
489 csp->pause / 1000, csp->pause % 1000);
490 }
491 csp->pulse = 0;
492 csp->num = 0;
493 csp->sync1p = 0;
494 csp->sync2p = 0;
495 csp->zerop = 0;
496 csp->onep = 0;
497 csp->bused = 0;
498 break;
499
500 case 0x21:
501 csp->type = ST_MISC;
502 csp->segtype = SEG_GRP_BEG;
503 res = readbuf(rbuf, csp->len, tapefd);
504 if(res != (int) csp->len) {
505 premature(csp);
506 return 0;
507 }
508 csp->ptr += csp->len;
509 {
510 int blen;
511 rb->snprintf(seg_desc,DESC_LEN, "Begin Group: ");
512 blen = (int) rb->strlen(seg_desc);
513 rb->strncpy(seg_desc+blen, (char *) rbuf, (unsigned) csp->len);
514 seg_desc[csp->len + blen] = '\0';
515 }
516 break;
517
518 case 0x22:
519 rb->snprintf(seg_desc,DESC_LEN, "End Group");
520 csp->type = ST_MISC;
521 csp->segtype = SEG_GRP_END;
522 break;
523
524 case 0x23:
525 offs = (signed short) DBYTE(hip, 0x00);
526 if(offs == 0) {
527 rb->snprintf(seg_desc,DESC_LEN, "Infinite loop");
528 csp->type = ST_MISC;
529 csp->segtype = SEG_STOP;
530 }
531 else {
532 csp->type = ST_MISC;
533 csp->segtype = SEG_SKIP;
534 rb->snprintf(seg_desc,DESC_LEN, "Jump to %i", segi+offs);
535 jump_to_segment(segi + offs, csp);
536 }
537 break;
538
539 case 0x24:
540 loopctr = DBYTE(hip, 0x00);
541 rb->snprintf(seg_desc,DESC_LEN, "Loop %i times", loopctr);
542 loopbeg = segi+1;
543 csp->type = ST_MISC;
544 csp->segtype = SEG_SKIP;
545 break;
546
547 case 0x25:
548 csp->type = ST_MISC;
549 csp->segtype = SEG_SKIP;
550 if(loopctr) loopctr--;
551 if(loopctr) {
552 jump_to_segment(loopbeg, csp);
553 rb->snprintf(seg_desc,DESC_LEN, "Loop to: %i", loopbeg);
554 }
555 else rb->snprintf(seg_desc,DESC_LEN, "Loop End");
556 break;
557
558 case 0x26:
559 csp->type = ST_MISC;
560 csp->segtype = SEG_SKIP;
561 dtmp = DBYTE(hip, 0x00);
562 if(callctr < dtmp) {
563 int offset;
564 callbeg = segi;
565 /*fseek(tapefp, callctr*2, SEEK_CUR);*/
566 rb->lseek(tapefd, callctr*2, SEEK_CUR);
567 csp->ptr += callctr*2;
568 res = readbuf(rbuf, 2, tapefd);
569 if(res != 2) {
570 premature(csp);
571 return 0;
572 }
573 csp->ptr += 2;
574 offset = (signed short) DBYTE(rbuf, 0x00);
575 rb->snprintf(seg_desc,DESC_LEN, "Call to %i", segi+offset);
576 jump_to_segment(segi+offset, csp);
577 callctr++;
578 }
579 else {
580 callctr = 0;
581 rb->snprintf(seg_desc,DESC_LEN, "Call Sequence End");
582 }
583 break;
584
585 case 0x27:
586 csp->type = ST_MISC;
587 csp->segtype = SEG_SKIP;
588 rb->snprintf(seg_desc,DESC_LEN, "Return");
589 if(callctr > 0) jump_to_segment(callbeg, csp);
590 break;
591
592 case 0x28:
593 rb->snprintf(seg_desc,DESC_LEN, "Selection (Not yet supported)");
594 csp->type = ST_MISC;
595 csp->segtype = SEG_SKIP;
596 break;
597
598 case 0x2A:
599 if(tapeopt.machine == MACHINE_48) {
600 rb->snprintf(seg_desc,DESC_LEN, "Stop the Tape in 48k Mode (Stopped)");
601 csp->type = ST_MISC;
602 csp->segtype = SEG_STOP;
603 }
604 else {
605 rb->snprintf(seg_desc,DESC_LEN, "Stop the Tape in 48k Mode (Not Stopped)");
606 csp->type = ST_MISC;
607 csp->segtype = SEG_SKIP;
608 }
609 break;
610
611 case 0x31:
612 case 0x30:
613 csp->type = ST_MISC;
614 csp->segtype = SEG_SKIP;
615 res = readbuf(rbuf, csp->len, tapefd);
616 if(res != (int) csp->len) {
617 premature(csp);
618 return 0;
619 }
620 csp->ptr += csp->len;
621 rb->strncpy(seg_desc, (char *) rbuf, (unsigned) csp->len);
622 seg_desc[csp->len] = '\0';
623 break;
624
625 case 0x32:
626 csp->type = ST_MISC;
627 csp->segtype = SEG_SKIP;
628 {
629 int numstr, i;
630
631 i = 0;
632 numstr = next_data();
633 for(;numstr > 0; numstr--) {
634 int tlen, tid, b;
635
636 tid = next_data();
637 tlen = next_data();
638 if(tid < 0 || tlen < 0) return 0;
639
640 for(; tlen; tlen--) {
641 b = next_data();
642 if(b < 0) return 0;
643 seg_desc[i++] = b;
644 }
645 seg_desc[i++] = '\n';
646 }
647 seg_desc[i] = '\0';
648 }
649 break;
650
651 case 0x33:
652 rb->snprintf(seg_desc,DESC_LEN, "Hardware Information (Not yet supported)");
653 csp->type = ST_MISC;
654 csp->segtype = SEG_SKIP;
655 break;
656
657 case 0x34:
658 rb->snprintf(seg_desc, DESC_LEN,"Emulation Information (Not yet supported)");
659 csp->type = ST_MISC;
660 csp->segtype = SEG_SKIP;
661 break;
662
663 case 0x35:
664 rb->snprintf(seg_desc,DESC_LEN, "Custom Information (Not yet supported)");
665 csp->type = ST_MISC;
666 csp->segtype = SEG_SKIP;
667 break;
668
669 case 0x40:
670 rb->snprintf(seg_desc, DESC_LEN,"Snapshot (Not yet supported)");
671 csp->type = ST_MISC;
672 csp->segtype = SEG_SKIP;
673 break;
674
675 case 0x5A:
676 rb->snprintf(seg_desc, DESC_LEN,"Tapefile Concatenation Point");
677 csp->type = ST_MISC;
678 csp->segtype = SEG_SKIP;
679
680 default:
681 csp->type = ST_MISC;
682 csp->segtype = SEG_SKIP;
683 rb->snprintf(seg_desc,DESC_LEN, "Unknown TZX block (id: %02X, version: %i.%02i)",
684 segid, tf_tpi.tzxmajver, tf_tpi.tzxminver);
685 break;
686 }
687
688 return 1;
689}
690
691static int interpret_header(byte *hb, struct seginfo *csp)
692{
693 if(tf_tpi.type == TAP_TAP) {
694 normal_segment(csp);
695 csp->pause = DEF_LEAD_PAUSE;
696
697 return 1;
698 }
699 else if(tf_tpi.type == TAP_TZX)
700 return interpret_tzx_header(hb, csp);
701
702 return 0;
703}
704
705byte *tf_get_block(int i)
706{
707 seg_desc[0] = '\0';
708
709 if(jump_to_segment(i, &tf_cseg)) {
710 tf_segoffs = ftell(tapefd);
711
712 if(read_header(rbuf, &tf_cseg) &&
713 interpret_header(rbuf, &tf_cseg)) return rbuf;
714 }
715 return NULL;
716}
717
718
719int next_byte(void)
720{
721 playstate = PL_NONE;
722 return next_data();
723}
724
725#define DPULSE(v1,v2) (*impbuf++=(v1), *impbuf++=(v2), timelen-=(v1)+(v2))
726#define PULSE(v) (*impbuf++=(v), currlev = !currlev, timelen-=(v))
727
728int next_imps(unsigned short *impbuf, int buflen, long timelen)
729{
730 static int toput;
731 static int bitrem;
732 static dbyte dirpulse;
733 unsigned short *impbufend, *impbufstart;
734
735 impbufstart = impbuf;
736 impbufend = impbuf + buflen;
737
738 while(impbuf < impbufend - 1 && timelen > 0) {
739 switch(playstate) {
740
741 case PL_PAUSE:
742 if(currlev && lead_pause) {
743 PULSE(IMP_1MS);
744 lead_pause --;
745 }
746 else if(lead_pause > 10) {
747 if(tapeopt.blanknoise && !(rb->rand() % 64))
748 DPULSE(IMP_1MS * 10 - 1000, 1000);
749 else
750 DPULSE(IMP_1MS * 10, 0);
751 lead_pause -= 10;
752 }
753 else if(lead_pause) {
754 DPULSE(IMP_1MS, 0);
755 lead_pause --;
756 }
757 else {
758 if(tf_cseg.num || tf_cseg.sync1p || tf_cseg.sync2p ||
759 tf_cseg.ptr != tf_cseg.len) finished = 0;
760
761 switch (tf_cseg.type) {
762 case ST_NORM: playstate = PL_LEADER; break;
763 case ST_DIRE: playstate = PL_DIRE; dirpulse = 0; break;
764 case ST_PSEQ: playstate = PL_PSEQ; break;
765 default: playstate = PL_NONE;
766 }
767 }
768 break;
769
770 case PL_LEADER:
771 if(tf_cseg.num >= 2) {
772 DPULSE(tf_cseg.pulse, tf_cseg.pulse);
773 tf_cseg.num -= 2;
774 }
775 else
776 if(tf_cseg.num) {
777 PULSE(tf_cseg.pulse);
778 tf_cseg.num --;
779 }
780 else { /* PL_SYNC */
781 if(tf_cseg.sync1p || tf_cseg.sync2p)
782 DPULSE(tf_cseg.sync1p, tf_cseg.sync2p);
783 bitrem = 0;
784 playstate = PL_DATA;
785 }
786 break;
787
788 case PL_DATA:
789 if(!bitrem) {
790 toput = next_data();
791 if(toput < 0) {
792 playstate = PL_END;
793 break;
794 }
795 if(tf_cseg.ptr != tf_cseg.len) {
796 if(timelen > 16 * max(tf_cseg.onep, tf_cseg.zerop) &&
797 impbuf <= impbufend - 16) {
798 int p1, p2, br, tp;
799
800 p1 = tf_cseg.onep;
801 p2 = tf_cseg.zerop;
802 br = 8;
803 tp = toput;
804
805 while(br) {
806 if(tp & 0x80) DPULSE(p1, p1);
807 else DPULSE(p2, p2);
808 br--;
809 tp <<= 1;
810 }
811 bitrem = 0;
812 break;
813 }
814 bitrem = 8;
815 }
816 else {
817 bitrem = tf_cseg.bused;
818 if(!bitrem) break;
819 }
820 }
821 if(toput & 0x80) DPULSE(tf_cseg.onep, tf_cseg.onep);
822 else DPULSE(tf_cseg.zerop, tf_cseg.zerop);
823 bitrem--, toput <<= 1;
824 break;
825
826 case PL_PSEQ:
827 {
828 int b1, b2;
829 dbyte pulse1, pulse2;
830 b1 = next_data();
831 b2 = next_data();
832 if(b1 < 0 || b2 < 0) {
833 playstate = PL_END;
834 break;
835 }
836 pulse1 = b1 + (b2 << 8);
837
838 b1 = next_data();
839 b2 = next_data();
840 if(b1 < 0 || b2 < 0) {
841 PULSE(pulse1);
842 playstate = PL_END;
843 break;
844 }
845 pulse2 = b1 + (b2 << 8);
846 DPULSE(pulse1, pulse2);
847 }
848 break;
849
850 case PL_DIRE:
851 for(;;) {
852 if(!bitrem) {
853 toput = next_data();
854 if(toput < 0) {
855 playstate = PL_END;
856 DPULSE(dirpulse, 0);
857 break;
858 }
859 if(tf_cseg.ptr != tf_cseg.len) bitrem = 8;
860 else {
861 bitrem = tf_cseg.bused;
862 if(!bitrem) break;
863 }
864 }
865 bitrem--;
866 toput <<= 1;
867 if(((toput & 0x0100) ^ (currlev ? 0x0100 : 0x00))) {
868 PULSE(dirpulse);
869 dirpulse = tf_cseg.pulse;
870 break;
871 }
872 dirpulse += tf_cseg.pulse;
873 if(dirpulse >= 0x8000) {
874 DPULSE(dirpulse, 0);
875 dirpulse = 0;
876 break;
877 }
878 }
879 break;
880
881 case PL_END:
882 if(tf_cseg.pause) {
883 PULSE(IMP_1MS);
884 tf_cseg.pause--;
885 if(currlev) PULSE(0);
886 finished = 1;
887 }
888 playstate = PL_NONE;
889 break;
890
891 case PL_NONE:
892 default:
893 return PTRDIFF(impbuf, impbufstart);
894 }
895 }
896
897 return PTRDIFF(impbuf, impbufstart);
898}
899
900
901int next_segment(void)
902{
903 if(endnext) {
904 endnext = 0;
905 tf_cseg.segtype = endtype;
906 tf_cseg.pause = endpause;
907 playstate = endplay;
908 return tf_cseg.segtype;
909 }
910
911 seg_desc[0] = '\0';
912 lead_pause = tf_cseg.pause;
913
914 if(end_seg(&tf_cseg)) {
915 currsegi = segi;
916 if(read_header(rbuf, &tf_cseg)) interpret_header(rbuf, &tf_cseg);
917 }
918
919 if(tf_cseg.segtype >= SEG_DATA) {
920 playstate = PL_PAUSE;
921 if(lead_pause) finished = 1;
922 }
923 else playstate = PL_NONE;
924
925 if(tf_cseg.segtype <= SEG_STOP && !finished) {
926 endnext = 1;
927 endtype = tf_cseg.segtype;
928 endpause = tf_cseg.pause;
929 endplay = playstate;
930 if(lead_pause > 0) lead_pause--;
931
932 tf_cseg.pause = 1;
933 tf_cseg.segtype = SEG_VIRTUAL;
934 playstate = PL_END;
935 }
936
937 return tf_cseg.segtype;
938}
939
940int goto_segment(int at_seg)
941{
942 int res;
943
944 res = jump_to_segment(at_seg, &tf_cseg);
945 tf_cseg.pause = DEF_LEAD_PAUSE;
946
947 return res;
948}
949
950unsigned segment_pos(void)
951{
952 return currsegi;
953}
954
955void close_tapefile(void)
956{
957 if(tapefd != -1) {
958 playstate = PL_NONE;
959 rb->close(tapefd);
960 tapefd = -1;
961 }
962}
963
964int open_tapefile(char *name, int type)
965{
966 int res;
967 int ok;
968
969 seg_desc[0] = '\0';
970 currlev = 0;
971
972 if(type != TAP_TAP && type != TAP_TZX) {
973 rb->snprintf(seg_desc,DESC_LEN, "Illegal tape type");
974 return 0;
975 }
976
977 /*tapefp = fopen(name, "rb");*/
978 tapefd = rb->open(name, O_RDONLY);
979 if(tapefd < 0 ) {
980 /*rb->snprintf(seg_desc,DESC_LEN, "Could not open `%s': %s", name, strerror(errno));*/
981 return 0;
982 }
983
984 tf_tpi.type = type;
985 tf_cseg.pause = DEF_LEAD_PAUSE;
986 INITTAPEOPT(tapeopt);
987
988 currsegi = segi = 0;
989 isbeg();
990
991 firstseg_offs = 0;
992
993 ok = 1;
994
995 if(tf_tpi.type == TAP_TZX) {
996
997 firstseg_offs = 10;
998 res = readbuf(rbuf, 10, tapefd);
999 if(res == 10 && rb->strncasecmp((char *)rbuf, tzxheader, 8) == 0) {
1000 tf_tpi.tzxmajver = rbuf[8];
1001 tf_tpi.tzxminver = rbuf[9];
1002
1003 if(tf_tpi.tzxmajver > TZXMAJPROG) {
1004 rb->snprintf(seg_desc, DESC_LEN,
1005 "Cannot handle TZX file version (%i.%02i)",
1006 tf_tpi.tzxmajver, tf_tpi.tzxminver);
1007 ok = 0;
1008 }
1009 }
1010 else {
1011 rb->snprintf(seg_desc,DESC_LEN, "Illegal TZX file header");
1012 ok = 0;
1013 }
1014 }
1015
1016 if(!ok) {
1017 close_tapefile();
1018 return 0;
1019 }
1020 endnext = 0;
1021
1022 loopctr = 0;
1023 callctr = 0;
1024
1025 return 1;
1026}
1027
1028int get_level(void)
1029{
1030 return currlev;
1031}
1032
1033long get_seglen(void)
1034{
1035 return tf_cseg.len;
1036}
1037
1038long get_segpos(void)
1039{
1040 return tf_cseg.ptr;
1041}
1042
1043void set_tapefile_options(struct tape_options *to)
1044{
1045 rb->memcpy(&tapeopt, to, sizeof(tapeopt));
1046}
1047
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef TAPEFILE_H
22#define TAPEFILE_H
23
24#define DAT_ERR -2
25#define DAT_END -1
26
27#define SEG_ERROR -1
28#define SEG_END 0 /* ^--- End of tape */
29
30#define SEG_STOP 1
31#define SEG_SKIP 2
32#define SEG_GRP_BEG 3
33#define SEG_GRP_END 4
34
35#define SEG_DATA 10
36#define SEG_DATA_TURBO 11
37#define SEG_DATA_PURE 12
38
39#define SEG_PAUSE 20
40#define SEG_OTHER 21
41
42#define SEG_VIRTUAL 30
43
44#define TAP_TAP 0
45#define TAP_TZX 1
46
47#define MACHINE_48 0
48#define MACHINE_128 1
49
50struct tape_options {
51 int blanknoise;
52 int stoppause;
53 int machine;
54};
55
56#define INITTAPEOPT(to) \
57 (to).blanknoise=0, \
58 (to).stoppause=0, \
59 (to).machine=MACHINE_48
60
61extern char seg_desc[];
62
63#ifdef __cplusplus
64extern "C" {
65#endif
66
67extern int open_tapefile(char *name, int type);
68extern void close_tapefile(void);
69extern int goto_segment(int at_seg);
70extern int next_segment(void);
71extern int next_byte(void);
72extern int next_imps(unsigned short *impbuf, int buflen, long timelen);
73
74extern void set_tapefile_options(struct tape_options *to);
75extern int get_level(void);
76
77extern long get_seglen(void);
78extern long get_segpos(void);
79extern unsigned segment_pos(void);
80
81#ifdef __cplusplus
82}
83#endif
84
85#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "z80.h"
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <time.h>
26#include "zxconfig.h"
27#include "helpers.h"
28Z80 PRNM(proc);
29
30byte PRNM(inports)[PORTNUM];
31byte PRNM(outports)[PORTNUM];
32
33
34#ifdef SPECT_MEM
35#define NUM64KSEGS 3
36#endif
37
38#ifndef NUM64KSEGS
39#define NUM64KSEGS 1
40#endif
41
42static byte *a64kmalloc(int num64ksegs)
43{
44 byte *bigmem;
45
46 bigmem = (byte *) my_malloc((unsigned) (0x10000 * (num64ksegs + 1)));
47 if(bigmem == NULL) {
48 /*fprintf(stderr, "Out of memory!\n");*/
49 /*exit(1);*/
50 }
51
52 return (byte *) (( (long) bigmem & ~((long) 0xFFFF)) + 0x10000);
53}
54
55
56
57void PRNM(init)(void)
58{
59 qbyte i;
60
61 DANM(mem) = a64kmalloc(NUM64KSEGS);
62
63 rb->srand((unsigned int)( rb->get_time()->tm_sec+rb->get_time()->tm_min*60 + rb->get_time()->tm_hour*3600));
64 for(i = 0; i < 0x10000; i++) DANM(mem)[i] = (byte) rb->rand();
65
66 for(i = 0; i < NUMDREGS; i++) {
67 DANM(nr)[i].p = DANM(mem);
68 DANM(nr)[i].d.d = (dbyte) rb->rand();
69 }
70
71 for(i = 0; i < BACKDREGS; i++) {
72 DANM(br)[i].p = DANM(mem);
73 DANM(br)[i].d.d = (dbyte) rb->rand();
74 }
75
76 for(i = 0; i < PORTNUM; i++) PRNM(inports)[i] = PRNM(outports)[i] = 0;
77
78 PRNM(local_init)();
79
80 return;
81}
82
83/* TODO: no interrupt immediately afer EI (not important for spectrum) */
84
85void PRNM(nmi)(void)
86{
87 DANM(iff2) = DANM(iff1);
88 DANM(iff1) = 0;
89
90 DANM(haltstate) = 0;
91 PRNM(pushpc)();
92
93 PC = 0x0066;
94}
95
96/* TODO: IM 0 emulation */
97
98void PRNM(interrupt)(int data)
99{
100 if(DANM(iff1)) {
101
102 DANM(haltstate) = 0;
103 DANM(iff1) = DANM(iff2) = 0;
104
105 switch(DANM(it_mode)) {
106 case 0:
107 PRNM(pushpc)();
108 PC = 0x0038;
109 break;
110 case 1:
111 PRNM(pushpc)();
112 PC = 0x0038;
113 break;
114 case 2:
115 PRNM(pushpc)();
116 PCL = DANM(mem)[(dbyte) (((int) RI << 8) + (data & 0xFF))];
117 PCH = DANM(mem)[(dbyte) (((int) RI << 8) + (data & 0xFF) + 1)];
118 break;
119 }
120 }
121}
122
123
124void PRNM(reset)(void)
125{
126 DANM(haltstate) = 0;
127 DANM(iff1) = DANM(iff2) = 0;
128 DANM(it_mode) = 0;
129 RI = 0;
130 RR = 0;
131 PC = 0;
132}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef Z80_H
22#define Z80_H
23
24#include "zxconfig.h"
25#include "config.h"
26
27#ifdef ROCKBOX_BIG_ENDIAN
28#define WORDS_BIGENDIAN
29#endif
30
31#ifndef COMPARISON
32#define PRNM(x) z80_ ## x
33#else
34#define PRNM(x) z80x_ ## x
35#endif
36
37#define DANM(x) PRNM(proc).x
38
39#include "z80_type.h"
40
41
42#ifndef WORDS_BIGENDIAN
43union dregp {
44 struct { byte l, h, _b2, _b3; } s;
45 struct { dbyte d, _d1; } d;
46 byte* p;
47};
48#else
49union dregp {
50 struct { byte _b3, _b2, h, l; } s;
51 struct { dbyte _d1, d; } d;
52 byte* p;
53};
54#endif
55
56#define NUMDREGS 9
57#define BACKDREGS 4
58
59#define PORTNUM 256
60
61/* Do NOT change the order! */
62typedef struct {
63 union dregp nr[NUMDREGS];
64 union dregp br[BACKDREGS];
65
66 int haltstate;
67 int it_mode;
68 int iff1, iff2;
69
70 byte *mem;
71
72 int tc;
73 int rl7;
74
75#ifdef SPECT_MEM /* WARNING: Do NOT change the order!!! */
76 int next_scri;
77 int inport_mask;
78 int ula_inport;
79 int ula_outport;
80 int sound_sam;
81 int sound_change;
82 int imp_change;
83#endif
84
85#ifdef Z80C
86 dbyte cbaddr;
87
88#ifdef PROCP
89 byte *incf_tbl;
90 byte *decf_tbl;
91 byte *addf_tbl;
92 byte *subf_tbl;
93 byte *orf_tbl;
94
95 byte *inports;
96 byte *outports;
97#ifdef SPECT_MEM
98 byte *fe_inport_high;
99#endif
100#endif
101#endif
102
103} Z80;
104
105
106extern Z80 PRNM(proc);
107
108extern byte PRNM(inports)[];
109extern byte PRNM(outports)[];
110
111#define ZI_BC 0
112#define ZI_DE 1
113#define ZI_HL 2
114#define ZI_AF 3
115#define ZI_IR 4
116#define ZI_IX 5
117#define ZI_IY 6
118#define ZI_PC 7
119#define ZI_SP 8
120
121
122#define BC (DANM(nr)[ZI_BC].d.d)
123#define DE (DANM(nr)[ZI_DE].d.d)
124#define HL (DANM(nr)[ZI_HL].d.d)
125#define AF (DANM(nr)[ZI_AF].d.d)
126#define IR (DANM(nr)[ZI_IR].d.d)
127#define IX (DANM(nr)[ZI_IX].d.d)
128#define IY (DANM(nr)[ZI_IY].d.d)
129#define PC (DANM(nr)[ZI_PC].d.d)
130#define SP (DANM(nr)[ZI_SP].d.d)
131
132#define BCP (DANM(nr)[ZI_BC].p)
133#define DEP (DANM(nr)[ZI_DE].p)
134#define HLP (DANM(nr)[ZI_HL].p)
135#define PCP (DANM(nr)[ZI_PC].p)
136#define SPP (DANM(nr)[ZI_SP].p)
137#define IXP (DANM(nr)[ZI_IX].p)
138#define IYP (DANM(nr)[ZI_IY].p)
139
140
141#define RB (DANM(nr)[ZI_BC].s.h)
142#define RC (DANM(nr)[ZI_BC].s.l)
143#define RD (DANM(nr)[ZI_DE].s.h)
144#define RE (DANM(nr)[ZI_DE].s.l)
145#define RH (DANM(nr)[ZI_HL].s.h)
146#define RL (DANM(nr)[ZI_HL].s.l)
147#define RA (DANM(nr)[ZI_AF].s.h)
148#define RF (DANM(nr)[ZI_AF].s.l)
149#define RI (DANM(nr)[ZI_IR].s.h)
150#define RR (DANM(nr)[ZI_IR].s.l)
151#define XH (DANM(nr)[ZI_IX].s.h)
152#define XL (DANM(nr)[ZI_IX].s.l)
153#define YH (DANM(nr)[ZI_IY].s.h)
154#define YL (DANM(nr)[ZI_IY].s.l)
155#define PCH (DANM(nr)[ZI_PC].s.h)
156#define PCL (DANM(nr)[ZI_PC].s.l)
157#define SPH (DANM(nr)[ZI_SP].s.h)
158#define SPL (DANM(nr)[ZI_SP].s.l)
159
160#define BCBK (DANM(br)[ZI_BC].d.d)
161#define DEBK (DANM(br)[ZI_DE].d.d)
162#define HLBK (DANM(br)[ZI_HL].d.d)
163#define AFBK (DANM(br)[ZI_AF].d.d)
164
165#define BBK (DANM(br)[ZI_BC].s.h)
166#define CBK (DANM(br)[ZI_BC].s.l)
167#define DBK (DANM(br)[ZI_DE].s.h)
168#define EBK (DANM(br)[ZI_DE].s.l)
169#define HBK (DANM(br)[ZI_HL].s.h)
170#define LBK (DANM(br)[ZI_HL].s.l)
171#define ABK (DANM(br)[ZI_AF].s.h)
172#define FBK (DANM(br)[ZI_AF].s.l)
173
174#ifdef __cplusplus
175extern "C" {
176#endif
177
178extern void PRNM(init)(void);
179extern int PRNM(step)(int ticknum);
180
181extern void PRNM(interrupt)(int data);
182extern void PRNM(nmi)(void);
183extern void PRNM(reset)(void);
184
185extern void PRNM(pushpc)(void);
186extern void PRNM(local_init)(void);
187
188#ifdef __cplusplus
189}
190#endif
191
192
193#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#define ADDSUB(r, op, tbl) \
22{ \
23 register byte res; \
24 register int idx; \
25 register int flag; \
26 res = RA op; \
27 idx = IDXCALC(RA, r, res); \
28 RA = res; \
29 flag = (RF & ~(AALLF)) | \
30 TAB(tbl)[idx]; \
31 if(!res) flag |= ZF; \
32 RF = flag; \
33}
34
35
36#define ADD(r) ADDSUB(r, + r, addf_tbl)
37#define ADC(r) ADDSUB(r, + r + (RF & CF), addf_tbl)
38#define SUB(r) ADDSUB(r, - r, subf_tbl)
39#define SBC(r) ADDSUB(r, - r - (RF & CF), subf_tbl)
40
41#define AND(r) \
42{ \
43 register byte res; \
44 register byte flag; \
45 res = RA & r; \
46 RA = res; \
47 flag = (RF & ~(AALLF)) | \
48 TAB(orf_tbl)[res] | HF; \
49 RF = flag; \
50}
51
52
53#define XOR(r) \
54{ \
55 register byte res; \
56 register byte flag; \
57 res = RA ^ r; \
58 RA = res; \
59 flag = (RF & ~(AALLF)) | \
60 TAB(orf_tbl)[res]; \
61 RF = flag; \
62}
63
64
65#define OR(r) \
66{ \
67 register byte res; \
68 register byte flag; \
69 res = RA | r; \
70 RA = res; \
71 flag = (RF & ~(AALLF)) | \
72 TAB(orf_tbl)[res]; \
73 RF = flag; \
74}
75
76
77#define CP(r) \
78{ \
79 register byte res; \
80 register int idx; \
81 register int flag; \
82 res = RA - r; \
83 idx = IDXCALC(RA, r, res); \
84 flag = (RF & ~(AALLF)) | \
85 TAB(subf_tbl)[idx]; \
86 if(!res) flag |= ZF; \
87 RF = flag; \
88}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "z80.h"
22
23#ifdef PROCP
24
25typedef Z80 *z80t;
26
27#define OPDEF(name, num) z80t z80op_ ## name (z80t z80p)
28#define ENDOP() return z80p
29#undef DANM
30#define DANM(x) z80p->x
31
32#define TAB(t) DANM(t)
33#define PORT(t) DANM(t)
34#define SPECP(t) DANM(t)
35
36#else
37
38typedef void z80t;
39
40#define OPDEF(name, num) void z80op_ ## name (z80t)
41#define ENDOP()
42
43#define TAB(t) z80c_ ## t
44#define PORT(t) PRNM(t)
45#define SPECP(t) SPNM(t)
46
47#endif
48
49
50typedef z80t (*op_f)(z80t);
51extern op_f z80c_op_tab[];
52extern op_f z80c_op_tab_cb[];
53extern op_f z80c_op_tab_dd[];
54extern op_f z80c_op_tab_ed[];
55extern op_f z80c_op_tab_fd[];
56
57#define TIME(x) DANM(tc) -= (x)
58
59#define ENTIME(x) { TIME(x); ENDOP(); }
60
61#define READ(addr) (DANM(mem)[addr])
62#define WRITE(addr, val) PUTMEM(addr, DANM(mem) + (dbyte) (addr), val)
63
64#define DREAD(addr) (DANM(mem)[addr] | (DANM(mem)[(dbyte)(addr+1)] << 8))
65#define DWRITE(addr, x) WRITE(addr, (byte) x); \
66 WRITE((dbyte) (addr+1), (byte) (x >> 8))
67
68#define IPCS ((sbyte) *PCP)
69
70
71#define MODMEM(func) \
72{ \
73 register byte bdef; \
74 bdef = *HLP; \
75 func(bdef); \
76 PUTMEM(HL, HLP, bdef); \
77}
78
79#define MODMEMADDR(func, addr) \
80{ \
81 register byte bdef; \
82 bdef = READ(addr); \
83 func(bdef); \
84 WRITE(addr, bdef); \
85}
86
87#define IXDGET(ixy, addr) addr = ((dbyte) (ixy + IPCS)), PC++
88
89#define FETCHD(x) \
90{ \
91 register dbyte ddef; \
92 ddef = PC; \
93 x = DREAD(ddef); \
94 PC = ddef+2; \
95}
96
97#define POP(x) \
98{ \
99 register dbyte ddef; \
100 ddef = SP; \
101 x = DREAD(ddef); \
102 SP = ddef+2; \
103}
104
105#define PUSH(x) \
106{ \
107 register dbyte ddef, dval; \
108 dval = x; \
109 ddef = SP-2; \
110 DWRITE(ddef, dval); \
111 SP = ddef; \
112}
113
114#ifdef SPECT_MEM
115#include "sp_def.h"
116#else
117
118#define PUTMEM(addr, ptr, val) *(ptr) = (val)
119#define IN(porth, portl, dest) dest = PORT(inports)[portl]
120#define OUT(porth, portl, source) PORT(outports)[portl] = (source)
121#define DI_CHECK
122
123#endif
124
125
126#define SF 0x80
127#define ZF 0x40
128#define B5F 0x20
129#define HF 0x10
130#define B3F 0x08
131#define PVF 0x04
132#define NF 0x02
133#define CF 0x01
134
135#define ALLF (SF | ZF | HF | PVF | NF | CF)
136#define BUTCF (SF | ZF | HF | PVF | NF)
137
138#define AALLF 0xff
139#define ABUTCF 0xfe
140
141#define SETFLAGS(mask, val) (RF = (RF & ~(mask)) | (val))
142#define SET_FL(x) (RF |= (x))
143#define CLR_FL(x) (RF &= ~(x))
144
145
146#define TESTZF (RF & ZF)
147#define TESTCF (RF & CF)
148#define TESTSF (RF & SF)
149#define TESTPF (RF & PVF)
150#define TESTHF (RF & HF)
151#define TESTNF (RF & NF)
152
153
154#define IDXCALC(v1, v2, res) \
155 ((res & 0xA8) | ((v1 & 0x88) >> 1) | ((v2 & 0x88) >> 3))
156
157#define DIDXCALC(v1, v2, res) \
158 (((res & 0x8800) >> 8) | ((v1 & 0x8800) >> 9) | ((v2 & 0x8800) >> 11))
159
160
161extern byte z80c_incf_tbl[];
162extern byte z80c_decf_tbl[];
163extern byte z80c_addf_tbl[];
164extern byte z80c_subf_tbl[];
165extern 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef NO_OPDEF
22#include "z80_def.h"
23#include "z80_op1.h"
24#endif
25
26OPDEF(nop, 0x00)
27{
28 ENTIME(4);
29}
30
31OPDEF(ex_af_afb, 0x08)
32{
33 register byte *ptmp;
34
35 ptmp = DANM(br)[ZI_AF].p;
36 DANM(br)[ZI_AF].p = DANM(nr)[ZI_AF].p;
37 DANM(nr)[ZI_AF].p = ptmp;
38
39 ENTIME(4);
40}
41
42OPDEF(djnz_e, 0x10)
43{
44 if(!--RB) {
45 PC++;
46 ENTIME(8);
47 }
48 else {
49 PC += IPCS; PC++;
50 ENTIME(13);
51 }
52}
53
54OPDEF(jr_e, 0x18)
55{
56 PC += IPCS; PC++;
57 ENTIME(12);
58}
59
60#define JR_CC_E(ccn, cc, n) \
61OPDEF(jr_ ## ccn ## _e, 0x20+n*8) \
62{ \
63 if(!(cc)) { \
64 PC++; \
65 ENTIME(7); \
66 } \
67 else { \
68 PC += IPCS; PC++; \
69 ENTIME(12); \
70 } \
71}
72
73JR_CC_E(nz, !TESTZF, 0)
74JR_CC_E(z, TESTZF, 1)
75JR_CC_E(nc, !TESTCF, 2)
76JR_CC_E(c, TESTCF, 3)
77
78
79#define LD_RR_NN(rrn, rr, n) \
80OPDEF(ld_ ## rrn ## _nn, 0x01+n*0x10) \
81{ \
82 FETCHD(rr); \
83 ENTIME(10); \
84}
85
86LD_RR_NN(bc, BC, 0)
87LD_RR_NN(de, DE, 1)
88LD_RR_NN(hl, HL, 2)
89LD_RR_NN(sp, SP, 3)
90
91#define DADD(rr1, rr2) \
92 register dbyte dtmp; \
93 register int idx; \
94 dtmp = rr1; \
95 rr1 = dtmp + rr2; \
96 idx = DIDXCALC(dtmp, rr2, rr1); \
97 SETFLAGS(CF | NF | HF, TAB(addf_tbl)[idx] & (CF | HF))
98
99
100#define ADD_RR_RR(rrn1, rr1, rrn2, rr2, n) \
101OPDEF(add_## rrn1 ## _ ## rrn2, 0x09+n*0x10) \
102{ \
103 DADD(rr1, rr2); \
104 ENTIME(11); \
105}
106
107ADD_RR_RR(hl, HL, bc, BC, 0)
108ADD_RR_RR(hl, HL, de, DE, 1)
109ADD_RR_RR(hl, HL, hl, HL, 2)
110ADD_RR_RR(hl, HL, sp, SP, 3)
111
112#define INC_RR(rrn, rr, n) \
113OPDEF(inc_ ## rrn, 0x03+n*0x10) \
114{ \
115 rr++; \
116 ENTIME(6); \
117}
118
119INC_RR(bc, BC, 0)
120INC_RR(de, DE, 1)
121INC_RR(hl, HL, 2)
122INC_RR(sp, SP, 3)
123
124#define DEC_RR(rrn, rr, n) \
125OPDEF(dec_ ## rrn, 0x0B+n*0x10) \
126{ \
127 rr--; \
128 ENTIME(6); \
129}
130
131DEC_RR(bc, BC, 0)
132DEC_RR(de, DE, 1)
133DEC_RR(hl, HL, 2)
134DEC_RR(sp, SP, 3)
135
136OPDEF(ld_ibc_a, 0x02)
137{
138 PUTMEM(BC, BCP, RA);
139 ENTIME(7);
140}
141
142OPDEF(ld_ide_a, 0x12)
143{
144 PUTMEM(DE, DEP, RA);
145 ENTIME(7);
146}
147
148#define LD_INN_RR(rrn, rr) \
149OPDEF(ld_inn_ ## rrn, 0x22) \
150{ \
151 register dbyte dtmp; \
152 FETCHD(dtmp); \
153 DWRITE(dtmp, rr); \
154 ENTIME(16); \
155}
156
157LD_INN_RR(hl, HL)
158
159
160OPDEF(ld_inn_a, 0x32)
161{
162 register dbyte dtmp;
163 FETCHD(dtmp);
164 WRITE(dtmp, RA);
165 ENTIME(13);
166}
167
168OPDEF(ld_a_ibc, 0x0A)
169{
170 RA = *BCP;
171 ENTIME(7);
172}
173
174OPDEF(ld_a_ide, 0x1A)
175{
176 RA = *DEP;
177 ENTIME(7);
178}
179
180
181#define LD_RR_INN(rrn, rr) \
182OPDEF(ld_ ## rrn ## _inn, 0x2A) \
183{ \
184 register dbyte dtmp; \
185 FETCHD(dtmp); \
186 rr = DREAD(dtmp); \
187 ENTIME(16); \
188}
189
190LD_RR_INN(hl, HL)
191
192
193OPDEF(ld_a_inn, 0x3A)
194{
195 register dbyte dtmp;
196 FETCHD(dtmp);
197 RA = READ(dtmp);
198 ENTIME(13);
199}
200
201
202#define INC(r) \
203 r++; \
204 SETFLAGS(SF | ZF | PVF | B3F | B5F, TAB(incf_tbl)[r])
205
206
207
208#define INC_R(rn, r, n) \
209OPDEF(inc_ ## rn, 0x04+n*8) \
210{ \
211 INC(r); \
212 ENTIME(4); \
213}
214
215INC_R(b, RB, 0)
216INC_R(c, RC, 1)
217INC_R(d, RD, 2)
218INC_R(e, RE, 3)
219INC_R(h, RH, 4)
220INC_R(l, RL, 5)
221INC_R(a, RA, 7)
222
223
224OPDEF(inc_ihl, 0x34)
225{
226 MODMEM(INC);
227 ENTIME(11);
228}
229
230
231#define DEC(r) \
232 r--; \
233 SETFLAGS(SF | ZF | PVF | B3F | B5F, TAB(decf_tbl)[r])
234
235
236#define DEC_R(rn, r, n) \
237OPDEF(dec_ ## rn, 0x05+n*8) \
238{ \
239 DEC(r); \
240 ENTIME(4); \
241}
242
243DEC_R(b, RB, 0)
244DEC_R(c, RC, 1)
245DEC_R(d, RD, 2)
246DEC_R(e, RE, 3)
247DEC_R(h, RH, 4)
248DEC_R(l, RL, 5)
249DEC_R(a, RA, 7)
250
251
252OPDEF(dec_ihl, 0x35)
253{
254 MODMEM(DEC);
255 ENTIME(11);
256}
257
258#define LD_R_N(rn, r, n) \
259OPDEF(ld_ ## rn ## _n, 0x06+n*8) \
260{ \
261 r = *PCP; \
262 PC++; \
263 ENTIME(7); \
264}
265
266LD_R_N(b, RB, 0)
267LD_R_N(c, RC, 1)
268LD_R_N(d, RD, 2)
269LD_R_N(e, RE, 3)
270LD_R_N(h, RH, 4)
271LD_R_N(l, RL, 5)
272LD_R_N(a, RA, 7)
273
274
275OPDEF(ld_ihl_n, 0x36)
276{
277 PUTMEM(HL, HLP, *PCP);
278 PC++;
279 ENTIME(10);
280}
281
282OPDEF(rlca, 0x07)
283{
284 register byte btmp;
285 btmp = (RA & 0x80) >> 7;
286 SETFLAGS(HF | NF | CF, btmp);
287 RA = (RA << 1) | btmp;
288 ENTIME(4);
289}
290
291OPDEF(rrca, 0x0F)
292{
293 register byte btmp;
294 btmp = (RA & 0x01);
295 SETFLAGS(HF | NF | CF, btmp);
296 if(btmp) {
297 RA = (RA >> 1) | 0x80;
298 ENTIME(4);
299 }
300 else {
301 RA >>= 1;
302 ENTIME(4);
303 }
304}
305
306
307OPDEF(rla, 0x17)
308{
309 register byte btmp;
310 btmp = RA & 0x80;
311 RA = (RA << 1) | (RF & CF);
312 SETFLAGS(HF | NF | CF, btmp >> 7);
313 ENTIME(4);
314}
315
316OPDEF(rra, 0x1F)
317{
318 register byte btmp;
319 btmp = TESTCF;
320 SETFLAGS(HF | NF | CF, RA & 0x01);
321 if(btmp) {
322 RA = (RA >> 1) | 0x80;
323 ENTIME(4);
324 }
325 else {
326 RA >>= 1;
327 ENTIME(4);
328 }
329}
330
331OPDEF(daa, 0x27)
332{
333 register int flag;
334 flag = RF;
335
336 if(!TESTNF) {
337 if(flag & CF) RA += 0x60;
338 else if(RA > 0x99) RA += 0x60, flag |= CF;
339
340 if(flag & HF) RA += 0x06;
341 else if((RA & 0x0F) > 9) RA += 0x06, flag |= HF;
342 }
343 else {
344 if(flag & CF) RA -= 0x60;
345 else if(RA > 0x99) RA -= 0x60, flag |= CF;
346
347 if(flag & HF) RA -= 0x06;
348 else if((RA & 0x0F) > 9) RA -= 0x06, flag |= HF;
349 }
350 flag = (flag & ~(SF | ZF | PVF | B3F | B5F)) | TAB(orf_tbl)[RA];
351 RF = flag;
352
353 ENTIME(4);
354}
355
356OPDEF(cpl, 0x2F)
357{
358 RA = ~RA;
359 SET_FL(HF | NF);
360 ENTIME(4);
361}
362
363OPDEF(scf, 0x37)
364{
365 SETFLAGS(HF | NF, CF);
366 ENTIME(4);
367}
368
369OPDEF(ccf, 0x3F)
370{
371 RF = (RF ^ CF) & ~(NF);
372/* HF undefined */
373 ENTIME(4);
374}
375
376#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21extern z80t z80op_nop(z80t);
22extern z80t z80op_ld_bc_nn(z80t);
23extern z80t z80op_ld_ibc_a(z80t);
24extern z80t z80op_inc_bc(z80t);
25extern z80t z80op_inc_b(z80t);
26extern z80t z80op_dec_b(z80t);
27extern z80t z80op_ld_b_n(z80t);
28extern z80t z80op_rlca(z80t);
29extern z80t z80op_ex_af_afb(z80t);
30extern z80t z80op_add_hl_bc(z80t);
31extern z80t z80op_ld_a_ibc(z80t);
32extern z80t z80op_dec_bc(z80t);
33extern z80t z80op_inc_c(z80t);
34extern z80t z80op_dec_c(z80t);
35extern z80t z80op_ld_c_n(z80t);
36extern z80t z80op_rrca(z80t);
37
38extern z80t z80op_djnz_e(z80t);
39extern z80t z80op_ld_de_nn(z80t);
40extern z80t z80op_ld_ide_a(z80t);
41extern z80t z80op_inc_de(z80t);
42extern z80t z80op_inc_d(z80t);
43extern z80t z80op_dec_d(z80t);
44extern z80t z80op_ld_d_n(z80t);
45extern z80t z80op_rla(z80t);
46extern z80t z80op_jr_e(z80t);
47extern z80t z80op_add_hl_de(z80t);
48extern z80t z80op_ld_a_ide(z80t);
49extern z80t z80op_dec_de(z80t);
50extern z80t z80op_inc_e(z80t);
51extern z80t z80op_dec_e(z80t);
52extern z80t z80op_ld_e_n(z80t);
53extern z80t z80op_rra(z80t);
54
55extern z80t z80op_jr_nz_e(z80t);
56extern z80t z80op_ld_hl_nn(z80t);
57extern z80t z80op_ld_inn_hl(z80t);
58extern z80t z80op_inc_hl(z80t);
59extern z80t z80op_inc_h(z80t);
60extern z80t z80op_dec_h(z80t);
61extern z80t z80op_ld_h_n(z80t);
62extern z80t z80op_daa(z80t);
63extern z80t z80op_jr_z_e(z80t);
64extern z80t z80op_add_hl_hl(z80t);
65extern z80t z80op_ld_hl_inn(z80t);
66extern z80t z80op_dec_hl(z80t);
67extern z80t z80op_inc_l(z80t);
68extern z80t z80op_dec_l(z80t);
69extern z80t z80op_ld_l_n(z80t);
70extern z80t z80op_cpl(z80t);
71
72extern z80t z80op_jr_nc_e(z80t);
73extern z80t z80op_ld_sp_nn(z80t);
74extern z80t z80op_ld_inn_a(z80t);
75extern z80t z80op_inc_sp(z80t);
76extern z80t z80op_inc_ihl(z80t);
77extern z80t z80op_dec_ihl(z80t);
78extern z80t z80op_ld_ihl_n(z80t);
79extern z80t z80op_scf(z80t);
80extern z80t z80op_jr_c_e(z80t);
81extern z80t z80op_add_hl_sp(z80t);
82extern z80t z80op_ld_a_inn(z80t);
83extern z80t z80op_dec_sp(z80t);
84extern z80t z80op_inc_a(z80t);
85extern z80t z80op_dec_a(z80t);
86extern z80t z80op_ld_a_n(z80t);
87extern z80t z80op_ccf(z80t);
88
89/* IX */
90
91extern z80t z80op_add_ix_bc(z80t);
92extern z80t z80op_add_ix_de(z80t);
93extern z80t z80op_add_ix_ix(z80t);
94extern z80t z80op_add_ix_sp(z80t);
95extern z80t z80op_ld_ix_nn(z80t);
96extern z80t z80op_ld_inn_ix(z80t);
97extern z80t z80op_ld_ix_inn(z80t);
98extern z80t z80op_inc_ix(z80t);
99extern z80t z80op_dec_ix(z80t);
100extern z80t z80op_inc_ixh(z80t);
101extern z80t z80op_inc_ixl(z80t);
102extern z80t z80op_inc_iixd(z80t);
103extern z80t z80op_dec_ixh(z80t);
104extern z80t z80op_dec_ixl(z80t);
105extern z80t z80op_dec_iixd(z80t);
106extern z80t z80op_ld_ixh_n(z80t);
107extern z80t z80op_ld_ixl_n(z80t);
108extern z80t z80op_ld_iixd_n(z80t);
109
110/* IY */
111
112extern z80t z80op_add_iy_bc(z80t);
113extern z80t z80op_add_iy_de(z80t);
114extern z80t z80op_add_iy_iy(z80t);
115extern z80t z80op_add_iy_sp(z80t);
116extern z80t z80op_ld_iy_nn(z80t);
117extern z80t z80op_ld_inn_iy(z80t);
118extern z80t z80op_ld_iy_inn(z80t);
119extern z80t z80op_inc_iy(z80t);
120extern z80t z80op_dec_iy(z80t);
121extern z80t z80op_inc_iyh(z80t);
122extern z80t z80op_inc_iyl(z80t);
123extern z80t z80op_inc_iiyd(z80t);
124extern z80t z80op_dec_iyh(z80t);
125extern z80t z80op_dec_iyl(z80t);
126extern z80t z80op_dec_iiyd(z80t);
127extern z80t z80op_ld_iyh_n(z80t);
128extern z80t z80op_ld_iyl_n(z80t);
129extern z80t z80op_ld_iiyd_n(z80t);
130
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* IX */
22
23LD_RR_NN(ix, IX, 2)
24
25ADD_RR_RR(ix, IX, bc, BC, 0)
26ADD_RR_RR(ix, IX, de, DE, 1)
27ADD_RR_RR(ix, IX, ix, IX, 2)
28ADD_RR_RR(ix, IX, sp, SP, 3)
29
30INC_RR(ix, IX, 2)
31
32DEC_RR(ix, IX, 2)
33
34LD_INN_RR(ix, IX)
35
36LD_RR_INN(ix, IX)
37
38INC_R(ixh, XH, 4)
39INC_R(ixl, XL, 5)
40
41OPDEF(inc_iixd, 0x34)
42{
43 register dbyte addr;
44 IXDGET(IX, addr);
45 MODMEMADDR(INC, addr);
46 ENTIME(19);
47}
48
49DEC_R(ixh, XH, 4)
50DEC_R(ixl, XL, 5)
51
52OPDEF(dec_iixd, 0x35)
53{
54 register dbyte addr;
55 IXDGET(IX, addr);
56 MODMEMADDR(DEC, addr);
57 ENTIME(19);
58}
59
60
61LD_R_N(ixh, XH, 4)
62LD_R_N(ixl, XL, 5)
63
64OPDEF(ld_iixd_n, 0x36)
65{
66 register dbyte addr;
67 IXDGET(IX, addr);
68 WRITE(addr, READ(PC));
69 PC++;
70 ENTIME(15);
71}
72
73
74/* IY */
75
76LD_RR_NN(iy, IY, 2)
77
78ADD_RR_RR(iy, IY, bc, BC, 0)
79ADD_RR_RR(iy, IY, de, DE, 1)
80ADD_RR_RR(iy, IY, iy, IY, 2)
81ADD_RR_RR(iy, IY, sp, SP, 3)
82
83INC_RR(iy, IY, 2)
84
85DEC_RR(iy, IY, 2)
86
87LD_INN_RR(iy, IY)
88
89LD_RR_INN(iy, IY)
90
91INC_R(iyh, YH, 4)
92INC_R(iyl, YL, 5)
93
94OPDEF(inc_iiyd, 0x34)
95{
96 register dbyte addr;
97 IXDGET(IY, addr);
98 MODMEMADDR(INC, addr);
99 ENTIME(19);
100}
101
102DEC_R(iyh, YH, 4)
103DEC_R(iyl, YL, 5)
104
105OPDEF(dec_iiyd, 0x35)
106{
107 register dbyte addr;
108 IXDGET(IY, addr);
109 MODMEMADDR(DEC, addr);
110 ENTIME(19);
111}
112
113
114LD_R_N(iyh, YH, 4)
115LD_R_N(iyl, YL, 5)
116
117OPDEF(ld_iiyd_n, 0x36)
118{
119 register dbyte addr;
120 IXDGET(IY, addr);
121 WRITE(addr, READ(PC));
122 PC++;
123 ENTIME(15);
124}
125
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef NO_OPDEF
22#include "z80_def.h"
23#include "z80_op2.h"
24#endif
25
26OPDEF(halt, 0x76)
27{
28 register int nn;
29
30 DANM(haltstate) = 1;
31 nn = (DANM(tc) - 1) / 4 + 1;
32
33 DANM(tc) -= 4 * nn;
34 RR += nn-1;
35 ENDOP();
36}
37
38#define LD_R_R(rdn, rsn, rd, rs, n1, n2) \
39OPDEF(ld_ ## rdn ## _ ## rsn, 0x40 + n1 * 8 + n2) \
40{ \
41 rd = rs; \
42 ENTIME(4); \
43}
44
45#if 0
46
47#define LD_NOOP(rsd, n) \
48OPDEF(ld_ ## rsd ## _ ## rsd, 0x40 + n * 8 + n) \
49{ \
50 ENTIME(4); \
51}
52
53LD_NOOP(b, 0)
54LD_NOOP(c, 1)
55LD_NOOP(d, 2)
56LD_NOOP(e, 3)
57LD_NOOP(h, 4)
58LD_NOOP(l, 5)
59LD_NOOP(a, 7)
60
61#endif
62
63LD_R_R(b, c, RB, RC, 0, 1)
64LD_R_R(b, d, RB, RD, 0, 2)
65LD_R_R(b, e, RB, RE, 0, 3)
66LD_R_R(b, h, RB, RH, 0, 4)
67LD_R_R(b, l, RB, RL, 0, 5)
68LD_R_R(b, a, RB, RA, 0, 7)
69
70LD_R_R(c, b, RC, RB, 1, 0)
71LD_R_R(c, d, RC, RD, 1, 2)
72LD_R_R(c, e, RC, RE, 1, 3)
73LD_R_R(c, h, RC, RH, 1, 4)
74LD_R_R(c, l, RC, RL, 1, 5)
75LD_R_R(c, a, RC, RA, 1, 7)
76
77LD_R_R(d, b, RD, RB, 2, 0)
78LD_R_R(d, c, RD, RC, 2, 1)
79LD_R_R(d, e, RD, RE, 2, 3)
80LD_R_R(d, h, RD, RH, 2, 4)
81LD_R_R(d, l, RD, RL, 2, 5)
82LD_R_R(d, a, RD, RA, 2, 7)
83
84
85LD_R_R(e, b, RE, RB, 3, 0)
86LD_R_R(e, c, RE, RC, 3, 1)
87LD_R_R(e, d, RE, RD, 3, 2)
88LD_R_R(e, h, RE, RH, 3, 4)
89LD_R_R(e, l, RE, RL, 3, 5)
90LD_R_R(e, a, RE, RA, 3, 7)
91
92LD_R_R(h, b, RH, RB, 4, 0)
93LD_R_R(h, c, RH, RC, 4, 1)
94LD_R_R(h, d, RH, RD, 4, 2)
95LD_R_R(h, e, RH, RE, 4, 3)
96LD_R_R(h, l, RH, RL, 4, 5)
97LD_R_R(h, a, RH, RA, 4, 7)
98
99LD_R_R(l, b, RL, RB, 5, 0)
100LD_R_R(l, c, RL, RC, 5, 1)
101LD_R_R(l, d, RL, RD, 5, 2)
102LD_R_R(l, e, RL, RE, 5, 3)
103LD_R_R(l, h, RL, RH, 5, 4)
104LD_R_R(l, a, RL, RA, 5, 7)
105
106LD_R_R(a, b, RA, RB, 7, 0)
107LD_R_R(a, c, RA, RC, 7, 1)
108LD_R_R(a, d, RA, RD, 7, 2)
109LD_R_R(a, e, RA, RE, 7, 3)
110LD_R_R(a, h, RA, RH, 7, 4)
111LD_R_R(a, l, RA, RL, 7, 5)
112
113
114#define LD_R_IHL(rdn, rd, n) \
115OPDEF(ld_ ## rdn ## _ihl, 0x46+n*8) \
116{ \
117 rd = *HLP; \
118 ENTIME(7); \
119}
120
121#define LD_R_ID(ixyn, ixy, rsn, rs, n) \
122OPDEF(ld_ ## rsn ## _i ## ixyn ## d, 0x46+n*8) \
123{ \
124 register dbyte addr; \
125 IXDGET(ixy, addr); \
126 rs = READ(addr); \
127 ENTIME(15); \
128}
129
130
131LD_R_IHL(b, RB, 0)
132LD_R_IHL(c, RC, 1)
133LD_R_IHL(d, RD, 2)
134LD_R_IHL(e, RE, 3)
135LD_R_IHL(h, RH, 4)
136LD_R_IHL(l, RL, 5)
137LD_R_IHL(a, RA, 7)
138
139#define LD_IHL_R(rsn, rs, n) \
140OPDEF(ld_ihl_ ## rsn, 0x70+n) \
141{ \
142 PUTMEM(HL, HLP, rs); \
143 ENTIME(7); \
144}
145
146#define LD_ID_R(ixyn, ixy, rsn, rs, n) \
147OPDEF(ld_i ## ixyn ## d_ ## rsn, 0x70+n) \
148{ \
149 register dbyte addr; \
150 IXDGET(ixy, addr); \
151 WRITE(addr, rs); \
152 ENTIME(15); \
153}
154
155
156
157LD_IHL_R(b, RB, 0)
158LD_IHL_R(c, RC, 1)
159LD_IHL_R(d, RD, 2)
160LD_IHL_R(e, RE, 3)
161LD_IHL_R(h, RH, 4)
162LD_IHL_R(l, RL, 5)
163LD_IHL_R(a, RA, 7)
164
165#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* extern z80t z80op_nop(z80t); */
22extern z80t z80op_ld_b_c(z80t);
23extern z80t z80op_ld_b_d(z80t);
24extern z80t z80op_ld_b_e(z80t);
25extern z80t z80op_ld_b_h(z80t);
26extern z80t z80op_ld_b_l(z80t);
27extern z80t z80op_ld_b_ihl(z80t);
28extern z80t z80op_ld_b_a(z80t);
29extern z80t z80op_ld_c_b(z80t);
30/* extern z80t z80op_nop(z80t); */
31extern z80t z80op_ld_c_d(z80t);
32extern z80t z80op_ld_c_e(z80t);
33extern z80t z80op_ld_c_h(z80t);
34extern z80t z80op_ld_c_l(z80t);
35extern z80t z80op_ld_c_ihl(z80t);
36extern z80t z80op_ld_c_a(z80t);
37
38extern z80t z80op_ld_d_b(z80t);
39extern z80t z80op_ld_d_c(z80t);
40/* extern z80t z80op_nop(z80t); */
41extern z80t z80op_ld_d_e(z80t);
42extern z80t z80op_ld_d_h(z80t);
43extern z80t z80op_ld_d_l(z80t);
44extern z80t z80op_ld_d_ihl(z80t);
45extern z80t z80op_ld_d_a(z80t);
46extern z80t z80op_ld_e_b(z80t);
47extern z80t z80op_ld_e_c(z80t);
48extern z80t z80op_ld_e_d(z80t);
49/* extern z80t z80op_nop(z80t); */
50extern z80t z80op_ld_e_h(z80t);
51extern z80t z80op_ld_e_l(z80t);
52extern z80t z80op_ld_e_ihl(z80t);
53extern z80t z80op_ld_e_a(z80t);
54
55extern z80t z80op_ld_h_b(z80t);
56extern z80t z80op_ld_h_c(z80t);
57extern z80t z80op_ld_h_d(z80t);
58extern z80t z80op_ld_h_e(z80t);
59/* extern z80t z80op_nop(z80t); */
60extern z80t z80op_ld_h_l(z80t);
61extern z80t z80op_ld_h_ihl(z80t);
62extern z80t z80op_ld_h_a(z80t);
63extern z80t z80op_ld_l_b(z80t);
64extern z80t z80op_ld_l_c(z80t);
65extern z80t z80op_ld_l_d(z80t);
66extern z80t z80op_ld_l_e(z80t);
67extern z80t z80op_ld_l_h(z80t);
68/* extern z80t z80op_nop(z80t); */
69extern z80t z80op_ld_l_ihl(z80t);
70extern z80t z80op_ld_l_a(z80t);
71
72extern z80t z80op_ld_ihl_b(z80t);
73extern z80t z80op_ld_ihl_c(z80t);
74extern z80t z80op_ld_ihl_d(z80t);
75extern z80t z80op_ld_ihl_e(z80t);
76extern z80t z80op_ld_ihl_h(z80t);
77extern z80t z80op_ld_ihl_l(z80t);
78extern z80t z80op_halt(z80t);
79extern z80t z80op_ld_ihl_a(z80t);
80extern z80t z80op_ld_a_b(z80t);
81extern z80t z80op_ld_a_c(z80t);
82extern z80t z80op_ld_a_d(z80t);
83extern z80t z80op_ld_a_e(z80t);
84extern z80t z80op_ld_a_h(z80t);
85extern z80t z80op_ld_a_l(z80t);
86extern z80t z80op_ld_a_ihl(z80t);
87/* extern z80t z80op_nop(z80t); */
88
89
90/* IX */
91
92extern z80t z80op_ld_b_ixh(z80t);
93extern z80t z80op_ld_b_ixl(z80t);
94
95extern z80t z80op_ld_c_ixh(z80t);
96extern z80t z80op_ld_c_ixl(z80t);
97
98extern z80t z80op_ld_d_ixh(z80t);
99extern z80t z80op_ld_d_ixl(z80t);
100
101extern z80t z80op_ld_e_ixh(z80t);
102extern z80t z80op_ld_e_ixl(z80t);
103
104extern z80t z80op_ld_ixh_b(z80t);
105extern z80t z80op_ld_ixh_c(z80t);
106extern z80t z80op_ld_ixh_d(z80t);
107extern z80t z80op_ld_ixh_e(z80t);
108/* extern z80t z80op_ld_ixh_ixh(z80t); */
109extern z80t z80op_ld_ixh_ixl(z80t);
110extern z80t z80op_ld_ixh_a(z80t);
111
112
113extern z80t z80op_ld_ixl_b(z80t);
114extern z80t z80op_ld_ixl_c(z80t);
115extern z80t z80op_ld_ixl_d(z80t);
116extern z80t z80op_ld_ixl_e(z80t);
117extern z80t z80op_ld_ixl_ixh(z80t);
118/* extern z80t z80op_ld_ixl_ixl(z80t); */
119extern z80t z80op_ld_ixl_a(z80t);
120
121extern z80t z80op_ld_a_ixh(z80t);
122extern z80t z80op_ld_a_ixl(z80t);
123
124extern z80t z80op_ld_iixd_b(z80t);
125extern z80t z80op_ld_iixd_c(z80t);
126extern z80t z80op_ld_iixd_d(z80t);
127extern z80t z80op_ld_iixd_e(z80t);
128extern z80t z80op_ld_iixd_h(z80t);
129extern z80t z80op_ld_iixd_l(z80t);
130extern z80t z80op_ld_iixd_a(z80t);
131
132extern z80t z80op_ld_b_iixd(z80t);
133extern z80t z80op_ld_c_iixd(z80t);
134extern z80t z80op_ld_d_iixd(z80t);
135extern z80t z80op_ld_e_iixd(z80t);
136extern z80t z80op_ld_h_iixd(z80t);
137extern z80t z80op_ld_l_iixd(z80t);
138extern z80t z80op_ld_a_iixd(z80t);
139
140/* IY */
141
142extern z80t z80op_ld_b_iyh(z80t);
143extern z80t z80op_ld_b_iyl(z80t);
144
145extern z80t z80op_ld_c_iyh(z80t);
146extern z80t z80op_ld_c_iyl(z80t);
147
148extern z80t z80op_ld_d_iyh(z80t);
149extern z80t z80op_ld_d_iyl(z80t);
150
151extern z80t z80op_ld_e_iyh(z80t);
152extern z80t z80op_ld_e_iyl(z80t);
153
154extern z80t z80op_ld_iyh_b(z80t);
155extern z80t z80op_ld_iyh_c(z80t);
156extern z80t z80op_ld_iyh_d(z80t);
157extern z80t z80op_ld_iyh_e(z80t);
158/* extern z80t z80op_ld_iyh_iyh(z80t); */
159extern z80t z80op_ld_iyh_iyl(z80t);
160extern z80t z80op_ld_iyh_a(z80t);
161
162
163extern z80t z80op_ld_iyl_b(z80t);
164extern z80t z80op_ld_iyl_c(z80t);
165extern z80t z80op_ld_iyl_d(z80t);
166extern z80t z80op_ld_iyl_e(z80t);
167extern z80t z80op_ld_iyl_iyh(z80t);
168/* extern z80t z80op_ld_iyl_iyl(z80t); */
169extern z80t z80op_ld_iyl_a(z80t);
170
171extern z80t z80op_ld_a_iyh(z80t);
172extern z80t z80op_ld_a_iyl(z80t);
173
174extern z80t z80op_ld_iiyd_b(z80t);
175extern z80t z80op_ld_iiyd_c(z80t);
176extern z80t z80op_ld_iiyd_d(z80t);
177extern z80t z80op_ld_iiyd_e(z80t);
178extern z80t z80op_ld_iiyd_h(z80t);
179extern z80t z80op_ld_iiyd_l(z80t);
180extern z80t z80op_ld_iiyd_a(z80t);
181
182extern z80t z80op_ld_b_iiyd(z80t);
183extern z80t z80op_ld_c_iiyd(z80t);
184extern z80t z80op_ld_d_iiyd(z80t);
185extern z80t z80op_ld_e_iiyd(z80t);
186extern z80t z80op_ld_h_iiyd(z80t);
187extern z80t z80op_ld_l_iiyd(z80t);
188extern 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* IX */
22
23LD_R_R(b, ixh, RB, XH, 0, 4)
24LD_R_R(b, ixl, RB, XL, 0, 5)
25
26LD_R_R(c, ixh, RC, XH, 1, 4)
27LD_R_R(c, ixl, RC, XL, 1, 5)
28
29LD_R_R(d, ixh, RD, XH, 2, 4)
30LD_R_R(d, ixl, RD, XL, 2, 5)
31
32LD_R_R(e, ixh, RE, XH, 3, 4)
33LD_R_R(e, ixl, RE, XL, 3, 5)
34
35LD_R_R(ixh, b, XH, RB, 4, 0)
36LD_R_R(ixh, c, XH, RC, 4, 1)
37LD_R_R(ixh, d, XH, RD, 4, 2)
38LD_R_R(ixh, e, XH, RE, 4, 3)
39LD_R_R(ixh, ixl, XH, XL, 4, 5)
40LD_R_R(ixh, a, XH, RA, 4, 7)
41
42LD_R_R(ixl, b, XL, RB, 5, 0)
43LD_R_R(ixl, c, XL, RC, 5, 1)
44LD_R_R(ixl, d, XL, RD, 5, 2)
45LD_R_R(ixl, e, XL, RE, 5, 3)
46LD_R_R(ixl, ixh, XL, XH, 5, 4)
47LD_R_R(ixl, a, XL, RA, 5, 7)
48
49
50LD_R_R(a, ixh, RA, XH, 7, 4)
51LD_R_R(a, ixl, RA, XL, 7, 5)
52
53LD_ID_R(ix, IX, b, RB, 0)
54LD_ID_R(ix, IX, c, RC, 1)
55LD_ID_R(ix, IX, d, RD, 2)
56LD_ID_R(ix, IX, e, RE, 3)
57LD_ID_R(ix, IX, h, RH, 4)
58LD_ID_R(ix, IX, l, RL, 5)
59LD_ID_R(ix, IX, a, RA, 6)
60
61LD_R_ID(ix, IX, b, RB, 0)
62LD_R_ID(ix, IX, c, RC, 1)
63LD_R_ID(ix, IX, d, RD, 2)
64LD_R_ID(ix, IX, e, RE, 3)
65LD_R_ID(ix, IX, h, RH, 4)
66LD_R_ID(ix, IX, l, RL, 5)
67LD_R_ID(ix, IX, a, RA, 6)
68
69
70/* IY */
71
72LD_R_R(b, iyh, RB, YH, 0, 4)
73LD_R_R(b, iyl, RB, YL, 0, 5)
74
75LD_R_R(c, iyh, RC, YH, 1, 4)
76LD_R_R(c, iyl, RC, YL, 1, 5)
77
78LD_R_R(d, iyh, RD, YH, 2, 4)
79LD_R_R(d, iyl, RD, YL, 2, 5)
80
81LD_R_R(e, iyh, RE, YH, 3, 4)
82LD_R_R(e, iyl, RE, YL, 3, 5)
83
84LD_R_R(iyh, b, YH, RB, 4, 0)
85LD_R_R(iyh, c, YH, RC, 4, 1)
86LD_R_R(iyh, d, YH, RD, 4, 2)
87LD_R_R(iyh, e, YH, RE, 4, 3)
88LD_R_R(iyh, iyl, YH, YL, 4, 5)
89LD_R_R(iyh, a, YH, RA, 4, 7)
90
91LD_R_R(iyl, b, YL, RB, 5, 0)
92LD_R_R(iyl, c, YL, RC, 5, 1)
93LD_R_R(iyl, d, YL, RD, 5, 2)
94LD_R_R(iyl, e, YL, RE, 5, 3)
95LD_R_R(iyl, iyh, YL, YH, 5, 4)
96LD_R_R(iyl, a, YL, RA, 5, 7)
97
98
99LD_R_R(a, iyh, RA, YH, 7, 4)
100LD_R_R(a, iyl, RA, YL, 7, 5)
101
102LD_ID_R(iy, IY, b, RB, 0)
103LD_ID_R(iy, IY, c, RC, 1)
104LD_ID_R(iy, IY, d, RD, 2)
105LD_ID_R(iy, IY, e, RE, 3)
106LD_ID_R(iy, IY, h, RH, 4)
107LD_ID_R(iy, IY, l, RL, 5)
108LD_ID_R(iy, IY, a, RA, 6)
109
110LD_R_ID(iy, IY, b, RB, 0)
111LD_R_ID(iy, IY, c, RC, 1)
112LD_R_ID(iy, IY, d, RD, 2)
113LD_R_ID(iy, IY, e, RE, 3)
114LD_R_ID(iy, IY, h, RH, 4)
115LD_R_ID(iy, IY, l, RL, 5)
116LD_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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef NO_OPDEF
22#include "z80_def.h"
23#include "z80_op3.h"
24#include "z80_ari.h"
25#endif
26
27#define ARIR(arin, func, an, rn, r, n) \
28OPDEF(arin ## _ ## rn, 0x80+an*8+n) \
29{ \
30 func(r); \
31 ENTIME(4); \
32}
33
34#define ARIIHL(arin, func, an) \
35OPDEF(arin ## _ihl, 0x86+an*8) \
36{ \
37 func(*HLP); \
38 ENTIME(7); \
39}
40
41#define ARIID(arin, func, an, ixyn, ixy) \
42OPDEF(arin ## _i ## ixyn ## d, 0x86+an*8)\
43{ \
44 register dbyte addr; \
45 register byte val; \
46 IXDGET(ixy, addr); \
47 val = READ(addr); \
48 func(val); \
49 ENTIME(15); \
50}
51
52
53#define ADD_A_R(rn, r, n) ARIR(add_a, ADD, 0, rn, r, n)
54#define ADC_A_R(rn, r, n) ARIR(adc_a, ADC, 1, rn, r, n)
55#define SUB_R(rn, r, n) ARIR(sub, SUB, 2, rn, r, n)
56#define SBC_A_R(rn, r, n) ARIR(sbc_a, SBC, 3, rn, r, n)
57#define AND_R(rn, r, n) ARIR(and, AND, 4, rn, r, n)
58#define XOR_R(rn, r, n) ARIR(xor, XOR, 5, rn, r, n)
59#define OR_R(rn, r, n) ARIR(or, OR, 6, rn, r, n)
60#define CP_R(rn, r, n) ARIR(cp, CP, 7, rn, r, n)
61
62ADD_A_R(b, RB, 0)
63ADD_A_R(c, RC, 1)
64ADD_A_R(d, RD, 2)
65ADD_A_R(e, RE, 3)
66ADD_A_R(h, RH, 4)
67ADD_A_R(l, RL, 5)
68ADD_A_R(a, RA, 7)
69
70ADC_A_R(b, RB, 0)
71ADC_A_R(c, RC, 1)
72ADC_A_R(d, RD, 2)
73ADC_A_R(e, RE, 3)
74ADC_A_R(h, RH, 4)
75ADC_A_R(l, RL, 5)
76ADC_A_R(a, RA, 7)
77
78SUB_R(b, RB, 0)
79SUB_R(c, RC, 1)
80SUB_R(d, RD, 2)
81SUB_R(e, RE, 3)
82SUB_R(h, RH, 4)
83SUB_R(l, RL, 5)
84SUB_R(a, RA, 7)
85
86SBC_A_R(b, RB, 0)
87SBC_A_R(c, RC, 1)
88SBC_A_R(d, RD, 2)
89SBC_A_R(e, RE, 3)
90SBC_A_R(h, RH, 4)
91SBC_A_R(l, RL, 5)
92SBC_A_R(a, RA, 7)
93
94AND_R(b, RB, 0)
95AND_R(c, RC, 1)
96AND_R(d, RD, 2)
97AND_R(e, RE, 3)
98AND_R(h, RH, 4)
99AND_R(l, RL, 5)
100AND_R(a, RA, 7)
101
102XOR_R(b, RB, 0)
103XOR_R(c, RC, 1)
104XOR_R(d, RD, 2)
105XOR_R(e, RE, 3)
106XOR_R(h, RH, 4)
107XOR_R(l, RL, 5)
108/* XOR_R(a, RA, 7) */
109
110OPDEF(xor_a, 0xAF)
111{
112 RA = 0;
113 RF = (RF & ~(ALLF)) | (ZF | PVF);
114 ENTIME(4);
115}
116
117OR_R(b, RB, 0)
118OR_R(c, RC, 1)
119OR_R(d, RD, 2)
120OR_R(e, RE, 3)
121OR_R(h, RH, 4)
122OR_R(l, RL, 5)
123OR_R(a, RA, 7)
124
125CP_R(b, RB, 0)
126CP_R(c, RC, 1)
127CP_R(d, RD, 2)
128CP_R(e, RE, 3)
129CP_R(h, RH, 4)
130CP_R(l, RL, 5)
131CP_R(a, RA, 7)
132
133ARIIHL(add_a, ADD, 0)
134ARIIHL(adc_a, ADC, 1)
135ARIIHL(sub, SUB, 2)
136ARIIHL(sbc_a, SBC, 3)
137ARIIHL(and, AND, 4)
138ARIIHL(xor, XOR, 5)
139ARIIHL(or, OR, 6)
140ARIIHL(cp, CP, 7)
141
142#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21extern z80t z80op_add_a_b(z80t);
22extern z80t z80op_add_a_c(z80t);
23extern z80t z80op_add_a_d(z80t);
24extern z80t z80op_add_a_e(z80t);
25extern z80t z80op_add_a_h(z80t);
26extern z80t z80op_add_a_l(z80t);
27extern z80t z80op_add_a_ihl(z80t);
28extern z80t z80op_add_a_a(z80t);
29extern z80t z80op_adc_a_b(z80t);
30extern z80t z80op_adc_a_c(z80t);
31extern z80t z80op_adc_a_d(z80t);
32extern z80t z80op_adc_a_e(z80t);
33extern z80t z80op_adc_a_h(z80t);
34extern z80t z80op_adc_a_l(z80t);
35extern z80t z80op_adc_a_ihl(z80t);
36extern z80t z80op_adc_a_a(z80t);
37
38extern z80t z80op_sub_b(z80t);
39extern z80t z80op_sub_c(z80t);
40extern z80t z80op_sub_d(z80t);
41extern z80t z80op_sub_e(z80t);
42extern z80t z80op_sub_h(z80t);
43extern z80t z80op_sub_l(z80t);
44extern z80t z80op_sub_ihl(z80t);
45extern z80t z80op_sub_a(z80t);
46extern z80t z80op_sbc_a_b(z80t);
47extern z80t z80op_sbc_a_c(z80t);
48extern z80t z80op_sbc_a_d(z80t);
49extern z80t z80op_sbc_a_e(z80t);
50extern z80t z80op_sbc_a_h(z80t);
51extern z80t z80op_sbc_a_l(z80t);
52extern z80t z80op_sbc_a_ihl(z80t);
53extern z80t z80op_sbc_a_a(z80t);
54
55extern z80t z80op_and_b(z80t);
56extern z80t z80op_and_c(z80t);
57extern z80t z80op_and_d(z80t);
58extern z80t z80op_and_e(z80t);
59extern z80t z80op_and_h(z80t);
60extern z80t z80op_and_l(z80t);
61extern z80t z80op_and_ihl(z80t);
62extern z80t z80op_and_a(z80t);
63extern z80t z80op_xor_b(z80t);
64extern z80t z80op_xor_c(z80t);
65extern z80t z80op_xor_d(z80t);
66extern z80t z80op_xor_e(z80t);
67extern z80t z80op_xor_h(z80t);
68extern z80t z80op_xor_l(z80t);
69extern z80t z80op_xor_ihl(z80t);
70extern z80t z80op_xor_a(z80t);
71
72extern z80t z80op_or_b(z80t);
73extern z80t z80op_or_c(z80t);
74extern z80t z80op_or_d(z80t);
75extern z80t z80op_or_e(z80t);
76extern z80t z80op_or_h(z80t);
77extern z80t z80op_or_l(z80t);
78extern z80t z80op_or_ihl(z80t);
79extern z80t z80op_or_a(z80t);
80extern z80t z80op_cp_b(z80t);
81extern z80t z80op_cp_c(z80t);
82extern z80t z80op_cp_d(z80t);
83extern z80t z80op_cp_e(z80t);
84extern z80t z80op_cp_h(z80t);
85extern z80t z80op_cp_l(z80t);
86extern z80t z80op_cp_ihl(z80t);
87extern z80t z80op_cp_a(z80t);
88
89
90/* IX */
91
92extern z80t z80op_add_a_ixh(z80t);
93extern z80t z80op_add_a_ixl(z80t);
94extern z80t z80op_add_a_iixd(z80t);
95
96extern z80t z80op_adc_a_ixh(z80t);
97extern z80t z80op_adc_a_ixl(z80t);
98extern z80t z80op_adc_a_iixd(z80t);
99
100extern z80t z80op_sub_ixh(z80t);
101extern z80t z80op_sub_ixl(z80t);
102extern z80t z80op_sub_iixd(z80t);
103
104extern z80t z80op_sbc_a_ixh(z80t);
105extern z80t z80op_sbc_a_ixl(z80t);
106extern z80t z80op_sbc_a_iixd(z80t);
107
108extern z80t z80op_and_ixh(z80t);
109extern z80t z80op_and_ixl(z80t);
110extern z80t z80op_and_iixd(z80t);
111
112extern z80t z80op_xor_ixh(z80t);
113extern z80t z80op_xor_ixl(z80t);
114extern z80t z80op_xor_iixd(z80t);
115
116extern z80t z80op_or_ixh(z80t);
117extern z80t z80op_or_ixl(z80t);
118extern z80t z80op_or_iixd(z80t);
119
120extern z80t z80op_cp_ixh(z80t);
121extern z80t z80op_cp_ixl(z80t);
122extern z80t z80op_cp_iixd(z80t);
123
124
125/* IY */
126
127extern z80t z80op_add_a_iyh(z80t);
128extern z80t z80op_add_a_iyl(z80t);
129extern z80t z80op_add_a_iiyd(z80t);
130
131extern z80t z80op_adc_a_iyh(z80t);
132extern z80t z80op_adc_a_iyl(z80t);
133extern z80t z80op_adc_a_iiyd(z80t);
134
135extern z80t z80op_sub_iyh(z80t);
136extern z80t z80op_sub_iyl(z80t);
137extern z80t z80op_sub_iiyd(z80t);
138
139extern z80t z80op_sbc_a_iyh(z80t);
140extern z80t z80op_sbc_a_iyl(z80t);
141extern z80t z80op_sbc_a_iiyd(z80t);
142
143extern z80t z80op_and_iyh(z80t);
144extern z80t z80op_and_iyl(z80t);
145extern z80t z80op_and_iiyd(z80t);
146
147extern z80t z80op_xor_iyh(z80t);
148extern z80t z80op_xor_iyl(z80t);
149extern z80t z80op_xor_iiyd(z80t);
150
151extern z80t z80op_or_iyh(z80t);
152extern z80t z80op_or_iyl(z80t);
153extern z80t z80op_or_iiyd(z80t);
154
155extern z80t z80op_cp_iyh(z80t);
156extern z80t z80op_cp_iyl(z80t);
157extern 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* IX */
22
23ADD_A_R(ixh, XH, 4)
24ADD_A_R(ixl, XL, 5)
25
26ADC_A_R(ixh, XH, 4)
27ADC_A_R(ixl, XL, 5)
28
29SUB_R(ixh, XH, 4)
30SUB_R(ixl, XL, 5)
31
32SBC_A_R(ixh, XH, 4)
33SBC_A_R(ixl, XL, 5)
34
35AND_R(ixh, XH, 4)
36AND_R(ixl, XL, 5)
37
38XOR_R(ixh, XH, 4)
39XOR_R(ixl, XL, 5)
40
41OR_R(ixh, XH, 4)
42OR_R(ixl, XL, 5)
43
44CP_R(ixh, XH, 4)
45CP_R(ixl, XL, 5)
46
47ARIID(add_a, ADD, 0, ix, IX)
48ARIID(adc_a, ADC, 1, ix, IX)
49ARIID(sub, SUB, 2, ix, IX)
50ARIID(sbc_a, SBC, 3, ix, IX)
51ARIID(and, AND, 4, ix, IX)
52ARIID(xor, XOR, 5, ix, IX)
53ARIID(or, OR, 6, ix, IX)
54ARIID(cp, CP, 7, ix, IX)
55
56/* IY */
57
58ADD_A_R(iyh, YH, 4)
59ADD_A_R(iyl, YL, 5)
60
61ADC_A_R(iyh, YH, 4)
62ADC_A_R(iyl, YL, 5)
63
64SUB_R(iyh, YH, 4)
65SUB_R(iyl, YL, 5)
66
67SBC_A_R(iyh, YH, 4)
68SBC_A_R(iyl, YL, 5)
69
70AND_R(iyh, YH, 4)
71AND_R(iyl, YL, 5)
72
73XOR_R(iyh, YH, 4)
74XOR_R(iyl, YL, 5)
75
76OR_R(iyh, YH, 4)
77OR_R(iyl, YL, 5)
78
79CP_R(iyh, YH, 4)
80CP_R(iyl, YL, 5)
81
82ARIID(add_a, ADD, 0, iy, IY)
83ARIID(adc_a, ADC, 1, iy, IY)
84ARIID(sub, SUB, 2, iy, IY)
85ARIID(sbc_a, SBC, 3, iy, IY)
86ARIID(and, AND, 4, iy, IY)
87ARIID(xor, XOR, 5, iy, IY)
88ARIID(or, OR, 6, iy, IY)
89ARIID(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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef NO_OPDEF
22#include "z80_def.h"
23#include "z80_op4.h"
24#include "z80_ari.h"
25#endif
26
27#define RET_CC(ccn, cc, n) \
28OPDEF(ret_ ## ccn, 0xC0+n*8) \
29{ \
30 if(!(cc)) { \
31 ENTIME(5); \
32 } \
33 else { \
34 POP(PC); \
35 ENTIME(11); \
36 } \
37}
38
39RET_CC(nz, !TESTZF, 0)
40RET_CC(z, TESTZF, 1)
41RET_CC(nc, !TESTCF, 2)
42RET_CC(c, TESTCF, 3)
43RET_CC(po, !TESTPF, 4)
44RET_CC(pe, TESTPF, 5)
45RET_CC(p, !TESTSF, 6)
46RET_CC(m, TESTSF, 7)
47
48#define POP_RR(rrn, rr, n) \
49OPDEF(pop_ ## rrn, 0xC1+n*0x10) \
50{ \
51 POP(rr); \
52 ENTIME(10); \
53}
54
55POP_RR(bc, BC, 0)
56POP_RR(de, DE, 1)
57POP_RR(hl, HL, 2)
58POP_RR(af, AF, 3)
59
60OPDEF(ret, 0xC9)
61{
62 POP(PC);
63 ENTIME(10);
64}
65
66OPDEF(exx, 0xD9)
67{
68 register dbyte dtmp;
69
70 dtmp = BCBK, BCBK = BC, BC = dtmp;
71 dtmp = DEBK, DEBK = DE, DE = dtmp;
72 dtmp = HLBK, HLBK = HL, HL = dtmp;
73
74 ENTIME(4);
75}
76
77#define JP_RR(rrn, rr) \
78OPDEF(jp_ ## rrn, 0xE9) \
79{ \
80 PC = rr; \
81 ENTIME(4); \
82}
83
84JP_RR(hl, HL)
85
86#define LD_SP_RR(rrn, rr) \
87OPDEF(ld_sp_ ## rrn, 0xF9) \
88{ \
89 SP = rr; \
90 ENTIME(6); \
91}
92
93LD_SP_RR(hl, HL)
94
95#define JP_CC(ccn, cc, n) \
96OPDEF(jp_ ## ccn ## _nn, 0xC2+n*8) \
97{ \
98 if(!(cc)) { \
99 PC+=2; \
100 ENTIME(10); \
101 } \
102 else { \
103 PC = DREAD(PC); \
104 ENTIME(10); \
105 } \
106}
107
108JP_CC(nz, !TESTZF, 0)
109JP_CC(z, TESTZF, 1)
110JP_CC(nc, !TESTCF, 2)
111JP_CC(c, TESTCF, 3)
112JP_CC(po, !TESTPF, 4)
113JP_CC(pe, TESTPF, 5)
114JP_CC(p, !TESTSF, 6)
115JP_CC(m, TESTSF, 7)
116
117OPDEF(jp_nn, 0xC3)
118{
119 PC = DREAD(PC);
120 ENTIME(10);
121}
122
123
124OPDEF(out_in_a, 0xD3)
125{
126 OUT(RA, *PCP, RA);
127 PC++;
128 ENTIME(11);
129}
130
131OPDEF(in_a_in, 0xDB)
132{
133 IN(RA, *PCP, RA);
134 PC++;
135 ENTIME(11);
136}
137
138#define EX_ISP_RR(rrn, rr) \
139OPDEF(ex_isp_ ## rrn, 0xE3) \
140{ \
141 register dbyte dtmp; \
142 dtmp = DREAD(SP); \
143 DWRITE(SP, rr); \
144 rr = dtmp; \
145 ENTIME(19); \
146}
147
148EX_ISP_RR(hl, HL)
149
150OPDEF(ex_de_hl, 0xEB)
151{
152 register dbyte dtmp;
153 dtmp = DE;
154 DE = HL;
155 HL = dtmp;
156 ENTIME(4);
157}
158
159OPDEF(di, 0xF3)
160{
161 DANM(iff1) = 0;
162 DANM(iff2) = 0;
163 DI_CHECK
164 ENTIME(4);
165}
166
167OPDEF(ei, 0xFB)
168{
169 DANM(iff1) = 1;
170 DANM(iff2) = 1;
171 ENTIME(4);
172}
173
174
175
176#define CALL_CC(ccn, cc, n) \
177OPDEF(call_ ## ccn ## _nn, 0xC4+n*8) \
178{ \
179 if(!(cc)) { \
180 PC+=2; \
181 ENTIME(10); \
182 } \
183 else { \
184 register dbyte dtmp; \
185 dtmp = PC; \
186 PC = DREAD(dtmp); \
187 dtmp += 2; \
188 PUSH(dtmp); \
189 ENTIME(17); \
190 } \
191}
192
193CALL_CC(nz, !TESTZF, 0)
194CALL_CC(z, TESTZF, 1)
195CALL_CC(nc, !TESTCF, 2)
196CALL_CC(c, TESTCF, 3)
197CALL_CC(po, !TESTPF, 4)
198CALL_CC(pe, TESTPF, 5)
199CALL_CC(p, !TESTSF, 6)
200CALL_CC(m, TESTSF, 7)
201
202
203
204#define PUSH_RR(rrn, rr, n) \
205OPDEF(push_ ## rrn, 0xC5+n*0x10) \
206{ \
207 PUSH(rr); \
208 ENTIME(11); \
209}
210
211PUSH_RR(bc, BC, 0)
212PUSH_RR(de, DE, 1)
213PUSH_RR(hl, HL, 2)
214PUSH_RR(af, AF, 3)
215
216
217OPDEF(call_nn, 0xCD)
218{
219 register dbyte dtmp;
220 dtmp = PC;
221 PC = DREAD(dtmp);
222 dtmp += 2;
223 PUSH(dtmp);
224 ENTIME(17);
225}
226
227
228OPDEF(add_a_n, 0xC6)
229{
230 ADD(*PCP);
231 PC++;
232 ENTIME(7);
233}
234
235
236OPDEF(adc_a_n, 0xCE)
237{
238 ADC(*PCP);
239 PC++;
240 ENTIME(7);
241}
242
243OPDEF(sub_n, 0xD6)
244{
245 SUB(*PCP);
246 PC++;
247 ENTIME(7);
248}
249
250
251OPDEF(sbc_a_n, 0xDE)
252{
253 SBC(*PCP);
254 PC++;
255 ENTIME(7);
256}
257
258OPDEF(and_n, 0xE6)
259{
260 AND(*PCP);
261 PC++;
262 ENTIME(7);
263}
264
265
266OPDEF(xor_n, 0xEE)
267{
268 XOR(*PCP);
269 PC++;
270 ENTIME(7);
271}
272
273OPDEF(or_n, 0xF6)
274{
275 OR(*PCP);
276 PC++;
277 ENTIME(7);
278}
279
280
281OPDEF(cp_n, 0xFE)
282{
283 CP(*PCP);
284 PC++;
285 ENTIME(7);
286}
287
288#define RST_NN(nnn, n) \
289OPDEF(rst_ ## nnn, 0xC7+n*8) \
290{ \
291 PUSH(PC); \
292 PC = n*8; \
293 ENTIME(11); \
294}
295
296RST_NN(00, 0)
297RST_NN(08, 1)
298RST_NN(10, 2)
299RST_NN(18, 3)
300RST_NN(20, 4)
301RST_NN(28, 5)
302RST_NN(30, 6)
303RST_NN(38, 7)
304
305#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21extern z80t z80op_ret_nz(z80t);
22extern z80t z80op_pop_bc(z80t);
23extern z80t z80op_jp_nz_nn(z80t);
24extern z80t z80op_jp_nn(z80t);
25extern z80t z80op_call_nz_nn(z80t);
26extern z80t z80op_push_bc(z80t);
27extern z80t z80op_add_a_n(z80t);
28extern z80t z80op_rst_00(z80t);
29extern z80t z80op_ret_z(z80t);
30extern z80t z80op_ret(z80t);
31extern z80t z80op_jp_z_nn(z80t);
32extern z80t z80op_special_cb(z80t);
33extern z80t z80op_call_z_nn(z80t);
34extern z80t z80op_call_nn(z80t);
35extern z80t z80op_adc_a_n(z80t);
36extern z80t z80op_rst_08(z80t);
37
38extern z80t z80op_ret_nc(z80t);
39extern z80t z80op_pop_de(z80t);
40extern z80t z80op_jp_nc_nn(z80t);
41extern z80t z80op_out_in_a(z80t);
42extern z80t z80op_call_nc_nn(z80t);
43extern z80t z80op_push_de(z80t);
44extern z80t z80op_sub_n(z80t);
45extern z80t z80op_rst_10(z80t);
46extern z80t z80op_ret_c(z80t);
47extern z80t z80op_exx(z80t);
48extern z80t z80op_jp_c_nn(z80t);
49extern z80t z80op_in_a_in(z80t);
50extern z80t z80op_call_c_nn(z80t);
51extern z80t z80op_special_dd(z80t);
52extern z80t z80op_sbc_a_n(z80t);
53extern z80t z80op_rst_18(z80t);
54
55extern z80t z80op_ret_po(z80t);
56extern z80t z80op_pop_hl(z80t);
57extern z80t z80op_jp_po_nn(z80t);
58extern z80t z80op_ex_isp_hl(z80t);
59extern z80t z80op_call_po_nn(z80t);
60extern z80t z80op_push_hl(z80t);
61extern z80t z80op_and_n(z80t);
62extern z80t z80op_rst_20(z80t);
63extern z80t z80op_ret_pe(z80t);
64extern z80t z80op_jp_hl(z80t);
65extern z80t z80op_jp_pe_nn(z80t);
66extern z80t z80op_ex_de_hl(z80t);
67extern z80t z80op_call_pe_nn(z80t);
68extern z80t z80op_special_ed(z80t);
69extern z80t z80op_xor_n(z80t);
70extern z80t z80op_rst_28(z80t);
71
72extern z80t z80op_ret_p(z80t);
73extern z80t z80op_pop_af(z80t);
74extern z80t z80op_jp_p_nn(z80t);
75extern z80t z80op_di(z80t);
76extern z80t z80op_call_p_nn(z80t);
77extern z80t z80op_push_af(z80t);
78extern z80t z80op_or_n(z80t);
79extern z80t z80op_rst_30(z80t);
80extern z80t z80op_ret_m(z80t);
81extern z80t z80op_ld_sp_hl(z80t);
82extern z80t z80op_jp_m_nn(z80t);
83extern z80t z80op_ei(z80t);
84extern z80t z80op_call_m_nn(z80t);
85extern z80t z80op_special_fd(z80t);
86extern z80t z80op_cp_n(z80t);
87extern z80t z80op_rst_38(z80t);
88
89/* IX */
90
91extern z80t z80op_pop_ix(z80t);
92extern z80t z80op_push_ix(z80t);
93
94extern z80t z80op_jp_ix(z80t);
95extern z80t z80op_ld_sp_ix(z80t);
96extern z80t z80op_ex_isp_ix(z80t);
97
98/* IY */
99
100extern z80t z80op_pop_iy(z80t);
101extern z80t z80op_push_iy(z80t);
102
103extern z80t z80op_jp_iy(z80t);
104extern z80t z80op_ld_sp_iy(z80t);
105extern 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21/* IX */
22
23POP_RR(ix, IX, 2)
24PUSH_RR(ix, IX, 2)
25
26JP_RR(ix, IX)
27LD_SP_RR(ix, IX)
28EX_ISP_RR(ix, IX)
29
30
31/* IY */
32
33POP_RR(iy, IY, 2)
34PUSH_RR(iy, IY, 2)
35
36JP_RR(iy, IY)
37LD_SP_RR(iy, IY)
38EX_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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef NO_OPDEF
22#include "z80_def.h"
23#include "z80_op5.h"
24#endif
25
26OPDEF(ill_ed, 0x00)
27{
28#ifdef DEBUG_Z80
29 printf("ILL_ED: %04X - %02X\n", (dbyte) (PC-1), DANM(mem)[(dbyte) (PC-1)]);
30#endif
31
32 ENTIME(8);
33}
34
35#define IN_R_IC(rn, r, n) \
36OPDEF(in_ ## rn ## _ic, 0x40+8*n) \
37{ \
38 register byte res, flag; \
39 IN(RB, RC, res); \
40 r = res; \
41 flag = (RF & ~(ABUTCF)) | \
42 TAB(orf_tbl)[res]; \
43 RF = flag; \
44 ENTIME(12); \
45}
46
47IN_R_IC(b, RB, 0)
48IN_R_IC(c, RC, 1)
49IN_R_IC(d, RD, 2)
50IN_R_IC(e, RE, 3)
51IN_R_IC(h, RH, 4)
52IN_R_IC(l, RL, 5)
53IN_R_IC(f, res, 6)
54IN_R_IC(a, RA, 7)
55
56
57#define OUT_IC_R(rn, r, n) \
58OPDEF(out_ic_ ## rn, 0x41+8*n) \
59{ \
60 OUT(RB, RC, r); \
61 ENTIME(12); \
62}
63
64OUT_IC_R(b, RB, 0)
65OUT_IC_R(c, RC, 1)
66OUT_IC_R(d, RD, 2)
67OUT_IC_R(e, RE, 3)
68OUT_IC_R(h, RH, 4)
69OUT_IC_R(l, RL, 5)
70OUT_IC_R(0, 0, 6)
71OUT_IC_R(a, RA, 7)
72
73
74
75#define SBC_HL_RR(rrn, rr, n) \
76OPDEF(sbc_hl_ ## rrn, 0x42+0x10*n) \
77{ \
78 register dbyte res; \
79 register int idx, flag; \
80 flag = RF; \
81 res = HL - rr - (flag & CF); \
82 idx = DIDXCALC(HL, rr, res); \
83 HL = res; \
84 flag = (RF & ~(ALLF)) | \
85 (TAB(subf_tbl)[idx] & ALLF); \
86 if(!res) flag |= ZF; \
87 RF = flag; \
88 ENTIME(15); \
89}
90
91SBC_HL_RR(bc, BC, 0)
92SBC_HL_RR(de, DE, 1)
93SBC_HL_RR(hl, HL, 2)
94SBC_HL_RR(sp, SP, 3)
95
96#define ADC_HL_RR(rrn, rr, n) \
97OPDEF(adc_hl_ ## rrn, 0x4A+0x10*n) \
98{ \
99 register dbyte res; \
100 register int idx, flag; \
101 flag = RF; \
102 res = HL + rr + (flag & CF); \
103 idx = DIDXCALC(HL, rr, res); \
104 HL = res; \
105 flag = (RF & ~(ALLF)) | \
106 (TAB(addf_tbl)[idx] & ALLF); \
107 if(!res) flag |= ZF; \
108 RF = flag; \
109 ENTIME(15); \
110}
111
112ADC_HL_RR(bc, BC, 0)
113ADC_HL_RR(de, DE, 1)
114ADC_HL_RR(hl, HL, 2)
115ADC_HL_RR(sp, SP, 3)
116
117
118
119#define LD_INN_RR(rrn, pf, rr, n) \
120OPDEF(ld_inn_ ## rrn ## pf, 0x43+0x10*n) \
121{ \
122 register dbyte dtmp; \
123 FETCHD(dtmp); \
124 DWRITE(dtmp, rr); \
125 ENTIME(20); \
126}
127
128
129LD_INN_RR(bc, , BC, 0)
130LD_INN_RR(de, , DE, 1)
131LD_INN_RR(hl, _ed, HL, 2)
132LD_INN_RR(sp, , SP, 3)
133
134
135#define LD_RR_INN(rrn, pf, rr, n) \
136OPDEF(ld_## rrn ## _inn ## pf, 0x4B+0x10*n) \
137{ \
138 register dbyte dtmp; \
139 FETCHD(dtmp); \
140 rr = DREAD(dtmp); \
141 ENTIME(20); \
142}
143
144
145LD_RR_INN(bc, , BC, 0)
146LD_RR_INN(de, , DE, 1)
147LD_RR_INN(hl, _ed, HL, 2)
148LD_RR_INN(sp, , SP, 3)
149
150OPDEF(neg, 0x44 0x4C 0x54 0x5C 0x64 0x6C 0x74 0x7C)
151{
152 register byte res;
153 register int idx;
154 register int flag;
155
156 res = 0 - RA;
157 idx = IDXCALC(0, RA, res);
158 RA = res;
159 flag = (RF & ~(AALLF)) | TAB(subf_tbl)[idx];
160 if(!res) flag |= ZF;
161 RF = flag;
162 ENTIME(8);
163}
164
165OPDEF(retn, 0x45 0x55 0x5D 0x65 0x6D 0x75 0x7D)
166{
167 DANM(iff1) = DANM(iff2);
168 POP(PC);
169 ENTIME(14);
170}
171
172
173OPDEF(reti, 0x4D)
174{
175 POP(PC);
176 ENTIME(14);
177}
178
179OPDEF(im_0, 0x46 0x4E 0x56 0x5E)
180{
181 DANM(it_mode) = 0;
182 ENTIME(8);
183}
184
185
186OPDEF(im_1, 0x56 0x76)
187{
188 DANM(it_mode) = 1;
189 ENTIME(8);
190}
191
192
193OPDEF(im_2, 0x5E 0x7E)
194{
195 DANM(it_mode) = 2;
196 ENTIME(8);
197}
198
199OPDEF(ld_i_a, 0x47)
200{
201 RI = RA;
202 ENTIME(9);
203}
204
205OPDEF(ld_r_a, 0x4F)
206{
207 DANM(rl7) = RA & 0x80;
208 RR = RA;
209 ENTIME(9);
210}
211
212OPDEF(ld_a_i, 0x57)
213{
214 register int flag;
215
216 RA = RI;
217 flag = (RF & ~(BUTCF)) | (RA & SF);
218 if(!RA) flag |= ZF;
219 if(DANM(iff2)) flag |= PVF;
220 RF = flag;
221
222 ENTIME(9);
223}
224
225OPDEF(ld_a_r, 0x5F)
226{
227 register int flag;
228
229 RA = (RR & 0x7F) | DANM(rl7);
230 flag = (RF & ~(BUTCF)) | (RA & SF);
231 if(!RA) flag |= ZF;
232 if(DANM(iff2)) flag |= PVF;
233 RF = flag;
234
235 ENTIME(9);
236}
237
238OPDEF(rrd, 0x67)
239{
240 register dbyte dtmp;
241
242 dtmp = *HLP | (RA << 8);
243 RA = (RA & 0xF0) | (dtmp & 0x0F);
244 SETFLAGS(ABUTCF, TAB(orf_tbl)[RA]);
245 dtmp >>= 4;
246 PUTMEM(HL, HLP, (byte) dtmp);
247
248 ENTIME(18);
249}
250
251OPDEF(rld, 0x6F)
252{
253 register dbyte dtmp;
254
255 dtmp = (*HLP << 4) | (RA & 0x0F);
256 RA = (RA & 0xF0) | ((dtmp >> 8) & 0x0F);
257 SETFLAGS(ABUTCF, TAB(orf_tbl)[RA]);
258 PUTMEM(HL, HLP, (byte) dtmp);
259
260 ENTIME(18);
261}
262
263#define NOREPEAT() \
264 if(BC) RF |= PVF; \
265 ENTIME(16)
266
267#define LDREPEAT() \
268 if(BC) { \
269 RF |= PVF; \
270 PC-=2; \
271 ENTIME(21); \
272 } \
273 else { \
274 ENTIME(16); \
275 }
276
277
278#define LDID(dir) \
279 register byte res; \
280 res = *HLP; \
281 PUTMEM(DE, DEP, res); \
282 DE dir, HL dir; \
283 RF = RF & ~(HF | PVF | NF); \
284 BC--
285
286OPDEF(ldi, 0xA0)
287{
288 LDID(++);
289 NOREPEAT();
290}
291
292OPDEF(ldd, 0xA8)
293{
294 LDID(--);
295 NOREPEAT();
296}
297
298OPDEF(ldir, 0xB0)
299{
300 LDID(++);
301 LDREPEAT();
302}
303
304
305OPDEF(lddr, 0xB8)
306{
307 LDID(--);
308 LDREPEAT();
309}
310
311#define CPREPEAT() \
312 if(res && BC) { \
313 RF |= PVF; \
314 PC-=2; \
315 ENTIME(21); \
316 } \
317 else { \
318 ENTIME(16); \
319 }
320
321#define CPID(dir) \
322 register byte res; \
323 register int idx; \
324 res = RA - *HLP; \
325 idx = IDXCALC(RA, *HLP, res); \
326 RF = (RF & ~BUTCF) | \
327 (TAB(subf_tbl)[idx] & \
328 (SF | HF | NF | B3F | B5F)); \
329 if(!res) RF |= ZF; \
330 HL dir; \
331 BC--
332
333
334OPDEF(cpi, 0xA1)
335{
336 CPID(++);
337 NOREPEAT();
338}
339
340
341OPDEF(cpd, 0xA9)
342{
343 CPID(--);
344 NOREPEAT();
345}
346
347
348OPDEF(cpir, 0xB1)
349{
350 CPID(++);
351 CPREPEAT();
352}
353
354OPDEF(cpdr, 0xB9)
355{
356 CPID(--);
357 CPREPEAT();
358}
359
360#define IOREPEAT() \
361 if(RB) { \
362 PC-=2; \
363 ENTIME(21); \
364 } \
365 else { \
366 ENTIME(16); \
367 }
368
369
370#define INID(dir) \
371 register byte res; \
372 register int idx; \
373 res = RB - 1; \
374 idx = IDXCALC(RB, 1, res); \
375 RF = (RF & ~BUTCF) | \
376 (TAB(subf_tbl)[idx] & \
377 (SF | HF | PVF | NF | B3F | B5F)); \
378 if(!res) RF |= ZF; \
379 RB = res; \
380 IN(RB, RC, res); \
381 PUTMEM(HL, HLP, res); \
382 HL dir
383
384
385OPDEF(ini, 0xA2)
386{
387 INID(++);
388 ENTIME(16);
389}
390
391OPDEF(ind, 0xAA)
392{
393 INID(--);
394 ENTIME(16);
395}
396
397OPDEF(inir, 0xB2)
398{
399 INID(++);
400 IOREPEAT();
401}
402
403OPDEF(indr, 0xBA)
404{
405 INID(--);
406 IOREPEAT();
407}
408
409
410
411#define OUTID(dir) \
412 register byte res; \
413 register int idx; \
414 res = RB - 1; \
415 idx = IDXCALC(RB, 1, res); \
416 RF = (RF & ~BUTCF) | \
417 (TAB(subf_tbl)[idx] & \
418 (SF | HF | PVF | NF )); \
419 if(!res) RF |= ZF; \
420 RB = res; \
421 OUT(RB, RC, *HLP); \
422 HL dir
423
424
425
426OPDEF(outi, 0xA3)
427{
428 OUTID(++);
429 ENTIME(16);
430}
431
432OPDEF(outd, 0xAB)
433{
434 OUTID(--);
435 ENTIME(16);
436}
437
438
439OPDEF(otir, 0xB3)
440{
441 OUTID(++);
442 IOREPEAT();
443}
444
445OPDEF(otdr, 0xBB)
446{
447 OUTID(--);
448 IOREPEAT();
449}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21extern z80t z80op_ill_ed(z80t);
22
23extern z80t z80op_in_b_ic(z80t);
24extern z80t z80op_out_ic_b(z80t);
25extern z80t z80op_sbc_hl_bc(z80t);
26extern z80t z80op_ld_inn_bc(z80t);
27extern z80t z80op_neg(z80t);
28extern z80t z80op_retn(z80t);
29extern z80t z80op_im_0(z80t);
30extern z80t z80op_ld_i_a(z80t);
31extern z80t z80op_in_c_ic(z80t);
32extern z80t z80op_out_ic_c(z80t);
33extern z80t z80op_adc_hl_bc(z80t);
34extern z80t z80op_ld_bc_inn(z80t);
35/* extern z80t z80op_neg(z80t); */
36extern z80t z80op_reti(z80t);
37/*extern z80t z80op_im_0(z80t); */
38extern z80t z80op_ld_r_a(z80t);
39
40extern z80t z80op_in_d_ic(z80t);
41extern z80t z80op_out_ic_d(z80t);
42extern z80t z80op_sbc_hl_de(z80t);
43extern z80t z80op_ld_inn_de(z80t);
44/* extern z80t z80op_neg(z80t); */
45/* extern z80t z80op_retn(z80t); */
46extern z80t z80op_im_1(z80t);
47extern z80t z80op_ld_a_i(z80t);
48extern z80t z80op_in_e_ic(z80t);
49extern z80t z80op_out_ic_e(z80t);
50extern z80t z80op_adc_hl_de(z80t);
51extern z80t z80op_ld_de_inn(z80t);
52/* extern z80t z80op_neg(z80t); */
53/* extern z80t z80op_retn(z80t); */
54extern z80t z80op_im_2(z80t);
55extern z80t z80op_ld_a_r(z80t);
56
57extern z80t z80op_in_h_ic(z80t);
58extern z80t z80op_out_ic_h(z80t);
59extern z80t z80op_sbc_hl_hl(z80t);
60extern z80t z80op_ld_inn_hl_ed(z80t);
61/* extern z80t z80op_neg(z80t); */
62/* extern z80t z80op_retn(z80t); */
63/* extern z80t z80op_im_0(z80t); */
64extern z80t z80op_rrd(z80t);
65extern z80t z80op_in_l_ic(z80t);
66extern z80t z80op_out_ic_l(z80t);
67extern z80t z80op_adc_hl_hl(z80t);
68extern z80t z80op_ld_hl_inn_ed(z80t);
69/* extern z80t z80op_neg(z80t); */
70/* extern z80t z80op_retn(z80t); */
71/* extern z80t z80op_im_0(z80t); */
72extern z80t z80op_rld(z80t);
73
74extern z80t z80op_in_f_ic(z80t);
75extern z80t z80op_out_ic_0(z80t);
76extern z80t z80op_sbc_hl_sp(z80t);
77extern z80t z80op_ld_inn_sp(z80t);
78/* extern z80t z80op_neg(z80t); */
79/* extern z80t z80op_retn(z80t); */
80/* extern z80t z80op_im_1(z80t); */
81/* extern z80t z80op_ill_ed(z80t); */
82extern z80t z80op_in_a_ic(z80t);
83extern z80t z80op_out_ic_a(z80t);
84extern z80t z80op_adc_hl_sp(z80t);
85extern z80t z80op_ld_sp_inn(z80t);
86/* extern z80t z80op_neg(z80t); */
87/* extern z80t z80op_retn(z80t); */
88/* extern z80t z80op_im_2(z80t); */
89/* extern z80t z80op_ill_ed(z80t); */
90
91extern z80t z80op_ldi(z80t);
92extern z80t z80op_cpi(z80t);
93extern z80t z80op_ini(z80t);
94extern z80t z80op_outi(z80t);
95
96extern z80t z80op_ldd(z80t);
97extern z80t z80op_cpd(z80t);
98extern z80t z80op_ind(z80t);
99extern z80t z80op_outd(z80t);
100
101extern z80t z80op_ldir(z80t);
102extern z80t z80op_cpir(z80t);
103extern z80t z80op_inir(z80t);
104extern z80t z80op_otir(z80t);
105
106extern z80t z80op_lddr(z80t);
107extern z80t z80op_cpdr(z80t);
108extern z80t z80op_indr(z80t);
109extern 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef NO_OPDEF
22#include "z80_def.h"
23#include "z80_op6.h"
24#endif
25
26#define GHL DANM(cbaddr)
27
28#define B7(r) (((r) & 0x80) >> 7)
29#define B0(r) ((r) & 0x01)
30
31#define SHIFTROTL(r, mod) \
32{ \
33 register int carry; \
34 carry = B7(r); \
35 r = mod; \
36 RF = (RF & ~(AALLF)) | carry | \
37 TAB(orf_tbl)[(byte) r]; \
38}
39
40
41#define SHIFTROTR(r, mod) \
42{ \
43 register int carry; \
44 carry = B0(r); \
45 r = mod; \
46 RF = (RF & ~(AALLF)) | carry | \
47 TAB(orf_tbl)[(byte) r]; \
48}
49
50
51#define RLC(r) SHIFTROTL(r, (r << 1) | carry)
52#define RRC(r) SHIFTROTR(r, (r >> 1) | (carry << 7))
53#define RLN(r) SHIFTROTL(r, (r << 1) | (RF & CF))
54#define RRN(r) SHIFTROTR(r, (r >> 1) | ((RF & CF) << 7))
55#define SLA(r) SHIFTROTL(r, r << 1)
56#define SRA(r) SHIFTROTR(r, (byte) ((sbyte) r >> 1))
57#define SLL(r) SHIFTROTL(r, (r << 1) | 0x01)
58#define SRL(r) SHIFTROTR(r, r >> 1)
59
60
61#define SHRR(shrn, func, an, rn, r, n) \
62OPDEF(shrn ## _ ## rn, 0x00+an*8+n) \
63{ \
64 func(r); \
65 ENTIME(8); \
66}
67
68#define SHRIHL(shrn, func, an) \
69OPDEF(shrn ## _ihl, 0x06+an*8) \
70{ \
71 register byte btmp; \
72 btmp = READ(GHL); \
73 func(btmp); \
74 WRITE(GHL, btmp); \
75 ENTIME(15); \
76}
77
78#define RLC_R(rn, r, n) SHRR(rlc, RLC, 0, rn, r, n)
79#define RRC_R(rn, r, n) SHRR(rrc, RRC, 1, rn, r, n)
80#define RL_R(rn, r, n) SHRR(rl, RLN, 2, rn, r, n)
81#define RR_R(rn, r, n) SHRR(rr, RRN, 3, rn, r, n)
82#define SLA_R(rn, r, n) SHRR(sla, SLA, 4, rn, r, n)
83#define SRA_R(rn, r, n) SHRR(sra, SRA, 5, rn, r, n)
84#define SLL_R(rn, r, n) SHRR(sll, SLL, 6, rn, r, n)
85#define SRL_R(rn, r, n) SHRR(srl, SRL, 7, rn, r, n)
86
87RLC_R(b, RB, 0)
88RLC_R(c, RC, 1)
89RLC_R(d, RD, 2)
90RLC_R(e, RE, 3)
91RLC_R(h, RH, 4)
92RLC_R(l, RL, 5)
93RLC_R(a, RA, 7)
94
95RRC_R(b, RB, 0)
96RRC_R(c, RC, 1)
97RRC_R(d, RD, 2)
98RRC_R(e, RE, 3)
99RRC_R(h, RH, 4)
100RRC_R(l, RL, 5)
101RRC_R(a, RA, 7)
102
103RL_R(b, RB, 0)
104RL_R(c, RC, 1)
105RL_R(d, RD, 2)
106RL_R(e, RE, 3)
107RL_R(h, RH, 4)
108RL_R(l, RL, 5)
109RL_R(a, RA, 7)
110
111RR_R(b, RB, 0)
112RR_R(c, RC, 1)
113RR_R(d, RD, 2)
114RR_R(e, RE, 3)
115RR_R(h, RH, 4)
116RR_R(l, RL, 5)
117RR_R(a, RA, 7)
118
119SLA_R(b, RB, 0)
120SLA_R(c, RC, 1)
121SLA_R(d, RD, 2)
122SLA_R(e, RE, 3)
123SLA_R(h, RH, 4)
124SLA_R(l, RL, 5)
125SLA_R(a, RA, 7)
126
127SRA_R(b, RB, 0)
128SRA_R(c, RC, 1)
129SRA_R(d, RD, 2)
130SRA_R(e, RE, 3)
131SRA_R(h, RH, 4)
132SRA_R(l, RL, 5)
133SRA_R(a, RA, 7)
134
135SLL_R(b, RB, 0)
136SLL_R(c, RC, 1)
137SLL_R(d, RD, 2)
138SLL_R(e, RE, 3)
139SLL_R(h, RH, 4)
140SLL_R(l, RL, 5)
141SLL_R(a, RA, 7)
142
143SRL_R(b, RB, 0)
144SRL_R(c, RC, 1)
145SRL_R(d, RD, 2)
146SRL_R(e, RE, 3)
147SRL_R(h, RH, 4)
148SRL_R(l, RL, 5)
149SRL_R(a, RA, 7)
150
151SHRIHL(rlc, RLC, 0)
152SHRIHL(rrc, RRC, 1)
153SHRIHL(rl, RLN, 2)
154SHRIHL(rr, RRN, 3)
155SHRIHL(sla, SLA, 4)
156SHRIHL(sra, SRA, 5)
157SHRIHL(sll, SLL, 6)
158SHRIHL(srl, SRL, 7)
159
160#define BIT(r, n) \
161 RF = (RF & ~(SF | ZF | NF)) | (r & SF) | (((~r >> n) & 0x01) << 6)
162
163#define BIT_N_R(bn, rn, r, n) \
164OPDEF(bit_ ## bn ## _ ## rn, 0x40+bn*8+n) \
165{ \
166 BIT(r, bn); \
167 ENTIME(8); \
168}
169
170#define BIT_N_IHL(bn) \
171OPDEF(bit_ ## bn ## _ihl, 0x46+bn*8) \
172{ \
173 register byte btmp; \
174 btmp = READ(GHL); \
175 BIT(btmp, bn); \
176 ENTIME(12); \
177}
178
179BIT_N_R(0, b, RB, 0)
180BIT_N_R(0, c, RC, 1)
181BIT_N_R(0, d, RD, 2)
182BIT_N_R(0, e, RE, 3)
183BIT_N_R(0, h, RH, 4)
184BIT_N_R(0, l, RL, 5)
185BIT_N_R(0, a, RA, 7)
186
187BIT_N_R(1, b, RB, 0)
188BIT_N_R(1, c, RC, 1)
189BIT_N_R(1, d, RD, 2)
190BIT_N_R(1, e, RE, 3)
191BIT_N_R(1, h, RH, 4)
192BIT_N_R(1, l, RL, 5)
193BIT_N_R(1, a, RA, 7)
194
195BIT_N_R(2, b, RB, 0)
196BIT_N_R(2, c, RC, 1)
197BIT_N_R(2, d, RD, 2)
198BIT_N_R(2, e, RE, 3)
199BIT_N_R(2, h, RH, 4)
200BIT_N_R(2, l, RL, 5)
201BIT_N_R(2, a, RA, 7)
202
203BIT_N_R(3, b, RB, 0)
204BIT_N_R(3, c, RC, 1)
205BIT_N_R(3, d, RD, 2)
206BIT_N_R(3, e, RE, 3)
207BIT_N_R(3, h, RH, 4)
208BIT_N_R(3, l, RL, 5)
209BIT_N_R(3, a, RA, 7)
210
211BIT_N_R(4, b, RB, 0)
212BIT_N_R(4, c, RC, 1)
213BIT_N_R(4, d, RD, 2)
214BIT_N_R(4, e, RE, 3)
215BIT_N_R(4, h, RH, 4)
216BIT_N_R(4, l, RL, 5)
217BIT_N_R(4, a, RA, 7)
218
219BIT_N_R(5, b, RB, 0)
220BIT_N_R(5, c, RC, 1)
221BIT_N_R(5, d, RD, 2)
222BIT_N_R(5, e, RE, 3)
223BIT_N_R(5, h, RH, 4)
224BIT_N_R(5, l, RL, 5)
225BIT_N_R(5, a, RA, 7)
226
227BIT_N_R(6, b, RB, 0)
228BIT_N_R(6, c, RC, 1)
229BIT_N_R(6, d, RD, 2)
230BIT_N_R(6, e, RE, 3)
231BIT_N_R(6, h, RH, 4)
232BIT_N_R(6, l, RL, 5)
233BIT_N_R(6, a, RA, 7)
234
235BIT_N_R(7, b, RB, 0)
236BIT_N_R(7, c, RC, 1)
237BIT_N_R(7, d, RD, 2)
238BIT_N_R(7, e, RE, 3)
239BIT_N_R(7, h, RH, 4)
240BIT_N_R(7, l, RL, 5)
241BIT_N_R(7, a, RA, 7)
242
243BIT_N_IHL(0)
244BIT_N_IHL(1)
245BIT_N_IHL(2)
246BIT_N_IHL(3)
247BIT_N_IHL(4)
248BIT_N_IHL(5)
249BIT_N_IHL(6)
250BIT_N_IHL(7)
251
252#define RES(r, n) r &= ~(1 << n)
253
254#define RES_N_R(bn, rn, r, n) \
255OPDEF(res_ ## bn ## _ ## rn, 0x80+bn*8+n) \
256{ \
257 RES(r, bn); \
258 ENTIME(8); \
259}
260
261#define RES_N_IHL(bn) \
262OPDEF(res_ ## bn ## _ihl, 0x86+bn*8) \
263{ \
264 register byte btmp; \
265 btmp = READ(GHL); \
266 RES(btmp, bn); \
267 WRITE(GHL, btmp); \
268 ENTIME(15); \
269}
270
271
272RES_N_R(0, b, RB, 0)
273RES_N_R(0, c, RC, 1)
274RES_N_R(0, d, RD, 2)
275RES_N_R(0, e, RE, 3)
276RES_N_R(0, h, RH, 4)
277RES_N_R(0, l, RL, 5)
278RES_N_R(0, a, RA, 7)
279
280RES_N_R(1, b, RB, 0)
281RES_N_R(1, c, RC, 1)
282RES_N_R(1, d, RD, 2)
283RES_N_R(1, e, RE, 3)
284RES_N_R(1, h, RH, 4)
285RES_N_R(1, l, RL, 5)
286RES_N_R(1, a, RA, 7)
287
288RES_N_R(2, b, RB, 0)
289RES_N_R(2, c, RC, 1)
290RES_N_R(2, d, RD, 2)
291RES_N_R(2, e, RE, 3)
292RES_N_R(2, h, RH, 4)
293RES_N_R(2, l, RL, 5)
294RES_N_R(2, a, RA, 7)
295
296RES_N_R(3, b, RB, 0)
297RES_N_R(3, c, RC, 1)
298RES_N_R(3, d, RD, 2)
299RES_N_R(3, e, RE, 3)
300RES_N_R(3, h, RH, 4)
301RES_N_R(3, l, RL, 5)
302RES_N_R(3, a, RA, 7)
303
304RES_N_R(4, b, RB, 0)
305RES_N_R(4, c, RC, 1)
306RES_N_R(4, d, RD, 2)
307RES_N_R(4, e, RE, 3)
308RES_N_R(4, h, RH, 4)
309RES_N_R(4, l, RL, 5)
310RES_N_R(4, a, RA, 7)
311
312RES_N_R(5, b, RB, 0)
313RES_N_R(5, c, RC, 1)
314RES_N_R(5, d, RD, 2)
315RES_N_R(5, e, RE, 3)
316RES_N_R(5, h, RH, 4)
317RES_N_R(5, l, RL, 5)
318RES_N_R(5, a, RA, 7)
319
320RES_N_R(6, b, RB, 0)
321RES_N_R(6, c, RC, 1)
322RES_N_R(6, d, RD, 2)
323RES_N_R(6, e, RE, 3)
324RES_N_R(6, h, RH, 4)
325RES_N_R(6, l, RL, 5)
326RES_N_R(6, a, RA, 7)
327
328RES_N_R(7, b, RB, 0)
329RES_N_R(7, c, RC, 1)
330RES_N_R(7, d, RD, 2)
331RES_N_R(7, e, RE, 3)
332RES_N_R(7, h, RH, 4)
333RES_N_R(7, l, RL, 5)
334RES_N_R(7, a, RA, 7)
335
336RES_N_IHL(0)
337RES_N_IHL(1)
338RES_N_IHL(2)
339RES_N_IHL(3)
340RES_N_IHL(4)
341RES_N_IHL(5)
342RES_N_IHL(6)
343RES_N_IHL(7)
344
345
346#define SET(r, n) r |= (1 << n)
347
348#define SET_N_R(bn, rn, r, n) \
349OPDEF(set_ ## bn ## _ ## rn, 0xC0+bn*8+n) \
350{ \
351 SET(r, bn); \
352 ENTIME(8); \
353}
354
355#define SET_N_IHL(bn) \
356OPDEF(set_ ## bn ## _ihl, 0x86+bn*8) \
357{ \
358 register byte btmp; \
359 btmp = READ(GHL); \
360 SET(btmp, bn); \
361 WRITE(GHL, btmp); \
362 ENTIME(15); \
363}
364
365
366SET_N_R(0, b, RB, 0)
367SET_N_R(0, c, RC, 1)
368SET_N_R(0, d, RD, 2)
369SET_N_R(0, e, RE, 3)
370SET_N_R(0, h, RH, 4)
371SET_N_R(0, l, RL, 5)
372SET_N_R(0, a, RA, 7)
373
374SET_N_R(1, b, RB, 0)
375SET_N_R(1, c, RC, 1)
376SET_N_R(1, d, RD, 2)
377SET_N_R(1, e, RE, 3)
378SET_N_R(1, h, RH, 4)
379SET_N_R(1, l, RL, 5)
380SET_N_R(1, a, RA, 7)
381
382SET_N_R(2, b, RB, 0)
383SET_N_R(2, c, RC, 1)
384SET_N_R(2, d, RD, 2)
385SET_N_R(2, e, RE, 3)
386SET_N_R(2, h, RH, 4)
387SET_N_R(2, l, RL, 5)
388SET_N_R(2, a, RA, 7)
389
390SET_N_R(3, b, RB, 0)
391SET_N_R(3, c, RC, 1)
392SET_N_R(3, d, RD, 2)
393SET_N_R(3, e, RE, 3)
394SET_N_R(3, h, RH, 4)
395SET_N_R(3, l, RL, 5)
396SET_N_R(3, a, RA, 7)
397
398SET_N_R(4, b, RB, 0)
399SET_N_R(4, c, RC, 1)
400SET_N_R(4, d, RD, 2)
401SET_N_R(4, e, RE, 3)
402SET_N_R(4, h, RH, 4)
403SET_N_R(4, l, RL, 5)
404SET_N_R(4, a, RA, 7)
405
406SET_N_R(5, b, RB, 0)
407SET_N_R(5, c, RC, 1)
408SET_N_R(5, d, RD, 2)
409SET_N_R(5, e, RE, 3)
410SET_N_R(5, h, RH, 4)
411SET_N_R(5, l, RL, 5)
412SET_N_R(5, a, RA, 7)
413
414SET_N_R(6, b, RB, 0)
415SET_N_R(6, c, RC, 1)
416SET_N_R(6, d, RD, 2)
417SET_N_R(6, e, RE, 3)
418SET_N_R(6, h, RH, 4)
419SET_N_R(6, l, RL, 5)
420SET_N_R(6, a, RA, 7)
421
422SET_N_R(7, b, RB, 0)
423SET_N_R(7, c, RC, 1)
424SET_N_R(7, d, RD, 2)
425SET_N_R(7, e, RE, 3)
426SET_N_R(7, h, RH, 4)
427SET_N_R(7, l, RL, 5)
428SET_N_R(7, a, RA, 7)
429
430SET_N_IHL(0)
431SET_N_IHL(1)
432SET_N_IHL(2)
433SET_N_IHL(3)
434SET_N_IHL(4)
435SET_N_IHL(5)
436SET_N_IHL(6)
437SET_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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21extern z80t z80op_rlc_b(z80t);
22extern z80t z80op_rlc_c(z80t);
23extern z80t z80op_rlc_d(z80t);
24extern z80t z80op_rlc_e(z80t);
25extern z80t z80op_rlc_h(z80t);
26extern z80t z80op_rlc_l(z80t);
27extern z80t z80op_rlc_ihl(z80t);
28extern z80t z80op_rlc_a(z80t);
29extern z80t z80op_rrc_b(z80t);
30extern z80t z80op_rrc_c(z80t);
31extern z80t z80op_rrc_d(z80t);
32extern z80t z80op_rrc_e(z80t);
33extern z80t z80op_rrc_h(z80t);
34extern z80t z80op_rrc_l(z80t);
35extern z80t z80op_rrc_ihl(z80t);
36extern z80t z80op_rrc_a(z80t);
37
38extern z80t z80op_rl_b(z80t);
39extern z80t z80op_rl_c(z80t);
40extern z80t z80op_rl_d(z80t);
41extern z80t z80op_rl_e(z80t);
42extern z80t z80op_rl_h(z80t);
43extern z80t z80op_rl_l(z80t);
44extern z80t z80op_rl_ihl(z80t);
45extern z80t z80op_rl_a(z80t);
46extern z80t z80op_rr_b(z80t);
47extern z80t z80op_rr_c(z80t);
48extern z80t z80op_rr_d(z80t);
49extern z80t z80op_rr_e(z80t);
50extern z80t z80op_rr_h(z80t);
51extern z80t z80op_rr_l(z80t);
52extern z80t z80op_rr_ihl(z80t);
53extern z80t z80op_rr_a(z80t);
54
55extern z80t z80op_sla_b(z80t);
56extern z80t z80op_sla_c(z80t);
57extern z80t z80op_sla_d(z80t);
58extern z80t z80op_sla_e(z80t);
59extern z80t z80op_sla_h(z80t);
60extern z80t z80op_sla_l(z80t);
61extern z80t z80op_sla_ihl(z80t);
62extern z80t z80op_sla_a(z80t);
63extern z80t z80op_sra_b(z80t);
64extern z80t z80op_sra_c(z80t);
65extern z80t z80op_sra_d(z80t);
66extern z80t z80op_sra_e(z80t);
67extern z80t z80op_sra_h(z80t);
68extern z80t z80op_sra_l(z80t);
69extern z80t z80op_sra_ihl(z80t);
70extern z80t z80op_sra_a(z80t);
71
72extern z80t z80op_sll_b(z80t);
73extern z80t z80op_sll_c(z80t);
74extern z80t z80op_sll_d(z80t);
75extern z80t z80op_sll_e(z80t);
76extern z80t z80op_sll_h(z80t);
77extern z80t z80op_sll_l(z80t);
78extern z80t z80op_sll_ihl(z80t);
79extern z80t z80op_sll_a(z80t);
80extern z80t z80op_srl_b(z80t);
81extern z80t z80op_srl_c(z80t);
82extern z80t z80op_srl_d(z80t);
83extern z80t z80op_srl_e(z80t);
84extern z80t z80op_srl_h(z80t);
85extern z80t z80op_srl_l(z80t);
86extern z80t z80op_srl_ihl(z80t);
87extern z80t z80op_srl_a(z80t);
88
89extern z80t z80op_bit_0_b(z80t);
90extern z80t z80op_bit_0_c(z80t);
91extern z80t z80op_bit_0_d(z80t);
92extern z80t z80op_bit_0_e(z80t);
93extern z80t z80op_bit_0_h(z80t);
94extern z80t z80op_bit_0_l(z80t);
95extern z80t z80op_bit_0_ihl(z80t);
96extern z80t z80op_bit_0_a(z80t);
97extern z80t z80op_bit_1_b(z80t);
98extern z80t z80op_bit_1_c(z80t);
99extern z80t z80op_bit_1_d(z80t);
100extern z80t z80op_bit_1_e(z80t);
101extern z80t z80op_bit_1_h(z80t);
102extern z80t z80op_bit_1_l(z80t);
103extern z80t z80op_bit_1_ihl(z80t);
104extern z80t z80op_bit_1_a(z80t);
105
106extern z80t z80op_bit_2_b(z80t);
107extern z80t z80op_bit_2_c(z80t);
108extern z80t z80op_bit_2_d(z80t);
109extern z80t z80op_bit_2_e(z80t);
110extern z80t z80op_bit_2_h(z80t);
111extern z80t z80op_bit_2_l(z80t);
112extern z80t z80op_bit_2_ihl(z80t);
113extern z80t z80op_bit_2_a(z80t);
114extern z80t z80op_bit_3_b(z80t);
115extern z80t z80op_bit_3_c(z80t);
116extern z80t z80op_bit_3_d(z80t);
117extern z80t z80op_bit_3_e(z80t);
118extern z80t z80op_bit_3_h(z80t);
119extern z80t z80op_bit_3_l(z80t);
120extern z80t z80op_bit_3_ihl(z80t);
121extern z80t z80op_bit_3_a(z80t);
122
123extern z80t z80op_bit_4_b(z80t);
124extern z80t z80op_bit_4_c(z80t);
125extern z80t z80op_bit_4_d(z80t);
126extern z80t z80op_bit_4_e(z80t);
127extern z80t z80op_bit_4_h(z80t);
128extern z80t z80op_bit_4_l(z80t);
129extern z80t z80op_bit_4_ihl(z80t);
130extern z80t z80op_bit_4_a(z80t);
131extern z80t z80op_bit_5_b(z80t);
132extern z80t z80op_bit_5_c(z80t);
133extern z80t z80op_bit_5_d(z80t);
134extern z80t z80op_bit_5_e(z80t);
135extern z80t z80op_bit_5_h(z80t);
136extern z80t z80op_bit_5_l(z80t);
137extern z80t z80op_bit_5_ihl(z80t);
138extern z80t z80op_bit_5_a(z80t);
139
140extern z80t z80op_bit_6_b(z80t);
141extern z80t z80op_bit_6_c(z80t);
142extern z80t z80op_bit_6_d(z80t);
143extern z80t z80op_bit_6_e(z80t);
144extern z80t z80op_bit_6_h(z80t);
145extern z80t z80op_bit_6_l(z80t);
146extern z80t z80op_bit_6_ihl(z80t);
147extern z80t z80op_bit_6_a(z80t);
148extern z80t z80op_bit_7_b(z80t);
149extern z80t z80op_bit_7_c(z80t);
150extern z80t z80op_bit_7_d(z80t);
151extern z80t z80op_bit_7_e(z80t);
152extern z80t z80op_bit_7_h(z80t);
153extern z80t z80op_bit_7_l(z80t);
154extern z80t z80op_bit_7_ihl(z80t);
155extern z80t z80op_bit_7_a(z80t);
156
157extern z80t z80op_res_0_b(z80t);
158extern z80t z80op_res_0_c(z80t);
159extern z80t z80op_res_0_d(z80t);
160extern z80t z80op_res_0_e(z80t);
161extern z80t z80op_res_0_h(z80t);
162extern z80t z80op_res_0_l(z80t);
163extern z80t z80op_res_0_ihl(z80t);
164extern z80t z80op_res_0_a(z80t);
165extern z80t z80op_res_1_b(z80t);
166extern z80t z80op_res_1_c(z80t);
167extern z80t z80op_res_1_d(z80t);
168extern z80t z80op_res_1_e(z80t);
169extern z80t z80op_res_1_h(z80t);
170extern z80t z80op_res_1_l(z80t);
171extern z80t z80op_res_1_ihl(z80t);
172extern z80t z80op_res_1_a(z80t);
173
174extern z80t z80op_res_2_b(z80t);
175extern z80t z80op_res_2_c(z80t);
176extern z80t z80op_res_2_d(z80t);
177extern z80t z80op_res_2_e(z80t);
178extern z80t z80op_res_2_h(z80t);
179extern z80t z80op_res_2_l(z80t);
180extern z80t z80op_res_2_ihl(z80t);
181extern z80t z80op_res_2_a(z80t);
182extern z80t z80op_res_3_b(z80t);
183extern z80t z80op_res_3_c(z80t);
184extern z80t z80op_res_3_d(z80t);
185extern z80t z80op_res_3_e(z80t);
186extern z80t z80op_res_3_h(z80t);
187extern z80t z80op_res_3_l(z80t);
188extern z80t z80op_res_3_ihl(z80t);
189extern z80t z80op_res_3_a(z80t);
190
191extern z80t z80op_res_4_b(z80t);
192extern z80t z80op_res_4_c(z80t);
193extern z80t z80op_res_4_d(z80t);
194extern z80t z80op_res_4_e(z80t);
195extern z80t z80op_res_4_h(z80t);
196extern z80t z80op_res_4_l(z80t);
197extern z80t z80op_res_4_ihl(z80t);
198extern z80t z80op_res_4_a(z80t);
199extern z80t z80op_res_5_b(z80t);
200extern z80t z80op_res_5_c(z80t);
201extern z80t z80op_res_5_d(z80t);
202extern z80t z80op_res_5_e(z80t);
203extern z80t z80op_res_5_h(z80t);
204extern z80t z80op_res_5_l(z80t);
205extern z80t z80op_res_5_ihl(z80t);
206extern z80t z80op_res_5_a(z80t);
207
208extern z80t z80op_res_6_b(z80t);
209extern z80t z80op_res_6_c(z80t);
210extern z80t z80op_res_6_d(z80t);
211extern z80t z80op_res_6_e(z80t);
212extern z80t z80op_res_6_h(z80t);
213extern z80t z80op_res_6_l(z80t);
214extern z80t z80op_res_6_ihl(z80t);
215extern z80t z80op_res_6_a(z80t);
216extern z80t z80op_res_7_b(z80t);
217extern z80t z80op_res_7_c(z80t);
218extern z80t z80op_res_7_d(z80t);
219extern z80t z80op_res_7_e(z80t);
220extern z80t z80op_res_7_h(z80t);
221extern z80t z80op_res_7_l(z80t);
222extern z80t z80op_res_7_ihl(z80t);
223extern z80t z80op_res_7_a(z80t);
224
225extern z80t z80op_set_0_b(z80t);
226extern z80t z80op_set_0_c(z80t);
227extern z80t z80op_set_0_d(z80t);
228extern z80t z80op_set_0_e(z80t);
229extern z80t z80op_set_0_h(z80t);
230extern z80t z80op_set_0_l(z80t);
231extern z80t z80op_set_0_ihl(z80t);
232extern z80t z80op_set_0_a(z80t);
233extern z80t z80op_set_1_b(z80t);
234extern z80t z80op_set_1_c(z80t);
235extern z80t z80op_set_1_d(z80t);
236extern z80t z80op_set_1_e(z80t);
237extern z80t z80op_set_1_h(z80t);
238extern z80t z80op_set_1_l(z80t);
239extern z80t z80op_set_1_ihl(z80t);
240extern z80t z80op_set_1_a(z80t);
241
242extern z80t z80op_set_2_b(z80t);
243extern z80t z80op_set_2_c(z80t);
244extern z80t z80op_set_2_d(z80t);
245extern z80t z80op_set_2_e(z80t);
246extern z80t z80op_set_2_h(z80t);
247extern z80t z80op_set_2_l(z80t);
248extern z80t z80op_set_2_ihl(z80t);
249extern z80t z80op_set_2_a(z80t);
250extern z80t z80op_set_3_b(z80t);
251extern z80t z80op_set_3_c(z80t);
252extern z80t z80op_set_3_d(z80t);
253extern z80t z80op_set_3_e(z80t);
254extern z80t z80op_set_3_h(z80t);
255extern z80t z80op_set_3_l(z80t);
256extern z80t z80op_set_3_ihl(z80t);
257extern z80t z80op_set_3_a(z80t);
258
259extern z80t z80op_set_4_b(z80t);
260extern z80t z80op_set_4_c(z80t);
261extern z80t z80op_set_4_d(z80t);
262extern z80t z80op_set_4_e(z80t);
263extern z80t z80op_set_4_h(z80t);
264extern z80t z80op_set_4_l(z80t);
265extern z80t z80op_set_4_ihl(z80t);
266extern z80t z80op_set_4_a(z80t);
267extern z80t z80op_set_5_b(z80t);
268extern z80t z80op_set_5_c(z80t);
269extern z80t z80op_set_5_d(z80t);
270extern z80t z80op_set_5_e(z80t);
271extern z80t z80op_set_5_h(z80t);
272extern z80t z80op_set_5_l(z80t);
273extern z80t z80op_set_5_ihl(z80t);
274extern z80t z80op_set_5_a(z80t);
275
276extern z80t z80op_set_6_b(z80t);
277extern z80t z80op_set_6_c(z80t);
278extern z80t z80op_set_6_d(z80t);
279extern z80t z80op_set_6_e(z80t);
280extern z80t z80op_set_6_h(z80t);
281extern z80t z80op_set_6_l(z80t);
282extern z80t z80op_set_6_ihl(z80t);
283extern z80t z80op_set_6_a(z80t);
284extern z80t z80op_set_7_b(z80t);
285extern z80t z80op_set_7_c(z80t);
286extern z80t z80op_set_7_d(z80t);
287extern z80t z80op_set_7_e(z80t);
288extern z80t z80op_set_7_h(z80t);
289extern z80t z80op_set_7_l(z80t);
290extern z80t z80op_set_7_ihl(z80t);
291extern 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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "z80_def.h"
22
23byte z80c_incf_tbl[256];
24byte z80c_decf_tbl[256];
25byte z80c_addf_tbl[256];
26byte z80c_subf_tbl[256];
27byte z80c_orf_tbl[256];
28
29
30void PRNM(pushpc)(void)
31{
32#ifdef PROCP
33 Z80 *z80p;
34 z80p = &PRNM(proc);
35#endif
36
37 SP--;
38 PUTMEM(SP, SPP, PCH);
39 SP--;
40 PUTMEM(SP, SPP, PCL);
41}
42
43static int parity(int b)
44{
45 int i;
46 int par;
47
48 par = 0;
49 for(i = 8; i; i--) par ^= (b & 1), b >>= 1;
50 return par;
51}
52
53void PRNM(local_init)(void)
54{
55 int i;
56
57#ifdef PROCP
58 Z80 *z80p;
59 z80p = &PRNM(proc);
60#endif
61
62 for(i = 0; i < 0x100; i++) {
63 z80c_incf_tbl[i] = z80c_decf_tbl[i] = z80c_orf_tbl[i] = 0;
64
65 z80c_orf_tbl[i] |= i & (SF | B3F | B5F);
66 z80c_incf_tbl[i] |= i & (SF | B3F | B5F);
67 z80c_decf_tbl[i] |= i & (SF | B3F | B5F);
68
69 if(!parity(i)) z80c_orf_tbl[i] |= PVF;
70 }
71
72 z80c_incf_tbl[0] |= ZF;
73 z80c_decf_tbl[0] |= ZF;
74 z80c_orf_tbl[0] |= ZF;
75
76 z80c_incf_tbl[0x80] |= PVF;
77 z80c_decf_tbl[0x7F] |= PVF;
78
79 for(i = 0; i < 0x100; i++) {
80 int cr, c1, c2;
81 int hr, h1, h2;
82 int b5r;
83
84 cr = i & 0x80;
85 c1 = i & 0x40;
86 b5r = i & 0x20;
87 c2 = i & 0x10;
88
89 hr = i & 0x08;
90 h1 = i & 0x04;
91 h2 = i & 0x01;
92
93 z80c_addf_tbl[i] = 0;
94 z80c_subf_tbl[i] = 0;
95 if(cr) {
96 z80c_addf_tbl[i] |= SF;
97 z80c_subf_tbl[i] |= SF;
98 }
99 if(b5r) {
100 z80c_addf_tbl[i] |= B5F;
101 z80c_subf_tbl[i] |= B5F;
102 }
103 if(hr) {
104 z80c_addf_tbl[i] |= B3F;
105 z80c_subf_tbl[i] |= B3F;
106 }
107
108 if((c1 && c2) || (!cr && (c1 || c2))) z80c_addf_tbl[i] |= CF;
109 if((h1 && h2) || (!hr && (h1 || h2))) z80c_addf_tbl[i] |= HF;
110
111 if((!c1 && !c2 && cr) || (c1 && c2 && !cr)) z80c_addf_tbl[i] |= PVF;
112
113
114 if((c2 && cr) || (!c1 && (c2 || cr))) z80c_subf_tbl[i] |= CF;
115 if((h2 && hr) || (!h1 && (h2 || hr))) z80c_subf_tbl[i] |= HF;
116
117 if((!c2 && !cr && c1) || (c2 && cr && !c1)) z80c_subf_tbl[i] |= PVF;
118
119
120 z80c_subf_tbl[i] |= NF;
121 }
122
123
124#ifdef PROCP
125 TAB(incf_tbl) = z80c_incf_tbl;
126 TAB(decf_tbl) = z80c_decf_tbl;
127 TAB(addf_tbl) = z80c_addf_tbl;
128 TAB(subf_tbl) = z80c_subf_tbl;
129 TAB(orf_tbl) = z80c_orf_tbl;
130
131 PORT(inports) = PRNM(inports);
132 PORT(outports) = PRNM(outports);
133#ifdef SPECT_MEM
134 SPECP(fe_inport_high) = SPNM(fe_inport_high);
135#endif
136#endif
137}
138
139
140int PRNM(step)(int tc)
141{
142#ifdef PROCP
143 Z80 *z80p;
144 z80p = &PRNM(proc);
145#endif
146
147 DANM(tc) = tc;
148 DANM(rl7) = RR & 0x80;
149
150 if(DANM(haltstate)) {
151 register int nn;
152 nn = (DANM(tc) - 1) / 4 + 1;
153
154 DANM(tc) -= 4 * nn;
155 RR += nn;
156 }
157 else do {
158 register int nextop;
159
160#ifdef DEBUG_Z80
161 debug_z80();
162#endif
163 nextop = *PCP;
164 PC++;
165
166#ifdef PROCP
167 z80p = (*z80c_op_tab[nextop])(z80p);
168#else
169 (*z80c_op_tab[nextop])();
170#endif
171 RR++;
172 } while(DANM(tc) > 0);
173
174 RR = (RR & 0x7F) | DANM(rl7);
175 return DANM(tc);
176}
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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#ifndef Z80_TYPE_H
22#define Z80_TYPE_H
23
24typedef unsigned char byte;
25typedef signed char sbyte;
26typedef unsigned short dbyte;
27typedef unsigned int qbyte;
28
29typedef signed char gchar;
30typedef signed short gshort;
31typedef signed int gint;
32
33#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 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "z80_def.h"
22#include "z80optab.h"
23
24#ifdef PROCP
25#define NEXTTAB(tab) \
26{ \
27 register byte nextop; \
28 nextop = *PCP; \
29 PC++; \
30 return (*z80c_op_tab_ ## tab [nextop])(z80p); \
31}
32#else
33#define NEXTTAB(tab) \
34{ \
35 register byte nextop; \
36 nextop = *PCP; \
37 PC++; \
38 (*z80c_op_tab_ ## tab [nextop])(); \
39}
40#endif
41
42
43OPDEF(special_cb, 0xCB)
44{
45 RR++;
46 DANM(cbaddr) = HL;
47 NEXTTAB(cb);
48}
49
50OPDEF(special_dd, 0xDD)
51{
52 RR++;
53 DANM(tc) -= 4;
54 NEXTTAB(dd);
55}
56
57
58OPDEF(special_ed, 0xED)
59{
60 RR++;
61 NEXTTAB(ed);
62}
63
64OPDEF(special_fd, 0xFD)
65{
66 RR++;
67 DANM(tc) -= 4;
68 NEXTTAB(fd);
69}
70
71OPDEF(special_xx, 0xDD 0xFD)
72{
73 RR--;
74 PC--;
75 ENDOP();
76}
77
78OPDEF(special_dd_cb, 0xCB)
79{
80 DANM(tc) -= 4;
81 IXDGET(IX, DANM(cbaddr));
82#ifdef DEBUG_Z80
83 if((*PCP & 0x07) != 6)
84 printf("DD_CB unimplemented!\n");
85#endif
86 NEXTTAB(cb);
87}
88
89OPDEF(special_fd_cb, 0xCB)
90{
91 DANM(tc) -= 4;
92 IXDGET(IY, DANM(cbaddr));
93#ifdef DEBUG_Z80
94 if((*PCP & 0x07) != 6)
95 printf("FD_CB unimplemented!\n");
96#endif
97 NEXTTAB(cb);
98}
99
100op_f z80c_op_tab[] = {
101 z80op_nop,
102 z80op_ld_bc_nn,
103 z80op_ld_ibc_a,
104 z80op_inc_bc,
105 z80op_inc_b,
106 z80op_dec_b,
107 z80op_ld_b_n,
108 z80op_rlca,
109 z80op_ex_af_afb,
110 z80op_add_hl_bc,
111 z80op_ld_a_ibc,
112 z80op_dec_bc,
113 z80op_inc_c,
114 z80op_dec_c,
115 z80op_ld_c_n,
116 z80op_rrca,
117
118 z80op_djnz_e,
119 z80op_ld_de_nn,
120 z80op_ld_ide_a,
121 z80op_inc_de,
122 z80op_inc_d,
123 z80op_dec_d,
124 z80op_ld_d_n,
125 z80op_rla,
126 z80op_jr_e,
127 z80op_add_hl_de,
128 z80op_ld_a_ide,
129 z80op_dec_de,
130 z80op_inc_e,
131 z80op_dec_e,
132 z80op_ld_e_n,
133 z80op_rra,
134
135 z80op_jr_nz_e,
136 z80op_ld_hl_nn,
137 z80op_ld_inn_hl,
138 z80op_inc_hl,
139 z80op_inc_h,
140 z80op_dec_h,
141 z80op_ld_h_n,
142 z80op_daa,
143 z80op_jr_z_e,
144 z80op_add_hl_hl,
145 z80op_ld_hl_inn,
146 z80op_dec_hl,
147 z80op_inc_l,
148 z80op_dec_l,
149 z80op_ld_l_n,
150 z80op_cpl,
151
152 z80op_jr_nc_e,
153 z80op_ld_sp_nn,
154 z80op_ld_inn_a,
155 z80op_inc_sp,
156 z80op_inc_ihl,
157 z80op_dec_ihl,
158 z80op_ld_ihl_n,
159 z80op_scf,
160 z80op_jr_c_e,
161 z80op_add_hl_sp,
162 z80op_ld_a_inn,
163 z80op_dec_sp,
164 z80op_inc_a,
165 z80op_dec_a,
166 z80op_ld_a_n,
167 z80op_ccf,
168
169 z80op_nop,
170 z80op_ld_b_c,
171 z80op_ld_b_d,
172 z80op_ld_b_e,
173 z80op_ld_b_h,
174 z80op_ld_b_l,
175 z80op_ld_b_ihl,
176 z80op_ld_b_a,
177 z80op_ld_c_b,
178 z80op_nop,
179 z80op_ld_c_d,
180 z80op_ld_c_e,
181 z80op_ld_c_h,
182 z80op_ld_c_l,
183 z80op_ld_c_ihl,
184 z80op_ld_c_a,
185
186 z80op_ld_d_b,
187 z80op_ld_d_c,
188 z80op_nop,
189 z80op_ld_d_e,
190 z80op_ld_d_h,
191 z80op_ld_d_l,
192 z80op_ld_d_ihl,
193 z80op_ld_d_a,
194 z80op_ld_e_b,
195 z80op_ld_e_c,
196 z80op_ld_e_d,
197 z80op_nop,
198 z80op_ld_e_h,
199 z80op_ld_e_l,
200 z80op_ld_e_ihl,
201 z80op_ld_e_a,
202
203 z80op_ld_h_b,
204 z80op_ld_h_c,
205 z80op_ld_h_d,
206 z80op_ld_h_e,
207 z80op_nop,
208 z80op_ld_h_l,
209 z80op_ld_h_ihl,
210 z80op_ld_h_a,
211 z80op_ld_l_b,
212 z80op_ld_l_c,
213 z80op_ld_l_d,
214 z80op_ld_l_e,
215 z80op_ld_l_h,
216 z80op_nop,
217 z80op_ld_l_ihl,
218 z80op_ld_l_a,
219
220 z80op_ld_ihl_b,
221 z80op_ld_ihl_c,
222 z80op_ld_ihl_d,
223 z80op_ld_ihl_e,
224 z80op_ld_ihl_h,
225 z80op_ld_ihl_l,
226 z80op_halt,
227 z80op_ld_ihl_a,
228 z80op_ld_a_b,
229 z80op_ld_a_c,
230 z80op_ld_a_d,
231 z80op_ld_a_e,
232 z80op_ld_a_h,
233 z80op_ld_a_l,
234 z80op_ld_a_ihl,
235 z80op_nop,
236
237 z80op_add_a_b,
238 z80op_add_a_c,
239 z80op_add_a_d,
240 z80op_add_a_e,
241 z80op_add_a_h,
242 z80op_add_a_l,
243 z80op_add_a_ihl,
244 z80op_add_a_a,
245 z80op_adc_a_b,
246 z80op_adc_a_c,
247 z80op_adc_a_d,
248 z80op_adc_a_e,
249 z80op_adc_a_h,
250 z80op_adc_a_l,
251 z80op_adc_a_ihl,
252 z80op_adc_a_a,
253
254 z80op_sub_b,
255 z80op_sub_c,
256 z80op_sub_d,
257 z80op_sub_e,
258 z80op_sub_h,
259 z80op_sub_l,
260 z80op_sub_ihl,
261 z80op_sub_a,
262 z80op_sbc_a_b,
263 z80op_sbc_a_c,
264 z80op_sbc_a_d,
265 z80op_sbc_a_e,
266 z80op_sbc_a_h,
267 z80op_sbc_a_l,
268 z80op_sbc_a_ihl,
269 z80op_sbc_a_a,
270
271 z80op_and_b,
272 z80op_and_c,
273 z80op_and_d,
274 z80op_and_e,
275 z80op_and_h,
276 z80op_and_l,
277 z80op_and_ihl,
278 z80op_and_a,
279 z80op_xor_b,
280 z80op_xor_c,
281 z80op_xor_d,
282 z80op_xor_e,
283 z80op_xor_h,
284 z80op_xor_l,
285 z80op_xor_ihl,
286 z80op_xor_a,
287
288 z80op_or_b,
289 z80op_or_c,
290 z80op_or_d,
291 z80op_or_e,
292 z80op_or_h,
293 z80op_or_l,
294 z80op_or_ihl,
295 z80op_or_a,
296 z80op_cp_b,
297 z80op_cp_c,
298 z80op_cp_d,
299 z80op_cp_e,
300 z80op_cp_h,
301 z80op_cp_l,
302 z80op_cp_ihl,
303 z80op_cp_a,
304
305 z80op_ret_nz,
306 z80op_pop_bc,
307 z80op_jp_nz_nn,
308 z80op_jp_nn,
309 z80op_call_nz_nn,
310 z80op_push_bc,
311 z80op_add_a_n,
312 z80op_rst_00,
313 z80op_ret_z,
314 z80op_ret,
315 z80op_jp_z_nn,
316 z80op_special_cb,
317 z80op_call_z_nn,
318 z80op_call_nn,
319 z80op_adc_a_n,
320 z80op_rst_08,
321
322 z80op_ret_nc,
323 z80op_pop_de,
324 z80op_jp_nc_nn,
325 z80op_out_in_a,
326 z80op_call_nc_nn,
327 z80op_push_de,
328 z80op_sub_n,
329 z80op_rst_10,
330 z80op_ret_c,
331 z80op_exx,
332 z80op_jp_c_nn,
333 z80op_in_a_in,
334 z80op_call_c_nn,
335 z80op_special_dd,
336 z80op_sbc_a_n,
337 z80op_rst_18,
338
339 z80op_ret_po,
340 z80op_pop_hl,
341 z80op_jp_po_nn,
342 z80op_ex_isp_hl,
343 z80op_call_po_nn,
344 z80op_push_hl,
345 z80op_and_n,
346 z80op_rst_20,
347 z80op_ret_pe,
348 z80op_jp_hl,
349 z80op_jp_pe_nn,
350 z80op_ex_de_hl,
351 z80op_call_pe_nn,
352 z80op_special_ed,
353 z80op_xor_n,
354 z80op_rst_28,
355
356 z80op_ret_p,
357 z80op_pop_af,
358 z80op_jp_p_nn,
359 z80op_di,
360 z80op_call_p_nn,
361 z80op_push_af,
362 z80op_or_n,
363 z80op_rst_30,
364 z80op_ret_m,
365 z80op_ld_sp_hl,
366 z80op_jp_m_nn,
367 z80op_ei,
368 z80op_call_m_nn,
369 z80op_special_fd,
370 z80op_cp_n,
371 z80op_rst_38
372};
373
374
375op_f z80c_op_tab_ed[] = {
376 z80op_ill_ed,
377 z80op_ill_ed,
378 z80op_ill_ed,
379 z80op_ill_ed,
380 z80op_ill_ed,
381 z80op_ill_ed,
382 z80op_ill_ed,
383 z80op_ill_ed,
384 z80op_ill_ed,
385 z80op_ill_ed,
386 z80op_ill_ed,
387 z80op_ill_ed,
388 z80op_ill_ed,
389 z80op_ill_ed,
390 z80op_ill_ed,
391 z80op_ill_ed,
392
393 z80op_ill_ed,
394 z80op_ill_ed,
395 z80op_ill_ed,
396 z80op_ill_ed,
397 z80op_ill_ed,
398 z80op_ill_ed,
399 z80op_ill_ed,
400 z80op_ill_ed,
401 z80op_ill_ed,
402 z80op_ill_ed,
403 z80op_ill_ed,
404 z80op_ill_ed,
405 z80op_ill_ed,
406 z80op_ill_ed,
407 z80op_ill_ed,
408 z80op_ill_ed,
409
410 z80op_ill_ed,
411 z80op_ill_ed,
412 z80op_ill_ed,
413 z80op_ill_ed,
414 z80op_ill_ed,
415 z80op_ill_ed,
416 z80op_ill_ed,
417 z80op_ill_ed,
418 z80op_ill_ed,
419 z80op_ill_ed,
420 z80op_ill_ed,
421 z80op_ill_ed,
422 z80op_ill_ed,
423 z80op_ill_ed,
424 z80op_ill_ed,
425 z80op_ill_ed,
426
427 z80op_ill_ed,
428 z80op_ill_ed,
429 z80op_ill_ed,
430 z80op_ill_ed,
431 z80op_ill_ed,
432 z80op_ill_ed,
433 z80op_ill_ed,
434 z80op_ill_ed,
435 z80op_ill_ed,
436 z80op_ill_ed,
437 z80op_ill_ed,
438 z80op_ill_ed,
439 z80op_ill_ed,
440 z80op_ill_ed,
441 z80op_ill_ed,
442 z80op_ill_ed,
443
444 z80op_in_b_ic,
445 z80op_out_ic_b,
446 z80op_sbc_hl_bc,
447 z80op_ld_inn_bc,
448 z80op_neg,
449 z80op_retn,
450 z80op_im_0,
451 z80op_ld_i_a,
452 z80op_in_c_ic,
453 z80op_out_ic_c,
454 z80op_adc_hl_bc,
455 z80op_ld_bc_inn,
456 z80op_neg,
457 z80op_reti,
458 z80op_im_0,
459 z80op_ld_r_a,
460
461 z80op_in_d_ic,
462 z80op_out_ic_d,
463 z80op_sbc_hl_de,
464 z80op_ld_inn_de,
465 z80op_neg,
466 z80op_retn,
467 z80op_im_1,
468 z80op_ld_a_i,
469 z80op_in_e_ic,
470 z80op_out_ic_e,
471 z80op_adc_hl_de,
472 z80op_ld_de_inn,
473 z80op_neg,
474 z80op_retn,
475 z80op_im_2,
476 z80op_ld_a_r,
477
478 z80op_in_h_ic,
479 z80op_out_ic_h,
480 z80op_sbc_hl_hl,
481 z80op_ld_inn_hl_ed,
482 z80op_neg,
483 z80op_retn,
484 z80op_im_0,
485 z80op_rrd,
486 z80op_in_l_ic,
487 z80op_out_ic_l,
488 z80op_adc_hl_hl,
489 z80op_ld_hl_inn_ed,
490 z80op_neg,
491 z80op_retn,
492 z80op_im_0,
493 z80op_rld,
494
495 z80op_in_f_ic,
496 z80op_out_ic_0,
497 z80op_sbc_hl_sp,
498 z80op_ld_inn_sp,
499 z80op_neg,
500 z80op_retn,
501 z80op_im_1,
502 z80op_ill_ed,
503 z80op_in_a_ic,
504 z80op_out_ic_a,
505 z80op_adc_hl_sp,
506 z80op_ld_sp_inn,
507 z80op_neg,
508 z80op_retn,
509 z80op_im_2,
510 z80op_ill_ed,
511
512 z80op_ill_ed,
513 z80op_ill_ed,
514 z80op_ill_ed,
515 z80op_ill_ed,
516 z80op_ill_ed,
517 z80op_ill_ed,
518 z80op_ill_ed,
519 z80op_ill_ed,
520 z80op_ill_ed,
521 z80op_ill_ed,
522 z80op_ill_ed,
523 z80op_ill_ed,
524 z80op_ill_ed,
525 z80op_ill_ed,
526 z80op_ill_ed,
527 z80op_ill_ed,
528
529 z80op_ill_ed,
530 z80op_ill_ed,
531 z80op_ill_ed,
532 z80op_ill_ed,
533 z80op_ill_ed,
534 z80op_ill_ed,
535 z80op_ill_ed,
536 z80op_ill_ed,
537 z80op_ill_ed,
538 z80op_ill_ed,
539 z80op_ill_ed,
540 z80op_ill_ed,
541 z80op_ill_ed,
542 z80op_ill_ed,
543 z80op_ill_ed,
544 z80op_ill_ed,
545
546 z80op_ldi,
547 z80op_cpi,
548 z80op_ini,
549 z80op_outi,
550 z80op_ill_ed,
551 z80op_ill_ed,
552 z80op_ill_ed,
553 z80op_ill_ed,
554 z80op_ldd,
555 z80op_cpd,
556 z80op_ind,
557 z80op_outd,
558 z80op_ill_ed,
559 z80op_ill_ed,
560 z80op_ill_ed,
561 z80op_ill_ed,
562
563 z80op_ldir,
564 z80op_cpir,
565 z80op_inir,
566 z80op_otir,
567 z80op_ill_ed,
568 z80op_ill_ed,
569 z80op_ill_ed,
570 z80op_ill_ed,
571 z80op_lddr,
572 z80op_cpdr,
573 z80op_indr,
574 z80op_otdr,
575 z80op_ill_ed,
576 z80op_ill_ed,
577 z80op_ill_ed,
578 z80op_ill_ed,
579
580 z80op_ill_ed,
581 z80op_ill_ed,
582 z80op_ill_ed,
583 z80op_ill_ed,
584 z80op_ill_ed,
585 z80op_ill_ed,
586 z80op_ill_ed,
587 z80op_ill_ed,
588 z80op_ill_ed,
589 z80op_ill_ed,
590 z80op_ill_ed,
591 z80op_ill_ed,
592 z80op_ill_ed,
593 z80op_ill_ed,
594 z80op_ill_ed,
595 z80op_ill_ed,
596
597 z80op_ill_ed,
598 z80op_ill_ed,
599 z80op_ill_ed,
600 z80op_ill_ed,
601 z80op_ill_ed,
602 z80op_ill_ed,
603 z80op_ill_ed,
604 z80op_ill_ed,
605 z80op_ill_ed,
606 z80op_ill_ed,
607 z80op_ill_ed,
608 z80op_ill_ed,
609 z80op_ill_ed,
610 z80op_ill_ed,
611 z80op_ill_ed,
612 z80op_ill_ed,
613
614 z80op_ill_ed,
615 z80op_ill_ed,
616 z80op_ill_ed,
617 z80op_ill_ed,
618 z80op_ill_ed,
619 z80op_ill_ed,
620 z80op_ill_ed,
621 z80op_ill_ed,
622 z80op_ill_ed,
623 z80op_ill_ed,
624 z80op_ill_ed,
625 z80op_ill_ed,
626 z80op_ill_ed,
627 z80op_ill_ed,
628 z80op_ill_ed,
629 z80op_ill_ed,
630
631 z80op_ill_ed,
632 z80op_ill_ed,
633 z80op_ill_ed,
634 z80op_ill_ed,
635 z80op_ill_ed,
636 z80op_ill_ed,
637 z80op_ill_ed,
638 z80op_ill_ed,
639 z80op_ill_ed,
640 z80op_ill_ed,
641 z80op_ill_ed,
642 z80op_ill_ed,
643 z80op_ill_ed,
644 z80op_ill_ed,
645 z80op_ill_ed,
646 z80op_ill_ed
647};
648
649op_f z80c_op_tab_dd[] = {
650 z80op_nop,
651 z80op_ld_bc_nn,
652 z80op_ld_ibc_a,
653 z80op_inc_bc,
654 z80op_inc_b,
655 z80op_dec_b,
656 z80op_ld_b_n,
657 z80op_rlca,
658 z80op_ex_af_afb,
659 z80op_add_ix_bc,
660 z80op_ld_a_ibc,
661 z80op_dec_bc,
662 z80op_inc_c,
663 z80op_dec_c,
664 z80op_ld_c_n,
665 z80op_rrca,
666
667 z80op_djnz_e,
668 z80op_ld_de_nn,
669 z80op_ld_ide_a,
670 z80op_inc_de,
671 z80op_inc_d,
672 z80op_dec_d,
673 z80op_ld_d_n,
674 z80op_rla,
675 z80op_jr_e,
676 z80op_add_ix_de,
677 z80op_ld_a_ide,
678 z80op_dec_de,
679 z80op_inc_e,
680 z80op_dec_e,
681 z80op_ld_e_n,
682 z80op_rra,
683
684 z80op_jr_nz_e,
685 z80op_ld_ix_nn,
686 z80op_ld_inn_ix,
687 z80op_inc_ix,
688 z80op_inc_ixh,
689 z80op_dec_ixh,
690 z80op_ld_ixh_n,
691 z80op_daa,
692 z80op_jr_z_e,
693 z80op_add_ix_ix,
694 z80op_ld_ix_inn,
695 z80op_dec_ix,
696 z80op_inc_ixl,
697 z80op_dec_ixl,
698 z80op_ld_ixl_n,
699 z80op_cpl,
700
701 z80op_jr_nc_e,
702 z80op_ld_sp_nn,
703 z80op_ld_inn_a,
704 z80op_inc_sp,
705 z80op_inc_iixd,
706 z80op_dec_iixd,
707 z80op_ld_iixd_n,
708 z80op_scf,
709 z80op_jr_c_e,
710 z80op_add_ix_sp,
711 z80op_ld_a_inn,
712 z80op_dec_sp,
713 z80op_inc_a,
714 z80op_dec_a,
715 z80op_ld_a_n,
716 z80op_ccf,
717
718 z80op_nop,
719 z80op_ld_b_c,
720 z80op_ld_b_d,
721 z80op_ld_b_e,
722 z80op_ld_b_ixh,
723 z80op_ld_b_ixl,
724 z80op_ld_b_iixd,
725 z80op_ld_b_a,
726 z80op_ld_c_b,
727 z80op_nop,
728 z80op_ld_c_d,
729 z80op_ld_c_e,
730 z80op_ld_c_ixh,
731 z80op_ld_c_ixl,
732 z80op_ld_c_iixd,
733 z80op_ld_c_a,
734
735 z80op_ld_d_b,
736 z80op_ld_d_c,
737 z80op_nop,
738 z80op_ld_d_e,
739 z80op_ld_d_ixh,
740 z80op_ld_d_ixl,
741 z80op_ld_d_iixd,
742 z80op_ld_d_a,
743 z80op_ld_e_b,
744 z80op_ld_e_c,
745 z80op_ld_e_d,
746 z80op_nop,
747 z80op_ld_e_ixh,
748 z80op_ld_e_ixl,
749 z80op_ld_e_iixd,
750 z80op_ld_e_a,
751
752 z80op_ld_ixh_b,
753 z80op_ld_ixh_c,
754 z80op_ld_ixh_d,
755 z80op_ld_ixh_e,
756 z80op_nop,
757 z80op_ld_ixh_ixl,
758 z80op_ld_h_iixd,
759 z80op_ld_ixh_a,
760 z80op_ld_ixl_b,
761 z80op_ld_ixl_c,
762 z80op_ld_ixl_d,
763 z80op_ld_ixl_e,
764 z80op_ld_ixl_ixh,
765 z80op_nop,
766 z80op_ld_l_iixd,
767 z80op_ld_ixl_a,
768
769 z80op_ld_iixd_b,
770 z80op_ld_iixd_c,
771 z80op_ld_iixd_d,
772 z80op_ld_iixd_e,
773 z80op_ld_iixd_h,
774 z80op_ld_iixd_l,
775 z80op_halt,
776 z80op_ld_iixd_a,
777 z80op_ld_a_b,
778 z80op_ld_a_c,
779 z80op_ld_a_d,
780 z80op_ld_a_e,
781 z80op_ld_a_ixh,
782 z80op_ld_a_ixl,
783 z80op_ld_a_iixd,
784 z80op_nop,
785
786 z80op_add_a_b,
787 z80op_add_a_c,
788 z80op_add_a_d,
789 z80op_add_a_e,
790 z80op_add_a_ixh,
791 z80op_add_a_ixl,
792 z80op_add_a_iixd,
793 z80op_add_a_a,
794 z80op_adc_a_b,
795 z80op_adc_a_c,
796 z80op_adc_a_d,
797 z80op_adc_a_e,
798 z80op_adc_a_ixh,
799 z80op_adc_a_ixl,
800 z80op_adc_a_iixd,
801 z80op_adc_a_a,
802
803 z80op_sub_b,
804 z80op_sub_c,
805 z80op_sub_d,
806 z80op_sub_e,
807 z80op_sub_ixh,
808 z80op_sub_ixl,
809 z80op_sub_iixd,
810 z80op_sub_a,
811 z80op_sbc_a_b,
812 z80op_sbc_a_c,
813 z80op_sbc_a_d,
814 z80op_sbc_a_e,
815 z80op_sbc_a_ixh,
816 z80op_sbc_a_ixl,
817 z80op_sbc_a_iixd,
818 z80op_sbc_a_a,
819
820 z80op_and_b,
821 z80op_and_c,
822 z80op_and_d,
823 z80op_and_e,
824 z80op_and_ixh,
825 z80op_and_ixl,
826 z80op_and_iixd,
827 z80op_and_a,
828 z80op_xor_b,
829 z80op_xor_c,
830 z80op_xor_d,
831 z80op_xor_e,
832 z80op_xor_ixh,
833 z80op_xor_ixl,
834 z80op_xor_iixd,
835 z80op_xor_a,
836
837 z80op_or_b,
838 z80op_or_c,
839 z80op_or_d,
840 z80op_or_e,
841 z80op_or_ixh,
842 z80op_or_ixl,
843 z80op_or_iixd,
844 z80op_or_a,
845 z80op_cp_b,
846 z80op_cp_c,
847 z80op_cp_d,
848 z80op_cp_e,
849 z80op_cp_ixh,
850 z80op_cp_ixl,
851 z80op_cp_iixd,
852 z80op_cp_a,
853
854 z80op_ret_nz,
855 z80op_pop_bc,
856 z80op_jp_nz_nn,
857 z80op_jp_nn,
858 z80op_call_nz_nn,
859 z80op_push_bc,
860 z80op_add_a_n,
861 z80op_rst_00,
862 z80op_ret_z,
863 z80op_ret,
864 z80op_jp_z_nn,
865 z80op_special_dd_cb,
866 z80op_call_z_nn,
867 z80op_call_nn,
868 z80op_adc_a_n,
869 z80op_rst_08,
870
871 z80op_ret_nc,
872 z80op_pop_de,
873 z80op_jp_nc_nn,
874 z80op_out_in_a,
875 z80op_call_nc_nn,
876 z80op_push_de,
877 z80op_sub_n,
878 z80op_rst_10,
879 z80op_ret_c,
880 z80op_exx,
881 z80op_jp_c_nn,
882 z80op_in_a_in,
883 z80op_call_c_nn,
884 z80op_special_xx,
885 z80op_sbc_a_n,
886 z80op_rst_18,
887
888 z80op_ret_po,
889 z80op_pop_ix,
890 z80op_jp_po_nn,
891 z80op_ex_isp_ix,
892 z80op_call_po_nn,
893 z80op_push_ix,
894 z80op_and_n,
895 z80op_rst_20,
896 z80op_ret_pe,
897 z80op_jp_ix,
898 z80op_jp_pe_nn,
899 z80op_ex_de_hl,
900 z80op_call_pe_nn,
901 z80op_special_ed,
902 z80op_xor_n,
903 z80op_rst_28,
904
905 z80op_ret_p,
906 z80op_pop_af,
907 z80op_jp_p_nn,
908 z80op_di,
909 z80op_call_p_nn,
910 z80op_push_af,
911 z80op_or_n,
912 z80op_rst_30,
913 z80op_ret_m,
914 z80op_ld_sp_ix,
915 z80op_jp_m_nn,
916 z80op_ei,
917 z80op_call_m_nn,
918 z80op_special_xx,
919 z80op_cp_n,
920 z80op_rst_38
921};
922
923
924op_f z80c_op_tab_fd[] = {
925 z80op_nop,
926 z80op_ld_bc_nn,
927 z80op_ld_ibc_a,
928 z80op_inc_bc,
929 z80op_inc_b,
930 z80op_dec_b,
931 z80op_ld_b_n,
932 z80op_rlca,
933 z80op_ex_af_afb,
934 z80op_add_iy_bc,
935 z80op_ld_a_ibc,
936 z80op_dec_bc,
937 z80op_inc_c,
938 z80op_dec_c,
939 z80op_ld_c_n,
940 z80op_rrca,
941
942 z80op_djnz_e,
943 z80op_ld_de_nn,
944 z80op_ld_ide_a,
945 z80op_inc_de,
946 z80op_inc_d,
947 z80op_dec_d,
948 z80op_ld_d_n,
949 z80op_rla,
950 z80op_jr_e,
951 z80op_add_iy_de,
952 z80op_ld_a_ide,
953 z80op_dec_de,
954 z80op_inc_e,
955 z80op_dec_e,
956 z80op_ld_e_n,
957 z80op_rra,
958
959 z80op_jr_nz_e,
960 z80op_ld_iy_nn,
961 z80op_ld_inn_iy,
962 z80op_inc_iy,
963 z80op_inc_iyh,
964 z80op_dec_iyh,
965 z80op_ld_iyh_n,
966 z80op_daa,
967 z80op_jr_z_e,
968 z80op_add_iy_iy,
969 z80op_ld_iy_inn,
970 z80op_dec_iy,
971 z80op_inc_iyl,
972 z80op_dec_iyl,
973 z80op_ld_iyl_n,
974 z80op_cpl,
975
976 z80op_jr_nc_e,
977 z80op_ld_sp_nn,
978 z80op_ld_inn_a,
979 z80op_inc_sp,
980 z80op_inc_iiyd,
981 z80op_dec_iiyd,
982 z80op_ld_iiyd_n,
983 z80op_scf,
984 z80op_jr_c_e,
985 z80op_add_iy_sp,
986 z80op_ld_a_inn,
987 z80op_dec_sp,
988 z80op_inc_a,
989 z80op_dec_a,
990 z80op_ld_a_n,
991 z80op_ccf,
992
993 z80op_nop,
994 z80op_ld_b_c,
995 z80op_ld_b_d,
996 z80op_ld_b_e,
997 z80op_ld_b_iyh,
998 z80op_ld_b_iyl,
999 z80op_ld_b_iiyd,
1000 z80op_ld_b_a,
1001 z80op_ld_c_b,
1002 z80op_nop,
1003 z80op_ld_c_d,
1004 z80op_ld_c_e,
1005 z80op_ld_c_iyh,
1006 z80op_ld_c_iyl,
1007 z80op_ld_c_iiyd,
1008 z80op_ld_c_a,
1009
1010 z80op_ld_d_b,
1011 z80op_ld_d_c,
1012 z80op_nop,
1013 z80op_ld_d_e,
1014 z80op_ld_d_iyh,
1015 z80op_ld_d_iyl,
1016 z80op_ld_d_iiyd,
1017 z80op_ld_d_a,
1018 z80op_ld_e_b,
1019 z80op_ld_e_c,
1020 z80op_ld_e_d,
1021 z80op_nop,
1022 z80op_ld_e_iyh,
1023 z80op_ld_e_iyl,
1024 z80op_ld_e_iiyd,
1025 z80op_ld_e_a,
1026
1027 z80op_ld_iyh_b,
1028 z80op_ld_iyh_c,
1029 z80op_ld_iyh_d,
1030 z80op_ld_iyh_e,
1031 z80op_nop,
1032 z80op_ld_iyh_iyl,
1033 z80op_ld_h_iiyd,
1034 z80op_ld_iyh_a,
1035 z80op_ld_iyl_b,
1036 z80op_ld_iyl_c,
1037 z80op_ld_iyl_d,
1038 z80op_ld_iyl_e,
1039 z80op_ld_iyl_iyh,
1040 z80op_nop,
1041 z80op_ld_l_iiyd,
1042 z80op_ld_iyl_a,
1043
1044 z80op_ld_iiyd_b,
1045 z80op_ld_iiyd_c,
1046 z80op_ld_iiyd_d,
1047 z80op_ld_iiyd_e,
1048 z80op_ld_iiyd_h,
1049 z80op_ld_iiyd_l,
1050 z80op_halt,
1051 z80op_ld_iiyd_a,
1052 z80op_ld_a_b,
1053 z80op_ld_a_c,
1054 z80op_ld_a_d,
1055 z80op_ld_a_e,
1056 z80op_ld_a_iyh,
1057 z80op_ld_a_iyl,
1058 z80op_ld_a_iiyd,
1059 z80op_nop,
1060
1061 z80op_add_a_b,
1062 z80op_add_a_c,
1063 z80op_add_a_d,
1064 z80op_add_a_e,
1065 z80op_add_a_iyh,
1066 z80op_add_a_iyl,
1067 z80op_add_a_iiyd,
1068 z80op_add_a_a,
1069 z80op_adc_a_b,
1070 z80op_adc_a_c,
1071 z80op_adc_a_d,
1072 z80op_adc_a_e,
1073 z80op_adc_a_iyh,
1074 z80op_adc_a_iyl,
1075 z80op_adc_a_iiyd,
1076 z80op_adc_a_a,
1077
1078 z80op_sub_b,
1079 z80op_sub_c,
1080 z80op_sub_d,
1081 z80op_sub_e,
1082 z80op_sub_iyh,
1083 z80op_sub_iyl,
1084 z80op_sub_iiyd,
1085 z80op_sub_a,
1086 z80op_sbc_a_b,
1087 z80op_sbc_a_c,
1088 z80op_sbc_a_d,
1089 z80op_sbc_a_e,
1090 z80op_sbc_a_iyh,
1091 z80op_sbc_a_iyl,
1092 z80op_sbc_a_iiyd,
1093 z80op_sbc_a_a,
1094
1095 z80op_and_b,
1096 z80op_and_c,
1097 z80op_and_d,
1098 z80op_and_e,
1099 z80op_and_iyh,
1100 z80op_and_iyl,
1101 z80op_and_iiyd,
1102 z80op_and_a,
1103 z80op_xor_b,
1104 z80op_xor_c,
1105 z80op_xor_d,
1106 z80op_xor_e,
1107 z80op_xor_iyh,
1108 z80op_xor_iyl,
1109 z80op_xor_iiyd,
1110 z80op_xor_a,
1111
1112 z80op_or_b,
1113 z80op_or_c,
1114 z80op_or_d,
1115 z80op_or_e,
1116 z80op_or_iyh,
1117 z80op_or_iyl,
1118 z80op_or_iiyd,
1119 z80op_or_a,
1120 z80op_cp_b,
1121 z80op_cp_c,
1122 z80op_cp_d,
1123 z80op_cp_e,
1124 z80op_cp_iyh,
1125 z80op_cp_iyl,
1126 z80op_cp_iiyd,
1127 z80op_cp_a,
1128
1129 z80op_ret_nz,
1130 z80op_pop_bc,
1131 z80op_jp_nz_nn,
1132 z80op_jp_nn,
1133 z80op_call_nz_nn,
1134 z80op_push_bc,
1135 z80op_add_a_n,
1136 z80op_rst_00,
1137 z80op_ret_z,
1138 z80op_ret,
1139 z80op_jp_z_nn,
1140 z80op_special_fd_cb,
1141 z80op_call_z_nn,
1142 z80op_call_nn,
1143 z80op_adc_a_n,
1144 z80op_rst_08,
1145
1146 z80op_ret_nc,
1147 z80op_pop_de,
1148 z80op_jp_nc_nn,
1149 z80op_out_in_a,
1150 z80op_call_nc_nn,
1151 z80op_push_de,
1152 z80op_sub_n,
1153 z80op_rst_10,
1154 z80op_ret_c,
1155 z80op_exx,
1156 z80op_jp_c_nn,
1157 z80op_in_a_in,
1158 z80op_call_c_nn,
1159 z80op_special_xx,
1160 z80op_sbc_a_n,
1161 z80op_rst_18,
1162
1163 z80op_ret_po,
1164 z80op_pop_iy,
1165 z80op_jp_po_nn,
1166 z80op_ex_isp_iy,
1167 z80op_call_po_nn,
1168 z80op_push_iy,
1169 z80op_and_n,
1170 z80op_rst_20,
1171 z80op_ret_pe,
1172 z80op_jp_iy,
1173 z80op_jp_pe_nn,
1174 z80op_ex_de_hl,
1175 z80op_call_pe_nn,
1176 z80op_special_ed,
1177 z80op_xor_n,
1178 z80op_rst_28,
1179
1180 z80op_ret_p,
1181 z80op_pop_af,
1182 z80op_jp_p_nn,
1183 z80op_di,
1184 z80op_call_p_nn,
1185 z80op_push_af,
1186 z80op_or_n,
1187 z80op_rst_30,
1188 z80op_ret_m,
1189 z80op_ld_sp_iy,
1190 z80op_jp_m_nn,
1191 z80op_ei,
1192 z80op_call_m_nn,
1193 z80op_special_xx,
1194 z80op_cp_n,
1195 z80op_rst_38
1196};
1197
1198op_f z80c_op_tab_cb[] = {
1199 z80op_rlc_b,
1200 z80op_rlc_c,
1201 z80op_rlc_d,
1202 z80op_rlc_e,
1203 z80op_rlc_h,
1204 z80op_rlc_l,
1205 z80op_rlc_ihl,
1206 z80op_rlc_a,
1207 z80op_rrc_b,
1208 z80op_rrc_c,
1209 z80op_rrc_d,
1210 z80op_rrc_e,
1211 z80op_rrc_h,
1212 z80op_rrc_l,
1213 z80op_rrc_ihl,
1214 z80op_rrc_a,
1215
1216 z80op_rl_b,
1217 z80op_rl_c,
1218 z80op_rl_d,
1219 z80op_rl_e,
1220 z80op_rl_h,
1221 z80op_rl_l,
1222 z80op_rl_ihl,
1223 z80op_rl_a,
1224 z80op_rr_b,
1225 z80op_rr_c,
1226 z80op_rr_d,
1227 z80op_rr_e,
1228 z80op_rr_h,
1229 z80op_rr_l,
1230 z80op_rr_ihl,
1231 z80op_rr_a,
1232
1233 z80op_sla_b,
1234 z80op_sla_c,
1235 z80op_sla_d,
1236 z80op_sla_e,
1237 z80op_sla_h,
1238 z80op_sla_l,
1239 z80op_sla_ihl,
1240 z80op_sla_a,
1241 z80op_sra_b,
1242 z80op_sra_c,
1243 z80op_sra_d,
1244 z80op_sra_e,
1245 z80op_sra_h,
1246 z80op_sra_l,
1247 z80op_sra_ihl,
1248 z80op_sra_a,
1249
1250 z80op_sll_b,
1251 z80op_sll_c,
1252 z80op_sll_d,
1253 z80op_sll_e,
1254 z80op_sll_h,
1255 z80op_sll_l,
1256 z80op_sll_ihl,
1257 z80op_sll_a,
1258 z80op_srl_b,
1259 z80op_srl_c,
1260 z80op_srl_d,
1261 z80op_srl_e,
1262 z80op_srl_h,
1263 z80op_srl_l,
1264 z80op_srl_ihl,
1265 z80op_srl_a,
1266
1267 z80op_bit_0_b,
1268 z80op_bit_0_c,
1269 z80op_bit_0_d,
1270 z80op_bit_0_e,
1271 z80op_bit_0_h,
1272 z80op_bit_0_l,
1273 z80op_bit_0_ihl,
1274 z80op_bit_0_a,
1275 z80op_bit_1_b,
1276 z80op_bit_1_c,
1277 z80op_bit_1_d,
1278 z80op_bit_1_e,
1279 z80op_bit_1_h,
1280 z80op_bit_1_l,
1281 z80op_bit_1_ihl,
1282 z80op_bit_1_a,
1283
1284 z80op_bit_2_b,
1285 z80op_bit_2_c,
1286 z80op_bit_2_d,
1287 z80op_bit_2_e,
1288 z80op_bit_2_h,
1289 z80op_bit_2_l,
1290 z80op_bit_2_ihl,
1291 z80op_bit_2_a,
1292 z80op_bit_3_b,
1293 z80op_bit_3_c,
1294 z80op_bit_3_d,
1295 z80op_bit_3_e,
1296 z80op_bit_3_h,
1297 z80op_bit_3_l,
1298 z80op_bit_3_ihl,
1299 z80op_bit_3_a,
1300
1301 z80op_bit_4_b,
1302 z80op_bit_4_c,
1303 z80op_bit_4_d,
1304 z80op_bit_4_e,
1305 z80op_bit_4_h,
1306 z80op_bit_4_l,
1307 z80op_bit_4_ihl,
1308 z80op_bit_4_a,
1309 z80op_bit_5_b,
1310 z80op_bit_5_c,
1311 z80op_bit_5_d,
1312 z80op_bit_5_e,
1313 z80op_bit_5_h,
1314 z80op_bit_5_l,
1315 z80op_bit_5_ihl,
1316 z80op_bit_5_a,
1317
1318 z80op_bit_6_b,
1319 z80op_bit_6_c,
1320 z80op_bit_6_d,
1321 z80op_bit_6_e,
1322 z80op_bit_6_h,
1323 z80op_bit_6_l,
1324 z80op_bit_6_ihl,
1325 z80op_bit_6_a,
1326 z80op_bit_7_b,
1327 z80op_bit_7_c,
1328 z80op_bit_7_d,
1329 z80op_bit_7_e,
1330 z80op_bit_7_h,
1331 z80op_bit_7_l,
1332 z80op_bit_7_ihl,
1333 z80op_bit_7_a,
1334
1335 z80op_res_0_b,
1336 z80op_res_0_c,
1337 z80op_res_0_d,
1338 z80op_res_0_e,
1339 z80op_res_0_h,
1340 z80op_res_0_l,
1341 z80op_res_0_ihl,
1342 z80op_res_0_a,
1343 z80op_res_1_b,
1344 z80op_res_1_c,
1345 z80op_res_1_d,
1346 z80op_res_1_e,
1347 z80op_res_1_h,
1348 z80op_res_1_l,
1349 z80op_res_1_ihl,
1350 z80op_res_1_a,
1351
1352 z80op_res_2_b,
1353 z80op_res_2_c,
1354 z80op_res_2_d,
1355 z80op_res_2_e,
1356 z80op_res_2_h,
1357 z80op_res_2_l,
1358 z80op_res_2_ihl,
1359 z80op_res_2_a,
1360 z80op_res_3_b,
1361 z80op_res_3_c,
1362 z80op_res_3_d,
1363 z80op_res_3_e,
1364 z80op_res_3_h,
1365 z80op_res_3_l,
1366 z80op_res_3_ihl,
1367 z80op_res_3_a,
1368
1369 z80op_res_4_b,
1370 z80op_res_4_c,
1371 z80op_res_4_d,
1372 z80op_res_4_e,
1373 z80op_res_4_h,
1374 z80op_res_4_l,
1375 z80op_res_4_ihl,
1376 z80op_res_4_a,
1377 z80op_res_5_b,
1378 z80op_res_5_c,
1379 z80op_res_5_d,
1380 z80op_res_5_e,
1381 z80op_res_5_h,
1382 z80op_res_5_l,
1383 z80op_res_5_ihl,
1384 z80op_res_5_a,
1385
1386 z80op_res_6_b,
1387 z80op_res_6_c,
1388 z80op_res_6_d,
1389 z80op_res_6_e,
1390 z80op_res_6_h,
1391 z80op_res_6_l,
1392 z80op_res_6_ihl,
1393 z80op_res_6_a,
1394 z80op_res_7_b,
1395 z80op_res_7_c,
1396 z80op_res_7_d,
1397 z80op_res_7_e,
1398 z80op_res_7_h,
1399 z80op_res_7_l,
1400 z80op_res_7_ihl,
1401 z80op_res_7_a,
1402
1403 z80op_set_0_b,
1404 z80op_set_0_c,
1405 z80op_set_0_d,
1406 z80op_set_0_e,
1407 z80op_set_0_h,
1408 z80op_set_0_l,
1409 z80op_set_0_ihl,
1410 z80op_set_0_a,
1411 z80op_set_1_b,
1412 z80op_set_1_c,
1413 z80op_set_1_d,
1414 z80op_set_1_e,
1415 z80op_set_1_h,
1416 z80op_set_1_l,
1417 z80op_set_1_ihl,
1418 z80op_set_1_a,
1419
1420 z80op_set_2_b,
1421 z80op_set_2_c,
1422 z80op_set_2_d,
1423 z80op_set_2_e,
1424 z80op_set_2_h,
1425 z80op_set_2_l,
1426 z80op_set_2_ihl,
1427 z80op_set_2_a,
1428 z80op_set_3_b,
1429 z80op_set_3_c,
1430 z80op_set_3_d,
1431 z80op_set_3_e,
1432 z80op_set_3_h,
1433 z80op_set_3_l,
1434 z80op_set_3_ihl,
1435 z80op_set_3_a,
1436
1437 z80op_set_4_b,
1438 z80op_set_4_c,
1439 z80op_set_4_d,
1440 z80op_set_4_e,
1441 z80op_set_4_h,
1442 z80op_set_4_l,
1443 z80op_set_4_ihl,
1444 z80op_set_4_a,
1445 z80op_set_5_b,
1446 z80op_set_5_c,
1447 z80op_set_5_d,
1448 z80op_set_5_e,
1449 z80op_set_5_h,
1450 z80op_set_5_l,
1451 z80op_set_5_ihl,
1452 z80op_set_5_a,
1453
1454 z80op_set_6_b,
1455 z80op_set_6_c,
1456 z80op_set_6_d,
1457 z80op_set_6_e,
1458 z80op_set_6_h,
1459 z80op_set_6_l,
1460 z80op_set_6_ihl,
1461 z80op_set_6_a,
1462 z80op_set_7_b,
1463 z80op_set_7_c,
1464 z80op_set_7_d,
1465 z80op_set_7_e,
1466 z80op_set_7_h,
1467 z80op_set_7_l,
1468 z80op_set_7_ihl,
1469 z80op_set_7_a
1470};
diff --git a/apps/plugins/zxbox/z80optab.h b/apps/plugins/zxbox/z80optab.h
new file mode 100644
index 0000000000..098322f6ba
--- /dev/null
+++ b/apps/plugins/zxbox/z80optab.h
@@ -0,0 +1,31 @@
1/*
2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21#include "z80_op1.h"
22#include "z80_op2.h"
23#include "z80_op3.h"
24#include "z80_op4.h"
25
26#include "z80_op5.h"
27#include "z80_op6.h"
28
29extern z80t z80op_special_xx(z80t);
30extern z80t z80op_special_dd_cb(z80t);
31extern z80t z80op_special_fd_cb(z80t);
diff --git a/apps/plugins/zxbox/zxbox.c b/apps/plugins/zxbox/zxbox.c
new file mode 100644
index 0000000000..1ca63d0eb5
--- /dev/null
+++ b/apps/plugins/zxbox/zxbox.c
@@ -0,0 +1,293 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (c) 2006 Anton Romanov
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include "zxconfig.h"
21
22PLUGIN_HEADER
23
24struct plugin_api* rb;
25
26#include "spkey_p.h"
27
28spkeyboard kb_mkey;
29bool exit_requested=false;
30bool clear_kbd=0;
31extern bool zxbox_menu(void);
32
33/* DUMMIES ... to clean */
34unsigned int scrmul=0;
35int privatemap;
36int use_shm = 0;
37int small_screen,pause_on_iconify;
38int vga_pause_bg;
39
40#ifdef USE_IRAM
41extern char iramcopy[];
42extern char iramstart[];
43extern char iramend[];
44extern char iedata[];
45extern char iend[];
46#endif
47
48#include "keymaps.h"
49#include "zxvid_com.h"
50#include "spmain.h"
51#include "spperif.h"
52
53struct zxbox_settings settings;
54
55/* doesn't fit into .ibss */
56unsigned char image_array [ HEIGHT * WIDTH ];
57
58static int previous_state;
59
60#ifdef USE_GRAY
61static unsigned char *gbuf;
62static unsigned int gbuf_size = 0;
63#endif
64
65long video_frames = 0;
66long start_time = 0;
67
68enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
69{
70
71 rb = api;
72#if CODEC == SWCODEC && !defined SIMULATOR
73 rb->pcm_play_stop();
74#endif
75 rb->splash(HZ, true, "Welcome to ZXBox");
76 sp_init();
77
78#ifdef USE_IRAM
79 /* We need to stop audio playback in order to use IRAM */
80 rb->audio_stop();
81
82 rb->memcpy(iramstart, iramcopy, iramend-iramstart);
83 rb->memset(iedata, 0, iend - iedata);
84#endif
85
86#ifdef USE_GRAY
87 /* get the remainder of the plugin buffer */
88 gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
89#ifdef USE_BUFFERED_GRAY
90 gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, LCD_HEIGHT, 15, 0, NULL);
91#else
92 gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT, 15, 0, NULL);
93#endif /* USE_BUFFERED_GRAY */
94 /* switch on grayscale overlay */
95 gray_show(true);
96#endif /* USE_GRAY */
97
98
99#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
100 rb->cpu_boost(true);
101#endif
102
103 start_time = *rb->current_tick;
104 start_spectemu(parameter);
105
106#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
107 rb->cpu_boost(false);
108#endif
109
110#ifdef USE_GRAY
111gray_show(false);
112gray_release();
113#endif
114
115#if CODEC == SWCODEC && !defined SIMULATOR
116 rb->pcm_play_stop();
117#endif
118
119return PLUGIN_OK;
120}
121
122void init_spect_key(void)
123{
124 clear_keystates();
125 init_basekeys();
126}
127
128void spkb_process_events( int evenframe )
129{
130
131 if(evenframe){
132 int ki;
133#if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
134 (CONFIG_KEYPAD == IPOD_3G_PAD)
135 if (rb->button_hold())
136 {
137#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
138 rb->cpu_boost(false);
139#endif
140 exit_requested=1;
141#ifdef USE_GRAY
142 gray_show(false);
143#endif
144 return;
145 }
146#endif
147 int buttons = rb->button_status();
148 if ( buttons == previous_state )
149 return;
150 previous_state = buttons;
151#if (CONFIG_KEYPAD != IPOD_4G_PAD) && \
152 (CONFIG_KEYPAD != IPOD_3G_PAD)
153 if (buttons & ZX_MENU)
154 {
155#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
156 rb->cpu_boost(false);
157#endif
158 exit_requested=1;
159#ifdef USE_GRAY
160 gray_show(false);
161#endif
162 return;
163 }
164#endif
165 spkb_state_changed = 1;
166 if (settings.kempston){
167 if ( buttons & ZX_RIGHT ){
168 ki = KS_TO_KEY(SK_KP_Right);
169 spkb_kbstate[ki].state = 1;
170 }
171 else if (buttons & ZX_LEFT){
172 ki = KS_TO_KEY(SK_KP_Left);
173 spkb_kbstate[ki].state = 1;
174
175 }
176 else{
177 ki = KS_TO_KEY(SK_KP_Right);
178 spkb_kbstate[ki].state = 0;
179 ki = KS_TO_KEY(SK_KP_Left);
180 spkb_kbstate[ki].state = 0;
181
182 }
183 if ( buttons & ZX_UP ){
184 ki = KS_TO_KEY(SK_KP_Up);
185 spkb_kbstate[ki].state = 1;
186 }
187 else if (buttons & ZX_DOWN){
188 ki = KS_TO_KEY(SK_KP_Down);
189 spkb_kbstate[ki].state = 1;
190 }
191 else{
192 ki = KS_TO_KEY(SK_KP_Up);
193 spkb_kbstate[ki].state = 0;
194 ki = KS_TO_KEY(SK_KP_Down);
195 spkb_kbstate[ki].state = 0;
196 }
197
198 if ( buttons & ZX_SELECT ){
199 ki = KS_TO_KEY(SK_KP_Insert);
200 spkb_kbstate[ki].state = 1;
201 }
202 else{
203 ki = KS_TO_KEY(SK_KP_Insert);
204 spkb_kbstate[ki].state = 0;
205 }
206
207 }
208 else {
209
210 if ( buttons & ZX_RIGHT ){
211 ki = KS_TO_KEY(intkeys[3]);
212 spkb_kbstate[ki].state = 1;
213 }
214 else{
215 ki = KS_TO_KEY(intkeys[3]);
216 spkb_kbstate[ki].state = 0;
217 }
218
219 if ( buttons & ZX_LEFT ){
220 ki = KS_TO_KEY(intkeys[2]);
221 spkb_kbstate[ki].state = 1;
222 }
223 else{
224 ki = KS_TO_KEY(intkeys[2]);
225 spkb_kbstate[ki].state = 0;
226 }
227
228 if ( buttons & ZX_UP ){
229 ki = KS_TO_KEY(intkeys[0]);
230 spkb_kbstate[ki].state = 1;
231 }
232 else{
233 ki = KS_TO_KEY(intkeys[0]);
234 spkb_kbstate[ki].state = 0;
235 }
236
237 if ( buttons & ZX_DOWN ){
238 ki = KS_TO_KEY(intkeys[1]);
239 spkb_kbstate[ki].state = 1;
240 }
241 else{
242 ki = KS_TO_KEY(intkeys[1]);
243 spkb_kbstate[ki].state = 0;
244 }
245
246 if ( buttons & ZX_SELECT ){
247 ki = KS_TO_KEY(intkeys[4]);
248 spkb_kbstate[ki].state = 1;
249 }
250 else{
251 ki = KS_TO_KEY(intkeys[4]);
252 spkb_kbstate[ki].state = 0;
253 }
254 }
255 process_keys();
256 }
257}
258
259void press_key(int c){
260 spkb_state_changed = 1;
261 int ki;
262 if ( c == 'E' )
263 ki = KS_TO_KEY(SK_KP_Enter);
264 else if (c == 'S' )
265 ki = KS_TO_KEY(SK_KP_Space);
266 else
267 ki = KS_TO_KEY(c);
268 spkb_kbstate[ki].state = 1;
269 process_keys();
270}
271
272void spkey_textmode(void)
273{
274}
275
276void spkey_screenmode(void)
277{
278}
279
280void spscr_refresh_colors(void)
281{
282}
283
284void resize_spect_scr(int s)
285{
286 /* just to disable warning */
287 (void)s;
288}
289
290int display_keyboard(void)
291{
292 return 0;
293}
diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c
new file mode 100644
index 0000000000..685d9ce6bb
--- /dev/null
+++ b/apps/plugins/zxbox/zxbox_keyb.c
@@ -0,0 +1,497 @@
1#include "zxconfig.h"
2
3#ifndef O_BINARY
4#define O_BINARY 0
5#endif
6
7#if CONFIG_KEYPAD == RECORDER_PAD
8#define BUTTONBAR_HEIGHT 8
9#else
10#define BUTTONBAR_HEIGHT 0
11#endif
12
13#define DEFAULT_MARGIN 6
14#define KBD_BUF_SIZE 500
15#define kbd_loaded false
16#define statusbar_size 0
17
18#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
19 (CONFIG_KEYPAD == IRIVER_H300_PAD)
20#define KBD_SELECT BUTTON_SELECT
21#define KBD_ABORT BUTTON_OFF
22#define KBD_LEFT BUTTON_LEFT
23#define KBD_RIGHT BUTTON_RIGHT
24#define KBD_UP BUTTON_UP
25#define KBD_DOWN BUTTON_DOWN
26
27#elif CONFIG_KEYPAD == RECORDER_PAD
28#define KBD_SELECT BUTTON_PLAY
29#define KBD_ABORT BUTTON_OFF
30#define KBD_LEFT BUTTON_LEFT
31#define KBD_RIGHT BUTTON_RIGHT
32#define KBD_UP BUTTON_UP
33#define KBD_DOWN BUTTON_DOWN
34
35#elif CONFIG_KEYPAD == ONDIO_PAD /* restricted Ondio keypad */
36#define KBD_SELECT BUTTON_MENU
37#define KBD_ABORT BUTTON_OFF
38#define KBD_LEFT BUTTON_LEFT
39#define KBD_RIGHT BUTTON_RIGHT
40#define KBD_UP BUTTON_UP
41#define KBD_DOWN BUTTON_DOWN
42
43#elif CONFIG_KEYPAD == GMINI100_PAD
44#define KBD_SELECT BUTTON_PLAY
45#define KBD_ABORT BUTTON_OFF
46#define KBD_LEFT BUTTON_LEFT
47#define KBD_RIGHT BUTTON_RIGHT
48#define KBD_UP BUTTON_UP
49#define KBD_DOWN BUTTON_DOWN
50
51#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
52
53#define KBD_SELECT BUTTON_SELECT
54#define KBD_ABORT BUTTON_MENU
55#define KBD_LEFT BUTTON_LEFT
56#define KBD_RIGHT BUTTON_RIGHT
57#define KBD_UP BUTTON_SCROLL_BACK
58#define KBD_DOWN BUTTON_SCROLL_FWD
59
60#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
61
62/* TODO: Check keyboard mappings */
63
64#define KBD_SELECT BUTTON_SELECT
65#define KBD_ABORT BUTTON_PLAY
66#define KBD_LEFT BUTTON_LEFT
67#define KBD_RIGHT BUTTON_RIGHT
68#define KBD_UP BUTTON_UP
69#define KBD_DOWN BUTTON_DOWN
70
71#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
72
73/* TODO: Check keyboard mappings */
74
75#define KBD_SELECT BUTTON_SELECT
76#define KBD_ABORT BUTTON_REC
77#define KBD_LEFT BUTTON_LEFT
78#define KBD_RIGHT BUTTON_RIGHT
79#define KBD_UP BUTTON_UP
80#define KBD_DOWN BUTTON_DOWN
81
82#elif CONFIG_KEYPAD == GIGABEAT_PAD
83
84#define KBD_SELECT BUTTON_SELECT
85#define KBD_ABORT BUTTON_A
86#define KBD_LEFT BUTTON_LEFT
87#define KBD_RIGHT BUTTON_RIGHT
88#define KBD_UP BUTTON_UP
89#define KBD_DOWN BUTTON_DOWN
90
91#elif CONFIG_KEYPAD == IRIVER_H10_PAD
92
93/* TODO: Check keyboard mappings */
94
95#define KBD_SELECT BUTTON_REW
96#define KBD_ABORT BUTTON_FF
97#define KBD_LEFT BUTTON_LEFT
98#define KBD_RIGHT BUTTON_RIGHT
99#define KBD_UP BUTTON_SCROLL_UP
100#define KBD_DOWN BUTTON_SCROLL_DOWN
101
102#endif
103
104
105struct keyboard_parameters {
106 const unsigned char* default_kbd;
107 int DEFAULT_LINES;
108 unsigned short kbd_buf[KBD_BUF_SIZE];
109 int nchars;
110 int font_w;
111 int font_h;
112 struct font* font;
113 int curfont;
114 int main_x;
115 int main_y;
116 int max_chars;
117 int max_chars_text;
118 int lines;
119 int pages;
120 int keyboard_margin;
121 int old_main_y;
122 int curpos;
123 int leftpos;
124 int page;
125 int x;
126 int y;
127};
128
129struct keyboard_parameters param[NB_SCREENS];
130
131int zx_kbd_input(char* text/*, int buflen*/)
132{
133 bool done = false;
134 int i, j, k, w, l;
135 int text_w = 0;
136 int len_utf8/*, c = 0*/;
137 int editpos;
138/* int statusbar_size = global_settings.statusbar ? STATUSBAR_HEIGHT : 0;*/
139 unsigned short ch/*, tmp, hlead = 0, hvowel = 0, htail = 0*/;
140 /*bool hangul = false;*/
141 unsigned char *utf8;
142 const unsigned char *p;
143 bool cur_blink = true;
144 int char_screen = 0;
145
146 FOR_NB_SCREENS(l)
147 {
148 param[l].default_kbd =
149 "1234567890\n"
150 "qwertyuiop\n"
151 "asdfghjkl\n"
152 "zxcvbnm\n"
153 "S\n"
154 "E";
155
156 param[l].DEFAULT_LINES = 7;
157 }
158
159 char outline[256];
160 int button, lastbutton = 0;
161 FOR_NB_SCREENS(l)
162 {
163 /* Copy default keyboard to buffer */
164 i = 0;
165 param[l].curfont = FONT_SYSFIXED;
166 p = param[l].default_kbd;
167 while (*p != 0)
168 p = rb->utf8decode(p, &param[l].kbd_buf[i++]);
169 param[l].nchars = i;
170/* param[l].curfont = FONT_UI;*/
171 }
172 FOR_NB_SCREENS(l)
173 {
174 param[l].font = rb->font_get(param[l].curfont);
175 param[l].font_h = param[l].font->height;
176
177 /* check if FONT_UI fits the screen */
178 if (2*param[l].font_h+3 + BUTTONBAR_HEIGHT > rb->screens[l]->height) {
179 param[l].font = rb->font_get(FONT_SYSFIXED);
180 param[l].font_h = param[l].font->height;
181 param[l].curfont = FONT_SYSFIXED;
182 }
183
184 rb->screens[l]->setfont(param[l].curfont);
185 /* find max width of keyboard glyphs */
186 for (i=0; i<param[l].nchars; i++) {
187 w = rb->font_get_width(param[l].font, param[l].kbd_buf[i]);
188 if (w > param[l].font_w)
189 param[l].font_w = w;
190 }
191 /* Since we're going to be adding spaces, make sure that we check
192 * their width too */
193 w = rb->font_get_width( param[l].font, ' ' );
194 if( w > param[l].font_w )
195 param[l].font_w = w;
196 }
197 FOR_NB_SCREENS(l)
198 {
199 i = 0;
200 /* Pad lines with spaces */
201 while( i < param[l].nchars )
202 {
203 if( param[l].kbd_buf[i] == '\n' )
204 {
205 k = ( rb->screens[l]->width / param[l].font_w )
206 - i % ( rb->screens[l]->width / param[l].font_w ) - 1;
207 if( k == ( rb->screens[l]->width / param[l].font_w ) - 1 )
208 {
209 param[l].nchars--;
210 for( j = i; j < param[l].nchars; j++ )
211 {
212 param[l].kbd_buf[j] = param[l].kbd_buf[j+1];
213 }
214 }
215 else
216 {
217 if( param[l].nchars + k - 1 >= KBD_BUF_SIZE )
218 { /* We don't want to overflow the buffer */
219 k = KBD_BUF_SIZE - param[l].nchars;
220 }
221 for( j = param[l].nchars + k - 1; j > i+k; j-- )
222 {
223 param[l].kbd_buf[j] = param[l].kbd_buf[j-k];
224 }
225 param[l].nchars += k;
226 k++;
227 while( k-- )
228 {
229 param[l].kbd_buf[i++] = ' ';
230 }
231 }
232 }
233 else
234 i++;
235 }
236 }
237
238 /* find max width for text string */
239 utf8 = text;
240 FOR_NB_SCREENS(l)
241 {
242 text_w = param[l].font_w;
243 while (*utf8) {
244 utf8 = (unsigned char*)rb->utf8decode(utf8, &ch);
245 w = rb->font_get_width(param[l].font, ch);
246 if (w > text_w)
247 text_w = w;
248 }
249 param[l].max_chars_text = rb->screens[l]->width / text_w - 2;
250
251 /* calculate keyboard grid size */
252 param[l].max_chars = rb->screens[l]->width / param[l].font_w;
253 if (!kbd_loaded) {
254 param[l].lines = param[l].DEFAULT_LINES;
255 param[l].keyboard_margin = DEFAULT_MARGIN;
256 } else {
257 param[l].lines = (rb->screens[l]->height - BUTTONBAR_HEIGHT - statusbar_size) / param[l].font_h - 1;
258 param[l].keyboard_margin = rb->screens[l]->height - BUTTONBAR_HEIGHT -
259 statusbar_size - (param[l].lines+1)*param[l].font_h;
260 if (param[l].keyboard_margin < 3) {
261 param[l].lines--;
262 param[l].keyboard_margin += param[l].font_h;
263 }
264 if (param[l].keyboard_margin > 6)
265 param[l].keyboard_margin = 6;
266 }
267
268 param[l].pages = (param[l].nchars + (param[l].lines*param[l].max_chars-1))
269 /(param[l].lines*param[l].max_chars);
270 if (param[l].pages == 1 && kbd_loaded)
271 param[l].lines = (param[l].nchars + param[l].max_chars - 1) / param[l].max_chars;
272
273 param[l].main_y = param[l].font_h*param[l].lines + param[l].keyboard_margin + statusbar_size;
274 param[l].main_x = 0;
275 param[l].keyboard_margin -= param[l].keyboard_margin/2;
276
277 }
278 editpos = rb->utf8length(text);
279
280
281
282 while(!done)
283 {
284 len_utf8 = rb->utf8length(text);
285 FOR_NB_SCREENS(l)
286 rb->screens[l]->clear_display();
287
288
289 /* draw page */
290 FOR_NB_SCREENS(l)
291 {
292 rb->screens[l]->setfont(param[l].curfont);
293 k = param[l].page*param[l].max_chars*param[l].lines;
294 for (i=j=0; j < param[l].lines && k < param[l].nchars; k++) {
295 utf8 = rb->utf8encode(param[l].kbd_buf[k], outline);
296 *utf8 = 0;
297 rb->screens[l]->getstringsize(outline, &w, NULL);
298 rb->screens[l]->putsxy(i*param[l].font_w + (param[l].font_w-w)/2, j*param[l].font_h
299 + statusbar_size, outline);
300 if (++i == param[l].max_chars) {
301 i = 0;
302 j++;
303 }
304 }
305 }
306
307
308 /* separator */
309 FOR_NB_SCREENS(l)
310 {
311 rb->screens[l]->hline(0, rb->screens[l]->width - 1, param[l].main_y - param[l].keyboard_margin);
312
313 /* write out the text */
314#if 0
315 rb->screens[l]->setfont(param[l].curfont);
316
317 i=j=0;
318 param[l].curpos = MIN(editpos, param[l].max_chars_text
319 - MIN(len_utf8 - editpos, 2));
320 param[l].leftpos = editpos - param[l].curpos;
321 utf8 = text + rb->utf8seek(text, param[l].leftpos);
322
323 text_w = param[l].font_w;
324 while (*utf8 && i < param[l].max_chars_text) {
325 outline[j++] = *utf8++;
326 if ((*utf8 & MASK) != COMP) {
327 outline[j] = 0;
328 j=0;
329 i++;
330 rb->screens[l]->getstringsize(outline, &w, NULL);
331 rb->screens[l]->putsxy(i*text_w + (text_w-w)/2, param[l].main_y, outline);
332 }
333 }
334
335 if (param[l].leftpos) {
336 rb->screens[l]->getstringsize("<", &w, NULL);
337 rb->screens[l]->putsxy(text_w - w, param[l].main_y, "<");
338 }
339 if (len_utf8 - param[l].leftpos > param[l].max_chars_text)
340 rb->screens[l]->putsxy(rb->screens[l]->width - text_w, param[l].main_y, ">");
341
342 /* cursor */
343 i = (param[l].curpos + 1) * text_w;
344 if (cur_blink)
345 rb->screens[l]->vline(i, param[l].main_y, param[l].main_y + param[l].font_h-1);
346
347 if (hangul) /* draw underbar */
348 rb->screens[l]->hline(param[l].curpos*text_w, (param[l].curpos+1)*text_w,
349 param[l].main_y+param[l].font_h-1);
350#endif
351 }
352 cur_blink = !cur_blink;
353
354
355 /* highlight the key that has focus */
356 FOR_NB_SCREENS(l)
357 {
358 rb->screens[l]->set_drawmode(DRMODE_COMPLEMENT);
359 rb->screens[l]->fillrect(param[l].font_w * param[l].x,
360 statusbar_size + param[l].font_h * param[l].y,
361 param[l].font_w, param[l].font_h);
362 rb->screens[l]->set_drawmode(DRMODE_SOLID);
363 }
364
365
366/* gui_syncstatusbar_draw(&statusbars, true);*/
367 FOR_NB_SCREENS(l)
368 rb->screens[l]->update();
369
370 button = rb->button_get_w_tmo(HZ/2);
371
372 switch ( button ) {
373
374 case KBD_ABORT:
375 FOR_NB_SCREENS(l)
376 rb->screens[l]->setfont(FONT_UI);
377
378 return -1;
379 break;
380
381 case KBD_RIGHT:
382 case KBD_RIGHT | BUTTON_REPEAT:
383 {
384 FOR_NB_SCREENS(l)
385 {
386 if (++param[l].x == param[l].max_chars) {
387 param[l].x = 0;
388 /* no dedicated flip key - flip page on wrap */
389 if (++param[l].page == param[l].pages)
390 param[l].page = 0;
391 }
392 k = (param[l].page*param[l].lines + param[l].y)*param[l].max_chars + param[l].x;
393 /*kbd_spellchar(param[l].kbd_buf[k]);*/
394 }
395 }
396 break;
397 case KBD_LEFT:
398 case KBD_LEFT | BUTTON_REPEAT:
399 {
400 FOR_NB_SCREENS(l)
401 {
402 if (param[l].x)
403 param[l].x--;
404 else
405 {
406 /* no dedicated flip key - flip page on wrap */
407 if (--param[l].page < 0)
408 param[l].page = (param[l].pages-1);
409 param[l].x = param[l].max_chars - 1;
410 }
411 k = (param[l].page*param[l].lines +
412 param[l].y)*param[l].max_chars + param[l].x;
413 /* kbd_spellchar(param[l].kbd_buf[k]);*/
414 }
415 }
416 break;
417
418 case KBD_DOWN:
419 case KBD_DOWN | BUTTON_REPEAT:
420 {
421 FOR_NB_SCREENS(l)
422 {
423 if (param[l].y < param[l].lines - 1)
424 param[l].y++;
425 else
426 param[l].y=0;
427 }
428 FOR_NB_SCREENS(l)
429 {
430 k = (param[l].page*param[l].lines + param[l].y)*
431 param[l].max_chars + param[l].x;
432 /*kbd_spellchar(param[l].kbd_buf[k]);*/
433 }
434 }
435 break;
436
437 case KBD_UP:
438 case KBD_UP | BUTTON_REPEAT:
439 {
440 FOR_NB_SCREENS(l)
441 {
442 if (param[l].y)
443 param[l].y--;
444 else
445 param[l].y = param[l].lines - 1;
446 }
447 FOR_NB_SCREENS(l)
448 {
449 k = (param[l].page*param[l].lines + param[l].y)*
450 param[l].max_chars + param[l].x;
451 /*kbd_spellchar(param[l].kbd_buf[k]);*/
452 }
453 }
454 break;
455
456 case KBD_SELECT:
457 {
458 if (button == KBD_SELECT)
459 char_screen = 0;
460
461 /* inserts the selected char */
462
463 /* find input char */
464 k = (param[char_screen].page*param[char_screen].lines +
465 param[char_screen].y)*param[char_screen].max_chars +
466 param[char_screen].x;
467 if (k < param[char_screen].nchars)
468 ch = param[char_screen].kbd_buf[k];
469 else
470 ch = ' ';
471 text[0]=ch;
472 done = true;
473 }
474 break;
475
476 case BUTTON_NONE:
477 /*gui_syncstatusbar_draw(&statusbars, false);*/
478
479 break;
480
481 default:
482 if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
483 FOR_NB_SCREENS(l)
484 rb->screens[l]->setfont(FONT_SYSFIXED);
485 break;
486
487 }
488 if (button != BUTTON_NONE)
489 {
490 lastbutton = button;
491 cur_blink = true;
492 }
493 }
494 FOR_NB_SCREENS(l)
495 rb->screens[l]->setfont(FONT_UI);
496 return 0;
497}
diff --git a/apps/plugins/zxbox/zxbox_keyb.h b/apps/plugins/zxbox/zxbox_keyb.h
new file mode 100644
index 0000000000..7a62ab0e96
--- /dev/null
+++ b/apps/plugins/zxbox/zxbox_keyb.h
@@ -0,0 +1 @@
int zx_kbd_input(char* text/*, int buflen*/);
diff --git a/apps/plugins/zxbox/zxconfig.h b/apps/plugins/zxbox/zxconfig.h
new file mode 100644
index 0000000000..e28dc5d6b7
--- /dev/null
+++ b/apps/plugins/zxbox/zxconfig.h
@@ -0,0 +1,61 @@
1#ifndef ZXCONFIG_H
2#define ZXCONFIG_H
3
4#include <plugin.h>
5extern int load_tap;
6extern bool clear_kbd;
7extern bool exit_requested;
8extern struct plugin_api* rb;
9extern void press_key(int c);
10extern long video_frames;
11extern long start_time;
12extern int intkeys[5];
13
14#define ZX_WIDTH 256
15#define ZX_HEIGHT 192
16
17#define SETTINGS_MIN_VERSION 2
18#define SETTINGS_VERSION 2
19
20/* undef not to use grayscale lib */
21#if !defined HAVE_LCD_COLOR && LCD_PIXELFORMAT != HORIZONTAL_PACKING
22#define USE_GRAY
23#define USE_BUFFERED_GRAY
24#endif
25
26
27#define Z80C
28#define MULTIUSER 0
29#define DATADIR "."
30
31/* Always define this for the spectrum emulator. */
32#define SPECT_MEM 1
33
34/* Define if sound driver is available. */
35#if CONFIG_CODEC == SWCODEC && !defined SIMULATOR
36#define HAVE_SOUND
37#endif
38
39/* Define this to use the inline intel assembly sections */
40#undef I386_ASM
41
42/* Define this to use an alternative way of passing the z80 processor
43 data to the z80 instruction emulation functions. May make emulation
44 faster on some machines, but not on intel, and sparc. */
45#undef PROCP /* seems not to have effect on arm targets */
46/* #define PROCP */
47
48/* Define to empty if the keyword does not work. */
49/* #undef const */
50
51/* Define to `unsigned' if <sys/types.h> doesn't define. */
52/* #undef size_t */
53
54/* Define if you have the ANSI C header files. */
55#define STDC_HEADERS 1
56
57/* Define if your processor stores words with the most significant
58 byte first (like Motorola and SPARC, unlike Intel and VAX). */
59/* #undef WORDS_BIGENDIAN */
60
61#endif
diff --git a/apps/plugins/zxbox/zxvid_16bpp.c b/apps/plugins/zxbox/zxvid_16bpp.c
new file mode 100644
index 0000000000..235efcbcb2
--- /dev/null
+++ b/apps/plugins/zxbox/zxvid_16bpp.c
@@ -0,0 +1,99 @@
1#include "zxvid_com.h"
2
3#if LCD_DEPTH > 4
4/* screen routines for color targets */
5
6/*
7use for slightly different colors
8#define N0 0x04
9#define N1 0x34
10
11#define B0 0x08
12#define B1 0x3F
13*/
14
15#define N0 0x00
16#define N1 0xAA
17
18#define B0 0x55
19#define B1 0xFF
20struct rgb norm_colors[COLORNUM]={
21 {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
22 {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},
23
24 {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
25 {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
26};
27
28
29/* since emulator uses array of bytes for screen representation
30 * short 16b colors won't fit there */
31short _16bpp_colors[16] IBSS_ATTR;
32
33void init_spect_scr(void)
34{
35 int i;
36
37 for(i = 0; i < 16; i++)
38 sp_colors[i] = i;
39 for(i = 0; i < 16; i++)
40 _16bpp_colors[i] = LCD_RGBPACK(norm_colors[i].r,norm_colors[i].g,norm_colors[i].b);
41 if ( settings.invert_colors ){
42 for ( i = 0 ; i < 16 ; i++ )
43 _16bpp_colors[i] = 0xFFFFFF - _16bpp_colors[i];
44 }
45 sp_image = (char *) &image_array;
46 spscr_init_mask_color();
47 spscr_init_line_pointers(HEIGHT);
48
49}
50
51void update_screen(void)
52{
53 char str[80];
54 fb_data *frameb;
55
56 int y=0;
57
58#if LCD_HEIGHT >= ZX_HEIGHT && LCD_WIDTH >= ZX_WIDTH
59 byte *scrptr;
60 scrptr = (byte *) SPNM(image);
61 frameb = rb->lcd_framebuffer;
62 for ( y = 0 ; y < HEIGHT*WIDTH; y++ ){
63 frameb[y] = _16bpp_colors[(unsigned)sp_image[y]];
64 }
65
66#else
67 int x=0;
68 int srcx, srcy=0; /* x / y coordinates in source image */
69 unsigned char* image;
70 image = sp_image + ( (Y_OFF)*(WIDTH) ) + X_OFF;
71 frameb = rb->lcd_framebuffer;
72 for(y = 0; y < LCD_HEIGHT; y++)
73 {
74 srcx = 0; /* reset our x counter before each row... */
75 for(x = 0; x < LCD_WIDTH; x++)
76 {
77 *frameb = _16bpp_colors[image[srcx>>16]];
78 srcx += X_STEP; /* move through source image */
79 frameb++;
80 }
81 srcy += Y_STEP; /* move through the source image... */
82 image += (srcy>>16)*WIDTH; /* and possibly to the next row. */
83 srcy &= 0xffff; /* set up the y-coordinate between 0 and 1 */
84 }
85
86#endif
87 if ( settings.showfps ) {
88 int percent=0;
89 int TPF = HZ/50;/* ticks per frame */
90 if ((*rb->current_tick-start_time) > TPF )
91 percent = 100*video_frames/((*rb->current_tick-start_time)/TPF);
92 rb->snprintf(str,sizeof(str),"%d %%",percent);
93 rb->lcd_putsxy(0,0,str);
94 }
95 rb -> lcd_update();
96}
97
98
99#endif /* HAVE_LCD_COLOR */
diff --git a/apps/plugins/zxbox/zxvid_4bpp.c b/apps/plugins/zxbox/zxvid_4bpp.c
new file mode 100644
index 0000000000..e9943d9571
--- /dev/null
+++ b/apps/plugins/zxbox/zxvid_4bpp.c
@@ -0,0 +1,81 @@
1#include "zxvid_com.h"
2
3#if !defined USE_GRAY && LCD_PIXELFORMAT == HORIZONTAL_PACKING && LCD_DEPTH < 4
4/* screen routines for greyscale targets not using greyscale lib */
5#define FB_WIDTH ((LCD_WIDTH+3)/4)
6unsigned char pixmask[4] ICONST_ATTR = {
7 0xC0, 0x30, 0x0C, 0x03
8 };
9
10void init_spect_scr(void)
11{
12 sp_colors[0] = 0;/* BLACK ? */
13 sp_colors[1] = 1;/* BLUE ? */
14 sp_colors[2] = 1;/* RED ? */
15 sp_colors[3] = 1;/* MAGENTA ? */
16 sp_colors[4] = 2;/* GREEN ? */
17 sp_colors[5] = 2;/* CYAN ? */
18 sp_colors[6] = 3;/* YELLOW ? */
19 sp_colors[7] = 3;/* WHITE ? */
20
21 /* same but 'light/bright' colors */
22 sp_colors[8] = 1;
23 sp_colors[9] = 1;
24 sp_colors[10] = 1;
25 sp_colors[11] = 1;
26 sp_colors[12] = 2;
27 sp_colors[13] = 2;
28 sp_colors[14] = 3;
29 sp_colors[15] = 3;
30
31 if ( !settings.invert_colors ){
32 int i;
33 for ( i = 0 ; i < 16 ; i++ )
34 sp_colors[i] = 3 - sp_colors[i];
35 }
36 sp_image = (char *) &image_array;
37 spscr_init_mask_color();
38 spscr_init_line_pointers(HEIGHT);
39
40}
41void update_screen(void)
42{
43 char str[80];
44
45 fb_data *frameb;
46 int y=0;
47 int x=0;
48 unsigned char* image;
49 int srcx, srcy=0; /* x / y coordinates in source image */
50 image = sp_image + ( (Y_OFF)*(WIDTH) ) + X_OFF;
51 unsigned mask;
52
53 for(y = 0; y < LCD_HEIGHT; y++)
54 {
55 frameb = rb->lcd_framebuffer + (y) * FB_WIDTH;
56 srcx = 0; /* reset our x counter before each row... */
57 for(x = 0; x < LCD_WIDTH; x++)
58 {
59 mask = pixmask[x & 3];
60 frameb[x >> 2] = (frameb[x >> 2] & ~mask) | ((image[(srcx>>16)]&0x3) << ((3-(x & 3 )) * 2 ));
61 srcx += X_STEP; /* move through source image */
62 }
63 srcy += Y_STEP; /* move through the source image... */
64 image += (srcy>>16)*WIDTH; /* and possibly to the next row. */
65 srcy &= 0xffff; /* set up the y-coordinate between 0 and 1 */
66 }
67
68 if ( settings.showfps ) {
69 int percent=0;
70 int TPF = HZ/50;/* ticks per frame */
71 if ((*rb->current_tick-start_time) > TPF )
72 percent = 100*video_frames/((*rb->current_tick-start_time)/TPF);
73 rb->snprintf(str,sizeof(str),"%d %%",percent);
74 rb->lcd_putsxy(0,0,str);
75 }
76
77
78 rb -> lcd_update();
79}
80
81#endif
diff --git a/apps/plugins/zxbox/zxvid_com.h b/apps/plugins/zxbox/zxvid_com.h
new file mode 100644
index 0000000000..0483251b96
--- /dev/null
+++ b/apps/plugins/zxbox/zxvid_com.h
@@ -0,0 +1,28 @@
1#ifndef ZXVIDCOMMON_H
2#define ZXVIDCOMMON_H
3#include "zxconfig.h"
4
5#ifdef USE_GRAY
6#include "../lib/gray.h"
7#endif
8
9#include "spscr_p.h"
10#include "spmain.h"
11#include "spperif.h"
12
13#if LCD_HEIGHT >= ZX_HEIGHT && LCD_WIDTH >= ZX_WIDTH
14#define WIDTH LCD_WIDTH
15#define HEIGHT LCD_HEIGHT
16#else
17#define WIDTH 320 /* 256 */
18#define HEIGHT 200 /* 192 */
19#define X_OFF ( (WIDTH - ZX_WIDTH)/2)
20#define Y_OFF ( (HEIGHT - ZX_HEIGHT)/2)
21/* calculate distance (in source) between pixels*/
22#define X_STEP ((ZX_WIDTH<<16) / LCD_WIDTH)
23#define Y_STEP ((ZX_HEIGHT<<16) / LCD_HEIGHT)
24#endif
25
26extern unsigned char image_array [ HEIGHT * WIDTH ];
27
28#endif /* ZXVIDCOMMON_H */
diff --git a/apps/plugins/zxbox/zxvid_grey.c b/apps/plugins/zxbox/zxvid_grey.c
new file mode 100644
index 0000000000..8491e6bf18
--- /dev/null
+++ b/apps/plugins/zxbox/zxvid_grey.c
@@ -0,0 +1,97 @@
1#include "zxvid_com.h"
2#if !defined HAVE_LCD_COLOR && defined USE_GRAY
3/*
4use for slightly different colors
5#define N0 0x04
6#define N1 0x34
7
8#define B0 0x08
9#define B1 0x3F
10*/
11
12/* these ones are the same as for color targets ... may be tweak for greyscale? */
13#define N0 0x00
14#define N1 0xAA
15
16#define B0 0x55
17#define B1 0xFF
18static unsigned char graybuffer[LCD_HEIGHT*LCD_WIDTH] IBSS_ATTR; /* off screen buffer */
19
20struct rgb norm_colors[COLORNUM]={
21 {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
22 {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},
23
24 {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
25 {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
26};
27
28void init_spect_scr(void)
29{
30 int i;
31 for(i = 0; i < 16; i++)
32 sp_colors[i] = 0.3*norm_colors[i].r + 0.59*norm_colors[i].g + 0.11*norm_colors[i].b;
33 if ( settings.invert_colors ){
34 int i;
35 for ( i = 0 ; i < 16 ; i++ )
36 sp_colors[i] = 255 - sp_colors[i];
37 }
38
39 sp_image = (char *) &image_array;
40 spscr_init_mask_color();
41 spscr_init_line_pointers(HEIGHT);
42}
43
44
45void update_screen(void)
46{
47 char str[80];
48
49 int y=0;
50 int x=0;
51 unsigned char* image;
52 int srcx, srcy=0; /* x / y coordinates in source image */
53 image = sp_image + ( (Y_OFF)*(WIDTH) ) + X_OFF;
54 unsigned char* buf_ptr;
55 buf_ptr = (unsigned char*) &graybuffer;
56 for(y = 0; y < LCD_HEIGHT; y++)
57 {
58 srcx = 0; /* reset our x counter before each row... */
59 for(x = 0; x < LCD_WIDTH; x++)
60 {
61 *buf_ptr=image[(srcx>>16)];
62 srcx += X_STEP; /* move through source image */
63 buf_ptr++;
64 }
65 srcy += Y_STEP; /* move through the source image... */
66 image += (srcy>>16)*WIDTH; /* and possibly to the next row. */
67 srcy &= 0xffff; /* set up the y-coordinate between 0 and 1 */
68 }
69
70#ifdef USE_BUFFERED_GRAY
71 gray_gray_bitmap(graybuffer, 0, 0, LCD_WIDTH, LCD_HEIGHT);
72#endif
73
74 if ( settings.showfps ) {
75 int percent=0;
76 int TPF = HZ/50;/* ticks per frame */
77 if ((*rb->current_tick-start_time) > TPF )
78 percent = 100*video_frames/((*rb->current_tick-start_time)/TPF);
79 rb->snprintf(str,sizeof(str),"%d %%",percent);
80#if defined USE_BUFFERED_GRAY
81 gray_putsxy(0,0,str);
82#else
83 LOGF(str);
84#endif
85
86 }
87
88
89#if defined USE_BUFFERED_GRAY
90 gray_update();
91#else
92 gray_ub_gray_bitmap(graybuffer, 0, 0, LCD_WIDTH, LCD_HEIGHT);
93#endif
94
95}
96
97#endif