Wed May 24 14:37:31 1995 Steve Chamberlain <sac@slash.cygnus.com>
authorSteve Chamberlain <sac@cygnus>
Wed, 24 May 1995 21:45:01 +0000 (21:45 +0000)
committerSteve Chamberlain <sac@cygnus>
Wed, 24 May 1995 21:45:01 +0000 (21:45 +0000)
* New.

23 files changed:
sim/arm/COPYING [new file with mode: 0644]
sim/arm/Makefile.orig [new file with mode: 0644]
sim/arm/README.Cygnus [new file with mode: 0644]
sim/arm/README.orig [new file with mode: 0644]
sim/arm/arm.mt [new file with mode: 0644]
sim/arm/armfpe.h [new file with mode: 0644]
sim/arm/armopts.h [new file with mode: 0644]
sim/arm/armos.h [new file with mode: 0644]
sim/arm/armrdi.c [new file with mode: 0644]
sim/arm/bag.h [new file with mode: 0644]
sim/arm/communicate.c [new file with mode: 0644]
sim/arm/communicate.h [new file with mode: 0644]
sim/arm/configure.in [new file with mode: 0644]
sim/arm/dbg_conf.h [new file with mode: 0644]
sim/arm/dbg_cp.h [new file with mode: 0644]
sim/arm/dbg_hif.h [new file with mode: 0644]
sim/arm/dbg_rdi.h [new file with mode: 0644]
sim/arm/gdbhost.c [new file with mode: 0644]
sim/arm/gdbhost.h [new file with mode: 0644]
sim/arm/kid.c [new file with mode: 0644]
sim/arm/main.c [new file with mode: 0644]
sim/arm/parent.c [new file with mode: 0644]
sim/arm/run.c [new file with mode: 0644]

diff --git a/sim/arm/COPYING b/sim/arm/COPYING
new file mode 100644 (file)
index 0000000..a43ea21
--- /dev/null
@@ -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.
+\f
+                   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.)
+\f
+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.
+\f
+  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.
+\f
+  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
+\f
+       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 (file)
index 0000000..020045c
--- /dev/null
@@ -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 (file)
index 0000000..14dd5b4
--- /dev/null
@@ -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 (file)
index 0000000..d131a39
--- /dev/null
@@ -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 (file)
index 0000000..e3e0c19
--- /dev/null
@@ -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 (file)
index 0000000..91c8f61
--- /dev/null
@@ -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 (file)
index 0000000..6ec0f2f
--- /dev/null
@@ -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 (file)
index 0000000..bae2f6e
--- /dev/null
@@ -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 (file)
index 0000000..665d03f
--- /dev/null
@@ -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 (file)
index 0000000..bd0f99d
--- /dev/null
@@ -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 (file)
index 0000000..061e719
--- /dev/null
@@ -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 (file)
index 0000000..c48b2e2
--- /dev/null
@@ -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 (file)
index 0000000..bbe0360
--- /dev/null
@@ -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 (file)
index 0000000..1220747
--- /dev/null
@@ -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 (file)
index 0000000..b79de8f
--- /dev/null
@@ -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 (file)
index 0000000..fa3df1b
--- /dev/null
@@ -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 (file)
index 0000000..5d609d0
--- /dev/null
@@ -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 (file)
index 0000000..9e6e2ef
--- /dev/null
@@ -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 (file)
index 0000000..0a10787
--- /dev/null
@@ -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 (file)
index 0000000..7a0a521
--- /dev/null
@@ -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 (file)
index 0000000..5de48e3
--- /dev/null
@@ -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 (file)
index 0000000..9eeb904
--- /dev/null
@@ -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 (file)
index 0000000..3b911d2
--- /dev/null
@@ -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);
+}
+
+\f
+/* 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);
+}