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