aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/arm/COPYING339
-rw-r--r--sim/arm/Makefile.orig120
-rw-r--r--sim/arm/README.Cygnus27
-rw-r--r--sim/arm/README.orig58
-rw-r--r--sim/arm/arm.mt3
-rw-r--r--sim/arm/armfpe.h1351
-rw-r--r--sim/arm/armopts.h30
-rw-r--r--sim/arm/armos.h64
-rw-r--r--sim/arm/armrdi.c1042
-rw-r--r--sim/arm/bag.h42
-rw-r--r--sim/arm/communicate.c221
-rw-r--r--sim/arm/communicate.h37
-rw-r--r--sim/arm/configure.in35
-rw-r--r--sim/arm/dbg_conf.h48
-rw-r--r--sim/arm/dbg_cp.h62
-rw-r--r--sim/arm/dbg_hif.h47
-rw-r--r--sim/arm/dbg_rdi.h323
-rw-r--r--sim/arm/gdbhost.c107
-rw-r--r--sim/arm/gdbhost.h23
-rw-r--r--sim/arm/kid.c510
-rw-r--r--sim/arm/main.c183
-rw-r--r--sim/arm/parent.c483
-rw-r--r--sim/arm/run.c155
23 files changed, 5310 insertions, 0 deletions
diff --git a/sim/arm/COPYING b/sim/arm/COPYING
new file mode 100644
index 0000000..a43ea21
--- /dev/null
+++ b/sim/arm/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/sim/arm/Makefile.orig b/sim/arm/Makefile.orig
new file mode 100644
index 0000000..020045c
--- /dev/null
+++ b/sim/arm/Makefile.orig
@@ -0,0 +1,120 @@
+# Makefile for ARMulator: ARM6 Instruction Emulator.
+# Copyright (C) 1994 Advanced RISC Machines Ltd.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# These variables can be overridden
+
+#Default endianness of the processor (LITTLEEND or BIGEND)
+ENDIAN=LITTLEEND
+
+prefix=/usr/local
+CC = gcc
+CFLAGS = -O2 -D$(ENDIAN) $(CFL)
+INSTALL_DIR = $(prefix)/bin
+INSTALL=cp
+
+# Everything else should be ok as it is.
+
+OBJS = armcopro.o armemu26.o armemu32.o arminit.o armos.o \
+ armsupp.o main.o parent.o kid.o communicate.o gdbhost.o \
+ bag.o armrdi.o
+
+SRCS = armcopro.c armemu.c arminit.c armos.c armvirt.c \
+ armsupp.c main.c parent.c kid.c communicate.c gdbhost.c \
+ bag.c armrdi.c
+INCS = armdefs.h armemu.h armfpe.h armopts.h armos.h bag.h communicate.h \
+ dbg_conf.h dbg_cp.h dbg_hif.h dbg_rdi.h gdbhost.h
+
+TARED = $(SRCS) $(INCS) README COPYING Makefile
+
+MODEL = armvirt
+
+VER=1.0
+
+all: armul
+
+install: all
+ $(INSTALL) armul $(INSTALL_DIR)
+
+armul: $(OBJS) $(MODEL).o
+ $(CC) $(CFLAGS) $(OBJS) $(MODEL).o -o $@ -lm -lXext -lX11
+
+clean:
+ rm -f *.o armul core
+
+distclean: clean
+ rm -f *~
+
+realclean: distclean
+ rm -f *.tar *.tar.gz
+
+armul.tar.gz:
+ rm -rf armul-$(VER)
+ mkdir armul-$(VER)
+ cd armul-$(VER) ; \
+ for file in $(TARED) ; do \
+ ln ../$${file} . ; \
+ done
+ tar cf armul.tar armul-$(VER)
+ gzip armul.tar
+ mv armul.tar.gz armul-$(VER).tar.gz
+
+# memory models
+
+armvirt.o: armdefs.h armvirt.c
+ $(CC) $(CFLAGS) -c $*.c
+
+# other objects
+
+armos.o: armos.c armdefs.h armos.h armfpe.h
+ $(CC) $(CFLAGS) -c $*.c
+
+armcopro.o: armcopro.c armdefs.h
+ $(CC) $(CFLAGS) -c $*.c
+
+armemu26.o: armemu.c armdefs.h armemu.h
+ $(CC) $(CFLAGS) -o armemu26.o -c armemu.c
+
+armemu32.o: armemu.c armdefs.h armemu.h
+ $(CC) $(CFLAGS) -o armemu32.o -DMODE32 -c armemu.c
+
+arminit.o: arminit.c armdefs.h armemu.h
+ $(CC) $(CFLAGS) -c $*.c
+
+armrdi.o: armrdi.c armdefs.h armemu.h armos.h dbg_cp.h dbg_conf.h dbg_rdi.h \
+ dbg_hif.h communicate.h
+ $(CC) $(CFLAGS) -c $*.c
+
+armsupp.o: armsupp.c armdefs.h armemu.h
+ $(CC) $(CFLAGS) -c $*.c
+
+kid.o: kid.c armdefs.h dbg_conf.h dbg_hif.h dbg_rdi.h gdbhost.h communicate.h
+ $(CC) $(CFLAGS) -c $*.c
+
+main.o: main.c armdefs.h dbg_rdi.h dbg_conf.h
+ $(CC) $(CFLAGS) -c $*.c
+
+communicate.o: communicate.c armdefs.h
+ $(CC) $(CFLAGS) -c $*.c
+
+bag.o: bag.c bag.h
+ $(CC) $(CFLAGS) -c $*.c
+
+gdbhost.o: gdbhost.c armdefs.h communicate.h dbg_rdi.h armos.h
+ $(CC) $(CFLAGS) -c $*.c
+
+parent.o: parent.c armdefs.h dbg_rdi.h communicate.h
+ $(CC) $(CFLAGS) -c $*.c
diff --git a/sim/arm/README.Cygnus b/sim/arm/README.Cygnus
new file mode 100644
index 0000000..14dd5b4
--- /dev/null
+++ b/sim/arm/README.Cygnus
@@ -0,0 +1,27 @@
+
+This directory contains the standard release of the ARMulator from
+Advanced RISC Machines, and was ftp'd from.
+
+ftp.cl.cam.ac.uk:/arm/gnu
+
+It likes to use TCP/IP between the simulator and the host, which is
+nice, but is a pain to use under anything non-unix.
+
+I've added created a new Makefile.in (the original in Makefile.orig)
+to build a version of the simulator without the TCP/IP stuff, and a
+wrapper.c to link directly into gdb and the run command.
+
+It should be possible (barring major changes in the layout of
+the armulator) to upgrade the simulator by copying all the files
+out of a release into this directory and renaming the Makefile.
+
+(Except that I changed armos.c to understand our fcntl flags
+and made it possible to set breakpoints simply)
+
+Steve
+
+sac@cygnus.com
+
+Mon May 15 12:03:28 PDT 1995
+
+
diff --git a/sim/arm/README.orig b/sim/arm/README.orig
new file mode 100644
index 0000000..d131a39
--- /dev/null
+++ b/sim/arm/README.orig
@@ -0,0 +1,58 @@
+This is the README file for ARMulator version 1.0, an ARM6 instruction
+emulator.
+
+Configuration:
+ The armulator has one configuration option, the default endianness
+ of the processor. This can be changed by building with ENDIAN=BIGEND
+ to produce a big-endian variant. The debugger can also select the
+ endianness at run-time.
+
+Build instructions:
+
+ This program is known to compile using GCC 2.6.0 on a Sun4. Other
+ builds are untested. It almost certainly will not work on non-32bit
+ machines.
+
+ To build the program simply type make in the source directory,
+ followed by "make install"
+
+Using the emulator:
+
+ The emulator runs as a separate process, and communicates with a
+ debugger via tcp. To start the emulator type
+ armul <socknum>
+ where socknum is any number between 1024 and 65535. If the socket is
+ already in use, armul will exit with an error.
+
+ This version of armul has been designed to work with gdb-4.13
+ with the ARM/RDP/RDI extensions added (available separately). To
+ connect gdb to the ARMulator, start gdb and type
+ target arm <hostname>:<socknum>
+ where hostname is the name of the machine on which the armulator
+ is running, and socknum is the socket number specified when armul
+ was started.
+
+IMPORTANT:
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Advanced RISC Machines welcomes bug reports for this package,
+ but no undertaking can be made to provide support or reply to email.
+ Bugs should be sent to:
+ armgnu@armltd.co.uk
+
+
+
+ \ No newline at end of file
diff --git a/sim/arm/arm.mt b/sim/arm/arm.mt
new file mode 100644
index 0000000..e3e0c19
--- /dev/null
+++ b/sim/arm/arm.mt
@@ -0,0 +1,3 @@
+ALL=all-arm
+CLEAN=clean-arm
+DO_INSTALL=install-arm
diff --git a/sim/arm/armfpe.h b/sim/arm/armfpe.h
new file mode 100644
index 0000000..91c8f61
--- /dev/null
+++ b/sim/arm/armfpe.h
@@ -0,0 +1,1351 @@
+/* armfpe.h -- ARMulator pre-compiled FPE: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* Array containing the Floating Point Emualtor (FPE). */
+
+
+unsigned long fpecode[] = {
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00070000,0x00000000,0xe92d400e,0xeb0013ef,
+0xe28f00d4,0xe1a00120,0xe38004ea,0xe3a01004,
+0xe5912000,0xe24f3028,0xe1500002,0x15832000,
+0x15810000,0xe3a00001,0xe8bd800e,0xe28d9040,
+0xe1a0a00e,0xe24f7048,0xe597b000,0xe20b74ee,
+0xe14f8000,0xe2088040,0xe388809b,0xe121f008,
+0xe35704ea,0x004bb007,0x01a0b10b,0x028bf00c,
+0xe20b733b,0xe3570339,0x01a0ba0b,0x01a0ba2b,
+0x059bb00c,0x0249800c,0x08880e00,0x0919ff80,
+0xe24f7094,0xe1a0f007,0xe14f8000,0xe2088040,
+0xe3888093,0xe121f008,0xe8dd7fff,0xe1a00000,
+0xe28dd03c,0xe8fd8000,0xe14f8000,0xe2088040,
+0xe3888093,0xe121f008,0xe8bd1fff,0xe28dd00c,
+0xe1b0f00e,0xe14f8000,0xe2088040,0xe3888093,
+0xe121f008,0xe28dd01c,0xe8bd1f80,0xe28dd00c,
+0xe1b0f00e,0x00002100,0xe90d4007,0xe14f0000,
+0xe24d1010,0xe10f2000,0xe20220c0,0xe3822003,
+0xe121f002,0xe169f000,0xe8914007,0xe24dd040,
+0xe8cd7fff,0xe24fcf6b,0xe58de03c,0xe24ea004,
+0xe14f9000,0xe20990c0,0xe3899003,0xe121f009,
+0xe4ba9008,0xe20987fe,0xe2197010,0xe0077aa9,
+0xe0288a07,0x02097402,0x00077509,0x00888007,
+0xe2097c0f,0xe3370c01,0x0209733e,0x0337033a,
+0x008ff8a8,0xea00009f,0xea0003b7,0xea0003b6,
+0xea000307,0xea000306,0xea0003b3,0xea0003b2,
+0xea000303,0xea000302,0xea0003c3,0xea0003c2,
+0xea00030d,0xea00030c,0xea0003bf,0xea0003be,
+0xea000309,0xea000308,0xea0003cf,0xea0003ce,
+0xea000314,0xea000313,0xea0003cb,0xea0003ca,
+0xea000310,0xea00030f,0xea0003db,0xea0003da,
+0xea00031a,0xea000319,0xea0003d7,0xea0003d6,
+0xea000316,0xea000315,0xea0003e7,0xea0003e6,
+0xea000321,0xea000320,0xea0003f7,0xea0003f6,
+0xea00032b,0xea00032a,0xea000449,0xea000448,
+0xea000335,0xea000334,0xea000459,0xea000458,
+0xea000340,0xea00033f,0xea000469,0xea000468,
+0xea00034b,0xea00034a,0xea000479,0xea000478,
+0xea000355,0xea000354,0xea000489,0xea000488,
+0xea00035f,0xea00035e,0xea000499,0xea000498,
+0xea00036a,0xea000369,0xea000ac8,0xea000ac5,
+0xea000c3d,0xea000c3a,0xea000b7b,0xea000b78,
+0xea000b79,0xea000b76,0xea000d34,0xea000d31,
+0xea000d08,0xea000d05,0xea000e34,0xea000e31,
+0xea000e1c,0xea000e19,0xea000ecf,0xea000ecc,
+0xea000c2d,0xea000c2a,0xea000d28,0xea000d25,
+0xea000cfc,0xea000cf9,0xea00123d,0xea00123a,
+0xeaffff55,0xeaffff54,0xeaffff53,0xeaffff52,
+0xeaffff51,0xeaffff50,0xea0007b8,0xea0007ec,
+0xea00073c,0xea00073b,0xea000806,0xea000805,
+0xea00080f,0xea00080e,0xeaffff47,0xeaffff46,
+0xeaffff45,0xeaffff44,0xeaffff43,0xeaffff42,
+0xeaffff41,0xeaffff40,0xeaffff3f,0xeaffff3e,
+0xea00086f,0xea00086e,0xeaffff3b,0xeaffff3a,
+0xea00086b,0xea00086a,0xeaffff37,0xeaffff36,
+0xea0007ff,0xea0007fe,0xeaffff33,0xeaffff32,
+0xea0007fb,0xea0007fa,0xea000914,0xea0008f3,
+0xea00091f,0xea0008fb,0xea00092b,0xea000904,
+0xea0009dc,0xea0009d9,0xea0009fd,0xea0009fa,
+0xea000ef8,0xea000ef5,0xea000ef6,0xea000ef3,
+0xea000f9d,0xea000f9a,0xea00111e,0xea00111b,
+0xea00111c,0xea001119,0xea00104e,0xea00104b,
+0xea001147,0xea001144,0xea001145,0xea001142,
+0xea00125a,0xea001257,0xeaffff13,0xeaffff12,
+0xeaffff11,0xeaffff10,0xe3190c0e,0x1affff0e,
+0xe3190c01,0x13190302,0x0affff0b,0xe28fb016,
+0xe79b7d27,0xe14fb000,0xe1a0be2b,0xe28bb010,
+0xe1170b37,0x0affff51,0xeaffff29,0x8000f0f0,
+0x80000f0f,0x8000cccc,0x80003333,0x8000ff00,
+0x800000ff,0x8000aaaa,0x80005555,0x8000cfcf,
+0x80003030,0x800055aa,0x8000aa55,0x80005faf,
+0x8000a050,0x80000000,0x8000ffff,0xe1300007,
+0x5a000002,0xea00004a,0xe3100102,0x1a000048,
+0xe053400b,0x4a00002d,0xe2745020,0xda00001b,
+0xe092243a,0x20822518,0x30922518,0xe0b11438,
+0xe1a0451a,0x2a000006,0xe0922fa4,0xe2b11000,
+0x31b0f00e,0xe3a01102,0xe2833001,0xe1a040a4,
+0xe1b0f00e,0xe2833001,0xe1a040a4,0xe1844f82,
+0xe1a020a2,0xe1822f81,0xe1a01061,0xe0922fa4,
+0xe2a11000,0xe1b0f00e,0xe1a04538,0xe0922fa4,
+0xe2b11000,0x23a01102,0x22833001,0xe1b0f00e,
+0xe2545040,0xaafffff7,0xe2444020,0xe2645020,
+0xe0922438,0xe2b11000,0xe1a04518,0xe184443a,
+0x2affffe7,0xe0922fa4,0xe2b11000,0x31b0f00e,
+0xe3a01102,0xe2833001,0xe1a040a4,0xe1b0f00e,
+0xe2644000,0xe1a0300b,0xe1a05001,0xe1a01008,
+0xe1a08005,0xe1a05002,0xe1a0200a,0xe1a0a005,
+0xe2745020,0xdaffffe5,0xe092243a,0x20822518,
+0x30922518,0xe0b11438,0xe1a0451a,0x2affffd0,
+0xe0922fa4,0xe2b11000,0x31b0f00e,0xe3a01102,
+0xe2833001,0xe1a040a4,0xe1b0f00e,0xe3100102,
+0x1affffb6,0xe053600b,0x4a00003d,0x01510008,
+0x0152000a,0x0a00004f,0x3a000039,0xe3a04000,
+0xe2765020,0xda00001a,0xe054451a,0xe0d2263a,
+0x30422518,0x20522518,0xe0d11638,0x5a000002,
+0xe0922fa4,0xe2a11000,0xe1b0f00e,0xe0944004,
+0xe0b22002,0xe0b11001,0xe2433001,0x5afffffa,
+0xe0922fa4,0xe2b11000,0x31b0f00e,0xe3a01102,
+0xe2833001,0xe1a040a4,0xe1b0f00e,0xe0544538,
+0x41b0f00e,0xe2d22000,0xe2d11000,0x41b0f00e,
+0xeaffffed,0xe3a04000,0xe2565040,0xaafffff6,
+0xe2466020,0xe2665020,0xe054751a,0xe0d4463a,
+0x30444518,0x20544518,0xe0d22638,0xe2d11000,
+0x5a000002,0xe0922fa4,0xe2a11000,0xe1b0f00e,
+0xe0977007,0xe0b44004,0xe0b22002,0xe0b11001,
+0xe2433001,0x5afffff9,0xe0922fa4,0xe2b11000,
+0x31b0f00e,0xe3a01102,0xe2833001,0xe1a040a4,
+0xe1b0f00e,0xe2666000,0xe2200102,0xe1a0300b,
+0xe1a05001,0xe1a01008,0xe1a08005,0xe1a05002,
+0xe1a0200a,0xe1a0a005,0xe3a04000,0xe2765020,
+0xdaffffd7,0xe054451a,0xe0d2263a,0x30422518,
+0x20522518,0xe0d11638,0x5affffbf,0xe0922fa4,
+0xe2a11000,0xe1b0f00e,0xe3a03000,0xe3a02000,
+0xe3a01000,0xe3a04000,0xe1b0f00e,0xe1a07000,
+0xe1a08001,0xe1a0a002,0xe1a0b003,0xe0200007,
+0xe1914002,0x1198400a,0x0afffff2,0xe3b054ff,
+0xe0a3300b,0xe185b425,0xe043392b,0xe92c4209,
+0xe1a04821,0xe1c1500b,0xe1a06822,0xe1c2700b,
+0xe1c8900b,0xe1a08828,0xe1cab00b,0xe1a0a82a,
+0xe0030b96,0xe0020b94,0xe0010994,0xe0000a97,
+0xe0933000,0xe0000a95,0xe0b22000,0xe0000895,
+0xe0b11000,0x33a0e000,0x23a0e001,0xe0000996,
+0xe0922000,0xe2b11000,0xe2aee000,0xe0000897,
+0xe0922000,0xe2b11000,0xe2aee000,0xe18ee803,
+0xe1a03823,0xe1833802,0xe1a02822,0xe1822801,
+0xe1a01821,0xe181180e,0xe3cee0ff,0xe0000b95,
+0xe00b0b97,0xe09eb00b,0xe0b33000,0xe0000896,
+0xe0b22000,0xe0000894,0xe0a11000,0xe0000a94,
+0xe00a0a96,0xe09aa003,0xe0b22000,0xe2a11000,
+0xe0000997,0xe09a4000,0xe0000995,0xe0b22000,
+0xe2b11000,0xe8bc4209,0x4a000005,0xe09bb00b,
+0xe0b44004,0xe0b22002,0xe0b11001,0xe2433001,
+0x5afffff9,0xe0922fa4,0xe2b11000,0x31b0f00e,
+0xe3a01102,0xe2833001,0xe1a040a4,0xe1b0f00e,
+0xe1a07000,0xe1a08001,0xe1a0a002,0xe1a0b003,
+0xe3a00000,0xe3a01102,0xe3b02100,0xe2e23901,
+0xe0200007,0xe1914002,0x1198400a,0x0affff9d,
+0xe043300b,0xe2833901,0xe2433001,0xe3a0b000,
+0xe052500a,0xe0d14008,0x23a01003,0x2a00000c,
+0xe1a05002,0xe1a04001,0xe3a01001,0xe2433001,
+0xe0955005,0xe0b44004,0xe2abb000,0xe055700a,
+0xe0d46008,0x31b0b0ab,0x21a05007,0x21a04006,
+0xe0a11001,0xe0955005,0xe0b44004,0xe2abb000,
+0xe055700a,0xe0d46008,0x31b0b0ab,0x21a05007,
+0x21a04006,0xe0a11001,0xe0955005,0xe0b44004,
+0xe2abb000,0xe055700a,0xe0d46008,0x31b0b0ab,
+0x21a05007,0x21a04006,0xe0a11001,0xe0955005,
+0xe0b44004,0xe2abb000,0xe055700a,0xe0d46008,
+0x31b0b0ab,0x21a05007,0x21a04006,0xe0b11001,
+0x3affffda,0xe1942005,0x01b0f00e,0xe3a02001,
+0xe0955005,0xe0b44004,0xe2abb000,0xe055700a,
+0xe0d46008,0x31b0b0ab,0x21a05007,0x21a04006,
+0xe0a22002,0xe0955005,0xe0b44004,0xe2abb000,
+0xe055700a,0xe0d46008,0x31b0b0ab,0x21a05007,
+0x21a04006,0xe0a22002,0xe0955005,0xe0b44004,
+0xe2abb000,0xe055700a,0xe0d46008,0x31b0b0ab,
+0x21a05007,0x21a04006,0xe0a22002,0xe0955005,
+0xe0b44004,0xe2abb000,0xe055700a,0xe0d46008,
+0x31b0b0ab,0x21a05007,0x21a04006,0xe0b22002,
+0x3affffda,0xe0955005,0xe0b44004,0x2a000001,
+0xe1540008,0x0155000a,0xe2b22000,0xe2b11000,
+0x31b0f00e,0xe2a33000,0xe3a01102,0xe1b0f00e,
+0xe1b04883,0x0affff37,0xe2833901,0xe2433001,
+0xe1b030a3,0xe1a05002,0x32414102,0x22414101,
+0x33a07201,0x23a07202,0xe3a01102,0xe0955005,
+0xe0b44004,0xe0216007,0x31540006,0x20444006,
+0x20211087,0xe1b070e7,0x5afffff7,0xe1942005,
+0x01b0f00e,0xe3a02000,0xe0955005,0xe0b44004,
+0xe0a00000,0xe0226007,0xe055a006,0xe0d48001,
+0x31b000a0,0x21a0500a,0x21a04008,0x20222087,
+0x20211fa7,0xe1b070a7,0x1afffff2,0xe0955005,
+0xe0b44004,0xe0b70007,0xe0d5a002,0xe0d48001,
+0x31b000a0,0x21a0500a,0x21a04008,0x22222001,
+0x23a07102,0xe3a00000,0xe0977007,0xe0b55005,
+0xe0b44004,0x2a000002,0xe1540001,0x01550002,
+0x03570101,0xe2b22000,0xe2b11000,0xe2a33000,
+0x23a01102,0xe1b0f00e,0xe1b07004,0x42644000,
+0xe3a0b901,0xe3a0a000,0xe1a08004,0xe1b04828,
+0x01a08808,0x128bb010,0xe1b04c28,0x01a08408,
+0x128bb008,0xe1b04e28,0x01a08208,0x128bb004,
+0xe1b04f28,0x01a08108,0x128bb002,0xe1b04fa8,
+0x01a08088,0x024bb001,0xe1b0f00e,0xe1a07000,
+0xe1a0b003,0xe24b40fe,0xe2544c3f,0xda000011,
+0xe2745020,0x4a000003,0xe3a0a000,0xe1a08531,
+0xe1a08518,0xe1b0f00e,0xe1a08001,0xe1a0a002,
+0xe2745040,0x41b0f00e,0xe1a0a53a,0xe1a0a51a,
+0xe1b0f00e,0x03a04001,0x03a08102,0xe3a0a000,
+0x028bb001,0x01b0f00e,0xe3a04000,0xe3a08000,
+0xe3a0a000,0xe3a0b000,0xe1b0f00e,0xe1a07000,
+0xe1a0b003,0xe24b40fe,0xe2544c3f,0xdafffff0,
+0xe2745020,0x4a000007,0xe3a0a000,0xe1b04531,
+0xe2a44000,0xe1b08514,0x31b0f00e,0xe1a08068,
+0xe28bb001,0xe1b0f00e,0xe1a08001,0xe1a0a002,
+0xe2745040,0xe3e04000,0x41b0f00e,0xe1b0a53a,
+0xe2aaa000,0xe1b0a51a,0xe2b88000,0x31b0f00e,
+0xe1a0a0aa,0xe18aaf88,0xe1a08068,0xe28bb001,
+0xe1b0f00e,0xe38ee101,0xe24340fe,0xe2544c3f,
+0xda000032,0xe2745020,0x4a000018,0xe1a08411,
+0x01a08002,0x11a0a002,0x03a0a000,0xe3a02000,
+0xe1a01531,0xe2194060,0x1a000007,0xe19aa088,
+0x00088f81,0xe0911fa8,0x31b01511,0x31b0f00e,
+0xe1a01061,0xe2833001,0xe1b0f00e,0xe3540060,
+0x1198a00a,0x0a000003,0xe0304d04,0x5a000001,
+0xe2911001,0xeafffff3,0xe1a01511,0xe1b0f00e,
+0xe2745040,0xd1b0f00e,0xe2444020,0xe1a08412,
+0xe1b02532,0xe2194060,0x1a00000a,0xe1b0a088,
+0x00088f82,0xe0822fa8,0xe1b02512,0xe2b11000,
+0x31b0f00e,0xe1a020a2,0xe1822f81,0xe1a01061,
+0xe2833001,0xe1b0f00e,0xe3540060,0x13580000,
+0x0afffff4,0xe0304d04,0x42822001,0xeafffff1,
+0x0a000011,0xe2194060,0x1a000006,0xe1918002,
+0x01b0f00e,0xe3a01000,0xe3a02000,0xe3a03000,
+0xe3a04008,0xe1a0f00e,0xe1918002,0x13540060,
+0x0afffff5,0xe0304d04,0x5afffff3,0xe3a01102,
+0xe3b02100,0xe2e23901,0xe1b0f00e,0xe2194060,
+0x1afffff4,0xe1924081,0x1afffff7,0xeaffffea,
+0xe1a04000,0xe1a00007,0xe1a07004,0xe1a04001,
+0xe1a01008,0xe1a08004,0xe1a04002,0xe1a0200a,
+0xe1a0a004,0xe1a04003,0xe1a0300b,0xe1a0b004,
+0xe1b0f00e,0xe209ba07,0xe08c542b,0xe209780f,
+0xe79da727,0xe21980ff,0xe04a8108,0x178d8727,
+0xe2199902,0xe3899901,0xe1a09789,0xe4ba6004,
+0x14ba7004,0xe88503c0,0xeafffcae,0xe209ba07,
+0xe08c542b,0xe209780f,0xe79da727,0xe21980ff,
+0xe04a8108,0x178d8727,0xe2199902,0xe3899905,
+0xe1a09789,0xe4ba6004,0xe4ba7004,0xe4ba8000,
+0xe88503c0,0xeafffc9f,0xe209ba07,0xe08c542b,
+0xe209780f,0xe79da727,0xe21980ff,0xe08a8108,
+0x178d8727,0xe2199902,0xe3899901,0xe1a09789,
+0xe4ba6004,0x14ba7004,0xe88503c0,0xeafffc91,
+0xe209ba07,0xe08c542b,0xe209780f,0xe79da727,
+0xe21980ff,0xe08a8108,0x178d8727,0xe2199902,
+0xe3899905,0xe1a09789,0xe4ba6004,0xe4ba7004,
+0xe4ba8000,0xe88503c0,0xeafffc82,0xe209ba07,
+0xe08cc42b,0xe209780f,0xe337080f,0x179da727,
+0xe21980ff,0xe04aa108,0xe2199902,0xe3899901,
+0xe1a0b789,0xe4ba8004,0x14ba9004,0xe88c0f00,
+0xeafffc83,0xe209ba07,0xe08c542b,0xe209780f,
+0xe79da727,0xe21980ff,0xe04aa108,0x178da727,
+0xe2199902,0xe3899901,0xe1a09789,0xe4ba6004,
+0x14ba7004,0xe88503c0,0xeafffc66,0xe209ba07,
+0xe08cc42b,0xe209780f,0xe337080f,0x179da727,
+0xe21980ff,0xe04aa108,0xe2199902,0xe3899905,
+0xe1a0b789,0xe4ba8004,0xe4ba9004,0xe4baa000,
+0xe88c0f00,0xeafffc66,0xe209ba07,0xe08c542b,
+0xe209780f,0xe79da727,0xe21980ff,0xe04aa108,
+0x178da727,0xe2199902,0xe3899905,0xe1a09789,
+0xe4ba6004,0xe4ba7004,0xe4ba8000,0xe88503c0,
+0xeafffc48,0xe209ba07,0xe08cc42b,0xe209780f,
+0xe337080f,0x179da727,0xe21980ff,0xe08aa108,
+0xe2199902,0xe3899901,0xe1a0b789,0xe4ba8004,
+0x14ba9004,0xe88c0f00,0xeafffc49,0xe209ba07,
+0xe08c542b,0xe209780f,0xe79da727,0xe21980ff,
+0xe08aa108,0x178da727,0xe2199902,0xe3899901,
+0xe1a09789,0xe4ba6004,0x14ba7004,0xe88503c0,
+0xeafffc2c,0xe209ba07,0xe08cc42b,0xe209780f,
+0xe337080f,0x179da727,0xe21980ff,0xe08aa108,
+0xe2199902,0xe3899905,0xe1a0b789,0xe4ba8004,
+0xe4ba9004,0xe4baa000,0xe88c0f00,0xeafffc2c,
+0xe209ba07,0xe08c542b,0xe209780f,0xe79da727,
+0xe21980ff,0xe08aa108,0x178da727,0xe2199902,
+0xe3899905,0xe1a09789,0xe4ba6004,0xe4ba7004,
+0xe4ba8000,0xe88503c0,0xeafffc0e,0xe2095a07,
+0xe08c5425,0xe895000f,0xe3a04002,0xe0044729,
+0xe3844001,0xe1340ea3,0xe1844d23,0xe28f7004,
+0xe28f5f6f,0x1085f104,0xe209780f,0xe79da727,
+0xe21980ff,0xe04a8108,0x178d8727,0xe4aa0004,
+0xe3130101,0x14aa1000,0xeafffbfa,0xe2095a07,
+0xe08c5425,0xe895000f,0xe3a04002,0xe0044729,
+0xe3844005,0xe1340ea3,0xe1844d23,0xe28f7004,
+0xe28f5f5b,0x1085f104,0xe209780f,0xe79da727,
+0xe21980ff,0xe04a8108,0x178d8727,0xe4aa0004,
+0xe4aa1004,0xe4aa2000,0xeafffbe6,0xe2095a07,
+0xe08c5425,0xe895000f,0xe3a04002,0xe0044729,
+0xe3844001,0xe1340ea3,0xe1844d23,0xe28f7004,
+0xe28f5f47,0x1085f104,0xe209780f,0xe79da727,
+0xe21980ff,0xe08a8108,0x178d8727,0xe4aa0004,
+0xe3130101,0x14aa1000,0xeafffbd2,0xe2095a07,
+0xe08c5425,0xe895000f,0xe3a04002,0xe0044729,
+0xe3844005,0xe1340ea3,0xe1844d23,0xe28f7004,
+0xe28f50cc,0x1085f104,0xe209780f,0xe79da727,
+0xe21980ff,0xe08a8108,0x178d8727,0xe4aa0004,
+0xe4aa1004,0xe4aa2000,0xeafffbbe,0xe2095a07,
+0xe08c5425,0xe895000f,0xe3a04002,0xe0044729,
+0xe3844001,0xe1340ea3,0xe1844d23,0xe28f7004,
+0xe28f507c,0x1085f104,0xe209780f,0xe337080f,
+0x179da727,0xe21980ff,0xe04aa108,0xe4aa0004,
+0xe3130101,0x14aa1000,0xeafffbb2,0xe2095a07,
+0xe08c5425,0xe895000f,0xe3a04002,0xe0044729,
+0xe3844001,0xe1340ea3,0xe1844d23,0xe28f7004,
+0xe28f502c,0x1085f104,0xe209780f,0xe79da727,
+0xe21980ff,0xe04aa108,0x178da727,0xe4aa0004,
+0xe3130101,0x14aa1000,0xeafffb96,0xe08ff104,
+0xeb00036b,0xe1a0f007,0xea0000b6,0xeb000368,
+0xea0000ea,0xeb000366,0xea000123,0xeb000364,
+0xea0001ca,0xea000124,0xe1a0f007,0xeb000360,
+0xea000134,0xeb00035e,0xea00014b,0xeb00035c,
+0xea0001bd,0xeb00035a,0xeb000359,0xeb000358,
+0xeb000357,0xeb000356,0xeb000355,0xeb000354,
+0xeb000353,0xea000156,0xea00016f,0xeb000350,
+0xe1a0f007,0xeb00034e,0xea00018c,0xeb00034c,
+0xea0001ad,0xeb00034a,0xeb000349,0xeb000348,
+0xeb000347,0xeb000346,0xeb000345,0xeb000344,
+0xeb000343,0xea00019f,0xea00008d,0xeb000340,
+0xea0000c1,0xeb00033e,0xe1a0f007,0xeb00033c,
+0xea00019d,0xeb00033a,0xeb000339,0xeb000338,
+0xeb000337,0xeb000336,0xeb000335,0xeb000334,
+0xeb000333,0xea00024f,0xea00024e,0xeb000330,
+0xea00024c,0xeb00032e,0xea00024a,0xeb00032c,
+0xe1a0f007,0xe2095a07,0xe08c5425,0xe895000f,
+0xe3a04002,0xe0044729,0xe3844005,0xe1340ea3,
+0xe1844d23,0xe28f7004,0xe24f5f4b,0x1085f104,
+0xe209780f,0xe337080f,0x179da727,0xe21980ff,
+0xe04aa108,0xe4aa0004,0xe4aa1004,0xe4aa2004,
+0xeafffb48,0xe2095a07,0xe08c5425,0xe895000f,
+0xe3a04002,0xe0044729,0xe3844005,0xe1340ea3,
+0xe1844d23,0xe28f7004,0xe24f5f5f,0x1085f104,
+0xe209780f,0xe79da727,0xe21980ff,0xe04aa108,
+0x178da727,0xe4aa0004,0xe4aa1004,0xe4aa2000,
+0xeafffb2c,0xe2095a07,0xe08c5425,0xe895000f,
+0xe3a04002,0xe0044729,0xe3844001,0xe1340ea3,
+0xe1844d23,0xe28f7004,0xe24f5f73,0x1085f104,
+0xe209780f,0xe337080f,0x179da727,0xe21980ff,
+0xe08aa108,0xe4aa0004,0xe3130101,0x14aa1000,
+0xeafffb20,0xe2095a07,0xe08c5425,0xe895000f,
+0xe3a04002,0xe0044729,0xe3844001,0xe1340ea3,
+0xe1844d23,0xe28f7004,0xe24f5f87,0x1085f104,
+0xe209780f,0xe79da727,0xe21980ff,0xe08aa108,
+0x178da727,0xe4aa0004,0xe3130101,0x14aa1000,
+0xeafffb04,0xe2095a07,0xe08c5425,0xe895000f,
+0xe3a04002,0xe0044729,0xe3844005,0xe1340ea3,
+0xe1844d23,0xe28f7004,0xe24f5f9b,0x1085f104,
+0xe209780f,0xe337080f,0x179da727,0xe21980ff,
+0xe08aa108,0xe4aa0004,0xe4aa1004,0xe4aa2004,
+0xeafffaf8,0xe2095a07,0xe08c5425,0xe895000f,
+0xe3a04002,0xe0044729,0xe3844005,0xe1340ea3,
+0xe1844d23,0xe28f7004,0xe24f5faf,0x1085f104,
+0xe209780f,0xe79da727,0xe21980ff,0xe08aa108,
+0x178da727,0xe4aa0004,0xe4aa1004,0xe4aa2000,
+0xeafffadc,0xe3c03102,0xe2000102,0xe1b05883,
+0x12955802,0x0a00000e,0xe3320000,0x01922c81,
+0xe2012080,0x000220a1,0xe0911002,0x31a01081,
+0xe2a33000,0xe2533dfe,0x9a00001c,0xe35300ff,
+0x31800b83,0x318004a1,0x33a03202,0x31a0f007,
+0xea000008,0xe1b04c03,0xe18000a4,0xe3a03202,
+0x13c11102,0x11800421,0x11a0f007,0xe1922001,
+0x01a0f007,0xea000015,0xe380047f,0xe3800502,
+0xe3a03202,0xe3a04004,0xe59c5080,0xe1855004,
+0xe58c5080,0xe1140825,0x11a00004,0x1a000e8a,
+0xe3540004,0x11a0f007,0xe3a04010,0xeafffff5,
+0xe3730017,0xda000005,0xe1a01521,0xe3811501,
+0xe2633000,0xe1800331,0xe3a03202,0xe1a0f007,
+0xe3a03202,0xe3a04008,0xeaffffea,0xe3c03102,
+0xe2000102,0xe1b05883,0x12955802,0x0a000012,
+0xe1b04b02,0xe2024b01,0x000440a2,0xe0922004,
+0xe2b11000,0xe2a33000,0xe0922002,0xe0a11001,
+0xe2533b0f,0x9a000019,0xe2834001,0xe3540b02,
+0x31800a03,0x31800621,0x31a01a01,0x31811622,
+0x33a03206,0x31a0f007,0xea00000a,0xe1b04a83,
+0xe18000a4,0xe3a03206,0x13c11102,0x118005a1,
+0x11a01a81,0x118115a2,0x11a0f007,0xe1922001,
+0x01a0f007,0xea000014,0xe380047f,0xe380060f,
+0xe3a01000,0xe3a03206,0xe3a04004,0xeaffffc1,
+0xe3730034,0xda00000c,0xe1a026a2,0xe1822981,
+0xe1a016a1,0xe3811702,0xe2633000,0xe2534020,
+0x21a01431,0x32634020,0x31800331,0x31a01411,
+0x31811332,0xe3a03206,0xe1a0f007,0xe3a01000,
+0xe3a03206,0xe3a04008,0xeaffffae,0xe2000102,
+0xe1800003,0xe3a0320a,0xe1a0f007,0xe3a02000,
+0xe1a03080,0xe1b03c23,0x133300ff,0x11a01400,
+0x13811102,0x12833dfe,0x11a0f007,0xe1933383,
+0x11a01400,0x13c11102,0x11a0f007,0xe1b01480,
+0x01a0f007,0xe3a03dfe,0x52433001,0x51b01081,
+0x5afffffc,0xe1a0f007,0xe1a01e80,0xe3c03102,
+0xe2000102,0xe18001a3,0xe3a03206,0xe21026ff,
+0x133206ff,0x1280030e,0x11a0f007,0xe1800182,
+0xe3320000,0x11a0f007,0xe1912600,0x01a0f007,
+0xe1a01a21,0xe1911600,0xe2000102,0xe380030e,
+0x52400601,0x51b01081,0x5afffffc,0xe1a01081,
+0xe1800621,0xe1a01a01,0xe1a0f007,0xe3a02000,
+0xe1a03080,0xe1b03c23,0x133300ff,0xe1a01400,
+0x13811102,0x12833dfe,0xe2000102,0xe1800003,
+0xe3a0320a,0x11a0f007,0xe1800380,0xe31000ff,
+0x13c11102,0x11a0f007,0xe1b01081,0x01a0f007,
+0xe3800dfe,0x52400001,0x51b01081,0x5afffffc,
+0xe1a0f007,0xe1a03080,0xe1b03aa3,0x12834001,
+0x13340b02,0xe1a02581,0xe1a01aa1,0xe1811580,
+0x13811102,0x12833b0f,0x11a0f007,0xe1933203,
+0x11a0f007,0xe0922002,0xe0a11001,0xe1924001,
+0x01a0f007,0xe3a03b0f,0xe1b01001,0x52433001,
+0xe3a04000,0x51844fa2,0x51844081,0x51a02082,
+0x51b01004,0x5afffff8,0xe1a0f007,0xe1a03080,
+0xe1b03aa3,0x12834001,0x13340b02,0x0a00000f,
+0xe1b04201,0xe1a01a21,0xe1811600,0xe2014c01,
+0x000440a1,0xe0911004,0xe2a33000,0xe2000102,
+0xe2533d0e,0x9affff49,0xe35300ff,0x31800b83,
+0x318004a1,0x33a03202,0x31a0f007,0xeaffff35,
+0xe1812600,0xe1a01a21,0xe1811600,0xe2000102,
+0xe1b04c03,0xe18000a4,0xe3a03202,0x118004a1,
+0x11a0f007,0xe3320000,0x01a0f007,0xeaffff3f,
+0xe1a03080,0xe1b03aa3,0x12834001,0x13340b02,
+0xe1a02581,0xe1a01aa1,0xe1811580,0x13811102,
+0x12833b0f,0xe2000102,0xe1800003,0xe3a0320a,
+0x11a0f007,0xe1800200,0xe31000ff,0x11a0f007,
+0xe0922002,0xe0a11001,0xe1924001,0x01a0f007,
+0xe3800b0f,0xe1b01001,0x52400001,0xe3a04000,
+0x51844fa2,0x51844081,0x51a02082,0x51b01004,
+0x5afffff8,0xe1a0f007,0xe3c03102,0xe1a0f007,
+0x9a209a84,0xfbcff799,0x00003ffd,0xe92c0080,
+0xe28f7004,0xe3c44007,0xeafffe2b,0xe8bc0080,
+0xe1b05883,0x12955802,0x0a000099,0xe3a05901,
+0xe2455001,0xe1530005,0x3a000006,0xe2855003,
+0xe1530005,0x0351020a,0x33a04000,0x33a05000,
+0x392c4ff0,0x3a000021,0xe92c4fcf,0xe3a00902,
+0xe2404003,0xe0644083,0xebfffc46,0xe24bb001,
+0xe24f4078,0xe894000e,0xebfffb4b,0xe3a04901,
+0xe2444002,0xe0434004,0xe2644020,0xe1a09431,
+0xe1510419,0x03520000,0x1210b102,0x12899001,
+0xe200b102,0xe8bc000f,0xe92c0a00,0xeb0000bf,
+0xe59c4004,0xe1b04004,0x5bfffb90,0x4bfffb3a,
+0xe3a05901,0xe2455001,0xe1530005,0x3a000051,
+0xe2855003,0xe1530005,0x0351020a,0x2a000040,
+0xe3a04901,0xe2844002,0xe0544003,0xe2645020,
+0xe1a03512,0x11a02432,0x11822511,0x11a01431,
+0xe1a04e21,0xe3a07003,0xe3c1120f,0xe0933003,
+0xe0b22002,0xe0a11001,0xe1a08101,0xe1888f22,
+0xe1a0a102,0xe18aaf23,0xe092200a,0xe0a11008,
+0xe2577001,0x11a04204,0x11844e21,0x1afffff1,
+0xe1915002,0x03a06000,0x0a000019,0xe3a0700f,
+0xe1a05205,0xe1855e26,0xe1a06206,0xe1866e21,
+0xe3c1120f,0xe0922002,0xe0a11001,0xe1a08101,
+0xe1888f22,0xe0922102,0xe0a11008,0xe2577001,
+0x1afffff2,0xe1a05205,0xe1855e26,0xe1a06206,
+0xe1866e21,0xe1b01281,0x3a000005,0xe2866001,
+0xe1911002,0x03c66001,0xe206100f,0xe351000a,
+0x02466001,0xe8bc0008,0xeb000023,0xe2000102,
+0xe1800221,0xe8bc0080,0xe18000a7,0xe1800004,
+0xe1a01005,0xe1a02006,0xe3a0320e,0xe8bc4fc0,
+0xe1a0f007,0xe8bc0030,0xe3150102,0x12644000,
+0xe2844001,0xe2145102,0x12644000,0xe92c0030,
+0xe3a07901,0xe3a0820a,0xe3a0a000,0xe287b002,
+0xebfffb3a,0xeaffffb1,0xe8bc0030,0xe3150102,
+0x12644000,0xe2444001,0xe2145102,0x12644000,
+0xe92c0030,0xe3a07901,0xe3a0820a,0xe3a0a000,
+0xe287b002,0xebfffad8,0xeaffffa4,0xe1a02003,
+0xe3a03010,0xe0922002,0x3352020a,0x2242220a,
+0xe0b33003,0x3afffffa,0xe1a01622,0xe3530064,
+0xa2433064,0xa2811201,0xaafffffb,0xe353000a,
+0xa243300a,0xa2811401,0xaafffffb,0xe1811a03,
+0xe1b0f00e,0xe3530000,0x1a00000a,0xe1915002,
+0x03a0320e,0x03a00000,0x01a0f007,0xe3110102,
+0x1affff5d,0xe0922002,0xe0b11001,0xe2433001,
+0x5afffffb,0xeaffff58,0xe2000102,0xe1800603,
+0xe3800302,0xe18009a1,0xe1a01681,0xe18119a2,
+0xe1a02682,0xe3a0320e,0xe1a0f007,0x9392ee8e,
+0x921d5d07,0x00003fc3,0xe1915002,0x01b05a00,
+0x1200540f,0x1355040f,0x0a0000ac,0xe92c4fd0,
+0xe3a07000,0xe3a06000,0xe1a04a00,0xe3a05003,
+0xeb00009a,0xe1a04001,0xe3a05008,0xeb000097,
+0xe1a04002,0xe3a05008,0xeb000094,0xe1a02007,
+0xe1b01006,0xe3a0303e,0xe2833901,0x4a000003,
+0xe0922002,0xe0b11001,0xe2433001,0x5afffffb,
+0xe3a06000,0xe3a07000,0xe1a04200,0xe3a05004,
+0xeb000086,0xe1a09007,0xeb00000c,0xe3100101,
+0x1bfffade,0x0bfffa88,0xe24f70a4,0xe8970d00,
+0xebfffa85,0xe8bc4fd0,0xe2935001,0xda000090,
+0xe1b057a5,0x1a0000a7,0xe2044007,0xeafffd46,
+0xe3590014,0xd28f8084,0xd0889209,0xd8990d80,
+0xd1b0f00e,0xe92c400f,0xe3a01102,0xe3a02000,
+0xe3a00901,0xe2403001,0xe3590000,0x0a000011,
+0xe92c000f,0xe2833003,0xe3b0120a,0x3bfffa6a,
+0xe1b090a9,0x3afffffc,0xe8bc0d80,0x192c000f,
+0xebfffa69,0x0a000007,0xe8bc0d80,0xe92c000f,
+0xe1a00007,0xe1a01008,0xe1a0200a,0xe1a0300b,
+0xebfffa61,0xeafffff1,0xe1a07000,0xe1a08001,
+0xe1a0a002,0xe1a0b003,0xe8bc400f,0xe1b0f00e,
+0x00000000,0x80000000,0x00000000,0x00003fff,
+0x00000000,0xa0000000,0x00000000,0x00004002,
+0x00000000,0xc8000000,0x00000000,0x00004005,
+0x00000000,0xfa000000,0x00000000,0x00004008,
+0x00000000,0x9c400000,0x00000000,0x0000400c,
+0x00000000,0xc3500000,0x00000000,0x0000400f,
+0x00000000,0xf4240000,0x00000000,0x00004012,
+0x00000000,0x98968000,0x00000000,0x00004016,
+0x00000000,0xbebc2000,0x00000000,0x00004019,
+0x00000000,0xee6b2800,0x00000000,0x0000401c,
+0x00000000,0x9502f900,0x00000000,0x00004020,
+0x00000000,0xba43b740,0x00000000,0x00004023,
+0x00000000,0xe8d4a510,0x00000000,0x00004026,
+0x00000000,0x9184e72a,0x00000000,0x0000402a,
+0x00000000,0xb5e620f4,0x80000000,0x0000402d,
+0x00000000,0xe35fa931,0xa0000000,0x00004030,
+0x00000000,0x8e1bc9bf,0x04000000,0x00004034,
+0x00000000,0xb1a2bc2e,0xc5000000,0x00004037,
+0x00000000,0xde0b6b3a,0x76400000,0x0000403a,
+0x00000000,0x8ac72304,0x89e80000,0x0000403e,
+0x00000000,0xad78ebc5,0xac620000,0x00004041,
+0xe0977007,0xe0a66006,0xe0978107,0xe0a6af27,
+0xe08a6106,0xe1a07008,0xe0977e24,0xe2a66000,
+0xe1a04204,0xe2555001,0x1afffff4,0xe1b0f00e,
+0xe1a03280,0xe1a038a3,0xe1a026a2,0xe1822981,
+0xe1a016a1,0xe1811980,0xe3c11102,0xe2044007,
+0xeafffcb9,0xe2144007,0x13540005,0x0a000003,
+0xe2000102,0xe3540001,0x0afffda0,0xeafffdda,
+0xe2633000,0xe3530040,0xaa000008,0xe2735020,
+0x42435020,0x41a02531,0x51a02332,0x51822511,
+0xe1a01331,0xe3a03000,0xe2044007,0xeafffca6,
+0xe2000102,0xe3a01000,0xe3a02000,0xe1a03e84,
+0xe3a04008,0xeafffd7b,0xe2144007,0x0a000003,
+0xe3a00000,0xe3540003,0x0afffdae,0xbafffd71,
+0xe3a01000,0xe3b02100,0xe2e23902,0xe2000102,
+0xe1800003,0xe3540000,0x13a0320a,0xe3a04004,
+0xeafffd6c,0xeafffffe,0xe209aa0f,0xe3190008,
+0x1a000069,0xe2095007,0xe08c5205,0xe895000f,
+0xe1b04d23,0xe28f7000,0x1afffc87,0xe1b04883,
+0x12944802,0x0a00002b,0x5a000039,0xe354083e,
+0xe20448ff,0x4a000049,0xe1a048a4,0xe2199060,
+0x1a00000e,0xe2846002,0xe1922611,0xe3a02101,
+0xe0012432,0x000220a1,0xe264401f,0xe1a01431,
+0xe3320000,0x12811001,0xe3100102,0x12611000,
+0xe0312000,0x4a000049,0xe78d152a,0xeafff805,
+0xe3590060,0x1a000005,0xe264401f,0xe1a01431,
+0xe3100102,0x12611000,0xe78d152a,0xeafff7fd,
+0xe0307d09,0x5afffff7,0xe2846001,0xe1922611,
+0x0afffff4,0xe264401f,0xe1a01431,0xe2811001,
+0xe3100102,0x12611000,0xe0312000,0x4a000033,
+0xe78d152a,0xeafff7ef,0xe31300ff,0x1a000003,
+0xe1921001,0x1a000006,0xe78d152a,0xeafff7e9,
+0xe1921001,0x0a000029,0xe28f70bc,0xe3a04001,
+0xeafffd28,0xe02970a9,0xe3170020,0x0a000010,
+0xea000003,0xe2199060,0x0a000008,0xe3590060,
+0x0a00000b,0xe0307d09,0x5a000009,0xe3a01001,
+0xe3100102,0x12611000,0xe78d152a,0xeafff7d5,
+0xe2947802,0x5a000002,0xe3510102,0x03520000,
+0x8afffff5,0xe3a01000,0xe78d152a,0xea000016,
+0xe354083e,0x03510102,0xe2000102,0x03500102,
+0x1a00000a,0xe3520000,0x0affffae,0xe2199060,
+0x0a000004,0xe3590060,0x0affffaa,0xe0307d09,
+0x5affffa8,0xea000001,0xe3520102,0x9affffa5,
+0xe28f7014,0xe3a04001,0xeafffcfe,0xe2091007,
+0xe3510006,0xaa000001,0xe78d152a,0xeafff7b5,
+0xe2811003,0xe351000a,0x13a01001,0xe2099060,
+0x13590020,0x1affffde,0xe78d152a,0xeafff7ad,
+0xe3190080,0x1a000034,0xe2097a0f,0xe79d8527,
+0xe209b807,0xe08cb62b,0xe1b07008,0x42688000,
+0xe3a0a09e,0xe28aadfe,0x03a0a01f,0xe1b0c828,
+0x01a08808,0x024aa010,0xe1b0cc28,0x01a08408,
+0x024aa008,0xe1b0ce28,0x01a08208,0x024aa004,
+0xe1b0cf28,0x01a08108,0x024aa002,0xe1b0cfa8,
+0x01a08088,0x024aa001,0xe1b0cc08,0x1a000002,
+0xe3a09000,0xe88b0780,0xeafff79d,0xe2199060,
+0x1a000008,0xe1b0c08c,0xe208c080,0x000cc0a8,
+0xe098800c,0xe2aaa000,0x23a08102,0xe3c880ff,
+0xe88b0780,0xeafff792,0xe2399060,0x0afffffa,
+0xe027cc89,0xe20cc102,0xe0988bac,0xe2aaa000,
+0x23a08102,0xe3a09000,0xe3c880ff,0xe88b0780,
+0xeafff787,0xe3190080,0x1afff75f,0xe2097a0f,
+0xe79d8527,0xe209b807,0xe08cb62b,0xe1b07008,
+0x42688000,0xe3a0a09e,0xe28aadfe,0x03a0a01f,
+0xe1b09828,0x01a08808,0x024aa010,0xe1b09c28,
+0x01a08408,0x024aa008,0xe1b09e28,0x01a08208,
+0x024aa004,0xe1b09f28,0x01a08108,0x024aa002,
+0xe1b09fa8,0x01a08088,0x024aa001,0xe3a09000,
+0xe88b0780,0xeafff76a,0xe2097a0f,0xe79da527,
+0xe3ca801f,0xe3d8881f,0x1a000002,0xe38aa000,
+0xe58ca080,0xeafff762,0xe24f700c,0xe3a04001,
+0xeafffc94,0xe2097a0f,0xe59ca080,0xe78da527,
+0xeafff74c,0xe1b08e09,0x4a000037,0xe08c8c28,
+0xe898000f,0xe1b04d23,0xe28f7000,0x1afffbae,
+0xe2097807,0xe1a0b003,0xe1a0a002,0xe0208509,
+0xe1a09001,0xe08cc627,0xe89c000f,0xe1b04d23,
+0xe28f7000,0x1afffba4,0x188c000f,0xe3a04803,
+0xe0945883,0x3094588b,0x2a000015,0xe0305008,
+0x4a000009,0xe153000b,0x01510009,0x0152000a,
+0xe10f7000,0xe2077206,0x33877102,0x13100102,
+0x1227720a,0xe168f007,0xeafff72a,0xe19b4003,
+0x019a4002,0x01994001,0x0a000003,0xe3100102,
+0x1368f102,0x0368f202,0xeafff722,0xe368f206,
+0xeafff720,0xe0945883,0x3a000001,0xe1915002,
+0x1a000003,0xe094588b,0x3affffe3,0xe199500a,
+0x0affffe1,0xe368f201,0xe24fc0c0,0xe24ccc24,
+0xe24f7038,0xe3a04001,0xeafffc56,0xe2097807,
+0xe2095602,0xe24f6074,0xe0866c28,0xe8960f00,
+0xe0288505,0xeaffffca,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x80000000,
+0x00000000,0x00003fff,0x00000000,0x80000000,
+0x00000000,0x00004000,0x00000000,0xc0000000,
+0x00000000,0x00004000,0x00000000,0x80000000,
+0x00000000,0x00004001,0x00000000,0xa0000000,
+0x00000000,0x00004001,0x00000000,0x80000000,
+0x00000000,0x00003ffe,0x00000000,0xa0000000,
+0x00000000,0x00004002,0xe2097807,0xe2095602,
+0xe24f6e11,0xe0866c28,0xe8960f00,0xe0288505,
+0xea00000b,0xe1b08e09,0x4afffff6,0xe08c8c28,
+0xe898000f,0xe1b04d23,0xe28f7000,0x1afffb46,
+0xe2097807,0xe1a0b003,0xe1a0a002,0xe0208509,
+0xe1a09001,0xe08cc627,0xe89c000f,0xe1b04d23,
+0xe28f7000,0x1afffb3c,0x188c000f,0xe3a04803,
+0xe0945883,0x3094588b,0x2a00000b,0xe0305008,
+0x4affffa1,0xe153000b,0x01510009,0x0152000a,
+0xe10f7000,0xe2077206,0x33877102,0x13100102,
+0x1227720a,0xe168f007,0xeafff6c2,0xe0945883,
+0x3a000001,0xe1915002,0x1a000003,0xe094588b,
+0x3affffed,0xe199500a,0x0affffeb,0xe368f201,
+0xeafff6b8,0xe2099060,0xe3590020,0x03a07209,
+0x0a000006,0xe3a00000,0xe08cb42a,0xe28f708c,
+0xe2877c05,0xea0000de,0xe357020e,0x0afffff4,
+0xe24f8c02,0xe0887c27,0xe08cb42a,0xe8970780,
+0xe88b0780,0xeafff6b6,0xe24f8f85,0xe0887c27,
+0xe08cb42a,0xe8970700,0xe3a07102,0xe88b0780,
+0xeafff6af,0xe24f7e23,0xe0878c28,0xe8980d00,
+0xe3a04000,0xea0001f3,0xe24f7f91,0xe0878c28,
+0xe8980d00,0xe3a04000,0xea0002a5,0xe3580102,
+0x0a00040f,0xe24f7e26,0xe0878c28,0xe8980d00,
+0xea00035f,0xe3580102,0x0a00050f,0xe24f7f9e,
+0xe0878c28,0xe8980d00,0xea000456,0xe24f7fa3,
+0xe0876c26,0xe896000f,0xea000463,0xe3580102,
+0x0a0005b3,0xe24f7e2a,0xe0878c28,0xe8980d00,
+0xea000546,0xe24f7fad,0xe0876c26,0xe896000f,
+0xea000549,0xe24f8fb1,0xe0888c27,0xe08cb42a,
+0xe898000f,0xe3570209,0x9a00018e,0xea000143,
+0xe24f8e2e,0xe0888c27,0xe898000f,0xea00063a,
+0xe24f8e2f,0xe0888c27,0xe898000f,0xea0006dd,
+0xe24f8c03,0xe0888c27,0xe898000f,0xea000790,
+0xe24f8e31,0xe0888c27,0xe898000f,0xea000858,
+0xe3570102,0x13570209,0x1357020e,0x1a0008fe,
+0xe24f8e33,0xe0888c27,0xe898000f,0xea000880,
+0xe24f8d0d,0xe0888c27,0xe898000f,0xea000992,
+0xe24f7e35,0xe0876c26,0xe896000f,0xea000937,
+0xe24f7fd7,0xe0878c28,0xe8980d00,0xea0005b6,
+0xe3190080,0x1afff638,0xe1b07e09,0xe209aa07,
+0x4affff9e,0xe08c7c27,0xe08cb42a,0xe8970780,
+0xe88b0780,0xeafff656,0xe3190080,0x1afff62e,
+0xe1b07e09,0xe209aa07,0x4affff9a,0xe08c7c27,
+0xe08cb42a,0xe8970780,0xe2277102,0xe88b0780,
+0xeafff64b,0xe3190080,0x1afff623,0xe1b07e09,
+0xe209aa07,0x4affff89,0xe08c7c27,0xe08cb42a,
+0xe8970780,0xe3c77102,0xe88b0780,0xeafff640,
+0xe1b07e09,0xe209aa07,0x4affff80,0xe08c7c27,
+0xe08ca42a,0xe897000f,0xe2098080,0xe3888040,
+0xe1580ba3,0x21b04183,0x3a00001d,0xe88a000f,
+0xeafff62c,0xe1b07e09,0xe209aa07,0x4affff79,
+0xe08c7c27,0xe08ca42a,0xe897000f,0xe2200102,
+0xe2098080,0xe3888040,0xe1580ba3,0x21b04183,
+0x3a00000f,0xe88a000f,0xeafff61e,0xe1b07e09,
+0xe209aa07,0x4affff65,0xe08c7c27,0xe08ca42a,
+0xe897000f,0xe3c00102,0xe2098080,0xe3888040,
+0xe1580ba3,0x21b04183,0x3a000001,0xe88a000f,
+0xeafff610,0xe1a04328,0xe1844d23,0xe24f7018,
+0xe3540019,0x0a00006b,0xc3c03102,0xe3140002,
+0x1a000034,0xe1b05883,0x12955802,0x0a00001c,
+0xe2195060,0x1a00000c,0xe1925c81,0xe2012080,
+0x000220a1,0xe0911002,0x23a01102,0xe2a33000,
+0xe3a02000,0xe3c110ff,0xe2535dfe,0x9a00001a,
+0xe35500ff,0x31a0f007,0xea000012,0xe3550060,
+0x11922c01,0x10305d05,0x5afffff4,0xe2911c01,
+0x23a01102,0xe2a33000,0xe3a02000,0xe3c110ff,
+0xe2535dfe,0x9a00000c,0xe35500ff,0x31a0f007,
+0xea000004,0xe31300ff,0x11a0f007,0xe1922001,
+0x01a0f007,0xea00000a,0xe3a030ff,0xe3833c7f,
+0xe3a01000,0xe3a04004,0xeafffb1a,0xe3750017,
+0xda000003,0xe2655009,0xe1a01531,0xe1a01511,
+0xe1a0f007,0xe3a03000,0xe3a02000,0xe3a01000,
+0xe3a04008,0xeafffb0f,0xe1b05883,0x12955802,
+0x0a000022,0xe2195060,0x1a00000f,0xe1b04b02,
+0xe2024b01,0x000440a2,0xe0922004,0xe2b11000,
+0xe2a33000,0x23a01102,0xe1a025a2,0xe1a02582,
+0xe2535b0f,0x9a00001a,0xe2854001,0xe3540b02,
+0x31a0f007,0xe3a02000,0xeaffffda,0xe3550060,
+0x11b04a82,0x10305d05,0x5afffff2,0xe2922b02,
+0xe2b11000,0x23a01102,0xe2a33000,0xe1a025a2,
+0xe1a02582,0xe2535b0f,0x9a000009,0xe2854001,
+0xe3540b02,0x31a0f007,0xe3a02000,0xeaffffc9,
+0xe31300ff,0x11a0f007,0xe1922001,0x01a0f007,
+0xeaffffcf,0xe3750034,0xdaffffcd,0xe265500c,
+0xe2554020,0x21a02431,0x31a02532,0x21a01412,
+0xe1a02512,0xe1a0f007,0xe1a03080,0xe1b03aa3,
+0x12834001,0x13340b02,0x0a000023,0xe2833b0f,
+0xe2195060,0x1a00000f,0xe1b04201,0xe1a01aa1,
+0xe1811580,0xe3811102,0xe2014080,0x000440a1,
+0xe0911004,0x23a01102,0xe2a33000,0xe3c110ff,
+0xe3a02000,0xe2535dfe,0x9affffab,0xe35500ff,
+0x31a0f007,0xeaffffa3,0xe1b04181,0xe1a01aa1,
+0xe1811580,0xe3811102,0x13550060,0x10305d05,
+0x5afffff1,0xe2911c01,0x23a01102,0xe2a33000,
+0xe3a02000,0xe3c110ff,0xe2535dfe,0x9affff9a,
+0xe35500ff,0x31a0f007,0xeaffff92,0xe1833203,
+0xe1912600,0x01a0f007,0xe1a02581,0xe1a01aa1,
+0xe1811580,0xe31300ff,0x11a0f007,0xeaffff94,
+0xe3190080,0x1afff54c,0xe1b07e09,0xe209aa07,
+0x4afffeb0,0xe08c7c27,0xe08cb42a,0xe897000f,
+0xe1b04d23,0xe28f7000,0x1afff9c3,0xe1a04883,
+0xe2944802,0x0a00000b,0xe92c4000,0xebfff83c,
+0xe8bc4000,0xe28f7014,0x1afffa96,0xe1898629,
+0xe3180080,0x0affff4e,0xe3190080,0x1affff81,
+0xe88b000f,0xeafff553,0xe1928001,0x0a000003,
+0xe3811101,0xe24f701c,0xe3a04001,0xeafffa89,
+0xe3a02000,0xe24f702c,0xeaffff66,0xe3190080,
+0x1afff529,0xe1b07e09,0xe209aa07,0x4afffec0,
+0xe08c8c27,0xe08cb42a,0xe898000f,0xe1b04d23,
+0xe28f7000,0x1afff9a0,0x1888000f,0xe1b04883,
+0x12944802,0x0a000063,0xe3100102,0x1a000059,
+0xe2833901,0xe2433001,0xe1b030a3,0xe1a05002,
+0x32414102,0x22414101,0x33a07201,0x23a07202,
+0xe3a01102,0xe0955005,0xe0b44004,0xe0216007,
+0x31540006,0x20444006,0x20211087,0xe1b070e7,
+0x5afffff7,0xe1942005,0x11892629,0x12122080,
+0x03a07000,0x0a000018,0xe3a02000,0xe0955005,
+0xe0b44004,0xe0a00000,0xe0226007,0xe055a006,
+0xe0d48001,0x31b000a0,0x21a0500a,0x21a04008,
+0x20222087,0x20211fa7,0xe1b070a7,0x1afffff2,
+0xe0955005,0xe0b44004,0xe0b70007,0xe0d5a002,
+0xe0d48001,0x31b000a0,0x21a0500a,0x21a04008,
+0x22222001,0x23a07102,0xe3a00000,0xe3190702,
+0x1a000008,0xe1954004,0x01944007,0x13822001,
+0xe28f7044,0xe3530000,0xdaffff29,0xe3190080,
+0x0afffef7,0xeaffff2b,0xe2196060,0x1a000015,
+0xe0977007,0xe0b55005,0xe0b44004,0x2a000002,
+0xe1540001,0x01550002,0x03570101,0xe2b22000,
+0xe2b11000,0xe2a33000,0x23a01102,0xe59c5080,
+0xe3150010,0x0a000001,0xe88b000f,0xeafff4ed,
+0xe3855010,0xe58c5080,0xe3150601,0x0afffff9,
+0xe3a00010,0xea0008b4,0xe1945005,0x01955007,
+0x13560060,0x0afffff0,0xe1300c86,0x4affffee,
+0xe2922001,0xeaffffe9,0xe3a014c5,0xe3a02000,
+0xe3a030ff,0xe1833383,0xe3811101,0xe24f705c,
+0xe3a04001,0xeafffa13,0xe3530000,0x1a000008,
+0xe1914002,0x0affffe3,0xe1b01001,0x4affff95,
+0xe0922002,0xe0b11001,0xe2433001,0x5afffffb,
+0xeaffff90,0xe1914002,0x1affffee,0xe3100102,
+0x0affffd5,0xeaffffe7,0xe3190080,0x1afff4a6,
+0xe1b08e09,0x4afffe1a,0xe08c8c28,0xe898000f,
+0xe1b04d23,0x0a00000b,0xe28f7024,0xe3540008,
+0x1afff91d,0xe3a02000,0xe1a03080,0xe1b03c23,
+0x133300ff,0x11a01400,0x13811102,0x12833dfe,
+0x0afffa4d,0xe888000f,0xe1a0b003,0xe1a0a002,
+0xe1a08001,0xe2004102,0xe2096807,0xe08c6626,
+0xe896000f,0xe1340000,0x4a0000b6,0xe1b04d23,
+0x0a00000b,0xe28f7024,0xe3540008,0x1afff906,
+0xe3a02000,0xe1a03080,0xe1b03c23,0x133300ff,
+0x11a01400,0x13811102,0x12833dfe,0x0afffa36,
+0xe886000f,0xe3a06802,0xe0965883,0x3096588b,
+0x2a000061,0xe053400b,0x4a000046,0xe2745020,
+0xda00000e,0xe092243a,0x20822518,0x30922518,
+0xe0b11438,0xe1a0851a,0xe1a0a088,0x2a000011,
+0xe3190702,0x1a00001d,0xe19aa008,0x13822001,
+0xe28f7090,0xe3190080,0x0afffe7d,0xeafffeb1,
+0xe3540040,0xc18aa008,0xc3a08000,0xaa00000b,
+0xe2444020,0xe2645020,0xe0922438,0xe2b11000,
+0xe1a08518,0xe18aa088,0xe2a33000,0x218aa008,
+0x21a08f82,0x21a020a2,0x21822f81,0x21a01061,
+0xe3190702,0x1a000005,0xe19aa008,0x13822001,
+0xe28f7030,0xe3190080,0x0afffe65,0xeafffe99,
+0xe2197060,0x1a000014,0xe19aa088,0x00088f82,
+0xe0922fa8,0xe2b11000,0xe2a33000,0x23a01102,
+0xe0965883,0x0a00003b,0xe59c5080,0xe3150010,
+0x0a000003,0xe2099a07,0xe08c9429,0xe889000f,
+0xeafff45c,0xe3855010,0xe58c5080,0xe3150601,
+0x0afffff7,0xe3a00010,0xea000823,0xe19aa008,
+0x13570060,0x0affffef,0xe1300c87,0x4affffed,
+0xe2922001,0xeaffffe6,0xe2644000,0xe1a0300b,
+0xe1a05001,0xe1a01008,0xe1a08005,0xe1a05002,
+0xe1a0200a,0xe1a0a005,0xe2745020,0xdaffffbf,
+0xe092243a,0x20822518,0x30922518,0xe0b11438,
+0xe1a0851a,0xe1a0a088,0x2affffc2,0xe3190702,
+0x1affffce,0xe19aa008,0x13822001,0xe24f70ac,
+0xe3190080,0x0afffe2e,0xeafffe62,0xe0965883,
+0x1a000001,0xe1925001,0x1a000006,0xe096588b,
+0x1affffcc,0xe1a0300b,0xe1a01008,0xe1a0200a,
+0xe1915002,0x0affffc7,0xe3811101,0xe24f70ec,
+0xe3a04001,0xeafff963,0xe3a030ff,0xe1833383,
+0xe3a02000,0xe3a01000,0xe24f7f42,0xe3a04004,
+0xeafff95c,0xe1b04d23,0x0a00000b,0xe28f7024,
+0xe3540008,0x1afff87c,0xe3a02000,0xe1a03080,
+0xe1b03c23,0x133300ff,0x11a01400,0x13811102,
+0x12833dfe,0x0afff9ac,0xe886000f,0xe0200589,
+0xeaffff73,0xe3190080,0x1afff3ef,0xe1b08e09,
+0x4afffd68,0xe08c8c28,0xe898000f,0xe1b04d23,
+0x0a00000b,0xe28f7024,0xe3540008,0x1afff866,
+0xe3a02000,0xe1a03080,0xe1b03c23,0x133300ff,
+0x11a01400,0x13811102,0x12833dfe,0x0afff996,
+0xe888000f,0xe1a0b003,0xe1a0a002,0xe1a08001,
+0xe2004102,0xe2096807,0xe08c6626,0xe896000f,
+0xe1340000,0x4affffd2,0xe1b04d23,0x0a00000b,
+0xe28f7024,0xe3540008,0x1afff84f,0xe3a02000,
+0xe1a03080,0xe1b03c23,0x133300ff,0x11a01400,
+0x13811102,0x12833dfe,0x0afff97f,0xe886000f,
+0xe0200589,0xe3a06802,0xe0965883,0x3096588b,
+0x2a00006b,0xe053400b,0x01510008,0x0152000a,
+0x0a000078,0x3a00004c,0xe3a07000,0xe2745020,
+0xda000015,0xe057651a,0xe0d2243a,0x30422518,
+0x20522518,0xe0d11438,0x5a00001b,0xe3190702,
+0x1a000029,0xe1977006,0x13822001,0xe28f70c0,
+0xe3190080,0x0afffdc2,0xeafffdf6,0x13a06102,
+0xe3a07001,0xe198500a,0x0a000029,0xe2522001,
+0xe2d11000,0x5a00000c,0xea000011,0xe3a06000,
+0xe3540040,0xaafffff4,0xe2444020,0xe2645020,
+0xe057751a,0xe0d6643a,0x30466518,0x20566518,
+0xe0d22438,0xe2d11000,0x4a000005,0xe0977007,
+0xe0b66006,0xe0b22002,0xe0b11001,0xe2433001,
+0x5afffff9,0xe3190702,0x1a000007,0xe3530000,
+0xda00004c,0xe1977006,0x13822001,0xe28f7030,
+0xe3190080,0x0afffd9e,0xeafffdd2,0xe2195060,
+0x1a00000e,0xe1977086,0x00066f82,0xe0922fa6,
+0xe2b11000,0xe2a33000,0x23a01102,0xe1b03003,
+0x4a000042,0xe59c5080,0xe3150010,0x0affff3c,
+0xe2099a07,0xe08c9429,0xe889000f,0xeafff395,
+0xe1977006,0x13550060,0x0afffff3,0xe1300c85,
+0x4afffff1,0xe2922001,0xeaffffec,0xe2644000,
+0xe2200102,0xe1a0300b,0xe1a05001,0xe1a01008,
+0xe1a08005,0xe1a05002,0xe1a0200a,0xe1a0a005,
+0xe3a07000,0xe2745020,0xdaffffbf,0xe057651a,
+0xe0d2243a,0x30422518,0x20522518,0xe0d11438,
+0x5affffc5,0xe3190702,0x1affffd3,0xe1977006,
+0x13822001,0xe24f7098,0xe3190080,0x0afffd6c,
+0xeafffda0,0xe0965883,0x1a000005,0xe1925001,
+0x1affff44,0xe153000b,0x0198500a,0x03a014c1,
+0x0affff40,0xe096588b,0x1affffcd,0xe2200102,
+0xe1a0300b,0xe1a01008,0xe1a0200a,0xe1915002,
+0x0affffc7,0xeaffff37,0xe3a03000,0xe3a02000,
+0xe3a01000,0xeaffffc2,0xe3a03000,0xe3a02000,
+0xe3a01000,0xe24f7f42,0xe3a04008,0xeafff895,
+0xe2633000,0xe2734020,0x42435020,0x41a02531,
+0x51a02332,0x51822411,0xe1a01331,0xe3a03000,
+0xeaffffb3,0xe3190080,0x1afff32f,0xe1b08e09,
+0x4afffcad,0xe08c8c28,0xe898000f,0xe1b04d23,
+0x0a00000b,0xe28f7024,0xe3540008,0x1afff7a6,
+0xe3a02000,0xe1a03080,0xe1b03c23,0x133300ff,
+0x11a01400,0x13811102,0x12833dfe,0x0afff8d6,
+0xe888000f,0xe2000102,0xe183b000,0xe1a0a002,
+0xe1a08001,0xe2096807,0xe08c6626,0xe896000f,
+0xe1b04d23,0x0a00000b,0xe28f7024,0xe3540008,
+0x1afff791,0xe3a02000,0xe1a03080,0xe1b03c23,
+0x133300ff,0x11a01400,0x13811102,0x12833dfe,
+0x0afff8c1,0xe886000f,0xe020000b,0xe3cbb102,
+0xe3a06802,0xe3530000,0x135b0000,0x0a00008c,
+0xe0965883,0x3096588b,0x2afffee7,0xe3b054ff,
+0xe0a3300b,0xe185b425,0xe043392b,0xe19a4088,
+0x11924081,0x0a000064,0xe92c4209,0xe1a04821,
+0xe1c1500b,0xe1a06822,0xe1c2700b,0xe1c8900b,
+0xe1a08828,0xe1cab00b,0xe1a0a82a,0xe0030b96,
+0xe0020b94,0xe0010994,0xe0000a97,0xe0933000,
+0xe0000a95,0xe0b22000,0xe0000895,0xe0b11000,
+0x33a0e000,0x23a0e001,0xe0000996,0xe0922000,
+0xe2b11000,0xe2aee000,0xe0000897,0xe0922000,
+0xe2b11000,0xe2aee000,0xe18ee803,0xe1a03823,
+0xe1833802,0xe1a02822,0xe1822801,0xe1a01821,
+0xe181180e,0xe3cee0ff,0xe0000b95,0xe00b0b97,
+0xe09eb00b,0xe0b33000,0xe0000896,0xe0b22000,
+0xe0000894,0xe0a11000,0xe0000a94,0xe00a0a96,
+0xe09aa003,0xe0b22000,0xe2a11000,0xe0000997,
+0xe09aa000,0xe0000995,0xe0b22000,0xe2b11000,
+0xe8bc4209,0x5a000009,0xe3190702,0x1a000017,
+0xe19bb00a,0x13822001,0xe3530000,0xdaffff79,
+0xe28f7078,0xe3190080,0x0afffccd,0xeafffd01,
+0xe09bb00b,0xe0baa00a,0xe0b22002,0xe0b11001,
+0xe2433001,0x5afffff9,0xe3190702,0x1a000007,
+0xe3530000,0xdaffff6b,0xe19bb00a,0x13822001,
+0xe28f7038,0xe3190080,0x0afffcbd,0xeafffcf1,
+0xe2195060,0x1a00001c,0xe19bb08a,0x000aaf82,
+0xe0922faa,0xe2b11000,0xe2a33000,0x23a01102,
+0xe2934001,0xda00001b,0xe1b047a4,0x1afffe91,
+0xe59c5080,0xe3150010,0x0afffe59,0xe2099a07,
+0xe08c9429,0xe889000f,0xeafff2b2,0xe19a4088,
+0x11a0200a,0x11a01008,0xe2433001,0xe3190702,
+0x1affffee,0xe3530000,0xdaffff4a,0xe24f7044,
+0xe3190080,0x0afffc9e,0xeafffcd2,0xe19bb00a,
+0x13550060,0x0affffe5,0xe1300c85,0x4affffe3,
+0xe2922001,0xeaffffde,0xe2633000,0xe3530040,
+0xaaffff3c,0xe2734020,0x42435020,0x41a02531,
+0x51a02332,0x51822411,0xe1a01331,0xe3a03000,
+0xeaffffda,0xe3530000,0x1a000003,0xe1915002,
+0x0a00000c,0xe35b0000,0x1affff6c,0xe198500a,
+0x1affff6a,0xe0965883,0x33a03000,0x33a02000,
+0x33a01000,0x3affffcd,0xe1915002,0x1afffe59,
+0xe3a014c2,0xeafffe57,0xe096588b,0x3affffc7,
+0xe198500a,0x1afffe48,0xe1a0300b,0xeafffff7,
+0xe3190080,0x1afff25c,0xe2096807,0xe08c6626,
+0xe896000f,0xe1b04d23,0x0a00000b,0xe28f7024,
+0xe3540008,0x1afff6d4,0xe3a02000,0xe1a03080,
+0xe1b03c23,0x133300ff,0x11a01400,0x13811102,
+0x12833dfe,0x0afff804,0xe886000f,0xe2000102,
+0xe183b000,0xe1a0a002,0xe1a08001,0xe1b06e09,
+0x4afffbd1,0xe08c6c26,0xe896000f,0xe1b04d23,
+0x0a000035,0xe28f7024,0xe3540008,0x1afff6be,
+0xe3a02000,0xe1a03080,0xe1b03c23,0x133300ff,
+0x11a01400,0x13811102,0x12833dfe,0x0afff7ee,
+0xe886000f,0xea000028,0xe3190080,0x1afff232,
+0xe1b08e09,0x4afffbb6,0xe08c8c28,0xe898000f,
+0xe1b04d23,0x0a00000b,0xe28f7024,0xe3540008,
+0x1afff6a9,0xe3a02000,0xe1a03080,0xe1b03c23,
+0x133300ff,0x11a01400,0x13811102,0x12833dfe,
+0x0afff7d9,0xe888000f,0xe2000102,0xe183b000,
+0xe1a0a002,0xe1a08001,0xe2096807,0xe08c6626,
+0xe896000f,0xe1b04d23,0x0a00000b,0xe28f7024,
+0xe3540008,0x1afff694,0xe3a02000,0xe1a03080,
+0xe1b03c23,0x133300ff,0x11a01400,0x13811102,
+0x12833dfe,0x0afff7c4,0xe886000f,0xe020000b,
+0xe3cbb102,0xe1b04883,0x11b0588b,0x12944802,
+0x12955802,0x0a000082,0xe043300b,0xe2833901,
+0xe2433001,0xe3a0b000,0xe052500a,0xe0d14008,
+0x23a01003,0x2a00000c,0xe1a05002,0xe1a04001,
+0xe3a01001,0xe2433001,0xe0955005,0xe0b44004,
+0xe2abb000,0xe055700a,0xe0d46008,0x31b0b0ab,
+0x21a05007,0x21a04006,0xe0a11001,0xe0955005,
+0xe0b44004,0xe2abb000,0xe055700a,0xe0d46008,
+0x31b0b0ab,0x21a05007,0x21a04006,0xe0a11001,
+0xe0955005,0xe0b44004,0xe2abb000,0xe055700a,
+0xe0d46008,0x31b0b0ab,0x21a05007,0x21a04006,
+0xe0a11001,0xe0955005,0xe0b44004,0xe2abb000,
+0xe055700a,0xe0d46008,0x31b0b0ab,0x21a05007,
+0x21a04006,0xe0b11001,0x3affffda,0xe1942005,
+0x11892629,0x12122080,0x0a000025,0xe3a02001,
+0xe0955005,0xe0b44004,0xe2abb000,0xe055700a,
+0xe0d46008,0x31b0b0ab,0x21a05007,0x21a04006,
+0xe0a22002,0xe0955005,0xe0b44004,0xe2abb000,
+0xe055700a,0xe0d46008,0x31b0b0ab,0x21a05007,
+0x21a04006,0xe0a22002,0xe0955005,0xe0b44004,
+0xe2abb000,0xe055700a,0xe0d46008,0x31b0b0ab,
+0x21a05007,0x21a04006,0xe0a22002,0xe0955005,
+0xe0b44004,0xe2abb000,0xe055700a,0xe0d46008,
+0x31b0b0ab,0x21a05007,0x21a04006,0xe0b22002,
+0x3affffda,0xe3190702,0x1a000007,0xe1954004,
+0x13822001,0xe3530000,0xdafffe62,0xe28f7048,
+0xe3190080,0x0afffbb6,0xeafffbea,0xe2197060,
+0x1a000014,0xe0955005,0xe0b44004,0x2a000002,
+0xe1540008,0x0155000a,0x011500a2,0xe2b22000,
+0xe2b11000,0xe2a33000,0x23a01102,0xe2934001,
+0xdaffff10,0xe1b047a4,0x1afffd86,0xe59c5080,
+0xe3150010,0x0afffd4e,0xe2099a07,0xe08c9429,
+0xe889000f,0xeafff1a7,0xe1945005,0x13570060,
+0x0afffff1,0xe1300c87,0x4affffef,0xe2922001,
+0xeaffffea,0xe1b04883,0x1a000013,0xe1915002,
+0x1a00000d,0xe1b0588b,0x0198600a,0x03a014c3,
+0x03a030ff,0x01833383,0x0afffd6a,0xe2955802,
+0x1affffe8,0xe198600a,0x0affffe6,0xe1a01008,
+0xe1a0200a,0xe1a0300b,0xeafffd62,0xe0922002,
+0xe0b11001,0xe2433001,0x5afffffb,0xe1b0588b,
+0x1a000010,0xe198600a,0x1a00000a,0xe2944802,
+0x1a000001,0xe1916002,0x1afffd56,0xe3a01000,
+0xe3a02000,0xe3a030ff,0xe1833383,0xe24f70bc,
+0xe3a04002,0xeafff6b7,0xe09aa00a,0xe0b88008,
+0xe24bb001,0x5afffffb,0xe2956802,0x12946802,
+0x1affff50,0xe2946802,0x1a000006,0xe1916002,
+0x1afffd44,0xe2956802,0x1affffbf,0xe198600a,
+0x03a01331,0x0afffd3f,0xe198600a,0x0afffe09,
+0xe1a01008,0xe1a0200a,0xe1a0300b,0xeafffd39,
+0xe3190080,0x1afff144,0xe2096807,0xe08c6626,
+0xe896000f,0xe1b04d23,0xe28f7000,0x1afff5be,
+0x1886000f,0xe2000102,0xe183b000,0xe1a0a002,
+0xe1a08001,0xe1b06e09,0x4afffacd,0xe08c6c26,
+0xe896000f,0xe1b04d23,0xe28f7000,0x1afff5b2,
+0x1886000f,0xea000014,0xe3190080,0x1afff12e,
+0xe1b08e09,0x4afffabc,0xe08c8c28,0xe898000f,
+0xe1b04d23,0xe28f7000,0x1afff5a7,0x1888000f,
+0xe2000102,0xe183b000,0xe1a0a002,0xe1a08001,
+0xe2096807,0xe08c6626,0xe896000f,0xe1b04d23,
+0xe28f7000,0x1afff59c,0x1886000f,0xe1a0700b,
+0xe3cbb102,0xe1b04883,0x12944802,0x11b0588b,
+0x12955802,0x0a00004e,0xe92c4200,0x5a000035,
+0xe24b4c3f,0xe24440fe,0xe3540010,0xca00002a,
+0xe19a5418,0x1a00002f,0xe2649020,0xe1a09938,
+0xe0000f89,0xe92c0080,0xe3a08102,0xe3a0a000,
+0xe3a07901,0xe257b001,0xe92c0d80,0x3bfff2b6,
+0xe1b090a9,0x3afffffc,0xe8bc0d80,0x192c000f,
+0xebfff2b5,0xe2834001,0x0a000009,0xe3540902,
+0xaa000010,0xe8bc0d80,0xe92c000f,0xe1a00007,
+0xe1a01008,0xe1a0200a,0xe1a0300b,0xebfff2aa,
+0xeaffffee,0xe8bc0080,0xe3170102,0x1bfff2f3,
+0xe8bc4200,0xe2934001,0xdafffe6a,0xe1b047a4,
+0x1afffce0,0xea0000cb,0xe28cc010,0xe8bc4280,
+0xe3170102,0x1afffda3,0xeafffcda,0xe3540040,
+0x2a000012,0xe2545020,0x21b0651a,0x0a000010,
+0xe19a6418,0x0a00000e,0xe3100102,0x1a00000e,
+0xe92c0001,0xe3a00000,0xe92c0d80,0xe3c99601,
+0xeb0000e1,0xe8bc0d80,0xebfff28b,0xeb000166,
+0xe8bc4201,0x0a0000b3,0xe28f7e2f,0xeafff629,
+0x13b05100,0x33a00000,0xeafffff0,0xe8bc4200,
+0xe3a014c7,0xe3a02000,0xe3a030ff,0xe1833383,
+0xeafffcb8,0xe3540000,0x1a00001e,0xe3530000,
+0x0a000002,0xe1916002,0x1afffcb2,0xea000001,
+0xe1916002,0x1a000010,0xe1b0588b,0x1a000006,
+0xe198600a,0x03a01102,0x03a02000,0x03a00000,
+0x03a03901,0x02433001,0xea000096,0xe2955802,
+0x1a000094,0xe198600a,0x0a000092,0xe1a01008,
+0xe1a0200a,0xe1a0300b,0xeafffc9e,0xe0922002,
+0xe0b11001,0xe2433001,0x5afffffb,0xe1b0588b,
+0x12955802,0x1affff8f,0xe35b0000,0x0a000008,
+0xe1a01008,0xe1a0200a,0xe1a00007,0xe1a0300b,
+0xe198600a,0x1afffc8f,0xe3100102,0x13a03000,
+0xea00007c,0xe198600a,0x0affffdd,0xe09aa00a,
+0xe0b88008,0xe24bb001,0x5afffffb,0xe92c4200,
+0xeaffffb4,0xe3190080,0x1afff08f,0xe1b08e09,
+0x4afffa4e,0xe08c8c28,0xe898000f,0xe1b04d23,
+0xe28f7000,0x1afff508,0x1888000f,0xe2000102,
+0xe183b000,0xe1a0a002,0xe1a08001,0xe2096807,
+0xe08c6626,0xe896000f,0xe1b04d23,0xe28f7000,
+0x1afff4fd,0x1886000f,0xe1a0700b,0xe3cbb102,
+0xe1b04883,0x12944802,0x11b0588b,0x12955802,
+0x0a00000a,0xe92c400f,0xe92c0d80,0xebfff27f,
+0xebfff36f,0xe8bc0d80,0xebfff227,0xe2200102,
+0xe8bc0d80,0xebfff178,0xe8bc4000,0xea00004d,
+0xe1b04883,0x1a000010,0xe1915002,0x1a00000a,
+0xe1b0588b,0x0198600a,0x0a000013,0xe2955802,
+0x1a000015,0xe198600a,0x0a000013,0xe1a01008,
+0xe1a0200a,0xe1a0300b,0xeafffc4e,0xe0922002,
+0xe0b11001,0xe2433001,0x5afffffb,0xe1b0588b,
+0x1a000012,0xe198600a,0x1a00000c,0xe2944802,
+0x1a000001,0xe1916002,0x1afffc42,0xe3a01333,
+0xe3b02100,0xe2e23902,0xeafffc3e,0xe3a00000,
+0xe3a01000,0xe3a02000,0xe3a03000,0xea000029,
+0xe09aa00a,0xe0b88008,0xe24bb001,0x5afffffb,
+0xe2956802,0x12946802,0x1affffc9,0xe2946802,
+0x1a000008,0xe1916002,0x1afffc2e,0x03a01333,
+0xe2956802,0x1afffc2b,0xe198600a,0x11a01008,
+0x11a0200a,0xeafffc27,0xe198600a,0x0a000015,
+0xe1a01008,0xe1a0200a,0xe1a0300b,0xeafffc21,
+0xe3190080,0x1afff02c,0xe1b07e09,0x4afff9cb,
+0xe08c8c27,0xe898000f,0xe1b04d23,0xe28f7000,
+0x1afff4a5,0x1888000f,0xe1b04883,0x12944802,
+0x0a00001d,0xe3100102,0x1a000016,0xe92c4000,
+0xeb000029,0xe8bc4000,0xe3190702,0x1a000005,
+0xe28f7018,0xe3530000,0xdafffa5d,0xe3190080,
+0x0afffa2b,0xeafffa5f,0xe3530000,0xba000006,
+0xe59c5080,0xe3150010,0x0afffbd1,0xe2099a07,
+0xe08c9429,0xe889000f,0xeafff02a,0xe3730040,
+0xcafffcce,0xeafffa4e,0xe3a014c6,0xe3a02000,
+0xe3a030ff,0xe1833383,0xeafffbf6,0xe3530000,
+0x1a000008,0xe1914002,0x0afffff6,0xe1b01001,
+0x4affffdb,0xe0922002,0xe0b11001,0xe2433001,
+0x5afffffb,0xeaffffd6,0xe1914002,0x1afffbe9,
+0xe3100102,0x0affffe1,0xeaffffea,0xe28f4f52,
+0xe8940500,0xe1510008,0x0152000a,0xe1a0a0a2,
+0xe18aaf81,0xe1a080a1,0xe3888102,0xe3a0b0fe,
+0xe18bb30b,0xe043400b,0x92444001,0xe92c4210,
+0xe1a0300b,0x8a000005,0xe3c88101,0xe0922002,
+0xe0b11001,0xe2433001,0x5a000003,0xea000008,
+0xe3a00102,0xe2722000,0xe2f11000,0x03520000,
+0x0a000035,0xe0922002,0xe0b11001,0xe2433001,
+0x5afffff9,0xe3a07000,0xebfff1e0,0xe92c000f,
+0xebfff185,0xe92c000f,0xe28f90c4,0xe8b90d00,
+0xebfff125,0xe89c0d80,0xebfff183,0xe8b90d00,
+0xebfff0d8,0xe89c0d80,0xebfff17f,0xe8b90d00,
+0xebfff11d,0xe89c0d80,0xe92c000f,0xe3a00102,
+0xe8b9000e,0xebfff178,0xe8b90d00,0xebfff0cd,
+0xe28c4010,0xe8940d80,0xebfff173,0xe8b90d00,
+0xebfff111,0xe8bc0d80,0xebfff1c4,0xe8bc0d80,
+0xebfff16d,0xe89c0d80,0xebfff16b,0xe8bc0d80,
+0xebfff0bd,0xe8bc0010,0xebfff25e,0xe92c000f,
+0xe3a00000,0xe8b9000e,0xebfff163,0xe8bc0d80,
+0xebfff0b5,0xe8bc0200,0xe3190601,0xe28f7074,
+0x18970d00,0x1bfff15c,0xe8bc8000,0xe3a00000,
+0xe3a03000,0xe28f9050,0xeaffffed,0xb504f333,
+0xf9de6484,0x8eac025b,0x3e7076bb,0x00004004,
+0x9c041fd0,0xa933ef60,0x00004007,0xc05ff4e0,
+0x6c83bb96,0x00004008,0xca20ad9a,0xb5e946e9,
+0x00003ffe,0x83125100,0xb57f6509,0x00004003,
+0x803ff895,0x9dacd228,0x00004005,0xb17217f7,
+0xd1cf79ac,0x00003ffe,0xde5bd8a9,0x37287195,
+0x00003ffd,0xe3190080,0x1affef83,0xe1b07e09,
+0x4afff926,0xe08c8c27,0xe898000f,0xe1b04d23,
+0xe28f7000,0x1afff3fc,0x1888000f,0xe1a04883,
+0xe2944802,0x0a000005,0xe92c4000,0xeb00000a,
+0xe8bc4000,0x0affff57,0xe24f7d0a,0xeafff4cd,
+0xe1914002,0x1afffb63,0xe3100102,0x0affff5b,
+0xe3a00000,0xe3a03000,0xeaffff58,0xe28f4f6e,
+0xe3100102,0x128f4f72,0xe8b40d00,0xe153000b,
+0x01510008,0x0152000a,0x8a00005d,0xe8940d00,
+0xe153000b,0x01510008,0x0152000a,0x3a000052,
+0xe92c421f,0xe28f9e1b,0xe3a07000,0xe8b90d00,
+0xebfff111,0xebfff238,0xe3170102,0x12644000,
+0xe58c4010,0xe92c0d80,0xe3a00000,0xe8b9000e,
+0xebfff109,0xe8bc0d80,0xe92c000f,0xe8b9000e,
+0xe3a00102,0xebfff104,0xe92c000f,0xe28c4020,
+0xe894000f,0xebfff20c,0xe3170102,0x0bfff09e,
+0x1bfff054,0xe1a0400c,0xe92c000f,0xe894000f,
+0xebfff04d,0xe8bc0d80,0xebfff04b,0xe28cc010,
+0xe8bc0d80,0xebfff048,0xe88c000f,0xebfff0ee,
+0xe92c000f,0xe3a07000,0xe8b90d00,0xebfff0ee,
+0xe8b90d00,0xebfff043,0xe89c0d80,0xebfff0ea,
+0xe8b90d00,0xebfff03f,0xe89c0d80,0xebfff0e6,
+0xe8b90d00,0xebfff03b,0xe89c0d80,0xe92c000f,
+0xe3a00000,0xe8b9000e,0xebfff0df,0xe8b90d00,
+0xebfff034,0xe28c7010,0xe8970d80,0xebfff0da,
+0xe8b90d00,0xebfff02f,0xe28c7020,0xe8970d80,
+0xebfff0d5,0xe8bc0d80,0xe92c000f,0xe2200102,
+0xebfff025,0xe1a07000,0xe1a08001,0xe1a0a002,
+0xe1a0b003,0xe8bc000f,0xebfff120,0xe8b90d00,
+0xebfff020,0xe28cc020,0xe8bc4210,0xe2844001,
+0xe0833004,0xe3b04000,0xe1a0f00e,0xe3b00000,
+0xe3a01102,0xe3a02000,0xe3a03901,0xe2433001,
+0xe1a0f00e,0xe3100102,0xe3a00000,0xe3a01000,
+0xe3a02000,0x13a03000,0x13a04008,0x03a030ff,
+0x01833383,0x03b04004,0xe1a0f00e,0xb17217f7,
+0xd1cf79ab,0x0000400c,0x80000000,0x00000000,
+0x00003fbe,0xb21dfe7f,0x09e2baa9,0x0000400c,
+0x80000000,0x00000000,0x00003fbe,0xb8aa3b29,
+0x5c17f0bc,0x00003fff,0xde8082e3,0x08654362,
+0x00003ff2,0xb1800000,0x00000000,0x00003ffe,
+0xc99b1867,0x2822a93e,0x00003fea,0xa57862e1,
+0x46a6fb39,0x00003ff4,0xe8b9428e,0xfecff592,
+0x00003ffa,0x80000000,0x00000000,0x00003ffe,
+0x845a2157,0x3490f106,0x00003ff0,0xf83a5f91,
+0x50952c99,0x00003ff7,0x80000000,0x00000000,
+0x00003ffd,0x80000000,0x00000000,0x00003ffe,
+0xe3190080,0x1affeecc,0xe1b07e09,0x4afff873,
+0xe08c8c27,0xe898000f,0xe1b04d23,0xe28f7000,
+0x1afff345,0x1888000f,0xe1a04883,0xe2944802,
+0x0a000006,0xe92c4000,0xeb000007,0xe8bc4000,
+0x0afffea0,0xe24f705c,0xe2477c05,0xeafff415,
+0xe1914002,0x03a01332,0xeafffaaa,0xe28f4f8f,
+0xe8b40d00,0xe153000b,0x01510008,0x0152000a,
+0x8a00006c,0xe1b01001,0x5a000063,0xe92c421f,
+0xe3190601,0xe28f9e22,0xe3a07000,0xe8b90d00,
+0xebfff061,0xebfff188,0x1b00006d,0xe58c4010,
+0xe92c0d80,0xe3a00000,0xe8b9000e,0xebfff05a,
+0xe8bc0d80,0xe92c000f,0xe8b9000e,0xe3a00102,
+0xebfff055,0xe92c000f,0xe28c4020,0xe894000f,
+0xebfff15d,0xe3170102,0x0bffefef,0x1bffefa5,
+0xe1a0400c,0xe92c000f,0xe894000f,0xebffef9e,
+0xe8bc0d80,0xebffef9c,0xe28cc010,0xe8bc0d80,
+0xebffef99,0xe3a04c3f,0xe38440df,0xe1530004,
+0xba000037,0xe88c000f,0xebfff03b,0xe92c000f,
+0xe3a07000,0xe8b90d00,0xebfff03b,0xe8b90d00,
+0xebffefd9,0xe89c0d80,0xebfff037,0xe8b90d00,
+0xebffef8c,0xe89c0d80,0xebfff033,0xe8b90d00,
+0xebffefd1,0xe89c0d80,0xebfff02f,0xe8b90d00,
+0xebffef84,0xe89c0d80,0xe92c000f,0xe3a00102,
+0xe8b9000e,0xebfff028,0xe8b90d00,0xebffef7d,
+0xe28c7010,0xe8970d80,0xebfff023,0xe8b90d00,
+0xebffefc1,0xe28c7010,0xe8970d80,0xebfff01e,
+0xe28c7020,0xe8970d80,0xebfff01b,0xe28c7020,
+0xe8970d80,0xebffef6c,0xe8bc0d80,0xe28cc020,
+0xe8bc0010,0xe3140001,0x12200102,0x1bfff1a7,
+0xe29b4902,0x4a000018,0xe35b0000,0x0198400a,
+0x0a000015,0xebfff061,0xe8bc4200,0xe3b04000,
+0xe1a0f00e,0xe24cc010,0xe3a07000,0xe3a08102,
+0xe3b0a100,0xe2eab901,0xeaffffeb,0xe1914002,
+0x0affff99,0xe2433001,0xe0922002,0xe0b11001,
+0x5afffffb,0xeaffff94,0xe3a01332,0xe3b02100,
+0xe2f23902,0xe3a04001,0xe1a0f00e,0xe3a01000,
+0xe3b02100,0xe2f33902,0xe3a04004,0xe8bc4200,
+0xe1a0f00e,0xe2844001,0xe35b0000,0x03a08102,
+0xe3a06901,0x0246b002,0x01a0f00e,0xe2466002,
+0xe04b6006,0xe3a05102,0xe153000b,0x01510008,
+0x0152000a,0x20888635,0x21a0f00e,0xe0588635,
+0x51a08088,0x524bb001,0xe2444001,0xe1a0f00e,
+0xc90fdaa2,0x00000000,0x0000401d,0xa2f9836e,
+0x4e44152a,0x00003ffe,0x95777a5c,0xf72cece6,
+0x00003fed,0xc9100000,0x00000000,0x00003fff,
+0x85bba783,0xb3c748a9,0x00003fea,0xa37b24c8,
+0x4a42092e,0x00003ff3,0xd23cf50b,0xf10aca84,
+0x00003ff9,0xeef5823f,0xdecea969,0x00003ffd,
+0x80000000,0x00000000,0x00003fff,0x95d5b975,
+0x16391da8,0x00003fef,0xe0741531,0xdd56f650,
+0x00003ff6,0x8895af2a,0x6847fcd5,0x00003ffc,
+0xe3190080,0x1affee00,0xe1b07e09,0x4afff7ab,
+0xe08c8c27,0xe898000f,0xe1b04d23,0xe28f7000,
+0x1afff279,0x1888000f,0xe1a04883,0xe2944802,
+0x0a000015,0xe1c00589,0xe92c4000,0xe1914002,
+0x12433001,0xebffff38,0x1a000012,0xe92c000f,
+0xebffefa1,0xe3a08102,0xe3b0a100,0xe2eab901,
+0xebffeef8,0xe1a07000,0xe1a08001,0xe1a0a002,
+0xe1a0b003,0xe8bc000f,0xebffeff0,0xe1914002,
+0x12833001,0xe8bc4000,0xeafffdc2,0xe1914002,
+0x03a014c9,0xeafff9cf,0xe8bc4000,0xe3540004,
+0x03a03000,0x03a00000,0x0afffdba,0xe3a014c9,
+0xe3b02100,0xe2e23902,0xeafff9c6,0xe3190080,
+0x1affedd1,0xe1b07e09,0x4afff780,0xe08c8c27,
+0xe898000f,0xe1b04d23,0xe28f7000,0x1afff24a,
+0x1888000f,0xe1b04883,0x0a00006b,0x52944802,
+0x4a000072,0xe92c4201,0xe3a00000,0xe3a05901,
+0xe2455002,0xe1530005,0xaa000009,0xe2094501,
+0xe92c0010,0xe3a04901,0xe2444021,0xe1530004,
+0xba000049,0xe92c000f,0xebffef6b,0xe92c000f,
+0xea000012,0xe2094501,0xe2244501,0xe92c0010,
+0xe3a00102,0xe3a08102,0xe3b0a100,0xe2eab901,
+0xebffeebc,0xe1914002,0x0a00003b,0xe2433001,
+0xe24cc010,0xe92c000f,0xebfff01c,0xe2200102,
+0xe2833001,0xe28c4010,0xe884000f,0xe89c000f,
+0xe28f9f59,0xe8b90d00,0xebffeef7,0xe89c0d80,
+0xebffef55,0xe8b90d00,0xebffeeaa,0xe89c0d80,
+0xebffef51,0xe8b90d00,0xebffeeef,0xe89c0d80,
+0xebffef4d,0xe8b90d00,0xebffeea2,0xe89c0d80,
+0xebffef49,0xe8b90d00,0xebffeee7,0xe89c0d80,
+0xe92c000f,0xe3a00102,0xe8b9000e,0xebffef42,
+0xe8b90d00,0xebffee97,0xe28c7010,0xe8970d80,
+0xebffef3d,0xe8b90d00,0xebffeedb,0xe28c7010,
+0xe8970d80,0xebffef38,0xe8b90d00,0xebffee8d,
+0xe28c7010,0xe8970d80,0xebffef33,0xe8b90d00,
+0xebffeed1,0xe28c7010,0xe8970d80,0xebffef2e,
+0xe8bc0d80,0xe28cc010,0xebffef80,0xe89c0d80,
+0xebffef29,0xe8bc0d80,0xebffee7b,0xe8bc0230,
+0xe3190501,0x0a000008,0xe3150102,0x028f5c01,
+0x128f5f46,0xe0855924,0x02200102,0xe8950d00,
+0xebffee74,0xe8bc4000,0xeafffd46,0xe3150102,
+0xe28f50dc,0xe0855924,0xe8950d00,0xebffee6d,
+0x12200102,0xe8bc4000,0xeafffd3e,0xe1915002,
+0x0affff93,0xe1b01001,0x4affff91,0xe2433001,
+0xe0922002,0xe0b11001,0x5afffffb,0xeaffff8c,
+0xe2f35901,0x01925081,0x0affff89,0xe2944802,
+0x1a000001,0xe1914002,0x1afff93e,0xe3a014ca,
+0xe3b02100,0xe2e23902,0xeafff93a,0xbe974377,
+0xcc30f9e6,0x00004003,0x96f3e4b2,0xc8e37cbc,
+0x00004006,0xbeee77e2,0xb5423cf3,0x00004007,
+0xd0927880,0xf5c2170b,0x00004007,0xa43601f1,
+0x5c3e6196,0x00004006,0xb25dedaf,0x30f3242c,
+0x00003ffe,0xa270bb27,0x61c93957,0x00004002,
+0x9ec1654d,0x36d4f820,0x00004004,0xe4d539b0,
+0x56a451ad,0x00004004,0xdaf2ad41,0xd05311c4,
+0x00004003,0x00000000,0x00000000,0x00000000,
+0x00000000,0xc90fdaa2,0x2168c235,0x00003fff,
+0xc90fdaa2,0x2168c235,0x00004000,0x00000000,
+0xc90fdaa2,0x2168c235,0x00003fff,0xe3190080,
+0x1affed19,0xe2096807,0xe08c6626,0xe896000f,
+0xe1b04d23,0xe28f7000,0x1afff193,0x1886000f,
+0xe2000102,0xe183b000,0xe1a0a002,0xe1a08001,
+0xe1b06e09,0x4afff6c9,0xe08c6c26,0xe896000f,
+0xe1b04d23,0xe28f7000,0x1afff187,0x1886000f,
+0xe1a0700b,0xe3cbb102,0xe1b04883,0x12944802,
+0x11b0588b,0x12955802,0x192c4281,0x1bffef0b,
+0x1a00004e,0xe1b04883,0x1a000010,0xe1915002,
+0x1a00000a,0xe1b0588b,0x0198600a,0x0a00001f,
+0xe2955802,0x1a000016,0xe198600a,0x0a000014,
+0xe1a01008,0xe1a0200a,0xe1a0300b,0xeafff8e1,
+0xe0922002,0xe0b11001,0xe2433001,0x5afffffb,
+0xe1b0588b,0x1a000019,0xe198600a,0x1a000013,
+0xe2944802,0x1a000001,0xe1916002,0x1afff8d5,
+0xe1a04000,0xe1a05007,0xe28f0fbd,0xe890000e,
+0xea00008c,0xe1a04000,0xe1a05007,0xe3a00000,
+0xe3a01000,0xe3a02000,0xe3a03000,0xea00007d,
+0xe3a014cb,0xe3b02100,0xe2e23902,0xeafff8c5,
+0xe09aa00a,0xe0b88008,0xe24bb001,0x5afffffb,
+0xe2956802,0x12946802,0x1affffca,0xe2946802,
+0x1a000006,0xe1916002,0x1afff8ba,0xe2956802,
+0x1affffe2,0xe198600a,0x03a014cb,0x0afff8b5,
+0xe198600a,0x0affffe2,0xe1a01008,0xe1a0200a,
+0xe1a0300b,0xeafff8af,0xe3190080,0x1affecba,
+0xe1b07e09,0x4afff671,0xe08c8c27,0xe898000f,
+0xe1b04d23,0xe28f7000,0x1afff133,0x1888000f,
+0xe1b04883,0x12944802,0x0a000060,0xe92c4281,
+0xe3b00100,0xe2f34901,0xdbffeeb0,0xd3a04002,
+0xc3a04000,0xe28f9d06,0xe8b90d00,0xe153000b,
+0x01510008,0x0152000a,0xc2844001,0xe92c0010,
+0xda00000d,0xe92c000f,0xe8990d00,0xebffedad,
+0xe8bc0d80,0xe92c000f,0xe3a00000,0xe8b9000e,
+0xebffee51,0xe3a08102,0xe3b0a100,0xe2eab901,
+0xebffeded,0xe8bc0d80,0xebffeea0,0xe3a04901,
+0xe2444021,0xe1530004,0xba00002c,0xe92c000f,
+0xebffee41,0xe92c000f,0xe28f9f49,0xe8b90d00,
+0xebffed98,0xe89c0d80,0xebffee3f,0xe8b90d00,
+0xebffed94,0xe89c0d80,0xebffee3b,0xe8b90d00,
+0xebffed90,0xe89c0d80,0xebffee37,0xe8b90d00,
+0xebffed8c,0xe89c0d80,0xe92c000f,0xe3a00102,
+0xe8b9000e,0xebffee30,0xe8b90d00,0xebffedce,
+0xe28c7010,0xe8970d80,0xebffee2b,0xe8b90d00,
+0xebffedc9,0xe28c7010,0xe8970d80,0xebffee26,
+0xe8b90d00,0xebffedc4,0xe28c7010,0xe8970d80,
+0xebffee21,0xe8bc0d80,0xe28cc010,0xebffee73,
+0xe89c0d80,0xebffee1c,0xe8bc0d80,0xebffed6e,
+0xe28f90dc,0xe8bc0010,0xe0200f04,0xe0899204,
+0xe8990d00,0xebffed6b,0xe8bc4230,0xe3190601,
+0x10200004,0x1afffc3b,0xe3150102,0x0a000005,
+0xe92c4010,0xe2200102,0xe24f7d0d,0xe8970d00,
+0xebffed60,0xe8bc4010,0xe0200004,0xeafffc31,
+0xe3530000,0x0afffc2f,0xe1914002,0x1afff83d,
+0xe28f009c,0xe890000e,0xeafffc2a,0x8930a2f4,
+0xf66ab18a,0x00003ffd,0xddb3d742,0xc265539e,
+0x00003fff,0xf0624f0a,0x56388310,0x00004002,
+0xee505190,0x6d1eb4e8,0x00004004,0xac509020,
+0x5b6d243b,0x00004005,0xa443e5e6,0x24ad4b90,
+0x00004004,0xd66bd6cd,0x8c3de934,0x00003ffe,
+0x87e9fae4,0x6b531a29,0x00004002,0xa40bfdcf,
+0x15e65691,0x00004003,0xdb053288,0x30e70eb4,
+0x00004002,0x00000000,0x00000000,0x00000000,
+0x00000000,0x860a91c1,0x6b9b2c23,0x00003ffe,
+0x00000000,0xc90fdaa2,0x2168c235,0x00003fff,
+0x00000000,0x860a91c1,0x6b9b2c23,0x00003fff,
+0xe92d5001,0xe24fc05c,0xe24ccc50,0xe3a00807,
+0xe58c0080,0xe8bd9001,0xe1a00000,0xe3100001,
+0x128f0e15,0x1a00000a,0xe3100004,0x128f0f47,
+0x1a000007,0xe3100002,0x128f00e0,0x1a000004,
+0xe3100008,0x128f00a8,0x1a000001,0xe28f0070,
+0xeaffffff,0xe28f101c,0xe14fb000,0xe8bd07f8,
+0xe8a107f8,0xe8bd07f8,0xe24aa004,0xe8a10ff8,
+0xe28f1000,0xef000071,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00000000,
+0x00000000,0x00000000,0x00000000,0x00002278,
+0xffffffff,0x80000204,0x616f6c46,0x676e6974,
+0x696f5020,0x4520746e,0x70656378,0x6e6f6974,
+0x49203a20,0x6178656e,0x52207463,0x6c757365,
+0x00000074,0x80000203,0x616f6c46,0x676e6974,
+0x696f5020,0x4520746e,0x70656378,0x6e6f6974,
+0x55203a20,0x7265646e,0x776f6c66,0x00000000,
+0x80000202,0x616f6c46,0x676e6974,0x696f5020,
+0x4520746e,0x70656378,0x6e6f6974,0x44203a20,
+0x64697669,0x79422065,0x72655a20,0x0000006f,
+0x80000201,0x616f6c46,0x676e6974,0x696f5020,
+0x4520746e,0x70656378,0x6e6f6974,0x4f203a20,
+0x66726576,0x00776f6c,0x80000200,0x616f6c46,
+0x676e6974,0x696f5020,0x4520746e,0x70656378,
+0x6e6f6974,0x49203a20,0x6c61766e,0x4f206469,
+0x61726570,0x6e6f6974,0x00000000,0xfefefeff,0} ;
+
+unsigned long fpesize = 0x00005300 ;
diff --git a/sim/arm/armopts.h b/sim/arm/armopts.h
new file mode 100644
index 0000000..6ec0f2f
--- /dev/null
+++ b/sim/arm/armopts.h
@@ -0,0 +1,30 @@
+/* armopts.h -- ARMulator configuration options: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* Define one of ARM60 or ARM61 */
+#ifndef ARM60
+#ifndef ARM61
+#define ARM60
+#endif
+#endif
+
+/* define for a little endian ARMulator */
+#ifndef LITTLEEND
+#ifndef BIGEND
+#define LITTLEEND
+#endif
+#endif
diff --git a/sim/arm/armos.h b/sim/arm/armos.h
new file mode 100644
index 0000000..bae2f6e
--- /dev/null
+++ b/sim/arm/armos.h
@@ -0,0 +1,64 @@
+/* armos.h -- ARMulator OS definitions: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/***************************************************************************\
+* Define the initial layout of memory *
+\***************************************************************************/
+
+#define ADDRSUPERSTACK 0x800L /* supervisor stack space */
+#define ADDRUSERSTACK 0x80000L /* default user stack start */
+#define ADDRSOFTVECTORS 0x840L /* soft vectors are here */
+#define ADDRCMDLINE 0xf00L /* command line is here after a SWI GetEnv */
+#define ADDRSOFHANDLERS 0xad0L /* address and workspace for installed handlers */
+#define SOFTVECTORCODE 0xb80L /* default handlers */
+
+/***************************************************************************\
+* SWI numbers *
+\***************************************************************************/
+
+#define SWI_WriteC 0x0
+#define SWI_Write0 0x2
+#define SWI_ReadC 0x4
+#define SWI_CLI 0x5
+#define SWI_GetEnv 0x10
+#define SWI_Exit 0x11
+#define SWI_EnterOS 0x16
+
+#define SWI_GetErrno 0x60
+#define SWI_Clock 0x61
+#define SWI_Time 0x63
+#define SWI_Remove 0x64
+#define SWI_Rename 0x65
+#define SWI_Open 0x66
+
+#define SWI_Close 0x68
+#define SWI_Write 0x69
+#define SWI_Read 0x6a
+#define SWI_Seek 0x6b
+#define SWI_Flen 0x6c
+
+#define SWI_IsTTY 0x6e
+#define SWI_TmpNam 0x6f
+#define SWI_InstallHandler 0x70
+#define SWI_GenerateError 0x71
+
+#define FPESTART 0x2000L
+#define FPEEND 0x8000L
+#define FPEOLDVECT FPESTART + 0x100L + 8L * 16L + 4L /* stack + 8 regs + fpsr */
+#define FPENEWVECT(addr) 0xea000000L + ((addr) >> 2) - 3L /* branch from 4 to 0x2400 */
+extern unsigned long fpecode[] ;
+extern unsigned long fpesize ;
diff --git a/sim/arm/armrdi.c b/sim/arm/armrdi.c
new file mode 100644
index 0000000..665d03f
--- /dev/null
+++ b/sim/arm/armrdi.c
@@ -0,0 +1,1042 @@
+/* armrdi.c -- ARMulator RDI interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <string.h>
+#include <ctype.h>
+#include "armdefs.h"
+#include "armemu.h"
+#include "armos.h"
+#include "dbg_cp.h"
+#include "dbg_conf.h"
+#include "dbg_rdi.h"
+#include "dbg_hif.h"
+#include "communicate.h"
+
+/***************************************************************************\
+* Declarations *
+\***************************************************************************/
+
+#define Watch_AnyRead (RDIWatch_ByteRead+RDIWatch_HalfRead+RDIWatch_WordRead)
+#define Watch_AnyWrite (RDIWatch_ByteWrite+RDIWatch_HalfWrite+RDIWatch_WordWrite)
+
+static unsigned FPRegsAddr ; /* last known address of FPE regs */
+#define FPESTART 0x2000L
+#define FPEEND 0x8000L
+
+#define IGNORE(d) (d = d)
+#ifdef RDI_VERBOSE
+#define TracePrint(s) \
+ if (rdi_log & 1) ARMul_DebugPrint s
+#else
+#define TracePrint(s)
+#endif
+
+static ARMul_State *state = NULL ;
+static unsigned BreaksSet ; /* The number of breakpoints set */
+
+static int rdi_log = 0 ; /* debugging ? */
+
+#define LOWEST_RDI_LEVEL 0
+#define HIGHEST_RDI_LEVEL 1
+static int MYrdi_level = LOWEST_RDI_LEVEL;
+
+typedef struct BreakNode BreakNode;
+typedef struct WatchNode WatchNode;
+
+struct BreakNode { /* A breakpoint list node */
+ BreakNode *next ;
+ ARMword address ; /* The address of this breakpoint */
+ unsigned type ; /* The type of comparison */
+ ARMword bound ; /* The other address for a range */
+ ARMword inst;
+ };
+
+struct WatchNode { /* A watchpoint list node */
+ WatchNode *next ;
+ ARMword address ; /* The address of this watchpoint */
+ unsigned type ; /* The type of comparison */
+ unsigned datatype ; /* The type of access to watch for */
+ ARMword bound ; /* The other address for a range */
+ };
+
+BreakNode *BreakList = NULL ;
+WatchNode *WatchList = NULL ;
+
+void ARMul_DebugPrint_i(const Dbg_HostosInterface *hostif, const char *format, ...)
+{ va_list ap;
+ va_start(ap, format);
+ hostif->dbgprint(hostif->dbgarg, format, ap);
+ va_end(ap);
+}
+
+void ARMul_DebugPrint(ARMul_State *state, const char *format, ...)
+{ va_list ap;
+ va_start(ap, format);
+ if(!(rdi_log & 8))
+ state->hostif->dbgprint(state->hostif->dbgarg, format, ap);
+ va_end(ap);
+}
+
+#define CONSOLE_PRINT_MAX_LEN 128
+
+void ARMul_ConsolePrint(ARMul_State *state, const char *format, ...)
+{
+ va_list ap;
+ int ch;
+ char *str, buf[CONSOLE_PRINT_MAX_LEN];
+ int i, j;
+ ARMword junk;
+
+ va_start(ap, format);
+ vsprintf(buf, format, ap);
+
+ for (i = 0; buf[i] ;i++); /* The string is i chars long */
+
+ str = buf;
+ while (i >= 32) {
+ MYwrite_char(kidmum[1], RDP_OSOp);
+ MYwrite_word(kidmum[1], SWI_Write0);
+ MYwrite_char(kidmum[1], OS_SendString);
+ MYwrite_char(kidmum[1], 32); /* Send string 32bytes at a time */
+ for (j = 0; j < 32; j++, str++)
+ MYwrite_char(kidmum[1], *str);
+ wait_for_osreply(&junk);
+ i -= 32;
+ }
+
+ if (i > 0) {
+ MYwrite_char(kidmum[1], RDP_OSOp);
+ MYwrite_word(kidmum[1], SWI_Write0);
+ MYwrite_char(kidmum[1], OS_SendString);
+ MYwrite_char(kidmum[1], (unsigned char) i); /* Send remainder of string */
+ for (j = 0; j < i; j++, str++)
+ MYwrite_char(kidmum[1], *str);
+ wait_for_osreply(&junk);
+ }
+ return;
+
+/* str = buf; */
+/* while ((ch=*str++) != 0) */
+/* state->hostif->writec(state->hostif->hostosarg, ch); */
+}
+
+void ARMul_DebugPause(ARMul_State *state)
+{
+ if(!(rdi_log & 8))
+ state->hostif->dbgpause(state->hostif->dbgarg);
+}
+
+/***************************************************************************\
+* RDI_open *
+\***************************************************************************/
+
+static void InitFail(int exitcode, char const *which) {
+ ARMul_ConsolePrint(state, "%s interface failed to initialise. Exiting\n",
+ which);
+ exit(exitcode);
+}
+
+static void RDIInit(unsigned type)
+{if (type == 0) { /* cold start */
+ state->CallDebug = state->MemReadDebug = state->MemWriteDebug = 0 ;
+ BreaksSet = 0 ;
+ }
+ }
+
+#define UNKNOWNPROC 0
+
+typedef struct { char name[16]; unsigned val; } Processor;
+
+Processor const p_arm2 = {"ARM2", ARM2};
+Processor const p_arm2as = {"ARM2AS", ARM2as};
+Processor const p_arm61 = {"ARM61", ARM61};
+Processor const p_arm3 = {"ARM3", ARM3};
+Processor const p_arm6 = {"ARM6", ARM6};
+Processor const p_arm60 = {"ARM60", ARM60};
+Processor const p_arm600 = {"ARM600", ARM600};
+Processor const p_arm610 = {"ARM610", ARM610};
+Processor const p_arm620 = {"ARM620", ARM620};
+Processor const p_unknown= {"", UNKNOWNPROC};
+
+Processor const *const processors[] = {
+ &p_arm6, /* default: must come first */
+ &p_arm2,
+ &p_arm2as,
+ &p_arm61,
+ &p_arm3,
+ &p_arm60,
+ &p_arm600,
+ &p_arm610,
+ &p_arm620,
+ &p_unknown
+};
+
+typedef struct ProcessorConfig ProcessorConfig;
+struct ProcessorConfig {
+ long id[2];
+ ProcessorConfig const *self;
+ long count;
+ Processor const * const *processors;
+};
+
+ProcessorConfig const processorconfig = {
+ { ((((((long)'x' << 8) | ' ') << 8) | 'c') << 8) | 'p',
+ ((((((long)'u' << 8) | 's') << 8) | ' ') << 8) | 'x'
+ },
+ &processorconfig,
+ 16,
+ processors
+};
+
+static int RDI_open(unsigned type, const Dbg_ConfigBlock *config,
+ const Dbg_HostosInterface *hostif,
+ struct Dbg_MCState *dbg_state)
+/* Initialise everything */
+{int virgin = (state == NULL);
+ IGNORE(dbg_state);
+
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ if (virgin)
+ ARMul_DebugPrint_i(hostif, "RDI_open: type = %d\n",type) ;
+ else
+ ARMul_DebugPrint(state, "RDI_open: type = %d\n",type) ;
+ }
+#endif
+
+ if (type & 1) { /* Warm start */
+ ARMul_Reset(state) ;
+ RDIInit(1) ;
+ }
+ else {
+ if (virgin) {
+ ARMul_EmulateInit();
+ state = ARMul_NewState();
+ state->hostif = hostif;
+ { int req = config->processor;
+ unsigned processor = processors[req]->val;
+ ARMul_SelectProcessor(state, processor);
+ ARMul_Reset(state);
+ ARMul_ConsolePrint(state, "ARMulator V1.50, %s", processors[req]->name);
+ }
+ if (ARMul_MemoryInit(state,config->memorysize) == FALSE)
+ InitFail(1, "Memory");
+ if (config->bytesex != RDISex_DontCare)
+ state->bigendSig = config->bytesex ;
+ if (ARMul_CoProInit(state) == FALSE)
+ InitFail(2, "Co-Processor");
+ if (ARMul_OSInit(state) == FALSE)
+ InitFail(3, "Operating System");
+ }
+ ARMul_Reset(state) ;
+ RDIInit(0) ;
+ }
+ if (type & 2) { /* Reset the comms link */
+ /* what comms link ? */
+ }
+ if (virgin && (type & 1) == 0) /* Cold start */
+ ARMul_ConsolePrint(state, ", %s endian.\n",
+ state->bigendSig ? "Big" : "Little");
+
+ if (config->bytesex == RDISex_DontCare)
+ return(state->bigendSig ? RDIError_BigEndian : RDIError_LittleEndian);
+ else
+ return(RDIError_NoError) ;
+}
+
+/***************************************************************************\
+* RDI_close *
+\***************************************************************************/
+
+static int RDI_close(void)
+{
+ TracePrint((state, "RDI_close\n"));
+ ARMul_OSExit(state) ;
+ ARMul_CoProExit(state) ;
+ ARMul_MemoryExit(state) ;
+ return(RDIError_NoError) ;
+ }
+
+/***************************************************************************\
+* RDI_read *
+\***************************************************************************/
+
+static int RDI_read(ARMword source, void *dest, unsigned *nbytes)
+{unsigned i ;
+ char *memptr = (char *)dest ;
+
+ TracePrint((state, "RDI_read: source=%.8lx dest=%p nbytes=%.8x\n",
+ source, dest, *nbytes));
+
+ for (i=0 ; i < *nbytes ; i++)
+ *memptr++ = (char)ARMul_ReadByte(state,source++) ;
+ if (state->abortSig) {
+ state->abortSig = LOW ;
+ return(RDIError_DataAbort) ;
+ }
+ return(RDIError_NoError) ;
+ }
+
+/***************************************************************************\
+* RDI_write *
+\***************************************************************************/
+
+static int RDI_write(const void *source, ARMword dest, unsigned *nbytes)
+{unsigned i ;
+ char *memptr = (char *)source ;
+
+ TracePrint((state, "RDI_write: source=%p dest=%.8lx nbytes=%.8x\n",
+ source, dest, *nbytes));
+
+ for (i=0 ; i < *nbytes ; i++)
+ ARMul_WriteByte(state,(ARMword)dest++,(ARMword)*memptr++) ;
+
+ if (state->abortSig) {
+ state->abortSig = LOW ;
+ return(RDIError_DataAbort) ;
+ }
+ return(RDIError_NoError) ;
+ }
+
+/***************************************************************************\
+* RDI_CPUread *
+\***************************************************************************/
+
+static int RDI_CPUread(unsigned mode, unsigned long mask, ARMword buffer[])
+{unsigned i , upto ;
+
+ if (mode == RDIMode_Curr)
+ mode = (unsigned)(ARMul_GetCPSR(state) & MODEBITS) ;
+
+ for (upto = 0, i = 0 ; i < 15 ; i++)
+ if (mask & (1L << i)){
+ buffer[upto++] = ARMul_GetReg(state,mode,i) ;
+ }
+
+ if (mask & RDIReg_R15) {
+ buffer[upto++] = ARMul_GetR15(state) ;
+ }
+
+ if (mask & RDIReg_PC) {
+ buffer[upto++] = ARMul_GetPC(state) ;
+ }
+
+ if (mask & RDIReg_CPSR)
+ buffer[upto++] = ARMul_GetCPSR(state) ;
+
+ if (mask & RDIReg_SPSR)
+ buffer[upto++] = ARMul_GetSPSR(state,mode) ;
+
+ TracePrint((state, "RDI_CPUread: mode=%.8x mask=%.8lx", mode, mask));
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ for (upto = 0, i = 0 ; i <= 20 ; i++)
+ if (mask & (1L << i)) {
+ ARMul_DebugPrint(state, "%c%.8lx",upto%4==0?'\n':' ',buffer[upto]) ;
+ upto++ ;
+ }
+ ARMul_DebugPrint(state, "\n") ;
+ }
+#endif
+
+ return(RDIError_NoError) ;
+}
+
+/***************************************************************************\
+* RDI_CPUwrite *
+\***************************************************************************/
+
+static int RDI_CPUwrite(unsigned mode, unsigned long mask, ARMword const buffer[])
+{int i, upto;
+
+
+ TracePrint((state, "RDI_CPUwrite: mode=%.8x mask=%.8lx", mode, mask));
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ for (upto = 0, i = 0 ; i <= 20 ; i++)
+ if (mask & (1L << i)) {
+ ARMul_DebugPrint(state, "%c%.8lx",upto%4==0?'\n':' ',buffer[upto]) ;
+ upto++ ;
+ }
+ ARMul_DebugPrint(state, "\n") ;
+ }
+#endif
+
+ if (mode == RDIMode_Curr)
+ mode = (unsigned)(ARMul_GetCPSR(state) & MODEBITS) ;
+
+ for (upto = 0, i = 0 ; i < 15 ; i++)
+ if (mask & (1L << i))
+ ARMul_SetReg(state,mode,i,buffer[upto++]) ;
+
+ if (mask & RDIReg_R15)
+ ARMul_SetR15(state,buffer[upto++]) ;
+
+ if (mask & RDIReg_PC) {
+
+ ARMul_SetPC(state,buffer[upto++]) ;
+ }
+ if (mask & RDIReg_CPSR)
+ ARMul_SetCPSR(state,buffer[upto++]) ;
+
+ if (mask & RDIReg_SPSR)
+ ARMul_SetSPSR(state,mode,buffer[upto++]) ;
+
+ return(RDIError_NoError) ;
+}
+
+/***************************************************************************\
+* RDI_CPread *
+\***************************************************************************/
+
+static int RDI_CPread(unsigned CPnum, unsigned long mask, ARMword buffer[])
+{ARMword fpregsaddr, word[4] ;
+
+ unsigned r, w ;
+ unsigned upto ;
+
+ if (CPnum != 1 && CPnum != 2) {
+ unsigned char const *rmap = state->CPRegWords[CPnum];
+ if (rmap == NULL)
+ return(RDIError_UnknownCoPro) ;
+ for (upto = 0, r = 0 ; r < rmap[-1] ; r++)
+ if (mask & (1L << r)) {
+ (void)state->CPRead[CPnum](state, r, &buffer[upto]);
+ upto += rmap[r];
+ }
+ TracePrint((state, "RDI_CPread: CPnum=%d mask=%.8lx", CPnum, mask));
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ w = 0;
+ for (upto = 0, r = 0; r < rmap[-1]; r++)
+ if (mask & (1L << r)) {
+ int words = rmap[r];
+ ARMul_DebugPrint(state, "%c%2d", (w >= 4 ? (w = 0, '\n') : ' '), r);
+ while (--words >= 0) {
+ ARMul_DebugPrint(state, " %.8lx", buffer[upto++]);
+ w++;
+ }
+ }
+ ARMul_DebugPrint(state, "\n") ;
+ }
+#endif
+ return RDIError_NoError;
+ }
+
+#ifdef NOFPE
+ return RDIError_UnknownCoPro;
+
+#else
+ if (FPRegsAddr == 0) {
+ fpregsaddr = ARMul_ReadWord(state, 4L) ;
+ if ((fpregsaddr & 0xff800000) != 0xea000000) /* Must be a forward branch */
+ return RDIError_UnknownCoPro;
+ fpregsaddr = ((fpregsaddr & 0xffffff) << 2) + 8 ; /* address in __fp_decode - 4 */
+ if ((fpregsaddr < FPESTART) || (fpregsaddr >= FPEEND))
+ return RDIError_UnknownCoPro;
+ fpregsaddr = ARMul_ReadWord(state, fpregsaddr) ; /* pointer to fp registers */
+ FPRegsAddr = fpregsaddr ;
+ }
+ else
+ fpregsaddr = FPRegsAddr ;
+
+ if (fpregsaddr == 0) return RDIError_UnknownCoPro;
+ for (upto = 0, r = 0 ; r < 8 ; r++)
+ if (mask & (1L << r)) {
+ for (w = 0 ; w < 4 ; w++)
+ word[w] = ARMul_ReadWord(state,fpregsaddr + (ARMword)r * 16 + (ARMword)w * 4) ;
+ switch ((int)(word[3] >> 29)) {
+ case 0 :
+ case 2 :
+ case 4 :
+ case 6 : /* its unpacked, convert to extended */
+ buffer[upto++] = 2 ; /* mark as extended */
+ buffer[upto++] = (word[3] & 0x7fff) | (word[0] & 0x80000000) ; /* exp and sign */
+ buffer[upto++] = word[1] ; /* mantissa 1 */
+ buffer[upto++] = word[2] ; /* mantissa 2 */
+ break ;
+ case 1 : /* packed single */
+ buffer[upto++] = 0 ; /* mark as single */
+ buffer[upto++] = word[0] ; /* sign, exp and mantissa */
+ buffer[upto++] = word[1] ; /* padding */
+ buffer[upto++] = word[2] ; /* padding */
+ break ;
+ case 3 : /* packed double */
+ buffer[upto++] = 1 ; /* mark as double */
+ buffer[upto++] = word[0] ; /* sign, exp and mantissa1 */
+ buffer[upto++] = word[1] ; /* mantissa 2 */
+ buffer[upto++] = word[2] ; /* padding */
+ break ;
+ case 5 : /* packed extended */
+ buffer[upto++] = 2 ; /* mark as extended */
+ buffer[upto++] = word[0] ; /* sign and exp */
+ buffer[upto++] = word[1] ; /* mantissa 1 */
+ buffer[upto++] = word[2] ; /* mantissa 2 */
+ break ;
+ case 7 : /* packed decimal */
+ buffer[upto++] = 3 ; /* mark as packed decimal */
+ buffer[upto++] = word[0] ; /* sign, exp and mantissa1 */
+ buffer[upto++] = word[1] ; /* mantissa 2 */
+ buffer[upto++] = word[2] ; /* mantissa 3 */
+ break ;
+ }
+ }
+ if (mask & (1L << r))
+ buffer[upto++] = ARMul_ReadWord(state,fpregsaddr + 128) ; /* fpsr */
+ if (mask & (1L << (r+1) ))
+ buffer[upto++] = 0 ; /* fpcr */
+
+ TracePrint((state, "RDI_CPread: CPnum=%d mask=%.8lx\n", CPnum, mask));
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ for (upto = 0, r = 0 ; r < 9 ; r++)
+ if (mask & (1L << r)) {
+ if (r != 8) {
+ ARMul_DebugPrint(state, "%08lx ",buffer[upto++]) ;
+ ARMul_DebugPrint(state, "%08lx ",buffer[upto++]) ;
+ ARMul_DebugPrint(state, "%08lx ",buffer[upto++]) ;
+ }
+ ARMul_DebugPrint(state, "%08lx\n",buffer[upto++]) ;
+ }
+ ARMul_DebugPrint(state, "\n") ;
+ }
+#endif
+ return(RDIError_NoError) ;
+#endif /* NOFPE */
+ }
+
+/***************************************************************************\
+* RDI_CPwrite *
+\***************************************************************************/
+
+static int RDI_CPwrite(unsigned CPnum, unsigned long mask, ARMword const buffer[])
+{unsigned r ;
+ unsigned upto ;
+ ARMword fpregsaddr;
+
+ if (CPnum != 1 && CPnum != 2) {
+ unsigned char const *rmap = state->CPRegWords[CPnum];
+ if (rmap == NULL)
+ return(RDIError_UnknownCoPro) ;
+ TracePrint((state, "RDI_CPwrite: CPnum=%d mask=%.8lx", CPnum, mask));
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ int w = 0;
+ for (upto = 0, r = 0; r < rmap[-1]; r++)
+ if (mask & (1L << r)) {
+ int words = rmap[r];
+ ARMul_DebugPrint(state, "%c%2d", (w >= 4 ? (w = 0, '\n') : ' '), r);
+ while (--words >= 0) {
+ ARMul_DebugPrint(state, " %.8lx", buffer[upto++]);
+ w++;
+ }
+ }
+ ARMul_DebugPrint(state, "\n") ;
+ }
+#endif
+ for (upto = 0, r = 0; r < rmap[-1]; r++)
+ if (mask & (1L << r)) {
+ (void)state->CPWrite[CPnum](state, r, &buffer[upto]);
+ upto += rmap[r];
+ }
+ return RDIError_NoError;
+ }
+
+#ifdef NOFPE
+ return RDIError_UnknownCoPro;
+
+#else
+ TracePrint((state, "RDI_CPwrite: CPnum=%d mask=%.8lx", CPnum, mask));
+#ifdef RDI_VERBOSE
+ if (rdi_log & 1) {
+ for (upto = 0, r = 0 ; r < 9 ; r++)
+ if (mask & (1L << r)) {
+ if (r != 8) {
+ ARMul_DebugPrint(state, "%08lx ",buffer[upto++]) ;
+ ARMul_DebugPrint(state, "%08lx ",buffer[upto++]) ;
+ ARMul_DebugPrint(state, "%08lx ",buffer[upto++]) ;
+ }
+ ARMul_DebugPrint(state, "%08lx\n",buffer[upto++]) ;
+ }
+ ARMul_DebugPrint(state, "\n") ;
+ }
+#endif
+
+ if (FPRegsAddr == 0) {
+ fpregsaddr = ARMul_ReadWord(state, 4L) ;
+ if ((fpregsaddr & 0xff800000) != 0xea000000) /* Must be a forward branch */
+ return RDIError_UnknownCoPro;
+ fpregsaddr = ((fpregsaddr & 0xffffff) << 2) + 8 ; /* address in __fp_decode - 4 */
+ if ((fpregsaddr < FPESTART) || (fpregsaddr >= FPEEND))
+ return RDIError_UnknownCoPro;
+ fpregsaddr = ARMul_ReadWord(state, fpregsaddr) ; /* pointer to fp registers */
+ FPRegsAddr = fpregsaddr ;
+ }
+ else
+ fpregsaddr = FPRegsAddr ;
+
+ if (fpregsaddr == 0) return RDIError_UnknownCoPro;
+ for (upto = 0, r = 0 ; r < 8 ; r++)
+ if (mask & (1L << r)) {
+ ARMul_WriteWord(state,fpregsaddr + (ARMword)r * 16,buffer[upto+1]) ;
+ ARMul_WriteWord(state,fpregsaddr + (ARMword)r * 16 + 4,buffer[upto+2]) ;
+ ARMul_WriteWord(state,fpregsaddr + (ARMword)r * 16 + 8,buffer[upto+3]) ;
+ ARMul_WriteWord(state,fpregsaddr + (ARMword)r * 16 + 12,(buffer[upto] * 2 + 1) << 29) ; /* mark type */
+ upto += 4 ;
+ }
+ if (mask & (1L << r))
+ ARMul_WriteWord(state,fpregsaddr + 128,buffer[upto++]) ; /* fpsr */
+ return(RDIError_NoError) ;
+#endif /* NOFPE */
+}
+
+static void deletebreaknode(BreakNode **prevp) {
+ BreakNode *p = *prevp;
+ *prevp = p->next;
+ ARMul_WriteWord(state, p->address, p->inst);
+ free((char *)p);
+ BreaksSet-- ;
+ state->CallDebug-- ;
+}
+
+static int removebreak(ARMword address, unsigned type)
+{ BreakNode *p, **prevp = &BreakList;
+ for (; (p = *prevp) != NULL ; prevp = &p->next)
+ if (p->address == address && p->type == type) {
+ deletebreaknode(prevp);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* This routine installs a breakpoint into the breakpoint table */
+
+static BreakNode *installbreak(ARMword address, unsigned type, ARMword bound)
+{ BreakNode *p = (BreakNode *)malloc(sizeof(BreakNode));
+ p->next = BreakList;
+ BreakList = p;
+ p->address = address;
+ p->type = type;
+ p->bound = bound;
+ p->inst = ARMul_ReadWord(state, address);
+ ARMul_WriteWord(state, address, 0xee000000L);
+ return p;
+}
+
+/***************************************************************************\
+* RDI_setbreak *
+\***************************************************************************/
+
+static int RDI_setbreak(ARMword address, unsigned type, ARMword bound,
+ PointHandle *handle)
+{ BreakNode *p;
+ TracePrint((state, "RDI_setbreak: address=%.8lx type=%d bound=%.8lx\n",
+ address, type, bound));
+
+ removebreak(address, type);
+ p = installbreak(address, type, bound);
+ BreaksSet++ ;
+ state->CallDebug++ ;
+ *handle = (PointHandle)p;
+ TracePrint((state, " returns %.8lx\n", *handle));
+ return RDIError_NoError;
+}
+
+/***************************************************************************\
+* RDI_clearbreak *
+\***************************************************************************/
+
+static int RDI_clearbreak(PointHandle handle)
+{ TracePrint((state, "RDI_clearbreak: address=%.8lx\n", handle));
+ { BreakNode *p, **prevp = &BreakList;
+ for (; (p = *prevp) != NULL; prevp = &p->next)
+ if (p == (BreakNode *)handle) break;
+ if (p == NULL) return RDIError_NoSuchPoint;
+ deletebreaknode(prevp);
+ return RDIError_NoError;
+ }
+}
+
+/***************************************************************************\
+* Internal functions for breakpoint table manipulation *
+\***************************************************************************/
+
+static void deletewatchnode(WatchNode **prevp)
+{ WatchNode *p = *prevp;
+ if (p->datatype & Watch_AnyRead) state->MemReadDebug--;
+ if (p->datatype & Watch_AnyWrite) state->MemWriteDebug--;
+ *prevp = p->next;
+ free((char *)p);
+}
+
+int removewatch(ARMword address, unsigned type)
+{ WatchNode *p, **prevp = &WatchList;
+ for (; (p = *prevp) != NULL ; prevp = &p->next)
+ if (p->address == address && p->type == type) { /* found a match */
+ deletewatchnode(prevp);
+ return TRUE;
+ }
+ return FALSE; /* never found a match */
+}
+
+static WatchNode *installwatch(ARMword address, unsigned type, unsigned datatype,
+ ARMword bound)
+{ WatchNode *p = (WatchNode *)malloc(sizeof(WatchNode));
+ p->next = WatchList;
+ WatchList = p;
+ p->address = address;
+ p->type = type;
+ p->datatype = datatype;
+ p->bound = bound;
+ return p;
+}
+
+/***************************************************************************\
+* RDI_setwatch *
+\***************************************************************************/
+
+static int RDI_setwatch(ARMword address, unsigned type, unsigned datatype,
+ ARMword bound, PointHandle *handle)
+{ WatchNode *p;
+ TracePrint((state, "RDI_setwatch: address=%.8lx type=%d datatype=%d bound=%.8lx",
+ address, type, datatype, bound));
+
+ if (!state->CanWatch) return RDIError_UnimplementedMessage;
+
+ removewatch(address, type);
+ p = installwatch(address, type, datatype, bound);
+ if (datatype & Watch_AnyRead) state->MemReadDebug++;
+ if (datatype & Watch_AnyWrite) state->MemWriteDebug++;
+ *handle = (PointHandle)p;
+ TracePrint((state, " returns %.8lx\n", *handle));
+ return RDIError_NoError;
+}
+
+/***************************************************************************\
+* RDI_clearwatch *
+\***************************************************************************/
+
+static int RDI_clearwatch(PointHandle handle)
+{ TracePrint((state, "RDI_clearwatch: address=%.8lx\n", handle));
+ { WatchNode *p, **prevp = &WatchList;
+ for (; (p = *prevp) != NULL; prevp = &p->next)
+ if (p == (WatchNode *)handle) break;
+ if (p == NULL) return RDIError_NoSuchPoint;
+ deletewatchnode(prevp);
+ return RDIError_NoError;
+ }
+}
+
+/***************************************************************************\
+* RDI_execute *
+\***************************************************************************/
+
+static int RDI_execute(PointHandle *handle)
+{
+ TracePrint((state, "RDI_execute\n"));
+ if (rdi_log & 4) {
+ state->CallDebug++ ;
+ state->Debug = TRUE ;
+ }
+ state->EndCondition = RDIError_NoError ;
+ state->StopHandle = 0;
+
+ ARMul_DoProg(state);
+
+ *handle = state->StopHandle;
+ state->Reg[15] -= 8 ; /* undo the pipeline */
+ if (rdi_log & 4) {
+ state->CallDebug-- ;
+ state->Debug = FALSE ;
+ }
+ return(state->EndCondition) ;
+}
+
+/***************************************************************************\
+* RDI_step *
+\***************************************************************************/
+
+static int RDI_step(unsigned ninstr, PointHandle *handle)
+{
+
+ TracePrint((state, "RDI_step\n"));
+ if (ninstr != 1) return RDIError_UnimplementedMessage;
+ if (rdi_log & 4) {
+ state->CallDebug++ ;
+ state->Debug = TRUE ;
+ }
+ state->EndCondition = RDIError_NoError ;
+ state->StopHandle = 0;
+ ARMul_DoInstr(state) ;
+ *handle = state->StopHandle;
+ state->Reg[15] -= 8 ; /* undo the pipeline */
+ if (rdi_log & 4) {
+ state->CallDebug-- ;
+ state->Debug = FALSE ;
+ }
+ return(state->EndCondition) ;
+}
+
+/***************************************************************************\
+* RDI_info *
+\***************************************************************************/
+
+static int RDI_info(unsigned type, ARMword *arg1, ARMword *arg2)
+{
+ switch (type) {
+ case RDIInfo_Target:
+ TracePrint((state, "RDI_Info_Target\n"));
+ /* Emulator, speed 10**5 IPS */
+ *arg1 = 5 | HIGHEST_RDI_LEVEL << 5 | LOWEST_RDI_LEVEL << 8;
+ *arg2 = 1298224434;
+ return RDIError_NoError;
+
+ case RDIInfo_Points:
+ { ARMword n = RDIPointCapability_Comparison | RDIPointCapability_Range |
+ RDIPointCapability_Mask | RDIPointCapability_Status;
+ TracePrint((state, "RDI_Info_Points\n"));
+ if (state->CanWatch) n |= (Watch_AnyRead+Watch_AnyWrite) << 2;
+ *arg1 = n;
+ return RDIError_NoError;
+ }
+
+ case RDIInfo_Step:
+ TracePrint((state, "RDI_Info_Step\n"));
+ *arg1 = RDIStep_Single;
+ return RDIError_NoError;
+
+ case RDIInfo_MMU:
+ TracePrint((state, "RDI_Info_MMU\n"));
+ *arg1 = 1313820229 ;
+ return RDIError_NoError;
+
+ case RDISignal_Stop:
+ TracePrint((state, "RDISignal_Stop\n"));
+ state->CallDebug++ ;
+ state->EndCondition = RDIError_UserInterrupt ;
+ return RDIError_NoError;
+
+ case RDIVector_Catch:
+ TracePrint((state, "RDIVector_Catch %.8lx\n", *arg1));
+ state->VectorCatch = (unsigned)*arg1 ;
+ return RDIError_NoError;
+
+ case RDISet_Cmdline:
+ TracePrint((state, "RDI_Set_Cmdline %s\n", (char *)arg1));
+ state->CommandLine = (char *)malloc((unsigned)strlen((char *)arg1)+1) ;
+ (void)strcpy(state->CommandLine,(char *)arg1) ;
+ return RDIError_NoError;
+
+ case RDICycles:
+ TracePrint((state, "RDI_Info_Cycles\n"));
+ arg1[0] = 0;
+ arg1[1] = state->NumInstrs;
+ arg1[2] = 0;
+ arg1[3] = state->NumScycles;
+ arg1[4] = 0;
+ arg1[5] = state->NumNcycles;
+ arg1[6] = 0;
+ arg1[7] = state->NumIcycles;
+ arg1[8] = 0;
+ arg1[9] = state->NumCcycles;
+ arg1[10] = 0;
+ arg1[11] = state->NumFcycles;
+ return RDIError_NoError;
+
+ case RDIErrorP:
+ *arg1 = ARMul_OSLastErrorP(state);
+ TracePrint((state, "RDI_ErrorP returns %ld\n", *arg1));
+ return RDIError_NoError;
+
+ case RDIInfo_DescribeCoPro:
+ { int cpnum = *(int *)arg1;
+ struct Dbg_CoProDesc *cpd = (struct Dbg_CoProDesc *)arg2;
+ int i;
+ unsigned char const *map = state->CPRegWords[cpnum];
+ if (map == NULL) return RDIError_UnknownCoPro;
+ for (i = 0; i < cpd->entries; i++) {
+ unsigned r, w = cpd->regdesc[i].nbytes / sizeof(ARMword);
+ for (r = cpd->regdesc[i].rmin; r <= cpd->regdesc[i].rmax; r++)
+ if (map[r] != w) return RDIError_BadCoProState;
+ }
+ return RDIError_NoError;
+ }
+
+ case RDIInfo_RequestCoProDesc:
+ { int cpnum = *(int *)arg1;
+ struct Dbg_CoProDesc *cpd = (struct Dbg_CoProDesc *)arg2;
+ int i = -1, lastw = -1, r;
+ unsigned char const *map;
+ if ((unsigned)cpnum >= 16) return RDIError_UnknownCoPro;
+ map = state->CPRegWords[cpnum];
+ if (map == NULL) return RDIError_UnknownCoPro;
+ for (r = 0; r < map[-1]; r++) {
+ int words = map[r];
+ if (words == lastw)
+ cpd->regdesc[i].rmax = r;
+ else {
+ if (++i >= cpd->entries) return RDIError_BufferFull;
+ cpd->regdesc[i].rmax = cpd->regdesc[i].rmin = r;
+ cpd->regdesc[i].nbytes = words * sizeof(ARMword);
+ cpd->regdesc[i].access = Dbg_Access_Readable+Dbg_Access_Writable;
+ }
+ }
+ cpd->entries = i+1;
+ return RDIError_NoError;
+ }
+
+ case RDIInfo_Log:
+ *arg1 = (ARMword)rdi_log;
+ return RDIError_NoError;
+
+ case RDIInfo_SetLog:
+ rdi_log = (int)*arg1;
+ return RDIError_NoError;
+
+ case RDIInfo_CoPro:
+ return RDIError_NoError;
+
+ case RDIPointStatus_Watch:
+ { WatchNode *p, *handle = (WatchNode *)*arg1;
+ for (p = WatchList; p != NULL; p = p->next)
+ if (p == handle) {
+ *arg1 = -1;
+ *arg2 = 1;
+ return RDIError_NoError;
+ }
+ return RDIError_NoSuchPoint;
+ }
+
+ case RDIPointStatus_Break:
+ { BreakNode *p, *handle = (BreakNode *)*arg1;
+ for (p = BreakList; p != NULL; p = p->next)
+ if (p == handle) {
+ *arg1 = -1;
+ *arg2 = 1;
+ return RDIError_NoError;
+ }
+ return RDIError_NoSuchPoint;
+ }
+
+ case RDISet_RDILevel:
+ if (*arg1 < LOWEST_RDI_LEVEL || *arg1 > HIGHEST_RDI_LEVEL)
+ return RDIError_IncompatibleRDILevels;
+ MYrdi_level = *arg1;
+ return RDIError_NoError;
+
+ default:
+ return RDIError_UnimplementedMessage;
+
+ }
+}
+
+/***************************************************************************\
+* The emulator calls this routine at the beginning of every cycle when the *
+* CallDebug flag is set. The second parameter passed is the address of the *
+* currently executing instruction (i.e Program Counter - 8), the third *
+* parameter is the instruction being executed. *
+\***************************************************************************/
+
+ARMword ARMul_Debug(ARMul_State *state, ARMword pc, ARMword instr)
+{
+
+ if (state->EndCondition == RDIError_UserInterrupt) {
+ TracePrint((state, "User interrupt at %.8lx\n", pc));
+ state->CallDebug--;
+ state->Emulate = STOP;
+ } else {
+ BreakNode *p = BreakList;
+ for (; p != NULL ; p = p->next) {
+ switch (p->type) {
+ case RDIPoint_EQ: if (pc == p->address) break; continue;
+ case RDIPoint_GT: if (pc > p->address) break; continue;
+ case RDIPoint_GE: if (pc >= p->address) break; continue;
+ case RDIPoint_LT: if (pc < p->address) break; continue;
+ case RDIPoint_LE: if (pc <= p->address) break; continue;
+ case RDIPoint_IN: if (p->address <= pc && pc < p->address+p->bound) break;
+ continue;
+ case RDIPoint_OUT:if (p->address > pc || pc >= p->address+p->bound) break;
+ continue;
+ case RDIPoint_MASK:if ((pc & p->bound) == p->address) break; continue;
+ }
+ /* found a match */
+ TracePrint((state, "Breakpoint reached at %.8lx\n", pc));
+ state->EndCondition = RDIError_BreakpointReached ;
+ state->Emulate = STOP;
+ state->StopHandle = (ARMword)p;
+ break;
+ }
+ }
+ return instr;
+}
+
+void ARMul_CheckWatch(ARMul_State *state, ARMword addr, int access)
+{ WatchNode *p;
+ for (p = WatchList; p != NULL; p = p->next)
+ if (p->datatype & access) {
+ switch (p->type) {
+ case RDIPoint_EQ: if (addr == p->address) break; continue;
+ case RDIPoint_GT: if (addr > p->address) break; continue;
+ case RDIPoint_GE: if (addr >= p->address) break; continue;
+ case RDIPoint_LT: if (addr < p->address) break; continue;
+ case RDIPoint_LE: if (addr <= p->address) break; continue;
+ case RDIPoint_IN: if (p->address <= addr && addr < p->address+p->bound) break;
+ continue;
+ case RDIPoint_OUT:if (p->address > addr || addr >= p->address+p->bound) break;
+ continue;
+ case RDIPoint_MASK:if ((addr & p->bound) == p->address) break; continue;
+ }
+ /* found a match */
+ TracePrint((state, "Watchpoint at %.8lx accessed\n", addr));
+ state->EndCondition = RDIError_WatchpointAccessed;
+ state->Emulate = STOP;
+ state->StopHandle = (ARMword)p;
+ return;
+ }
+}
+
+static RDI_NameList const *RDI_cpunames() {
+ return (RDI_NameList const *)&processorconfig.count;
+}
+
+const struct RDIProcVec armul_rdi = {
+ "ARMUL",
+ RDI_open,
+ RDI_close,
+ RDI_read,
+ RDI_write,
+ RDI_CPUread,
+ RDI_CPUwrite,
+ RDI_CPread,
+ RDI_CPwrite,
+ RDI_setbreak,
+ RDI_clearbreak,
+ RDI_setwatch,
+ RDI_clearwatch,
+ RDI_execute,
+ RDI_step,
+ RDI_info,
+
+ 0, /*pointinq*/
+ 0, /*addconfig*/
+ 0, /*loadconfigdata*/
+ 0, /*selectconfig*/
+ 0, /*drivernames*/
+
+ RDI_cpunames
+};
+
diff --git a/sim/arm/bag.h b/sim/arm/bag.h
new file mode 100644
index 0000000..bd0f99d
--- /dev/null
+++ b/sim/arm/bag.h
@@ -0,0 +1,42 @@
+/* bag.h -- ARMulator support code: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/********************************************************************/
+/* bag.h: */
+/* Header file for bag.c */
+/* Offers a data structure for storing and getting pairs of number. */
+/* The numbers are stored together, put one can be looked up by */
+/* quoting the other. If a new pair is entered and one of the */
+/* numbers is a repeat of a previous pair, then the previos pair */
+/* is deleted. */
+/********************************************************************/
+
+typedef enum {
+ NO_ERROR,
+ DELETED_OLD_PAIR,
+ NO_SUCH_PAIR,
+} Bag_error;
+
+void BAG_putpair(long first, long second);
+
+void BAG_newbag(void);
+Bag_error BAG_killpair_byfirst(long first);
+Bag_error BAG_killpair_bysecond(long second);
+
+Bag_error BAG_getfirst(long *first, long second);
+Bag_error BAG_getsecond(long first, long *second);
+
diff --git a/sim/arm/communicate.c b/sim/arm/communicate.c
new file mode 100644
index 0000000..061e719
--- /dev/null
+++ b/sim/arm/communicate.c
@@ -0,0 +1,221 @@
+/* communicate.c -- ARMulator RDP comms code: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/**************************************************************************/
+/* Functions to read and write characters or groups of characters */
+/* down sockets or pipes. Those that return a value return -1 on failure */
+/* and 0 on success. */
+/**************************************************************************/
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include "armdefs.h"
+
+/* The socket to the debugger */
+int debugsock;
+
+/* The maximum number of file descriptors */
+extern int nfds;
+
+/* The socket handle */
+extern int sockethandle;
+
+/* Read and Write routines down a pipe or socket */
+
+/****************************************************************/
+/* Read an individual character. */
+/* All other read functions rely on this one. */
+/* It waits 15 seconds until there is a character available: if */
+/* no character is available, then it timeouts and returns -1. */
+/****************************************************************/
+int MYread_char(int sock, unsigned char *c) {
+ int i;
+ fd_set readfds;
+ struct timeval timeout= {15, 0};
+ struct sockaddr_in isa;
+
+ retry:
+
+ FD_ZERO(&readfds);
+ FD_SET(sock, &readfds);
+
+ i = select(nfds, &readfds,
+ (fd_set *) 0,
+ (fd_set *) 0,
+ &timeout);
+
+ if (i < 0) {
+ perror("select");
+ exit(1);
+ }
+
+ if (!i) {
+ fprintf(stderr, "read: Timeout\n");
+ return -1;
+ }
+
+ if ((i = read(sock, c, 1)) < 1) {
+ if (!i && sock == debugsock) {
+ fprintf(stderr, "Connection with debugger severed.\n");
+ /* This shouldn't be necessary for a detached armulator, but
+ the armulator cannot be cold started a second time, so
+ this is probably preferable to locking up. */
+ return -1;
+ fprintf(stderr, "Waiting for connection from debugger...");
+ debugsock = accept(sockethandle, &isa, &i);
+ if (debugsock < 0) { /* Now we are in serious trouble... */
+ perror("accept");
+ return -1;
+ }
+ fprintf(stderr, " done.\nConnection Established.\n");
+ sock = debugsock;
+ goto retry;
+ }
+ perror("read");
+ return -1;
+ }
+
+#ifdef DEBUG
+ if (sock == debugsock) fprintf(stderr, "<%02x ", *c);
+#endif
+
+ return 0;
+}
+
+/****************************************************************/
+/* Read an individual character. */
+/* It waits until there is a character available. Returns -1 if */
+/* an error occurs. */
+/****************************************************************/
+int MYread_charwait(int sock, unsigned char *c) {
+ int i;
+ fd_set readfds;
+ struct sockaddr_in isa;
+
+ retry:
+
+ FD_ZERO(&readfds);
+ FD_SET(sock, &readfds);
+
+ i = select(nfds, &readfds,
+ (fd_set *) 0,
+ (fd_set *) 0,
+ (struct timeval *) 0);
+
+ if (i < 0) {
+ perror("select");
+ exit(-1);
+ }
+
+ if ((i = read(sock, c, 1)) < 1) {
+ if (!i && sock == debugsock) {
+ fprintf(stderr, "Connection with debugger severed.\n");
+ return -1;
+ fprintf(stderr, "Waiting for connection from debugger...");
+ debugsock = accept(sockethandle, &isa, &i);
+ if (debugsock < 0) { /* Now we are in serious trouble... */
+ perror("accept");
+ return -1;
+ }
+ fprintf(stderr, " done.\nConnection Established.\n");
+ sock = debugsock;
+ goto retry;
+ }
+ perror("read");
+ return -1;
+ }
+
+#ifdef DEBUG
+ if (sock == debugsock) fprintf(stderr, "<%02x ", *c);
+#endif
+
+ return 0;
+}
+
+void MYwrite_char(int sock, unsigned char c) {
+
+ if (write(sock, &c, 1) < 1)
+ perror("write");
+#ifdef DEBUG
+ if (sock == debugsock) fprintf(stderr, ">%02x ", c);
+#endif
+}
+
+int MYread_word(int sock, ARMword *here) {
+ unsigned char a, b, c, d;
+
+ if (MYread_char(sock, &a) < 0) return -1;
+ if (MYread_char(sock, &b) < 0) return -1;
+ if (MYread_char(sock, &c) < 0) return -1;
+ if (MYread_char(sock, &d) < 0) return -1;
+ *here = a | b << 8 | c << 16 | d << 24;
+ return 0;
+}
+
+void MYwrite_word(int sock, ARMword i) {
+ MYwrite_char(sock, i & 0xff);
+ MYwrite_char(sock, (i & 0xff00) >> 8);
+ MYwrite_char(sock, (i & 0xff0000) >> 16);
+ MYwrite_char(sock, (i & 0xff000000) >> 24);
+}
+
+void MYwrite_string(int sock, char *s) {
+ int i;
+ for (i = 0; MYwrite_char(sock, s[i]), s[i]; i++);
+}
+
+int MYread_FPword(int sock, char *putinhere) {
+ int i;
+ for (i = 0; i < 16; i++)
+ if (MYread_char(sock, &putinhere[i]) < 0) return -1;
+ return 0;
+}
+
+void MYwrite_FPword(int sock, char *fromhere) {
+ int i;
+ for (i = 0; i < 16; i++)
+ MYwrite_char(sock, fromhere[i]);
+}
+
+/* Takes n bytes from source and those n bytes */
+/* down to dest */
+int passon(int source, int dest, int n) {
+ char *p;
+ int i;
+
+ p = (char *) malloc(n);
+ if (!p) {
+ perror("Out of memory\n");
+ exit(1);
+ }
+ if (n) {
+ for (i = 0; i < n; i++)
+ if (MYread_char(source, &p[i]) < 0) return -1;
+
+#ifdef DEBUG
+ if (dest == debugsock)
+ for (i = 0; i < n; i++) fprintf(stderr, ")%02x ", (unsigned char) p[i]);
+#endif
+
+ write(dest, p, n);
+ }
+ free(p);
+ return 0;
+}
diff --git a/sim/arm/communicate.h b/sim/arm/communicate.h
new file mode 100644
index 0000000..c48b2e2
--- /dev/null
+++ b/sim/arm/communicate.h
@@ -0,0 +1,37 @@
+/* communicate.h -- ARMulator comms support defns: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+int MYread_char(int sock, unsigned char *c);
+void MYwrite_char(int sock, unsigned char c);
+int MYread_word(int sock, ARMword *here);
+void MYwrite_word(int sock, ARMword i);
+void MYwrite_string(int sock, char *s);
+int MYread_FPword(int sock, char *putinhere);
+void MYwrite_FPword(int sock, char *fromhere);
+int passon(int source, int dest, int n);
+
+int wait_for_osreply(ARMword *reply); /* from kid.c */
+
+#define OS_SendNothing 0x0
+#define OS_SendChar 0x1
+#define OS_SendWord 0x2
+#define OS_SendString 0x3
+
+/* The pipes between the two processes */
+extern int mumkid[2];
+extern int kidmum[2];
+
diff --git a/sim/arm/configure.in b/sim/arm/configure.in
new file mode 100644
index 0000000..bbe0360
--- /dev/null
+++ b/sim/arm/configure.in
@@ -0,0 +1,35 @@
+# This file is a shell script that supplies the information necessary
+# to tailor a template configure script into the configure script
+# appropriate for this directory. For more information, check any
+# existing configure script.
+
+srctrigger=bag.c
+srcname="arm sim"
+
+# per-host:
+
+. ${srcdir}/../../bfd/configure.host
+
+# Set up to make a link between the host's include file and "sysdep.h".
+files="../../bfd/hosts/${my_host}.h"
+
+links="sysdep.h"
+
+if [ ! -f ${srcdir}/${files} ] ; then
+ files=../../bfd/hosts/std-host.h
+ echo "[${srcname} has no specific support for host ${host} -- using std-host]"
+fi
+
+host_makefile_frag=
+if [ -f ${srcdir}/../../bfd/config/${my_host}.mh ] ; then
+ host_makefile_frag=../../bfd/config/${my_host}.mh
+fi
+
+# per-target:
+
+
+case "${target}" in
+ arm-*-*) sim_target=arm ;;
+esac
+
+target_makefile_frag=${sim_target}.mt
diff --git a/sim/arm/dbg_conf.h b/sim/arm/dbg_conf.h
new file mode 100644
index 0000000..1220747
--- /dev/null
+++ b/sim/arm/dbg_conf.h
@@ -0,0 +1,48 @@
+/* dbg_conf.h -- ARMulator debug interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef Dbg_Conf__h
+
+#define Dbg_Conf__h
+
+typedef struct Dbg_ConfigBlock {
+ int bytesex;
+ long memorysize;
+ int serialport; /*) remote connection parameters */
+ int seriallinespeed; /*) (serial connection) */
+ int parallelport; /*) ditto */
+ int parallellinespeed; /*) (parallel connection) */
+ int processor; /* processor the armulator is to emulate (eg ARM60) */
+ int rditype; /* armulator / remote processor */
+ int drivertype; /* parallel / serial / etc */
+ char const *configtoload;
+ int flags;
+} Dbg_ConfigBlock;
+
+#define Dbg_ConfigFlag_Reset 1
+
+typedef struct Dbg_HostosInterface Dbg_HostosInterface;
+/* This structure allows access by the (host-independent) C-library support
+ module of armulator or pisd (armos.c) to host-dependent functions for
+ which there is no host-independent interface. Its contents are unknown
+ to the debugger toolbox.
+ The assumption is that, in a windowed system, fputc(stderr) for example
+ may not achieve the desired effect of the character appearing in some
+ window.
+ */
+
+#endif
diff --git a/sim/arm/dbg_cp.h b/sim/arm/dbg_cp.h
new file mode 100644
index 0000000..b79de8f
--- /dev/null
+++ b/sim/arm/dbg_cp.h
@@ -0,0 +1,62 @@
+/* dbg_cp.h -- ARMulator debug interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef Dbg_CP__h
+
+#define Dbg_CP__h
+
+#define Dbg_Access_Readable 1
+#define Dbg_Access_Writable 2
+#define Dbg_Access_CPDT 4 /* else CPRT */
+
+typedef struct {
+ unsigned short rmin, rmax;
+ /* a single description can be used for a range of registers with
+ the same properties *accessed via CPDT instructions*
+ */
+ unsigned char nbytes; /* size of register */
+ unsigned char access; /* see above (Access_xxx) */
+ union {
+ struct { /* CPDT instructions do not allow the coprocessor much freedom:
+ only bit 22 ('N') and 12-15 ('CRd') are free for the
+ coprocessor to use as it sees fit.
+ */
+ unsigned char nbit;
+ unsigned char rdbits;
+ } cpdt;
+ struct { /* CPRT instructions have much more latitude. The bits fixed
+ by the ARM are 24..31 (condition mask & opcode)
+ 20 (direction)
+ 8..15 (cpnum, arm register)
+ 4 (CPRT not CPDO)
+ leaving 14 bits free to the coprocessor (fortunately
+ falling within two bytes).
+ */
+ unsigned char read_b0, read_b1,
+ write_b0, write_b1;
+ } cprt;
+ } accessinst;
+} Dbg_CoProRegDesc;
+
+struct Dbg_CoProDesc {
+ int entries;
+ Dbg_CoProRegDesc regdesc[1/* really nentries */];
+};
+
+#define Dbg_CoProDesc_Size(n) (sizeof(struct Dbg_CoProDesc) + (n-1)*sizeof(Dbg_CoProRegDesc))
+
+#endif
diff --git a/sim/arm/dbg_hif.h b/sim/arm/dbg_hif.h
new file mode 100644
index 0000000..fa3df1b
--- /dev/null
+++ b/sim/arm/dbg_hif.h
@@ -0,0 +1,47 @@
+/* dbg_hif.h -- ARMulator debug interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef __STDC__
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
+
+typedef void Hif_DbgPrint(void *arg, const char *format, va_list ap);
+typedef void Hif_DbgPause(void *arg);
+
+typedef void Hif_WriteC(void *arg, int c);
+typedef int Hif_ReadC(void *arg);
+typedef int Hif_Write(void *arg, char const *buffer, int len);
+typedef char *Hif_GetS(void *arg, char *buffer, int len);
+
+typedef void Hif_RDIResetProc(void *arg);
+
+struct Dbg_HostosInterface {
+ Hif_DbgPrint *dbgprint;
+ Hif_DbgPause *dbgpause;
+ void *dbgarg;
+
+ Hif_WriteC *writec;
+ Hif_ReadC *readc;
+ Hif_Write *write;
+ Hif_GetS *gets;
+ void *hostosarg;
+
+ Hif_RDIResetProc *reset;
+ void *resetarg;
+};
diff --git a/sim/arm/dbg_rdi.h b/sim/arm/dbg_rdi.h
new file mode 100644
index 0000000..5d609d0
--- /dev/null
+++ b/sim/arm/dbg_rdi.h
@@ -0,0 +1,323 @@
+/* dbg_rdi.h -- ARMulator RDI interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef dbg_rdi__h
+#define dbg_rdi__h
+
+/***************************************************************************\
+* Error Codes *
+\***************************************************************************/
+
+#define RDIError_NoError 0
+
+#define RDIError_Reset 1
+#define RDIError_UndefinedInstruction 2
+#define RDIError_SoftwareInterrupt 3
+#define RDIError_PrefetchAbort 4
+#define RDIError_DataAbort 5
+#define RDIError_AddressException 6
+#define RDIError_IRQ 7
+#define RDIError_FIQ 8
+#define RDIError_Error 9
+#define RDIError_BranchThrough0 10
+
+#define RDIError_NotInitialised 128
+#define RDIError_UnableToInitialise 129
+#define RDIError_WrongByteSex 130
+#define RDIError_UnableToTerminate 131
+#define RDIError_BadInstruction 132
+#define RDIError_IllegalInstruction 133
+#define RDIError_BadCPUStateSetting 134
+#define RDIError_UnknownCoPro 135
+#define RDIError_UnknownCoProState 136
+#define RDIError_BadCoProState 137
+#define RDIError_BadPointType 138
+#define RDIError_UnimplementedType 139
+#define RDIError_BadPointSize 140
+#define RDIError_UnimplementedSize 141
+#define RDIError_NoMorePoints 142
+#define RDIError_BreakpointReached 143
+#define RDIError_WatchpointAccessed 144
+#define RDIError_NoSuchPoint 145
+#define RDIError_ProgramFinishedInStep 146
+#define RDIError_UserInterrupt 147
+#define RDIError_CantSetPoint 148
+#define RDIError_IncompatibleRDILevels 149
+
+#define RDIError_CantLoadConfig 150
+#define RDIError_BadConfigData 151
+#define RDIError_NoSuchConfig 152
+#define RDIError_BufferFull 153
+#define RDIError_OutOfStore 154
+#define RDIError_NotInDownload 155
+#define RDIError_PointInUse 156
+#define RDIError_BadImageFormat 157
+#define RDIError_TargetRunning 158
+
+#define RDIError_LittleEndian 240
+#define RDIError_BigEndian 241
+#define RDIError_SoftInitialiseError 242
+
+#define RDIError_InsufficientPrivilege 253
+#define RDIError_UnimplementedMessage 254
+#define RDIError_UndefinedMessage 255
+
+/***************************************************************************\
+* RDP Message Numbers *
+\***************************************************************************/
+
+#define RDP_Start (unsigned char)0x0
+#define RDP_End (unsigned char)0x1
+#define RDP_Read (unsigned char)0x2
+#define RDP_Write (unsigned char)0x3
+#define RDP_CPUread (unsigned char)0x4
+#define RDP_CPUwrite (unsigned char)0x5
+#define RDP_CPread (unsigned char)0x6
+#define RDP_CPwrite (unsigned char)0x7
+#define RDP_SetBreak (unsigned char)0xa
+#define RDP_ClearBreak (unsigned char)0xb
+#define RDP_SetWatch (unsigned char)0xc
+#define RDP_ClearWatch (unsigned char)0xd
+#define RDP_Execute (unsigned char)0x10
+#define RDP_Step (unsigned char)0x11
+#define RDP_Info (unsigned char)0x12
+#define RDP_OSOpReply (unsigned char)0x13
+
+#define RDP_AddConfig (unsigned char)0x14
+#define RDP_LoadConfigData (unsigned char)0x15
+#define RDP_SelectConfig (unsigned char)0x16
+#define RDP_LoadAgent (unsigned char)0x17
+
+#define RDP_Stopped (unsigned char)0x20
+#define RDP_OSOp (unsigned char)0x21
+#define RDP_Fatal (unsigned char)0x5e
+#define RDP_Return (unsigned char)0x5f
+#define RDP_Reset (unsigned char)0x7f
+
+/***************************************************************************\
+* Other RDI values *
+\***************************************************************************/
+
+#define RDISex_Little 0 /* the byte sex of the debuggee */
+#define RDISex_Big 1
+#define RDISex_DontCare 2
+
+#define RDIPoint_EQ 0 /* the different types of break/watchpoints */
+#define RDIPoint_GT 1
+#define RDIPoint_GE 2
+#define RDIPoint_LT 3
+#define RDIPoint_LE 4
+#define RDIPoint_IN 5
+#define RDIPoint_OUT 6
+#define RDIPoint_MASK 7
+
+#define RDIPoint_Inquiry 64 /* ORRed with point type in extended RDP */
+#define RDIPoint_Handle 128 /* messages */
+
+#define RDIWatch_ByteRead 1 /* types of data accesses to watch for */
+#define RDIWatch_HalfRead 2
+#define RDIWatch_WordRead 4
+#define RDIWatch_ByteWrite 8
+#define RDIWatch_HalfWrite 16
+#define RDIWatch_WordWrite 32
+
+#define RDIReg_R15 (1L << 15) /* mask values for CPU */
+#define RDIReg_PC (1L << 16)
+#define RDIReg_CPSR (1L << 17)
+#define RDIReg_SPSR (1L << 18)
+#define RDINumCPURegs 19
+
+#define RDINumCPRegs 10 /* current maximum */
+
+#define RDIMode_Curr 255
+
+/* Bits set in return value from RDIInfo_Target */
+#define RDITarget_LogSpeed 0x0f
+#define RDITarget_HW 0x10 /* else emulator */
+#define RDITarget_AgentMaxLevel 0xe0
+#define RDITarget_AgentLevelShift 5
+#define RDITarget_DebuggerMinLevel 0x700
+#define RDITarget_DebuggerLevelShift 8
+#define RDITarget_CanReloadAgent 0x800
+#define RDITarget_CanInquireLoadSize 0x1000
+
+/* Bits set in return value from RDIInfo_Step */
+#define RDIStep_Multiple 1
+#define RDIStep_PCChange 2
+#define RDIStep_Single 4
+
+/* Bits set in return value from RDIInfo_Points */
+#define RDIPointCapability_Comparison 1
+#define RDIPointCapability_Range 2
+/* 4 to 128 are RDIWatch_xx{Read,Write} left-shifted by two */
+#define RDIPointCapability_Mask 256
+#define RDIPointCapability_Status 512 /* Point status enquiries available */
+
+/* RDI_Info subcodes */
+#define RDIInfo_Target 0
+#define RDIInfo_Points 1
+#define RDIInfo_Step 2
+#define RDIInfo_MMU 3
+#define RDIInfo_DownLoad 4 /* Inquires whether configuration download
+ and selection is available.
+ */
+#define RDIInfo_SemiHosting 5 /* Inquires whether RDISemiHosting_* RDI_Info
+ calls are available.
+ */
+#define RDIInfo_CoPro 6 /* Inquires whether CoPro RDI_Info calls are
+ available.
+ */
+#define RDIInfo_Icebreaker 7
+
+/* The next two are only to be used if the value returned by RDIInfo_Points */
+/* has RDIPointCapability_Status set. */
+#define RDIPointStatus_Watch 0x80
+#define RDIPointStatus_Break 0x81
+
+#define RDISignal_Stop 0x100
+
+#define RDIVector_Catch 0x180
+
+/* The next four are only to be used if RDIInfo_Semihosting returned no error */
+#define RDISemiHosting_SetState 0x181
+#define RDISemiHosting_GetState 0x182
+#define RDISemiHosting_SetVector 0x183
+#define RDISemiHosting_GetVector 0x184
+
+/* The next two are only to be used if RDIInfo_Icebreaker returned no error */
+#define RDIIcebreaker_GetLocks 0x185
+#define RDIIcebreaker_SetLocks 0x186
+
+/* Only if RDIInfo_Target returned RDITarget_CanInquireLoadSize */
+#define RDIInfo_GetLoadSize 0x187
+
+#define RDICycles 0x200
+#define RDICycles_Size 48
+#define RDIErrorP 0x201
+
+#define RDISet_Cmdline 0x300
+#define RDISet_RDILevel 0x301
+#define RDISet_Thread 0x302
+
+/* The next two are only to be used if RDIInfo_CoPro returned no error */
+#define RDIInfo_DescribeCoPro 0x400
+#define RDIInfo_RequestCoProDesc 0x401
+
+#define RDIInfo_Log 0x800
+#define RDIInfo_SetLog 0x801
+
+typedef unsigned long PointHandle;
+typedef unsigned long ThreadHandle;
+#define RDINoPointHandle ((PointHandle)-1L)
+#define RDINoHandle ((ThreadHandle)-1L)
+
+struct Dbg_ConfigBlock;
+struct Dbg_HostosInterface;
+struct Dbg_MCState;
+typedef int rdi_open_proc(unsigned type, struct Dbg_ConfigBlock const *config,
+ struct Dbg_HostosInterface const *i,
+ struct Dbg_MCState *dbg_state);
+typedef int rdi_close_proc(void);
+typedef int rdi_read_proc(ARMword source, void *dest, unsigned *nbytes);
+typedef int rdi_write_proc(const void *source, ARMword dest, unsigned *nbytes);
+typedef int rdi_CPUread_proc(unsigned mode, unsigned long mask, ARMword *state);
+typedef int rdi_CPUwrite_proc(unsigned mode, unsigned long mask, ARMword const *state);
+typedef int rdi_CPread_proc(unsigned CPnum, unsigned long mask, ARMword *state);
+typedef int rdi_CPwrite_proc(unsigned CPnum, unsigned long mask, ARMword const *state);
+typedef int rdi_setbreak_proc(ARMword address, unsigned type, ARMword bound,
+ PointHandle *handle);
+typedef int rdi_clearbreak_proc(PointHandle handle);
+typedef int rdi_setwatch_proc(ARMword address, unsigned type, unsigned datatype,
+ ARMword bound, PointHandle *handle);
+typedef int rdi_clearwatch_proc(PointHandle handle);
+typedef int rdi_execute_proc(PointHandle *handle);
+typedef int rdi_step_proc(unsigned ninstr, PointHandle *handle);
+typedef int rdi_info_proc(unsigned type, ARMword *arg1, ARMword *arg2);
+typedef int rdi_pointinq_proc(ARMword *address, unsigned type,
+ unsigned datatype, ARMword *bound);
+
+typedef enum {
+ RDI_ConfigCPU,
+ RDI_ConfigSystem
+} RDI_ConfigAspect;
+
+typedef enum {
+ RDI_MatchAny,
+ RDI_MatchExactly,
+ RDI_MatchNoEarlier
+} RDI_ConfigMatchType;
+
+typedef int rdi_addconfig_proc(unsigned long nbytes);
+typedef int rdi_loadconfigdata_proc(unsigned long nbytes, char const *data);
+typedef int rdi_selectconfig_proc(RDI_ConfigAspect aspect, char const *name,
+ RDI_ConfigMatchType matchtype, unsigned versionreq,
+ unsigned *versionp);
+
+typedef char *getbufferproc(void *getbarg, unsigned long *sizep);
+typedef int rdi_loadagentproc(ARMword dest, unsigned long size, getbufferproc *getb, void *getbarg);
+
+typedef struct {
+ int itemmax;
+ char const * const *names;
+} RDI_NameList;
+
+typedef RDI_NameList const *rdi_namelistproc(void);
+
+typedef int rdi_errmessproc(char *buf, int buflen, int errno);
+
+struct RDIProcVec {
+ char rditypename[12];
+
+ rdi_open_proc *open;
+ rdi_close_proc *close;
+ rdi_read_proc *read;
+ rdi_write_proc *write;
+ rdi_CPUread_proc *CPUread;
+ rdi_CPUwrite_proc *CPUwrite;
+ rdi_CPread_proc *CPread;
+ rdi_CPwrite_proc *CPwrite;
+ rdi_setbreak_proc *setbreak;
+ rdi_clearbreak_proc *clearbreak;
+ rdi_setwatch_proc *setwatch;
+ rdi_clearwatch_proc *clearwatch;
+ rdi_execute_proc *execute;
+ rdi_step_proc *step;
+ rdi_info_proc *info;
+ /* V2 RDI */
+ rdi_pointinq_proc *pointinquiry;
+
+ /* These three useable only if RDIInfo_DownLoad returns no error */
+ rdi_addconfig_proc *addconfig;
+ rdi_loadconfigdata_proc *loadconfigdata;
+ rdi_selectconfig_proc *selectconfig;
+
+ rdi_namelistproc *drivernames;
+ rdi_namelistproc *cpunames;
+
+ rdi_errmessproc *errmess;
+
+ /* Only if RDIInfo_Target returns a value with RDITarget_LoadAgent set */
+ rdi_loadagentproc *loadagent;
+};
+
+#endif
+
+
+
+
+
+
diff --git a/sim/arm/gdbhost.c b/sim/arm/gdbhost.c
new file mode 100644
index 0000000..9e6e2ef
--- /dev/null
+++ b/sim/arm/gdbhost.c
@@ -0,0 +1,107 @@
+/* gdbhost.c -- ARMulator RDP to gdb comms code: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/***********************************************************/
+/* Functions that communicate info back to the debugger... */
+/***********************************************************/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "armdefs.h"
+#include "communicate.h"
+#include "dbg_rdi.h"
+#include "armos.h"
+
+#define OS_SendNothing 0x0
+#define OS_SendChar 0x1
+#define OS_SendWord 0x2
+#define OS_SendString 0x3
+
+/* Defined in kid.c */
+extern int wait_for_osreply(ARMword *reply);
+
+/* A pipe for handling SWI return values that goes straight from the */
+/* parent to the ARMulator host interface, bypassing the childs RDP */
+/* to RDI interpreter */
+int DebuggerARMul[2];
+
+/* The pipes between the two processes */
+int mumkid[2];
+int kidmum[2];
+
+void myprint (void *arg, const char *format, va_list ap)
+{
+#ifdef DEBUG
+ fprintf (stderr, "Host: myprint\n");
+#endif
+ vfprintf (stderr, format, ap);
+}
+
+
+/* Waits for a keypress on the debuggers' keyboard */
+void mypause (void *arg)
+{
+#ifdef DEBUG
+ fprintf (stderr, "Host: mypause\n");
+#endif
+} /* I do love exciting functions */
+
+void mywritec(void *arg, int c)
+{
+#ifdef DEBUG
+ fprintf(stderr, "Mywrite : %c\n", c);
+#endif
+ MYwrite_char(kidmum[1], RDP_OSOp); /* OS Operation Request Message */
+ MYwrite_word(kidmum[1], SWI_WriteC); /* Print... */
+ MYwrite_char(kidmum[1], OS_SendChar); /* ...a single character */
+ MYwrite_char(kidmum[1], (unsigned char) c);
+
+ wait_for_osreply((ARMword *) 0);
+}
+
+int myreadc(void *arg)
+{
+ char c;
+ ARMword x;
+
+#ifdef DEBUG
+ fprintf(stderr, "Host: myreadc\n");
+#endif
+ MYwrite_char(kidmum[1], RDP_OSOp); /* OS Operation Request Message */
+ MYwrite_word(kidmum[1], SWI_ReadC); /* Read... */
+ MYwrite_char(kidmum[1], OS_SendNothing);
+
+ c = wait_for_osreply(&x);
+ return (x);
+}
+
+
+int mywrite(void *arg, char const *buffer, int len)
+{
+#ifdef DEBUG
+ fprintf(stderr, "Host: mywrite\n");
+#endif
+ return 0;
+}
+
+char *mygets(void *arg, char *buffer, int len)
+{
+#ifdef DEBUG
+ fprintf(stderr, "Host: mygets\n");
+#endif
+ return buffer;
+}
diff --git a/sim/arm/gdbhost.h b/sim/arm/gdbhost.h
new file mode 100644
index 0000000..0a10787
--- /dev/null
+++ b/sim/arm/gdbhost.h
@@ -0,0 +1,23 @@
+/* gdbhost.h -- ARMulator to gdb interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+void myprint(void *arg, const char *format, va_list ap);
+void mypause(void *arg);
+void mywritec(void *arg, int c);
+int myreadc(void *arg);
+int mywrite(void *arg, char const *buffer, int len);
+char *mygets(void *arg, char *buffer, int len);
diff --git a/sim/arm/kid.c b/sim/arm/kid.c
new file mode 100644
index 0000000..7a0a521
--- /dev/null
+++ b/sim/arm/kid.c
@@ -0,0 +1,510 @@
+/* kid.c -- ARMulator RDP/RDI interface: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/*****************************************************************/
+/* The child process continues here... */
+/* It waits on a pipe from the parent and translates the RDP */
+/* messages into RDI calls to the ARMulator passing RDP replies */
+/* back up a pipe to the parent. */
+/*****************************************************************/
+
+#include <sys/types.h>
+#include <signal.h>
+
+#include "armdefs.h"
+#include "dbg_conf.h"
+#include "dbg_hif.h"
+#include "dbg_rdi.h"
+#include "gdbhost.h"
+#include "communicate.h"
+
+/* The pipes between the two processes */
+extern int mumkid[2];
+extern int kidmum[2];
+
+/* The maximum number of file descriptors */
+extern int nfds;
+
+/* The machine name */
+#define MAXHOSTNAMELENGTH 64
+extern char localhost[MAXHOSTNAMELENGTH + 1];
+
+/* The socket number */
+extern unsigned int socketnumber;
+
+/* RDI interface */
+extern const struct RDIProcVec armul_rdi;
+
+static int MYrdp_level = 0;
+
+static int rdi_state = 0;
+
+/**************************************************************/
+/* Signal handler that terminates excecution in the ARMulator */
+/**************************************************************/
+void kid_handlesignal(int sig) {
+#ifdef DEBUG
+ fprintf(stderr, "Terminate ARMulator excecution\n");
+#endif
+ if (sig != SIGUSR1) {
+ fprintf(stderr, "Unsupported signal.\n");
+ return;
+ }
+ armul_rdi.info(RDISignal_Stop, (unsigned long *) 0, (unsigned long *) 0);
+}
+
+/********************************************************************/
+/* Waits on a pipe from the socket demon for RDP and */
+/* acts as an RDP to RDI interpreter on the front of the ARMulator. */
+/********************************************************************/
+void kid() {
+ char *p, *q;
+ int i, j, k;
+ long outofthebag;
+ unsigned char c, d, message;
+ ARMword x, y, z;
+ struct sigaction action;
+ PointHandle point;
+ Dbg_ConfigBlock config;
+ Dbg_HostosInterface hostif;
+ struct Dbg_MCState *MCState;
+ char command_line[256];
+ struct fd_set readfds;
+
+ /* Setup a signal handler for SIGUSR1 */
+ action.sa_handler = kid_handlesignal;
+ action.sa_mask = 0;
+ action.sa_flags = 0;
+
+ sigaction(SIGUSR1, &action, (struct sigaction *) 0);
+
+ while (1)
+ {
+ /* Wait for ever */
+ FD_ZERO(&readfds);
+ FD_SET(mumkid[0], &readfds);
+
+ i = select(nfds, &readfds,
+ (fd_set *) 0,
+ (fd_set *) 0,
+ (struct timeval *) 0);
+
+ if (i < 0) {
+ perror("select");
+ }
+
+ if (read(mumkid[0], &message, 1) < 1) {
+ perror("read");
+ }
+
+ switch (message) {
+ case RDP_Start :
+ /* Open and/or Initialise */
+ BAG_newbag();
+
+ MYread_char(mumkid[0], &c); /* type */
+ MYread_word(mumkid[0], &x); /* memorysize */
+ if (c & 0x2) MYread_char(mumkid[0], &d); /* speed */
+ config.processor = 0;
+ config.memorysize = x;
+ config.bytesex = (c & 0x4) ? RDISex_Big : RDISex_Little;
+ if (c & 0x8) config.bytesex = RDISex_DontCare;
+
+ hostif.dbgprint = myprint;
+ hostif.dbgpause = mypause;
+ hostif.dbgarg = stdout;
+ hostif.writec = mywritec;
+ hostif.readc = myreadc;
+ hostif.write = mywrite;
+ hostif.gets = mygets;
+ hostif.reset = mypause; /* do nothing */
+ hostif.resetarg = "Do I love resetting or what!\n";
+
+ if (rdi_state)
+ {
+ /* we have restarted, so kill off the existing run. */
+ /* armul_rdi.close(); */
+ }
+ i = armul_rdi.open(c & 0x3, &config, &hostif, MCState);
+ rdi_state = 1;
+
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+
+ x = ~0x4;
+ armul_rdi.info(RDIVector_Catch, &x, 0);
+
+ break;
+
+ case RDP_End :
+ /* Close and Finalise */
+ i = armul_rdi.close();
+ rdi_state = 0;
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_Read :
+ /* Read Memory Address */
+ MYread_word(mumkid[0], &x); /* address */
+ MYread_word(mumkid[0], &y); /* nbytes */
+ p = (char *) malloc(y);
+ i = armul_rdi.read(x, p, (unsigned *) &y);
+ MYwrite_char(kidmum[1], RDP_Return);
+ for (k = 0; k < y; k++)
+ MYwrite_char(kidmum[1], p[k]);
+ free(p);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ if (i)
+ MYwrite_word(kidmum[1], y); /* number of bytes sent without error */
+ break;
+
+ case RDP_Write :
+ /* Write Memory Address */
+ MYread_word(mumkid[0], &x); /* address */
+ MYread_word(mumkid[0], &y); /* nbytes */
+ p = (char *) malloc(y);
+ for (k = 0; k < y; k++)
+ MYread_char(mumkid[0], &p[k]);
+ i = armul_rdi.write(p, x, (unsigned *) &y);
+ free(p);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ if (i)
+ MYwrite_word(kidmum[1], y); /* number of bytes sent without error */
+ break;
+
+ case RDP_CPUread :
+ /* Read CPU State */
+ MYread_char(mumkid[0], &c); /* mode */
+ MYread_word(mumkid[0], &x); /* mask */
+ p = (char *) malloc(4 * RDINumCPURegs);
+ i = armul_rdi.CPUread(c, x, (ARMword *) p);
+ MYwrite_char(kidmum[1], RDP_Return);
+ for (k = 1, j = 0; k != 0x80000000; k *= 2)
+ if (k & x) MYwrite_word(kidmum[1], ((ARMword *) p)[j++]);
+ free(p);
+ if (i) MYwrite_char(kidmum[1], (unsigned char) j);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_CPUwrite :
+ /* Write CPU State */
+ MYread_char(mumkid[0], &c); /* mode */
+ MYread_word(mumkid[0], &x); /* mask */
+
+ p = (char *) malloc(4 * RDINumCPURegs);
+ for (k = 1, j = 0; k != 0x80000000; k *= 2)
+ if (k & x) MYread_word(mumkid[0], &(((ARMword *) p)[j++]));
+ i = armul_rdi.CPUwrite(c, x, (ARMword *) p);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ free(p);
+ break;
+
+ case RDP_CPread :
+ /* Read Co-Processor State */
+ MYread_char(mumkid[0], &c); /* CPnum */
+ MYread_word(mumkid[0], &x); /* mask */
+ p = q = (char *) malloc(16 * RDINumCPRegs);
+ i = armul_rdi.CPread(c, x, (ARMword *) p);
+ MYwrite_char(kidmum[1], RDP_Return);
+ for (k = 1, j = 0; k != 0x80000000; k *= 2, j++)
+ if (k & x) {
+ if ((c == 1 || c == 2) && k <= 128) {
+ MYwrite_FPword(kidmum[1], q);
+ q += 16;
+ }
+ else {
+ MYwrite_word(kidmum[1], *q);
+ q += 4;
+ }
+ }
+ free(p);
+ if (i) MYwrite_char(kidmum[1], (unsigned char) j);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_CPwrite :
+ /* Write Co-Processor State */
+ MYread_char(mumkid[0], &c); /* CPnum */
+ MYread_word(mumkid[0], &x); /* mask */
+ p = q = (char *) malloc(16 * RDINumCPURegs);
+ for (k = 1, j = 0; k != 0x80000000; k *= 2, j++)
+ if (k & x) {
+ if ((c == 1 || c == 2) && k <= 128) {
+ MYread_FPword(kidmum[1], q);
+ q += 16;
+ }
+ else {
+ MYread_word(mumkid[0], (ARMword *) q);
+ q += 4;
+ }
+ }
+ i = armul_rdi.CPwrite(c, x, (ARMword *) p);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ free(p);
+ break;
+
+ case RDP_SetBreak :
+ /* Set Breakpoint */
+ MYread_word(mumkid[0], &x); /* address */
+ MYread_char(mumkid[0], &c); /* type */
+ if ((c & 0xf) >= 5) MYread_word(mumkid[0], &y); /* bound */
+ i = armul_rdi.setbreak(x, c, y, &point);
+ if (!MYrdp_level) BAG_putpair((long) x, (long) point);
+ MYwrite_char(kidmum[1], RDP_Return);
+ if (MYrdp_level) MYwrite_word(kidmum[1], point);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_ClearBreak :
+ /* Clear Breakpoint */
+ MYread_word(mumkid[0], &point); /* PointHandle */
+ if (!MYrdp_level) {
+ BAG_getsecond((long) point, &outofthebag); /* swap pointhandle for address */
+ BAG_killpair_byfirst(outofthebag);
+ point = outofthebag;
+ }
+ i = armul_rdi.clearbreak(point);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_SetWatch :
+ /* Set Watchpoint */
+ MYread_word(mumkid[0], &x); /* address */
+ MYread_char(mumkid[0], &c); /* type */
+ MYread_char(mumkid[0], &d); /* datatype */
+ if ((c & 0xf) >= 5) MYread_word(mumkid[0], &y); /* bound */
+ i = armul_rdi.setwatch(x, c, d, y, &point);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_word(kidmum[1], point);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_ClearWatch :
+ /* Clear Watchpoint */
+ MYread_word(mumkid[0], &point); /* PointHandle */
+ i = armul_rdi.clearwatch(point);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_Execute :
+ /* Excecute */
+
+ MYread_char(mumkid[0], &c); /* return */
+
+#ifdef DEBUG
+ fprintf(stderr, "Starting execution\n");
+#endif
+ i = armul_rdi.execute(&point);
+#ifdef DEBUG
+ fprintf(stderr, "Completed execution\n");
+#endif
+ MYwrite_char(kidmum[1], RDP_Return);
+ if (c & 0x80) MYwrite_word(kidmum[1], point);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_Step :
+ /* Step */
+ MYread_char(mumkid[0], &c); /* return */
+ MYread_word(mumkid[0], &x); /* ninstr */
+ point = 0x87654321;
+ i = armul_rdi.step(x, &point);
+ MYwrite_char(kidmum[1], RDP_Return);
+ if (c & 0x80) MYwrite_word(kidmum[1], point);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ break;
+
+ case RDP_Info:
+ /* Info */
+ MYread_word (mumkid[0], &x);
+ switch (x)
+ {
+ case RDIInfo_Target:
+ i = armul_rdi.info (RDIInfo_Target, &y, &z);
+ MYwrite_char (kidmum[1], RDP_Return);
+ MYwrite_word (kidmum[1], y); /* Loads of info... */
+ MYwrite_word (kidmum[1], z); /* Model */
+ MYwrite_char (kidmum[1], (unsigned char) i);
+ break;
+
+ case RDISet_RDILevel:
+ MYread_word (mumkid[0], &x); /* arg1, debug level */
+ i = armul_rdi.info (RDISet_RDILevel, &x, 0);
+ if (i == RDIError_NoError)
+ MYrdp_level = x;
+ MYwrite_char (kidmum[1], RDP_Return);
+ MYwrite_char (kidmum[1], (unsigned char) i);
+ break;
+
+ case RDISet_Cmdline:
+ for (p = command_line; MYread_char (mumkid[0], p), *p; p++)
+ ; /* String */
+ i = armul_rdi.info (RDISet_Cmdline,
+ (unsigned long *) command_line, 0);
+ MYwrite_char (kidmum[1], RDP_Return);
+ MYwrite_char (kidmum[1], (unsigned char) i);
+ break;
+
+ case RDIInfo_Step:
+ i = armul_rdi.info (RDIInfo_Step, &x, 0);
+ MYwrite_char (kidmum[1], RDP_Return);
+ MYwrite_word (kidmum[1], x);
+ MYwrite_char (kidmum[1], (unsigned char) i);
+ break;
+
+ case RDIVector_Catch:
+ MYread_word (mumkid[0], &x);
+ i = armul_rdi.info (RDIVector_Catch, &x, 0);
+ MYwrite_char (kidmum[1], RDP_Return);
+ MYwrite_char (kidmum[1], i);
+ break;
+
+ case RDIInfo_Points:
+ i = armul_rdi.info (RDIInfo_Points, &x, 0);
+ MYwrite_char (kidmum[1], RDP_Return);
+ MYwrite_word (kidmum[1], x);
+ MYwrite_char (kidmum[1], (unsigned char) i);
+ break;
+
+ default:
+ fprintf (stderr, "Unsupported info code %d\n", x);
+ break;
+ }
+ break;
+
+ case RDP_OSOpReply:
+ /* OS Operation Reply */
+ MYwrite_char (kidmum[1], RDP_Fatal);
+ break;
+
+ case RDP_Reset:
+ /* Reset */
+ for (i = 0; i < 50; i++)
+ MYwrite_char(kidmum[1], RDP_Reset);
+ p = (char *) malloc(MAXHOSTNAMELENGTH + 5 + 20);
+ sprintf(p, "Running on %s:%d\n", localhost, socketnumber);
+ MYwrite_string(kidmum[1], p);
+ free(p);
+
+ break;
+ default:
+ fprintf (stderr, "Oh dear: Something is seriously wrong :-(\n");
+ /* Hmm.. bad RDP operation */
+ break;
+ }
+ }
+}
+
+
+/* Handles memory read operations until an OS Operation Reply Message is */
+/* encounterd. It then returns the byte info value (0, 1, or 2) and fills */
+/* in 'putinr0' with the data if appropriate. */
+int wait_for_osreply(ARMword *reply)
+{
+ char *p, *q;
+ int i, j, k;
+ unsigned char c, d, message;
+ ARMword x, y, z;
+ struct sigaction action;
+ PointHandle point;
+ Dbg_ConfigBlock config;
+ Dbg_HostosInterface hostif;
+ struct Dbg_MCState *MCState;
+ char command_line[256];
+ struct fd_set readfds;
+
+#ifdef DEBUG
+ fprintf(stderr, "wait_for_osreply ().\n");
+#endif
+
+ /* Setup a signal handler for SIGUSR1 */
+ action.sa_handler = kid_handlesignal;
+ action.sa_mask = 0;
+ action.sa_flags = 0;
+
+ sigaction(SIGUSR1, &action, (struct sigaction *) 0);
+
+ while (1)
+ {
+ /* Wait for ever */
+ FD_ZERO(&readfds);
+ FD_SET(mumkid[0], &readfds);
+
+ i = select(nfds, &readfds,
+ (fd_set *) 0,
+ (fd_set *) 0,
+ (struct timeval *) 0);
+
+ if (i < 0) {
+ perror("select");
+ }
+
+ if (read(mumkid[0], &message, 1) < 1) {
+ perror("read");
+ }
+
+ switch (message) {
+ case RDP_Read :
+ /* Read Memory Address */
+ MYread_word(mumkid[0], &x); /* address */
+ MYread_word(mumkid[0], &y); /* nbytes */
+ p = (char *) malloc(y);
+ i = armul_rdi.read(x, p, (unsigned *) &y);
+ MYwrite_char(kidmum[1], RDP_Return);
+ for (k = 0; k < y; k++)
+ MYwrite_char(kidmum[1], p[k]);
+ free(p);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ if (i)
+ MYwrite_word(kidmum[1], y); /* number of bytes sent without error */
+ break;
+
+ case RDP_Write :
+ /* Write Memory Address */
+ MYread_word(mumkid[0], &x); /* address */
+ MYread_word(mumkid[0], &y); /* nbytes */
+ p = (char *) malloc(y);
+ for (k = 0; k < y; k++)
+ MYread_char(mumkid[0], &p[k]);
+ i = armul_rdi.write(p, x, (unsigned *) &y);
+ free(p);
+ MYwrite_char(kidmum[1], RDP_Return);
+ MYwrite_char(kidmum[1], (unsigned char) i);
+ if (i)
+ MYwrite_word(kidmum[1], y); /* number of bytes sent without error */
+ break;
+
+ case RDP_OSOpReply :
+ /* OS Operation Reply */
+ MYread_char(mumkid[0], &c);
+ if (c == 1) MYread_char(mumkid[0], (char *) reply);
+ if (c == 2) MYread_word(mumkid[0], reply);
+ return c;
+ break;
+
+ default :
+ fprintf(stderr, "HELP! Unaccounted-for message during OS request. \n");
+ MYwrite_char(kidmum[1], RDP_Fatal);
+ }
+ }
+}
diff --git a/sim/arm/main.c b/sim/arm/main.c
new file mode 100644
index 0000000..5de48e3
--- /dev/null
+++ b/sim/arm/main.c
@@ -0,0 +1,183 @@
+/* main.c -- top level of ARMulator: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/**********************************************************************/
+/* Forks the ARMulator and hangs on a socket passing on RDP messages */
+/* down a pipe to the ARMulator which translates them into RDI calls. */
+/**********************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <signal.h>
+#include <netdb.h>
+#include <unistd.h>
+
+#include "armdefs.h"
+#include "dbg_rdi.h"
+#include "dbg_conf.h"
+
+#define MAXHOSTNAMELENGTH 64
+
+/* Read and write routines down sockets and pipes */
+
+void MYread_chars(int sock, void *p, int n);
+unsigned char MYread_char(int sock);
+ARMword MYread_word(int sock);
+void MYread_FPword(int sock, char *putinhere);
+
+void MYwrite_word(int sock, ARMword i);
+void MYwrite_string(int sock, char *s);
+void MYwrite_FPword(int sock, char *fromhere);
+void MYwrite_char(int sock, unsigned char c);
+
+void passon(int source, int dest, int n);
+
+
+/* Mother and child processes */
+void parent (void);
+void kid(void);
+
+/* The child process id. */
+pid_t child;
+
+/* The socket to the debugger */
+int debugsock;
+
+/* The pipes between the two processes */
+int mumkid[2];
+int kidmum[2];
+
+/* A pipe for handling SWI return values that goes straight from the */
+/* parent to the ARMulator host interface, bypassing the childs RDP */
+/* to RDI interpreter */
+int DebuggerARMul[2];
+
+/* The maximum number of file descriptors */
+int nfds;
+
+/* The socket handle */
+int sockethandle;
+
+/* The machine name */
+char localhost[MAXHOSTNAMELENGTH + 1];
+
+/* The socket number */
+unsigned int socketnumber;
+
+/**************************************************************/
+/* Takes one argument: the socket number. */
+/* Opens a socket to the debugger, and once opened spawns the */
+/* ARMulator and sets up a couple of pipes. */
+/**************************************************************/
+int main(int argc, char *argv[]) {
+ int i;
+ struct sockaddr_in devil, isa;
+ struct hostent *hp;
+
+
+ if (argc == 1) {
+ fprintf(stderr, "No socket number\n");
+ return 1;
+ }
+
+ sscanf(argv[1], "%d", &socketnumber);
+ if (!socketnumber || socketnumber > 0xffff) {
+ fprintf(stderr, "Invalid socket number: %d\n", socketnumber);
+ return 1;
+ }
+
+ gethostname(localhost, MAXHOSTNAMELENGTH);
+ hp = gethostbyname(localhost);
+ if (!hp) {
+ fprintf(stderr, "Cannot get local host info\n");
+ return 1;
+ }
+
+ /* Open a socket */
+ sockethandle = socket(hp->h_addrtype, SOCK_STREAM, 0);
+ if (sockethandle < 0) {
+ perror("socket");
+ return 1;
+ }
+
+ devil.sin_family = hp->h_addrtype;
+ devil.sin_port = htons(socketnumber);
+ devil.sin_addr.s_addr = 0;
+ for(i = 0; i < sizeof(devil.sin_zero); i++) devil.sin_zero[i] = '\000';
+ memcpy(&devil.sin_addr, hp->h_addr_list[0], hp->h_length);
+
+ if (bind(sockethandle, &devil, sizeof(devil)) < 0) {
+ perror("bind");
+ return 1;
+ }
+
+ /* May only accept one debugger at once */
+
+ if (listen(sockethandle, 0)) {
+ perror("listen");
+ return 1;
+ }
+
+ fprintf(stderr, "Waiting for connection from debugger...");
+
+ debugsock = accept(sockethandle, &isa, &i);
+ if (debugsock < 0) {
+ perror("accept");
+ return 1;
+ }
+
+ fprintf(stderr, " done.\nConnection Established.\n");
+
+ nfds = getdtablesize();
+
+ if (pipe(mumkid)) {
+ perror("pipe");
+ return 1;
+ }
+ if (pipe(kidmum)) {
+ perror("pipe");
+ return 1;
+ }
+
+ if (pipe(DebuggerARMul)) {
+ perror("pipe");
+ return 1;
+ }
+
+#ifdef DEBUG
+ fprintf(stderr, "Created pipes ok\n");
+#endif
+
+ child = fork();
+
+#ifdef DEBUG
+ fprintf(stderr, "fork() ok\n");
+#endif
+
+ if (child == 0) kid ();
+ if (child != -1) parent ();
+
+ perror("fork");
+ return 1;
+}
+
+
+
+
diff --git a/sim/arm/parent.c b/sim/arm/parent.c
new file mode 100644
index 0000000..9eeb904
--- /dev/null
+++ b/sim/arm/parent.c
@@ -0,0 +1,483 @@
+/* parent.c -- ARMulator RDP comms code: ARM6 Instruction Emulator.
+ Copyright (C) 1994 Advanced RISC Machines Ltd.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/*****************************************************************/
+/* The Parent process continues here... */
+/* It waits on the socket and passes on RDP messages down a pipe */
+/* to the ARMulator RDP to RDI interpreter. */
+/*****************************************************************/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+#include "time.h"
+#include "armdefs.h"
+#include "dbg_rdi.h"
+#include "communicate.h"
+
+/* The socket to the debugger */
+extern int debugsock;
+
+/* The pipes between the two processes */
+extern int mumkid[2];
+extern int kidmum[2];
+
+/* A pipe for handling SWI return values that goes straight from the */
+/* parent to the ARMulator host interface, bypassing the child's RDP */
+/* to RDI interpreter */
+extern int DebuggerARMul[2];
+
+/* The maximum number of file descriptors */
+extern int nfds;
+
+/* The child process id. */
+extern pid_t child;
+
+void
+parent ()
+{
+ int i, j, k;
+ unsigned char message, CPnum, exreturn;
+ ARMword mask, nbytes, messagetype;
+ unsigned char c, d;
+ ARMword x, y;
+ int virgin = 1;
+ struct fd_set readfds;
+
+#ifdef DEBUG
+ fprintf (stderr, "parent ()...\n");
+#endif
+
+ panic_error:
+
+ if (!virgin)
+ {
+#ifdef DEBUG
+ fprintf(stderr, "Arghh! What is going on?\n");
+#endif
+ kill (child, SIGHUP);
+ MYwrite_char(debugsock, RDP_Reset);
+ }
+
+ virgin = 0;
+
+ while (1)
+ {
+
+ /* Wait either for the ARMulator or the debugger */
+
+ FD_ZERO (&readfds);
+ FD_SET (kidmum[0], &readfds); /* Wait for messages from ARMulator */
+ FD_SET (debugsock, &readfds); /* Wait for messages from debugger */
+
+#ifdef DEBUG
+ fprintf (stderr, "Waiting for ARMulator or debugger... ");
+#endif
+
+ while ((i = select (nfds, &readfds, (fd_set *) 0, (fd_set *) 0, 0)) < 0)
+ {
+ perror ("select");
+ }
+
+#ifdef DEBUG
+ fprintf(stderr, "(%d/2)", i);
+#endif
+
+ if (FD_ISSET (debugsock, &readfds)) {
+#ifdef DEBUG
+ fprintf (stderr, "->debugger\n");
+#endif
+
+ /* Inside this rather large if statement with simply pass on a complete
+ message to the ARMulator. The reason we need to pass messages on one
+ at a time is that we have to know whether the message is an OSOpReply
+ or an info(stop), so that we can take different action in those
+ cases. */
+
+ if (MYread_char (debugsock, &message))
+ goto panic_error;
+
+ switch (message)
+ {
+ case RDP_Start:
+ /* Open and/or Initialise */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Open\n");
+#endif
+ if (MYread_char(debugsock, &c)) /* type */
+ goto panic_error;
+
+ if (MYread_word(debugsock, &x)) /* memory size */
+ goto panic_error;
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_char (mumkid[1], c);
+ MYwrite_word (mumkid[1], x);
+ if (c & 0x2)
+ {
+ passon (debugsock, mumkid[1], 1); /* speed */
+ }
+ break;
+
+ case RDP_End:
+ /* Close and Finalise */
+#ifdef DEBUG
+ fprintf(stderr, "RDP Close\n");
+#endif
+ MYwrite_char (mumkid[1], message);
+ break;
+
+ case RDP_Read:
+ /* Read Memory Address */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Read Memory\n");
+#endif
+ MYwrite_char (mumkid[1], message);
+ if (passon (debugsock, mumkid[1], 4))
+ goto panic_error; /* address */
+ if (MYread_word(debugsock, &nbytes))
+ goto panic_error; /* nbytes */
+ MYwrite_word (mumkid[1], nbytes);
+ break;
+
+ case RDP_Write :
+ /* Write Memory Address */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Write Memory\n");
+#endif
+ if (MYread_word (debugsock, &x))
+ goto panic_error; /* address */
+
+ if (MYread_word (debugsock, &y))
+ goto panic_error; /* nbytes */
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], x);
+ MYwrite_word (mumkid[1], y);
+ passon (debugsock, mumkid[1], y); /* actual data */
+ break;
+
+ case RDP_CPUread:
+ /* Read CPU State */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Read CPU\n");
+#endif
+ if (MYread_char(debugsock, &c))
+ goto panic_error; /* mode */
+
+ if (MYread_word (debugsock, &mask))
+ goto panic_error; /* mask */
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_char (mumkid[1], c);
+ MYwrite_word (mumkid[1], mask);
+ break;
+
+ case RDP_CPUwrite :
+ /* Write CPU State */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Write CPU\n");
+#endif
+ if (MYread_char (debugsock, &c))
+ goto panic_error; /* mode */
+
+ if (MYread_word (debugsock, &x))
+ goto panic_error; /* mask */
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_char (mumkid[1], c);
+ MYwrite_word (mumkid[1], x);
+ for (k = 1, j = 0; k != 0x80000000; k *= 2, j++)
+ if ((k & x)
+ && passon(debugsock, mumkid[1], 4))
+ goto panic_error;
+ break;
+
+ case RDP_CPread:
+ /* Read Co-Processor State */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Read CP state\n");
+#endif
+ if (MYread_char (debugsock, &CPnum))
+ goto panic_error;
+
+ if (MYread_word (debugsock, &mask))
+ goto panic_error;
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_char (mumkid[1], CPnum);
+ MYwrite_word (mumkid[1], mask);
+ break;
+
+ case RDP_CPwrite:
+ /* Write Co-Processor State */
+#ifdef DEBUG
+ fprintf(stderr, "RDP Write CP state\n");
+#endif
+ if (MYread_char (debugsock, &CPnum))
+ goto panic_error;
+
+ if (MYread_word (debugsock, &mask))
+ goto panic_error;
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_char (mumkid[1], c);
+ MYwrite_char (mumkid[1], x);
+ for (k = 1, j = 0; k != 0x80000000; k *= 2, j++)
+ if (k & x)
+ {
+ if ((c == 1 || c == 2) && k <= 128)
+ {
+ /* FP register = 12 bytes + 4 bytes format */
+ if (passon(debugsock, mumkid[1], 16))
+ goto panic_error;
+ }
+ else
+ {
+ /* Normal register = 4 bytes */
+ if (passon(debugsock, mumkid[1], 4))
+ goto panic_error;
+ }
+ }
+ break;
+
+ case RDP_SetBreak:
+ /* Set Breakpoint */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Set Breakpoint\n");
+#endif
+ if (MYread_word (debugsock, &x))
+ goto panic_error; /* address */
+
+ if (MYread_char (debugsock, &c))
+ goto panic_error; /* type */
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], x);
+ MYwrite_char (mumkid[1], c);
+ if (((c & 0xf) >= 5)
+ && passon(debugsock, mumkid[1], 4))
+ goto panic_error; /* bound */
+ break;
+
+ case RDP_ClearBreak:
+ /* Clear Breakpoint */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Clear Breakpoint\n");
+#endif
+ MYwrite_char (mumkid[1], message);
+ if (passon (debugsock, mumkid[1], 4))
+ goto panic_error; /* point */
+ break;
+
+ case RDP_SetWatch:
+ /* Set Watchpoint */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Set Watchpoint\n");
+#endif
+ if (MYread_word (debugsock, &x))
+ goto panic_error; /* address */
+
+ if (MYread_char(debugsock, &c))
+ goto panic_error; /* type */
+
+ if (MYread_char (debugsock, &d))
+ goto panic_error; /* datatype */
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], x);
+ MYwrite_char (mumkid[1], c);
+ MYwrite_char (mumkid[1], d);
+ if (((c & 0xf) >= 5)
+ && passon(debugsock, mumkid[1], 4))
+ goto panic_error; /* bound */
+ break;
+
+ case RDP_ClearWatch:
+ /* Clear Watchpoint */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Clear Watchpoint\n");
+#endif
+ MYwrite_char (mumkid[1], message);
+ if (passon (debugsock, mumkid[1], 4))
+ goto panic_error; /* point */
+ break;
+
+ case RDP_Execute:
+ /* Excecute */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Execute\n");
+#endif
+
+ /* LEAVE THIS ONE 'TIL LATER... */
+ /* NEED TO WORK THINGS OUT */
+
+ /* NO ASCYNCHROUS RUNNING */
+
+ if (MYread_char(debugsock, &c))
+ goto panic_error; /* return */
+
+ /* Remember incase bit 7 is set and we have to send back a word */
+ exreturn = c;
+
+ MYwrite_char(mumkid[1], message);
+ MYwrite_char(mumkid[1], c);
+ break;
+
+ case RDP_Step:
+ /* Step */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Step\n");
+#endif
+
+ if (MYread_char(debugsock, &c))
+ goto panic_error; /* return */
+
+ if (MYread_word(debugsock, &x))
+ goto panic_error; /* ninstr */
+
+ MYwrite_char (mumkid[1], message);
+ MYwrite_char (mumkid[1], c);
+ MYwrite_word (mumkid[1], x);
+ break;
+
+ case RDP_Info:
+ /* Info */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Info\n");
+#endif
+ /* INFO TARGET, SET RDI LEVEL */
+ if (MYread_word (debugsock, &messagetype))
+ goto panic_error; /* info */
+
+ switch (messagetype)
+ {
+ case RDIInfo_Target:
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], messagetype);
+ break;
+
+ case RDISet_RDILevel:
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], messagetype);
+ if (passon (debugsock, mumkid[1], 1))
+ goto panic_error; /* argument */
+ break;
+
+ case RDISet_Cmdline:
+ /* Got to pass on a string argument */
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], messagetype);
+ do
+ {
+ if (MYread_char (debugsock, &c))
+ goto panic_error;
+
+ MYwrite_char (mumkid[1], c);
+ } while (c);
+ break;
+
+ case RDISignal_Stop:
+ kill (child, SIGUSR1);
+ MYwrite_char (debugsock, RDP_Return);
+ MYwrite_char (debugsock, RDIError_UserInterrupt);
+ break;
+
+ case RDIVector_Catch:
+ MYread_word (debugsock, &x);
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], messagetype);
+ MYwrite_word (mumkid[1], x);
+ break;
+
+ case RDIInfo_Step:
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], messagetype);
+ break;
+
+ case RDIInfo_Points:
+ MYwrite_char (mumkid[1], message);
+ MYwrite_word (mumkid[1], messagetype);
+ break;
+
+ default:
+ fprintf (stderr, "Unrecognized RDIInfo request %d\n",
+ messagetype);
+ goto panic_error;
+ }
+ break;
+
+ case RDP_OSOpReply:
+ /* OS Operation Reply */
+#ifdef DEBUG
+ fprintf (stderr, "RDP OS Reply\n");
+#endif
+ MYwrite_char (mumkid[1], message);
+ if (MYread_char (debugsock, &message))
+ goto panic_error;
+ MYwrite_char (mumkid[1], message);
+ switch(message)
+ {
+ case 0: /* return value i.e. nothing else.*/
+ break;
+
+ case 1: /* returns a byte... */
+ if (MYread_char(debugsock, &c))
+ goto panic_error;
+
+ MYwrite_char (mumkid[1], c);
+ break;
+
+ case 2: /* returns a word... */
+ if (MYread_word(debugsock, &x))
+ goto panic_error;
+
+ MYwrite_word (mumkid[1], x);
+ break;
+ }
+ break;
+
+ case RDP_Reset:
+ /* Reset */
+#ifdef DEBUG
+ fprintf (stderr, "RDP Reset\n");
+#endif
+ MYwrite_char (mumkid[1], message);
+ break;
+
+ default:
+ /* Hmm.. bad RDP operation */
+ fprintf (stderr, "RDP Bad RDP request (%d)\n", message);
+ MYwrite_char (debugsock, RDP_Return);
+ MYwrite_char (debugsock, RDIError_UnimplementedMessage);
+ break;
+ }
+ }
+
+ if (FD_ISSET (kidmum[0], &readfds))
+ {
+#ifdef DEBUG
+ fprintf (stderr, "->ARMulator\n");
+#endif
+ /* Anything we get from the ARMulator has to go to the debugger... */
+ /* It is that simple! */
+
+ passon (kidmum[0], debugsock, 1);
+ }
+ }
+}
+
diff --git a/sim/arm/run.c b/sim/arm/run.c
new file mode 100644
index 0000000..3b911d2
--- /dev/null
+++ b/sim/arm/run.c
@@ -0,0 +1,155 @@
+/* run front end support for ARM
+ Copyright (C) 1996 Free Software Foundation, Inc.
+
+This file is part of ARM SIM
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+/* Steve Chamberlain
+ sac@cygnus.com */
+
+#include <stdio.h>
+#include <varargs.h>
+#include "bfd.h"
+#include "sysdep.h"
+#include "remote-sim.h"
+
+void usage();
+extern int optind;
+extern char *optarg;
+
+int target_byte_order;
+
+int
+main (ac, av)
+ int ac;
+ char **av;
+{
+ bfd *abfd;
+ bfd_vma start_address;
+ asection *s;
+ int i;
+ int verbose = 0;
+ int trace = 0;
+ char *name = "";
+
+ while ((i = getopt (ac, av, "m:p:s:tv")) != EOF)
+ switch (i)
+ {
+ case 'm':
+ sim_size (atoi (optarg));
+ break;
+ case 'p':
+ sim_set_profile (atoi (optarg));
+ break;
+ case 's':
+ sim_set_profile_size (atoi (optarg));
+ break;
+ case 't':
+ trace = 1;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ default:
+ usage();
+ }
+ ac -= optind;
+ av += optind;
+
+ if (ac != 1)
+ usage();
+
+ name = *av;
+
+ if (verbose)
+ {
+ printf ("run %s\n", name);
+ }
+ abfd = bfd_openr (name, 0);
+ if (abfd)
+ {
+ if (bfd_check_format (abfd, bfd_object))
+ {
+
+ for (s = abfd->sections; s; s = s->next)
+ {
+ unsigned char *buffer = malloc (bfd_section_size (abfd, s));
+ bfd_get_section_contents (abfd,
+ s,
+ buffer,
+ 0,
+ bfd_section_size (abfd, s));
+ sim_write (s->vma, buffer, bfd_section_size (abfd, s));
+ }
+
+ start_address = bfd_get_start_address (abfd);
+ sim_create_inferior (start_address, NULL, NULL);
+
+ target_byte_order = abfd->xvec->byteorder_big_p ? 4321 : 1234;
+
+ if (trace)
+ {
+ int done = 0;
+ while (!done)
+ {
+ done = sim_trace ();
+ }
+ }
+ else
+ {
+ sim_resume (0, 0);
+ }
+ if (verbose)
+ sim_info (0);
+
+ /* Assume we left through the exit system call,
+ in which case r5 has the exit code */
+ {
+ unsigned char b[4];
+ sim_fetch_register (5, b);
+ return b[3];
+ }
+
+ }
+ }
+
+ return 1;
+}
+
+void
+usage()
+{
+ fprintf (stderr, "usage: run [-tv] program\n");
+ exit (1);
+}
+
+
+/* Callbacks used by the simulator proper. */
+
+void
+printf_filtered (va_alist)
+ va_dcl
+{
+ va_list args;
+ char *format;
+
+ va_start (args);
+ format = va_arg (args, char *);
+
+ vfprintf (stdout, format, args);
+ va_end (args);
+}